@emailcheck/email-validator-js 3.0.1-beta.0 → 3.0.1-beta.2

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 (40) hide show
  1. package/README.md +176 -24
  2. package/dist/adapters/lru-adapter.d.ts +2 -2
  3. package/dist/adapters/redis-adapter.d.ts +4 -4
  4. package/dist/batch-verifier.d.ts +5 -0
  5. package/dist/cache-interface.d.ts +23 -16
  6. package/dist/cache.d.ts +5 -5
  7. package/dist/check-if-email-exists.d.ts +205 -0
  8. package/dist/domain-suggester.d.ts +6 -6
  9. package/dist/{validator.d.ts → email-validator.d.ts} +2 -2
  10. package/dist/email-verifier-types.d.ts +225 -0
  11. package/dist/index.d.ts +8 -8
  12. package/dist/index.esm.js +471 -236
  13. package/dist/index.esm.js.map +1 -1
  14. package/dist/index.js +474 -238
  15. package/dist/index.js.map +1 -1
  16. package/dist/mx-resolver.d.ts +2 -0
  17. package/dist/name-detector.d.ts +6 -6
  18. package/dist/serverless/adapters/aws-lambda.cjs.js.map +1 -1
  19. package/dist/serverless/adapters/aws-lambda.esm.js.map +1 -1
  20. package/dist/serverless/adapters/cloudflare.cjs.js.map +1 -1
  21. package/dist/serverless/adapters/cloudflare.esm.js.map +1 -1
  22. package/dist/serverless/adapters/vercel.cjs.js.map +1 -1
  23. package/dist/serverless/adapters/vercel.esm.js.map +1 -1
  24. package/dist/serverless/index.cjs.js.map +1 -1
  25. package/dist/serverless/index.d.ts +1 -1
  26. package/dist/serverless/index.esm.js.map +1 -1
  27. package/dist/serverless/{core.cjs.js → verifier.cjs.js} +1 -1
  28. package/dist/serverless/verifier.cjs.js.map +1 -0
  29. package/dist/serverless/{core.esm.js → verifier.esm.js} +1 -1
  30. package/dist/serverless/verifier.esm.js.map +1 -0
  31. package/dist/{smtp.d.ts → smtp-verifier.d.ts} +2 -2
  32. package/dist/types.d.ts +138 -34
  33. package/dist/whois.d.ts +3 -3
  34. package/package.json +19 -19
  35. package/dist/batch.d.ts +0 -5
  36. package/dist/dns.d.ts +0 -2
  37. package/dist/serverless/core.cjs.js.map +0 -1
  38. package/dist/serverless/core.esm.js.map +0 -1
  39. /package/dist/serverless/{core.d.ts → verifier.d.ts} +0 -0
  40. /package/dist/serverless/{core.min.js → verifier.min.js} +0 -0
package/dist/types.d.ts CHANGED
@@ -1,18 +1,18 @@
1
- import type { ICache } from './cache-interface';
1
+ import type { Cache } from './cache-interface';
2
2
  /**
3
3
  * Error codes for email verification failures
4
4
  */
5
5
  export declare enum VerificationErrorCode {
6
- INVALID_FORMAT = "INVALID_FORMAT",
7
- INVALID_DOMAIN = "INVALID_DOMAIN",
8
- NO_MX_RECORDS = "NO_MX_RECORDS",
9
- SMTP_CONNECTION_FAILED = "SMTP_CONNECTION_FAILED",
10
- SMTP_TIMEOUT = "SMTP_TIMEOUT",
11
- MAILBOX_NOT_FOUND = "MAILBOX_NOT_FOUND",
12
- MAILBOX_FULL = "MAILBOX_FULL",
13
- NETWORK_ERROR = "NETWORK_ERROR",
14
- DISPOSABLE_EMAIL = "DISPOSABLE_EMAIL",
15
- FREE_EMAIL_PROVIDER = "FREE_EMAIL_PROVIDER"
6
+ invalidFormat = "INVALID_FORMAT",
7
+ invalidDomain = "INVALID_DOMAIN",
8
+ noMxRecords = "NO_MX_RECORDS",
9
+ smtpConnectionFailed = "SMTP_CONNECTION_FAILED",
10
+ smtpTimeout = "SMTP_TIMEOUT",
11
+ mailboxNotFound = "MAILBOX_NOT_FOUND",
12
+ mailboxFull = "MAILBOX_FULL",
13
+ networkError = "NETWORK_ERROR",
14
+ disposableEmail = "DISPOSABLE_EMAIL",
15
+ freeEmailProvider = "FREE_EMAIL_PROVIDER"
16
16
  }
