@emailcheck/email-validator-js 3.0.1-beta.0 → 3.0.1-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.
- package/README.md +176 -24
- package/dist/adapters/lru-adapter.d.ts +2 -2
- package/dist/adapters/redis-adapter.d.ts +4 -4
- package/dist/batch-verifier.d.ts +5 -0
- package/dist/cache-interface.d.ts +23 -16
- package/dist/cache.d.ts +5 -5
- package/dist/check-if-email-exists.d.ts +205 -0
- package/dist/domain-suggester.d.ts +6 -6
- package/dist/{validator.d.ts → email-validator.d.ts} +2 -2
- package/dist/email-verifier-types.d.ts +225 -0
- package/dist/index.d.ts +8 -8
- package/dist/index.esm.js +457 -236
- package/dist/index.esm.js.map +1 -1
- package/dist/index.js +460 -238
- package/dist/index.js.map +1 -1
- package/dist/mx-resolver.d.ts +2 -0
- package/dist/name-detector.d.ts +6 -6
- package/dist/serverless/adapters/aws-lambda.cjs.js.map +1 -1
- package/dist/serverless/adapters/aws-lambda.esm.js.map +1 -1
- package/dist/serverless/adapters/cloudflare.cjs.js.map +1 -1
- package/dist/serverless/adapters/cloudflare.esm.js.map +1 -1
- package/dist/serverless/adapters/vercel.cjs.js.map +1 -1
- package/dist/serverless/adapters/vercel.esm.js.map +1 -1
- package/dist/serverless/index.cjs.js.map +1 -1
- package/dist/serverless/index.d.ts +1 -1
- package/dist/serverless/index.esm.js.map +1 -1
- package/dist/serverless/{core.cjs.js → verifier.cjs.js} +1 -1
- package/dist/serverless/verifier.cjs.js.map +1 -0
- package/dist/serverless/{core.esm.js → verifier.esm.js} +1 -1
- package/dist/serverless/verifier.esm.js.map +1 -0
- package/dist/{smtp.d.ts → smtp-verifier.d.ts} +2 -2
- package/dist/types.d.ts +128 -34
- package/dist/whois.d.ts +3 -3
- package/package.json +19 -19
- package/dist/batch.d.ts +0 -5
- package/dist/dns.d.ts +0 -2
- package/dist/serverless/core.cjs.js.map +0 -1
- package/dist/serverless/core.esm.js.map +0 -1
- /package/dist/serverless/{core.d.ts → verifier.d.ts} +0 -0
- /package/dist/serverless/{core.min.js → verifier.min.js} +0 -0
package/dist/types.d.ts
CHANGED
|
@@ -1,18 +1,18 @@
|
|
|
1
|
-
import type {
|
|
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
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
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)
|
|
@@ -37,7 +37,7 @@ export interface VerificationResult {
|
|
|
37
37
|
/**
|
|
38
38
|
* Parameters for email verification
|
|
39
39
|
*/
|
|
40
|
-
export interface
|
|
40
|
+
export interface VerifyEmailParams {
|
|
41
41
|
emailAddress: string;
|
|
42
42
|
timeout?: number;
|
|
43
43
|
verifyMx?: boolean;
|
|
@@ -57,12 +57,12 @@ export interface IVerifyEmailParams {
|
|
|
57
57
|
whoisTimeout?: number;
|
|
58
58
|
skipMxForDisposable?: boolean;
|
|
59
59
|
skipDomainWhoisForDisposable?: boolean;
|
|
60
|
-
cache?:
|
|
60
|
+
cache?: Cache;
|
|
61
61
|
}
|
|
62
62
|
/**
|
|
63
63
|
* Parameters for batch verification
|
|
64
64
|
*/
|
|
65
|
-
export interface
|
|
65
|
+
export interface BatchVerifyParams {
|
|
66
66
|
emailAddresses: string[];
|
|
67
67
|
concurrency?: number;
|
|
68
68
|
timeout?: number;
|
|
@@ -77,7 +77,91 @@ export interface IBatchVerifyParams {
|
|
|
77
77
|
commonDomains?: string[];
|
|
78
78
|
skipMxForDisposable?: boolean;
|
|
79
79
|
skipDomainWhoisForDisposable?: boolean;
|
|
80
|
-
cache?:
|
|
80
|
+
cache?: Cache;
|
|
81
|
+
}
|
|
82
|
+
/**
|
|
83
|
+
* Rich cache result types for storing detailed verification results
|
|
84
|
+
*/
|
|
85
|
+
/**
|
|
86
|
+
* Result for disposable email detection with metadata
|
|
87
|
+
*/
|
|
88
|
+
export interface DisposableEmailResult {
|
|
89
|
+
/** Whether the email/domain is disposable */
|
|
90
|
+
isDisposable: boolean;
|
|
91
|
+
/** Source that identified this as disposable (e.g., list name, service) */
|
|
92
|
+
source?: string;
|
|
93
|
+
/** Category of disposable email (e.g., 'temp', 'alias', 'forwarding') */
|
|
94
|
+
category?: string;
|
|
95
|
+
/** Timestamp when this was checked */
|
|
96
|
+
checkedAt: number;
|
|
97
|
+
}
|
|
98
|
+
/**
|
|
99
|
+
* Result for free email provider detection with metadata
|
|
100
|
+
*/
|
|
101
|
+
export interface FreeEmailResult {
|
|
102
|
+
/** Whether the email/domain is from a free provider */
|
|
103
|
+
isFree: boolean;
|
|
104
|
+
/** Name of the free provider (e.g., 'gmail', 'yahoo', 'outlook') */
|
|
105
|
+
provider?: string;
|
|
106
|
+
/** Timestamp when this was checked */
|
|
107
|
+
checkedAt: number;
|
|
108
|
+
}
|
|
109
|
+
/**
|
|
110
|
+
* Result for domain validation with metadata
|
|
111
|
+
*/
|
|
112
|
+
export interface DomainValidResult {
|
|
113
|
+
/** Whether the domain is valid */
|
|
114
|
+
isValid: boolean;
|
|
115
|
+
/** Whether MX records were found */
|
|
116
|
+
hasMX: boolean;
|
|
117
|
+
/** The MX records that were found */
|
|
118
|
+
mxRecords?: string[];
|
|
119
|
+
/** Timestamp when this was checked */
|
|
120
|
+
checkedAt: number;
|
|
121
|
+
}
|
|
122
|
+
/**
|
|
123
|
+
* Email providers enum
|
|
124
|
+
*/
|
|
125
|
+
export declare enum EmailProvider {
|
|
126
|
+
gmail = "gmail",
|
|
127
|
+
hotmailB2b = "hotmail_b2b",
|
|
128
|
+
hotmailB2c = "hotmail_b2c",
|
|
129
|
+
proofpoint = "proofpoint",
|
|
130
|
+
mimecast = "mimecast",
|
|
131
|
+
yahoo = "yahoo",
|
|
132
|
+
everythingElse = "everything_else"
|
|
133
|
+
}
|
|
134
|
+
/**
|
|
135
|
+
* Result for SMTP verification with metadata
|
|
136
|
+
* Uses camelCase for consistency with TypeScript conventions
|
|
137
|
+
*/
|
|
138
|
+
export interface SmtpVerificationResult {
|
|
139
|
+
/** Whether SMTP connection was successful */
|
|
140
|
+
canConnectSmtp: boolean;
|
|
141
|
+
/** Whether the mailbox is full */
|
|
142
|
+
hasFullInbox: boolean;
|
|
143
|
+
/** Whether the domain has catch-all enabled */
|
|
144
|
+
isCatchAll: boolean;
|
|
145
|
+
/** Whether the email is deliverable */
|
|
146
|
+
isDeliverable: boolean;
|
|
147
|
+
/** Whether the email/account is disabled */
|
|
148
|
+
isDisabled: boolean;
|
|
149
|
+
/** Error message if verification failed */
|
|
150
|
+
error?: string;
|
|
151
|
+
/** Which provider was detected/used */
|
|
152
|
+
providerUsed?: EmailProvider;
|
|
153
|
+
/** Additional compatibility properties */
|
|
154
|
+
success?: boolean;
|
|
155
|
+
canConnect?: boolean;
|
|
156
|
+
responseCode?: number;
|
|
157
|
+
/** Provider-specific error details */
|
|
158
|
+
providerSpecific?: {
|
|
159
|
+
errorCode?: string;
|
|
160
|
+
actionRequired?: string;
|
|
161
|
+
details?: string;
|
|
162
|
+
};
|
|
163
|
+
/** Timestamp when this was checked (for cache) */
|
|
164
|
+
checkedAt?: number;
|
|
81
165
|
}
|
|
82
166
|
/**
|
|
83
167
|
* Result for batch verification
|
|
@@ -92,6 +176,16 @@ export interface BatchVerificationResult {
|
|
|
92
176
|
processingTime: number;
|
|
93
177
|
};
|
|
94
178
|
}
|
|
179
|
+
/**
|
|
180
|
+
* Parse SMTP error message to determine error type
|
|
181
|
+
* Handles both SMTP protocol errors and system/network errors
|
|
182
|
+
*/
|
|
183
|
+
export declare function parseSmtpError(errorMessage: string): {
|
|
184
|
+
isDisabled: boolean;
|
|
185
|
+
hasFullInbox: boolean;
|
|
186
|
+
isInvalid: boolean;
|
|
187
|
+
isCatchAll: boolean;
|
|
188
|
+
};
|
|
95
189
|
/**
|
|
96
190
|
* Port configuration for SMTP verification
|
|
97
191
|
*/
|
|
@@ -111,14 +205,14 @@ export interface SMTPTLSConfig {
|
|
|
111
205
|
* SMTP protocol steps enum
|
|
112
206
|
*/
|
|
113
207
|
export declare enum SMTPStep {
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
208
|
+
greeting = "GREETING",
|
|
209
|
+
ehlo = "EHLO",
|
|
210
|
+
helo = "HELO",
|
|
211
|
+
startTls = "STARTTLS",
|
|
212
|
+
mailFrom = "MAIL_FROM",
|
|
213
|
+
rcptTo = "RCPT_TO",
|
|
214
|
+
vrfy = "VRFY",
|
|
215
|
+
quit = "QUIT"
|
|
122
216
|
}
|
|
123
217
|
/**
|
|
124
218
|
* Custom SMTP sequence configuration
|
|
@@ -138,7 +232,7 @@ export interface SMTPVerifyOptions {
|
|
|
138
232
|
tls?: boolean | SMTPTLSConfig;
|
|
139
233
|
hostname?: string;
|
|
140
234
|
useVRFY?: boolean;
|
|
141
|
-
cache?:
|
|
235
|
+
cache?: Cache | null;
|
|
142
236
|
debug?: boolean;
|
|
143
237
|
sequence?: SMTPSequence;
|
|
144
238
|
}
|
|
@@ -182,11 +276,11 @@ export type DomainSuggestionMethod = (domain: string) => DomainSuggestion | null
|
|
|
182
276
|
/**
|
|
183
277
|
* Parameters for domain suggestion
|
|
184
278
|
*/
|
|
185
|
-
export interface
|
|
279
|
+
export interface DomainSuggestionParams {
|
|
186
280
|
domain: string;
|
|
187
281
|
customMethod?: DomainSuggestionMethod;
|
|
188
282
|
commonDomains?: string[];
|
|
189
|
-
cache?:
|
|
283
|
+
cache?: Cache;
|
|
190
284
|
}
|
|
191
285
|
/**
|
|
192
286
|
* Result of name detection from email
|
|
@@ -203,7 +297,7 @@ export type NameDetectionMethod = (email: string) => DetectedName | null;
|
|
|
203
297
|
/**
|
|
204
298
|
* Parameters for name detection
|
|
205
299
|
*/
|
|
206
|
-
export interface
|
|
300
|
+
export interface NameDetectionParams {
|
|
207
301
|
email: string;
|
|
208
302
|
customMethod?: NameDetectionMethod;
|
|
209
303
|
}
|
|
@@ -257,25 +351,25 @@ export interface DomainSuggesterOptions {
|
|
|
257
351
|
/**
|
|
258
352
|
* Parameters for isDisposableEmail function
|
|
259
353
|
*/
|
|
260
|
-
export interface
|
|
354
|
+
export interface DisposableEmailCheckParams {
|
|
261
355
|
emailOrDomain: string;
|
|
262
|
-
cache?:
|
|
356
|
+
cache?: Cache | null;
|
|
263
357
|
logger?: (...args: unknown[]) => void;
|
|
264
358
|
}
|
|
265
359
|
/**
|
|
266
360
|
* Parameters for isFreeEmail function
|
|
267
361
|
*/
|
|
268
|
-
export interface
|
|
362
|
+
export interface FreeEmailCheckParams {
|
|
269
363
|
emailOrDomain: string;
|
|
270
|
-
cache?:
|
|
364
|
+
cache?: Cache | null;
|
|
271
365
|
logger?: (...args: unknown[]) => void;
|
|
272
366
|
}
|
|
273
367
|
/**
|
|
274
368
|
* Parameters for resolveMxRecords function
|
|
275
369
|
*/
|
|
276
|
-
export interface
|
|
370
|
+
export interface ResolveMxParams {
|
|
277
371
|
domain: string;
|
|
278
|
-
cache?:
|
|
372
|
+
cache?: Cache | null;
|
|
279
373
|
logger?: (...args: unknown[]) => void;
|
|
280
374
|
}
|
|
281
375
|
/**
|
|
@@ -322,4 +416,4 @@ export interface EmailValidationResult {
|
|
|
322
416
|
export interface ValidatorResult {
|
|
323
417
|
valid: boolean;
|
|
324
418
|
}
|
|
325
|
-
export type {
|
|
419
|
+
export type { Cache, CacheStore } from './cache-interface';
|
package/dist/whois.d.ts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import type {
|
|
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?:
|
|
4
|
-
export declare function getDomainRegistrationStatus(domain: string, timeout?: number, debug?: boolean, cache?:
|
|
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.
|
|
3
|
+
"version": "3.0.1-beta.1",
|
|
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/
|
|
42
|
-
"require": "./dist/serverless/
|
|
43
|
-
"import": "./dist/serverless/
|
|
44
|
-
"types": "./dist/serverless/
|
|
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.
|
|
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.
|
|
107
|
+
"@types/node": "25.0.3",
|
|
108
108
|
"@types/sinon": "21.0.0",
|
|
109
|
-
"esbuild": "^0.27.
|
|
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.
|
|
113
|
+
"rollup": "^4.54.0",
|
|
114
114
|
"rollup-plugin-esbuild": "^6.2.1",
|
|
115
|
-
"sinon": "21.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
package/dist/dns.d.ts
DELETED
|
@@ -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
|
|
File without changes
|