@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.
- 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 +471 -236
- package/dist/index.esm.js.map +1 -1
- package/dist/index.js +474 -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 +138 -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)
|
|
@@ -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
|
|
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?:
|
|
70
|
+
cache?: Cache;
|
|
61
71
|
}
|
|
62
72
|
/**
|
|
63
73
|
* Parameters for batch verification
|
|
64
74
|
*/
|
|
65
|
-
export interface
|
|
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?:
|
|
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
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
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?:
|
|
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
|
|
289
|
+
export interface DomainSuggestionParams {
|
|
186
290
|
domain: string;
|
|
187
291
|
customMethod?: DomainSuggestionMethod;
|
|
188
292
|
commonDomains?: string[];
|
|
189
|
-
cache?:
|
|
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
|
|
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
|
|
364
|
+
export interface DisposableEmailCheckParams {
|
|
261
365
|
emailOrDomain: string;
|
|
262
|
-
cache?:
|
|
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
|
|
372
|
+
export interface FreeEmailCheckParams {
|
|
269
373
|
emailOrDomain: string;
|
|
270
|
-
cache?:
|
|
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
|
|
380
|
+
export interface ResolveMxParams {
|
|
277
381
|
domain: string;
|
|
278
|
-
cache?:
|
|
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 {
|
|
429
|
+
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.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/
|
|
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":";;;;;;;;EACA,MAAM,CAAC,cAAc,CAAAA,SAAA,EAAU,YAAY,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC;AAC7D,EAAAA,SAAA,CAAA,gBAAA,GAA2B,MAAM;AACjC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;EACA,IAAI,gBAAgB,GAAG,UAAU,IAAI,EAAE,IAAI,EAAE,eAAe,EAAE,aAAa,EAAE;MACzE,IAAI,eAAe,KAAK,MAAM,EAAE,EAAE,eAAe,GAAG,CAAC,CAAC,CAAA;MACtD,IAAI,aAAa,KAAK,MAAM,EAAE,EAAE,aAAa,GAAG,KAAK,CAAC,CAAA;MACtD,IAAI,CAAC,aAAa,EAAE;AACxB,UAAQ,IAAI,GAAG,IAAI,CAAC,WAAW,EAAE;AACjC,UAAQ,IAAI,GAAG,IAAI,CAAC,WAAW,EAAE;AACjC,MAAA;MACI,IAAI,IAAI,CAAC,MAAM,GAAG,eAAe,IAAI,IAAI,CAAC,MAAM,GAAG,eAAe;AACtE,UAAQ,OAAO,CAAC;AAChB,MAAI,IAAI,GAAG,GAAG,IAAI,GAAG,EAAE;AACvB,MAAI,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,MAAM,IAAI,eAAe,GAAG,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE;UAC1D,IAAI,OAAO,GAAG,IAAI,CAAC,MAAM,CAAC,CAAC,EAAE,eAAe,CAAC;UAC7C,GAAG,CAAC,GAAG,CAAC,OAAO,EAAE,GAAG,CAAC,GAAG,CAAC,OAAO,CAAC,GAAG,GAAG,CAAC,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;AACrE,MAAA;MACI,IAAI,KAAK,GAAG,CAAC;AACjB,MAAI,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,MAAM,IAAI,eAAe,GAAG,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE;UAC1D,IAAI,OAAO,GAAG,IAAI,CAAC,MAAM,CAAC,CAAC,EAAE,eAAe,CAAC;AACrD,UAAQ,IAAI,KAAK,GAAG,GAAG,CAAC,GAAG,CAAC,OAAO,CAAC,GAAG,GAAG,CAAC,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC;AAC3D,UAAQ,IAAI,KAAK,GAAG,CAAC,EAAE;cACX,GAAG,CAAC,GAAG,CAAC,OAAO,EAAE,KAAK,GAAG,CAAC,CAAC;AACvC,cAAY,KAAK,EAAE;AACnB,UAAA;AACA,MAAA;MACI,OAAO,CAAC,KAAK,GAAG,CAAC,KAAK,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC,MAAM,IAAI,CAAC,eAAe,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC;EAClF,CAAC;AACD,EAAAA,SAAA,CAAA,gBAAA,GAA2B,gBAAgB;EAC3CA,SAAA,CAAA,OAAA,GAAkBA,SAAO,CAAC,gBAAgB;AAC1C;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;ACxBO,MAAM,SAAA,CAAa;AAAA,EAKxB,WAAA,CAAY,OAAA,GAAU,GAAA,EAAM,GAAA,GAAM,IAAA,EAAS;AAJ3C,IAAA,IAAA,CAAQ,KAAA,uBAAY,GAAA,EAA2C;AAK7D,IAAA,IAAA,CAAK,OAAA,GAAU,OAAA;AACf,IAAA,IAAA,CAAK,GAAA,GAAM,GAAA;AAAA,EACb;AAAA,EAEA,IAAI,GAAA,EAA4B;AAC9B,IAAA,MAAM,IAAA,GAAO,IAAA,CAAK,KAAA,CAAM,GAAA,CAAI,GAAG,CAAA;AAC/B,IAAA,IAAI,CAAC,MAAM,OAAO,MAAA;AAClB,IAAA,IAAI,IAAA,CAAK,GAAA,EAAI,GAAI,IAAA,CAAK,OAAA,EAAS;AAC7B,MAAA,IAAA,CAAK,KAAA,CAAM,OAAO,GAAG,CAAA;AACrB,MAAA,OAAO,MAAA;AAAA,IACT;AACA,IAAA,OAAO,IAAA,CAAK,KAAA;AAAA,EACd;AAAA,EAEA,GAAA,CAAI,KAAa,KAAA,EAAgB;AAC/B,IAAA,IAAI,IAAA,CAAK,KAAA,CAAM,IAAA,IAAQ,IAAA,CAAK,OAAA,EAAS;AAEnC,MAAA,MAAM,eAAA,GAAkB,KAAK,GAAA,CAAI,CAAA,EAAG,KAAK,KAAA,CAAM,IAAA,CAAK,OAAA,GAAU,GAAG,CAAC,CAAA;AAClE,MAAA,MAAM,IAAA,GAAO,KAAA,CAAM,IAAA,CAAK,IAAA,CAAK,KAAA,CAAM,MAAM,CAAA,CAAE,KAAA,CAAM,CAAA,EAAG,eAAe,CAAA;AACnE,MAAA,IAAA,CAAK,QAAQ,CAACC,IAAAA,KAAQ,KAAK,KAAA,CAAM,MAAA,CAAOA,IAAG,CAAC,CAAA;AAAA,IAC9C;AACA,IAAA,IAAA,CAAK,KAAA,CAAM,IAAI,GAAA,EAAK;AAAA,MAClB,KAAA;AAAA,MACA,OAAA,EAAS,IAAA,CAAK,GAAA,EAAI,GAAI,IAAA,CAAK;AAAA,KAC5B,CAAA;AAAA,EACH;AAAA,EAEA,KAAA,GAAc;AACZ,IAAA,IAAA,CAAK,MAAM,KAAA,EAAM;AAAA,EACnB;AAAA,EAEA,IAAA,GAAe;AACb,IAAA,OAAO,KAAK,KAAA,CAAM,IAAA;AAAA,EACpB;AACF;AAGO,MAAM,eAAA,GAAkB,IAAI,SAAA,CAAiC,GAAI;AACjE,MAAM,OAAA,GAAU,IAAI,SAAA,CAAoB,GAAG;AAGlD,MAAM,iBAAA,GACJ,sJAAA;AAGK,MAAM,cAAA,GAAiB;AAAA,EAC5B,WAAA;AAAA,EACA,WAAA;AAAA,EACA,aAAA;AAAA,EACA,aAAA;AAAA,EACA,YAAA;AAAA,EACA,SAAA;AAAA,EACA,SAAA;AAAA,EACA,UAAA;AAAA,EACA,WAAA;AAAA,EACA,gBAAA;AAAA,EACA,UAAA;AAAA,EACA,UAAA;AAAA,EACA,SAAA;AAAA,EACA,cAAA;AAAA,EACA,cAAA;AAAA,EACA,QAAA;AAAA,EACA,SAAA;AAAA,EACA,SAAA;AAAA,EACA,UAAA;AAAA,EACA,aAAA;AAAA,EACA,YAAA;AAAA,EACA,SAAA;AAAA,EACA,YAAA;AAAA,EACA,QAAA;AAAA,EACA,QAAA;AAAA,EACA,aAAA;AAAA,EACA,WAAA;AAAA,EACA,YAAA;AAAA,EACA,SAAA;AAAA,EACA,QAAA;AAAA,EACA,aAAA;AAAA,EACA,WAAA;AAAA,EACA,aAAA;AAAA,EACA,UAAA;AAAA,EACA,QAAA;AAAA,EACA,QAAA;AAAA,EACA,gBAAA;AAAA,EACA,iBAAA;AAAA,EACA,SAAA;AAAA,EACA,cAAA;AAAA,EACA,YAAA;AAAA,EACA,SAAA;AAAA,EACA,cAAA;AAAA,EACA,eAAA;AAAA,EACA,aAAA;AAAA,EACA,SAAA;AAAA,EACA,eAAA;AAAA,EACA,aAAA;AAAA,EACA,eAAA;AAAA,EACA,aAAA;AAAA,EACA,SAAA;AAAA,EACA,eAAA;AAAA,EACA,QAAA;AAAA,EACA,SAAA;AAAA,EACA;AACF;AAGA,MAAM,aAAA,GAAgB;AAAA;AAAA,EAEpB,EAAE,OAAA,EAAS,cAAA,EAAgB,WAAA,EAAa,WAAA,EAAY;AAAA,EACpD,EAAE,OAAA,EAAS,aAAA,EAAe,WAAA,EAAa,WAAA,EAAY;AAAA,EACnD,EAAE,OAAA,EAAS,aAAA,EAAe,WAAA,EAAa,WAAA,EAAY;AAAA,EACnD,EAAE,OAAA,EAAS,aAAA,EAAe,WAAA,EAAa,WAAA,EAAY;AAAA,EACnD,EAAE,OAAA,EAAS,cAAA,EAAgB,WAAA,EAAa,WAAA,EAAY;AAAA,EACpD,EAAE,OAAA,EAAS,aAAA,EAAe,WAAA,EAAa,WAAA,EAAY;AAAA,EACnD,EAAE,OAAA,EAAS,aAAA,EAAe,WAAA,EAAa,WAAA,EAAY;AAAA,EACnD,EAAE,OAAA,EAAS,cAAA,EAAgB,WAAA,EAAa,WAAA,EAAY;AAAA;AAAA,EAGpD,EAAE,OAAA,EAAS,eAAA,EAAiB,WAAA,EAAa,WAAA,EAAY;AAAA,EACrD,EAAE,OAAA,EAAS,aAAA,EAAe,WAAA,EAAa,WAAA,EAAY;AAAA,EACnD,EAAE,OAAA,EAAS,aAAA,EAAe,WAAA,EAAa,WAAA,EAAY;AAAA,EACnD,EAAE,OAAA,EAAS,aAAA,EAAe,WAAA,EAAa,WAAA,EAAY;AAAA,EACnD,EAAE,OAAA,EAAS,cAAA,EAAgB,WAAA,EAAa,WAAA,EAAY;AAAA;AAAA,EAGpD,EAAE,OAAA,EAAS,gBAAA,EAAkB,WAAA,EAAa,aAAA,EAAc;AAAA,EACxD,EAAE,OAAA,EAAS,eAAA,EAAiB,WAAA,EAAa,aAAA,EAAc;AAAA,EACvD,EAAE,OAAA,EAAS,eAAA,EAAiB,WAAA,EAAa,aAAA,EAAc;AAAA,EACvD,EAAE,OAAA,EAAS,eAAA,EAAiB,WAAA,EAAa,aAAA,EAAc;AAAA,EACvD,EAAE,OAAA,EAAS,gBAAA,EAAkB,WAAA,EAAa,aAAA,EAAc;AAAA;AAAA,EAGxD,EAAE,OAAA,EAAS,eAAA,EAAiB,WAAA,EAAa,aAAA,EAAc;AAAA,EACvD,EAAE,OAAA,EAAS,eAAA,EAAiB,WAAA,EAAa,aAAA,EAAc;AAAA,EACvD,EAAE,OAAA,EAAS,eAAA,EAAiB,WAAA,EAAa,aAAA,EAAc;AAAA,EACvD,EAAE,OAAA,EAAS,gBAAA,EAAkB,WAAA,EAAa,aAAA,EAAc;AAAA;AAAA,EAGxD,EAAE,OAAA,EAAS,cAAA,EAAgB,WAAA,EAAa,YAAA,EAAa;AAAA,EACrD,EAAE,OAAA,EAAS,cAAA,EAAgB,WAAA,EAAa,YAAA,EAAa;AAAA,EACrD,EAAE,OAAA,EAAS,cAAA,EAAgB,WAAA,EAAa,YAAA;AAC1C,CAAA;AAUO,MAAM,eAAA,CAAuC;AAAA,EAC5C,UAAU,OAAA,EAAyE;AAAA,IAAA,OAAA,OAAA,CAAA,IAAA,EAAA,IAAA,EAAA,aAAA;AAEvF,MAAA,OAAO,EAAC;AAAA,IACV,CAAA,CAAA;AAAA,EAAA;AAAA,EAEM,WAAW,OAAA,EAAoC;AAAA,IAAA,OAAA,OAAA,CAAA,IAAA,EAAA,IAAA,EAAA,aAAA;AACnD,MAAA,OAAO,EAAC;AAAA,IACV,CAAA,CAAA;AAAA,EAAA;AACF;AAGO,SAAS,aAAA,CAAc,QAAgB,OAAA,EAAiD;AAC7F,EAAA,MAAM,SAAA,GAAA,CAAY,mCAAS,SAAA,KAAa,CAAA;AACxC,EAAA,MAAM,OAAA,GAAA,CAAU,mCAAS,aAAA,KAAiB,cAAA;AAG1C,EAAA,KAAA,MAAW,EAAE,OAAA,EAAS,WAAA,EAAY,IAAK,aAAA,EAAe;AACpD,IAAA,IAAI,OAAA,CAAQ,IAAA,CAAK,MAAM,CAAA,EAAG;AACxB,MAAA,OAAO,WAAA;AAAA,IACT;AAAA,EACF;AAGA,EAAA,IAAI,OAAA,CAAQ,QAAA,CAAS,MAAM,CAAA,EAAG;AAC5B,IAAA,OAAO,IAAA;AAAA,EACT;AAGA,EAAA,IAAI,WAAA,GAAc,QAAA;AAClB,EAAA,IAAI,UAAA,GAA4B,IAAA;AAEhC,EAAA,KAAA,MAAW,gBAAgB,OAAA,EAAS;AAElC,IAAA,IAAI,MAAA,CAAO,WAAA,EAAY,KAAM,YAAA,CAAa,aAAY,EAAG;AACvD,MAAA,OAAO,IAAA;AAAA,IACT;AAGA,IAAA,MAAM,aAAaC,wCAAA,CAAiB,MAAA,CAAO,aAAY,EAAG,YAAA,CAAa,aAAa,CAAA;AACpF,IAAA,MAAM,QAAA,GAAW,IAAA,CAAK,KAAA,CAAA,CAAO,CAAA,GAAI,UAAA,IAAc,IAAA,CAAK,GAAA,CAAI,MAAA,CAAO,MAAA,EAAQ,YAAA,CAAa,MAAM,CAAC,CAAA;AAC3F,IAAA,IAAI,QAAA,GAAW,CAAA,IAAK,QAAA,IAAY,SAAA,IAAa,WAAW,WAAA,EAAa;AACnE,MAAA,WAAA,GAAc,QAAA;AACd,MAAA,UAAA,GAAa,YAAA;AAAA,IACf;AAAA,EACF;AAEA,EAAA,OAAO,UAAA;AACT;AAGA,SAAsB,iBAAA,CACpB,OACA,OAAA,EACgC;AAAA,EAAA,OAAA,OAAA,CAAA,IAAA,EAAA,IAAA,EAAA,aAAA;AAChC,IAAA,MAAM,eAAA,GAAkB,KAAA,CAAM,WAAA,EAAY,CAAE,IAAA,EAAK;AAGjD,IAAA,IAAI,EAAC,mCAAS,SAAA,CAAA,EAAW;AACvB,MAAA,MAAM,MAAA,GAAS,eAAA,CAAgB,GAAA,CAAI,eAAe,CAAA;AAClD,MAAA,IAAI,QAAQ,OAAO,MAAA;AAAA,IACrB;AAEA,IAAA,MAAM,MAAA,GAAgC;AAAA,MACpC,KAAA,EAAO,KAAA;AAAA,MACP,KAAA,EAAO,eAAA;AAAA,MACP,YAAY;AAAC,KACf;AAGA,IAAA,IAAA,CAAI,OAAA,IAAA,IAAA,GAAA,MAAA,GAAA,OAAA,CAAS,oBAAmB,KAAA,EAAO;AACrC,MAAA,MAAM,WAAA,GAAc,iBAAA,CAAkB,IAAA,CAAK,eAAe,CAAA;AAC1D,MAAA,MAAA,CAAO,UAAA,CAAW,MAAA,GAAS,EAAE,KAAA,EAAO,WAAA,EAAY;AAChD,MAAA,IAAI,CAAC,WAAA,EAAa;AAChB,QAAA,eAAA,CAAgB,GAAA,CAAI,iBAAiB,MAAM,CAAA;AAC3C,QAAA,OAAO,MAAA;AAAA,MACT;AAAA,IACF;AAEA,IAAA,MAAM,CAAC,KAAA,EAAO,MAAM,CAAA,GAAI,eAAA,CAAgB,MAAM,GAAG,CAAA;AACjD,IAAA,MAAA,CAAO,KAAA,GAAQ,KAAA;AACf,IAAA,MAAA,CAAO,MAAA,GAAS,MAAA;AAGhB,IAAA,IAAA,CAAI,OAAA,IAAA,IAAA,GAAA,MAAA,GAAA,OAAA,CAAS,kBAAiB,KAAA,EAAO;AACnC,MAAA,MAAM,UAAA,GAAa,aAAA,CAAc,MAAA,EAAQ,OAAA,IAAA,IAAA,GAAA,MAAA,GAAA,OAAA,CAAS,sBAAsB,CAAA;AACxE,MAAA,MAAA,CAAO,WAAW,IAAA,GAAO;AAAA,QACvB,OAAO,CAAC,UAAA;AAAA,QACR,YAAY,UAAA,IAAc;AAAA,OAC5B;AAAA,IACF;AAGA,IAAA,IAAA,CAAI,OAAA,IAAA,IAAA,GAAA,MAAA,GAAA,OAAA,CAAS,wBAAuB,KAAA,EAAO;AACzC,MAAA,MAAM,YAAA,GAAe,mBAAA,CAAoB,QAAA,CAAS,MAAM,CAAA;AACxD,MAAA,MAAA,CAAO,UAAA,CAAW,UAAA,GAAa,EAAE,KAAA,EAAO,CAAC,YAAA,EAAa;AAAA,IACxD;AAGA,IAAA,IAAA,CAAI,OAAA,IAAA,IAAA,GAAA,MAAA,GAAA,OAAA,CAAS,kBAAiB,KAAA,EAAO;AACnC,MAAA,MAAM,MAAA,GAAS,aAAA,CAAc,QAAA,CAAS,MAAM,CAAA;AAC5C,MAAA,MAAA,CAAO,UAAA,CAAW,IAAA,GAAO,EAAE,KAAA,EAAO,CAAC,MAAA,EAAO;AAAA,IAC5C;AAGA,IAAA,IAAA,CAAI,OAAA,IAAA,IAAA,GAAA,MAAA,GAAA,OAAA,CAAS,UAAA,KAAc,OAAA,CAAQ,WAAA,EAAa;AAC9C,MAAA,IAAI;AACF,QAAA,MAAM,SAAA,GAAY,MAAM,OAAA,CAAQ,WAAA,CAAY,UAAU,MAAM,CAAA;AAC5D,QAAA,MAAM,KAAA,GAAQ,SAAA,IAAa,SAAA,CAAU,MAAA,GAAS,CAAA;AAC9C,QAAA,MAAA,CAAO,WAAW,EAAA,GAAK;AAAA,UACrB,KAAA,EAAO,KAAA;AAAA,UACP,OAAA,EAAS,QAAQ,SAAA,CAAU,GAAA,CAAI,CAAC,CAAA,KAAM,CAAA,CAAE,QAAQ,CAAA,GAAI,KAAA;AAAA,SACtD;AAAA,MACF,SAAS,KAAA,EAAO;AACd,QAAA,MAAA,CAAO,WAAW,EAAA,GAAK;AAAA,UACrB,KAAA,EAAO,KAAA;AAAA,UACP,KAAA,EAAO,KAAA,YAAiB,KAAA,GAAQ,KAAA,CAAM,OAAA,GAAU;AAAA,SAClD;AAAA,MACF;AAAA,IACF;AAIA,IAAA,MAAM,kBAAA,GAAqB,CAAC,QAAA,EAAU,MAAA,EAAQ,cAAc,IAAI,CAAA;AAChE,IAAA,MAAA,CAAO,KAAA,GAAQ,kBAAA,CAAmB,KAAA,CAAM,CAAC,GAAA,KAAQ;AAC/C,MAAA,MAAM,SAAA,GAAY,MAAA,CAAO,UAAA,CAAW,GAAqC,CAAA;AACzE,MAAA,OAAO,CAAC,SAAA,IAAa,SAAA,CAAU,KAAA,KAAU,KAAA;AAAA,IAC3C,CAAC,CAAA;AAGD,IAAA,IAAI,EAAC,mCAAS,SAAA,CAAA,EAAW;AACvB,MAAA,eAAA,CAAgB,GAAA,CAAI,iBAAiB,MAAM,CAAA;AAAA,IAC7C;AAEA,IAAA,OAAO,MAAA;AAAA,EACT,CAAA,CAAA;AAAA;AAGA,SAAsB,kBAAA,CACpB,QACA,OAAA,EACkC;AAAA,EAAA,OAAA,OAAA,CAAA,IAAA,EAAA,IAAA,EAAA,aAAA;AAElC,IAAA,MAAM,SAAA,GAAA,CAAY,mCAAS,SAAA,KAAa,EAAA;AACxC,IAAA,MAAM,UAAmC,EAAC;AAE1C,IAAA,KAAA,IAAS,IAAI,CAAA,EAAG,CAAA,GAAI,MAAA,CAAO,MAAA,EAAQ,KAAK,SAAA,EAAW;AACjD,MAAA,MAAM,KAAA,GAAQ,MAAA,CAAO,KAAA,CAAM,CAAA,EAAG,IAAI,SAAS,CAAA;AAC3C,MAAA,MAAM,YAAA,GAAe,MAAM,OAAA,CAAQ,GAAA,CAAI,KAAA,CAAM,GAAA,CAAI,CAAC,KAAA,KAAU,iBAAA,CAAkB,KAAA,EAAO,OAAO,CAAC,CAAC,CAAA;AAC9F,MAAA,OAAA,CAAQ,IAAA,CAAK,GAAG,YAAY,CAAA;AAAA,IAC9B;AAEA,IAAA,OAAO,OAAA;AAAA,EACT,CAAA,CAAA;AAAA;AAGO,SAAS,UAAA,GAAmB;AACjC,EAAA,eAAA,CAAgB,KAAA,EAAM;AACtB,EAAA,OAAA,CAAQ,KAAA,EAAM;AAChB;;;;","x_google_ignoreList":[0]}
|
|
File without changes
|
|
File without changes
|