@emailcheck/email-validator-js 5.0.0 → 5.1.0-beta.1

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.
Files changed (44) hide show
  1. package/README.md +40 -4
  2. package/dist/cli/index.js +34 -2
  3. package/dist/cli/index.js.map +1 -1
  4. package/dist/index.d.ts +1 -0
  5. package/dist/index.esm.js +36 -3
  6. package/dist/index.esm.js.map +1 -1
  7. package/dist/index.js +36 -2
  8. package/dist/index.js.map +1 -1
  9. package/dist/sender-strategy.d.ts +26 -0
  10. package/dist/serverless/adapters/aws-lambda.cjs.js +5 -5
  11. package/dist/serverless/adapters/aws-lambda.cjs.js.map +1 -1
  12. package/dist/serverless/adapters/aws-lambda.esm.js +5 -5
  13. package/dist/serverless/adapters/aws-lambda.esm.js.map +1 -1
  14. package/dist/serverless/adapters/azure.cjs.js +5 -5
  15. package/dist/serverless/adapters/azure.cjs.js.map +1 -1
  16. package/dist/serverless/adapters/azure.esm.js +5 -5
  17. package/dist/serverless/adapters/azure.esm.js.map +1 -1
  18. package/dist/serverless/adapters/cloudflare.cjs.js +5 -5
  19. package/dist/serverless/adapters/cloudflare.cjs.js.map +1 -1
  20. package/dist/serverless/adapters/cloudflare.esm.js +5 -5
  21. package/dist/serverless/adapters/cloudflare.esm.js.map +1 -1
  22. package/dist/serverless/adapters/gcp.cjs.js +5 -5
  23. package/dist/serverless/adapters/gcp.cjs.js.map +1 -1
  24. package/dist/serverless/adapters/gcp.esm.js +5 -5
  25. package/dist/serverless/adapters/gcp.esm.js.map +1 -1
  26. package/dist/serverless/adapters/netlify.cjs.js +5 -5
  27. package/dist/serverless/adapters/netlify.cjs.js.map +1 -1
  28. package/dist/serverless/adapters/netlify.esm.js +5 -5
  29. package/dist/serverless/adapters/netlify.esm.js.map +1 -1
  30. package/dist/serverless/adapters/vercel.cjs.js +5 -5
  31. package/dist/serverless/adapters/vercel.cjs.js.map +1 -1
  32. package/dist/serverless/adapters/vercel.esm.js +5 -5
  33. package/dist/serverless/adapters/vercel.esm.js.map +1 -1
  34. package/dist/serverless/index.cjs.js +5 -5
  35. package/dist/serverless/index.cjs.js.map +1 -1
  36. package/dist/serverless/index.esm.js +5 -5
  37. package/dist/serverless/index.esm.js.map +1 -1
  38. package/dist/serverless/verifier.cjs.js +5 -5
  39. package/dist/serverless/verifier.cjs.js.map +1 -1
  40. package/dist/serverless/verifier.esm.js +5 -5
  41. package/dist/serverless/verifier.esm.js.map +1 -1
  42. package/dist/serverless/verifier.min.js +1 -1
  43. package/dist/types.d.ts +72 -0
  44. package/package.json +3 -3