17
17
  /**
18
18
  * Main verification result interface (flat structure)
@@ -28,6 +28,16 @@ export interface VerificationResult {
28
28
  domainAge?: DomainAgeInfo | null;
29
29
  domainRegistration?: DomainRegistrationInfo | null;
30
30
  domainSuggestion?: DomainSuggestion | null;
31
+ /** Whether SMTP connection was successful */
32
+ canConnectSmtp?: boolean;
33
+ /** Whether the mailbox is full */
34
+ hasFullInbox?: boolean;
35
+ /** Whether the domain has catch-all enabled */
36
+ isCatchAll?: boolean;
37
+ /** Whether the email is deliverable */
38
+ isDeliverable?: boolean;
39
+ /** Whether the email/account is disabled */
40
+ isDisabled?: boolean;
31
41
  metadata?: {
32
42
  verificationTime: number;
33
43
  cached: boolean;
@@ -37,7 +47,7 @@ export interface VerificationResult {
37
47
  /**
38
48
  * Parameters for email verification
39
49
  */
40
- export interface IVerifyEmailParams {
50
+ export interface VerifyEmailParams {
41
51
  emailAddress: string;
42
52
  timeout?: number;
43
53
  verifyMx?: boolean;
@@ -57,12 +67,12 @@ export interface IVerifyEmailParams {
57
67
  whoisTimeout?: number;
58
68
  skipMxForDisposable?: boolean;
59
69
  skipDomainWhoisForDisposable?: boolean;
60
- cache?: ICache;
70
+ cache?: Cache;
61
71
  }
62
72
  /**
63
73
  * Parameters for batch verification
64
74
  */
65
- export interface IBatchVerifyParams {
75
+ export interface BatchVerifyParams {
66
76
  emailAddresses: string[];
67
77
  concurrency?: number;
68
78
  timeout?: number;
@@ -77,7 +87,91 @@ export interface IBatchVerifyParams {
77
87
  commonDomains?: string[];
78
88
  skipMxForDisposable?: boolean;
79
89
  skipDomainWhoisForDisposable?: boolean;
80
- cache?: ICache;
90
+ cache?: Cache;
91
+ }
92
+ /**
93
+ * Rich cache result types for storing detailed verification results
94
+ */
95
+ /**
96
+ * Result for disposable email detection with metadata
97
+ */
98
+ export interface DisposableEmailResult {
99
+ /** Whether the email/domain is disposable */
100
+ isDisposable: boolean;
101
+ /** Source that identified this as disposable (e.g., list name, service) */
102
+ source?: string;
103
+ /** Category of disposable email (e.g., 'temp', 'alias', 'forwarding') */
104
+ category?: string;
105
+ /** Timestamp when this was checked */
106
+ checkedAt: number;
107
+ }
108
+ /**
109
+ * Result for free email provider detection with metadata
110
+ */
111
+ export interface FreeEmailResult {
112
+ /** Whether the email/domain is from a free provider */
113
+ isFree: boolean;
114
+ /** Name of the free provider (e.g., 'gmail', 'yahoo', 'outlook') */
115
+ provider?: string;
116
+ /** Timestamp when this was checked */
117
+ checkedAt: number;
118
+ }
119
+ /**
120
+ * Result for domain validation with metadata
121
+ */
122
+ export interface DomainValidResult {
123
+ /** Whether the domain is valid */
124
+ isValid: boolean;
125
+ /** Whether MX records were found */
126
+ hasMX: boolean;
127
+ /** The MX records that were found */
128
+ mxRecords?: string[];
129
+ /** Timestamp when this was checked */
130
+ checkedAt: number;
131
+ }
132
+ /**
133
+ * Email providers enum
134
+ */
135
+ export declare enum EmailProvider {
136
+ gmail = "gmail",
137
+ hotmailB2b = "hotmail_b2b",
138
+ hotmailB2c = "hotmail_b2c",
139
+ proofpoint = "proofpoint",
140
+ mimecast = "mimecast",
141
+ yahoo = "yahoo",
142
+ everythingElse = "everything_else"
143
+ }
144
+ /**
145
+ * Result for SMTP verification with metadata
146
+ * Uses camelCase for consistency with TypeScript conventions
147
+ */
148
+ export interface SmtpVerificationResult {
149
+ /** Whether SMTP connection was successful */
150
+ canConnectSmtp: boolean;
151
+ /** Whether the mailbox is full */
152
+ hasFullInbox: boolean;
153
+ /** Whether the domain has catch-all enabled */
154
+ isCatchAll: boolean;
155
+ /** Whether the email is deliverable */
156
+ isDeliverable: boolean;
157
+ /** Whether the email/account is disabled */
158
+ isDisabled: boolean;
159
+ /** Error message if verification failed */
160
+ error?: string;
161
+ /** Which provider was detected/used */
162
+ providerUsed?: EmailProvider;
163
+ /** Additional compatibility properties */
164
+ success?: boolean;
165
+ canConnect?: boolean;
166
+ responseCode?: number;
167
+ /** Provider-specific error details */
168
+ providerSpecific?: {
169
+ errorCode?: string;
170
+ actionRequired?: string;
171
+ details?: string;
172
+ };
173
+ /** Timestamp when this was checked (for cache) */
174
+ checkedAt?: number;
81
175
  }
82
176
  /**
83
177
  * Result for batch verification
@@ -92,6 +186,16 @@ export interface BatchVerificationResult {
92
186
  processingTime: number;
93
187
  };
94
188
  }
189
+ /**
190
+ * Parse SMTP error message to determine error type
191
+ * Handles both SMTP protocol errors and system/network errors
192
+ */
193
+ export declare function parseSmtpError(errorMessage: string): {
194
+ isDisabled: boolean;
195
+ hasFullInbox: boolean;
196
+ isInvalid: boolean;
197
+ isCatchAll: boolean;
198
+ };
95
199
  /**
96
200
  * Port configuration for SMTP verification
97
201
  */
@@ -111,14 +215,14 @@ export interface SMTPTLSConfig {
111
215
  * SMTP protocol steps enum
112
216
  */
113
217
  export declare enum SMTPStep {
114
- GREETING = "GREETING",
115
- EHLO = "EHLO",
116
- HELO = "HELO",
117
- STARTTLS = "STARTTLS",
118
- MAIL_FROM = "MAIL_FROM",
119
- RCPT_TO = "RCPT_TO",
120
- VRFY = "VRFY",
121
- QUIT = "QUIT"
218
+ greeting = "GREETING",
219
+ ehlo = "EHLO",
220
+ helo = "HELO",
221
+ startTls = "STARTTLS",
222
+ mailFrom = "MAIL_FROM",
223
+ rcptTo = "RCPT_TO",
224
+ vrfy = "VRFY",
225
+ quit = "QUIT"
122
226
  }
123
227
  /**
124
228
  * Custom SMTP sequence configuration
@@ -138,7 +242,7 @@ export interface SMTPVerifyOptions {
138
242
  tls?: boolean | SMTPTLSConfig;
139
243
  hostname?: string;
140
244
  useVRFY?: boolean;
141
- cache?: ICache | null;
245
+ cache?: Cache | null;
142
246
  debug?: boolean;
143
247
  sequence?: SMTPSequence;
144
248
  }
@@ -182,11 +286,11 @@ export type DomainSuggestionMethod = (domain: string) => DomainSuggestion | null
182
286
  /**
183
287
  * Parameters for domain suggestion
184
288
  */
185
- export interface ISuggestDomainParams {
289
+ export interface DomainSuggestionParams {
186
290
  domain: string;
187
291
  customMethod?: DomainSuggestionMethod;
188
292
  commonDomains?: string[];
189
- cache?: ICache;
293
+ cache?: Cache;
190
294
  }
191
295
  /**
192
296
  * Result of name detection from email
@@ -203,7 +307,7 @@ export type NameDetectionMethod = (email: string) => DetectedName | null;
203
307
  /**
204
308
  * Parameters for name detection
205
309
  */
206
- export interface IDetectNameParams {
310
+ export interface NameDetectionParams {
207
311
  email: string;
208
312
  customMethod?: NameDetectionMethod;
209
313
  }
@@ -257,25 +361,25 @@ export interface DomainSuggesterOptions {
257
361
  /**
258
362
  * Parameters for isDisposableEmail function
259
363
  */
260
- export interface IDisposableEmailParams {
364
+ export interface DisposableEmailCheckParams {
261
365
  emailOrDomain: string;
262
- cache?: ICache | null;
366
+ cache?: Cache | null;
263
367
  logger?: (...args: unknown[]) => void;
264
368
  }
265
369
  /**
266
370
  * Parameters for isFreeEmail function
267
371
  */
268
- export interface IFreeEmailParams {
372
+ export interface FreeEmailCheckParams {
269
373
  emailOrDomain: string;
270
- cache?: ICache | null;
374
+ cache?: Cache | null;
271
375
  logger?: (...args: unknown[]) => void;
272
376
  }
273
377
  /**
274
378
  * Parameters for resolveMxRecords function
275
379
  */
276
- export interface IResolveMxParams {
380
+ export interface ResolveMxParams {
277
381
  domain: string;
278
- cache?: ICache | null;
382
+ cache?: Cache | null;
279
383
  logger?: (...args: unknown[]) => void;
280
384
  }
281
385
  /**
@@ -322,4 +426,4 @@ export interface EmailValidationResult {
322
426
  export interface ValidatorResult {
323
427
  valid: boolean;
324
428
  }
325
- export type { ICache, ICacheStore } from './cache-interface';
429
+ export type { Cache, CacheStore } from './cache-interface';
package/dist/whois.d.ts CHANGED
@@ -1,4 +1,4 @@
1
- import type { ICache } from './cache-interface';
1
+ import type { Cache } from './cache-interface';
2
2
  import type { DomainAgeInfo, DomainRegistrationInfo } from './types';
3
- export declare function getDomainAge(domain: string, timeout?: number, debug?: boolean, cache?: ICache): Promise<DomainAgeInfo | null>;
4
- export declare function getDomainRegistrationStatus(domain: string, timeout?: number, debug?: boolean, cache?: ICache): Promise<DomainRegistrationInfo | null>;
3
+ export declare function getDomainAge(domain: string, timeout?: number, debug?: boolean, cache?: Cache): Promise<DomainAgeInfo | null>;
4
+ export declare function getDomainRegistrationStatus(domain: string, timeout?: number, debug?: boolean, cache?: Cache): Promise<DomainRegistrationInfo | null>;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@emailcheck/email-validator-js",
3
- "version": "3.0.1-beta.0",
3
+ "version": "3.0.1-beta.2",
4
4
  "private": false,
5
5
  "description": "Advanced email validation with MX records, SMTP verification, disposable email detection, batch processing, and caching. Production-ready with TypeScript support.",
6
6
  "keywords": [
@@ -30,32 +30,32 @@
30
30
  "exports": {
31
31
  ".": {
32
32
  "require": "./dist/index.js",
33
- "import": "./dist/index.js",
33
+ "import": "./dist/index.esm.js",
34
34
  "types": "./dist/index.d.ts"
35
35
  },
36
36
  "./serverless": {
37
- "require": "./dist/serverless/index.js",
38
- "import": "./dist/serverless/index.js",
37
+ "require": "./dist/serverless/index.cjs.js",
38
+ "import": "./dist/serverless/index.esm.js",
39
39
  "types": "./dist/serverless/index.d.ts"
40
40
  },
41
- "./serverless/core": {
42
- "require": "./dist/serverless/core.js",
43
- "import": "./dist/serverless/core.js",
44
- "types": "./dist/serverless/core.d.ts"
41
+ "./serverless/verifier": {
42
+ "require": "./dist/serverless/verifier.cjs.js",
43
+ "import": "./dist/serverless/verifier.esm.js",
44
+ "types": "./dist/serverless/verifier.d.ts"
45
45
  },
46
46
  "./serverless/aws": {
47
- "require": "./dist/serverless/adapters/aws-lambda.js",
48
- "import": "./dist/serverless/adapters/aws-lambda.js",
47
+ "require": "./dist/serverless/adapters/aws-lambda.cjs.js",
48
+ "import": "./dist/serverless/adapters/aws-lambda.esm.js",
49
49
  "types": "./dist/serverless/adapters/aws-lambda.d.ts"
50
50
  },
51
51
  "./serverless/vercel": {
52
- "require": "./dist/serverless/adapters/vercel.js",
53
- "import": "./dist/serverless/adapters/vercel.js",
52
+ "require": "./dist/serverless/adapters/vercel.cjs.js",
53
+ "import": "./dist/serverless/adapters/vercel.esm.js",
54
54
  "types": "./dist/serverless/adapters/vercel.d.ts"
55
55
  },
56
56
  "./serverless/cloudflare": {
57
- "require": "./dist/serverless/adapters/cloudflare.js",
58
- "import": "./dist/serverless/adapters/cloudflare.js",
57
+ "require": "./dist/serverless/adapters/cloudflare.cjs.js",
58
+ "import": "./dist/serverless/adapters/cloudflare.esm.js",
59
59
  "types": "./dist/serverless/adapters/cloudflare.d.ts"
60
60
  }
61
61
  },
@@ -96,7 +96,7 @@
96
96
  "tiny-lru": "^11.4.5"
97
97
  },
98
98
  "devDependencies": {
99
- "@biomejs/biome": "^2.3.8",
99
+ "@biomejs/biome": "^2.3.10",
100
100
  "@rollup/plugin-commonjs": "^29.0.0",
101
101
  "@rollup/plugin-json": "^6.1.0",
102
102
  "@rollup/plugin-node-resolve": "^16.0.3",
@@ -104,15 +104,15 @@
104
104
  "@rollup/plugin-typescript": "^12.3.0",
105
105
  "@types/aws-lambda": "^8.10.159",
106
106
  "@types/jest": "^30.0.0",
107
- "@types/node": "25.0.1",
107
+ "@types/node": "25.0.3",
108
108
  "@types/sinon": "21.0.0",
109
- "esbuild": "^0.27.1",
109
+ "esbuild": "^0.27.2",
110
110
  "husky": "9.1.7",
111
111
  "jest": "^30.2.0",
112
112
  "lint-staged": "16.2.7",
113
- "rollup": "^4.53.3",
113
+ "rollup": "^4.54.0",
114
114
  "rollup-plugin-esbuild": "^6.2.1",
115
- "sinon": "21.0.0",
115
+ "sinon": "21.0.1",
116
116
  "ts-jest": "^29.4.6",
117
117
  "tslib": "^2.8.1",
118
118
  "typescript": "5.9.3"
package/dist/batch.d.ts DELETED
@@ -1,5 +0,0 @@
1
- import type { BatchVerificationResult, IBatchVerifyParams } from './types';
2
- /**
3
- * Verify multiple email addresses in parallel with concurrency control
4
- */
5
- export declare function verifyEmailBatch(params: IBatchVerifyParams): Promise<BatchVerificationResult>;
package/dist/dns.d.ts DELETED
@@ -1,2 +0,0 @@
1
- import type { IResolveMxParams } from './types';
2
- export declare function resolveMxRecords(params: IResolveMxParams): Promise<string[]>;
@@ -1 +0,0 @@
1
- {"version":3,"file":"core.cjs.js","sources":["../../node_modules/string-similarity-js/dist/string-similarity.js","../../src/serverless/core.ts"],"sourcesContent":["\"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 * Core serverless email validator\n * Platform-agnostic implementation without Node.js dependencies\n */\n\n// Import utility functions\nimport { stringSimilarity } from 'string-similarity-js';\n\n// Import full data files for comprehensive validation\n// These are the complete, unminified JSON files\nimport disposableProviders from '../disposable-email-providers.json';\nimport freeProviders from '../free-email-providers.json';\nimport type { DomainSuggesterOptions, EmailValidationResult, ValidateEmailOptions } from '../types';\n\n// Platform-agnostic cache implementation\nexport class EdgeCache<T> {\n private cache = new Map<string, { value: T; expires: number }>();\n private maxSize: number;\n private ttl: number;\n\n constructor(maxSize = 1000, ttl = 3600000) {\n this.maxSize = maxSize;\n this.ttl = ttl;\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) {\n // Remove oldest entries\n const entriesToRemove = Math.max(1, Math.floor(this.maxSize * 0.1));\n const keys = Array.from(this.cache.keys()).slice(0, entriesToRemove);\n keys.forEach((key) => this.cache.delete(key));\n }\n this.cache.set(key, {\n value,\n expires: Date.now() + this.ttl,\n });\n }\n\n clear(): void {\n this.cache.clear();\n }\n\n size(): number {\n return this.cache.size;\n }\n}\n\n// Global cache instances\nexport const validationCache = new EdgeCache<EmailValidationResult>(1000);\nexport const mxCache = new EdgeCache<string[]>(500);\n\n// Email validation regex patterns\nconst VALID_EMAIL_REGEX =\n /^(([^<>()[\\]\\\\.,;:\\s@\"]+(\\.[^<>()[\\]\\\\.,;:\\s@\"]+)*)|(\".+\"))@((\\[[0-9]{1,3}\\.[0-9]{1,3}\\.[0-9]{1,3}\\.[0-9]{1,3}])|(([a-zA-Z\\-0-9]+\\.)+[a-zA-Z]{2,}))$/;\n\n// Common email provider domains for typo detection\nexport const COMMON_DOMAINS = [\n 'gmail.com',\n 'yahoo.com',\n 'hotmail.com',\n 'outlook.com',\n 'icloud.com',\n 'aol.com',\n 'msn.com',\n 'live.com',\n 'ymail.com',\n 'protonmail.com',\n 'zoho.com',\n 'mail.com',\n 'gmx.com',\n 'fastmail.com',\n 'tutanota.com',\n 'qq.com',\n '163.com',\n '126.com',\n 'sina.com',\n 'foxmail.com',\n 'yandex.com',\n 'mail.ru',\n 'rambler.ru',\n 'gmx.de',\n 'web.de',\n 't-online.de',\n 'orange.fr',\n 'wanadoo.fr',\n 'free.fr',\n 'sfr.fr',\n 'laposte.net',\n 'libero.it',\n 'virgilio.it',\n 'alice.it',\n 'tin.it',\n 'bt.com',\n 'btinternet.com',\n 'virginmedia.com',\n 'sky.com',\n 'talktalk.net',\n 'rogers.com',\n 'shaw.ca',\n 'sympatico.ca',\n 'bellsouth.net',\n 'comcast.net',\n 'cox.net',\n 'earthlink.net',\n 'charter.net',\n 'optonline.net',\n 'verizon.net',\n 'att.net',\n 'sbcglobal.net',\n 'me.com',\n 'mac.com',\n 'rocketmail.com',\n];\n\n// Common typo patterns\nconst TYPO_PATTERNS = [\n // Gmail typos\n { pattern: /gmial\\.com$/i, replacement: 'gmail.com' },\n { pattern: /gmai\\.com$/i, replacement: 'gmail.com' },\n { pattern: /gmil\\.com$/i, replacement: 'gmail.com' },\n { pattern: /gmail\\.co$/i, replacement: 'gmail.com' },\n { pattern: /gmail\\.con$/i, replacement: 'gmail.com' },\n { pattern: /gmail\\.cm$/i, replacement: 'gmail.com' },\n { pattern: /gmal\\.com$/i, replacement: 'gmail.com' },\n { pattern: /gnail\\.com$/i, replacement: 'gmail.com' },\n\n // Yahoo typos\n { pattern: /yahooo\\.com$/i, replacement: 'yahoo.com' },\n { pattern: /yaho\\.com$/i, replacement: 'yahoo.com' },\n { pattern: /yahoo\\.co$/i, replacement: 'yahoo.com' },\n { pattern: /yaoo\\.com$/i, replacement: 'yahoo.com' },\n { pattern: /yaboo\\.com$/i, replacement: 'yahoo.com' },\n\n // Hotmail typos\n { pattern: /hotmial\\.com$/i, replacement: 'hotmail.com' },\n { pattern: /hotmai\\.com$/i, replacement: 'hotmail.com' },\n { pattern: /hotmil\\.com$/i, replacement: 'hotmail.com' },\n { pattern: /hotmail\\.co$/i, replacement: 'hotmail.com' },\n { pattern: /hormail\\.com$/i, replacement: 'hotmail.com' },\n\n // Outlook typos\n { pattern: /outlok\\.com$/i, replacement: 'outlook.com' },\n { pattern: /outloo\\.com$/i, replacement: 'outlook.com' },\n { pattern: /outlook\\.co$/i, replacement: 'outlook.com' },\n { pattern: /putlook\\.com$/i, replacement: 'outlook.com' },\n\n // iCloud typos\n { pattern: /iclud\\.com$/i, replacement: 'icloud.com' },\n { pattern: /icloud\\.co$/i, replacement: 'icloud.com' },\n { pattern: /icoud\\.com$/i, replacement: 'icloud.com' },\n];\n\n// Platform-agnostic DNS resolution interface\nexport interface DNSResolver {\n resolveMx(domain: string): Promise<Array<{ exchange: string; priority: number }>>;\n\n resolveTxt(domain: string): Promise<string[]>;\n}\n\n// Stub DNS resolver for environments without DNS capabilities\nexport class StubDNSResolver implements DNSResolver {\n async resolveMx(_domain: string): Promise<Array<{ exchange: string; priority: number }>> {\n // Return null to indicate DNS is not available\n return [];\n }\n\n async resolveTxt(_domain: string): Promise<string[]> {\n return [];\n }\n}\n\n// Domain suggestion function\nexport function suggestDomain(domain: string, options?: DomainSuggesterOptions): string | null {\n const threshold = options?.threshold || 2;\n const domains = options?.customDomains || COMMON_DOMAINS;\n\n // Check common typos first\n for (const { pattern, replacement } of TYPO_PATTERNS) {\n if (pattern.test(domain)) {\n return replacement;\n }\n }\n\n // If domain is already in the list of common domains, it's correct\n if (domains.includes(domain)) {\n return null;\n }\n\n // Find closest domain using Levenshtein distance\n let minDistance = Infinity;\n let suggestion: string | null = null;\n\n for (const commonDomain of domains) {\n // Skip if it's the same domain (case-insensitive)\n if (domain.toLowerCase() === commonDomain.toLowerCase()) {\n return null;\n }\n\n // Use string similarity to calculate distance\n const similarity = stringSimilarity(domain.toLowerCase(), commonDomain.toLowerCase());\n const distance = Math.round((1 - similarity) * Math.max(domain.length, commonDomain.length));\n if (distance > 0 && distance <= threshold && distance < minDistance) {\n minDistance = distance;\n suggestion = commonDomain;\n }\n }\n\n return suggestion;\n}\n\n// Core validation function\nexport async function validateEmailCore(\n email: string,\n options?: ValidateEmailOptions & { dnsResolver?: DNSResolver }\n): Promise<EmailValidationResult> {\n const normalizedEmail = email.toLowerCase().trim();\n\n // Check cache\n if (!options?.skipCache) {\n const cached = validationCache.get(normalizedEmail);\n if (cached) return cached;\n }\n\n const result: EmailValidationResult = {\n valid: false,\n email: normalizedEmail,\n validators: {},\n };\n\n // Syntax validation\n if (options?.validateSyntax !== false) {\n const syntaxValid = VALID_EMAIL_REGEX.test(normalizedEmail);\n result.validators.syntax = { valid: syntaxValid };\n if (!syntaxValid) {\n validationCache.set(normalizedEmail, result);\n return result;\n }\n }\n\n const [local, domain] = normalizedEmail.split('@');\n result.local = local;\n result.domain = domain;\n\n // Typo detection and suggestion\n if (options?.validateTypo !== false) {\n const suggestion = suggestDomain(domain, options?.domainSuggesterOptions);\n result.validators.typo = {\n valid: !suggestion,\n suggestion: suggestion || undefined,\n };\n }\n\n // Disposable email check\n if (options?.validateDisposable !== false) {\n const isDisposable = disposableProviders.includes(domain);\n result.validators.disposable = { valid: !isDisposable };\n }\n\n // Free email check\n if (options?.validateFree !== false) {\n const isFree = freeProviders.includes(domain);\n result.validators.free = { valid: !isFree };\n }\n\n // MX record validation (if DNS resolver is available)\n if (options?.validateMx && options.dnsResolver) {\n try {\n const mxRecords = await options.dnsResolver.resolveMx(domain);\n const hasMx = mxRecords && mxRecords.length > 0;\n result.validators.mx = {\n valid: hasMx,\n records: hasMx ? mxRecords.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 // Overall valid status - only syntax, typo, disposable, and MX matter for validity\n // Free provider detection is informational only\n const criticalValidators = ['syntax', 'typo', 'disposable', 'mx'];\n result.valid = criticalValidators.every((key) => {\n const validator = result.validators[key as keyof typeof result.validators];\n return !validator || validator.valid !== false;\n });\n\n // Cache result\n if (!options?.skipCache) {\n validationCache.set(normalizedEmail, result);\n }\n\n return result;\n}\n\n// Batch validation\nexport async function validateEmailBatch(\n emails: string[],\n options?: ValidateEmailOptions & { dnsResolver?: DNSResolver }\n): Promise<EmailValidationResult[]> {\n // Process in chunks to avoid overwhelming the system\n const chunkSize = options?.batchSize || 10;\n const results: EmailValidationResult[] = [];\n\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\n return results;\n}\n\n// Export cache control functions\nexport function clearCache(): void {\n validationCache.clear();\n mxCache.clear();\n}\n\n// Export types\nexport type {\n DomainSuggesterOptions,\n EmailValidationResult,\n ValidateEmailOptions,\n} from '../types';\n"],"names":["exports","key","stringSimilarity"],"mappings":"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","x_google_ignoreList":[0]}
@@ -1 +0,0 @@
1
- {"version":3,"file":"core.esm.js","sources":["../../node_modules/string-similarity-js/dist/string-similarity.js","../../src/serverless/core.ts"],"sourcesContent":["\"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 * Core serverless email validator\n * Platform-agnostic implementation without Node.js dependencies\n */\n\n// Import utility functions\nimport { stringSimilarity } from 'string-similarity-js';\n\n// Import full data files for comprehensive validation\n// These are the complete, unminified JSON files\nimport disposableProviders from '../disposable-email-providers.json';\nimport freeProviders from '../free-email-providers.json';\nimport type { DomainSuggesterOptions, EmailValidationResult, ValidateEmailOptions } from '../types';\n\n// Platform-agnostic cache implementation\nexport class EdgeCache<T> {\n private cache = new Map<string, { value: T; expires: number }>();\n private maxSize: number;\n private ttl: number;\n\n constructor(maxSize = 1000, ttl = 3600000) {\n this.maxSize = maxSize;\n this.ttl = ttl;\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) {\n // Remove oldest entries\n const entriesToRemove = Math.max(1, Math.floor(this.maxSize * 0.1));\n const keys = Array.from(this.cache.keys()).slice(0, entriesToRemove);\n keys.forEach((key) => this.cache.delete(key));\n }\n this.cache.set(key, {\n value,\n expires: Date.now() + this.ttl,\n });\n }\n\n clear(): void {\n this.cache.clear();\n }\n\n size(): number {\n return this.cache.size;\n }\n}\n\n// Global cache instances\nexport const validationCache = new EdgeCache<EmailValidationResult>(1000);\nexport const mxCache = new EdgeCache<string[]>(500);\n\n// Email validation regex patterns\nconst VALID_EMAIL_REGEX =\n /^(([^<>()[\\]\\\\.,;:\\s@\"]+(\\.[^<>()[\\]\\\\.,;:\\s@\"]+)*)|(\".+\"))@((\\[[0-9]{1,3}\\.[0-9]{1,3}\\.[0-9]{1,3}\\.[0-9]{1,3}])|(([a-zA-Z\\-0-9]+\\.)+[a-zA-Z]{2,}))$/;\n\n// Common email provider domains for typo detection\nexport const COMMON_DOMAINS = [\n 'gmail.com',\n 'yahoo.com',\n 'hotmail.com',\n 'outlook.com',\n 'icloud.com',\n 'aol.com',\n 'msn.com',\n 'live.com',\n 'ymail.com',\n 'protonmail.com',\n 'zoho.com',\n 'mail.com',\n 'gmx.com',\n 'fastmail.com',\n 'tutanota.com',\n 'qq.com',\n '163.com',\n '126.com',\n 'sina.com',\n 'foxmail.com',\n 'yandex.com',\n 'mail.ru',\n 'rambler.ru',\n 'gmx.de',\n 'web.de',\n 't-online.de',\n 'orange.fr',\n 'wanadoo.fr',\n 'free.fr',\n 'sfr.fr',\n 'laposte.net',\n 'libero.it',\n 'virgilio.it',\n 'alice.it',\n 'tin.it',\n 'bt.com',\n 'btinternet.com',\n 'virginmedia.com',\n 'sky.com',\n 'talktalk.net',\n 'rogers.com',\n 'shaw.ca',\n 'sympatico.ca',\n 'bellsouth.net',\n 'comcast.net',\n 'cox.net',\n 'earthlink.net',\n 'charter.net',\n 'optonline.net',\n 'verizon.net',\n 'att.net',\n 'sbcglobal.net',\n 'me.com',\n 'mac.com',\n 'rocketmail.com',\n];\n\n// Common typo patterns\nconst TYPO_PATTERNS = [\n // Gmail typos\n { pattern: /gmial\\.com$/i, replacement: 'gmail.com' },\n { pattern: /gmai\\.com$/i, replacement: 'gmail.com' },\n { pattern: /gmil\\.com$/i, replacement: 'gmail.com' },\n { pattern: /gmail\\.co$/i, replacement: 'gmail.com' },\n { pattern: /gmail\\.con$/i, replacement: 'gmail.com' },\n { pattern: /gmail\\.cm$/i, replacement: 'gmail.com' },\n { pattern: /gmal\\.com$/i, replacement: 'gmail.com' },\n { pattern: /gnail\\.com$/i, replacement: 'gmail.com' },\n\n // Yahoo typos\n { pattern: /yahooo\\.com$/i, replacement: 'yahoo.com' },\n { pattern: /yaho\\.com$/i, replacement: 'yahoo.com' },\n { pattern: /yahoo\\.co$/i, replacement: 'yahoo.com' },\n { pattern: /yaoo\\.com$/i, replacement: 'yahoo.com' },\n { pattern: /yaboo\\.com$/i, replacement: 'yahoo.com' },\n\n // Hotmail typos\n { pattern: /hotmial\\.com$/i, replacement: 'hotmail.com' },\n { pattern: /hotmai\\.com$/i, replacement: 'hotmail.com' },\n { pattern: /hotmil\\.com$/i, replacement: 'hotmail.com' },\n { pattern: /hotmail\\.co$/i, replacement: 'hotmail.com' },\n { pattern: /hormail\\.com$/i, replacement: 'hotmail.com' },\n\n // Outlook typos\n { pattern: /outlok\\.com$/i, replacement: 'outlook.com' },\n { pattern: /outloo\\.com$/i, replacement: 'outlook.com' },\n { pattern: /outlook\\.co$/i, replacement: 'outlook.com' },\n { pattern: /putlook\\.com$/i, replacement: 'outlook.com' },\n\n // iCloud typos\n { pattern: /iclud\\.com$/i, replacement: 'icloud.com' },\n { pattern: /icloud\\.co$/i, replacement: 'icloud.com' },\n { pattern: /icoud\\.com$/i, replacement: 'icloud.com' },\n];\n\n// Platform-agnostic DNS resolution interface\nexport interface DNSResolver {\n resolveMx(domain: string): Promise<Array<{ exchange: string; priority: number }>>;\n\n resolveTxt(domain: string): Promise<string[]>;\n}\n\n// Stub DNS resolver for environments without DNS capabilities\nexport class StubDNSResolver implements DNSResolver {\n async resolveMx(_domain: string): Promise<Array<{ exchange: string; priority: number }>> {\n // Return null to indicate DNS is not available\n return [];\n }\n\n async resolveTxt(_domain: string): Promise<string[]> {\n return [];\n }\n}\n\n// Domain suggestion function\nexport function suggestDomain(domain: string, options?: DomainSuggesterOptions): string | null {\n const threshold = options?.threshold || 2;\n const domains = options?.customDomains || COMMON_DOMAINS;\n\n // Check common typos first\n for (const { pattern, replacement } of TYPO_PATTERNS) {\n if (pattern.test(domain)) {\n return replacement;\n }\n }\n\n // If domain is already in the list of common domains, it's correct\n if (domains.includes(domain)) {\n return null;\n }\n\n // Find closest domain using Levenshtein distance\n let minDistance = Infinity;\n let suggestion: string | null = null;\n\n for (const commonDomain of domains) {\n // Skip if it's the same domain (case-insensitive)\n if (domain.toLowerCase() === commonDomain.toLowerCase()) {\n return null;\n }\n\n // Use string similarity to calculate distance\n const similarity = stringSimilarity(domain.toLowerCase(), commonDomain.toLowerCase());\n const distance = Math.round((1 - similarity) * Math.max(domain.length, commonDomain.length));\n if (distance > 0 && distance <= threshold && distance < minDistance) {\n minDistance = distance;\n suggestion = commonDomain;\n }\n }\n\n return suggestion;\n}\n\n// Core validation function\nexport async function validateEmailCore(\n email: string,\n options?: ValidateEmailOptions & { dnsResolver?: DNSResolver }\n): Promise<EmailValidationResult> {\n const normalizedEmail = email.toLowerCase().trim();\n\n // Check cache\n if (!options?.skipCache) {\n const cached = validationCache.get(normalizedEmail);\n if (cached) return cached;\n }\n\n const result: EmailValidationResult = {\n valid: false,\n email: normalizedEmail,\n validators: {},\n };\n\n // Syntax validation\n if (options?.validateSyntax !== false) {\n const syntaxValid = VALID_EMAIL_REGEX.test(normalizedEmail);\n result.validators.syntax = { valid: syntaxValid };\n if (!syntaxValid) {\n validationCache.set(normalizedEmail, result);\n return result;\n }\n }\n\n const [local, domain] = normalizedEmail.split('@');\n result.local = local;\n result.domain = domain;\n\n // Typo detection and suggestion\n if (options?.validateTypo !== false) {\n const suggestion = suggestDomain(domain, options?.domainSuggesterOptions);\n result.validators.typo = {\n valid: !suggestion,\n suggestion: suggestion || undefined,\n };\n }\n\n // Disposable email check\n if (options?.validateDisposable !== false) {\n const isDisposable = disposableProviders.includes(domain);\n result.validators.disposable = { valid: !isDisposable };\n }\n\n // Free email check\n if (options?.validateFree !== false) {\n const isFree = freeProviders.includes(domain);\n result.validators.free = { valid: !isFree };\n }\n\n // MX record validation (if DNS resolver is available)\n if (options?.validateMx && options.dnsResolver) {\n try {\n const mxRecords = await options.dnsResolver.resolveMx(domain);\n const hasMx = mxRecords && mxRecords.length > 0;\n result.validators.mx = {\n valid: hasMx,\n records: hasMx ? mxRecords.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 // Overall valid status - only syntax, typo, disposable, and MX matter for validity\n // Free provider detection is informational only\n const criticalValidators = ['syntax', 'typo', 'disposable', 'mx'];\n result.valid = criticalValidators.every((key) => {\n const validator = result.validators[key as keyof typeof result.validators];\n return !validator || validator.valid !== false;\n });\n\n // Cache result\n if (!options?.skipCache) {\n validationCache.set(normalizedEmail, result);\n }\n\n return result;\n}\n\n// Batch validation\nexport async function validateEmailBatch(\n emails: string[],\n options?: ValidateEmailOptions & { dnsResolver?: DNSResolver }\n): Promise<EmailValidationResult[]> {\n // Process in chunks to avoid overwhelming the system\n const chunkSize = options?.batchSize || 10;\n const results: EmailValidationResult[] = [];\n\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\n return results;\n}\n\n// Export cache control functions\nexport function clearCache(): void {\n validationCache.clear();\n mxCache.clear();\n}\n\n// Export types\nexport type {\n DomainSuggesterOptions,\n EmailValidationResult,\n ValidateEmailOptions,\n} from '../types';\n"],"names":["exports","key","stringSimilarity"],"mappings":"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","x_google_ignoreList":[0]}
File without changes