tempmail-sdk 1.0.2 → 1.0.3
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/dist/index.d.ts +94 -1
- package/dist/index.js +150 -36
- package/dist/logger.d.ts +73 -0
- package/dist/logger.js +100 -0
- package/dist/normalize.d.ts +7 -0
- package/dist/normalize.js +47 -2
- package/dist/providers/mail-tm.js +8 -3
- package/dist/providers/temp-mail-io.js +54 -24
- package/dist/retry.d.ts +38 -0
- package/dist/retry.js +121 -0
- package/dist/types.d.ts +87 -0
- package/dist/types.js +1 -1
- package/package.json +1 -1
- package/src/index.ts +148 -41
- package/src/logger.ts +106 -0
- package/src/normalize.ts +46 -1
- package/src/providers/mail-tm.ts +7 -2
- package/src/providers/temp-mail-io.ts +55 -23
- package/src/retry.ts +146 -0
- package/src/types.ts +88 -0
package/dist/index.d.ts
CHANGED
|
@@ -1,25 +1,118 @@
|
|
|
1
1
|
import { Channel, EmailInfo, GetEmailsResult, GenerateEmailOptions, GetEmailsOptions } from './types';
|
|
2
2
|
export { Channel, EmailInfo, Email, EmailAttachment, GetEmailsResult, GenerateEmailOptions, GetEmailsOptions } from './types';
|
|
3
3
|
export { normalizeEmail } from './normalize';
|
|
4
|
+
export { withRetry, fetchWithTimeout, RetryOptions } from './retry';
|
|
5
|
+
export { LogLevel, LogHandler, setLogLevel, getLogLevel, setLogger, logger } from './logger';
|
|
6
|
+
/**
|
|
7
|
+
* 渠道信息,包含渠道标识、显示名称和对应网站
|
|
8
|
+
*/
|
|
4
9
|
export interface ChannelInfo {
|
|
10
|
+
/** 渠道标识 */
|
|
5
11
|
channel: Channel;
|
|
12
|
+
/** 渠道显示名称 */
|
|
6
13
|
name: string;
|
|
14
|
+
/** 对应的临时邮箱服务网站 */
|
|
7
15
|
website: string;
|
|
8
16
|
}
|
|
9
17
|
/**
|
|
10
18
|
* 获取所有支持的渠道列表
|
|
19
|
+
*
|
|
20
|
+
* @returns 所有渠道的信息数组
|
|
21
|
+
*
|
|
22
|
+
* @example
|
|
23
|
+
* ```ts
|
|
24
|
+
* const channels = listChannels();
|
|
25
|
+
* channels.forEach(ch => console.log(`${ch.name} (${ch.website})`));
|
|
26
|
+
* ```
|
|
11
27
|
*/
|
|
12
28
|
export declare function listChannels(): ChannelInfo[];
|
|
13
29
|
/**
|
|
14
|
-
*
|
|
30
|
+
* 获取指定渠道的详细信息
|
|
31
|
+
*
|
|
32
|
+
* @param channel - 渠道标识
|
|
33
|
+
* @returns 渠道信息,不存在时返回 undefined
|
|
15
34
|
*/
|
|
16
35
|
export declare function getChannelInfo(channel: Channel): ChannelInfo | undefined;
|
|
36
|
+
/**
|
|
37
|
+
* 创建临时邮箱
|
|
38
|
+
*
|
|
39
|
+
* 错误处理策略:
|
|
40
|
+
* - 网络错误、超时、服务端 5xx 错误 → 自动重试(默认 2 次,指数退避)
|
|
41
|
+
* - 4xx 客户端错误、参数错误 → 直接抛出异常
|
|
42
|
+
*
|
|
43
|
+
* @param options - 创建选项,可指定渠道、有效时长、域名等
|
|
44
|
+
* @returns 邮箱信息,包含地址、令牌等
|
|
45
|
+
* @throws 重试耗尽后仍失败时抛出异常
|
|
46
|
+
*
|
|
47
|
+
* @example
|
|
48
|
+
* ```ts
|
|
49
|
+
* const emailInfo = await generateEmail({ channel: 'temp-mail-io' });
|
|
50
|
+
* console.log(emailInfo.email); // 临时邮箱地址
|
|
51
|
+
* ```
|
|
52
|
+
*/
|
|
17
53
|
export declare function generateEmail(options?: GenerateEmailOptions): Promise<EmailInfo>;
|
|
54
|
+
/**
|
|
55
|
+
* 获取邮件列表
|
|
56
|
+
*
|
|
57
|
+
* 错误处理策略:
|
|
58
|
+
* - 网络错误、超时、服务端 5xx 错误 → 自动重试(默认 2 次)
|
|
59
|
+
* - 重试耗尽后返回 { success: false, emails: [] },不抛异常
|
|
60
|
+
* - 参数校验错误(缺少 channel / token)直接抛出
|
|
61
|
+
*
|
|
62
|
+
* 这种设计让调用方在轮询场景下不会因网络波动而中断整个流程,
|
|
63
|
+
* 只需检查 success 字段即可判断本次请求是否成功。
|
|
64
|
+
*
|
|
65
|
+
* @param options - 获取选项,包含渠道、邮箱地址、令牌
|
|
66
|
+
* @returns 邮件结果,包含 success 标记和邮件列表
|
|
67
|
+
*
|
|
68
|
+
* @example
|
|
69
|
+
* ```ts
|
|
70
|
+
* const result = await getEmails({
|
|
71
|
+
* channel: emailInfo.channel,
|
|
72
|
+
* email: emailInfo.email,
|
|
73
|
+
* token: emailInfo.token,
|
|
74
|
+
* });
|
|
75
|
+
* if (result.success && result.emails.length > 0) {
|
|
76
|
+
* console.log('收到邮件:', result.emails[0].subject);
|
|
77
|
+
* }
|
|
78
|
+
* ```
|
|
79
|
+
*/
|
|
18
80
|
export declare function getEmails(options: GetEmailsOptions): Promise<GetEmailsResult>;
|
|
81
|
+
/**
|
|
82
|
+
* 临时邮箱客户端
|
|
83
|
+
* 封装了邮箱创建和邮件获取的完整流程,自动管理邮箱信息和认证令牌
|
|
84
|
+
*
|
|
85
|
+
* @example
|
|
86
|
+
* ```ts
|
|
87
|
+
* const client = new TempEmailClient();
|
|
88
|
+
* const emailInfo = await client.generate({ channel: 'mail-tm' });
|
|
89
|
+
* console.log('邮箱:', emailInfo.email);
|
|
90
|
+
*
|
|
91
|
+
* // 轮询获取邮件
|
|
92
|
+
* const result = await client.getEmails();
|
|
93
|
+
* if (result.success) {
|
|
94
|
+
* console.log('邮件数:', result.emails.length);
|
|
95
|
+
* }
|
|
96
|
+
* ```
|
|
97
|
+
*/
|
|
19
98
|
export declare class TempEmailClient {
|
|
20
99
|
private emailInfo;
|
|
100
|
+
/**
|
|
101
|
+
* 创建临时邮箱并缓存邮箱信息
|
|
102
|
+
* 后续调用 getEmails() 时自动使用此邮箱的渠道、地址和令牌
|
|
103
|
+
*/
|
|
21
104
|
generate(options?: GenerateEmailOptions): Promise<EmailInfo>;
|
|
105
|
+
/**
|
|
106
|
+
* 获取当前邮箱的邮件列表
|
|
107
|
+
* 必须先调用 generate() 创建邮箱
|
|
108
|
+
*
|
|
109
|
+
* @throws 未调用 generate() 时抛出异常
|
|
110
|
+
*/
|
|
22
111
|
getEmails(): Promise<GetEmailsResult>;
|
|
112
|
+
/**
|
|
113
|
+
* 获取当前缓存的邮箱信息
|
|
114
|
+
* 未调用 generate() 时返回 null
|
|
115
|
+
*/
|
|
23
116
|
getEmailInfo(): EmailInfo | null;
|
|
24
117
|
}
|
|
25
118
|
declare const _default: {
|
package/dist/index.js
CHANGED
|
@@ -33,7 +33,7 @@ var __importStar = (this && this.__importStar) || (function () {
|
|
|
33
33
|
};
|
|
34
34
|
})();
|
|
35
35
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
36
|
-
exports.TempEmailClient = exports.normalizeEmail = void 0;
|
|
36
|
+
exports.TempEmailClient = exports.logger = exports.setLogger = exports.getLogLevel = exports.setLogLevel = exports.LogLevel = exports.fetchWithTimeout = exports.withRetry = exports.normalizeEmail = void 0;
|
|
37
37
|
exports.listChannels = listChannels;
|
|
38
38
|
exports.getChannelInfo = getChannelInfo;
|
|
39
39
|
exports.generateEmail = generateEmail;
|
|
@@ -47,8 +47,20 @@ const tempMailIO = __importStar(require("./providers/temp-mail-io"));
|
|
|
47
47
|
const awamail = __importStar(require("./providers/awamail"));
|
|
48
48
|
const mailTm = __importStar(require("./providers/mail-tm"));
|
|
49
49
|
const dropmail = __importStar(require("./providers/dropmail"));
|
|
50
|
+
const retry_1 = require("./retry");
|
|
51
|
+
const logger_1 = require("./logger");
|
|
50
52
|
var normalize_1 = require("./normalize");
|
|
51
53
|
Object.defineProperty(exports, "normalizeEmail", { enumerable: true, get: function () { return normalize_1.normalizeEmail; } });
|
|
54
|
+
var retry_2 = require("./retry");
|
|
55
|
+
Object.defineProperty(exports, "withRetry", { enumerable: true, get: function () { return retry_2.withRetry; } });
|
|
56
|
+
Object.defineProperty(exports, "fetchWithTimeout", { enumerable: true, get: function () { return retry_2.fetchWithTimeout; } });
|
|
57
|
+
var logger_2 = require("./logger");
|
|
58
|
+
Object.defineProperty(exports, "LogLevel", { enumerable: true, get: function () { return logger_2.LogLevel; } });
|
|
59
|
+
Object.defineProperty(exports, "setLogLevel", { enumerable: true, get: function () { return logger_2.setLogLevel; } });
|
|
60
|
+
Object.defineProperty(exports, "getLogLevel", { enumerable: true, get: function () { return logger_2.getLogLevel; } });
|
|
61
|
+
Object.defineProperty(exports, "setLogger", { enumerable: true, get: function () { return logger_2.setLogger; } });
|
|
62
|
+
Object.defineProperty(exports, "logger", { enumerable: true, get: function () { return logger_2.logger; } });
|
|
63
|
+
/** 渠道名称到 provider 实现的映射表 */
|
|
52
64
|
const providers = {
|
|
53
65
|
'tempmail': tempmail,
|
|
54
66
|
'linshi-email': linshiEmail,
|
|
@@ -60,7 +72,9 @@ const providers = {
|
|
|
60
72
|
'mail-tm': mailTm,
|
|
61
73
|
'dropmail': dropmail,
|
|
62
74
|
};
|
|
75
|
+
/** 所有支持的渠道列表,用于随机选择和遍历 */
|
|
63
76
|
const allChannels = ['tempmail', 'linshi-email', 'tempmail-lol', 'chatgpt-org-uk', 'tempmail-la', 'temp-mail-io', 'awamail', 'mail-tm', 'dropmail'];
|
|
77
|
+
/** 渠道信息映射表 */
|
|
64
78
|
const channelInfoMap = {
|
|
65
79
|
'tempmail': { channel: 'tempmail', name: 'TempMail', website: 'tempmail.ing' },
|
|
66
80
|
'linshi-email': { channel: 'linshi-email', name: '临时邮箱', website: 'linshi-email.com' },
|
|
@@ -74,18 +88,56 @@ const channelInfoMap = {
|
|
|
74
88
|
};
|
|
75
89
|
/**
|
|
76
90
|
* 获取所有支持的渠道列表
|
|
91
|
+
*
|
|
92
|
+
* @returns 所有渠道的信息数组
|
|
93
|
+
*
|
|
94
|
+
* @example
|
|
95
|
+
* ```ts
|
|
96
|
+
* const channels = listChannels();
|
|
97
|
+
* channels.forEach(ch => console.log(`${ch.name} (${ch.website})`));
|
|
98
|
+
* ```
|
|
77
99
|
*/
|
|
78
100
|
function listChannels() {
|
|
79
101
|
return allChannels.map(ch => channelInfoMap[ch]);
|
|
80
102
|
}
|
|
81
103
|
/**
|
|
82
|
-
*
|
|
104
|
+
* 获取指定渠道的详细信息
|
|
105
|
+
*
|
|
106
|
+
* @param channel - 渠道标识
|
|
107
|
+
* @returns 渠道信息,不存在时返回 undefined
|
|
83
108
|
*/
|
|
84
109
|
function getChannelInfo(channel) {
|
|
85
110
|
return channelInfoMap[channel];
|
|
86
111
|
}
|
|
112
|
+
/**
|
|
113
|
+
* 创建临时邮箱
|
|
114
|
+
*
|
|
115
|
+
* 错误处理策略:
|
|
116
|
+
* - 网络错误、超时、服务端 5xx 错误 → 自动重试(默认 2 次,指数退避)
|
|
117
|
+
* - 4xx 客户端错误、参数错误 → 直接抛出异常
|
|
118
|
+
*
|
|
119
|
+
* @param options - 创建选项,可指定渠道、有效时长、域名等
|
|
120
|
+
* @returns 邮箱信息,包含地址、令牌等
|
|
121
|
+
* @throws 重试耗尽后仍失败时抛出异常
|
|
122
|
+
*
|
|
123
|
+
* @example
|
|
124
|
+
* ```ts
|
|
125
|
+
* const emailInfo = await generateEmail({ channel: 'temp-mail-io' });
|
|
126
|
+
* console.log(emailInfo.email); // 临时邮箱地址
|
|
127
|
+
* ```
|
|
128
|
+
*/
|
|
87
129
|
async function generateEmail(options = {}) {
|
|
88
130
|
const channel = options.channel || allChannels[Math.floor(Math.random() * allChannels.length)];
|
|
131
|
+
logger_1.logger.info(`创建临时邮箱, 渠道: ${channel}`);
|
|
132
|
+
const result = await (0, retry_1.withRetry)(() => generateEmailOnce(channel, options), options.retry);
|
|
133
|
+
logger_1.logger.info(`邮箱创建成功: ${result.email}`);
|
|
134
|
+
return result;
|
|
135
|
+
}
|
|
136
|
+
/**
|
|
137
|
+
* 单次创建邮箱(不含重试逻辑)
|
|
138
|
+
* 根据渠道类型分发到对应的 provider 实现
|
|
139
|
+
*/
|
|
140
|
+
async function generateEmailOnce(channel, options) {
|
|
89
141
|
switch (channel) {
|
|
90
142
|
case 'tempmail':
|
|
91
143
|
return tempmail.generateEmail(options.duration || 30);
|
|
@@ -109,6 +161,32 @@ async function generateEmail(options = {}) {
|
|
|
109
161
|
throw new Error(`Unknown channel: ${channel}`);
|
|
110
162
|
}
|
|
111
163
|
}
|
|
164
|
+
/**
|
|
165
|
+
* 获取邮件列表
|
|
166
|
+
*
|
|
167
|
+
* 错误处理策略:
|
|
168
|
+
* - 网络错误、超时、服务端 5xx 错误 → 自动重试(默认 2 次)
|
|
169
|
+
* - 重试耗尽后返回 { success: false, emails: [] },不抛异常
|
|
170
|
+
* - 参数校验错误(缺少 channel / token)直接抛出
|
|
171
|
+
*
|
|
172
|
+
* 这种设计让调用方在轮询场景下不会因网络波动而中断整个流程,
|
|
173
|
+
* 只需检查 success 字段即可判断本次请求是否成功。
|
|
174
|
+
*
|
|
175
|
+
* @param options - 获取选项,包含渠道、邮箱地址、令牌
|
|
176
|
+
* @returns 邮件结果,包含 success 标记和邮件列表
|
|
177
|
+
*
|
|
178
|
+
* @example
|
|
179
|
+
* ```ts
|
|
180
|
+
* const result = await getEmails({
|
|
181
|
+
* channel: emailInfo.channel,
|
|
182
|
+
* email: emailInfo.email,
|
|
183
|
+
* token: emailInfo.token,
|
|
184
|
+
* });
|
|
185
|
+
* if (result.success && result.emails.length > 0) {
|
|
186
|
+
* console.log('收到邮件:', result.emails[0].subject);
|
|
187
|
+
* }
|
|
188
|
+
* ```
|
|
189
|
+
*/
|
|
112
190
|
async function getEmails(options) {
|
|
113
191
|
const { channel, email, token } = options;
|
|
114
192
|
if (!channel) {
|
|
@@ -117,65 +195,97 @@ async function getEmails(options) {
|
|
|
117
195
|
if (!email && channel !== 'tempmail-lol') {
|
|
118
196
|
throw new Error('Email is required');
|
|
119
197
|
}
|
|
120
|
-
|
|
198
|
+
logger_1.logger.debug(`获取邮件, 渠道: ${channel}, 邮箱: ${email}`);
|
|
199
|
+
try {
|
|
200
|
+
const emails = await (0, retry_1.withRetry)(() => getEmailsOnce(channel, email, token), options.retry);
|
|
201
|
+
if (emails.length > 0) {
|
|
202
|
+
logger_1.logger.info(`获取到 ${emails.length} 封邮件, 渠道: ${channel}`);
|
|
203
|
+
}
|
|
204
|
+
else {
|
|
205
|
+
logger_1.logger.debug(`暂无邮件, 渠道: ${channel}`);
|
|
206
|
+
}
|
|
207
|
+
return { channel, email, emails, success: true };
|
|
208
|
+
}
|
|
209
|
+
catch (err) {
|
|
210
|
+
/*
|
|
211
|
+
* 重试耗尽后仍然失败 → 返回空结果而非抛异常
|
|
212
|
+
* 这样调用方在轮询场景下不会因为一次网络波动而中断整个流程
|
|
213
|
+
*/
|
|
214
|
+
logger_1.logger.error(`获取邮件失败, 渠道: ${channel}, 错误: ${err.message || err}`);
|
|
215
|
+
return { channel, email, emails: [], success: false };
|
|
216
|
+
}
|
|
217
|
+
}
|
|
218
|
+
/**
|
|
219
|
+
* 单次获取邮件(不含重试逻辑)
|
|
220
|
+
* 根据渠道类型分发到对应的 provider 实现,并校验必需的 token 参数
|
|
221
|
+
*/
|
|
222
|
+
async function getEmailsOnce(channel, email, token) {
|
|
121
223
|
switch (channel) {
|
|
122
224
|
case 'tempmail':
|
|
123
|
-
|
|
124
|
-
break;
|
|
225
|
+
return tempmail.getEmails(email);
|
|
125
226
|
case 'linshi-email':
|
|
126
|
-
|
|
127
|
-
break;
|
|
227
|
+
return linshiEmail.getEmails(email);
|
|
128
228
|
case 'tempmail-lol':
|
|
129
|
-
if (!token)
|
|
229
|
+
if (!token)
|
|
130
230
|
throw new Error('Token is required for tempmail-lol channel');
|
|
131
|
-
|
|
132
|
-
emails = await tempmailLol.getEmails(token, email);
|
|
133
|
-
break;
|
|
231
|
+
return tempmailLol.getEmails(token, email);
|
|
134
232
|
case 'chatgpt-org-uk':
|
|
135
|
-
|
|
136
|
-
break;
|
|
233
|
+
return chatgptOrgUk.getEmails(email);
|
|
137
234
|
case 'tempmail-la':
|
|
138
|
-
|
|
139
|
-
break;
|
|
235
|
+
return tempmailLa.getEmails(email);
|
|
140
236
|
case 'temp-mail-io':
|
|
141
|
-
|
|
142
|
-
break;
|
|
237
|
+
return tempMailIO.getEmails(email);
|
|
143
238
|
case 'awamail':
|
|
144
|
-
if (!token)
|
|
239
|
+
if (!token)
|
|
145
240
|
throw new Error('Token is required for awamail channel');
|
|
146
|
-
|
|
147
|
-
emails = await awamail.getEmails(token, email);
|
|
148
|
-
break;
|
|
241
|
+
return awamail.getEmails(token, email);
|
|
149
242
|
case 'mail-tm':
|
|
150
|
-
if (!token)
|
|
243
|
+
if (!token)
|
|
151
244
|
throw new Error('Token is required for mail-tm channel');
|
|
152
|
-
|
|
153
|
-
emails = await mailTm.getEmails(token, email);
|
|
154
|
-
break;
|
|
245
|
+
return mailTm.getEmails(token, email);
|
|
155
246
|
case 'dropmail':
|
|
156
|
-
if (!token)
|
|
247
|
+
if (!token)
|
|
157
248
|
throw new Error('Token is required for dropmail channel');
|
|
158
|
-
|
|
159
|
-
emails = await dropmail.getEmails(token, email);
|
|
160
|
-
break;
|
|
249
|
+
return dropmail.getEmails(token, email);
|
|
161
250
|
default:
|
|
162
251
|
throw new Error(`Unknown channel: ${channel}`);
|
|
163
252
|
}
|
|
164
|
-
return {
|
|
165
|
-
channel,
|
|
166
|
-
email,
|
|
167
|
-
emails,
|
|
168
|
-
success: true,
|
|
169
|
-
};
|
|
170
253
|
}
|
|
254
|
+
/**
|
|
255
|
+
* 临时邮箱客户端
|
|
256
|
+
* 封装了邮箱创建和邮件获取的完整流程,自动管理邮箱信息和认证令牌
|
|
257
|
+
*
|
|
258
|
+
* @example
|
|
259
|
+
* ```ts
|
|
260
|
+
* const client = new TempEmailClient();
|
|
261
|
+
* const emailInfo = await client.generate({ channel: 'mail-tm' });
|
|
262
|
+
* console.log('邮箱:', emailInfo.email);
|
|
263
|
+
*
|
|
264
|
+
* // 轮询获取邮件
|
|
265
|
+
* const result = await client.getEmails();
|
|
266
|
+
* if (result.success) {
|
|
267
|
+
* console.log('邮件数:', result.emails.length);
|
|
268
|
+
* }
|
|
269
|
+
* ```
|
|
270
|
+
*/
|
|
171
271
|
class TempEmailClient {
|
|
172
272
|
constructor() {
|
|
173
273
|
this.emailInfo = null;
|
|
174
274
|
}
|
|
275
|
+
/**
|
|
276
|
+
* 创建临时邮箱并缓存邮箱信息
|
|
277
|
+
* 后续调用 getEmails() 时自动使用此邮箱的渠道、地址和令牌
|
|
278
|
+
*/
|
|
175
279
|
async generate(options = {}) {
|
|
176
280
|
this.emailInfo = await generateEmail(options);
|
|
177
281
|
return this.emailInfo;
|
|
178
282
|
}
|
|
283
|
+
/**
|
|
284
|
+
* 获取当前邮箱的邮件列表
|
|
285
|
+
* 必须先调用 generate() 创建邮箱
|
|
286
|
+
*
|
|
287
|
+
* @throws 未调用 generate() 时抛出异常
|
|
288
|
+
*/
|
|
179
289
|
async getEmails() {
|
|
180
290
|
if (!this.emailInfo) {
|
|
181
291
|
throw new Error('No email generated. Call generate() first.');
|
|
@@ -186,6 +296,10 @@ class TempEmailClient {
|
|
|
186
296
|
token: this.emailInfo.token,
|
|
187
297
|
});
|
|
188
298
|
}
|
|
299
|
+
/**
|
|
300
|
+
* 获取当前缓存的邮箱信息
|
|
301
|
+
* 未调用 generate() 时返回 null
|
|
302
|
+
*/
|
|
189
303
|
getEmailInfo() {
|
|
190
304
|
return this.emailInfo;
|
|
191
305
|
}
|
|
@@ -198,4 +312,4 @@ exports.default = {
|
|
|
198
312
|
getEmails,
|
|
199
313
|
TempEmailClient,
|
|
200
314
|
};
|
|
201
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBaURBLG9DQUVDO0FBS0Qsd0NBRUM7QUFFRCxzQ0F5QkM7QUFFRCw4QkE4REM7QUFySkQsK0RBQWlEO0FBQ2pELHNFQUF3RDtBQUN4RCxzRUFBd0Q7QUFDeEQseUVBQTJEO0FBQzNELG9FQUFzRDtBQUN0RCxxRUFBdUQ7QUFDdkQsNkRBQStDO0FBQy9DLDREQUE4QztBQUM5QywrREFBaUQ7QUFJakQseUNBQTZDO0FBQXBDLDJHQUFBLGNBQWMsT0FBQTtBQUV2QixNQUFNLFNBQVMsR0FBRztJQUNoQixVQUFVLEVBQUUsUUFBUTtJQUNwQixjQUFjLEVBQUUsV0FBVztJQUMzQixjQUFjLEVBQUUsV0FBVztJQUMzQixnQkFBZ0IsRUFBRSxZQUFZO0lBQzlCLGFBQWEsRUFBRSxVQUFVO0lBQ3pCLGNBQWMsRUFBRSxVQUFVO0lBQzFCLFNBQVMsRUFBRSxPQUFPO0lBQ2xCLFNBQVMsRUFBRSxNQUFNO0lBQ2pCLFVBQVUsRUFBRSxRQUFRO0NBQ3JCLENBQUM7QUFFRixNQUFNLFdBQVcsR0FBYyxDQUFDLFVBQVUsRUFBRSxjQUFjLEVBQUUsY0FBYyxFQUFFLGdCQUFnQixFQUFFLGFBQWEsRUFBRSxjQUFjLEVBQUUsU0FBUyxFQUFFLFNBQVMsRUFBRSxVQUFVLENBQUMsQ0FBQztBQVEvSixNQUFNLGNBQWMsR0FBaUM7SUFDbkQsVUFBVSxFQUFFLEVBQUUsT0FBTyxFQUFFLFVBQVUsRUFBRSxJQUFJLEVBQUUsVUFBVSxFQUFFLE9BQU8sRUFBRSxjQUFjLEVBQUU7SUFDOUUsY0FBYyxFQUFFLEVBQUUsT0FBTyxFQUFFLGNBQWMsRUFBRSxJQUFJLEVBQUUsTUFBTSxFQUFFLE9BQU8sRUFBRSxrQkFBa0IsRUFBRTtJQUN0RixjQUFjLEVBQUUsRUFBRSxPQUFPLEVBQUUsY0FBYyxFQUFFLElBQUksRUFBRSxjQUFjLEVBQUUsT0FBTyxFQUFFLGNBQWMsRUFBRTtJQUMxRixnQkFBZ0IsRUFBRSxFQUFFLE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxJQUFJLEVBQUUsY0FBYyxFQUFFLE9BQU8sRUFBRSxxQkFBcUIsRUFBRTtJQUNyRyxhQUFhLEVBQUUsRUFBRSxPQUFPLEVBQUUsYUFBYSxFQUFFLElBQUksRUFBRSxhQUFhLEVBQUUsT0FBTyxFQUFFLGFBQWEsRUFBRTtJQUN0RixjQUFjLEVBQUUsRUFBRSxPQUFPLEVBQUUsY0FBYyxFQUFFLElBQUksRUFBRSxjQUFjLEVBQUUsT0FBTyxFQUFFLGNBQWMsRUFBRTtJQUMxRixTQUFTLEVBQUUsRUFBRSxPQUFPLEVBQUUsU0FBUyxFQUFFLElBQUksRUFBRSxTQUFTLEVBQUUsT0FBTyxFQUFFLGFBQWEsRUFBRTtJQUMxRSxTQUFTLEVBQUUsRUFBRSxPQUFPLEVBQUUsU0FBUyxFQUFFLElBQUksRUFBRSxTQUFTLEVBQUUsT0FBTyxFQUFFLFNBQVMsRUFBRTtJQUN0RSxVQUFVLEVBQUUsRUFBRSxPQUFPLEVBQUUsVUFBVSxFQUFFLElBQUksRUFBRSxVQUFVLEVBQUUsT0FBTyxFQUFFLGFBQWEsRUFBRTtDQUM5RSxDQUFDO0FBRUY7O0dBRUc7QUFDSCxTQUFnQixZQUFZO0lBQzFCLE9BQU8sV0FBVyxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLGNBQWMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO0FBQ25ELENBQUM7QUFFRDs7R0FFRztBQUNILFNBQWdCLGNBQWMsQ0FBQyxPQUFnQjtJQUM3QyxPQUFPLGNBQWMsQ0FBQyxPQUFPLENBQUMsQ0FBQztBQUNqQyxDQUFDO0FBRU0sS0FBSyxVQUFVLGFBQWEsQ0FBQyxVQUFnQyxFQUFFO0lBQ3BFLE1BQU0sT0FBTyxHQUFHLE9BQU8sQ0FBQyxPQUFPLElBQUksV0FBVyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLE1BQU0sRUFBRSxHQUFHLFdBQVcsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDO0lBRS9GLFFBQVEsT0FBTyxFQUFFLENBQUM7UUFDaEIsS0FBSyxVQUFVO1lBQ2IsT0FBTyxRQUFRLENBQUMsYUFBYSxDQUFDLE9BQU8sQ0FBQyxRQUFRLElBQUksRUFBRSxDQUFDLENBQUM7UUFDeEQsS0FBSyxjQUFjO1lBQ2pCLE9BQU8sV0FBVyxDQUFDLGFBQWEsRUFBRSxDQUFDO1FBQ3JDLEtBQUssY0FBYztZQUNqQixPQUFPLFdBQVcsQ0FBQyxhQUFhLENBQUMsT0FBTyxDQUFDLE1BQU0sSUFBSSxJQUFJLENBQUMsQ0FBQztRQUMzRCxLQUFLLGdCQUFnQjtZQUNuQixPQUFPLFlBQVksQ0FBQyxhQUFhLEVBQUUsQ0FBQztRQUN0QyxLQUFLLGFBQWE7WUFDaEIsT0FBTyxVQUFVLENBQUMsYUFBYSxFQUFFLENBQUM7UUFDcEMsS0FBSyxjQUFjO1lBQ2pCLE9BQU8sVUFBVSxDQUFDLGFBQWEsRUFBRSxDQUFDO1FBQ3BDLEtBQUssU0FBUztZQUNaLE9BQU8sT0FBTyxDQUFDLGFBQWEsRUFBRSxDQUFDO1FBQ2pDLEtBQUssU0FBUztZQUNaLE9BQU8sTUFBTSxDQUFDLGFBQWEsRUFBRSxDQUFDO1FBQ2hDLEtBQUssVUFBVTtZQUNiLE9BQU8sUUFBUSxDQUFDLGFBQWEsRUFBRSxDQUFDO1FBQ2xDO1lBQ0UsTUFBTSxJQUFJLEtBQUssQ0FBQyxvQkFBb0IsT0FBTyxFQUFFLENBQUMsQ0FBQztJQUNuRCxDQUFDO0FBQ0gsQ0FBQztBQUVNLEtBQUssVUFBVSxTQUFTLENBQUMsT0FBeUI7SUFDdkQsTUFBTSxFQUFFLE9BQU8sRUFBRSxLQUFLLEVBQUUsS0FBSyxFQUFFLEdBQUcsT0FBTyxDQUFDO0lBRTFDLElBQUksQ0FBQyxPQUFPLEVBQUUsQ0FBQztRQUNiLE1BQU0sSUFBSSxLQUFLLENBQUMscUJBQXFCLENBQUMsQ0FBQztJQUN6QyxDQUFDO0lBQ0QsSUFBSSxDQUFDLEtBQUssSUFBSSxPQUFPLEtBQUssY0FBYyxFQUFFLENBQUM7UUFDekMsTUFBTSxJQUFJLEtBQUssQ0FBQyxtQkFBbUIsQ0FBQyxDQUFDO0lBQ3ZDLENBQUM7SUFFRCxJQUFJLE1BQU0sR0FBWSxFQUFFLENBQUM7SUFFekIsUUFBUSxPQUFPLEVBQUUsQ0FBQztRQUNoQixLQUFLLFVBQVU7WUFDYixNQUFNLEdBQUcsTUFBTSxRQUFRLENBQUMsU0FBUyxDQUFDLEtBQUssQ0FBQyxDQUFDO1lBQ3pDLE1BQU07UUFDUixLQUFLLGNBQWM7WUFDakIsTUFBTSxHQUFHLE1BQU0sV0FBVyxDQUFDLFNBQVMsQ0FBQyxLQUFLLENBQUMsQ0FBQztZQUM1QyxNQUFNO1FBQ1IsS0FBSyxjQUFjO1lBQ2pCLElBQUksQ0FBQyxLQUFLLEVBQUUsQ0FBQztnQkFDWCxNQUFNLElBQUksS0FBSyxDQUFDLDRDQUE0QyxDQUFDLENBQUM7WUFDaEUsQ0FBQztZQUNELE1BQU0sR0FBRyxNQUFNLFdBQVcsQ0FBQyxTQUFTLENBQUMsS0FBSyxFQUFFLEtBQUssQ0FBQyxDQUFDO1lBQ25ELE1BQU07UUFDUixLQUFLLGdCQUFnQjtZQUNuQixNQUFNLEdBQUcsTUFBTSxZQUFZLENBQUMsU0FBUyxDQUFDLEtBQUssQ0FBQyxDQUFDO1lBQzdDLE1BQU07UUFDUixLQUFLLGFBQWE7WUFDaEIsTUFBTSxHQUFHLE1BQU0sVUFBVSxDQUFDLFNBQVMsQ0FBQyxLQUFLLENBQUMsQ0FBQztZQUMzQyxNQUFNO1FBQ1IsS0FBSyxjQUFjO1lBQ2pCLE1BQU0sR0FBRyxNQUFNLFVBQVUsQ0FBQyxTQUFTLENBQUMsS0FBSyxDQUFDLENBQUM7WUFDM0MsTUFBTTtRQUNSLEtBQUssU0FBUztZQUNaLElBQUksQ0FBQyxLQUFLLEVBQUUsQ0FBQztnQkFDWCxNQUFNLElBQUksS0FBSyxDQUFDLHVDQUF1QyxDQUFDLENBQUM7WUFDM0QsQ0FBQztZQUNELE1BQU0sR0FBRyxNQUFNLE9BQU8sQ0FBQyxTQUFTLENBQUMsS0FBSyxFQUFFLEtBQUssQ0FBQyxDQUFDO1lBQy9DLE1BQU07UUFDUixLQUFLLFNBQVM7WUFDWixJQUFJLENBQUMsS0FBSyxFQUFFLENBQUM7Z0JBQ1gsTUFBTSxJQUFJLEtBQUssQ0FBQyx1Q0FBdUMsQ0FBQyxDQUFDO1lBQzNELENBQUM7WUFDRCxNQUFNLEdBQUcsTUFBTSxNQUFNLENBQUMsU0FBUyxDQUFDLEtBQUssRUFBRSxLQUFLLENBQUMsQ0FBQztZQUM5QyxNQUFNO1FBQ1IsS0FBSyxVQUFVO1lBQ2IsSUFBSSxDQUFDLEtBQUssRUFBRSxDQUFDO2dCQUNYLE1BQU0sSUFBSSxLQUFLLENBQUMsd0NBQXdDLENBQUMsQ0FBQztZQUM1RCxDQUFDO1lBQ0QsTUFBTSxHQUFHLE1BQU0sUUFBUSxDQUFDLFNBQVMsQ0FBQyxLQUFLLEVBQUUsS0FBSyxDQUFDLENBQUM7WUFDaEQsTUFBTTtRQUNSO1lBQ0UsTUFBTSxJQUFJLEtBQUssQ0FBQyxvQkFBb0IsT0FBTyxFQUFFLENBQUMsQ0FBQztJQUNuRCxDQUFDO0lBRUQsT0FBTztRQUNMLE9BQU87UUFDUCxLQUFLO1FBQ0wsTUFBTTtRQUNOLE9BQU8sRUFBRSxJQUFJO0tBQ2QsQ0FBQztBQUNKLENBQUM7QUFFRCxNQUFhLGVBQWU7SUFBNUI7UUFDVSxjQUFTLEdBQXFCLElBQUksQ0FBQztJQXNCN0MsQ0FBQztJQXBCQyxLQUFLLENBQUMsUUFBUSxDQUFDLFVBQWdDLEVBQUU7UUFDL0MsSUFBSSxDQUFDLFNBQVMsR0FBRyxNQUFNLGFBQWEsQ0FBQyxPQUFPLENBQUMsQ0FBQztRQUM5QyxPQUFPLElBQUksQ0FBQyxTQUFTLENBQUM7SUFDeEIsQ0FBQztJQUVELEtBQUssQ0FBQyxTQUFTO1FBQ2IsSUFBSSxDQUFDLElBQUksQ0FBQyxTQUFTLEVBQUUsQ0FBQztZQUNwQixNQUFNLElBQUksS0FBSyxDQUFDLDRDQUE0QyxDQUFDLENBQUM7UUFDaEUsQ0FBQztRQUVELE9BQU8sU0FBUyxDQUFDO1lBQ2YsT0FBTyxFQUFFLElBQUksQ0FBQyxTQUFTLENBQUMsT0FBTztZQUMvQixLQUFLLEVBQUUsSUFBSSxDQUFDLFNBQVMsQ0FBQyxLQUFLO1lBQzNCLEtBQUssRUFBRSxJQUFJLENBQUMsU0FBUyxDQUFDLEtBQUs7U0FDNUIsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztJQUVELFlBQVk7UUFDVixPQUFPLElBQUksQ0FBQyxTQUFTLENBQUM7SUFDeEIsQ0FBQztDQUNGO0FBdkJELDBDQXVCQztBQUVELGtCQUFlO0lBQ2IsWUFBWTtJQUNaLGNBQWM7SUFDZCxhQUFhO0lBQ2IsU0FBUztJQUNULGVBQWU7Q0FDaEIsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCAqIGFzIHRlbXBtYWlsIGZyb20gJy4vcHJvdmlkZXJzL3RlbXBtYWlsJztcbmltcG9ydCAqIGFzIGxpbnNoaUVtYWlsIGZyb20gJy4vcHJvdmlkZXJzL2xpbnNoaS1lbWFpbCc7XG5pbXBvcnQgKiBhcyB0ZW1wbWFpbExvbCBmcm9tICcuL3Byb3ZpZGVycy90ZW1wbWFpbC1sb2wnO1xuaW1wb3J0ICogYXMgY2hhdGdwdE9yZ1VrIGZyb20gJy4vcHJvdmlkZXJzL2NoYXRncHQtb3JnLXVrJztcbmltcG9ydCAqIGFzIHRlbXBtYWlsTGEgZnJvbSAnLi9wcm92aWRlcnMvdGVtcG1haWwtbGEnO1xuaW1wb3J0ICogYXMgdGVtcE1haWxJTyBmcm9tICcuL3Byb3ZpZGVycy90ZW1wLW1haWwtaW8nO1xuaW1wb3J0ICogYXMgYXdhbWFpbCBmcm9tICcuL3Byb3ZpZGVycy9hd2FtYWlsJztcbmltcG9ydCAqIGFzIG1haWxUbSBmcm9tICcuL3Byb3ZpZGVycy9tYWlsLXRtJztcbmltcG9ydCAqIGFzIGRyb3BtYWlsIGZyb20gJy4vcHJvdmlkZXJzL2Ryb3BtYWlsJztcbmltcG9ydCB7IENoYW5uZWwsIEVtYWlsSW5mbywgRW1haWwsIEVtYWlsQXR0YWNobWVudCwgR2V0RW1haWxzUmVzdWx0LCBHZW5lcmF0ZUVtYWlsT3B0aW9ucywgR2V0RW1haWxzT3B0aW9ucyB9IGZyb20gJy4vdHlwZXMnO1xuXG5leHBvcnQgeyBDaGFubmVsLCBFbWFpbEluZm8sIEVtYWlsLCBFbWFpbEF0dGFjaG1lbnQsIEdldEVtYWlsc1Jlc3VsdCwgR2VuZXJhdGVFbWFpbE9wdGlvbnMsIEdldEVtYWlsc09wdGlvbnMgfSBmcm9tICcuL3R5cGVzJztcbmV4cG9ydCB7IG5vcm1hbGl6ZUVtYWlsIH0gZnJvbSAnLi9ub3JtYWxpemUnO1xuXG5jb25zdCBwcm92aWRlcnMgPSB7XG4gICd0ZW1wbWFpbCc6IHRlbXBtYWlsLFxuICAnbGluc2hpLWVtYWlsJzogbGluc2hpRW1haWwsXG4gICd0ZW1wbWFpbC1sb2wnOiB0ZW1wbWFpbExvbCxcbiAgJ2NoYXRncHQtb3JnLXVrJzogY2hhdGdwdE9yZ1VrLFxuICAndGVtcG1haWwtbGEnOiB0ZW1wbWFpbExhLFxuICAndGVtcC1tYWlsLWlvJzogdGVtcE1haWxJTyxcbiAgJ2F3YW1haWwnOiBhd2FtYWlsLFxuICAnbWFpbC10bSc6IG1haWxUbSxcbiAgJ2Ryb3BtYWlsJzogZHJvcG1haWwsXG59O1xuXG5jb25zdCBhbGxDaGFubmVsczogQ2hhbm5lbFtdID0gWyd0ZW1wbWFpbCcsICdsaW5zaGktZW1haWwnLCAndGVtcG1haWwtbG9sJywgJ2NoYXRncHQtb3JnLXVrJywgJ3RlbXBtYWlsLWxhJywgJ3RlbXAtbWFpbC1pbycsICdhd2FtYWlsJywgJ21haWwtdG0nLCAnZHJvcG1haWwnXTtcblxuZXhwb3J0IGludGVyZmFjZSBDaGFubmVsSW5mbyB7XG4gIGNoYW5uZWw6IENoYW5uZWw7XG4gIG5hbWU6IHN0cmluZztcbiAgd2Vic2l0ZTogc3RyaW5nO1xufVxuXG5jb25zdCBjaGFubmVsSW5mb01hcDogUmVjb3JkPENoYW5uZWwsIENoYW5uZWxJbmZvPiA9IHtcbiAgJ3RlbXBtYWlsJzogeyBjaGFubmVsOiAndGVtcG1haWwnLCBuYW1lOiAnVGVtcE1haWwnLCB3ZWJzaXRlOiAndGVtcG1haWwuaW5nJyB9LFxuICAnbGluc2hpLWVtYWlsJzogeyBjaGFubmVsOiAnbGluc2hpLWVtYWlsJywgbmFtZTogJ+S4tOaXtumCrueusScsIHdlYnNpdGU6ICdsaW5zaGktZW1haWwuY29tJyB9LFxuICAndGVtcG1haWwtbG9sJzogeyBjaGFubmVsOiAndGVtcG1haWwtbG9sJywgbmFtZTogJ1RlbXBNYWlsIExPTCcsIHdlYnNpdGU6ICd0ZW1wbWFpbC5sb2wnIH0sXG4gICdjaGF0Z3B0LW9yZy11ayc6IHsgY2hhbm5lbDogJ2NoYXRncHQtb3JnLXVrJywgbmFtZTogJ0NoYXRHUFQgTWFpbCcsIHdlYnNpdGU6ICdtYWlsLmNoYXRncHQub3JnLnVrJyB9LFxuICAndGVtcG1haWwtbGEnOiB7IGNoYW5uZWw6ICd0ZW1wbWFpbC1sYScsIG5hbWU6ICdUZW1wTWFpbCBMQScsIHdlYnNpdGU6ICd0ZW1wbWFpbC5sYScgfSxcbiAgJ3RlbXAtbWFpbC1pbyc6IHsgY2hhbm5lbDogJ3RlbXAtbWFpbC1pbycsIG5hbWU6ICdUZW1wIE1haWwgSU8nLCB3ZWJzaXRlOiAndGVtcC1tYWlsLmlvJyB9LFxuICAnYXdhbWFpbCc6IHsgY2hhbm5lbDogJ2F3YW1haWwnLCBuYW1lOiAnQXdhTWFpbCcsIHdlYnNpdGU6ICdhd2FtYWlsLmNvbScgfSxcbiAgJ21haWwtdG0nOiB7IGNoYW5uZWw6ICdtYWlsLXRtJywgbmFtZTogJ01haWwudG0nLCB3ZWJzaXRlOiAnbWFpbC50bScgfSxcbiAgJ2Ryb3BtYWlsJzogeyBjaGFubmVsOiAnZHJvcG1haWwnLCBuYW1lOiAnRHJvcE1haWwnLCB3ZWJzaXRlOiAnZHJvcG1haWwubWUnIH0sXG59O1xuXG4vKipcbiAqIOiOt+WPluaJgOacieaUr+aMgeeahOa4oOmBk+WIl+ihqFxuICovXG5leHBvcnQgZnVuY3Rpb24gbGlzdENoYW5uZWxzKCk6IENoYW5uZWxJbmZvW10ge1xuICByZXR1cm4gYWxsQ2hhbm5lbHMubWFwKGNoID0+IGNoYW5uZWxJbmZvTWFwW2NoXSk7XG59XG5cbi8qKlxuICog6I635Y+W5oyH5a6a5rig6YGT5L+h5oGvXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRDaGFubmVsSW5mbyhjaGFubmVsOiBDaGFubmVsKTogQ2hhbm5lbEluZm8gfCB1bmRlZmluZWQge1xuICByZXR1cm4gY2hhbm5lbEluZm9NYXBbY2hhbm5lbF07XG59XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBnZW5lcmF0ZUVtYWlsKG9wdGlvbnM6IEdlbmVyYXRlRW1haWxPcHRpb25zID0ge30pOiBQcm9taXNlPEVtYWlsSW5mbz4ge1xuICBjb25zdCBjaGFubmVsID0gb3B0aW9ucy5jaGFubmVsIHx8IGFsbENoYW5uZWxzW01hdGguZmxvb3IoTWF0aC5yYW5kb20oKSAqIGFsbENoYW5uZWxzLmxlbmd0aCldO1xuICBcbiAgc3dpdGNoIChjaGFubmVsKSB7XG4gICAgY2FzZSAndGVtcG1haWwnOlxuICAgICAgcmV0dXJuIHRlbXBtYWlsLmdlbmVyYXRlRW1haWwob3B0aW9ucy5kdXJhdGlvbiB8fCAzMCk7XG4gICAgY2FzZSAnbGluc2hpLWVtYWlsJzpcbiAgICAgIHJldHVybiBsaW5zaGlFbWFpbC5nZW5lcmF0ZUVtYWlsKCk7XG4gICAgY2FzZSAndGVtcG1haWwtbG9sJzpcbiAgICAgIHJldHVybiB0ZW1wbWFpbExvbC5nZW5lcmF0ZUVtYWlsKG9wdGlvbnMuZG9tYWluIHx8IG51bGwpO1xuICAgIGNhc2UgJ2NoYXRncHQtb3JnLXVrJzpcbiAgICAgIHJldHVybiBjaGF0Z3B0T3JnVWsuZ2VuZXJhdGVFbWFpbCgpO1xuICAgIGNhc2UgJ3RlbXBtYWlsLWxhJzpcbiAgICAgIHJldHVybiB0ZW1wbWFpbExhLmdlbmVyYXRlRW1haWwoKTtcbiAgICBjYXNlICd0ZW1wLW1haWwtaW8nOlxuICAgICAgcmV0dXJuIHRlbXBNYWlsSU8uZ2VuZXJhdGVFbWFpbCgpO1xuICAgIGNhc2UgJ2F3YW1haWwnOlxuICAgICAgcmV0dXJuIGF3YW1haWwuZ2VuZXJhdGVFbWFpbCgpO1xuICAgIGNhc2UgJ21haWwtdG0nOlxuICAgICAgcmV0dXJuIG1haWxUbS5nZW5lcmF0ZUVtYWlsKCk7XG4gICAgY2FzZSAnZHJvcG1haWwnOlxuICAgICAgcmV0dXJuIGRyb3BtYWlsLmdlbmVyYXRlRW1haWwoKTtcbiAgICBkZWZhdWx0OlxuICAgICAgdGhyb3cgbmV3IEVycm9yKGBVbmtub3duIGNoYW5uZWw6ICR7Y2hhbm5lbH1gKTtcbiAgfVxufVxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2V0RW1haWxzKG9wdGlvbnM6IEdldEVtYWlsc09wdGlvbnMpOiBQcm9taXNlPEdldEVtYWlsc1Jlc3VsdD4ge1xuICBjb25zdCB7IGNoYW5uZWwsIGVtYWlsLCB0b2tlbiB9ID0gb3B0aW9ucztcbiAgXG4gIGlmICghY2hhbm5lbCkge1xuICAgIHRocm93IG5ldyBFcnJvcignQ2hhbm5lbCBpcyByZXF1aXJlZCcpO1xuICB9XG4gIGlmICghZW1haWwgJiYgY2hhbm5lbCAhPT0gJ3RlbXBtYWlsLWxvbCcpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ0VtYWlsIGlzIHJlcXVpcmVkJyk7XG4gIH1cblxuICBsZXQgZW1haWxzOiBFbWFpbFtdID0gW107XG5cbiAgc3dpdGNoIChjaGFubmVsKSB7XG4gICAgY2FzZSAndGVtcG1haWwnOlxuICAgICAgZW1haWxzID0gYXdhaXQgdGVtcG1haWwuZ2V0RW1haWxzKGVtYWlsKTtcbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgJ2xpbnNoaS1lbWFpbCc6XG4gICAgICBlbWFpbHMgPSBhd2FpdCBsaW5zaGlFbWFpbC5nZXRFbWFpbHMoZW1haWwpO1xuICAgICAgYnJlYWs7XG4gICAgY2FzZSAndGVtcG1haWwtbG9sJzpcbiAgICAgIGlmICghdG9rZW4pIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdUb2tlbiBpcyByZXF1aXJlZCBmb3IgdGVtcG1haWwtbG9sIGNoYW5uZWwnKTtcbiAgICAgIH1cbiAgICAgIGVtYWlscyA9IGF3YWl0IHRlbXBtYWlsTG9sLmdldEVtYWlscyh0b2tlbiwgZW1haWwpO1xuICAgICAgYnJlYWs7XG4gICAgY2FzZSAnY2hhdGdwdC1vcmctdWsnOlxuICAgICAgZW1haWxzID0gYXdhaXQgY2hhdGdwdE9yZ1VrLmdldEVtYWlscyhlbWFpbCk7XG4gICAgICBicmVhaztcbiAgICBjYXNlICd0ZW1wbWFpbC1sYSc6XG4gICAgICBlbWFpbHMgPSBhd2FpdCB0ZW1wbWFpbExhLmdldEVtYWlscyhlbWFpbCk7XG4gICAgICBicmVhaztcbiAgICBjYXNlICd0ZW1wLW1haWwtaW8nOlxuICAgICAgZW1haWxzID0gYXdhaXQgdGVtcE1haWxJTy5nZXRFbWFpbHMoZW1haWwpO1xuICAgICAgYnJlYWs7XG4gICAgY2FzZSAnYXdhbWFpbCc6XG4gICAgICBpZiAoIXRva2VuKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignVG9rZW4gaXMgcmVxdWlyZWQgZm9yIGF3YW1haWwgY2hhbm5lbCcpO1xuICAgICAgfVxuICAgICAgZW1haWxzID0gYXdhaXQgYXdhbWFpbC5nZXRFbWFpbHModG9rZW4sIGVtYWlsKTtcbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgJ21haWwtdG0nOlxuICAgICAgaWYgKCF0b2tlbikge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1Rva2VuIGlzIHJlcXVpcmVkIGZvciBtYWlsLXRtIGNoYW5uZWwnKTtcbiAgICAgIH1cbiAgICAgIGVtYWlscyA9IGF3YWl0IG1haWxUbS5nZXRFbWFpbHModG9rZW4sIGVtYWlsKTtcbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgJ2Ryb3BtYWlsJzpcbiAgICAgIGlmICghdG9rZW4pIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdUb2tlbiBpcyByZXF1aXJlZCBmb3IgZHJvcG1haWwgY2hhbm5lbCcpO1xuICAgICAgfVxuICAgICAgZW1haWxzID0gYXdhaXQgZHJvcG1haWwuZ2V0RW1haWxzKHRva2VuLCBlbWFpbCk7XG4gICAgICBicmVhaztcbiAgICBkZWZhdWx0OlxuICAgICAgdGhyb3cgbmV3IEVycm9yKGBVbmtub3duIGNoYW5uZWw6ICR7Y2hhbm5lbH1gKTtcbiAgfVxuXG4gIHJldHVybiB7XG4gICAgY2hhbm5lbCxcbiAgICBlbWFpbCxcbiAgICBlbWFpbHMsXG4gICAgc3VjY2VzczogdHJ1ZSxcbiAgfTtcbn1cblxuZXhwb3J0IGNsYXNzIFRlbXBFbWFpbENsaWVudCB7XG4gIHByaXZhdGUgZW1haWxJbmZvOiBFbWFpbEluZm8gfCBudWxsID0gbnVsbDtcblxuICBhc3luYyBnZW5lcmF0ZShvcHRpb25zOiBHZW5lcmF0ZUVtYWlsT3B0aW9ucyA9IHt9KTogUHJvbWlzZTxFbWFpbEluZm8+IHtcbiAgICB0aGlzLmVtYWlsSW5mbyA9IGF3YWl0IGdlbmVyYXRlRW1haWwob3B0aW9ucyk7XG4gICAgcmV0dXJuIHRoaXMuZW1haWxJbmZvO1xuICB9XG5cbiAgYXN5bmMgZ2V0RW1haWxzKCk6IFByb21pc2U8R2V0RW1haWxzUmVzdWx0PiB7XG4gICAgaWYgKCF0aGlzLmVtYWlsSW5mbykge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdObyBlbWFpbCBnZW5lcmF0ZWQuIENhbGwgZ2VuZXJhdGUoKSBmaXJzdC4nKTtcbiAgICB9XG5cbiAgICByZXR1cm4gZ2V0RW1haWxzKHtcbiAgICAgIGNoYW5uZWw6IHRoaXMuZW1haWxJbmZvLmNoYW5uZWwsXG4gICAgICBlbWFpbDogdGhpcy5lbWFpbEluZm8uZW1haWwsXG4gICAgICB0b2tlbjogdGhpcy5lbWFpbEluZm8udG9rZW4sXG4gICAgfSk7XG4gIH1cblxuICBnZXRFbWFpbEluZm8oKTogRW1haWxJbmZvIHwgbnVsbCB7XG4gICAgcmV0dXJuIHRoaXMuZW1haWxJbmZvO1xuICB9XG59XG5cbmV4cG9ydCBkZWZhdWx0IHtcbiAgbGlzdENoYW5uZWxzLFxuICBnZXRDaGFubmVsSW5mbyxcbiAgZ2VuZXJhdGVFbWFpbCxcbiAgZ2V0RW1haWxzLFxuICBUZW1wRW1haWxDbGllbnQsXG59O1xuIl19
|
|
315
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBc0VBLG9DQUVDO0FBUUQsd0NBRUM7QUFtQkQsc0NBT0M7QUF5REQsOEJBMkJDO0FBaE1ELCtEQUFpRDtBQUNqRCxzRUFBd0Q7QUFDeEQsc0VBQXdEO0FBQ3hELHlFQUEyRDtBQUMzRCxvRUFBc0Q7QUFDdEQscUVBQXVEO0FBQ3ZELDZEQUErQztBQUMvQyw0REFBOEM7QUFDOUMsK0RBQWlEO0FBRWpELG1DQUFrRDtBQUNsRCxxQ0FBa0M7QUFHbEMseUNBQTZDO0FBQXBDLDJHQUFBLGNBQWMsT0FBQTtBQUN2QixpQ0FBb0U7QUFBM0Qsa0dBQUEsU0FBUyxPQUFBO0FBQUUseUdBQUEsZ0JBQWdCLE9BQUE7QUFDcEMsbUNBQTZGO0FBQXBGLGtHQUFBLFFBQVEsT0FBQTtBQUFjLHFHQUFBLFdBQVcsT0FBQTtBQUFFLHFHQUFBLFdBQVcsT0FBQTtBQUFFLG1HQUFBLFNBQVMsT0FBQTtBQUFFLGdHQUFBLE1BQU0sT0FBQTtBQUUxRSw0QkFBNEI7QUFDNUIsTUFBTSxTQUFTLEdBQUc7SUFDaEIsVUFBVSxFQUFFLFFBQVE7SUFDcEIsY0FBYyxFQUFFLFdBQVc7SUFDM0IsY0FBYyxFQUFFLFdBQVc7SUFDM0IsZ0JBQWdCLEVBQUUsWUFBWTtJQUM5QixhQUFhLEVBQUUsVUFBVTtJQUN6QixjQUFjLEVBQUUsVUFBVTtJQUMxQixTQUFTLEVBQUUsT0FBTztJQUNsQixTQUFTLEVBQUUsTUFBTTtJQUNqQixVQUFVLEVBQUUsUUFBUTtDQUNyQixDQUFDO0FBRUYsMEJBQTBCO0FBQzFCLE1BQU0sV0FBVyxHQUFjLENBQUMsVUFBVSxFQUFFLGNBQWMsRUFBRSxjQUFjLEVBQUUsZ0JBQWdCLEVBQUUsYUFBYSxFQUFFLGNBQWMsRUFBRSxTQUFTLEVBQUUsU0FBUyxFQUFFLFVBQVUs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SSxLQUFLLENBQUMsNENBQTRDLENBQUMsQ0FBQztRQUNoRSxDQUFDO1FBRUQsT0FBTyxTQUFTLENBQUM7WUFDZixPQUFPLEVBQUUsSUFBSSxDQUFDLFNBQVMsQ0FBQyxPQUFPO1lBQy9CLEtBQUssRUFBRSxJQUFJLENBQUMsU0FBUyxDQUFDLEtBQUs7WUFDM0IsS0FBSyxFQUFFLElBQUksQ0FBQyxTQUFTLENBQUMsS0FBSztTQUM1QixDQUFDLENBQUM7SUFDTCxDQUFDO0lBRUQ7OztPQUdHO0lBQ0gsWUFBWTtRQUNWLE9BQU8sSUFBSSxDQUFDLFNBQVMsQ0FBQztJQUN4QixDQUFDO0NBQ0Y7QUFyQ0QsMENBcUNDO0FBRUQsa0JBQWU7SUFDYixZQUFZO0lBQ1osY0FBYztJQUNkLGFBQWE7SUFDYixTQUFTO0lBQ1QsZUFBZTtDQUNoQixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0ICogYXMgdGVtcG1haWwgZnJvbSAnLi9wcm92aWRlcnMvdGVtcG1haWwnO1xuaW1wb3J0ICogYXMgbGluc2hpRW1haWwgZnJvbSAnLi9wcm92aWRlcnMvbGluc2hpLWVtYWlsJztcbmltcG9ydCAqIGFzIHRlbXBtYWlsTG9sIGZyb20gJy4vcHJvdmlkZXJzL3RlbXBtYWlsLWxvbCc7XG5pbXBvcnQgKiBhcyBjaGF0Z3B0T3JnVWsgZnJvbSAnLi9wcm92aWRlcnMvY2hhdGdwdC1vcmctdWsnO1xuaW1wb3J0ICogYXMgdGVtcG1haWxMYSBmcm9tICcuL3Byb3ZpZGVycy90ZW1wbWFpbC1sYSc7XG5pbXBvcnQgKiBhcyB0ZW1wTWFpbElPIGZyb20gJy4vcHJvdmlkZXJzL3RlbXAtbWFpbC1pbyc7XG5pbXBvcnQgKiBhcyBhd2FtYWlsIGZyb20gJy4vcHJvdmlkZXJzL2F3YW1haWwnO1xuaW1wb3J0ICogYXMgbWFpbFRtIGZyb20gJy4vcHJvdmlkZXJzL21haWwtdG0nO1xuaW1wb3J0ICogYXMgZHJvcG1haWwgZnJvbSAnLi9wcm92aWRlcnMvZHJvcG1haWwnO1xuaW1wb3J0IHsgQ2hhbm5lbCwgRW1haWxJbmZvLCBFbWFpbCwgRW1haWxBdHRhY2htZW50LCBHZXRFbWFpbHNSZXN1bHQsIEdlbmVyYXRlRW1haWxPcHRpb25zLCBHZXRFbWFpbHNPcHRpb25zIH0gZnJvbSAnLi90eXBlcyc7XG5pbXBvcnQgeyB3aXRoUmV0cnksIFJldHJ5T3B0aW9ucyB9IGZyb20gJy4vcmV0cnknO1xuaW1wb3J0IHsgbG9nZ2VyIH0gZnJvbSAnLi9sb2dnZXInO1xuXG5leHBvcnQgeyBDaGFubmVsLCBFbWFpbEluZm8sIEVtYWlsLCBFbWFpbEF0dGFjaG1lbnQsIEdldEVtYWlsc1Jlc3VsdCwgR2VuZXJhdGVFbWFpbE9wdGlvbnMsIEdldEVtYWlsc09wdGlvbnMgfSBmcm9tICcuL3R5cGVzJztcbmV4cG9ydCB7IG5vcm1hbGl6ZUVtYWlsIH0gZnJvbSAnLi9ub3JtYWxpemUnO1xuZXhwb3J0IHsgd2l0aFJldHJ5LCBmZXRjaFdpdGhUaW1lb3V0LCBSZXRyeU9wdGlvbnMgfSBmcm9tICcuL3JldHJ5JztcbmV4cG9ydCB7IExvZ0xldmVsLCBMb2dIYW5kbGVyLCBzZXRMb2dMZXZlbCwgZ2V0TG9nTGV2ZWwsIHNldExvZ2dlciwgbG9nZ2VyIH0gZnJvbSAnLi9sb2dnZXInO1xuXG4vKiog5rig6YGT5ZCN56ew5YiwIHByb3ZpZGVyIOWunueOsOeahOaYoOWwhOihqCAqL1xuY29uc3QgcHJvdmlkZXJzID0ge1xuICAndGVtcG1haWwnOiB0ZW1wbWFpbCxcbiAgJ2xpbnNoaS1lbWFpbCc6IGxpbnNoaUVtYWlsLFxuICAndGVtcG1haWwtbG9sJzogdGVtcG1haWxMb2wsXG4gICdjaGF0Z3B0LW9yZy11ayc6IGNoYXRncHRPcmdVayxcbiAgJ3RlbXBtYWlsLWxhJzogdGVtcG1haWxMYSxcbiAgJ3RlbXAtbWFpbC1pbyc6IHRlbXBNYWlsSU8sXG4gICdhd2FtYWlsJzogYXdhbWFpbCxcbiAgJ21haWwtdG0nOiBtYWlsVG0sXG4gICdkcm9wbWFpbCc6IGRyb3BtYWlsLFxufTtcblxuLyoqIOaJgOacieaUr+aMgeeahOa4oOmBk+WIl+ihqO+8jOeUqOS6jumaj+acuumAieaLqeWSjOmBjeWOhiAqL1xuY29uc3QgYWxsQ2hhbm5lbHM6IENoYW5uZWxbXSA9IFsndGVtcG1haWwnLCAnbGluc2hpLWVtYWlsJywgJ3RlbXBtYWlsLWxvbCcsICdjaGF0Z3B0LW9yZy11aycsICd0ZW1wbWFpbC1sYScsICd0ZW1wLW1haWwtaW8nLCAnYXdhbWFpbCcsICdtYWlsLXRtJywgJ2Ryb3BtYWlsJ107XG5cbi8qKlxuICog5rig6YGT5L+h5oGv77yM5YyF5ZCr5rig6YGT5qCH6K+G44CB5pi+56S65ZCN56ew5ZKM5a+55bqU572R56uZXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQ2hhbm5lbEluZm8ge1xuICAvKiog5rig6YGT5qCH6K+GICovXG4gIGNoYW5uZWw6IENoYW5uZWw7XG4gIC8qKiDmuKDpgZPmmL7npLrlkI3np7AgKi9cbiAgbmFtZTogc3RyaW5nO1xuICAvKiog5a+55bqU55qE5Li05pe26YKu566x5pyN5Yqh572R56uZICovXG4gIHdlYnNpdGU6IHN0cmluZztcbn1cblxuLyoqIOa4oOmBk+S/oeaBr+aYoOWwhOihqCAqL1xuY29uc3QgY2hhbm5lbEluZm9NYXA6IFJlY29yZDxDaGFubmVsLCBDaGFubmVsSW5mbz4gPSB7XG4gICd0ZW1wbWFpbCc6IHsgY2hhbm5lbDogJ3RlbXBtYWlsJywgbmFtZTogJ1RlbXBNYWlsJywgd2Vic2l0ZTogJ3RlbXBtYWlsLmluZycgfSxcbiAgJ2xpbnNoaS1lbWFpbCc6IHsgY2hhbm5lbDogJ2xpbnNoaS1lbWFpbCcsIG5hbWU6ICfkuLTml7bpgq7nrrEnLCB3ZWJzaXRlOiAnbGluc2hpLWVtYWlsLmNvbScgfSxcbiAgJ3RlbXBtYWlsLWxvbCc6IHsgY2hhbm5lbDogJ3RlbXBtYWlsLWxvbCcsIG5hbWU6ICdUZW1wTWFpbCBMT0wnLCB3ZWJzaXRlOiAndGVtcG1haWwubG9sJyB9LFxuICAnY2hhdGdwdC1vcmctdWsnOiB7IGNoYW5uZWw6ICdjaGF0Z3B0LW9yZy11aycsIG5hbWU6ICdDaGF0R1BUIE1haWwnLCB3ZWJzaXRlOiAnbWFpbC5jaGF0Z3B0Lm9yZy51aycgfSxcbiAgJ3RlbXBtYWlsLWxhJzogeyBjaGFubmVsOiAndGVtcG1haWwtbGEnLCBuYW1lOiAnVGVtcE1haWwgTEEnLCB3ZWJzaXRlOiAndGVtcG1haWwubGEnIH0sXG4gICd0ZW1wLW1haWwtaW8nOiB7IGNoYW5uZWw6ICd0ZW1wLW1haWwtaW8nLCBuYW1lOiAnVGVtcCBNYWlsIElPJywgd2Vic2l0ZTogJ3RlbXAtbWFpbC5pbycgfSxcbiAgJ2F3YW1haWwnOiB7IGNoYW5uZWw6ICdhd2FtYWlsJywgbmFtZTogJ0F3YU1haWwnLCB3ZWJzaXRlOiAnYXdhbWFpbC5jb20nIH0sXG4gICdtYWlsLXRtJzogeyBjaGFubmVsOiAnbWFpbC10bScsIG5hbWU6ICdNYWlsLnRtJywgd2Vic2l0ZTogJ21haWwudG0nIH0sXG4gICdkcm9wbWFpbCc6IHsgY2hhbm5lbDogJ2Ryb3BtYWlsJywgbmFtZTogJ0Ryb3BNYWlsJywgd2Vic2l0ZTogJ2Ryb3BtYWlsLm1lJyB9LFxufTtcblxuLyoqXG4gKiDojrflj5bmiYDmnInmlK/mjIHnmoTmuKDpgZPliJfooahcbiAqXG4gKiBAcmV0dXJucyDmiYDmnInmuKDpgZPnmoTkv6Hmga/mlbDnu4RcbiAqXG4gKiBAZXhhbXBsZVxuICogYGBgdHNcbiAqIGNvbnN0IGNoYW5uZWxzID0gbGlzdENoYW5uZWxzKCk7XG4gKiBjaGFubmVscy5mb3JFYWNoKGNoID0+IGNvbnNvbGUubG9nKGAke2NoLm5hbWV9ICgke2NoLndlYnNpdGV9KWApKTtcbiAqIGBgYFxuICovXG5leHBvcnQgZnVuY3Rpb24gbGlzdENoYW5uZWxzKCk6IENoYW5uZWxJbmZvW10ge1xuICByZXR1cm4gYWxsQ2hhbm5lbHMubWFwKGNoID0+IGNoYW5uZWxJbmZvTWFwW2NoXSk7XG59XG5cbi8qKlxuICog6I635Y+W5oyH5a6a5rig6YGT55qE6K+m57uG5L+h5oGvXG4gKlxuICogQHBhcmFtIGNoYW5uZWwgLSDmuKDpgZPmoIfor4ZcbiAqIEByZXR1cm5zIOa4oOmBk+S/oeaBr++8jOS4jeWtmOWcqOaXtui/lOWbniB1bmRlZmluZWRcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldENoYW5uZWxJbmZvKGNoYW5uZWw6IENoYW5uZWwpOiBDaGFubmVsSW5mbyB8IHVuZGVmaW5lZCB7XG4gIHJldHVybiBjaGFubmVsSW5mb01hcFtjaGFubmVsXTtcbn1cblxuLyoqXG4gKiDliJvlu7rkuLTml7bpgq7nrrFcbiAqXG4gKiDplJnor6/lpITnkIbnrZbnlaXvvJpcbiAqIC0g572R57uc6ZSZ6K+v44CB6LaF5pe244CB5pyN5Yqh56uvIDV4eCDplJnor68g4oaSIOiHquWKqOmHjeivle+8iOm7mOiupCAyIOasoe+8jOaMh+aVsOmAgOmBv++8iVxuICogLSA0eHgg5a6i5oi356uv6ZSZ6K+v44CB5Y+C5pWw6ZSZ6K+vIOKGkiDnm7TmjqXmipvlh7rlvILluLhcbiAqXG4gKiBAcGFyYW0gb3B0aW9ucyAtIOWIm+W7uumAiemhue+8jOWPr+aMh+Wumua4oOmBk+OAgeacieaViOaXtumVv+OAgeWfn+WQjeetiVxuICogQHJldHVybnMg6YKu566x5L+h5oGv77yM5YyF5ZCr5Zyw5Z2A44CB5Luk54mM562JXG4gKiBAdGhyb3dzIOmHjeivleiAl+WwveWQjuS7jeWksei0peaXtuaKm+WHuuW8guW4uFxuICpcbiAqIEBleGFtcGxlXG4gKiBgYGB0c1xuICogY29uc3QgZW1haWxJbmZvID0gYXdhaXQgZ2VuZXJhdGVFbWFpbCh7IGNoYW5uZWw6ICd0ZW1wLW1haWwtaW8nIH0pO1xuICogY29uc29sZS5sb2coZW1haWxJbmZvLmVtYWlsKTsgLy8g5Li05pe26YKu566x5Zyw5Z2AXG4gKiBgYGBcbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGdlbmVyYXRlRW1haWwob3B0aW9uczogR2VuZXJhdGVFbWFpbE9wdGlvbnMgPSB7fSk6IFByb21pc2U8RW1haWxJbmZvPiB7XG4gIGNvbnN0IGNoYW5uZWwgPSBvcHRpb25zLmNoYW5uZWwgfHwgYWxsQ2hhbm5lbHNbTWF0aC5mbG9vcihNYXRoLnJhbmRvbSgpICogYWxsQ2hhbm5lbHMubGVuZ3RoKV07XG5cbiAgbG9nZ2VyLmluZm8oYOWIm+W7uuS4tOaXtumCrueusSwg5rig6YGTOiAke2NoYW5uZWx9YCk7XG4gIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHdpdGhSZXRyeSgoKSA9PiBnZW5lcmF0ZUVtYWlsT25jZShjaGFubmVsLCBvcHRpb25zKSwgb3B0aW9ucy5yZXRyeSk7XG4gIGxvZ2dlci5pbmZvKGDpgq7nrrHliJvlu7rmiJDlip86ICR7cmVzdWx0LmVtYWlsfWApO1xuICByZXR1cm4gcmVzdWx0O1xufVxuXG4vKipcbiAqIOWNleasoeWIm+W7uumCrueuse+8iOS4jeWQq+mHjeivlemAu+i+ke+8iVxuICog5qC55o2u5rig6YGT57G75Z6L5YiG5Y+R5Yiw5a+55bqU55qEIHByb3ZpZGVyIOWunueOsFxuICovXG5hc3luYyBmdW5jdGlvbiBnZW5lcmF0ZUVtYWlsT25jZShjaGFubmVsOiBDaGFubmVsLCBvcHRpb25zOiBHZW5lcmF0ZUVtYWlsT3B0aW9ucyk6IFByb21pc2U8RW1haWxJbmZvPiB7XG4gIHN3aXRjaCAoY2hhbm5lbCkge1xuICAgIGNhc2UgJ3RlbXBtYWlsJzpcbiAgICAgIHJldHVybiB0ZW1wbWFpbC5nZW5lcmF0ZUVtYWlsKG9wdGlvbnMuZHVyYXRpb24gfHwgMzApO1xuICAgIGNhc2UgJ2xpbnNoaS1lbWFpbCc6XG4gICAgICByZXR1cm4gbGluc2hpRW1haWwuZ2VuZXJhdGVFbWFpbCgpO1xuICAgIGNhc2UgJ3RlbXBtYWlsLWxvbCc6XG4gICAgICByZXR1cm4gdGVtcG1haWxMb2wuZ2VuZXJhdGVFbWFpbChvcHRpb25zLmRvbWFpbiB8fCBudWxsKTtcbiAgICBjYXNlICdjaGF0Z3B0LW9yZy11ayc6XG4gICAgICByZXR1cm4gY2hhdGdwdE9yZ1VrLmdlbmVyYXRlRW1haWwoKTtcbiAgICBjYXNlICd0ZW1wbWFpbC1sYSc6XG4gICAgICByZXR1cm4gdGVtcG1haWxMYS5nZW5lcmF0ZUVtYWlsKCk7XG4gICAgY2FzZSAndGVtcC1tYWlsLWlvJzpcbiAgICAgIHJldHVybiB0ZW1wTWFpbElPLmdlbmVyYXRlRW1haWwoKTtcbiAgICBjYXNlICdhd2FtYWlsJzpcbiAgICAgIHJldHVybiBhd2FtYWlsLmdlbmVyYXRlRW1haWwoKTtcbiAgICBjYXNlICdtYWlsLXRtJzpcbiAgICAgIHJldHVybiBtYWlsVG0uZ2VuZXJhdGVFbWFpbCgpO1xuICAgIGNhc2UgJ2Ryb3BtYWlsJzpcbiAgICAgIHJldHVybiBkcm9wbWFpbC5nZW5lcmF0ZUVtYWlsKCk7XG4gICAgZGVmYXVsdDpcbiAgICAgIHRocm93IG5ldyBFcnJvcihgVW5rbm93biBjaGFubmVsOiAke2NoYW5uZWx9YCk7XG4gIH1cbn1cblxuLyoqXG4gKiDojrflj5bpgq7ku7bliJfooahcbiAqXG4gKiDplJnor6/lpITnkIbnrZbnlaXvvJpcbiAqIC0g572R57uc6ZSZ6K+v44CB6LaF5pe244CB5pyN5Yqh56uvIDV4eCDplJnor68g4oaSIOiHquWKqOmHjeivle+8iOm7mOiupCAyIOasoe+8iVxuICogLSDph43or5XogJflsL3lkI7ov5Tlm54geyBzdWNjZXNzOiBmYWxzZSwgZW1haWxzOiBbXSB977yM5LiN5oqb5byC5bi4XG4gKiAtIOWPguaVsOagoemqjOmUmeivr++8iOe8uuWwkSBjaGFubmVsIC8gdG9rZW7vvInnm7TmjqXmipvlh7pcbiAqXG4gKiDov5nnp43orr7orqHorqnosIPnlKjmlrnlnKjova7or6LlnLrmma/kuIvkuI3kvJrlm6DnvZHnu5zms6LliqjogIzkuK3mlq3mlbTkuKrmtYHnqIvvvIxcbiAqIOWPqumcgOajgOafpSBzdWNjZXNzIOWtl+auteWNs+WPr+WIpOaWreacrOasoeivt+axguaYr+WQpuaIkOWKn+OAglxuICpcbiAqIEBwYXJhbSBvcHRpb25zIC0g6I635Y+W6YCJ6aG577yM5YyF5ZCr5rig6YGT44CB6YKu566x5Zyw5Z2A44CB5Luk54mMXG4gKiBAcmV0dXJucyDpgq7ku7bnu5PmnpzvvIzljIXlkKsgc3VjY2VzcyDmoIforrDlkozpgq7ku7bliJfooahcbiAqXG4gKiBAZXhhbXBsZVxuICogYGBgdHNcbiAqIGNvbnN0IHJlc3VsdCA9IGF3YWl0IGdldEVtYWlscyh7XG4gKiAgIGNoYW5uZWw6IGVtYWlsSW5mby5jaGFubmVsLFxuICogICBlbWFpbDogZW1haWxJbmZvLmVtYWlsLFxuICogICB0b2tlbjogZW1haWxJbmZvLnRva2VuLFxuICogfSk7XG4gKiBpZiAocmVzdWx0LnN1Y2Nlc3MgJiYgcmVzdWx0LmVtYWlscy5sZW5ndGggPiAwKSB7XG4gKiAgIGNvbnNvbGUubG9nKCfmlLbliLDpgq7ku7Y6JywgcmVzdWx0LmVtYWlsc1swXS5zdWJqZWN0KTtcbiAqIH1cbiAqIGBgYFxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2V0RW1haWxzKG9wdGlvbnM6IEdldEVtYWlsc09wdGlvbnMpOiBQcm9taXNlPEdldEVtYWlsc1Jlc3VsdD4ge1xuICBjb25zdCB7IGNoYW5uZWwsIGVtYWlsLCB0b2tlbiB9ID0gb3B0aW9ucztcblxuICBpZiAoIWNoYW5uZWwpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ0NoYW5uZWwgaXMgcmVxdWlyZWQnKTtcbiAgfVxuICBpZiAoIWVtYWlsICYmIGNoYW5uZWwgIT09ICd0ZW1wbWFpbC1sb2wnKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdFbWFpbCBpcyByZXF1aXJlZCcpO1xuICB9XG5cbiAgbG9nZ2VyLmRlYnVnKGDojrflj5bpgq7ku7YsIOa4oOmBkzogJHtjaGFubmVsfSwg6YKu566xOiAke2VtYWlsfWApO1xuICB0cnkge1xuICAgIGNvbnN0IGVtYWlscyA9IGF3YWl0IHdpdGhSZXRyeSgoKSA9PiBnZXRFbWFpbHNPbmNlKGNoYW5uZWwsIGVtYWlsLCB0b2tlbiksIG9wdGlvbnMucmV0cnkpO1xuICAgIGlmIChlbWFpbHMubGVuZ3RoID4gMCkge1xuICAgICAgbG9nZ2VyLmluZm8oYOiOt+WPluWIsCAke2VtYWlscy5sZW5ndGh9IOWwgemCruS7tiwg5rig6YGTOiAke2NoYW5uZWx9YCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGxvZ2dlci5kZWJ1Zyhg5pqC5peg6YKu5Lu2LCDmuKDpgZM6ICR7Y2hhbm5lbH1gKTtcbiAgICB9XG4gICAgcmV0dXJuIHsgY2hhbm5lbCwgZW1haWwsIGVtYWlscywgc3VjY2VzczogdHJ1ZSB9O1xuICB9IGNhdGNoIChlcnI6IGFueSkge1xuICAgIC8qXG4gICAgICog6YeN6K+V6ICX5bC95ZCO5LuN54S25aSx6LSlIOKGkiDov5Tlm57nqbrnu5PmnpzogIzpnZ7mipvlvILluLhcbiAgICAgKiDov5nmoLfosIPnlKjmlrnlnKjova7or6LlnLrmma/kuIvkuI3kvJrlm6DkuLrkuIDmrKHnvZHnu5zms6LliqjogIzkuK3mlq3mlbTkuKrmtYHnqItcbiAgICAgKi9cbiAgICBsb2dnZXIuZXJyb3IoYOiOt+WPlumCruS7tuWksei0pSwg5rig6YGTOiAke2NoYW5uZWx9LCDplJnor686ICR7ZXJyLm1lc3NhZ2UgfHwgZXJyfWApO1xuICAgIHJldHVybiB7IGNoYW5uZWwsIGVtYWlsLCBlbWFpbHM6IFtdLCBzdWNjZXNzOiBmYWxzZSB9O1xuICB9XG59XG5cbi8qKlxuICog5Y2V5qyh6I635Y+W6YKu5Lu277yI5LiN5ZCr6YeN6K+V6YC76L6R77yJXG4gKiDmoLnmja7muKDpgZPnsbvlnovliIblj5HliLDlr7nlupTnmoQgcHJvdmlkZXIg5a6e546w77yM5bm25qCh6aqM5b+F6ZyA55qEIHRva2VuIOWPguaVsFxuICovXG5hc3luYyBmdW5jdGlvbiBnZXRFbWFpbHNPbmNlKGNoYW5uZWw6IENoYW5uZWwsIGVtYWlsOiBzdHJpbmcsIHRva2VuPzogc3RyaW5nKTogUHJvbWlzZTxFbWFpbFtdPiB7XG4gIHN3aXRjaCAoY2hhbm5lbCkge1xuICAgIGNhc2UgJ3RlbXBtYWlsJzpcbiAgICAgIHJldHVybiB0ZW1wbWFpbC5nZXRFbWFpbHMoZW1haWwpO1xuICAgIGNhc2UgJ2xpbnNoaS1lbWFpbCc6XG4gICAgICByZXR1cm4gbGluc2hpRW1haWwuZ2V0RW1haWxzKGVtYWlsKTtcbiAgICBjYXNlICd0ZW1wbWFpbC1sb2wnOlxuICAgICAgaWYgKCF0b2tlbikgdGhyb3cgbmV3IEVycm9yKCdUb2tlbiBpcyByZXF1aXJlZCBmb3IgdGVtcG1haWwtbG9sIGNoYW5uZWwnKTtcbiAgICAgIHJldHVybiB0ZW1wbWFpbExvbC5nZXRFbWFpbHModG9rZW4sIGVtYWlsKTtcbiAgICBjYXNlICdjaGF0Z3B0LW9yZy11ayc6XG4gICAgICByZXR1cm4gY2hhdGdwdE9yZ1VrLmdldEVtYWlscyhlbWFpbCk7XG4gICAgY2FzZSAndGVtcG1haWwtbGEnOlxuICAgICAgcmV0dXJuIHRlbXBtYWlsTGEuZ2V0RW1haWxzKGVtYWlsKTtcbiAgICBjYXNlICd0ZW1wLW1haWwtaW8nOlxuICAgICAgcmV0dXJuIHRlbXBNYWlsSU8uZ2V0RW1haWxzKGVtYWlsKTtcbiAgICBjYXNlICdhd2FtYWlsJzpcbiAgICAgIGlmICghdG9rZW4pIHRocm93IG5ldyBFcnJvcignVG9rZW4gaXMgcmVxdWlyZWQgZm9yIGF3YW1haWwgY2hhbm5lbCcpO1xuICAgICAgcmV0dXJuIGF3YW1haWwuZ2V0RW1haWxzKHRva2VuLCBlbWFpbCk7XG4gICAgY2FzZSAnbWFpbC10bSc6XG4gICAgICBpZiAoIXRva2VuKSB0aHJvdyBuZXcgRXJyb3IoJ1Rva2VuIGlzIHJlcXVpcmVkIGZvciBtYWlsLXRtIGNoYW5uZWwnKTtcbiAgICAgIHJldHVybiBtYWlsVG0uZ2V0RW1haWxzKHRva2VuLCBlbWFpbCk7XG4gICAgY2FzZSAnZHJvcG1haWwnOlxuICAgICAgaWYgKCF0b2tlbikgdGhyb3cgbmV3IEVycm9yKCdUb2tlbiBpcyByZXF1aXJlZCBmb3IgZHJvcG1haWwgY2hhbm5lbCcpO1xuICAgICAgcmV0dXJuIGRyb3BtYWlsLmdldEVtYWlscyh0b2tlbiwgZW1haWwpO1xuICAgIGRlZmF1bHQ6XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYFVua25vd24gY2hhbm5lbDogJHtjaGFubmVsfWApO1xuICB9XG59XG5cbi8qKlxuICog5Li05pe26YKu566x5a6i5oi356uvXG4gKiDlsIHoo4Xkuobpgq7nrrHliJvlu7rlkozpgq7ku7bojrflj5bnmoTlrozmlbTmtYHnqIvvvIzoh6rliqjnrqHnkIbpgq7nrrHkv6Hmga/lkozorqTor4Hku6TniYxcbiAqXG4gKiBAZXhhbXBsZVxuICogYGBgdHNcbiAqIGNvbnN0IGNsaWVudCA9IG5ldyBUZW1wRW1haWxDbGllbnQoKTtcbiAqIGNvbnN0IGVtYWlsSW5mbyA9IGF3YWl0IGNsaWVudC5nZW5lcmF0ZSh7IGNoYW5uZWw6ICdtYWlsLXRtJyB9KTtcbiAqIGNvbnNvbGUubG9nKCfpgq7nrrE6JywgZW1haWxJbmZvLmVtYWlsKTtcbiAqXG4gKiAvLyDova7or6Lojrflj5bpgq7ku7ZcbiAqIGNvbnN0IHJlc3VsdCA9IGF3YWl0IGNsaWVudC5nZXRFbWFpbHMoKTtcbiAqIGlmIChyZXN1bHQuc3VjY2Vzcykge1xuICogICBjb25zb2xlLmxvZygn6YKu5Lu25pWwOicsIHJlc3VsdC5lbWFpbHMubGVuZ3RoKTtcbiAqIH1cbiAqIGBgYFxuICovXG5leHBvcnQgY2xhc3MgVGVtcEVtYWlsQ2xpZW50IHtcbiAgcHJpdmF0ZSBlbWFpbEluZm86IEVtYWlsSW5mbyB8IG51bGwgPSBudWxsO1xuXG4gIC8qKlxuICAgKiDliJvlu7rkuLTml7bpgq7nrrHlubbnvJPlrZjpgq7nrrHkv6Hmga9cbiAgICog5ZCO57ut6LCD55SoIGdldEVtYWlscygpIOaXtuiHquWKqOS9v+eUqOatpOmCrueuseeahOa4oOmBk+OAgeWcsOWdgOWSjOS7pOeJjFxuICAgKi9cbiAgYXN5bmMgZ2VuZXJhdGUob3B0aW9uczogR2VuZXJhdGVFbWFpbE9wdGlvbnMgPSB7fSk6IFByb21pc2U8RW1haWxJbmZvPiB7XG4gICAgdGhpcy5lbWFpbEluZm8gPSBhd2FpdCBnZW5lcmF0ZUVtYWlsKG9wdGlvbnMpO1xuICAgIHJldHVybiB0aGlzLmVtYWlsSW5mbztcbiAgfVxuXG4gIC8qKlxuICAgKiDojrflj5blvZPliY3pgq7nrrHnmoTpgq7ku7bliJfooahcbiAgICog5b+F6aG75YWI6LCD55SoIGdlbmVyYXRlKCkg5Yib5bu66YKu566xXG4gICAqXG4gICAqIEB0aHJvd3Mg5pyq6LCD55SoIGdlbmVyYXRlKCkg5pe25oqb5Ye65byC5bi4XG4gICAqL1xuICBhc3luYyBnZXRFbWFpbHMoKTogUHJvbWlzZTxHZXRFbWFpbHNSZXN1bHQ+IHtcbiAgICBpZiAoIXRoaXMuZW1haWxJbmZvKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ05vIGVtYWlsIGdlbmVyYXRlZC4gQ2FsbCBnZW5lcmF0ZSgpIGZpcnN0LicpO1xuICAgIH1cblxuICAgIHJldHVybiBnZXRFbWFpbHMoe1xuICAgICAgY2hhbm5lbDogdGhpcy5lbWFpbEluZm8uY2hhbm5lbCxcbiAgICAgIGVtYWlsOiB0aGlzLmVtYWlsSW5mby5lbWFpbCxcbiAgICAgIHRva2VuOiB0aGlzLmVtYWlsSW5mby50b2tlbixcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiDojrflj5blvZPliY3nvJPlrZjnmoTpgq7nrrHkv6Hmga9cbiAgICog5pyq6LCD55SoIGdlbmVyYXRlKCkg5pe26L+U5ZueIG51bGxcbiAgICovXG4gIGdldEVtYWlsSW5mbygpOiBFbWFpbEluZm8gfCBudWxsIHtcbiAgICByZXR1cm4gdGhpcy5lbWFpbEluZm87XG4gIH1cbn1cblxuZXhwb3J0IGRlZmF1bHQge1xuICBsaXN0Q2hhbm5lbHMsXG4gIGdldENoYW5uZWxJbmZvLFxuICBnZW5lcmF0ZUVtYWlsLFxuICBnZXRFbWFpbHMsXG4gIFRlbXBFbWFpbENsaWVudCxcbn07XG4iXX0=
|
package/dist/logger.d.ts
ADDED
|
@@ -0,0 +1,73 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* SDK 日志模块
|
|
3
|
+
* 提供分级日志能力,支持自定义日志处理器
|
|
4
|
+
* 默认静默不输出,用户可通过 setLogLevel / setLogger 启用
|
|
5
|
+
*/
|
|
6
|
+
/**
|
|
7
|
+
* 日志级别枚举
|
|
8
|
+
* 数值越小级别越高,设置某级别后只输出该级别及以上的日志
|
|
9
|
+
*/
|
|
10
|
+
export declare enum LogLevel {
|
|
11
|
+
/** 关闭所有日志 */
|
|
12
|
+
SILENT = 0,
|
|
13
|
+
/** 错误日志:请求失败、重试耗尽等 */
|
|
14
|
+
ERROR = 1,
|
|
15
|
+
/** 警告日志:重试中、降级处理等 */
|
|
16
|
+
WARN = 2,
|
|
17
|
+
/** 信息日志:请求开始、完成等关键流程 */
|
|
18
|
+
INFO = 3,
|
|
19
|
+
/** 调试日志:请求详情、响应内容等 */
|
|
20
|
+
DEBUG = 4
|
|
21
|
+
}
|
|
22
|
+
/**
|
|
23
|
+
* 日志处理器接口
|
|
24
|
+
* 用户可实现此接口来自定义日志输出方式(如写文件、发送到远程等)
|
|
25
|
+
*/
|
|
26
|
+
export interface LogHandler {
|
|
27
|
+
error(message: string, ...args: any[]): void;
|
|
28
|
+
warn(message: string, ...args: any[]): void;
|
|
29
|
+
info(message: string, ...args: any[]): void;
|
|
30
|
+
debug(message: string, ...args: any[]): void;
|
|
31
|
+
}
|
|
32
|
+
/**
|
|
33
|
+
* 设置日志级别
|
|
34
|
+
* 默认 SILENT(不输出任何日志)
|
|
35
|
+
*
|
|
36
|
+
* @example
|
|
37
|
+
* ```ts
|
|
38
|
+
* import { setLogLevel, LogLevel } from 'tempmail-sdk';
|
|
39
|
+
* setLogLevel(LogLevel.DEBUG); // 开启所有日志
|
|
40
|
+
* setLogLevel(LogLevel.INFO); // 只输出 INFO 及以上
|
|
41
|
+
* ```
|
|
42
|
+
*/
|
|
43
|
+
export declare function setLogLevel(level: LogLevel): void;
|
|
44
|
+
/**
|
|
45
|
+
* 获取当前日志级别
|
|
46
|
+
*/
|
|
47
|
+
export declare function getLogLevel(): LogLevel;
|
|
48
|
+
/**
|
|
49
|
+
* 设置自定义日志处理器
|
|
50
|
+
* 替换默认的 console 输出
|
|
51
|
+
*
|
|
52
|
+
* @example
|
|
53
|
+
* ```ts
|
|
54
|
+
* import { setLogger } from 'tempmail-sdk';
|
|
55
|
+
* setLogger({
|
|
56
|
+
* error: (msg, ...args) => myLogger.error(msg, ...args),
|
|
57
|
+
* warn: (msg, ...args) => myLogger.warn(msg, ...args),
|
|
58
|
+
* info: (msg, ...args) => myLogger.info(msg, ...args),
|
|
59
|
+
* debug: (msg, ...args) => myLogger.debug(msg, ...args),
|
|
60
|
+
* });
|
|
61
|
+
* ```
|
|
62
|
+
*/
|
|
63
|
+
export declare function setLogger(handler: LogHandler): void;
|
|
64
|
+
/**
|
|
65
|
+
* SDK 内部日志工具
|
|
66
|
+
* 根据当前日志级别过滤输出
|
|
67
|
+
*/
|
|
68
|
+
export declare const logger: {
|
|
69
|
+
error(msg: string, ...args: any[]): void;
|
|
70
|
+
warn(msg: string, ...args: any[]): void;
|
|
71
|
+
info(msg: string, ...args: any[]): void;
|
|
72
|
+
debug(msg: string, ...args: any[]): void;
|
|
73
|
+
};
|
package/dist/logger.js
ADDED
|
@@ -0,0 +1,100 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* SDK 日志模块
|
|
4
|
+
* 提供分级日志能力,支持自定义日志处理器
|
|
5
|
+
* 默认静默不输出,用户可通过 setLogLevel / setLogger 启用
|
|
6
|
+
*/
|
|
7
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
8
|
+
exports.logger = exports.LogLevel = void 0;
|
|
9
|
+
exports.setLogLevel = setLogLevel;
|
|
10
|
+
exports.getLogLevel = getLogLevel;
|
|
11
|
+
exports.setLogger = setLogger;
|
|
12
|
+
/**
|
|
13
|
+
* 日志级别枚举
|
|
14
|
+
* 数值越小级别越高,设置某级别后只输出该级别及以上的日志
|
|
15
|
+
*/
|
|
16
|
+
var LogLevel;
|
|
17
|
+
(function (LogLevel) {
|
|
18
|
+
/** 关闭所有日志 */
|
|
19
|
+
LogLevel[LogLevel["SILENT"] = 0] = "SILENT";
|
|
20
|
+
/** 错误日志:请求失败、重试耗尽等 */
|
|
21
|
+
LogLevel[LogLevel["ERROR"] = 1] = "ERROR";
|
|
22
|
+
/** 警告日志:重试中、降级处理等 */
|
|
23
|
+
LogLevel[LogLevel["WARN"] = 2] = "WARN";
|
|
24
|
+
/** 信息日志:请求开始、完成等关键流程 */
|
|
25
|
+
LogLevel[LogLevel["INFO"] = 3] = "INFO";
|
|
26
|
+
/** 调试日志:请求详情、响应内容等 */
|
|
27
|
+
LogLevel[LogLevel["DEBUG"] = 4] = "DEBUG";
|
|
28
|
+
})(LogLevel || (exports.LogLevel = LogLevel = {}));
|
|
29
|
+
/**
|
|
30
|
+
* 默认日志处理器,直接输出到 console
|
|
31
|
+
*/
|
|
32
|
+
const defaultHandler = {
|
|
33
|
+
error: (msg, ...args) => console.error(msg, ...args),
|
|
34
|
+
warn: (msg, ...args) => console.warn(msg, ...args),
|
|
35
|
+
info: (msg, ...args) => console.info(msg, ...args),
|
|
36
|
+
debug: (msg, ...args) => console.debug(msg, ...args),
|
|
37
|
+
};
|
|
38
|
+
let currentLevel = LogLevel.SILENT;
|
|
39
|
+
let currentHandler = defaultHandler;
|
|
40
|
+
/**
|
|
41
|
+
* 设置日志级别
|
|
42
|
+
* 默认 SILENT(不输出任何日志)
|
|
43
|
+
*
|
|
44
|
+
* @example
|
|
45
|
+
* ```ts
|
|
46
|
+
* import { setLogLevel, LogLevel } from 'tempmail-sdk';
|
|
47
|
+
* setLogLevel(LogLevel.DEBUG); // 开启所有日志
|
|
48
|
+
* setLogLevel(LogLevel.INFO); // 只输出 INFO 及以上
|
|
49
|
+
* ```
|
|
50
|
+
*/
|
|
51
|
+
function setLogLevel(level) {
|
|
52
|
+
currentLevel = level;
|
|
53
|
+
}
|
|
54
|
+
/**
|
|
55
|
+
* 获取当前日志级别
|
|
56
|
+
*/
|
|
57
|
+
function getLogLevel() {
|
|
58
|
+
return currentLevel;
|
|
59
|
+
}
|
|
60
|
+
/**
|
|
61
|
+
* 设置自定义日志处理器
|
|
62
|
+
* 替换默认的 console 输出
|
|
63
|
+
*
|
|
64
|
+
* @example
|
|
65
|
+
* ```ts
|
|
66
|
+
* import { setLogger } from 'tempmail-sdk';
|
|
67
|
+
* setLogger({
|
|
68
|
+
* error: (msg, ...args) => myLogger.error(msg, ...args),
|
|
69
|
+
* warn: (msg, ...args) => myLogger.warn(msg, ...args),
|
|
70
|
+
* info: (msg, ...args) => myLogger.info(msg, ...args),
|
|
71
|
+
* debug: (msg, ...args) => myLogger.debug(msg, ...args),
|
|
72
|
+
* });
|
|
73
|
+
* ```
|
|
74
|
+
*/
|
|
75
|
+
function setLogger(handler) {
|
|
76
|
+
currentHandler = handler;
|
|
77
|
+
}
|
|
78
|
+
/**
|
|
79
|
+
* SDK 内部日志工具
|
|
80
|
+
* 根据当前日志级别过滤输出
|
|
81
|
+
*/
|
|
82
|
+
exports.logger = {
|
|
83
|
+
error(msg, ...args) {
|
|
84
|
+
if (currentLevel >= LogLevel.ERROR)
|
|
85
|
+
currentHandler.error(msg, ...args);
|
|
86
|
+
},
|
|
87
|
+
warn(msg, ...args) {
|
|
88
|
+
if (currentLevel >= LogLevel.WARN)
|
|
89
|
+
currentHandler.warn(msg, ...args);
|
|
90
|
+
},
|
|
91
|
+
info(msg, ...args) {
|
|
92
|
+
if (currentLevel >= LogLevel.INFO)
|
|
93
|
+
currentHandler.info(msg, ...args);
|
|
94
|
+
},
|
|
95
|
+
debug(msg, ...args) {
|
|
96
|
+
if (currentLevel >= LogLevel.DEBUG)
|
|
97
|
+
currentHandler.debug(msg, ...args);
|
|
98
|
+
},
|
|
99
|
+
};
|
|
100
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibG9nZ2VyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vc3JjL2xvZ2dlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUE7Ozs7R0FJRzs7O0FBc0RILGtDQUVDO0FBS0Qsa0NBRUM7QUFpQkQsOEJBRUM7QUFoRkQ7OztHQUdHO0FBQ0gsSUFBWSxRQVdYO0FBWEQsV0FBWSxRQUFRO0lBQ2xCLGFBQWE7SUFDYiwyQ0FBVSxDQUFBO0lBQ1Ysc0JBQXNCO0lBQ3RCLHlDQUFTLENBQUE7SUFDVCxxQkFBcUI7SUFDckIsdUNBQVEsQ0FBQTtJQUNSLHdCQUF3QjtJQUN4Qix1Q0FBUSxDQUFBO0lBQ1Isc0JBQXNCO0lBQ3RCLHlDQUFTLENBQUE7QUFDWCxDQUFDLEVBWFcsUUFBUSx3QkFBUixRQUFRLFFBV25CO0FBYUQ7O0dBRUc7QUFDSCxNQUFNLGNBQWMsR0FBZTtJQUNqQyxLQUFLLEVBQUUsQ0FBQyxHQUFHLEVBQUUsR0FBRyxJQUFJLEVBQUUsRUFBRSxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsR0FBRyxFQUFFLEdBQUcsSUFBSSxDQUFDO0lBQ3BELElBQUksRUFBRSxDQUFDLEdBQUcsRUFBRSxHQUFHLElBQUksRUFBRSxFQUFFLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxHQUFHLEVBQUUsR0FBRyxJQUFJLENBQUM7SUFDbEQsSUFBSSxFQUFFLENBQUMsR0FBRyxFQUFFLEdBQUcsSUFBSSxFQUFFLEVBQUUsQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLEdBQUcsRUFBRSxHQUFHLElBQUksQ0FBQztJQUNsRCxLQUFLLEVBQUUsQ0FBQyxHQUFHLEVBQUUsR0FBRyxJQUFJLEVBQUUsRUFBRSxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsR0FBRyxFQUFFLEdBQUcsSUFBSSxDQUFDO0NBQ3JELENBQUM7QUFFRixJQUFJLFlBQVksR0FBYSxRQUFRLENBQUMsTUFBTSxDQUFDO0FBQzdDLElBQUksY0FBYyxHQUFlLGNBQWMsQ0FBQztBQUVoRDs7Ozs7Ozs7OztHQVVHO0FBQ0gsU0FBZ0IsV0FBVyxDQUFDLEtBQWU7SUFDekMsWUFBWSxHQUFHLEtBQUssQ0FBQztBQUN2QixDQUFDO0FBRUQ7O0dBRUc7QUFDSCxTQUFnQixXQUFXO0lBQ3pCLE9BQU8sWUFBWSxDQUFDO0FBQ3RCLENBQUM7QUFFRDs7Ozs7Ozs7Ozs7Ozs7R0FjRztBQUNILFNBQWdCLFNBQVMsQ0FBQyxPQUFtQjtJQUMzQyxjQUFjLEdBQUcsT0FBTyxDQUFDO0FBQzNCLENBQUM7QUFFRDs7O0dBR0c7QUFDVSxRQUFBLE1BQU0sR0FBRztJQUNwQixLQUFLLENBQUMsR0FBVyxFQUFFLEdBQUcsSUFBVztRQUMvQixJQUFJLFlBQVksSUFBSSxRQUFRLENBQUMsS0FBSztZQUFFLGNBQWMsQ0FBQyxLQUFLLENBQUMsR0FBRyxFQUFFLEdBQUcsSUFBSSxDQUFDLENBQUM7SUFDekUsQ0FBQztJQUNELElBQUksQ0FBQyxHQUFXLEVBQUUsR0FBRyxJQUFXO1FBQzlCLElBQUksWUFBWSxJQUFJLFFBQVEsQ0FBQyxJQUFJO1lBQUUsY0FBYyxDQUFDLElBQUksQ0FBQyxHQUFHLEVBQUUsR0FBRyxJQUFJLENBQUMsQ0FBQztJQUN2RSxDQUFDO0lBQ0QsSUFBSSxDQUFDLEdBQVcsRUFBRSxHQUFHLElBQVc7UUFDOUIsSUFBSSxZQUFZLElBQUksUUFBUSxDQUFDLElBQUk7WUFBRSxjQUFjLENBQUMsSUFBSSxDQUFDLEdBQUcsRUFBRSxHQUFHLElBQUksQ0FBQyxDQUFDO0lBQ3ZFLENBQUM7SUFDRCxLQUFLLENBQUMsR0FBVyxFQUFFLEdBQUcsSUFBVztRQUMvQixJQUFJLFlBQVksSUFBSSxRQUFRLENBQUMsS0FBSztZQUFFLGNBQWMsQ0FBQyxLQUFLLENBQUMsR0FBRyxFQUFFLEdBQUcsSUFBSSxDQUFDLENBQUM7SUFDekUsQ0FBQztDQUNGLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIFNESyDml6Xlv5fmqKHlnZdcbiAqIOaPkOS+m+WIhue6p+aXpeW/l+iDveWKm++8jOaUr+aMgeiHquWumuS5ieaXpeW/l+WkhOeQhuWZqFxuICog6buY6K6k6Z2Z6buY5LiN6L6T5Ye677yM55So5oi35Y+v6YCa6L+HIHNldExvZ0xldmVsIC8gc2V0TG9nZ2VyIOWQr+eUqFxuICovXG5cbi8qKlxuICog5pel5b+X57qn5Yir5p6a5Li+XG4gKiDmlbDlgLzotorlsI/nuqfliKvotorpq5jvvIzorr7nva7mn5DnuqfliKvlkI7lj6rovpPlh7ror6XnuqfliKvlj4rku6XkuIrnmoTml6Xlv5dcbiAqL1xuZXhwb3J0IGVudW0gTG9nTGV2ZWwge1xuICAvKiog5YWz6Zet5omA5pyJ5pel5b+XICovXG4gIFNJTEVOVCA9IDAsXG4gIC8qKiDplJnor6/ml6Xlv5fvvJror7fmsYLlpLHotKXjgIHph43or5XogJflsL3nrYkgKi9cbiAgRVJST1IgPSAxLFxuICAvKiog6K2m5ZGK5pel5b+X77ya6YeN6K+V5Lit44CB6ZmN57qn5aSE55CG562JICovXG4gIFdBUk4gPSAyLFxuICAvKiog5L+h5oGv5pel5b+X77ya6K+35rGC5byA5aeL44CB5a6M5oiQ562J5YWz6ZSu5rWB56iLICovXG4gIElORk8gPSAzLFxuICAvKiog6LCD6K+V5pel5b+X77ya6K+35rGC6K+m5oOF44CB5ZON5bqU5YaF5a65562JICovXG4gIERFQlVHID0gNCxcbn1cblxuLyoqXG4gKiDml6Xlv5flpITnkIblmajmjqXlj6NcbiAqIOeUqOaIt+WPr+WunueOsOatpOaOpeWPo+adpeiHquWumuS5ieaXpeW/l+i+k+WHuuaWueW8j++8iOWmguWGmeaWh+S7tuOAgeWPkemAgeWIsOi/nOeoi+etie+8iVxuICovXG5leHBvcnQgaW50ZXJmYWNlIExvZ0hhbmRsZXIge1xuICBlcnJvcihtZXNzYWdlOiBzdHJpbmcsIC4uLmFyZ3M6IGFueVtdKTogdm9pZDtcbiAgd2FybihtZXNzYWdlOiBzdHJpbmcsIC4uLmFyZ3M6IGFueVtdKTogdm9pZDtcbiAgaW5mbyhtZXNzYWdlOiBzdHJpbmcsIC4uLmFyZ3M6IGFueVtdKTogdm9pZDtcbiAgZGVidWcobWVzc2FnZTogc3RyaW5nLCAuLi5hcmdzOiBhbnlbXSk6IHZvaWQ7XG59XG5cbi8qKlxuICog6buY6K6k5pel5b+X5aSE55CG5Zmo77yM55u05o6l6L6T5Ye65YiwIGNvbnNvbGVcbiAqL1xuY29uc3QgZGVmYXVsdEhhbmRsZXI6IExvZ0hhbmRsZXIgPSB7XG4gIGVycm9yOiAobXNnLCAuLi5hcmdzKSA9PiBjb25zb2xlLmVycm9yKG1zZywgLi4uYXJncyksXG4gIHdhcm46IChtc2csIC4uLmFyZ3MpID0+IGNvbnNvbGUud2Fybihtc2csIC4uLmFyZ3MpLFxuICBpbmZvOiAobXNnLCAuLi5hcmdzKSA9PiBjb25zb2xlLmluZm8obXNnLCAuLi5hcmdzKSxcbiAgZGVidWc6IChtc2csIC4uLmFyZ3MpID0+IGNvbnNvbGUuZGVidWcobXNnLCAuLi5hcmdzKSxcbn07XG5cbmxldCBjdXJyZW50TGV2ZWw6IExvZ0xldmVsID0gTG9nTGV2ZWwuU0lMRU5UO1xubGV0IGN1cnJlbnRIYW5kbGVyOiBMb2dIYW5kbGVyID0gZGVmYXVsdEhhbmRsZXI7XG5cbi8qKlxuICog6K6+572u5pel5b+X57qn5YirXG4gKiDpu5jorqQgU0lMRU5U77yI5LiN6L6T5Ye65Lu75L2V5pel5b+X77yJXG4gKlxuICogQGV4YW1wbGVcbiAqIGBgYHRzXG4gKiBpbXBvcnQgeyBzZXRMb2dMZXZlbCwgTG9nTGV2ZWwgfSBmcm9tICd0ZW1wbWFpbC1zZGsnO1xuICogc2V0TG9nTGV2ZWwoTG9nTGV2ZWwuREVCVUcpOyAvLyDlvIDlkK/miYDmnInml6Xlv5dcbiAqIHNldExvZ0xldmVsKExvZ0xldmVsLklORk8pOyAgLy8g5Y+q6L6T5Ye6IElORk8g5Y+K5Lul5LiKXG4gKiBgYGBcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHNldExvZ0xldmVsKGxldmVsOiBMb2dMZXZlbCk6IHZvaWQge1xuICBjdXJyZW50TGV2ZWwgPSBsZXZlbDtcbn1cblxuLyoqXG4gKiDojrflj5blvZPliY3ml6Xlv5fnuqfliKtcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldExvZ0xldmVsKCk6IExvZ0xldmVsIHtcbiAgcmV0dXJuIGN1cnJlbnRMZXZlbDtcbn1cblxuLyoqXG4gKiDorr7nva7oh6rlrprkuYnml6Xlv5flpITnkIblmahcbiAqIOabv+aNoum7mOiupOeahCBjb25zb2xlIOi+k+WHulxuICpcbiAqIEBleGFtcGxlXG4gKiBgYGB0c1xuICogaW1wb3J0IHsgc2V0TG9nZ2VyIH0gZnJvbSAndGVtcG1haWwtc2RrJztcbiAqIHNldExvZ2dlcih7XG4gKiAgIGVycm9yOiAobXNnLCAuLi5hcmdzKSA9PiBteUxvZ2dlci5lcnJvcihtc2csIC4uLmFyZ3MpLFxuICogICB3YXJuOiAgKG1zZywgLi4uYXJncykgPT4gbXlMb2dnZXIud2Fybihtc2csIC4uLmFyZ3MpLFxuICogICBpbmZvOiAgKG1zZywgLi4uYXJncykgPT4gbXlMb2dnZXIuaW5mbyhtc2csIC4uLmFyZ3MpLFxuICogICBkZWJ1ZzogKG1zZywgLi4uYXJncykgPT4gbXlMb2dnZXIuZGVidWcobXNnLCAuLi5hcmdzKSxcbiAqIH0pO1xuICogYGBgXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBzZXRMb2dnZXIoaGFuZGxlcjogTG9nSGFuZGxlcik6IHZvaWQge1xuICBjdXJyZW50SGFuZGxlciA9IGhhbmRsZXI7XG59XG5cbi8qKlxuICogU0RLIOWGhemDqOaXpeW/l+W3peWFt1xuICog5qC55o2u5b2T5YmN5pel5b+X57qn5Yir6L+H5ruk6L6T5Ye6XG4gKi9cbmV4cG9ydCBjb25zdCBsb2dnZXIgPSB7XG4gIGVycm9yKG1zZzogc3RyaW5nLCAuLi5hcmdzOiBhbnlbXSk6IHZvaWQge1xuICAgIGlmIChjdXJyZW50TGV2ZWwgPj0gTG9nTGV2ZWwuRVJST1IpIGN1cnJlbnRIYW5kbGVyLmVycm9yKG1zZywgLi4uYXJncyk7XG4gIH0sXG4gIHdhcm4obXNnOiBzdHJpbmcsIC4uLmFyZ3M6IGFueVtdKTogdm9pZCB7XG4gICAgaWYgKGN1cnJlbnRMZXZlbCA+PSBMb2dMZXZlbC5XQVJOKSBjdXJyZW50SGFuZGxlci53YXJuKG1zZywgLi4uYXJncyk7XG4gIH0sXG4gIGluZm8obXNnOiBzdHJpbmcsIC4uLmFyZ3M6IGFueVtdKTogdm9pZCB7XG4gICAgaWYgKGN1cnJlbnRMZXZlbCA+PSBMb2dMZXZlbC5JTkZPKSBjdXJyZW50SGFuZGxlci5pbmZvKG1zZywgLi4uYXJncyk7XG4gIH0sXG4gIGRlYnVnKG1zZzogc3RyaW5nLCAuLi5hcmdzOiBhbnlbXSk6IHZvaWQge1xuICAgIGlmIChjdXJyZW50TGV2ZWwgPj0gTG9nTGV2ZWwuREVCVUcpIGN1cnJlbnRIYW5kbGVyLmRlYnVnKG1zZywgLi4uYXJncyk7XG4gIH0sXG59O1xuIl19
|
package/dist/normalize.d.ts
CHANGED
|
@@ -1,5 +1,12 @@
|
|
|
1
1
|
import { Email } from './types';
|
|
2
2
|
/**
|
|
3
3
|
* 将各提供商返回的原始邮件数据标准化为统一的 Email 格式
|
|
4
|
+
*
|
|
5
|
+
* 不同渠道的 API 返回字段名各不相同,此函数通过多字段候选策略
|
|
6
|
+
* 将它们统一映射为标准的 Email 结构,保证 SDK 输出一致性。
|
|
7
|
+
*
|
|
8
|
+
* @param raw - 原始邮件数据(来自不同提供商的 API 响应)
|
|
9
|
+
* @param recipientEmail - 收件人邮箱地址,当原始数据中无收件人字段时用作回退值
|
|
10
|
+
* @returns 标准化的 Email 对象
|
|
4
11
|
*/
|
|
5
12
|
export declare function normalizeEmail(raw: any, recipientEmail?: string): Email;
|