@@ -1 +1 @@
1
- {"version":3,"file":"index.cjs.js","sources":["../../src/serverless/_shared/cors.ts","../../node_modules/string-similarity-js/dist/string-similarity.js","../../src/serverless/verifier.ts","../../src/serverless/_shared/dispatch.ts","../../src/serverless/_shared/validation.ts","../../src/serverless/adapters/aws-lambda.ts","../../src/serverless/adapters/azure.ts","../../src/serverless/adapters/cloudflare.ts","../../src/serverless/adapters/gcp.ts","../../src/serverless/adapters/netlify.ts","../../src/serverless/adapters/vercel.ts"],"sourcesContent":["/**\n * Standard CORS header set used by every adapter. `methods` lets each platform\n * advertise the verbs it actually supports without re-declaring the rest.\n */\nexport function corsHeaders(methods: string = 'GET, POST, OPTIONS'): Record<string, string> {\n return {\n 'Access-Control-Allow-Origin': '*',\n 'Access-Control-Allow-Methods': methods,\n 'Access-Control-Allow-Headers': 'Content-Type',\n };\n}\n\nexport function jsonHeaders(extra?: Record<string, string>): Record<string, string> {\n return { 'Content-Type': 'application/json', ...extra };\n}\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.stringSimilarity = void 0;\n/* global exports, Map */\n/**\n * Calculate similarity between two strings\n * @param {string} str1 First string to match\n * @param {string} str2 Second string to match\n * @param {number} [substringLength=2] Optional. Length of substring to be used in calculating similarity. Default 2.\n * @param {boolean} [caseSensitive=false] Optional. Whether you want to consider case in string matching. Default false;\n * @returns Number between 0 and 1, with 0 being a low match score.\n */\nvar stringSimilarity = function (str1, str2, substringLength, caseSensitive) {\n if (substringLength === void 0) { substringLength = 2; }\n if (caseSensitive === void 0) { caseSensitive = false; }\n if (!caseSensitive) {\n str1 = str1.toLowerCase();\n str2 = str2.toLowerCase();\n }\n if (str1.length < substringLength || str2.length < substringLength)\n return 0;\n var map = new Map();\n for (var i = 0; i < str1.length - (substringLength - 1); i++) {\n var substr1 = str1.substr(i, substringLength);\n map.set(substr1, map.has(substr1) ? map.get(substr1) + 1 : 1);\n }\n var match = 0;\n for (var j = 0; j < str2.length - (substringLength - 1); j++) {\n var substr2 = str2.substr(j, substringLength);\n var count = map.has(substr2) ? map.get(substr2) : 0;\n if (count > 0) {\n map.set(substr2, count - 1);\n match++;\n }\n }\n return (match * 2) / (str1.length + str2.length - ((substringLength - 1) * 2));\n};\nexports.stringSimilarity = stringSimilarity;\nexports.default = exports.stringSimilarity;\n//# sourceMappingURL=string-similarity.js.map","/**\n * Edge-runtime / serverless email validator.\n *\n * No Node.js APIs (no `node:net`, no `node:dns`) — DNS is delegated to a\n * caller-supplied `DNSResolver`, so the same code runs on Cloudflare Workers,\n * Vercel Edge, Lambda@Edge, and Deno Deploy.\n *\n * Shares data with the main validator: `commonEmailDomains` and the typo map\n * are imported from `src/data/`, so we never drift between the two surfaces.\n */\n\nimport { stringSimilarity } from 'string-similarity-js';\nimport commonEmailDomainsJson from '../data/common-email-domains.json';\nimport typoPatternsJson from '../data/typo-patterns.json';\nimport disposableProviders from '../disposable-email-providers.json';\nimport freeProviders from '../free-email-providers.json';\nimport type { DomainSuggesterOptions, EmailValidationResult, ValidateEmailOptions } from '../types';\n\n/** Compact LRU/TTL cache. One Map, expiry stamp per entry, batched eviction. */\nexport class EdgeCache<T> {\n private readonly cache = new Map<string, { value: T; expires: number }>();\n\n constructor(\n private readonly maxSize = 1000,\n private readonly ttl = 3_600_000\n ) {}\n\n get(key: string): T | undefined {\n const item = this.cache.get(key);\n if (!item) return undefined;\n if (Date.now() > item.expires) {\n this.cache.delete(key);\n return undefined;\n }\n return item.value;\n }\n\n set(key: string, value: T): void {\n if (this.cache.size >= this.maxSize) this.evict();\n this.cache.set(key, { value, expires: Date.now() + this.ttl });\n }\n\n clear(): void {\n this.cache.clear();\n }\n\n size(): number {\n return this.cache.size;\n }\n\n private evict(): void {\n // Drop the oldest 10% in one pass — Map preserves insertion order so\n // `keys()` walks oldest-first.\n const drop = Math.max(1, Math.floor(this.maxSize * 0.1));\n let n = 0;\n for (const key of this.cache.keys()) {\n if (n++ >= drop) break;\n this.cache.delete(key);\n }\n }\n}\n\n// Module-level per-isolate caches. Edge runtimes get cold-start fresh; warm\n// invocations benefit from the in-memory hits.\nexport const validationCache = new EdgeCache<EmailValidationResult>(1000);\nexport const mxCache = new EdgeCache<string[]>(500);\n\n/** Same regex the main validator uses — kept inline because edge runtimes don't auto-resolve psl. */\nconst VALID_EMAIL_REGEX =\n /^(([a-zA-Z0-9_+'-]+(\\.[a-zA-Z0-9_+'-]+)*)|(\".+\"))@((\\[[0-9]{1,3}\\.[0-9]{1,3}\\.[0-9]{1,3}\\.[0-9]{1,3}])|(([a-zA-Z0-9-]+\\.)+[a-zA-Z]{2,}))$/;\n\n/**\n * Common email domains — re-exported so callers (Vercel Edge, etc.) can pass a\n * custom subset via `DomainSuggesterOptions.customDomains`.\n */\nexport const COMMON_DOMAINS: readonly string[] = commonEmailDomainsJson as string[];\n\nconst TYPO_PATTERNS = typoPatternsJson as Record<string, string[]>;\n/** Reverse index for O(1) typo → canonical lookup. */\nconst TYPO_LOOKUP = new Map<string, string>();\nfor (const [canonical, typos] of Object.entries(TYPO_PATTERNS)) {\n for (const typo of typos) TYPO_LOOKUP.set(typo, canonical);\n}\n\n/** DNS resolver contract — caller-supplied so we don't import `node:dns`. */\nexport interface DNSResolver {\n resolveMx(domain: string): Promise<Array<{ exchange: string; priority: number }>>;\n resolveTxt(domain: string): Promise<string[]>;\n}\n\n/** No-op resolver for environments where DNS isn't available. */\nexport class StubDNSResolver implements DNSResolver {\n async resolveMx(): Promise<Array<{ exchange: string; priority: number }>> {\n return [];\n }\n async resolveTxt(): Promise<string[]> {\n return [];\n }\n}\n\n/**\n * DNS-over-HTTPS resolver — works in any runtime with `fetch` (Cloudflare\n * Workers, Vercel Edge, Deno, browsers, Node 18+). Defaults to Cloudflare's\n * 1.1.1.1 endpoint; pass `endpoint` to use Google (8.8.8.8), NextDNS, or\n * a self-hosted resolver.\n *\n * Compatible with [`cf-doh`](https://www.npmjs.com/package/cf-doh) — if you\n * already use that, drop it in directly. This built-in keeps the package\n * zero-dep so the same code works on every edge runtime without an extra\n * install step.\n */\nexport interface DoHResolverOptions {\n /** DoH endpoint URL. Default: https://cloudflare-dns.com/dns-query */\n endpoint?: string;\n /** Per-query request timeout, ms. Default: 5000 */\n timeoutMs?: number;\n /** Custom fetch (e.g. to add headers / proxy). Default: globalThis.fetch */\n fetch?: typeof fetch;\n}\n\ninterface DoHAnswer {\n name: string;\n type: number;\n TTL: number;\n data: string;\n}\n\ninterface DoHResponse {\n Status: number;\n Answer?: DoHAnswer[];\n}\n\nconst DOH_RECORD_TYPE = { MX: 15, TXT: 16 } as const;\n\nexport class DoHResolver implements DNSResolver {\n private readonly endpoint: string;\n private readonly timeoutMs: number;\n private readonly fetchFn: typeof fetch;\n\n constructor(options: DoHResolverOptions = {}) {\n this.endpoint = options.endpoint ?? 'https://cloudflare-dns.com/dns-query';\n this.timeoutMs = options.timeoutMs ?? 5000;\n this.fetchFn = options.fetch ?? globalThis.fetch;\n }\n\n async resolveMx(domain: string): Promise<Array<{ exchange: string; priority: number }>> {\n const records = await this.query(domain, DOH_RECORD_TYPE.MX);\n if (!records) return [];\n return records\n .map((answer) => {\n // MX answer data: \"<priority> <exchange>\" (with optional trailing dot).\n const match = answer.data.match(/^(\\d+)\\s+(.+?)\\.?$/);\n if (!match) return null;\n return { priority: Number(match[1]), exchange: match[2] as string };\n })\n .filter((r): r is { exchange: string; priority: number } => r !== null)\n .sort((a, b) => a.priority - b.priority);\n }\n\n async resolveTxt(domain: string): Promise<string[]> {\n const records = await this.query(domain, DOH_RECORD_TYPE.TXT);\n if (!records) return [];\n // TXT answers come back as quoted strings — strip the surrounding quotes.\n return records.map((answer) => answer.data.replace(/^\"(.*)\"$/, '$1'));\n }\n\n private async query(domain: string, type: number): Promise<DoHAnswer[] | null> {\n const url = `${this.endpoint}?name=${encodeURIComponent(domain)}&type=${type}`;\n const controller = new AbortController();\n const timer = setTimeout(() => controller.abort(), this.timeoutMs);\n try {\n const response = await this.fetchFn(url, {\n headers: { Accept: 'application/dns-json' },\n signal: controller.signal,\n });\n if (!response.ok) return null;\n const json = (await response.json()) as DoHResponse;\n // Status 0 = NOERROR. Anything else (NXDOMAIN, SERVFAIL, etc.) → no answers.\n if (json.Status !== 0) return [];\n return json.Answer ?? [];\n } catch {\n return null;\n } finally {\n clearTimeout(timer);\n }\n }\n}\n\n/**\n * Suggest a corrected domain. Returns the canonical for a known typo,\n * otherwise the closest match within the threshold, otherwise null.\n */\nexport function suggestDomain(domain: string, options?: DomainSuggesterOptions): string | null {\n const lower = domain.toLowerCase();\n\n // Hand-curated typo map first — beats similarity for common cases.\n const known = TYPO_LOOKUP.get(lower);\n if (known) return known;\n\n const domains = options?.customDomains ?? COMMON_DOMAINS;\n if (domains.includes(lower)) return null;\n\n const threshold = options?.threshold ?? 2;\n let minDistance = Infinity;\n let suggestion: string | null = null;\n\n for (const candidate of domains) {\n const candidateLower = candidate.toLowerCase();\n if (lower === candidateLower) return null;\n const similarity = stringSimilarity(lower, candidateLower);\n const distance = Math.round((1 - similarity) * Math.max(domain.length, candidate.length));\n if (distance > 0 && distance <= threshold && distance < minDistance) {\n minDistance = distance;\n suggestion = candidate;\n }\n }\n return suggestion;\n}\n\n/**\n * Validate one email — syntax / typo / disposable / free / MX (if a resolver\n * is supplied). Each step is independently flag-gated so callers pay only for\n * what they use.\n */\nexport async function validateEmailCore(\n email: string,\n options?: ValidateEmailOptions & { dnsResolver?: DNSResolver }\n): Promise<EmailValidationResult> {\n const normalized = email.toLowerCase().trim();\n\n if (!options?.skipCache) {\n const cached = validationCache.get(normalized);\n if (cached) return cached;\n }\n\n const result: EmailValidationResult = { valid: false, email: normalized, validators: {} };\n\n if (options?.validateSyntax !== false) {\n const syntaxValid = VALID_EMAIL_REGEX.test(normalized);\n result.validators.syntax = { valid: syntaxValid };\n if (!syntaxValid) {\n validationCache.set(normalized, result);\n return result;\n }\n }\n\n const [local, domain] = normalized.split('@');\n result.local = local;\n result.domain = domain;\n\n if (options?.validateTypo !== false) {\n const suggestion = suggestDomain(domain, options?.domainSuggesterOptions);\n result.validators.typo = { valid: !suggestion, suggestion: suggestion ?? undefined };\n }\n\n if (options?.validateDisposable !== false) {\n result.validators.disposable = { valid: !disposableProviders.includes(domain) };\n }\n\n if (options?.validateFree !== false) {\n result.validators.free = { valid: !freeProviders.includes(domain) };\n }\n\n if (options?.validateMx && options.dnsResolver) {\n try {\n const records = await options.dnsResolver.resolveMx(domain);\n const hasMx = records.length > 0;\n result.validators.mx = {\n valid: hasMx,\n records: hasMx ? records.map((r) => r.exchange) : undefined,\n };\n } catch (error) {\n result.validators.mx = {\n valid: false,\n error: error instanceof Error ? error.message : 'MX validation failed',\n };\n }\n }\n\n // Free-provider detection is informational; only the hard validators gate validity.\n result.valid = (['syntax', 'typo', 'disposable', 'mx'] as const).every((key) => {\n const validator = result.validators[key];\n return !validator || validator.valid !== false;\n });\n\n if (!options?.skipCache) validationCache.set(normalized, result);\n return result;\n}\n\nexport async function validateEmailBatch(\n emails: string[],\n options?: ValidateEmailOptions & { dnsResolver?: DNSResolver }\n): Promise<EmailValidationResult[]> {\n const chunkSize = options?.batchSize ?? 10;\n const results: EmailValidationResult[] = [];\n for (let i = 0; i < emails.length; i += chunkSize) {\n const chunk = emails.slice(i, i + chunkSize);\n const chunkResults = await Promise.all(chunk.map((email) => validateEmailCore(email, options)));\n results.push(...chunkResults);\n }\n return results;\n}\n\nexport function clearCache(): void {\n validationCache.clear();\n mxCache.clear();\n}\n\nexport type { DomainSuggesterOptions, EmailValidationResult, ValidateEmailOptions } from '../types';\n","import type { EmailValidationResult } from '../../types';\nimport { validateEmailBatch, validateEmailCore } from '../verifier';\nimport type { ValidationDispatch } from './validation';\n\n/**\n * Execute a classified request against the core validator. Single-email\n * requests yield one result; batch requests yield an array.\n */\nexport async function executeValidation(\n dispatch: ValidationDispatch\n): Promise<EmailValidationResult | EmailValidationResult[]> {\n if (dispatch.kind === 'single') {\n return validateEmailCore(dispatch.email, dispatch.options);\n }\n return validateEmailBatch(dispatch.emails, dispatch.options);\n}\n","import type { ValidateEmailOptions } from '../../types';\n\n/** Hard limit on batch size enforced by every adapter. */\nexport const MAX_BATCH_SIZE = 100;\n\n/** Shape of POST bodies and Lambda invocations across all serverless adapters. */\nexport interface ValidationRequestBody {\n email?: string;\n emails?: string[];\n options?: ValidateEmailOptions;\n}\n\nexport type ValidationDispatch =\n | { kind: 'single'; email: string; options?: ValidateEmailOptions }\n | { kind: 'batch'; emails: string[]; options?: ValidateEmailOptions };\n\nexport interface ValidationFailure {\n kind: 'invalid';\n status: 400;\n message: string;\n}\n\n/**\n * Validation for endpoints that accept ONLY a batch (`emails`). Returns\n * a 400 failure if emails is missing/empty/oversized, or null when valid.\n * Routed `/validate/batch` paths use this so error messages stay batch-specific.\n */\nexport type BatchValidation = { ok: true; emails: string[] } | { ok: false; status: 400; message: string };\n\nexport function validateBatchEmailsField(emails: unknown): BatchValidation {\n if (!Array.isArray(emails) || emails.length === 0) {\n return { ok: false, status: 400, message: 'Emails array is required' };\n }\n if (emails.length > MAX_BATCH_SIZE) {\n return { ok: false, status: 400, message: `Maximum ${MAX_BATCH_SIZE} emails allowed per batch` };\n }\n return { ok: true, emails: emails as string[] };\n}\n\n/**\n * Apply the rules every serverless adapter shares:\n * 1. body must request either `email` or `emails`\n * 2. `emails` must be a non-empty array of ≤ MAX_BATCH_SIZE entries\n *\n * Centralising this means a future rule change (say, raising the cap) lands\n * in one place instead of three.\n */\nexport function classifyRequest(\n body: ValidationRequestBody | null | undefined\n): ValidationDispatch | ValidationFailure {\n if (!body || (!body.email && !body.emails)) {\n return { kind: 'invalid', status: 400, message: 'Email or emails array is required' };\n }\n if (body.emails) {\n if (!Array.isArray(body.emails) || body.emails.length === 0) {\n return { kind: 'invalid', status: 400, message: 'Emails array is required' };\n }\n if (body.emails.length > MAX_BATCH_SIZE) {\n return { kind: 'invalid', status: 400, message: `Maximum ${MAX_BATCH_SIZE} emails allowed per batch` };\n }\n return { kind: 'batch', emails: body.emails, options: body.options };\n }\n // body.email must be set per the first guard (which checks both fields).\n if (!body.email) {\n return { kind: 'invalid', status: 400, message: 'Email or emails array is required' };\n }\n return { kind: 'single', email: body.email, options: body.options };\n}\n","/**\n * AWS Lambda adapter — three handler shapes for three deploy modes:\n *\n * - `handler` — routed (recommended) — `/health`, `/validate`,\n * `/validate/batch`. Wire to API Gateway with\n * `{proxy+}` so all three paths land on one Lambda.\n * - `apiGatewayHandler` — single-route — accepts API Gateway proxy events\n * but never inspects `event.path`. Pick this when\n * you want one Lambda per URL.\n * - `lambdaHandler` — direct invocation — no API Gateway envelope.\n * Pick this when calling from another AWS service\n * (Step Functions, EventBridge, …).\n *\n * Shared validation rules + CORS headers come from `../_shared/` so all three\n * agree on what's accepted.\n */\nimport type { ValidateEmailOptions } from '../../types';\nimport { corsHeaders, jsonHeaders } from '../_shared/cors';\nimport { executeValidation } from '../_shared/dispatch';\nimport { classifyRequest, type ValidationRequestBody, validateBatchEmailsField } from '../_shared/validation';\nimport { clearCache, validateEmailCore } from '../verifier';\n\n/**\n * Loose API-Gateway event/result/context shapes — `headers` and similar maps\n * intentionally widen to `string | undefined` so they line up with the\n * official `@types/aws-lambda` definitions used by callers/tests.\n */\nexport interface APIGatewayProxyEvent {\n body: string | null;\n headers: { [key: string]: string | undefined };\n httpMethod: string;\n path: string;\n queryStringParameters: { [key: string]: string | undefined } | null;\n pathParameters: { [key: string]: string | undefined } | null;\n isBase64Encoded?: boolean;\n}\n\nexport interface APIGatewayProxyResult {\n statusCode: number;\n headers?: { [key: string]: string };\n body: string;\n}\n\nexport interface LambdaContext {\n functionName: string;\n functionVersion: string;\n awsRequestId: string;\n remainingTimeInMillis: number;\n}\n\ninterface ValidateResponse {\n success: boolean;\n data?: unknown;\n error?: string;\n}\n\nconst POST_HEADERS = jsonHeaders(corsHeaders('POST, OPTIONS'));\nconst ROUTED_HEADERS = jsonHeaders(corsHeaders());\n\nfunction jsonResponse(statusCode: number, body: unknown, headers: Record<string, string>): APIGatewayProxyResult {\n return { statusCode, headers, body: JSON.stringify(body) };\n}\n\n// Single-route API Gateway handler — accepts proxy events but doesn't inspect `event.path`.\nexport async function apiGatewayHandler(\n event: APIGatewayProxyEvent,\n _context: LambdaContext\n): Promise<APIGatewayProxyResult> {\n if (event.httpMethod === 'OPTIONS') {\n return { statusCode: 200, headers: corsHeaders('POST, OPTIONS'), body: '' };\n }\n\n try {\n const request: ValidationRequestBody = event.body ? JSON.parse(event.body) : {};\n const classified = classifyRequest(request);\n if (classified.kind === 'invalid') {\n return jsonResponse(classified.status, { success: false, error: classified.message }, POST_HEADERS);\n }\n const data = await executeValidation(classified);\n return jsonResponse(200, { success: true, data }, POST_HEADERS);\n } catch (error) {\n console.error('Lambda error:', error);\n const message = error instanceof Error ? error.message : 'Internal server error';\n return jsonResponse(500, { success: false, error: message }, POST_HEADERS);\n }\n}\n\n// Direct Lambda handler (no API Gateway envelope).\nexport async function lambdaHandler(event: ValidationRequestBody, _context: LambdaContext): Promise<ValidateResponse> {\n try {\n const classified = classifyRequest(event);\n if (classified.kind === 'invalid') {\n return { success: false, error: classified.message };\n }\n return { success: true, data: await executeValidation(classified) };\n } catch (error) {\n console.error('Lambda error:', error);\n return { success: false, error: error instanceof Error ? error.message : 'Internal server error' };\n }\n}\n\n// Cache management handler.\nexport async function cacheHandler(\n event: { action: 'clear' | 'stats' },\n _context: LambdaContext\n): Promise<{ success: boolean; message?: string; stats?: unknown }> {\n switch (event.action) {\n case 'clear':\n clearCache();\n return { success: true, message: 'Cache cleared' };\n case 'stats':\n return { success: true, message: 'Cache stats not implemented' };\n default:\n return { success: false, message: 'Invalid action' };\n }\n}\n\n/** Decode the API Gateway body, supporting base64-encoded payloads. */\nfunction decodeBody(event: APIGatewayProxyEvent): unknown {\n if (!event.body) return {};\n const raw = event.isBase64Encoded ? Buffer.from(event.body, 'base64').toString('utf-8') : event.body;\n return JSON.parse(raw);\n}\n\n// Routed handler — supports /health, /validate, /validate/batch. The context\n// argument is intentionally `unknown` so callers can pass either our minimal\n// LambdaContext or the official `aws-lambda#Context` without a cast.\nexport async function handler(event: APIGatewayProxyEvent, _context?: unknown): Promise<APIGatewayProxyResult> {\n if (event.httpMethod === 'OPTIONS') {\n return { statusCode: 204, headers: corsHeaders(), body: '' };\n }\n\n if (event.path === '/health' && event.httpMethod === 'GET') {\n return jsonResponse(200, { status: 'healthy', timestamp: new Date().toISOString() }, ROUTED_HEADERS);\n }\n\n const isValidatePath = event.path === '/validate' || event.path === '/validate/batch';\n if (isValidatePath && event.httpMethod !== 'POST') {\n return jsonResponse(405, { error: 'Method not allowed' }, ROUTED_HEADERS);\n }\n\n if (event.path === '/validate' && event.httpMethod === 'POST') {\n try {\n const body = decodeBody(event) as { email?: string };\n if (!body.email) return jsonResponse(400, { error: 'Email is required' }, ROUTED_HEADERS);\n\n const options = parseValidateOptions(event.queryStringParameters);\n const result = await validateEmailCore(body.email, options);\n return jsonResponse(200, result, ROUTED_HEADERS);\n } catch (error) {\n if (error instanceof SyntaxError) {\n return jsonResponse(400, { error: 'Invalid request body' }, ROUTED_HEADERS);\n }\n console.error('Validation error:', error);\n return jsonResponse(500, { error: 'Internal server error' }, ROUTED_HEADERS);\n }\n }\n\n if (event.path === '/validate/batch' && event.httpMethod === 'POST') {\n try {\n const body = decodeBody(event) as ValidationRequestBody;\n const validated = validateBatchEmailsField(body.emails);\n if (!validated.ok) return jsonResponse(validated.status, { error: validated.message }, ROUTED_HEADERS);\n const results = await executeValidation({ kind: 'batch', emails: validated.emails });\n return jsonResponse(200, { results }, ROUTED_HEADERS);\n } catch (error) {\n console.error('Batch validation error:', error);\n return jsonResponse(500, { error: 'Internal server error' }, ROUTED_HEADERS);\n }\n }\n\n return jsonResponse(404, { error: 'Not found' }, ROUTED_HEADERS);\n}\n\nfunction parseValidateOptions(query: { [key: string]: string | undefined } | null): Partial<ValidateEmailOptions> {\n if (!query) return {};\n const options: Partial<ValidateEmailOptions> = {};\n if (query.skipCache === 'true') options.skipCache = true;\n if (query.validateTypo === 'false') options.validateTypo = false;\n return options;\n}\n\nexport default {\n apiGatewayHandler,\n lambdaHandler,\n cacheHandler,\n handler,\n};\n","/**\n * Azure Functions adapter for email validation.\n *\n * Targets the v4 programming model:\n * `(request: HttpRequest, context: InvocationContext): Promise<HttpResponseInit>`\n *\n * The HttpRequest is a Web-API-aligned shape (`request.json()`, `request.method`,\n * `request.query`, `request.headers`), so the adapter reads the body via the\n * Web API. Routes:\n * - GET /api/health\n * - POST /api/validate\n * - POST /api/validate/batch\n *\n * Two handler shapes are exported:\n * - `azureHandler`: routed (recommended).\n * - `azureFunction`: single-route convenience that infers single vs. batch\n * from the body — for one-function-per-URL setups.\n *\n * The interfaces below are minimal subsets of the official `@azure/functions`\n * types so callers can pass real Azure types without an extra cast.\n */\nimport type { ValidateEmailOptions } from '../../types';\nimport { corsHeaders, jsonHeaders } from '../_shared/cors';\nimport { executeValidation } from '../_shared/dispatch';\nimport { classifyRequest, type ValidationRequestBody, validateBatchEmailsField } from '../_shared/validation';\nimport { validateEmailCore } from '../verifier';\n\nexport interface AzureHttpRequest {\n method: string;\n url: string;\n headers: { get(name: string): string | null } | Record<string, string | undefined>;\n query: { get(name: string): string | null } | Record<string, string | undefined>;\n json(): Promise<unknown>;\n text?: () => Promise<string>;\n}\n\nexport interface AzureInvocationContext {\n invocationId?: string;\n functionName?: string;\n log?: (...args: unknown[]) => void;\n error?: (...args: unknown[]) => void;\n}\n\nexport interface AzureHttpResponseInit {\n status: number;\n headers: Record<string, string>;\n jsonBody?: unknown;\n body?: string;\n}\n\nconst ROUTED_HEADERS = jsonHeaders(corsHeaders());\n\nfunction jsonResponse(\n status: number,\n body: unknown,\n headers: Record<string, string> = ROUTED_HEADERS\n): AzureHttpResponseInit {\n return { status, headers, jsonBody: body };\n}\n\nfunction pathOf(req: AzureHttpRequest): string {\n try {\n return new URL(req.url).pathname || '/';\n } catch {\n // Some test harnesses pass a bare path. Treat it as the pathname.\n const idx = req.url.indexOf('?');\n return idx === -1 ? req.url : req.url.slice(0, idx);\n }\n}\n\nfunction readQuery(query: AzureHttpRequest['query'], key: string): string | undefined {\n if (typeof (query as { get?: unknown }).get === 'function') {\n const v = (query as { get: (k: string) => string | null }).get(key);\n return v ?? undefined;\n }\n const value = (query as Record<string, string | undefined>)[key];\n return value;\n}\n\nfunction parseValidateOptions(query: AzureHttpRequest['query']): Partial<ValidateEmailOptions> {\n const options: Partial<ValidateEmailOptions> = {};\n if (readQuery(query, 'skipCache') === 'true') options.skipCache = true;\n if (readQuery(query, 'validateTypo') === 'false') options.validateTypo = false;\n return options;\n}\n\nasync function readJsonBody(req: AzureHttpRequest): Promise<unknown> {\n try {\n return await req.json();\n } catch {\n throw new SyntaxError('Invalid JSON body');\n }\n}\n\n/** Routed Azure Functions v4 handler. */\nexport async function azureHandler(\n req: AzureHttpRequest,\n _context?: AzureInvocationContext\n): Promise<AzureHttpResponseInit> {\n if (req.method === 'OPTIONS') {\n return { status: 204, headers: corsHeaders() };\n }\n\n const path = pathOf(req);\n\n if (path === '/api/health' && req.method === 'GET') {\n return jsonResponse(200, { status: 'healthy', platform: 'azure', timestamp: new Date().toISOString() });\n }\n\n const isValidatePath = path === '/api/validate' || path === '/api/validate/batch';\n if (isValidatePath && req.method !== 'POST') {\n return jsonResponse(405, { error: 'Method not allowed' });\n }\n\n if (path === '/api/validate' && req.method === 'POST') {\n try {\n const body = (await readJsonBody(req)) as { email?: string };\n if (!body.email) return jsonResponse(400, { error: 'Email is required' });\n const options = parseValidateOptions(req.query);\n const result = await validateEmailCore(body.email, options);\n return jsonResponse(200, result);\n } catch (error) {\n if (error instanceof SyntaxError) return jsonResponse(400, { error: 'Invalid request body' });\n console.error('Azure validation error:', error);\n return jsonResponse(500, { error: 'Internal server error' });\n }\n }\n\n if (path === '/api/validate/batch' && req.method === 'POST') {\n try {\n const body = (await readJsonBody(req)) as ValidationRequestBody;\n const validated = validateBatchEmailsField(body.emails);\n if (!validated.ok) return jsonResponse(validated.status, { error: validated.message });\n const results = await executeValidation({ kind: 'batch', emails: validated.emails });\n return jsonResponse(200, { results });\n } catch (error) {\n if (error instanceof SyntaxError) return jsonResponse(400, { error: 'Invalid request body' });\n console.error('Azure batch validation error:', error);\n return jsonResponse(500, { error: 'Internal server error' });\n }\n }\n\n return jsonResponse(404, { error: 'Not found' });\n}\n\n/** Single-route convenience — infers single vs. batch from the body. */\nexport async function azureFunction(\n req: AzureHttpRequest,\n _context?: AzureInvocationContext\n): Promise<AzureHttpResponseInit> {\n if (req.method === 'OPTIONS') {\n return { status: 204, headers: corsHeaders('POST, OPTIONS') };\n }\n if (req.method !== 'POST') return jsonResponse(405, { success: false, error: 'Method not allowed' });\n\n try {\n const body = (await readJsonBody(req)) as ValidationRequestBody;\n const classified = classifyRequest(body);\n if (classified.kind === 'invalid') {\n return jsonResponse(classified.status, { success: false, error: classified.message });\n }\n const data = await executeValidation(classified);\n return jsonResponse(200, { success: true, data });\n } catch (error) {\n if (error instanceof SyntaxError) return jsonResponse(400, { success: false, error: 'Invalid request body' });\n console.error('Azure function error:', error);\n const message = error instanceof Error ? error.message : 'Internal server error';\n return jsonResponse(500, { success: false, error: message });\n }\n}\n\nexport default {\n azureHandler,\n azureFunction,\n};\n","/**\n * Cloudflare Workers adapter for email validation.\n * Supports Workers, Pages Functions, and Durable Objects.\n *\n * Shared validation/CORS logic comes from `../_shared/`.\n */\nimport type { EmailValidationResult } from '../../types';\nimport { corsHeaders, jsonHeaders } from '../_shared/cors';\nimport { executeValidation } from '../_shared/dispatch';\nimport { classifyRequest, type ValidationRequestBody } from '../_shared/validation';\nimport { EdgeCache, validateEmailBatch, validateEmailCore } from '../verifier';\n\ninterface KVNamespace {\n get<T = unknown>(key: string, type?: 'text' | 'json' | 'arrayBuffer' | 'stream'): Promise<T | null>;\n put(key: string, value: string | ArrayBuffer | ReadableStream, options?: { expirationTtl?: number }): Promise<void>;\n delete(key: string): Promise<void>;\n}\n\ninterface DurableObjectNamespace {\n idFromName(name: string): DurableObjectId;\n get(id: DurableObjectId): DurableObjectStub;\n}\n\ninterface DurableObjectId {\n toString(): string;\n}\n\ninterface DurableObjectStub {\n fetch(request: Request): Promise<Response>;\n}\n\ninterface DurableObjectState {\n storage: DurableObjectStorage;\n}\n\ninterface DurableObjectStorage {\n get<T = unknown>(key: string): Promise<T | undefined>;\n put<T = unknown>(key: string, value: T): Promise<void>;\n delete(key: string): Promise<void>;\n}\n\nexport interface CloudflareRequest extends Request {\n cf?: {\n country?: string;\n colo?: string;\n timezone?: string;\n };\n}\n\nexport interface CloudflareEnv {\n EMAIL_CACHE?: KVNamespace;\n EMAIL_VALIDATOR?: DurableObjectNamespace;\n [key: string]: unknown;\n}\n\nexport interface CloudflareContext {\n waitUntil(promise: Promise<unknown>): void;\n passThroughOnException(): void;\n}\n\nclass KVCache<T> {\n constructor(\n private kv: KVNamespace,\n private ttl: number = 3600\n ) {}\n\n async get(key: string): Promise<T | undefined> {\n const value = await this.kv.get(key, 'json');\n return value as T | undefined;\n }\n\n async set(key: string, value: T): Promise<void> {\n await this.kv.put(key, JSON.stringify(value), { expirationTtl: this.ttl });\n }\n\n async delete(key: string): Promise<void> {\n await this.kv.delete(key);\n }\n}\n\nconst POST_HEADERS = jsonHeaders(corsHeaders('POST, GET, OPTIONS'));\n\nfunction jsonResponse(status: number, body: unknown, headers: Record<string, string> = POST_HEADERS): Response {\n return new Response(JSON.stringify(body), { status, headers });\n}\n\nfunction parseGetParams(url: URL): ValidationRequestBody {\n const email = url.searchParams.get('email');\n const emails = url.searchParams.get('emails');\n return {\n email: email || undefined,\n emails: emails ? emails.split(',') : undefined,\n options: {\n validateMx: url.searchParams.get('validateMx') === 'true',\n validateSMTP: url.searchParams.get('validateSMTP') === 'true',\n validateTypo: url.searchParams.get('validateTypo') !== 'false',\n validateDisposable: url.searchParams.get('validateDisposable') !== 'false',\n validateFree: url.searchParams.get('validateFree') !== 'false',\n },\n };\n}\n\nasync function workerHandler(\n request: CloudflareRequest,\n env: CloudflareEnv,\n ctx: CloudflareContext\n): Promise<Response> {\n const kvCache = env.EMAIL_CACHE ? new KVCache<EmailValidationResult>(env.EMAIL_CACHE) : undefined;\n\n if (request.method === 'OPTIONS') {\n return new Response(null, { status: 200, headers: corsHeaders('POST, GET, OPTIONS') });\n }\n\n try {\n let body: ValidationRequestBody;\n if (request.method === 'GET') {\n body = parseGetParams(new URL(request.url));\n } else if (request.method === 'POST') {\n body = await request.json();\n } else {\n return jsonResponse(405, { success: false, error: 'Method not allowed' });\n }\n\n const classified = classifyRequest(body);\n if (classified.kind === 'invalid') {\n return jsonResponse(classified.status, { success: false, error: classified.message });\n }\n\n // Per-email KV cache short-circuit (single-email path only).\n if (classified.kind === 'single' && kvCache && !classified.options?.skipCache) {\n const cached = await kvCache.get(`email:${classified.email}`);\n if (cached) {\n return new Response(JSON.stringify({ success: true, data: cached, cached: true }), {\n status: 200,\n headers: jsonHeaders({\n ...corsHeaders('POST, GET, OPTIONS'),\n 'Cache-Control': 'public, max-age=3600',\n 'CF-Cache-Status': 'HIT',\n }),\n });\n }\n }\n\n const data = await executeValidation(classified);\n\n // Write-through to KV when the request didn't ask to skip the cache.\n if (kvCache && !classified.options?.skipCache) {\n if (classified.kind === 'single') {\n ctx.waitUntil(kvCache.set(`email:${classified.email}`, data as EmailValidationResult));\n } else {\n const writes = (data as EmailValidationResult[]).map((result, i) =>\n kvCache.set(`email:${classified.emails[i]}`, result)\n );\n ctx.waitUntil(Promise.all(writes));\n }\n }\n\n const headers = jsonHeaders({\n ...corsHeaders('POST, GET, OPTIONS'),\n 'Cache-Control': 'public, max-age=3600',\n ...(classified.kind === 'single' ? { 'CF-Cache-Status': 'MISS' } : {}),\n });\n return new Response(JSON.stringify({ success: true, data }), { status: 200, headers });\n } catch (error) {\n console.error('Cloudflare Workers error:', error);\n const message = error instanceof Error ? error.message : 'Internal server error';\n return jsonResponse(500, { success: false, error: message });\n }\n}\n\n// Durable Object for stateful validation. The `state` and `env` arguments are\n// part of the Durable Object constructor contract but unused here — the cache\n// lives entirely in process memory; persisting to `state.storage` is a future\n// enhancement, not the current behavior.\nexport class EmailValidatorDO {\n private readonly cache: EdgeCache<EmailValidationResult>;\n\n constructor(_state: DurableObjectState, _env: CloudflareEnv) {\n this.cache = new EdgeCache(1000, 3600000);\n }\n\n async fetch(request: Request): Promise<Response> {\n const url = new URL(request.url);\n switch (url.pathname) {\n case '/validate':\n return this.handleValidation(request);\n case '/cache/clear':\n return this.handleCacheClear();\n case '/cache/stats':\n return this.handleCacheStats();\n default:\n return new Response('Not found', { status: 404 });\n }\n }\n\n private async handleValidation(request: Request): Promise<Response> {\n try {\n const requestData: ValidationRequestBody = await request.json();\n const classified = classifyRequest(requestData);\n if (classified.kind === 'invalid') {\n return new Response(JSON.stringify({ success: false, error: classified.message }), {\n status: classified.status,\n headers: { 'Content-Type': 'application/json' },\n });\n }\n const data =\n classified.kind === 'single'\n ? await validateEmailCore(classified.email, classified.options)\n : await validateEmailBatch(classified.emails, classified.options);\n return new Response(JSON.stringify({ success: true, data }), {\n headers: { 'Content-Type': 'application/json' },\n });\n } catch (error) {\n const message = error instanceof Error ? error.message : 'Internal server error';\n return new Response(JSON.stringify({ success: false, error: message }), {\n status: 500,\n headers: { 'Content-Type': 'application/json' },\n });\n }\n }\n\n private async handleCacheClear(): Promise<Response> {\n this.cache.clear();\n return new Response(JSON.stringify({ success: true, message: 'Cache cleared' }), {\n headers: { 'Content-Type': 'application/json' },\n });\n }\n\n private async handleCacheStats(): Promise<Response> {\n return new Response(JSON.stringify({ success: true, stats: { size: this.cache.size() } }), {\n headers: { 'Content-Type': 'application/json' },\n });\n }\n}\n\nexport default {\n fetch: workerHandler,\n workerHandler,\n EmailValidatorDO,\n};\n\nexport { workerHandler };\n","/**\n * Google Cloud Functions (2nd gen) adapter for email validation.\n *\n * 2nd-gen Cloud Functions run on Cloud Run and use the Functions Framework's\n * Express-style `(req, res)` signature. The routed handler exposes:\n * - GET /health\n * - POST /validate\n * - POST /validate/batch\n *\n * Two handler shapes are exported:\n * - `gcpHandler`: routed (recommended).\n * - `gcpFunction`: single-route convenience that infers single vs. batch\n * from the body, useful when you've already configured your function\n * URL with one path.\n *\n * The interfaces below intentionally mirror the relevant subset of\n * `express-serve-static-core`'s Request / Response so callers can pass the\n * Functions Framework's req/res without an extra cast.\n */\nimport type { ValidateEmailOptions } from '../../types';\nimport { corsHeaders, jsonHeaders } from '../_shared/cors';\nimport { executeValidation } from '../_shared/dispatch';\nimport { classifyRequest, type ValidationRequestBody, validateBatchEmailsField } from '../_shared/validation';\nimport { validateEmailCore } from '../verifier';\n\n/**\n * Express-shaped request. We only consume the fields the Functions Framework\n * guarantees: method, path (the URL path inside the function), query, body,\n * and the lowercase headers map.\n */\nexport interface GcpRequest {\n method: string;\n path?: string;\n url?: string;\n query?: Record<string, string | string[] | undefined>;\n body?: unknown;\n headers?: Record<string, string | string[] | undefined>;\n}\n\nexport interface GcpResponse {\n status(code: number): GcpResponse;\n set(headers: Record<string, string>): GcpResponse;\n json(body: unknown): GcpResponse;\n send(body?: unknown): GcpResponse;\n}\n\nconst ROUTED_HEADERS = jsonHeaders(corsHeaders());\n\nfunction pathOf(req: GcpRequest): string {\n if (req.path) return req.path;\n if (req.url) {\n const idx = req.url.indexOf('?');\n return idx === -1 ? req.url : req.url.slice(0, idx);\n }\n return '/';\n}\n\nfunction readJsonBody(req: GcpRequest): ValidationRequestBody {\n // Functions Framework parses application/json automatically. Tests may pass\n // a string body to mimic edge cases; tolerate both forms.\n if (typeof req.body === 'string') {\n try {\n return JSON.parse(req.body) as ValidationRequestBody;\n } catch {\n return {};\n }\n }\n return (req.body as ValidationRequestBody | undefined) ?? {};\n}\n\nfunction parseValidateOptions(query: GcpRequest['query']): Partial<ValidateEmailOptions> {\n if (!query) return {};\n const options: Partial<ValidateEmailOptions> = {};\n const skip = query.skipCache;\n const typo = query.validateTypo;\n if (skip === 'true') options.skipCache = true;\n if (typo === 'false') options.validateTypo = false;\n return options;\n}\n\n/**\n * Routed Cloud Functions handler. Wire it as the function entry point:\n *\n * import { gcpHandler } from '@emailcheck/email-validator-js/serverless/gcp';\n * export const validateEmail = gcpHandler;\n */\nexport async function gcpHandler(req: GcpRequest, res: GcpResponse): Promise<void> {\n if (req.method === 'OPTIONS') {\n res.status(204).set(corsHeaders()).send();\n return;\n }\n\n const path = pathOf(req);\n\n if (path === '/health' && req.method === 'GET') {\n res\n .status(200)\n .set(ROUTED_HEADERS)\n .json({ status: 'healthy', platform: 'gcp', timestamp: new Date().toISOString() });\n return;\n }\n\n const isValidatePath = path === '/validate' || path === '/validate/batch';\n if (isValidatePath && req.method !== 'POST') {\n res.status(405).set(ROUTED_HEADERS).json({ error: 'Method not allowed' });\n return;\n }\n\n if (path === '/validate' && req.method === 'POST') {\n try {\n const body = readJsonBody(req);\n if (!body.email) {\n res.status(400).set(ROUTED_HEADERS).json({ error: 'Email is required' });\n return;\n }\n const options = parseValidateOptions(req.query);\n const result = await validateEmailCore(body.email, options);\n res.status(200).set(ROUTED_HEADERS).json(result);\n return;\n } catch (error) {\n console.error('GCP validation error:', error);\n res.status(500).set(ROUTED_HEADERS).json({ error: 'Internal server error' });\n return;\n }\n }\n\n if (path === '/validate/batch' && req.method === 'POST') {\n try {\n const body = readJsonBody(req);\n const validated = validateBatchEmailsField(body.emails);\n if (!validated.ok) {\n res.status(validated.status).set(ROUTED_HEADERS).json({ error: validated.message });\n return;\n }\n const results = await executeValidation({ kind: 'batch', emails: validated.emails });\n res.status(200).set(ROUTED_HEADERS).json({ results });\n return;\n } catch (error) {\n console.error('GCP batch validation error:', error);\n res.status(500).set(ROUTED_HEADERS).json({ error: 'Internal server error' });\n return;\n }\n }\n\n res.status(404).set(ROUTED_HEADERS).json({ error: 'Not found' });\n}\n\n/**\n * Single-route convenience handler — infers single-vs-batch from the body\n * and ignores the request path. Use this when the function's URL itself\n * is the entry point and you don't need internal routing.\n */\nexport async function gcpFunction(req: GcpRequest, res: GcpResponse): Promise<void> {\n if (req.method === 'OPTIONS') {\n res.status(204).set(corsHeaders('POST, OPTIONS')).send();\n return;\n }\n if (req.method !== 'POST') {\n res.status(405).set(ROUTED_HEADERS).json({ error: 'Method not allowed' });\n return;\n }\n try {\n const body = readJsonBody(req);\n const classified = classifyRequest(body);\n if (classified.kind === 'invalid') {\n res.status(classified.status).set(ROUTED_HEADERS).json({ success: false, error: classified.message });\n return;\n }\n const data = await executeValidation(classified);\n res.status(200).set(ROUTED_HEADERS).json({ success: true, data });\n } catch (error) {\n console.error('GCP function error:', error);\n const message = error instanceof Error ? error.message : 'Internal server error';\n res.status(500).set(ROUTED_HEADERS).json({ success: false, error: message });\n }\n}\n\nexport default {\n gcpHandler,\n gcpFunction,\n};\n","/**\n * Netlify Functions adapter for email validation.\n *\n * Netlify Functions run on AWS Lambda under the hood, so the event/result\n * shape is structurally identical to API Gateway proxy events. The adapter\n * surfaces the same routed paths and CORS handling as the AWS adapter:\n *\n * GET /.netlify/functions/<name>/health\n * POST /.netlify/functions/<name>/validate\n * POST /.netlify/functions/<name>/validate/batch\n *\n * Netlify also supports redirects via `_redirects` / `netlify.toml` so users\n * commonly map `/api/*` → `/.netlify/functions/<name>/:splat` to keep URLs\n * clean. The handler accepts both forms.\n *\n * Two handler shapes are exported:\n * - `netlifyHandler`: routed; recommended.\n * - `netlifyFunction`: single-route convenience that infers single vs. batch\n * from the body, useful when one function = one URL.\n */\nimport type { ValidateEmailOptions } from '../../types';\nimport { corsHeaders, jsonHeaders } from '../_shared/cors';\nimport { executeValidation } from '../_shared/dispatch';\nimport { classifyRequest, type ValidationRequestBody, validateBatchEmailsField } from '../_shared/validation';\nimport { validateEmailCore } from '../verifier';\n\n/** Netlify event — structurally compatible with API Gateway proxy events. */\nexport interface NetlifyEvent {\n body: string | null;\n headers: { [key: string]: string | undefined };\n httpMethod: string;\n path: string;\n queryStringParameters: { [key: string]: string | undefined } | null;\n isBase64Encoded?: boolean;\n rawUrl?: string;\n}\n\nexport interface NetlifyResult {\n statusCode: number;\n headers?: { [key: string]: string };\n body: string;\n}\n\n/** Function context — Netlify mirrors a subset of the Lambda context. */\nexport interface NetlifyContext {\n functionName?: string;\n awsRequestId?: string;\n identity?: unknown;\n clientContext?: unknown;\n}\n\nconst ROUTED_HEADERS = jsonHeaders(corsHeaders());\n\nfunction jsonResponse(\n statusCode: number,\n body: unknown,\n headers: Record<string, string> = ROUTED_HEADERS\n): NetlifyResult {\n return { statusCode, headers, body: JSON.stringify(body) };\n}\n\nfunction decodeBody(event: NetlifyEvent): unknown {\n if (!event.body) return {};\n const raw = event.isBase64Encoded ? Buffer.from(event.body, 'base64').toString('utf8') : event.body;\n try {\n return JSON.parse(raw);\n } catch {\n throw new SyntaxError('Invalid JSON body');\n }\n}\n\n/**\n * Strip Netlify's function-prefix from the incoming path so route matching\n * works regardless of whether the user hits the raw function URL or a\n * `/api/*` redirect.\n */\nfunction normalizePath(rawPath: string): string {\n // Common forms:\n // /.netlify/functions/<name>/health\n // /api/health (with redirect)\n // /health (custom config)\n const stripped = rawPath.replace(/^\\/.netlify\\/functions\\/[^/]+/, '').replace(/^\\/api/, '');\n return stripped || '/';\n}\n\nfunction parseValidateOptions(query: NetlifyEvent['queryStringParameters']): Partial<ValidateEmailOptions> {\n if (!query) return {};\n const options: Partial<ValidateEmailOptions> = {};\n if (query.skipCache === 'true') options.skipCache = true;\n if (query.validateTypo === 'false') options.validateTypo = false;\n return options;\n}\n\n/** Routed Netlify handler. */\nexport async function netlifyHandler(event: NetlifyEvent, _context?: NetlifyContext): Promise<NetlifyResult> {\n if (event.httpMethod === 'OPTIONS') {\n return { statusCode: 204, headers: corsHeaders(), body: '' };\n }\n\n const path = normalizePath(event.path);\n\n if (path === '/health' && event.httpMethod === 'GET') {\n return jsonResponse(200, { status: 'healthy', platform: 'netlify', timestamp: new Date().toISOString() });\n }\n\n const isValidatePath = path === '/validate' || path === '/validate/batch';\n if (isValidatePath && event.httpMethod !== 'POST') {\n return jsonResponse(405, { error: 'Method not allowed' });\n }\n\n if (path === '/validate' && event.httpMethod === 'POST') {\n try {\n const body = decodeBody(event) as { email?: string };\n if (!body.email) return jsonResponse(400, { error: 'Email is required' });\n\n const options = parseValidateOptions(event.queryStringParameters);\n const result = await validateEmailCore(body.email, options);\n return jsonResponse(200, result);\n } catch (error) {\n if (error instanceof SyntaxError) return jsonResponse(400, { error: 'Invalid request body' });\n console.error('Netlify validation error:', error);\n return jsonResponse(500, { error: 'Internal server error' });\n }\n }\n\n if (path === '/validate/batch' && event.httpMethod === 'POST') {\n try {\n const body = decodeBody(event) as ValidationRequestBody;\n const validated = validateBatchEmailsField(body.emails);\n if (!validated.ok) return jsonResponse(validated.status, { error: validated.message });\n const results = await executeValidation({ kind: 'batch', emails: validated.emails });\n return jsonResponse(200, { results });\n } catch (error) {\n if (error instanceof SyntaxError) return jsonResponse(400, { error: 'Invalid request body' });\n console.error('Netlify batch validation error:', error);\n return jsonResponse(500, { error: 'Internal server error' });\n }\n }\n\n return jsonResponse(404, { error: 'Not found' });\n}\n\n/**\n * Single-route convenience — infers single vs. batch from the body. Useful\n * when each function is mapped to a distinct URL and you don't need internal\n * routing.\n */\nexport async function netlifyFunction(event: NetlifyEvent, _context?: NetlifyContext): Promise<NetlifyResult> {\n if (event.httpMethod === 'OPTIONS') {\n return { statusCode: 204, headers: corsHeaders('POST, OPTIONS'), body: '' };\n }\n if (event.httpMethod !== 'POST') return jsonResponse(405, { success: false, error: 'Method not allowed' });\n\n try {\n const body = decodeBody(event) as ValidationRequestBody;\n const classified = classifyRequest(body);\n if (classified.kind === 'invalid') {\n return jsonResponse(classified.status, { success: false, error: classified.message });\n }\n const data = await executeValidation(classified);\n return jsonResponse(200, { success: true, data });\n } catch (error) {\n if (error instanceof SyntaxError) return jsonResponse(400, { success: false, error: 'Invalid request body' });\n console.error('Netlify function error:', error);\n const message = error instanceof Error ? error.message : 'Internal server error';\n return jsonResponse(500, { success: false, error: message });\n }\n}\n\nexport default {\n netlifyHandler,\n netlifyFunction,\n};\n","/**\n * Vercel adapter — three handler shapes for three runtime / routing combos:\n *\n * - `handler` — routed Web handler — `/api/health`, `/api/validate`,\n * `/api/validate/batch`. Wire as `app/api/[...path]/route.ts`.\n * - `edgeHandler` — single-route Edge handler. Pick this when each URL\n * maps to its own Edge Function (no internal routing).\n * - `nodeHandler` — Express-style `(req, res)` for the Node.js runtime.\n * Pick this when you're on the Node runtime and your\n * framework hands you `VercelRequest` / `VercelResponse`.\n *\n * Shared validation/CORS logic comes from `../_shared/`.\n */\nimport type { ValidateEmailOptions } from '../../types';\nimport { corsHeaders, jsonHeaders } from '../_shared/cors';\nimport { executeValidation } from '../_shared/dispatch';\nimport { classifyRequest, type ValidationRequestBody, validateBatchEmailsField } from '../_shared/validation';\nimport { validateEmailBatch, validateEmailCore } from '../verifier';\n\nexport interface VercelRequest {\n method: string;\n url: string;\n headers: Headers;\n body?: unknown;\n query?: { [key: string]: string | string[] };\n}\n\nexport interface VercelResponse {\n status: (code: number) => VercelResponse;\n json: (data: unknown) => void;\n send: (data: unknown) => void;\n}\n\nconst POST_HEADERS = jsonHeaders(corsHeaders('POST, GET, OPTIONS'));\nconst ROUTED_HEADERS = jsonHeaders({\n 'Access-Control-Allow-Origin': '*',\n 'Cache-Control': 'no-store, max-age=0',\n 'X-Powered-By': 'Vercel Edge Functions',\n});\n\nfunction jsonResponse(status: number, body: unknown, headers: Record<string, string> = POST_HEADERS): Response {\n return new Response(JSON.stringify(body), { status, headers });\n}\n\nfunction parseGetParams(url: URL): ValidationRequestBody {\n const email = url.searchParams.get('email');\n const emails = url.searchParams.get('emails');\n return {\n email: email || undefined,\n emails: emails ? emails.split(',') : undefined,\n options: {\n validateMx: url.searchParams.get('validateMx') === 'true',\n validateSMTP: url.searchParams.get('validateSMTP') === 'true',\n validateTypo: url.searchParams.get('validateTypo') !== 'false',\n validateDisposable: url.searchParams.get('validateDisposable') !== 'false',\n validateFree: url.searchParams.get('validateFree') !== 'false',\n },\n };\n}\n\n// Edge Runtime handler — no path routing, `email`/`emails` from body or query.\nexport async function edgeHandler(request: Request): Promise<Response> {\n if (request.method === 'OPTIONS') {\n return new Response(null, { status: 200, headers: corsHeaders('POST, GET, OPTIONS') });\n }\n\n try {\n let body: ValidationRequestBody;\n if (request.method === 'GET') {\n body = parseGetParams(new URL(request.url));\n } else if (request.method === 'POST') {\n body = await request.json();\n } else {\n return jsonResponse(405, { success: false, error: 'Method not allowed' });\n }\n\n const classified = classifyRequest(body);\n if (classified.kind === 'invalid') {\n return jsonResponse(classified.status, { success: false, error: classified.message });\n }\n\n const data = await executeValidation(classified);\n return jsonResponse(\n 200,\n { success: true, data },\n jsonHeaders({ ...corsHeaders('POST, GET, OPTIONS'), 'Cache-Control': 'public, max-age=3600' })\n );\n } catch (error) {\n console.error('Vercel Edge error:', error);\n const message = error instanceof Error ? error.message : 'Internal server error';\n return jsonResponse(500, { success: false, error: message });\n }\n}\n\n// Node.js runtime handler (Express-style).\nexport async function nodeHandler(req: VercelRequest, res: VercelResponse): Promise<void> {\n if (req.method === 'OPTIONS') {\n res.status(200).send('');\n return;\n }\n\n try {\n let body: ValidationRequestBody;\n if (req.method === 'GET') {\n const fakeUrl = new URL(req.url, 'http://localhost');\n body = parseGetParams(fakeUrl);\n // Fall back to the parsed query map if the URL was relative without params.\n if (!body.email && !body.emails && req.query) {\n body.email = req.query.email as string | undefined;\n body.emails = req.query.emails ? (req.query.emails as string).split(',') : undefined;\n }\n } else if (req.method === 'POST') {\n body = req.body as ValidationRequestBody;\n } else {\n res.status(405).json({ success: false, error: 'Method not allowed' });\n return;\n }\n\n const classified = classifyRequest(body);\n if (classified.kind === 'invalid') {\n res.status(classified.status).json({ success: false, error: classified.message });\n return;\n }\n const data = await executeValidation(classified);\n res.status(200).json({ success: true, data });\n } catch (error) {\n console.error('Vercel Node error:', error);\n res.status(500).json({ success: false, error: error instanceof Error ? error.message : 'Internal server error' });\n }\n}\n\nexport const config = {\n runtime: 'edge',\n regions: ['iad1'],\n};\n\nfunction requireJsonContentType(request: Request): Response | null {\n const contentType = request.headers.get('content-type');\n if (!contentType?.includes('application/json')) {\n return jsonResponse(400, { error: 'Content-Type must be application/json' }, ROUTED_HEADERS);\n }\n return null;\n}\n\nasync function readJsonBody(request: Request): Promise<{ body: unknown } | { error: Response }> {\n try {\n return { body: await request.json() };\n } catch {\n return { error: jsonResponse(400, { error: 'Invalid request body' }, ROUTED_HEADERS) };\n }\n}\n\n// Routed handler used by the test suite — `/api/health`, `/api/validate`,\n// `/api/validate/batch`.\nexport async function handler(request: Request): Promise<Response> {\n const url = new URL(request.url);\n const { pathname } = url;\n\n if (request.method === 'OPTIONS') {\n return new Response(null, { status: 204, headers: corsHeaders() });\n }\n\n try {\n if (pathname === '/api/health' && request.method === 'GET') {\n return jsonResponse(\n 200,\n { status: 'healthy', platform: 'vercel', timestamp: new Date().toISOString() },\n ROUTED_HEADERS\n );\n }\n\n const isValidatePath = pathname === '/api/validate' || pathname === '/api/validate/batch';\n if (isValidatePath && request.method !== 'POST') {\n return jsonResponse(405, { error: 'Method not allowed' }, ROUTED_HEADERS);\n }\n\n if (pathname === '/api/validate' && request.method === 'POST') {\n const ct = requireJsonContentType(request);\n if (ct) return ct;\n const parsed = await readJsonBody(request);\n if ('error' in parsed) return parsed.error;\n const body = parsed.body as { email?: string };\n if (!body.email) return jsonResponse(400, { error: 'Email is required' }, ROUTED_HEADERS);\n\n const options: Partial<ValidateEmailOptions> = {};\n if (url.searchParams.has('skipCache')) options.skipCache = url.searchParams.get('skipCache') === 'true';\n if (url.searchParams.has('validateTypo')) options.validateTypo = url.searchParams.get('validateTypo') === 'true';\n\n const result = await validateEmailCore(body.email, options);\n return jsonResponse(200, result, ROUTED_HEADERS);\n }\n\n if (pathname === '/api/validate/batch' && request.method === 'POST') {\n const ct = requireJsonContentType(request);\n if (ct) return ct;\n const parsed = await readJsonBody(request);\n if ('error' in parsed) return parsed.error;\n const body = parsed.body as ValidationRequestBody;\n const validated = validateBatchEmailsField(body.emails);\n if (!validated.ok) return jsonResponse(validated.status, { error: validated.message }, ROUTED_HEADERS);\n\n const options: { batchSize?: number } = {};\n const batchSizeParam = url.searchParams.get('batchSize');\n if (batchSizeParam) options.batchSize = parseInt(batchSizeParam, 10);\n\n const results = await validateEmailBatch(validated.emails, options);\n return jsonResponse(200, { results }, ROUTED_HEADERS);\n }\n\n return jsonResponse(404, { error: 'Not found' }, ROUTED_HEADERS);\n } catch (error) {\n console.error('Handler error:', error);\n return jsonResponse(500, { error: 'Internal server error' }, ROUTED_HEADERS);\n }\n}\n\nexport default {\n edgeHandler,\n nodeHandler,\n handler,\n};\n"],"names":["__spreadValues","exports","__async","stringSimilarity","POST_HEADERS","ROUTED_HEADERS","jsonResponse","decodeBody","handler","parseValidateOptions","pathOf","readJsonBody","parseGetParams","__spreadProps"],"mappings":"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","x_google_ignoreList":[1]}
1
+ {"version":3,"file":"index.cjs.js","sources":["../../src/serverless/_shared/cors.ts","../../node_modules/string-similarity-js/dist/string-similarity.js","../../src/serverless/verifier.ts","../../src/serverless/_shared/dispatch.ts","../../src/serverless/_shared/validation.ts","../../src/serverless/adapters/aws-lambda.ts","../../src/serverless/adapters/azure.ts","../../src/serverless/adapters/cloudflare.ts","../../src/serverless/adapters/gcp.ts","../../src/serverless/adapters/netlify.ts","../../src/serverless/adapters/vercel.ts"],"sourcesContent":["/**\n * Standard CORS header set used by every adapter. `methods` lets each platform\n * advertise the verbs it actually supports without re-declaring the rest.\n */\nexport function corsHeaders(methods: string = 'GET, POST, OPTIONS'): Record<string, string> {\n return {\n 'Access-Control-Allow-Origin': '*',\n 'Access-Control-Allow-Methods': methods,\n 'Access-Control-Allow-Headers': 'Content-Type',\n };\n}\n\nexport function jsonHeaders(extra?: Record<string, string>): Record<string, string> {\n return { 'Content-Type': 'application/json', ...extra };\n}\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.stringSimilarity = void 0;\n/* global exports, Map */\n/**\n * Calculate similarity between two strings\n * @param {string} str1 First string to match\n * @param {string} str2 Second string to match\n * @param {number} [substringLength=2] Optional. Length of substring to be used in calculating similarity. Default 2.\n * @param {boolean} [caseSensitive=false] Optional. Whether you want to consider case in string matching. Default false;\n * @returns Number between 0 and 1, with 0 being a low match score.\n */\nvar stringSimilarity = function (str1, str2, substringLength, caseSensitive) {\n if (substringLength === void 0) { substringLength = 2; }\n if (caseSensitive === void 0) { caseSensitive = false; }\n if (!caseSensitive) {\n str1 = str1.toLowerCase();\n str2 = str2.toLowerCase();\n }\n if (str1.length < substringLength || str2.length < substringLength)\n return 0;\n var map = new Map();\n for (var i = 0; i < str1.length - (substringLength - 1); i++) {\n var substr1 = str1.substr(i, substringLength);\n map.set(substr1, map.has(substr1) ? map.get(substr1) + 1 : 1);\n }\n var match = 0;\n for (var j = 0; j < str2.length - (substringLength - 1); j++) {\n var substr2 = str2.substr(j, substringLength);\n var count = map.has(substr2) ? map.get(substr2) : 0;\n if (count > 0) {\n map.set(substr2, count - 1);\n match++;\n }\n }\n return (match * 2) / (str1.length + str2.length - ((substringLength - 1) * 2));\n};\nexports.stringSimilarity = stringSimilarity;\nexports.default = exports.stringSimilarity;\n//# sourceMappingURL=string-similarity.js.map","/**\n * Edge-runtime / serverless email validator.\n *\n * No Node.js APIs (no `node:net`, no `node:dns`) — DNS is delegated to a\n * caller-supplied `DNSResolver`, so the same code runs on Cloudflare Workers,\n * Vercel Edge, Lambda@Edge, and Deno Deploy.\n *\n * Shares data with the main validator: `commonEmailDomains` and the typo map\n * are imported from `src/data/`, so we never drift between the two surfaces.\n */\n\nimport { stringSimilarity } from 'string-similarity-js';\nimport commonEmailDomainsJson from '../data/common-email-domains.json';\nimport typoPatternsJson from '../data/typo-patterns.json';\nimport disposableProviders from '../disposable-email-providers.json';\nimport freeProviders from '../free-email-providers.json';\nimport type { DomainSuggesterOptions, EmailValidationResult, ValidateEmailOptions } from '../types';\n\n/** Compact LRU/TTL cache. One Map, expiry stamp per entry, batched eviction. */\nexport class EdgeCache<T> {\n private readonly cache = new Map<string, { value: T; expires: number }>();\n\n constructor(\n private readonly maxSize = 1000,\n private readonly ttl = 3_600_000\n ) {}\n\n get(key: string): T | undefined {\n const item = this.cache.get(key);\n if (!item) return undefined;\n if (Date.now() > item.expires) {\n this.cache.delete(key);\n return undefined;\n }\n return item.value;\n }\n\n set(key: string, value: T): void {\n if (this.cache.size >= this.maxSize) this.evict();\n this.cache.set(key, { value, expires: Date.now() + this.ttl });\n }\n\n clear(): void {\n this.cache.clear();\n }\n\n size(): number {\n return this.cache.size;\n }\n\n private evict(): void {\n // Drop the oldest 10% in one pass — Map preserves insertion order so\n // `keys()` walks oldest-first.\n const drop = Math.max(1, Math.floor(this.maxSize * 0.1));\n let n = 0;\n for (const key of this.cache.keys()) {\n if (n++ >= drop) break;\n this.cache.delete(key);\n }\n }\n}\n\n// Module-level per-isolate caches. Edge runtimes get cold-start fresh; warm\n// invocations benefit from the in-memory hits.\nexport const validationCache = new EdgeCache<EmailValidationResult>(1000);\nexport const mxCache = new EdgeCache<string[]>(500);\n\n/** Same regex the main validator uses — kept inline because edge runtimes don't auto-resolve psl. */\nconst VALID_EMAIL_REGEX =\n /^(([a-zA-Z0-9_+'-]+(\\.[a-zA-Z0-9_+'-]+)*)|(\".+\"))@((\\[[0-9]{1,3}\\.[0-9]{1,3}\\.[0-9]{1,3}\\.[0-9]{1,3}])|(([a-zA-Z0-9-]+\\.)+[a-zA-Z]{2,}))$/;\n\n/**\n * Common email domains — re-exported so callers (Vercel Edge, etc.) can pass a\n * custom subset via `DomainSuggesterOptions.customDomains`.\n */\nexport const COMMON_DOMAINS: readonly string[] = commonEmailDomainsJson as string[];\n\nconst TYPO_PATTERNS = typoPatternsJson as Record<string, string[]>;\n/** Reverse index for O(1) typo → canonical lookup. */\nconst TYPO_LOOKUP = new Map<string, string>();\nfor (const [canonical, typos] of Object.entries(TYPO_PATTERNS)) {\n for (const typo of typos) TYPO_LOOKUP.set(typo, canonical);\n}\n\n/** DNS resolver contract — caller-supplied so we don't import `node:dns`. */\nexport interface DNSResolver {\n resolveMx(domain: string): Promise<Array<{ exchange: string; priority: number }>>;\n resolveTxt(domain: string): Promise<string[]>;\n}\n\n/** No-op resolver for environments where DNS isn't available. */\nexport class StubDNSResolver implements DNSResolver {\n async resolveMx(): Promise<Array<{ exchange: string; priority: number }>> {\n return [];\n }\n async resolveTxt(): Promise<string[]> {\n return [];\n }\n}\n\n/**\n * DNS-over-HTTPS resolver — works in any runtime with `fetch` (Cloudflare\n * Workers, Vercel Edge, Deno, browsers, Node 18+). Defaults to Cloudflare's\n * 1.1.1.1 endpoint; pass `endpoint` to use Google (8.8.8.8), NextDNS, or\n * a self-hosted resolver.\n *\n * Compatible with [`cf-doh`](https://www.npmjs.com/package/cf-doh) — if you\n * already use that, drop it in directly. This built-in keeps the package\n * zero-dep so the same code works on every edge runtime without an extra\n * install step.\n */\nexport interface DoHResolverOptions {\n /** DoH endpoint URL. Default: https://cloudflare-dns.com/dns-query */\n endpoint?: string;\n /** Per-query request timeout, ms. Default: 5000 */\n timeoutMs?: number;\n /** Custom fetch (e.g. to add headers / proxy). Default: globalThis.fetch */\n fetch?: typeof fetch;\n}\n\ninterface DoHAnswer {\n name: string;\n type: number;\n TTL: number;\n data: string;\n}\n\ninterface DoHResponse {\n Status: number;\n Answer?: DoHAnswer[];\n}\n\nconst DOH_RECORD_TYPE = { MX: 15, TXT: 16 } as const;\n\nexport class DoHResolver implements DNSResolver {\n private readonly endpoint: string;\n private readonly timeoutMs: number;\n private readonly fetchFn: typeof fetch;\n\n constructor(options: DoHResolverOptions = {}) {\n this.endpoint = options.endpoint ?? 'https://cloudflare-dns.com/dns-query';\n this.timeoutMs = options.timeoutMs ?? 5000;\n this.fetchFn = options.fetch ?? globalThis.fetch;\n }\n\n async resolveMx(domain: string): Promise<Array<{ exchange: string; priority: number }>> {\n const records = await this.query(domain, DOH_RECORD_TYPE.MX);\n if (!records) return [];\n return records\n .map((answer) => {\n // MX answer data: \"<priority> <exchange>\" (with optional trailing dot).\n const match = answer.data.match(/^(\\d+)\\s+(.+?)\\.?$/);\n if (!match) return null;\n return { priority: Number(match[1]), exchange: match[2] as string };\n })\n .filter((r): r is { exchange: string; priority: number } => r !== null)\n .sort((a, b) => a.priority - b.priority);\n }\n\n async resolveTxt(domain: string): Promise<string[]> {\n const records = await this.query(domain, DOH_RECORD_TYPE.TXT);\n if (!records) return [];\n // TXT answers come back as quoted strings — strip the surrounding quotes.\n return records.map((answer) => answer.data.replace(/^\"(.*)\"$/, '$1'));\n }\n\n private async query(domain: string, type: number): Promise<DoHAnswer[] | null> {\n const url = `${this.endpoint}?name=${encodeURIComponent(domain)}&type=${type}`;\n const controller = new AbortController();\n const timer = setTimeout(() => controller.abort(), this.timeoutMs);\n try {\n const response = await this.fetchFn(url, {\n headers: { Accept: 'application/dns-json' },\n signal: controller.signal,\n });\n if (!response.ok) return null;\n const json = (await response.json()) as DoHResponse;\n // Status 0 = NOERROR. Anything else (NXDOMAIN, SERVFAIL, etc.) → no answers.\n if (json.Status !== 0) return [];\n return json.Answer ?? [];\n } catch {\n return null;\n } finally {\n clearTimeout(timer);\n }\n }\n}\n\n/**\n * Suggest a corrected domain. Returns the canonical for a known typo,\n * otherwise the closest match within the threshold, otherwise null.\n */\nexport function suggestDomain(domain: string, options?: DomainSuggesterOptions): string | null {\n const lower = domain.toLowerCase();\n\n // Hand-curated typo map first — beats similarity for common cases.\n const known = TYPO_LOOKUP.get(lower);\n if (known) return known;\n\n const domains = options?.customDomains ?? COMMON_DOMAINS;\n if (domains.includes(lower)) return null;\n\n const threshold = options?.threshold ?? 2;\n let minDistance = Infinity;\n let suggestion: string | null = null;\n\n for (const candidate of domains) {\n const candidateLower = candidate.toLowerCase();\n if (lower === candidateLower) return null;\n const similarity = stringSimilarity(lower, candidateLower);\n const distance = Math.round((1 - similarity) * Math.max(domain.length, candidate.length));\n if (distance > 0 && distance <= threshold && distance < minDistance) {\n minDistance = distance;\n suggestion = candidate;\n }\n }\n return suggestion;\n}\n\n/**\n * Validate one email — syntax / typo / disposable / free / MX (if a resolver\n * is supplied). Each step is independently flag-gated so callers pay only for\n * what they use.\n */\nexport async function validateEmailCore(\n email: string,\n options?: ValidateEmailOptions & { dnsResolver?: DNSResolver }\n): Promise<EmailValidationResult> {\n const normalized = email.toLowerCase().trim();\n\n if (!options?.skipCache) {\n const cached = validationCache.get(normalized);\n if (cached) return cached;\n }\n\n const result: EmailValidationResult = { valid: false, email: normalized, validators: {} };\n\n if (options?.validateSyntax !== false) {\n const syntaxValid = VALID_EMAIL_REGEX.test(normalized);\n result.validators.syntax = { valid: syntaxValid };\n if (!syntaxValid) {\n validationCache.set(normalized, result);\n return result;\n }\n }\n\n const [local, domain] = normalized.split('@');\n result.local = local;\n result.domain = domain;\n\n if (options?.validateTypo !== false) {\n const suggestion = suggestDomain(domain, options?.domainSuggesterOptions);\n result.validators.typo = { valid: !suggestion, suggestion: suggestion ?? undefined };\n }\n\n if (options?.validateDisposable !== false) {\n result.validators.disposable = { valid: !disposableProviders.includes(domain) };\n }\n\n if (options?.validateFree !== false) {\n result.validators.free = { valid: !freeProviders.includes(domain) };\n }\n\n if (options?.validateMx && options.dnsResolver) {\n try {\n const records = await options.dnsResolver.resolveMx(domain);\n const hasMx = records.length > 0;\n result.validators.mx = {\n valid: hasMx,\n records: hasMx ? records.map((r) => r.exchange) : undefined,\n };\n } catch (error) {\n result.validators.mx = {\n valid: false,\n error: error instanceof Error ? error.message : 'MX validation failed',\n };\n }\n }\n\n // Free-provider detection is informational; only the hard validators gate validity.\n result.valid = (['syntax', 'typo', 'disposable', 'mx'] as const).every((key) => {\n const validator = result.validators[key];\n return !validator || validator.valid !== false;\n });\n\n if (!options?.skipCache) validationCache.set(normalized, result);\n return result;\n}\n\nexport async function validateEmailBatch(\n emails: string[],\n options?: ValidateEmailOptions & { dnsResolver?: DNSResolver }\n): Promise<EmailValidationResult[]> {\n const chunkSize = options?.batchSize ?? 10;\n const results: EmailValidationResult[] = [];\n for (let i = 0; i < emails.length; i += chunkSize) {\n const chunk = emails.slice(i, i + chunkSize);\n const chunkResults = await Promise.all(chunk.map((email) => validateEmailCore(email, options)));\n results.push(...chunkResults);\n }\n return results;\n}\n\nexport function clearCache(): void {\n validationCache.clear();\n mxCache.clear();\n}\n\nexport type { DomainSuggesterOptions, EmailValidationResult, ValidateEmailOptions } from '../types';\n","import type { EmailValidationResult } from '../../types';\nimport { validateEmailBatch, validateEmailCore } from '../verifier';\nimport type { ValidationDispatch } from './validation';\n\n/**\n * Execute a classified request against the core validator. Single-email\n * requests yield one result; batch requests yield an array.\n */\nexport async function executeValidation(\n dispatch: ValidationDispatch\n): Promise<EmailValidationResult | EmailValidationResult[]> {\n if (dispatch.kind === 'single') {\n return validateEmailCore(dispatch.email, dispatch.options);\n }\n return validateEmailBatch(dispatch.emails, dispatch.options);\n}\n","import type { ValidateEmailOptions } from '../../types';\n\n/** Hard limit on batch size enforced by every adapter. */\nexport const MAX_BATCH_SIZE = 100;\n\n/** Shape of POST bodies and Lambda invocations across all serverless adapters. */\nexport interface ValidationRequestBody {\n email?: string;\n emails?: string[];\n options?: ValidateEmailOptions;\n}\n\nexport type ValidationDispatch =\n | { kind: 'single'; email: string; options?: ValidateEmailOptions }\n | { kind: 'batch'; emails: string[]; options?: ValidateEmailOptions };\n\nexport interface ValidationFailure {\n kind: 'invalid';\n status: 400;\n message: string;\n}\n\n/**\n * Validation for endpoints that accept ONLY a batch (`emails`). Returns\n * a 400 failure if emails is missing/empty/oversized, or null when valid.\n * Routed `/validate/batch` paths use this so error messages stay batch-specific.\n */\nexport type BatchValidation = { ok: true; emails: string[] } | { ok: false; status: 400; message: string };\n\nexport function validateBatchEmailsField(emails: unknown): BatchValidation {\n if (!Array.isArray(emails) || emails.length === 0) {\n return { ok: false, status: 400, message: 'Emails array is required' };\n }\n if (emails.length > MAX_BATCH_SIZE) {\n return { ok: false, status: 400, message: `Maximum ${MAX_BATCH_SIZE} emails allowed per batch` };\n }\n return { ok: true, emails: emails as string[] };\n}\n\n/**\n * Apply the rules every serverless adapter shares:\n * 1. body must request either `email` or `emails`\n * 2. `emails` must be a non-empty array of ≤ MAX_BATCH_SIZE entries\n *\n * Centralising this means a future rule change (say, raising the cap) lands\n * in one place instead of three.\n */\nexport function classifyRequest(\n body: ValidationRequestBody | null | undefined\n): ValidationDispatch | ValidationFailure {\n if (!body || (!body.email && !body.emails)) {\n return { kind: 'invalid', status: 400, message: 'Email or emails array is required' };\n }\n if (body.emails) {\n if (!Array.isArray(body.emails) || body.emails.length === 0) {\n return { kind: 'invalid', status: 400, message: 'Emails array is required' };\n }\n if (body.emails.length > MAX_BATCH_SIZE) {\n return { kind: 'invalid', status: 400, message: `Maximum ${MAX_BATCH_SIZE} emails allowed per batch` };\n }\n return { kind: 'batch', emails: body.emails, options: body.options };\n }\n // body.email must be set per the first guard (which checks both fields).\n if (!body.email) {\n return { kind: 'invalid', status: 400, message: 'Email or emails array is required' };\n }\n return { kind: 'single', email: body.email, options: body.options };\n}\n","/**\n * AWS Lambda adapter — three handler shapes for three deploy modes:\n *\n * - `handler` — routed (recommended) — `/health`, `/validate`,\n * `/validate/batch`. Wire to API Gateway with\n * `{proxy+}` so all three paths land on one Lambda.\n * - `apiGatewayHandler` — single-route — accepts API Gateway proxy events\n * but never inspects `event.path`. Pick this when\n * you want one Lambda per URL.\n * - `lambdaHandler` — direct invocation — no API Gateway envelope.\n * Pick this when calling from another AWS service\n * (Step Functions, EventBridge, …).\n *\n * Shared validation rules + CORS headers come from `../_shared/` so all three\n * agree on what's accepted.\n */\nimport type { ValidateEmailOptions } from '../../types';\nimport { corsHeaders, jsonHeaders } from '../_shared/cors';\nimport { executeValidation } from '../_shared/dispatch';\nimport { classifyRequest, type ValidationRequestBody, validateBatchEmailsField } from '../_shared/validation';\nimport { clearCache, validateEmailCore } from '../verifier';\n\n/**\n * Loose API-Gateway event/result/context shapes — `headers` and similar maps\n * intentionally widen to `string | undefined` so they line up with the\n * official `@types/aws-lambda` definitions used by callers/tests.\n */\nexport interface APIGatewayProxyEvent {\n body: string | null;\n headers: { [key: string]: string | undefined };\n httpMethod: string;\n path: string;\n queryStringParameters: { [key: string]: string | undefined } | null;\n pathParameters: { [key: string]: string | undefined } | null;\n isBase64Encoded?: boolean;\n}\n\nexport interface APIGatewayProxyResult {\n statusCode: number;\n headers?: { [key: string]: string };\n body: string;\n}\n\nexport interface LambdaContext {\n functionName: string;\n functionVersion: string;\n awsRequestId: string;\n remainingTimeInMillis: number;\n}\n\ninterface ValidateResponse {\n success: boolean;\n data?: unknown;\n error?: string;\n}\n\nconst POST_HEADERS = jsonHeaders(corsHeaders('POST, OPTIONS'));\nconst ROUTED_HEADERS = jsonHeaders(corsHeaders());\n\nfunction jsonResponse(statusCode: number, body: unknown, headers: Record<string, string>): APIGatewayProxyResult {\n return { statusCode, headers, body: JSON.stringify(body) };\n}\n\n// Single-route API Gateway handler — accepts proxy events but doesn't inspect `event.path`.\nexport async function apiGatewayHandler(\n event: APIGatewayProxyEvent,\n _context: LambdaContext\n): Promise<APIGatewayProxyResult> {\n if (event.httpMethod === 'OPTIONS') {\n return { statusCode: 200, headers: corsHeaders('POST, OPTIONS'), body: '' };\n }\n\n try {\n const request: ValidationRequestBody = event.body ? JSON.parse(event.body) : {};\n const classified = classifyRequest(request);\n if (classified.kind === 'invalid') {\n return jsonResponse(classified.status, { success: false, error: classified.message }, POST_HEADERS);\n }\n const data = await executeValidation(classified);\n return jsonResponse(200, { success: true, data }, POST_HEADERS);\n } catch (error) {\n console.error('Lambda error:', error);\n const message = error instanceof Error ? error.message : 'Internal server error';\n return jsonResponse(500, { success: false, error: message }, POST_HEADERS);\n }\n}\n\n// Direct Lambda handler (no API Gateway envelope).\nexport async function lambdaHandler(event: ValidationRequestBody, _context: LambdaContext): Promise<ValidateResponse> {\n try {\n const classified = classifyRequest(event);\n if (classified.kind === 'invalid') {\n return { success: false, error: classified.message };\n }\n return { success: true, data: await executeValidation(classified) };\n } catch (error) {\n console.error('Lambda error:', error);\n return { success: false, error: error instanceof Error ? error.message : 'Internal server error' };\n }\n}\n\n// Cache management handler.\nexport async function cacheHandler(\n event: { action: 'clear' | 'stats' },\n _context: LambdaContext\n): Promise<{ success: boolean; message?: string; stats?: unknown }> {\n switch (event.action) {\n case 'clear':\n clearCache();\n return { success: true, message: 'Cache cleared' };\n case 'stats':\n return { success: true, message: 'Cache stats not implemented' };\n default:\n return { success: false, message: 'Invalid action' };\n }\n}\n\n/** Decode the API Gateway body, supporting base64-encoded payloads. */\nfunction decodeBody(event: APIGatewayProxyEvent): unknown {\n if (!event.body) return {};\n const raw = event.isBase64Encoded ? Buffer.from(event.body, 'base64').toString('utf-8') : event.body;\n return JSON.parse(raw);\n}\n\n// Routed handler — supports /health, /validate, /validate/batch. The context\n// argument is intentionally `unknown` so callers can pass either our minimal\n// LambdaContext or the official `aws-lambda#Context` without a cast.\nexport async function handler(event: APIGatewayProxyEvent, _context?: unknown): Promise<APIGatewayProxyResult> {\n if (event.httpMethod === 'OPTIONS') {\n return { statusCode: 204, headers: corsHeaders(), body: '' };\n }\n\n if (event.path === '/health' && event.httpMethod === 'GET') {\n return jsonResponse(200, { status: 'healthy', timestamp: new Date().toISOString() }, ROUTED_HEADERS);\n }\n\n const isValidatePath = event.path === '/validate' || event.path === '/validate/batch';\n if (isValidatePath && event.httpMethod !== 'POST') {\n return jsonResponse(405, { error: 'Method not allowed' }, ROUTED_HEADERS);\n }\n\n if (event.path === '/validate' && event.httpMethod === 'POST') {\n try {\n const body = decodeBody(event) as { email?: string };\n if (!body.email) return jsonResponse(400, { error: 'Email is required' }, ROUTED_HEADERS);\n\n const options = parseValidateOptions(event.queryStringParameters);\n const result = await validateEmailCore(body.email, options);\n return jsonResponse(200, result, ROUTED_HEADERS);\n } catch (error) {\n if (error instanceof SyntaxError) {\n return jsonResponse(400, { error: 'Invalid request body' }, ROUTED_HEADERS);\n }\n console.error('Validation error:', error);\n return jsonResponse(500, { error: 'Internal server error' }, ROUTED_HEADERS);\n }\n }\n\n if (event.path === '/validate/batch' && event.httpMethod === 'POST') {\n try {\n const body = decodeBody(event) as ValidationRequestBody;\n const validated = validateBatchEmailsField(body.emails);\n if (!validated.ok) return jsonResponse(validated.status, { error: validated.message }, ROUTED_HEADERS);\n const results = await executeValidation({ kind: 'batch', emails: validated.emails });\n return jsonResponse(200, { results }, ROUTED_HEADERS);\n } catch (error) {\n console.error('Batch validation error:', error);\n return jsonResponse(500, { error: 'Internal server error' }, ROUTED_HEADERS);\n }\n }\n\n return jsonResponse(404, { error: 'Not found' }, ROUTED_HEADERS);\n}\n\nfunction parseValidateOptions(query: { [key: string]: string | undefined } | null): Partial<ValidateEmailOptions> {\n if (!query) return {};\n const options: Partial<ValidateEmailOptions> = {};\n if (query.skipCache === 'true') options.skipCache = true;\n if (query.validateTypo === 'false') options.validateTypo = false;\n return options;\n}\n\nexport default {\n apiGatewayHandler,\n lambdaHandler,\n cacheHandler,\n handler,\n};\n","/**\n * Azure Functions adapter for email validation.\n *\n * Targets the v4 programming model:\n * `(request: HttpRequest, context: InvocationContext): Promise<HttpResponseInit>`\n *\n * The HttpRequest is a Web-API-aligned shape (`request.json()`, `request.method`,\n * `request.query`, `request.headers`), so the adapter reads the body via the\n * Web API. Routes:\n * - GET /api/health\n * - POST /api/validate\n * - POST /api/validate/batch\n *\n * Two handler shapes are exported:\n * - `azureHandler`: routed (recommended).\n * - `azureFunction`: single-route convenience that infers single vs. batch\n * from the body — for one-function-per-URL setups.\n *\n * The interfaces below are minimal subsets of the official `@azure/functions`\n * types so callers can pass real Azure types without an extra cast.\n */\nimport type { ValidateEmailOptions } from '../../types';\nimport { corsHeaders, jsonHeaders } from '../_shared/cors';\nimport { executeValidation } from '../_shared/dispatch';\nimport { classifyRequest, type ValidationRequestBody, validateBatchEmailsField } from '../_shared/validation';\nimport { validateEmailCore } from '../verifier';\n\nexport interface AzureHttpRequest {\n method: string;\n url: string;\n headers: { get(name: string): string | null } | Record<string, string | undefined>;\n query: { get(name: string): string | null } | Record<string, string | undefined>;\n json(): Promise<unknown>;\n text?: () => Promise<string>;\n}\n\nexport interface AzureInvocationContext {\n invocationId?: string;\n functionName?: string;\n log?: (...args: unknown[]) => void;\n error?: (...args: unknown[]) => void;\n}\n\nexport interface AzureHttpResponseInit {\n status: number;\n headers: Record<string, string>;\n jsonBody?: unknown;\n body?: string;\n}\n\nconst ROUTED_HEADERS = jsonHeaders(corsHeaders());\n\nfunction jsonResponse(\n status: number,\n body: unknown,\n headers: Record<string, string> = ROUTED_HEADERS\n): AzureHttpResponseInit {\n return { status, headers, jsonBody: body };\n}\n\nfunction pathOf(req: AzureHttpRequest): string {\n try {\n return new URL(req.url).pathname || '/';\n } catch {\n // Some test harnesses pass a bare path. Treat it as the pathname.\n const idx = req.url.indexOf('?');\n return idx === -1 ? req.url : req.url.slice(0, idx);\n }\n}\n\nfunction readQuery(query: AzureHttpRequest['query'], key: string): string | undefined {\n if (typeof (query as { get?: unknown }).get === 'function') {\n const v = (query as { get: (k: string) => string | null }).get(key);\n return v ?? undefined;\n }\n const value = (query as Record<string, string | undefined>)[key];\n return value;\n}\n\nfunction parseValidateOptions(query: AzureHttpRequest['query']): Partial<ValidateEmailOptions> {\n const options: Partial<ValidateEmailOptions> = {};\n if (readQuery(query, 'skipCache') === 'true') options.skipCache = true;\n if (readQuery(query, 'validateTypo') === 'false') options.validateTypo = false;\n return options;\n}\n\nasync function readJsonBody(req: AzureHttpRequest): Promise<unknown> {\n try {\n return await req.json();\n } catch {\n throw new SyntaxError('Invalid JSON body');\n }\n}\n\n/** Routed Azure Functions v4 handler. */\nexport async function azureHandler(\n req: AzureHttpRequest,\n _context?: AzureInvocationContext\n): Promise<AzureHttpResponseInit> {\n if (req.method === 'OPTIONS') {\n return { status: 204, headers: corsHeaders() };\n }\n\n const path = pathOf(req);\n\n if (path === '/api/health' && req.method === 'GET') {\n return jsonResponse(200, { status: 'healthy', platform: 'azure', timestamp: new Date().toISOString() });\n }\n\n const isValidatePath = path === '/api/validate' || path === '/api/validate/batch';\n if (isValidatePath && req.method !== 'POST') {\n return jsonResponse(405, { error: 'Method not allowed' });\n }\n\n if (path === '/api/validate' && req.method === 'POST') {\n try {\n const body = (await readJsonBody(req)) as { email?: string };\n if (!body.email) return jsonResponse(400, { error: 'Email is required' });\n const options = parseValidateOptions(req.query);\n const result = await validateEmailCore(body.email, options);\n return jsonResponse(200, result);\n } catch (error) {\n if (error instanceof SyntaxError) return jsonResponse(400, { error: 'Invalid request body' });\n console.error('Azure validation error:', error);\n return jsonResponse(500, { error: 'Internal server error' });\n }\n }\n\n if (path === '/api/validate/batch' && req.method === 'POST') {\n try {\n const body = (await readJsonBody(req)) as ValidationRequestBody;\n const validated = validateBatchEmailsField(body.emails);\n if (!validated.ok) return jsonResponse(validated.status, { error: validated.message });\n const results = await executeValidation({ kind: 'batch', emails: validated.emails });\n return jsonResponse(200, { results });\n } catch (error) {\n if (error instanceof SyntaxError) return jsonResponse(400, { error: 'Invalid request body' });\n console.error('Azure batch validation error:', error);\n return jsonResponse(500, { error: 'Internal server error' });\n }\n }\n\n return jsonResponse(404, { error: 'Not found' });\n}\n\n/** Single-route convenience — infers single vs. batch from the body. */\nexport async function azureFunction(\n req: AzureHttpRequest,\n _context?: AzureInvocationContext\n): Promise<AzureHttpResponseInit> {\n if (req.method === 'OPTIONS') {\n return { status: 204, headers: corsHeaders('POST, OPTIONS') };\n }\n if (req.method !== 'POST') return jsonResponse(405, { success: false, error: 'Method not allowed' });\n\n try {\n const body = (await readJsonBody(req)) as ValidationRequestBody;\n const classified = classifyRequest(body);\n if (classified.kind === 'invalid') {\n return jsonResponse(classified.status, { success: false, error: classified.message });\n }\n const data = await executeValidation(classified);\n return jsonResponse(200, { success: true, data });\n } catch (error) {\n if (error instanceof SyntaxError) return jsonResponse(400, { success: false, error: 'Invalid request body' });\n console.error('Azure function error:', error);\n const message = error instanceof Error ? error.message : 'Internal server error';\n return jsonResponse(500, { success: false, error: message });\n }\n}\n\nexport default {\n azureHandler,\n azureFunction,\n};\n","/**\n * Cloudflare Workers adapter for email validation.\n * Supports Workers, Pages Functions, and Durable Objects.\n *\n * Shared validation/CORS logic comes from `../_shared/`.\n */\nimport type { EmailValidationResult } from '../../types';\nimport { corsHeaders, jsonHeaders } from '../_shared/cors';\nimport { executeValidation } from '../_shared/dispatch';\nimport { classifyRequest, type ValidationRequestBody } from '../_shared/validation';\nimport { EdgeCache, validateEmailBatch, validateEmailCore } from '../verifier';\n\ninterface KVNamespace {\n get<T = unknown>(key: string, type?: 'text' | 'json' | 'arrayBuffer' | 'stream'): Promise<T | null>;\n put(key: string, value: string | ArrayBuffer | ReadableStream, options?: { expirationTtl?: number }): Promise<void>;\n delete(key: string): Promise<void>;\n}\n\ninterface DurableObjectNamespace {\n idFromName(name: string): DurableObjectId;\n get(id: DurableObjectId): DurableObjectStub;\n}\n\ninterface DurableObjectId {\n toString(): string;\n}\n\ninterface DurableObjectStub {\n fetch(request: Request): Promise<Response>;\n}\n\ninterface DurableObjectState {\n storage: DurableObjectStorage;\n}\n\ninterface DurableObjectStorage {\n get<T = unknown>(key: string): Promise<T | undefined>;\n put<T = unknown>(key: string, value: T): Promise<void>;\n delete(key: string): Promise<void>;\n}\n\nexport interface CloudflareRequest extends Request {\n cf?: {\n country?: string;\n colo?: string;\n timezone?: string;\n };\n}\n\nexport interface CloudflareEnv {\n EMAIL_CACHE?: KVNamespace;\n EMAIL_VALIDATOR?: DurableObjectNamespace;\n [key: string]: unknown;\n}\n\nexport interface CloudflareContext {\n waitUntil(promise: Promise<unknown>): void;\n passThroughOnException(): void;\n}\n\nclass KVCache<T> {\n constructor(\n private kv: KVNamespace,\n private ttl: number = 3600\n ) {}\n\n async get(key: string): Promise<T | undefined> {\n const value = await this.kv.get(key, 'json');\n return value as T | undefined;\n }\n\n async set(key: string, value: T): Promise<void> {\n await this.kv.put(key, JSON.stringify(value), { expirationTtl: this.ttl });\n }\n\n async delete(key: string): Promise<void> {\n await this.kv.delete(key);\n }\n}\n\nconst POST_HEADERS = jsonHeaders(corsHeaders('POST, GET, OPTIONS'));\n\nfunction jsonResponse(status: number, body: unknown, headers: Record<string, string> = POST_HEADERS): Response {\n return new Response(JSON.stringify(body), { status, headers });\n}\n\nfunction parseGetParams(url: URL): ValidationRequestBody {\n const email = url.searchParams.get('email');\n const emails = url.searchParams.get('emails');\n return {\n email: email || undefined,\n emails: emails ? emails.split(',') : undefined,\n options: {\n validateMx: url.searchParams.get('validateMx') === 'true',\n validateSMTP: url.searchParams.get('validateSMTP') === 'true',\n validateTypo: url.searchParams.get('validateTypo') !== 'false',\n validateDisposable: url.searchParams.get('validateDisposable') !== 'false',\n validateFree: url.searchParams.get('validateFree') !== 'false',\n },\n };\n}\n\nasync function workerHandler(\n request: CloudflareRequest,\n env: CloudflareEnv,\n ctx: CloudflareContext\n): Promise<Response> {\n const kvCache = env.EMAIL_CACHE ? new KVCache<EmailValidationResult>(env.EMAIL_CACHE) : undefined;\n\n if (request.method === 'OPTIONS') {\n return new Response(null, { status: 200, headers: corsHeaders('POST, GET, OPTIONS') });\n }\n\n try {\n let body: ValidationRequestBody;\n if (request.method === 'GET') {\n body = parseGetParams(new URL(request.url));\n } else if (request.method === 'POST') {\n body = await request.json();\n } else {\n return jsonResponse(405, { success: false, error: 'Method not allowed' });\n }\n\n const classified = classifyRequest(body);\n if (classified.kind === 'invalid') {\n return jsonResponse(classified.status, { success: false, error: classified.message });\n }\n\n // Per-email KV cache short-circuit (single-email path only).\n if (classified.kind === 'single' && kvCache && !classified.options?.skipCache) {\n const cached = await kvCache.get(`email:${classified.email}`);\n if (cached) {\n return new Response(JSON.stringify({ success: true, data: cached, cached: true }), {\n status: 200,\n headers: jsonHeaders({\n ...corsHeaders('POST, GET, OPTIONS'),\n 'Cache-Control': 'public, max-age=3600',\n 'CF-Cache-Status': 'HIT',\n }),\n });\n }\n }\n\n const data = await executeValidation(classified);\n\n // Write-through to KV when the request didn't ask to skip the cache.\n if (kvCache && !classified.options?.skipCache) {\n if (classified.kind === 'single') {\n ctx.waitUntil(kvCache.set(`email:${classified.email}`, data as EmailValidationResult));\n } else {\n const writes = (data as EmailValidationResult[]).map((result, i) =>\n kvCache.set(`email:${classified.emails[i]}`, result)\n );\n ctx.waitUntil(Promise.all(writes));\n }\n }\n\n const headers = jsonHeaders({\n ...corsHeaders('POST, GET, OPTIONS'),\n 'Cache-Control': 'public, max-age=3600',\n ...(classified.kind === 'single' ? { 'CF-Cache-Status': 'MISS' } : {}),\n });\n return new Response(JSON.stringify({ success: true, data }), { status: 200, headers });\n } catch (error) {\n console.error('Cloudflare Workers error:', error);\n const message = error instanceof Error ? error.message : 'Internal server error';\n return jsonResponse(500, { success: false, error: message });\n }\n}\n\n// Durable Object for stateful validation. The `state` and `env` arguments are\n// part of the Durable Object constructor contract but unused here — the cache\n// lives entirely in process memory; persisting to `state.storage` is a future\n// enhancement, not the current behavior.\nexport class EmailValidatorDO {\n private readonly cache: EdgeCache<EmailValidationResult>;\n\n constructor(_state: DurableObjectState, _env: CloudflareEnv) {\n this.cache = new EdgeCache(1000, 3600000);\n }\n\n async fetch(request: Request): Promise<Response> {\n const url = new URL(request.url);\n switch (url.pathname) {\n case '/validate':\n return this.handleValidation(request);\n case '/cache/clear':\n return this.handleCacheClear();\n case '/cache/stats':\n return this.handleCacheStats();\n default:\n return new Response('Not found', { status: 404 });\n }\n }\n\n private async handleValidation(request: Request): Promise<Response> {\n try {\n const requestData: ValidationRequestBody = await request.json();\n const classified = classifyRequest(requestData);\n if (classified.kind === 'invalid') {\n return new Response(JSON.stringify({ success: false, error: classified.message }), {\n status: classified.status,\n headers: { 'Content-Type': 'application/json' },\n });\n }\n const data =\n classified.kind === 'single'\n ? await validateEmailCore(classified.email, classified.options)\n : await validateEmailBatch(classified.emails, classified.options);\n return new Response(JSON.stringify({ success: true, data }), {\n headers: { 'Content-Type': 'application/json' },\n });\n } catch (error) {\n const message = error instanceof Error ? error.message : 'Internal server error';\n return new Response(JSON.stringify({ success: false, error: message }), {\n status: 500,\n headers: { 'Content-Type': 'application/json' },\n });\n }\n }\n\n private async handleCacheClear(): Promise<Response> {\n this.cache.clear();\n return new Response(JSON.stringify({ success: true, message: 'Cache cleared' }), {\n headers: { 'Content-Type': 'application/json' },\n });\n }\n\n private async handleCacheStats(): Promise<Response> {\n return new Response(JSON.stringify({ success: true, stats: { size: this.cache.size() } }), {\n headers: { 'Content-Type': 'application/json' },\n });\n }\n}\n\nexport default {\n fetch: workerHandler,\n workerHandler,\n EmailValidatorDO,\n};\n\nexport { workerHandler };\n","/**\n * Google Cloud Functions (2nd gen) adapter for email validation.\n *\n * 2nd-gen Cloud Functions run on Cloud Run and use the Functions Framework's\n * Express-style `(req, res)` signature. The routed handler exposes:\n * - GET /health\n * - POST /validate\n * - POST /validate/batch\n *\n * Two handler shapes are exported:\n * - `gcpHandler`: routed (recommended).\n * - `gcpFunction`: single-route convenience that infers single vs. batch\n * from the body, useful when you've already configured your function\n * URL with one path.\n *\n * The interfaces below intentionally mirror the relevant subset of\n * `express-serve-static-core`'s Request / Response so callers can pass the\n * Functions Framework's req/res without an extra cast.\n */\nimport type { ValidateEmailOptions } from '../../types';\nimport { corsHeaders, jsonHeaders } from '../_shared/cors';\nimport { executeValidation } from '../_shared/dispatch';\nimport { classifyRequest, type ValidationRequestBody, validateBatchEmailsField } from '../_shared/validation';\nimport { validateEmailCore } from '../verifier';\n\n/**\n * Express-shaped request. We only consume the fields the Functions Framework\n * guarantees: method, path (the URL path inside the function), query, body,\n * and the lowercase headers map.\n */\nexport interface GcpRequest {\n method: string;\n path?: string;\n url?: string;\n query?: Record<string, string | string[] | undefined>;\n body?: unknown;\n headers?: Record<string, string | string[] | undefined>;\n}\n\nexport interface GcpResponse {\n status(code: number): GcpResponse;\n set(headers: Record<string, string>): GcpResponse;\n json(body: unknown): GcpResponse;\n send(body?: unknown): GcpResponse;\n}\n\nconst ROUTED_HEADERS = jsonHeaders(corsHeaders());\n\nfunction pathOf(req: GcpRequest): string {\n if (req.path) return req.path;\n if (req.url) {\n const idx = req.url.indexOf('?');\n return idx === -1 ? req.url : req.url.slice(0, idx);\n }\n return '/';\n}\n\nfunction readJsonBody(req: GcpRequest): ValidationRequestBody {\n // Functions Framework parses application/json automatically. Tests may pass\n // a string body to mimic edge cases; tolerate both forms.\n if (typeof req.body === 'string') {\n try {\n return JSON.parse(req.body) as ValidationRequestBody;\n } catch {\n return {};\n }\n }\n return (req.body as ValidationRequestBody | undefined) ?? {};\n}\n\nfunction parseValidateOptions(query: GcpRequest['query']): Partial<ValidateEmailOptions> {\n if (!query) return {};\n const options: Partial<ValidateEmailOptions> = {};\n const skip = query.skipCache;\n const typo = query.validateTypo;\n if (skip === 'true') options.skipCache = true;\n if (typo === 'false') options.validateTypo = false;\n return options;\n}\n\n/**\n * Routed Cloud Functions handler. Wire it as the function entry point:\n *\n * import { gcpHandler } from '@emailcheck/email-validator-js/serverless/gcp';\n * export const validateEmail = gcpHandler;\n */\nexport async function gcpHandler(req: GcpRequest, res: GcpResponse): Promise<void> {\n if (req.method === 'OPTIONS') {\n res.status(204).set(corsHeaders()).send();\n return;\n }\n\n const path = pathOf(req);\n\n if (path === '/health' && req.method === 'GET') {\n res\n .status(200)\n .set(ROUTED_HEADERS)\n .json({ status: 'healthy', platform: 'gcp', timestamp: new Date().toISOString() });\n return;\n }\n\n const isValidatePath = path === '/validate' || path === '/validate/batch';\n if (isValidatePath && req.method !== 'POST') {\n res.status(405).set(ROUTED_HEADERS).json({ error: 'Method not allowed' });\n return;\n }\n\n if (path === '/validate' && req.method === 'POST') {\n try {\n const body = readJsonBody(req);\n if (!body.email) {\n res.status(400).set(ROUTED_HEADERS).json({ error: 'Email is required' });\n return;\n }\n const options = parseValidateOptions(req.query);\n const result = await validateEmailCore(body.email, options);\n res.status(200).set(ROUTED_HEADERS).json(result);\n return;\n } catch (error) {\n console.error('GCP validation error:', error);\n res.status(500).set(ROUTED_HEADERS).json({ error: 'Internal server error' });\n return;\n }\n }\n\n if (path === '/validate/batch' && req.method === 'POST') {\n try {\n const body = readJsonBody(req);\n const validated = validateBatchEmailsField(body.emails);\n if (!validated.ok) {\n res.status(validated.status).set(ROUTED_HEADERS).json({ error: validated.message });\n return;\n }\n const results = await executeValidation({ kind: 'batch', emails: validated.emails });\n res.status(200).set(ROUTED_HEADERS).json({ results });\n return;\n } catch (error) {\n console.error('GCP batch validation error:', error);\n res.status(500).set(ROUTED_HEADERS).json({ error: 'Internal server error' });\n return;\n }\n }\n\n res.status(404).set(ROUTED_HEADERS).json({ error: 'Not found' });\n}\n\n/**\n * Single-route convenience handler — infers single-vs-batch from the body\n * and ignores the request path. Use this when the function's URL itself\n * is the entry point and you don't need internal routing.\n */\nexport async function gcpFunction(req: GcpRequest, res: GcpResponse): Promise<void> {\n if (req.method === 'OPTIONS') {\n res.status(204).set(corsHeaders('POST, OPTIONS')).send();\n return;\n }\n if (req.method !== 'POST') {\n res.status(405).set(ROUTED_HEADERS).json({ error: 'Method not allowed' });\n return;\n }\n try {\n const body = readJsonBody(req);\n const classified = classifyRequest(body);\n if (classified.kind === 'invalid') {\n res.status(classified.status).set(ROUTED_HEADERS).json({ success: false, error: classified.message });\n return;\n }\n const data = await executeValidation(classified);\n res.status(200).set(ROUTED_HEADERS).json({ success: true, data });\n } catch (error) {\n console.error('GCP function error:', error);\n const message = error instanceof Error ? error.message : 'Internal server error';\n res.status(500).set(ROUTED_HEADERS).json({ success: false, error: message });\n }\n}\n\nexport default {\n gcpHandler,\n gcpFunction,\n};\n","/**\n * Netlify Functions adapter for email validation.\n *\n * Netlify Functions run on AWS Lambda under the hood, so the event/result\n * shape is structurally identical to API Gateway proxy events. The adapter\n * surfaces the same routed paths and CORS handling as the AWS adapter:\n *\n * GET /.netlify/functions/<name>/health\n * POST /.netlify/functions/<name>/validate\n * POST /.netlify/functions/<name>/validate/batch\n *\n * Netlify also supports redirects via `_redirects` / `netlify.toml` so users\n * commonly map `/api/*` → `/.netlify/functions/<name>/:splat` to keep URLs\n * clean. The handler accepts both forms.\n *\n * Two handler shapes are exported:\n * - `netlifyHandler`: routed; recommended.\n * - `netlifyFunction`: single-route convenience that infers single vs. batch\n * from the body, useful when one function = one URL.\n */\nimport type { ValidateEmailOptions } from '../../types';\nimport { corsHeaders, jsonHeaders } from '../_shared/cors';\nimport { executeValidation } from '../_shared/dispatch';\nimport { classifyRequest, type ValidationRequestBody, validateBatchEmailsField } from '../_shared/validation';\nimport { validateEmailCore } from '../verifier';\n\n/** Netlify event — structurally compatible with API Gateway proxy events. */\nexport interface NetlifyEvent {\n body: string | null;\n headers: { [key: string]: string | undefined };\n httpMethod: string;\n path: string;\n queryStringParameters: { [key: string]: string | undefined } | null;\n isBase64Encoded?: boolean;\n rawUrl?: string;\n}\n\nexport interface NetlifyResult {\n statusCode: number;\n headers?: { [key: string]: string };\n body: string;\n}\n\n/** Function context — Netlify mirrors a subset of the Lambda context. */\nexport interface NetlifyContext {\n functionName?: string;\n awsRequestId?: string;\n identity?: unknown;\n clientContext?: unknown;\n}\n\nconst ROUTED_HEADERS = jsonHeaders(corsHeaders());\n\nfunction jsonResponse(\n statusCode: number,\n body: unknown,\n headers: Record<string, string> = ROUTED_HEADERS\n): NetlifyResult {\n return { statusCode, headers, body: JSON.stringify(body) };\n}\n\nfunction decodeBody(event: NetlifyEvent): unknown {\n if (!event.body) return {};\n const raw = event.isBase64Encoded ? Buffer.from(event.body, 'base64').toString('utf8') : event.body;\n try {\n return JSON.parse(raw);\n } catch {\n throw new SyntaxError('Invalid JSON body');\n }\n}\n\n/**\n * Strip Netlify's function-prefix from the incoming path so route matching\n * works regardless of whether the user hits the raw function URL or a\n * `/api/*` redirect.\n */\nfunction normalizePath(rawPath: string): string {\n // Common forms:\n // /.netlify/functions/<name>/health\n // /api/health (with redirect)\n // /health (custom config)\n const stripped = rawPath.replace(/^\\/.netlify\\/functions\\/[^/]+/, '').replace(/^\\/api/, '');\n return stripped || '/';\n}\n\nfunction parseValidateOptions(query: NetlifyEvent['queryStringParameters']): Partial<ValidateEmailOptions> {\n if (!query) return {};\n const options: Partial<ValidateEmailOptions> = {};\n if (query.skipCache === 'true') options.skipCache = true;\n if (query.validateTypo === 'false') options.validateTypo = false;\n return options;\n}\n\n/** Routed Netlify handler. */\nexport async function netlifyHandler(event: NetlifyEvent, _context?: NetlifyContext): Promise<NetlifyResult> {\n if (event.httpMethod === 'OPTIONS') {\n return { statusCode: 204, headers: corsHeaders(), body: '' };\n }\n\n const path = normalizePath(event.path);\n\n if (path === '/health' && event.httpMethod === 'GET') {\n return jsonResponse(200, { status: 'healthy', platform: 'netlify', timestamp: new Date().toISOString() });\n }\n\n const isValidatePath = path === '/validate' || path === '/validate/batch';\n if (isValidatePath && event.httpMethod !== 'POST') {\n return jsonResponse(405, { error: 'Method not allowed' });\n }\n\n if (path === '/validate' && event.httpMethod === 'POST') {\n try {\n const body = decodeBody(event) as { email?: string };\n if (!body.email) return jsonResponse(400, { error: 'Email is required' });\n\n const options = parseValidateOptions(event.queryStringParameters);\n const result = await validateEmailCore(body.email, options);\n return jsonResponse(200, result);\n } catch (error) {\n if (error instanceof SyntaxError) return jsonResponse(400, { error: 'Invalid request body' });\n console.error('Netlify validation error:', error);\n return jsonResponse(500, { error: 'Internal server error' });\n }\n }\n\n if (path === '/validate/batch' && event.httpMethod === 'POST') {\n try {\n const body = decodeBody(event) as ValidationRequestBody;\n const validated = validateBatchEmailsField(body.emails);\n if (!validated.ok) return jsonResponse(validated.status, { error: validated.message });\n const results = await executeValidation({ kind: 'batch', emails: validated.emails });\n return jsonResponse(200, { results });\n } catch (error) {\n if (error instanceof SyntaxError) return jsonResponse(400, { error: 'Invalid request body' });\n console.error('Netlify batch validation error:', error);\n return jsonResponse(500, { error: 'Internal server error' });\n }\n }\n\n return jsonResponse(404, { error: 'Not found' });\n}\n\n/**\n * Single-route convenience — infers single vs. batch from the body. Useful\n * when each function is mapped to a distinct URL and you don't need internal\n * routing.\n */\nexport async function netlifyFunction(event: NetlifyEvent, _context?: NetlifyContext): Promise<NetlifyResult> {\n if (event.httpMethod === 'OPTIONS') {\n return { statusCode: 204, headers: corsHeaders('POST, OPTIONS'), body: '' };\n }\n if (event.httpMethod !== 'POST') return jsonResponse(405, { success: false, error: 'Method not allowed' });\n\n try {\n const body = decodeBody(event) as ValidationRequestBody;\n const classified = classifyRequest(body);\n if (classified.kind === 'invalid') {\n return jsonResponse(classified.status, { success: false, error: classified.message });\n }\n const data = await executeValidation(classified);\n return jsonResponse(200, { success: true, data });\n } catch (error) {\n if (error instanceof SyntaxError) return jsonResponse(400, { success: false, error: 'Invalid request body' });\n console.error('Netlify function error:', error);\n const message = error instanceof Error ? error.message : 'Internal server error';\n return jsonResponse(500, { success: false, error: message });\n }\n}\n\nexport default {\n netlifyHandler,\n netlifyFunction,\n};\n","/**\n * Vercel adapter — three handler shapes for three runtime / routing combos:\n *\n * - `handler` — routed Web handler — `/api/health`, `/api/validate`,\n * `/api/validate/batch`. Wire as `app/api/[...path]/route.ts`.\n * - `edgeHandler` — single-route Edge handler. Pick this when each URL\n * maps to its own Edge Function (no internal routing).\n * - `nodeHandler` — Express-style `(req, res)` for the Node.js runtime.\n * Pick this when you're on the Node runtime and your\n * framework hands you `VercelRequest` / `VercelResponse`.\n *\n * Shared validation/CORS logic comes from `../_shared/`.\n */\nimport type { ValidateEmailOptions } from '../../types';\nimport { corsHeaders, jsonHeaders } from '../_shared/cors';\nimport { executeValidation } from '../_shared/dispatch';\nimport { classifyRequest, type ValidationRequestBody, validateBatchEmailsField } from '../_shared/validation';\nimport { validateEmailBatch, validateEmailCore } from '../verifier';\n\nexport interface VercelRequest {\n method: string;\n url: string;\n headers: Headers;\n body?: unknown;\n query?: { [key: string]: string | string[] };\n}\n\nexport interface VercelResponse {\n status: (code: number) => VercelResponse;\n json: (data: unknown) => void;\n send: (data: unknown) => void;\n}\n\nconst POST_HEADERS = jsonHeaders(corsHeaders('POST, GET, OPTIONS'));\nconst ROUTED_HEADERS = jsonHeaders({\n 'Access-Control-Allow-Origin': '*',\n 'Cache-Control': 'no-store, max-age=0',\n 'X-Powered-By': 'Vercel Edge Functions',\n});\n\nfunction jsonResponse(status: number, body: unknown, headers: Record<string, string> = POST_HEADERS): Response {\n return new Response(JSON.stringify(body), { status, headers });\n}\n\nfunction parseGetParams(url: URL): ValidationRequestBody {\n const email = url.searchParams.get('email');\n const emails = url.searchParams.get('emails');\n return {\n email: email || undefined,\n emails: emails ? emails.split(',') : undefined,\n options: {\n validateMx: url.searchParams.get('validateMx') === 'true',\n validateSMTP: url.searchParams.get('validateSMTP') === 'true',\n validateTypo: url.searchParams.get('validateTypo') !== 'false',\n validateDisposable: url.searchParams.get('validateDisposable') !== 'false',\n validateFree: url.searchParams.get('validateFree') !== 'false',\n },\n };\n}\n\n// Edge Runtime handler — no path routing, `email`/`emails` from body or query.\nexport async function edgeHandler(request: Request): Promise<Response> {\n if (request.method === 'OPTIONS') {\n return new Response(null, { status: 200, headers: corsHeaders('POST, GET, OPTIONS') });\n }\n\n try {\n let body: ValidationRequestBody;\n if (request.method === 'GET') {\n body = parseGetParams(new URL(request.url));\n } else if (request.method === 'POST') {\n body = await request.json();\n } else {\n return jsonResponse(405, { success: false, error: 'Method not allowed' });\n }\n\n const classified = classifyRequest(body);\n if (classified.kind === 'invalid') {\n return jsonResponse(classified.status, { success: false, error: classified.message });\n }\n\n const data = await executeValidation(classified);\n return jsonResponse(\n 200,\n { success: true, data },\n jsonHeaders({ ...corsHeaders('POST, GET, OPTIONS'), 'Cache-Control': 'public, max-age=3600' })\n );\n } catch (error) {\n console.error('Vercel Edge error:', error);\n const message = error instanceof Error ? error.message : 'Internal server error';\n return jsonResponse(500, { success: false, error: message });\n }\n}\n\n// Node.js runtime handler (Express-style).\nexport async function nodeHandler(req: VercelRequest, res: VercelResponse): Promise<void> {\n if (req.method === 'OPTIONS') {\n res.status(200).send('');\n return;\n }\n\n try {\n let body: ValidationRequestBody;\n if (req.method === 'GET') {\n const fakeUrl = new URL(req.url, 'http://localhost');\n body = parseGetParams(fakeUrl);\n // Fall back to the parsed query map if the URL was relative without params.\n if (!body.email && !body.emails && req.query) {\n body.email = req.query.email as string | undefined;\n body.emails = req.query.emails ? (req.query.emails as string).split(',') : undefined;\n }\n } else if (req.method === 'POST') {\n body = req.body as ValidationRequestBody;\n } else {\n res.status(405).json({ success: false, error: 'Method not allowed' });\n return;\n }\n\n const classified = classifyRequest(body);\n if (classified.kind === 'invalid') {\n res.status(classified.status).json({ success: false, error: classified.message });\n return;\n }\n const data = await executeValidation(classified);\n res.status(200).json({ success: true, data });\n } catch (error) {\n console.error('Vercel Node error:', error);\n res.status(500).json({ success: false, error: error instanceof Error ? error.message : 'Internal server error' });\n }\n}\n\nexport const config = {\n runtime: 'edge',\n regions: ['iad1'],\n};\n\nfunction requireJsonContentType(request: Request): Response | null {\n const contentType = request.headers.get('content-type');\n if (!contentType?.includes('application/json')) {\n return jsonResponse(400, { error: 'Content-Type must be application/json' }, ROUTED_HEADERS);\n }\n return null;\n}\n\nasync function readJsonBody(request: Request): Promise<{ body: unknown } | { error: Response }> {\n try {\n return { body: await request.json() };\n } catch {\n return { error: jsonResponse(400, { error: 'Invalid request body' }, ROUTED_HEADERS) };\n }\n}\n\n// Routed handler used by the test suite — `/api/health`, `/api/validate`,\n// `/api/validate/batch`.\nexport async function handler(request: Request): Promise<Response> {\n const url = new URL(request.url);\n const { pathname } = url;\n\n if (request.method === 'OPTIONS') {\n return new Response(null, { status: 204, headers: corsHeaders() });\n }\n\n try {\n if (pathname === '/api/health' && request.method === 'GET') {\n return jsonResponse(\n 200,\n { status: 'healthy', platform: 'vercel', timestamp: new Date().toISOString() },\n ROUTED_HEADERS\n );\n }\n\n const isValidatePath = pathname === '/api/validate' || pathname === '/api/validate/batch';\n if (isValidatePath && request.method !== 'POST') {\n return jsonResponse(405, { error: 'Method not allowed' }, ROUTED_HEADERS);\n }\n\n if (pathname === '/api/validate' && request.method === 'POST') {\n const ct = requireJsonContentType(request);\n if (ct) return ct;\n const parsed = await readJsonBody(request);\n if ('error' in parsed) return parsed.error;\n const body = parsed.body as { email?: string };\n if (!body.email) return jsonResponse(400, { error: 'Email is required' }, ROUTED_HEADERS);\n\n const options: Partial<ValidateEmailOptions> = {};\n if (url.searchParams.has('skipCache')) options.skipCache = url.searchParams.get('skipCache') === 'true';\n if (url.searchParams.has('validateTypo')) options.validateTypo = url.searchParams.get('validateTypo') === 'true';\n\n const result = await validateEmailCore(body.email, options);\n return jsonResponse(200, result, ROUTED_HEADERS);\n }\n\n if (pathname === '/api/validate/batch' && request.method === 'POST') {\n const ct = requireJsonContentType(request);\n if (ct) return ct;\n const parsed = await readJsonBody(request);\n if ('error' in parsed) return parsed.error;\n const body = parsed.body as ValidationRequestBody;\n const validated = validateBatchEmailsField(body.emails);\n if (!validated.ok) return jsonResponse(validated.status, { error: validated.message }, ROUTED_HEADERS);\n\n const options: { batchSize?: number } = {};\n const batchSizeParam = url.searchParams.get('batchSize');\n if (batchSizeParam) options.batchSize = parseInt(batchSizeParam, 10);\n\n const results = await validateEmailBatch(validated.emails, options);\n return jsonResponse(200, { results }, ROUTED_HEADERS);\n }\n\n return jsonResponse(404, { error: 'Not found' }, ROUTED_HEADERS);\n } catch (error) {\n console.error('Handler error:', error);\n return jsonResponse(500, { error: 'Internal server error' }, ROUTED_HEADERS);\n }\n}\n\nexport default {\n edgeHandler,\n nodeHandler,\n handler,\n};\n"],"names":["__spreadValues","__async","stringSimilarity","POST_HEADERS","ROUTED_HEADERS","jsonResponse","decodeBody","handler","parseValidateOptions","pathOf","readJsonBody","parseGetParams","__spreadProps"],"mappings":"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","x_google_ignoreList":[1]}
@@ -32,9 +32,9 @@ var hasRequiredStringSimilarity;
32
32
  function requireStringSimilarity () {
33
33
  if (hasRequiredStringSimilarity) return stringSimilarity;
34
34
  hasRequiredStringSimilarity = 1;
35
- (function (exports$1) {
36
- Object.defineProperty(exports$1, "__esModule", { value: true });
37
- exports$1.stringSimilarity = void 0;
35
+ (function (exports) {
36
+ Object.defineProperty(exports, "__esModule", { value: true });
37
+ exports.stringSimilarity = void 0;
38
38
  /* global exports, Map */
39
39
  /**
40
40
  * Calculate similarity between two strings
@@ -69,8 +69,8 @@ function requireStringSimilarity () {
69
69
  }
70
70
  return (match * 2) / (str1.length + str2.length - ((substringLength - 1) * 2));
71
71
  };
72
- exports$1.stringSimilarity = stringSimilarity;
73
- exports$1.default = exports$1.stringSimilarity;
72
+ exports.stringSimilarity = stringSimilarity;
73
+ exports.default = exports.stringSimilarity;
74
74
 
75
75
  } (stringSimilarity));
76
76
  return stringSimilarity;