tempmail-sdk 1.0.1 → 1.0.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 CHANGED
@@ -1,10 +1,9 @@
1
- # temp-email-sdk
1
+ # tempmail-sdk
2
2
 
3
- 临时邮箱 SDK,支持多个邮箱服务提供商。
3
+ [![npm version](https://badge.fury.io/js/tempmail-sdk.svg)](https://www.npmjs.com/package/tempmail-sdk)
4
+ [![License: GPL v3](https://img.shields.io/badge/License-GPLv3-blue.svg)](https://www.gnu.org/licenses/gpl-3.0)
4
5
 
5
- ## 许可证
6
-
7
- GPL-3.0
6
+ 临时邮箱 SDK(TypeScript/Node.js),支持 9 个邮箱服务提供商,所有渠道返回**统一标准化格式**。
8
7
 
9
8
  ## 安装
10
9
 
@@ -14,40 +13,78 @@ npm install tempmail-sdk
14
13
 
15
14
  ## 支持的渠道
16
15
 
17
- | 渠道 | 服务商 |
18
- |------|--------|
19
- | `tempmail` | tempmail.ing |
20
- | `linshi-email` | linshi-email.com |
21
- | `tempmail-lol` | tempmail.lol |
22
- | `chatgpt-org-uk` | mail.chatgpt.org.uk |
16
+ | 渠道 | 服务商 | 需要 Token | 说明 |
17
+ |------|--------|:----------:|------|
18
+ | `tempmail` | tempmail.ing | - | 支持自定义有效期 |
19
+ | `linshi-email` | linshi-email.com | - | |
20
+ | `tempmail-lol` | tempmail.lol | ✅ | 支持指定域名 |
21
+ | `chatgpt-org-uk` | mail.chatgpt.org.uk | - | |
22
+ | `tempmail-la` | tempmail.la | - | 支持分页 |
23
+ | `temp-mail-io` | temp-mail.io | - | |
24
+ | `awamail` | awamail.com | ✅ | Session Cookie 自动管理 |
25
+ | `mail-tm` | mail.tm | ✅ | 自动注册账号获取 Bearer Token |
26
+ | `dropmail` | dropmail.me | ✅ | GraphQL API |
27
+
28
+ > **提示:** 使用 `TempEmailClient` 类时无需手动处理 Token,SDK 自动管理。
29
+
30
+ ## 快速开始
31
+
32
+ ### 使用 TempEmailClient(推荐)
33
+
34
+ ```typescript
35
+ import { TempEmailClient } from 'tempmail-sdk';
36
+
37
+ const client = new TempEmailClient();
38
+
39
+ // 获取临时邮箱(可指定渠道,不指定则随机)
40
+ const emailInfo = await client.generate({ channel: 'tempmail' });
41
+ console.log(`渠道: ${emailInfo.channel}`);
42
+ console.log(`邮箱: ${emailInfo.email}`);
43
+ if (emailInfo.expiresAt) console.log(`过期时间: ${emailInfo.expiresAt}`);
44
+
45
+ // 获取邮件(Token 自动传递,无需手动处理)
46
+ const result = await client.getEmails();
47
+ console.log(`收到 ${result.emails.length} 封邮件`);
23
48
 
24
- ## 使用方法
49
+ for (const email of result.emails) {
50
+ console.log(`发件人: ${email.from}`);
51
+ console.log(`主题: ${email.subject}`);
52
+ console.log(`内容: ${email.text}`);
53
+ console.log(`时间: ${email.date}`);
54
+ console.log(`已读: ${email.isRead}`);
55
+ console.log(`附件: ${email.attachments.length} 个`);
56
+ }
57
+ ```
25
58
 
26
- ### 列出所有提供商
59
+ ### 使用函数式 API
60
+
61
+ #### 列出所有渠道
27
62
 
28
63
  ```typescript
29
- import { listChannels, getChannelInfo } from 'temp-email-sdk';
64
+ import { listChannels, getChannelInfo } from 'tempmail-sdk';
30
65
 
31
- // 获取所有支持的渠道
32
66
  const channels = listChannels();
33
67
  console.log(channels);
34
68
  // [
35
69
  // { channel: 'tempmail', name: 'TempMail', website: 'tempmail.ing' },
36
70
  // { channel: 'linshi-email', name: '临时邮箱', website: 'linshi-email.com' },
37
71
  // { channel: 'tempmail-lol', name: 'TempMail LOL', website: 'tempmail.lol' },
38
- // { channel: 'chatgpt-org-uk', name: 'ChatGPT Mail', website: 'mail.chatgpt.org.uk' }
72
+ // { channel: 'chatgpt-org-uk', name: 'ChatGPT Mail', website: 'mail.chatgpt.org.uk' },
73
+ // { channel: 'tempmail-la', name: 'TempMail LA', website: 'tempmail.la' },
74
+ // { channel: 'temp-mail-io', name: 'Temp Mail IO', website: 'temp-mail.io' },
75
+ // { channel: 'awamail', name: 'AwaMail', website: 'awamail.com' },
76
+ // { channel: 'mail-tm', name: 'Mail.tm', website: 'mail.tm' },
77
+ // { channel: 'dropmail', name: 'DropMail', website: 'dropmail.me' }
39
78
  // ]
40
79
 
41
- // 获取指定渠道信息
42
80
  const info = getChannelInfo('tempmail');
43
- console.log(info);
44
81
  // { channel: 'tempmail', name: 'TempMail', website: 'tempmail.ing' }
45
82
  ```
46
83
 
47
- ### 获取邮箱
84
+ #### 获取邮箱
48
85
 
49
86
  ```typescript
50
- import { generateEmail } from 'temp-email-sdk';
87
+ import { generateEmail } from 'tempmail-sdk';
51
88
 
52
89
  // 从随机渠道获取邮箱
53
90
  const emailInfo = await generateEmail();
@@ -56,66 +93,65 @@ console.log(emailInfo);
56
93
 
57
94
  // 从指定渠道获取邮箱
58
95
  const emailInfo2 = await generateEmail({ channel: 'linshi-email' });
59
- console.log(emailInfo2);
60
- // { channel: 'linshi-email', email: 'xxx@iwatermail.com', expiresAt: 1768283576295 }
96
+
97
+ // tempmail 渠道支持自定义有效期(分钟)
98
+ const emailInfo3 = await generateEmail({ channel: 'tempmail', duration: 60 });
99
+
100
+ // tempmail-lol 渠道支持指定域名
101
+ const emailInfo4 = await generateEmail({ channel: 'tempmail-lol', domain: 'example.com' });
61
102
  ```
62
103
 
63
- ### 获取邮件
104
+ #### 获取邮件
64
105
 
65
106
  ```typescript
66
- import { getEmails } from 'temp-email-sdk';
107
+ import { getEmails } from 'tempmail-sdk';
67
108
 
68
- // 查询邮件(需要传递渠道和邮箱)
109
+ // 不需要 Token 的渠道
69
110
  const result = await getEmails({
70
111
  channel: 'tempmail',
71
- email: 'xxx@ibymail.com'
112
+ email: 'xxx@ibymail.com',
72
113
  });
73
- console.log(result);
74
- // { channel: 'tempmail', email: 'xxx@ibymail.com', emails: [...], success: true }
114
+ console.log(result.emails); // 标准化邮件数组
75
115
 
76
- // tempmail-lol 渠道需要传递 token
116
+ // 需要 Token 的渠道(token 由 generateEmail 返回)
77
117
  const result2 = await getEmails({
78
- channel: 'tempmail-lol',
79
- email: 'xxx@chessgameland.com',
80
- token: 'your-token-here'
118
+ channel: 'mail-tm',
119
+ email: emailInfo.email,
120
+ token: emailInfo.token, // Bearer Token
81
121
  });
82
- ```
83
-
84
- ### 使用 TempEmailClient 类
85
-
86
- ```typescript
87
- import { TempEmailClient } from 'temp-email-sdk';
88
-
89
- const client = new TempEmailClient();
90
-
91
- // 获取邮箱
92
- const emailInfo = await client.generate({ channel: 'tempmail' });
93
- console.log(`渠道: ${emailInfo.channel}`);
94
- console.log(`邮箱: ${emailInfo.email}`);
95
122
 
96
- // 获取邮件
97
- const result = await client.getEmails();
98
- console.log(`收到 ${result.emails.length} 封邮件`);
123
+ // 所有邮件使用统一格式,无需关心渠道差异
124
+ for (const email of result2.emails) {
125
+ console.log(email.id); // 邮件 ID
126
+ console.log(email.from); // 发件人
127
+ console.log(email.to); // 收件人
128
+ console.log(email.subject); // 主题
129
+ console.log(email.text); // 纯文本
130
+ console.log(email.html); // HTML
131
+ console.log(email.date); // ISO 日期
132
+ console.log(email.isRead); // 是否已读
133
+ console.log(email.attachments); // 附件列表
134
+ }
99
135
  ```
100
136
 
101
- ## API
137
+ ## API 参考
102
138
 
103
139
  ### listChannels()
104
140
 
105
141
  获取所有支持的渠道列表。
106
142
 
107
143
  **返回值:** `ChannelInfo[]`
108
- - `channel` - 渠道标识
109
- - `name` - 渠道名称
110
- - `website` - 服务商网站
144
+
145
+ | 字段 | 类型 | 说明 |
146
+ |------|------|------|
147
+ | `channel` | `Channel` | 渠道标识 |
148
+ | `name` | `string` | 渠道显示名称 |
149
+ | `website` | `string` | 服务商网站 |
111
150
 
112
151
  ### getChannelInfo(channel)
113
152
 
114
153
  获取指定渠道信息。
115
154
 
116
- **参数:**
117
- - `channel` - 渠道标识
118
-
119
155
  **返回值:** `ChannelInfo | undefined`
120
156
 
121
157
  ### generateEmail(options?)
@@ -123,31 +159,85 @@ console.log(`收到 ${result.emails.length} 封邮件`);
123
159
  生成临时邮箱地址。
124
160
 
125
161
  **参数:**
126
- - `channel` - 指定渠道(可选,不指定则随机选择)
127
- - `duration` - 邮箱有效期,单位分钟(仅 `tempmail` 渠道支持)
128
- - `domain` - 指定域名(仅 `tempmail-lol` 渠道支持)
162
+
163
+ | 字段 | 类型 | 说明 |
164
+ |------|------|------|
165
+ | `channel` | `Channel` | 指定渠道(可选,不指定则随机) |
166
+ | `duration` | `number` | 有效期分钟数(仅 `tempmail` 渠道) |
167
+ | `domain` | `string` | 指定域名(仅 `tempmail-lol` 渠道) |
129
168
 
130
169
  **返回值:** `EmailInfo`
131
- - `channel` - 渠道名称
132
- - `email` - 邮箱地址
133
- - `token` - 访问收件箱的令牌(仅 `tempmail-lol` 渠道返回)
134
- - `expiresAt` - 过期时间
170
+
171
+ | 字段 | 类型 | 说明 |
172
+ |------|------|------|
173
+ | `channel` | `Channel` | 渠道标识 |
174
+ | `email` | `string` | 邮箱地址 |
175
+ | `token` | `string?` | 访问令牌(部分渠道返回) |
176
+ | `expiresAt` | `string \| number?` | 过期时间 |
177
+ | `createdAt` | `string?` | 创建时间 |
135
178
 
136
179
  ### getEmails(options)
137
180
 
138
- 获取指定邮箱的邮件列表。
181
+ 获取邮件列表。
139
182
 
140
- **参数(必填):**
141
- - `channel` - 渠道名称
142
- - `email` - 邮箱地址
143
- - `token` - 令牌(`tempmail-lol` 渠道必填)
183
+ **参数:**
184
+
185
+ | 字段 | 类型 | 必填 | 说明 |
186
+ |------|------|:----:|------|
187
+ | `channel` | `Channel` | ✅ | 渠道标识 |
188
+ | `email` | `string` | ✅ | 邮箱地址 |
189
+ | `token` | `string` | 部分 | 访问令牌(`tempmail-lol`、`awamail`、`mail-tm`、`dropmail` 必填) |
144
190
 
145
191
  **返回值:** `GetEmailsResult`
146
- - `channel` - 渠道名称
147
- - `email` - 邮箱地址
148
- - `emails` - 邮件数组
149
- - `success` - 是否成功
192
+
193
+ | 字段 | 类型 | 说明 |
194
+ |------|------|------|
195
+ | `channel` | `Channel` | 渠道标识 |
196
+ | `email` | `string` | 邮箱地址 |
197
+ | `emails` | `Email[]` | 标准化邮件数组 |
198
+ | `success` | `boolean` | 是否成功 |
199
+
200
+ ### 标准化邮件格式
201
+
202
+ 所有渠道返回的邮件均使用统一的 `Email` 格式:
203
+
204
+ ```typescript
205
+ interface Email {
206
+ id: string; // 邮件唯一标识
207
+ from: string; // 发件人邮箱地址
208
+ to: string; // 收件人邮箱地址
209
+ subject: string; // 邮件主题
210
+ text: string; // 纯文本内容
211
+ html: string; // HTML 内容
212
+ date: string; // ISO 8601 格式日期
213
+ isRead: boolean; // 是否已读
214
+ attachments: EmailAttachment[]; // 附件列表
215
+ }
216
+
217
+ interface EmailAttachment {
218
+ filename: string; // 文件名
219
+ size?: number; // 文件大小(字节)
220
+ contentType?: string; // MIME 类型
221
+ url?: string; // 下载地址
222
+ }
223
+ ```
224
+
225
+ ### TempEmailClient 类
226
+
227
+ 封装了 Token 自动管理的便捷客户端:
228
+
229
+ ```typescript
230
+ const client = new TempEmailClient();
231
+ await client.generate(options?); // 生成邮箱
232
+ await client.getEmails(); // 获取邮件(自动传递 token)
233
+ client.getEmailInfo(); // 获取当前邮箱信息
234
+ ```
150
235
 
151
236
  ## 环境要求
152
237
 
153
- - Node.js 18+(需要原生 fetch 支持)
238
+ - Node.js 18+(需要原生 `fetch` 支持)
239
+ - TypeScript 5.0+(类型定义)
240
+
241
+ ## 许可证
242
+
243
+ GPL-3.0
@@ -6,7 +6,7 @@
6
6
  */
7
7
 
8
8
  import * as readline from 'readline';
9
- import { generateEmail, getEmails, listChannels, getChannelInfo, Channel, EmailInfo, ChannelInfo } from '../src';
9
+ import { generateEmail, getEmails, listChannels, getChannelInfo, Channel, EmailInfo, ChannelInfo, Email } from '../src';
10
10
 
11
11
  // 配置
12
12
  const POLL_INTERVAL = 5000; // 轮询间隔(毫秒)
@@ -51,6 +51,29 @@ async function selectChannel(channels: ChannelInfo[]): Promise<Channel> {
51
51
  }
52
52
  }
53
53
 
54
+ function printEmail(email: Email, index: number): void {
55
+ console.log(`\n邮件 #${index + 1}`);
56
+ console.log('━'.repeat(50));
57
+ console.log(`ID: ${email.id || '无'}`);
58
+ console.log(`发件人: ${email.from || '未知'}`);
59
+ console.log(`收件人: ${email.to || '未知'}`);
60
+ console.log(`主题: ${email.subject || '无主题'}`);
61
+ console.log(`时间: ${email.date || '未知'}`);
62
+ console.log(`已读: ${email.isRead ? '是' : '否'}`);
63
+ if (email.text) {
64
+ const preview = email.text.substring(0, 200);
65
+ console.log(`内容: ${preview}`);
66
+ }
67
+ if (email.html) {
68
+ const htmlPreview = email.html.replace(/<[^>]*>/g, '').substring(0, 100);
69
+ console.log(`HTML: ${htmlPreview}...`);
70
+ }
71
+ if (email.attachments.length > 0) {
72
+ console.log(`附件: ${email.attachments.map(a => a.filename).join(', ')}`);
73
+ }
74
+ console.log('━'.repeat(50));
75
+ }
76
+
54
77
  async function pollEmails(emailInfo: EmailInfo): Promise<void> {
55
78
  console.log(`\n开始轮询邮件...(每 ${POLL_INTERVAL / 1000} 秒检查一次)`);
56
79
  console.log('按 Ctrl+C 停止轮询\n');
@@ -76,45 +99,7 @@ async function pollEmails(emailInfo: EmailInfo): Promise<void> {
76
99
  printJson('返回数据 (GetEmailsResult)', result);
77
100
 
78
101
  for (let i = 0; i < result.emails.length; i++) {
79
- const email = result.emails[i];
80
- console.log(`\n邮件 #${i + 1}`);
81
- console.log('━'.repeat(50));
82
- console.log(`ID: ${email.id || email.eid || email._id || '无'}`);
83
- const fromAddr = email.from_address || email.address_from || email.from || '未知';
84
- const fromName = email.from_name || email.name_from || '';
85
- const fromDisplay = fromName ? `${fromName} <${fromAddr}>` : fromAddr;
86
- console.log(`发件人: ${fromDisplay}`);
87
- console.log(`收件人: ${email.to || email.name_to || email.email_address || result.email}`);
88
- console.log(`主题: ${email.subject || email.e_subject || '无主题'}`);
89
- let emailDate: string = '未知';
90
- if (email.received_at) {
91
- emailDate = email.received_at;
92
- } else if (email.created_at) {
93
- emailDate = email.created_at;
94
- } else if (email.createdAt) {
95
- emailDate = email.createdAt;
96
- } else if (email.timestamp) {
97
- emailDate = new Date(email.timestamp * 1000).toISOString();
98
- } else if (email.e_date) {
99
- emailDate = new Date(email.e_date).toISOString();
100
- } else if (typeof email.date === 'number') {
101
- emailDate = new Date(email.date).toISOString();
102
- } else if (email.date) {
103
- emailDate = email.date;
104
- }
105
- console.log(`时间: ${emailDate}`);
106
- console.log(`已读: ${email.is_read ? '是' : '否'}`);
107
- const body = email.text || email.body || email.content || '';
108
- if (body) {
109
- const preview = body.replace(/<[^>]*>/g, '').substring(0, 200);
110
- console.log(`内容: ${preview}`);
111
- }
112
- const htmlContent = email.html_content || email.html || '';
113
- if (htmlContent) {
114
- const htmlPreview = htmlContent.replace(/<[^>]*>/g, '').substring(0, 100);
115
- console.log(`HTML: ${htmlPreview}...`);
116
- }
117
- console.log('━'.repeat(50));
102
+ printEmail(result.emails[i], i);
118
103
  }
119
104
 
120
105
  // 收到邮件后可以选择继续轮询或退出
package/dist/index.d.ts CHANGED
@@ -1,5 +1,6 @@
1
1
  import { Channel, EmailInfo, GetEmailsResult, GenerateEmailOptions, GetEmailsOptions } from './types';
2
- export { Channel, EmailInfo, Email, GetEmailsResult, GenerateEmailOptions, GetEmailsOptions } from './types';
2
+ export { Channel, EmailInfo, Email, EmailAttachment, GetEmailsResult, GenerateEmailOptions, GetEmailsOptions } from './types';
3
+ export { normalizeEmail } from './normalize';
3
4
  export interface ChannelInfo {
4
5
  channel: Channel;
5
6
  name: string;
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 = void 0;
36
+ exports.TempEmailClient = exports.normalizeEmail = void 0;
37
37
  exports.listChannels = listChannels;
38
38
  exports.getChannelInfo = getChannelInfo;
39
39
  exports.generateEmail = generateEmail;
@@ -42,18 +42,35 @@ const tempmail = __importStar(require("./providers/tempmail"));
42
42
  const linshiEmail = __importStar(require("./providers/linshi-email"));
43
43
  const tempmailLol = __importStar(require("./providers/tempmail-lol"));
44
44
  const chatgptOrgUk = __importStar(require("./providers/chatgpt-org-uk"));
45
+ const tempmailLa = __importStar(require("./providers/tempmail-la"));
46
+ const tempMailIO = __importStar(require("./providers/temp-mail-io"));
47
+ const awamail = __importStar(require("./providers/awamail"));
48
+ const mailTm = __importStar(require("./providers/mail-tm"));
49
+ const dropmail = __importStar(require("./providers/dropmail"));
50
+ var normalize_1 = require("./normalize");
51
+ Object.defineProperty(exports, "normalizeEmail", { enumerable: true, get: function () { return normalize_1.normalizeEmail; } });
45
52
  const providers = {
46
53
  'tempmail': tempmail,
47
54
  'linshi-email': linshiEmail,
48
55
  'tempmail-lol': tempmailLol,
49
56
  'chatgpt-org-uk': chatgptOrgUk,
57
+ 'tempmail-la': tempmailLa,
58
+ 'temp-mail-io': tempMailIO,
59
+ 'awamail': awamail,
60
+ 'mail-tm': mailTm,
61
+ 'dropmail': dropmail,
50
62
  };
51
- const allChannels = ['tempmail', 'linshi-email', 'tempmail-lol', 'chatgpt-org-uk'];
63
+ const allChannels = ['tempmail', 'linshi-email', 'tempmail-lol', 'chatgpt-org-uk', 'tempmail-la', 'temp-mail-io', 'awamail', 'mail-tm', 'dropmail'];
52
64
  const channelInfoMap = {
53
65
  'tempmail': { channel: 'tempmail', name: 'TempMail', website: 'tempmail.ing' },
54
66
  'linshi-email': { channel: 'linshi-email', name: '临时邮箱', website: 'linshi-email.com' },
55
67
  'tempmail-lol': { channel: 'tempmail-lol', name: 'TempMail LOL', website: 'tempmail.lol' },
56
68
  'chatgpt-org-uk': { channel: 'chatgpt-org-uk', name: 'ChatGPT Mail', website: 'mail.chatgpt.org.uk' },
69
+ 'tempmail-la': { channel: 'tempmail-la', name: 'TempMail LA', website: 'tempmail.la' },
70
+ 'temp-mail-io': { channel: 'temp-mail-io', name: 'Temp Mail IO', website: 'temp-mail.io' },
71
+ 'awamail': { channel: 'awamail', name: 'AwaMail', website: 'awamail.com' },
72
+ 'mail-tm': { channel: 'mail-tm', name: 'Mail.tm', website: 'mail.tm' },
73
+ 'dropmail': { channel: 'dropmail', name: 'DropMail', website: 'dropmail.me' },
57
74
  };
58
75
  /**
59
76
  * 获取所有支持的渠道列表
@@ -78,6 +95,16 @@ async function generateEmail(options = {}) {
78
95
  return tempmailLol.generateEmail(options.domain || null);
79
96
  case 'chatgpt-org-uk':
80
97
  return chatgptOrgUk.generateEmail();
98
+ case 'tempmail-la':
99
+ return tempmailLa.generateEmail();
100
+ case 'temp-mail-io':
101
+ return tempMailIO.generateEmail();
102
+ case 'awamail':
103
+ return awamail.generateEmail();
104
+ case 'mail-tm':
105
+ return mailTm.generateEmail();
106
+ case 'dropmail':
107
+ return dropmail.generateEmail();
81
108
  default:
82
109
  throw new Error(`Unknown channel: ${channel}`);
83
110
  }
@@ -102,11 +129,35 @@ async function getEmails(options) {
102
129
  if (!token) {
103
130
  throw new Error('Token is required for tempmail-lol channel');
104
131
  }
105
- emails = await tempmailLol.getEmails(token);
132
+ emails = await tempmailLol.getEmails(token, email);
106
133
  break;
107
134
  case 'chatgpt-org-uk':
108
135
  emails = await chatgptOrgUk.getEmails(email);
109
136
  break;
137
+ case 'tempmail-la':
138
+ emails = await tempmailLa.getEmails(email);
139
+ break;
140
+ case 'temp-mail-io':
141
+ emails = await tempMailIO.getEmails(email);
142
+ break;
143
+ case 'awamail':
144
+ if (!token) {
145
+ throw new Error('Token is required for awamail channel');
146
+ }
147
+ emails = await awamail.getEmails(token, email);
148
+ break;
149
+ case 'mail-tm':
150
+ if (!token) {
151
+ throw new Error('Token is required for mail-tm channel');
152
+ }
153
+ emails = await mailTm.getEmails(token, email);
154
+ break;
155
+ case 'dropmail':
156
+ if (!token) {
157
+ throw new Error('Token is required for dropmail channel');
158
+ }
159
+ emails = await dropmail.getEmails(token, email);
160
+ break;
110
161
  default:
111
162
  throw new Error(`Unknown channel: ${channel}`);
112
163
  }
@@ -147,4 +198,4 @@ exports.default = {
147
198
  getEmails,
148
199
  TempEmailClient,
149
200
  };
150
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBaUNBLG9DQUVDO0FBS0Qsd0NBRUM7QUFFRCxzQ0FlQztBQUVELDhCQXNDQztBQW5HRCwrREFBaUQ7QUFDakQsc0VBQXdEO0FBQ3hELHNFQUF3RDtBQUN4RCx5RUFBMkQ7QUFLM0QsTUFBTSxTQUFTLEdBQUc7SUFDaEIsVUFBVSxFQUFFLFFBQVE7SUFDcEIsY0FBYyxFQUFFLFdBQVc7SUFDM0IsY0FBYyxFQUFFLFdBQVc7SUFDM0IsZ0JBQWdCLEVBQUUsWUFBWTtDQUMvQixDQUFDO0FBRUYsTUFBTSxXQUFXLEdBQWMsQ0FBQyxVQUFVLEVBQUUsY0FBYyxFQUFFLGNBQWMsRUFBRSxnQkFBZ0IsQ0FBQyxDQUFDO0FBUTlGLE1BQU0sY0FBYyxHQUFpQztJQUNuRCxVQUFVLEVBQUUsRUFBRSxPQUFPLEVBQUUsVUFBVSxFQUFFLElBQUksRUFBRSxVQUFVLEVBQUUsT0FBTyxFQUFFLGNBQWMsRUFBRTtJQUM5RSxjQUFjLEVBQUUsRUFBRSxPQUFPLEVBQUUsY0FBYyxFQUFFLElBQUksRUFBRSxNQUFNLEVBQUUsT0FBTyxFQUFFLGtCQUFrQixFQUFFO0lBQ3RGLGNBQWMsRUFBRSxFQUFFLE9BQU8sRUFBRSxjQUFjLEVBQUUsSUFBSSxFQUFFLGNBQWMsRUFBRSxPQUFPLEVBQUUsY0FBYyxFQUFFO0lBQzFGLGdCQUFnQixFQUFFLEVBQUUsT0FBTyxFQUFFLGdCQUFnQixFQUFFLElBQUksRUFBRSxjQUFjLEVBQUUsT0FBTyxFQUFFLHFCQUFxQixFQUFFO0NBQ3RHLENBQUM7QUFFRjs7R0FFRztBQUNILFNBQWdCLFlBQVk7SUFDMUIsT0FBTyxXQUFXLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsY0FBYyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7QUFD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SyxDQUFDLDRDQUE0QyxDQUFDLENBQUM7UUFDaEUsQ0FBQztRQUVELE9BQU8sU0FBUyxDQUFDO1lBQ2YsT0FBTyxFQUFFLElBQUksQ0FBQyxTQUFTLENBQUMsT0FBTztZQUMvQixLQUFLLEVBQUUsSUFBSSxDQUFDLFNBQVMsQ0FBQyxLQUFLO1lBQzNCLEtBQUssRUFBRSxJQUFJLENBQUMsU0FBUyxDQUFDLEtBQUs7U0FDNUIsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztJQUVELFlBQVk7UUFDVixPQUFPLElBQUksQ0FBQyxTQUFTLENBQUM7SUFDeEIsQ0FBQztDQUNGO0FBdkJELDBDQXVCQztBQUVELGtCQUFlO0lBQ2IsWUFBWTtJQUNaLGNBQWM7SUFDZCxhQUFhO0lBQ2IsU0FBUztJQUNULGVBQWU7Q0FDaEIsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCAqIGFzIHRlbXBtYWlsIGZyb20gJy4vcHJvdmlkZXJzL3RlbXBtYWlsJztcbmltcG9ydCAqIGFzIGxpbnNoaUVtYWlsIGZyb20gJy4vcHJvdmlkZXJzL2xpbnNoaS1lbWFpbCc7XG5pbXBvcnQgKiBhcyB0ZW1wbWFpbExvbCBmcm9tICcuL3Byb3ZpZGVycy90ZW1wbWFpbC1sb2wnO1xuaW1wb3J0ICogYXMgY2hhdGdwdE9yZ1VrIGZyb20gJy4vcHJvdmlkZXJzL2NoYXRncHQtb3JnLXVrJztcbmltcG9ydCB7IENoYW5uZWwsIEVtYWlsSW5mbywgRW1haWwsIEdldEVtYWlsc1Jlc3VsdCwgR2VuZXJhdGVFbWFpbE9wdGlvbnMsIEdldEVtYWlsc09wdGlvbnMgfSBmcm9tICcuL3R5cGVzJztcblxuZXhwb3J0IHsgQ2hhbm5lbCwgRW1haWxJbmZvLCBFbWFpbCwgR2V0RW1haWxzUmVzdWx0LCBHZW5lcmF0ZUVtYWlsT3B0aW9ucywgR2V0RW1haWxzT3B0aW9ucyB9IGZyb20gJy4vdHlwZXMnO1xuXG5jb25zdCBwcm92aWRlcnMgPSB7XG4gICd0ZW1wbWFpbCc6IHRlbXBtYWlsLFxuICAnbGluc2hpLWVtYWlsJzogbGluc2hpRW1haWwsXG4gICd0ZW1wbWFpbC1sb2wnOiB0ZW1wbWFpbExvbCxcbiAgJ2NoYXRncHQtb3JnLXVrJzogY2hhdGdwdE9yZ1VrLFxufTtcblxuY29uc3QgYWxsQ2hhbm5lbHM6IENoYW5uZWxbXSA9IFsndGVtcG1haWwnLCAnbGluc2hpLWVtYWlsJywgJ3RlbXBtYWlsLWxvbCcsICdjaGF0Z3B0LW9yZy11ayddO1xuXG5leHBvcnQgaW50ZXJmYWNlIENoYW5uZWxJbmZvIHtcbiAgY2hhbm5lbDogQ2hhbm5lbDtcbiAgbmFtZTogc3RyaW5nO1xuICB3ZWJzaXRlOiBzdHJpbmc7XG59XG5cbmNvbnN0IGNoYW5uZWxJbmZvTWFwOiBSZWNvcmQ8Q2hhbm5lbCwgQ2hhbm5lbEluZm8+ID0ge1xuICAndGVtcG1haWwnOiB7IGNoYW5uZWw6ICd0ZW1wbWFpbCcsIG5hbWU6ICdUZW1wTWFpbCcsIHdlYnNpdGU6ICd0ZW1wbWFpbC5pbmcnIH0sXG4gICdsaW5zaGktZW1haWwnOiB7IGNoYW5uZWw6ICdsaW5zaGktZW1haWwnLCBuYW1lOiAn5Li05pe26YKu566xJywgd2Vic2l0ZTogJ2xpbnNoaS1lbWFpbC5jb20nIH0sXG4gICd0ZW1wbWFpbC1sb2wnOiB7IGNoYW5uZWw6ICd0ZW1wbWFpbC1sb2wnLCBuYW1lOiAnVGVtcE1haWwgTE9MJywgd2Vic2l0ZTogJ3RlbXBtYWlsLmxvbCcgfSxcbiAgJ2NoYXRncHQtb3JnLXVrJzogeyBjaGFubmVsOiAnY2hhdGdwdC1vcmctdWsnLCBuYW1lOiAnQ2hhdEdQVCBNYWlsJywgd2Vic2l0ZTogJ21haWwuY2hhdGdwdC5vcmcudWsnIH0sXG59O1xuXG4vKipcbiAqIOiOt+WPluaJgOacieaUr+aMgeeahOa4oOmBk+WIl+ihqFxuICovXG5leHBvcnQgZnVuY3Rpb24gbGlzdENoYW5uZWxzKCk6IENoYW5uZWxJbmZvW10ge1xuICByZXR1cm4gYWxsQ2hhbm5lbHMubWFwKGNoID0+IGNoYW5uZWxJbmZvTWFwW2NoXSk7XG59XG5cbi8qKlxuICog6I635Y+W5oyH5a6a5rig6YGT5L+h5oGvXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRDaGFubmVsSW5mbyhjaGFubmVsOiBDaGFubmVsKTogQ2hhbm5lbEluZm8gfCB1bmRlZmluZWQge1xuICByZXR1cm4gY2hhbm5lbEluZm9NYXBbY2hhbm5lbF07XG59XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBnZW5lcmF0ZUVtYWlsKG9wdGlvbnM6IEdlbmVyYXRlRW1haWxPcHRpb25zID0ge30pOiBQcm9taXNlPEVtYWlsSW5mbz4ge1xuICBjb25zdCBjaGFubmVsID0gb3B0aW9ucy5jaGFubmVsIHx8IGFsbENoYW5uZWxzW01hdGguZmxvb3IoTWF0aC5yYW5kb20oKSAqIGFsbENoYW5uZWxzLmxlbmd0aCldO1xuICBcbiAgc3dpdGNoIChjaGFubmVsKSB7XG4gICAgY2FzZSAndGVtcG1haWwnOlxuICAgICAgcmV0dXJuIHRlbXBtYWlsLmdlbmVyYXRlRW1haWwob3B0aW9ucy5kdXJhdGlvbiB8fCAzMCk7XG4gICAgY2FzZSAnbGluc2hpLWVtYWlsJzpcbiAgICAgIHJldHVybiBsaW5zaGlFbWFpbC5nZW5lcmF0ZUVtYWlsKCk7XG4gICAgY2FzZSAndGVtcG1haWwtbG9sJzpcbiAgICAgIHJldHVybiB0ZW1wbWFpbExvbC5nZW5lcmF0ZUVtYWlsKG9wdGlvbnMuZG9tYWluIHx8IG51bGwpO1xuICAgIGNhc2UgJ2NoYXRncHQtb3JnLXVrJzpcbiAgICAgIHJldHVybiBjaGF0Z3B0T3JnVWsuZ2VuZXJhdGVFbWFpbCgpO1xuICAgIGRlZmF1bHQ6XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYFVua25vd24gY2hhbm5lbDogJHtjaGFubmVsfWApO1xuICB9XG59XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBnZXRFbWFpbHMob3B0aW9uczogR2V0RW1haWxzT3B0aW9ucyk6IFByb21pc2U8R2V0RW1haWxzUmVzdWx0PiB7XG4gIGNvbnN0IHsgY2hhbm5lbCwgZW1haWwsIHRva2VuIH0gPSBvcHRpb25zO1xuICBcbiAgaWYgKCFjaGFubmVsKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdDaGFubmVsIGlzIHJlcXVpcmVkJyk7XG4gIH1cbiAgaWYgKCFlbWFpbCAmJiBjaGFubmVsICE9PSAndGVtcG1haWwtbG9sJykge1xuICAgIHRocm93IG5ldyBFcnJvcignRW1haWwgaXMgcmVxdWlyZWQnKTtcbiAgfVxuXG4gIGxldCBlbWFpbHM6IEVtYWlsW10gPSBbXTtcblxuICBzd2l0Y2ggKGNoYW5uZWwpIHtcbiAgICBjYXNlICd0ZW1wbWFpbCc6XG4gICAgICBlbWFpbHMgPSBhd2FpdCB0ZW1wbWFpbC5nZXRFbWFpbHMoZW1haWwpO1xuICAgICAgYnJlYWs7XG4gICAgY2FzZSAnbGluc2hpLWVtYWlsJzpcbiAgICAgIGVtYWlscyA9IGF3YWl0IGxpbnNoaUVtYWlsLmdldEVtYWlscyhlbWFpbCk7XG4gICAgICBicmVhaztcbiAgICBjYXNlICd0ZW1wbWFpbC1sb2wnOlxuICAgICAgaWYgKCF0b2tlbikge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1Rva2VuIGlzIHJlcXVpcmVkIGZvciB0ZW1wbWFpbC1sb2wgY2hhbm5lbCcpO1xuICAgICAgfVxuICAgICAgZW1haWxzID0gYXdhaXQgdGVtcG1haWxMb2wuZ2V0RW1haWxzKHRva2VuKTtcbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgJ2NoYXRncHQtb3JnLXVrJzpcbiAgICAgIGVtYWlscyA9IGF3YWl0IGNoYXRncHRPcmdVay5nZXRFbWFpbHMoZW1haWwpO1xuICAgICAgYnJlYWs7XG4gICAgZGVmYXVsdDpcbiAgICAgIHRocm93IG5ldyBFcnJvcihgVW5rbm93biBjaGFubmVsOiAke2NoYW5uZWx9YCk7XG4gIH1cblxuICByZXR1cm4ge1xuICAgIGNoYW5uZWwsXG4gICAgZW1haWwsXG4gICAgZW1haWxzLFxuICAgIHN1Y2Nlc3M6IHRydWUsXG4gIH07XG59XG5cbmV4cG9ydCBjbGFzcyBUZW1wRW1haWxDbGllbnQge1xuICBwcml2YXRlIGVtYWlsSW5mbzogRW1haWxJbmZvIHwgbnVsbCA9IG51bGw7XG5cbiAgYXN5bmMgZ2VuZXJhdGUob3B0aW9uczogR2VuZXJhdGVFbWFpbE9wdGlvbnMgPSB7fSk6IFByb21pc2U8RW1haWxJbmZvPiB7XG4gICAgdGhpcy5lbWFpbEluZm8gPSBhd2FpdCBnZW5lcmF0ZUVtYWlsKG9wdGlvbnMpO1xuICAgIHJldHVybiB0aGlzLmVtYWlsSW5mbztcbiAgfVxuXG4gIGFzeW5jIGdldEVtYWlscygpOiBQcm9taXNlPEdldEVtYWlsc1Jlc3VsdD4ge1xuICAgIGlmICghdGhpcy5lbWFpbEluZm8pIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignTm8gZW1haWwgZ2VuZXJhdGVkLiBDYWxsIGdlbmVyYXRlKCkgZmlyc3QuJyk7XG4gICAgfVxuXG4gICAgcmV0dXJuIGdldEVtYWlscyh7XG4gICAgICBjaGFubmVsOiB0aGlzLmVtYWlsSW5mby5jaGFubmVsLFxuICAgICAgZW1haWw6IHRoaXMuZW1haWxJbmZvLmVtYWlsLFxuICAgICAgdG9rZW46IHRoaXMuZW1haWxJbmZvLnRva2VuLFxuICAgIH0pO1xuICB9XG5cbiAgZ2V0RW1haWxJbmZvKCk6IEVtYWlsSW5mbyB8IG51bGwge1xuICAgIHJldHVybiB0aGlzLmVtYWlsSW5mbztcbiAgfVxufVxuXG5leHBvcnQgZGVmYXVsdCB7XG4gIGxpc3RDaGFubmVscyxcbiAgZ2V0Q2hhbm5lbEluZm8sXG4gIGdlbmVyYXRlRW1haWwsXG4gIGdldEVtYWlscyxcbiAgVGVtcEVtYWlsQ2xpZW50LFxufTtcbiJdfQ==
201
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBaURBLG9DQUVDO0FBS0Qsd0NBRUM7QUFFRCxzQ0F5QkM7QUFFRCw4QkE4REM7QUFySkQsK0RBQWlEO0FBQ2pELHNFQUF3RDtBQUN4RCxzRUFBd0Q7QUFDeEQseUVBQTJEO0FBQzNELG9FQUFzRDtBQUN0RCxxRUFBdUQ7QUFDdkQsNkRBQStDO0FBQy9DLDREQUE4QztBQUM5QywrREFBaUQ7QUFJakQseUNBQTZDO0FBQXBDLDJHQUFBLGNBQWMsT0FBQTtBQUV2QixNQUFNLFNBQVMsR0FBRztJQUNoQixVQUFVLEVBQUUsUUFBUTtJQUNwQixjQUFjLEVBQUUsV0FBVztJQUMzQixjQUFjLEVBQUUsV0FBVztJQUMzQixnQkFBZ0IsRUFBRSxZQUFZO0lBQzlCLGFBQWEsRUFBRSxVQUFVO0lBQ3pCLGNBQWMsRUFBRSxVQUFVO0lBQzFCLFNBQVMsRUFBRSxPQUFPO0lBQ2xCLFNBQVMsRUFBRSxNQUFNO0lBQ2pCLFVBQVUsRUFBRSxRQUFRO0NBQ3JCLENBQUM7QUFFRixNQUFNLFdBQVcsR0FBYyxDQUFDLFVBQVUsRUFBRSxjQUFjLEVBQUUsY0FBYyxFQUFFLGdCQUFnQixFQUFFLGFBQWEsRUFBRSxjQUFjLEVBQUUsU0FBUyxFQUFFLFNBQVMsRUFBRSxVQUFVLENBQUMsQ0FBQztBQVEvSixNQUFNLGNBQWMsR0FBaUM7SUFDbkQsVUFBVSxFQUFFLEVBQUUsT0FBTyxFQUFFLFVBQVUsRUFBRSxJQUFJLEVBQUUsVUFBVSxFQUFFLE9BQU8sRUFBRSxjQUFjLEVBQUU7SUFDOUUsY0FBYyxFQUFFLEVBQUUsT0FBTyxFQUFFLGNBQWMsRUFBRSxJQUFJLEVBQUUsTUFBTSxFQUFFLE9BQU8sRUFBRSxrQkFBa0IsRUFBRTtJQUN0RixjQUFjLEVBQUUsRUFBRSxPQUFPLEVBQUUsY0FB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Q0FBQyxDQUFDO0lBQ0wsQ0FBQztJQUVELFlBQVk7UUFDVixPQUFPLElBQUksQ0FBQyxTQUFTLENBQUM7SUFDeEIsQ0FBQztDQUNGO0FBdkJELDBDQXVCQztBQUVELGtCQUFlO0lBQ2IsWUFBWTtJQUNaLGNBQWM7SUFDZCxhQUFhO0lBQ2IsU0FBUztJQUNULGVBQWU7Q0FDaEIsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCAqIGFzIHRlbXBtYWlsIGZyb20gJy4vcHJvdmlkZXJzL3RlbXBtYWlsJztcbmltcG9ydCAqIGFzIGxpbnNoaUVtYWlsIGZyb20gJy4vcHJvdmlkZXJzL2xpbnNoaS1lbWFpbCc7XG5pbXBvcnQgKiBhcyB0ZW1wbWFpbExvbCBmcm9tICcuL3Byb3ZpZGVycy90ZW1wbWFpbC1sb2wnO1xuaW1wb3J0ICogYXMgY2hhdGdwdE9yZ1VrIGZyb20gJy4vcHJvdmlkZXJzL2NoYXRncHQtb3JnLXVrJztcbmltcG9ydCAqIGFzIHRlbXBtYWlsTGEgZnJvbSAnLi9wcm92aWRlcnMvdGVtcG1haWwtbGEnO1xuaW1wb3J0ICogYXMgdGVtcE1haWxJTyBmcm9tICcuL3Byb3ZpZGVycy90ZW1wLW1haWwtaW8nO1xuaW1wb3J0ICogYXMgYXdhbWFpbCBmcm9tICcuL3Byb3ZpZGVycy9hd2FtYWlsJztcbmltcG9ydCAqIGFzIG1haWxUbSBmcm9tICcuL3Byb3ZpZGVycy9tYWlsLXRtJztcbmltcG9ydCAqIGFzIGRyb3BtYWlsIGZyb20gJy4vcHJvdmlkZXJzL2Ryb3BtYWlsJztcbmltcG9ydCB7IENoYW5uZWwsIEVtYWlsSW5mbywgRW1haWwsIEVtYWlsQXR0YWNobWVudCwgR2V0RW1haWxzUmVzdWx0LCBHZW5lcmF0ZUVtYWlsT3B0aW9ucywgR2V0RW1haWxzT3B0aW9ucyB9IGZyb20gJy4vdHlwZXMnO1xuXG5leHBvcnQgeyBDaGFubmVsLCBFbWFpbEluZm8sIEVtYWlsLCBFbWFpbEF0dGFjaG1lbnQsIEdldEVtYWlsc1Jlc3VsdCwgR2VuZXJhdGVFbWFpbE9wdGlvbnMsIEdldEVtYWlsc09wdGlvbnMgfSBmcm9tICcuL3R5cGVzJztcbmV4cG9ydCB7IG5vcm1hbGl6ZUVtYWlsIH0gZnJvbSAnLi9ub3JtYWxpemUnO1xuXG5jb25zdCBwcm92aWRlcnMgPSB7XG4gICd0ZW1wbWFpbCc6IHRlbXBtYWlsLFxuICAnbGluc2hpLWVtYWlsJzogbGluc2hpRW1haWwsXG4gICd0ZW1wbWFpbC1sb2wnOiB0ZW1wbWFpbExvbCxcbiAgJ2NoYXRncHQtb3JnLXVrJzogY2hhdGdwdE9yZ1VrLFxuICAndGVtcG1haWwtbGEnOiB0ZW1wbWFpbExhLFxuICAndGVtcC1tYWlsLWlvJzogdGVtcE1haWxJTyxcbiAgJ2F3YW1haWwnOiBhd2FtYWlsLFxuICAnbWFpbC10bSc6IG1haWxUbSxcbiAgJ2Ryb3BtYWlsJzogZHJvcG1haWwsXG59O1xuXG5jb25zdCBhbGxDaGFubmVsczogQ2hhbm5lbFtdID0gWyd0ZW1wbWFpbCcsICdsaW5zaGktZW1haWwnLCAndGVtcG1haWwtbG9sJywgJ2NoYXRncHQtb3JnLXVrJywgJ3RlbXBtYWlsLWxhJywgJ3RlbXAtbWFpbC1pbycsICdhd2FtYWlsJywgJ21haWwtdG0nLCAnZHJvcG1haWwnXTtcblxuZXhwb3J0IGludGVyZmFjZSBDaGFubmVsSW5mbyB7XG4gIGNoYW5uZWw6IENoYW5uZWw7XG4gIG5hbWU6IHN0cmluZztcbiAgd2Vic2l0ZTogc3RyaW5nO1xufVxuXG5jb25zdCBjaGFubmVsSW5mb01hcDogUmVjb3JkPENoYW5uZWwsIENoYW5uZWxJbmZvPiA9IHtcbiAgJ3RlbXBtYWlsJzogeyBjaGFubmVsOiAndGVtcG1haWwnLCBuYW1lOiAnVGVtcE1haWwnLCB3ZWJzaXRlOiAndGVtcG1haWwuaW5nJyB9LFxuICAnbGluc2hpLWVtYWlsJzogeyBjaGFubmVsOiAnbGluc2hpLWVtYWlsJywgbmFtZTogJ+S4tOaXtumCrueusScsIHdlYnNpdGU6ICdsaW5zaGktZW1haWwuY29tJyB9LFxuICAndGVtcG1haWwtbG9sJzogeyBjaGFubmVsOiAndGVtcG1haWwtbG9sJywgbmFtZTogJ1RlbXBNYWlsIExPTCcsIHdlYnNpdGU6ICd0ZW1wbWFpbC5sb2wnIH0sXG4gICdjaGF0Z3B0LW9yZy11ayc6IHsgY2hhbm5lbDogJ2NoYXRncHQtb3JnLXVrJywgbmFtZTogJ0NoYXRHUFQgTWFpbCcsIHdlYnNpdGU6ICdtYWlsLmNoYXRncHQub3JnLnVrJyB9LFxuICAndGVtcG1haWwtbGEnOiB7IGNoYW5uZWw6ICd0ZW1wbWFpbC1sYScsIG5hbWU6ICdUZW1wTWFpbCBMQScsIHdlYnNpdGU6ICd0ZW1wbWFpbC5sYScgfSxcbiAgJ3RlbXAtbWFpbC1pbyc6IHsgY2hhbm5lbDogJ3RlbXAtbWFpbC1pbycsIG5hbWU6ICdUZW1wIE1haWwgSU8nLCB3ZWJzaXRlOiAndGVtcC1tYWlsLmlvJyB9LFxuICAnYXdhbWFpbCc6IHsgY2hhbm5lbDogJ2F3YW1haWwnLCBuYW1lOiAnQXdhTWFpbCcsIHdlYnNpdGU6ICdhd2FtYWlsLmNvbScgfSxcbiAgJ21haWwtdG0nOiB7IGNoYW5uZWw6ICdtYWlsLXRtJywgbmFtZTogJ01haWwudG0nLCB3ZWJzaXRlOiAnbWFpbC50bScgfSxcbiAgJ2Ryb3BtYWlsJzogeyBjaGFubmVsOiAnZHJvcG1haWwnLCBuYW1lOiAnRHJvcE1haWwnLCB3ZWJzaXRlOiAnZHJvcG1haWwubWUnIH0sXG59O1xuXG4vKipcbiAqIOiOt+WPluaJgOacieaUr+aMgeeahOa4oOmBk+WIl+ihqFxuICovXG5leHBvcnQgZnVuY3Rpb24gbGlzdENoYW5uZWxzKCk6IENoYW5uZWxJbmZvW10ge1xuICByZXR1cm4gYWxsQ2hhbm5lbHMubWFwKGNoID0+IGNoYW5uZWxJbmZvTWFwW2NoXSk7XG59XG5cbi8qKlxuICog6I635Y+W5oyH5a6a5rig6YGT5L+h5oGvXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRDaGFubmVsSW5mbyhjaGFubmVsOiBDaGFubmVsKTogQ2hhbm5lbEluZm8gfCB1bmRlZmluZWQge1xuICByZXR1cm4gY2hhbm5lbEluZm9NYXBbY2hhbm5lbF07XG59XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBnZW5lcmF0ZUVtYWlsKG9wdGlvbnM6IEdlbmVyYXRlRW1haWxPcHRpb25zID0ge30pOiBQcm9taXNlPEVtYWlsSW5mbz4ge1xuICBjb25zdCBjaGFubmVsID0gb3B0aW9ucy5jaGFubmVsIHx8IGFsbENoYW5uZWxzW01hdGguZmxvb3IoTWF0aC5yYW5kb20oKSAqIGFsbENoYW5uZWxzLmxlbmd0aCldO1xuICBcbiAgc3dpdGNoIChjaGFubmVsKSB7XG4gICAgY2FzZSAndGVtcG1haWwnOlxuICAgICAgcmV0dXJuIHRlbXBtYWlsLmdlbmVyYXRlRW1haWwob3B0aW9ucy5kdXJhdGlvbiB8fCAzMCk7XG4gICAgY2FzZSAnbGluc2hpLWVtYWlsJzpcbiAgICAgIHJldHVybiBsaW5zaGlFbWFpbC5nZW5lcmF0ZUVtYWlsKCk7XG4gICAgY2FzZSAndGVtcG1haWwtbG9sJzpcbiAgICAgIHJldHVybiB0ZW1wbWFpbExvbC5nZW5lcmF0ZUVtYWlsKG9wdGlvbnMuZG9tYWluIHx8IG51bGwpO1xuICAgIGNhc2UgJ2NoYXRncHQtb3JnLXVrJzpcbiAgICAgIHJldHVybiBjaGF0Z3B0T3JnVWsuZ2VuZXJhdGVFbWFpbCgpO1xuICAgIGNhc2UgJ3RlbXBtYWlsLWxhJzpcbiAgICAgIHJldHVybiB0ZW1wbWFpbExhLmdlbmVyYXRlRW1haWwoKTtcbiAgICBjYXNlICd0ZW1wLW1haWwtaW8nOlxuICAgICAgcmV0dXJuIHRlbXBNYWlsSU8uZ2VuZXJhdGVFbWFpbCgpO1xuICAgIGNhc2UgJ2F3YW1haWwnOlxuICAgICAgcmV0dXJuIGF3YW1haWwuZ2VuZXJhdGVFbWFpbCgpO1xuICAgIGNhc2UgJ21haWwtdG0nOlxuICAgICAgcmV0dXJuIG1haWxUbS5nZW5lcmF0ZUVtYWlsKCk7XG4gICAgY2FzZSAnZHJvcG1haWwnOlxuICAgICAgcmV0dXJuIGRyb3BtYWlsLmdlbmVyYXRlRW1haWwoKTtcbiAgICBkZWZhdWx0OlxuICAgICAgdGhyb3cgbmV3IEVycm9yKGBVbmtub3duIGNoYW5uZWw6ICR7Y2hhbm5lbH1gKTtcbiAgfVxufVxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2V0RW1haWxzKG9wdGlvbnM6IEdldEVtYWlsc09wdGlvbnMpOiBQcm9taXNlPEdldEVtYWlsc1Jlc3VsdD4ge1xuICBjb25zdCB7IGNoYW5uZWwsIGVtYWlsLCB0b2tlbiB9ID0gb3B0aW9ucztcbiAgXG4gIGlmICghY2hhbm5lbCkge1xuICAgIHRocm93IG5ldyBFcnJvcignQ2hhbm5lbCBpcyByZXF1aXJlZCcpO1xuICB9XG4gIGlmICghZW1haWwgJiYgY2hhbm5lbCAhPT0gJ3RlbXBtYWlsLWxvbCcpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ0VtYWlsIGlzIHJlcXVpcmVkJyk7XG4gIH1cblxuICBsZXQgZW1haWxzOiBFbWFpbFtdID0gW107XG5cbiAgc3dpdGNoIChjaGFubmVsKSB7XG4gICAgY2FzZSAndGVtcG1haWwnOlxuICAgICAgZW1haWxzID0gYXdhaXQgdGVtcG1haWwuZ2V0RW1haWxzKGVtYWlsKTtcbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgJ2xpbnNoaS1lbWFpbCc6XG4gICAgICBlbWFpbHMgPSBhd2FpdCBsaW5zaGlFbWFpbC5nZXRFbWFpbHMoZW1haWwpO1xuICAgICAgYnJlYWs7XG4gICAgY2FzZSAndGVtcG1haWwtbG9sJzpcbiAgICAgIGlmICghdG9rZW4pIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdUb2tlbiBpcyByZXF1aXJlZCBmb3IgdGVtcG1haWwtbG9sIGNoYW5uZWwnKTtcbiAgICAgIH1cbiAgICAgIGVtYWlscyA9IGF3YWl0IHRlbXBtYWlsTG9sLmdldEVtYWlscyh0b2tlbiwgZW1haWwpO1xuICAgICAgYnJlYWs7XG4gICAgY2FzZSAnY2hhdGdwdC1vcmctdWsnOlxuICAgICAgZW1haWxzID0gYXdhaXQgY2hhdGdwdE9yZ1VrLmdldEVtYWlscyhlbWFpbCk7XG4gICAgICBicmVhaztcbiAgICBjYXNlICd0ZW1wbWFpbC1sYSc6XG4gICAgICBlbWFpbHMgPSBhd2FpdCB0ZW1wbWFpbExhLmdldEVtYWlscyhlbWFpbCk7XG4gICAgICBicmVhaztcbiAgICBjYXNlICd0ZW1wLW1haWwtaW8nOlxuICAgICAgZW1haWxzID0gYXdhaXQgdGVtcE1haWxJTy5nZXRFbWFpbHMoZW1haWwpO1xuICAgICAgYnJlYWs7XG4gICAgY2FzZSAnYXdhbWFpbCc6XG4gICAgICBpZiAoIXRva2VuKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignVG9rZW4gaXMgcmVxdWlyZWQgZm9yIGF3YW1haWwgY2hhbm5lbCcpO1xuICAgICAgfVxuICAgICAgZW1haWxzID0gYXdhaXQgYXdhbWFpbC5nZXRFbWFpbHModG9rZW4sIGVtYWlsKTtcbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgJ21haWwtdG0nOlxuICAgICAgaWYgKCF0b2tlbikge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1Rva2VuIGlzIHJlcXVpcmVkIGZvciBtYWlsLXRtIGNoYW5uZWwnKTtcbiAgICAgIH1cbiAgICAgIGVtYWlscyA9IGF3YWl0IG1haWxUbS5nZXRFbWFpbHModG9rZW4sIGVtYWlsKTtcbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgJ2Ryb3BtYWlsJzpcbiAgICAgIGlmICghdG9rZW4pIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdUb2tlbiBpcyByZXF1aXJlZCBmb3IgZHJvcG1haWwgY2hhbm5lbCcpO1xuICAgICAgfVxuICAgICAgZW1haWxzID0gYXdhaXQgZHJvcG1haWwuZ2V0RW1haWxzKHRva2VuLCBlbWFpbCk7XG4gICAgICBicmVhaztcbiAgICBkZWZhdWx0OlxuICAgICAgdGhyb3cgbmV3IEVycm9yKGBVbmtub3duIGNoYW5uZWw6ICR7Y2hhbm5lbH1gKTtcbiAgfVxuXG4gIHJldHVybiB7XG4gICAgY2hhbm5lbCxcbiAgICBlbWFpbCxcbiAgICBlbWFpbHMsXG4gICAgc3VjY2VzczogdHJ1ZSxcbiAgfTtcbn1cblxuZXhwb3J0IGNsYXNzIFRlbXBFbWFpbENsaWVudCB7XG4gIHByaXZhdGUgZW1haWxJbmZvOiBFbWFpbEluZm8gfCBudWxsID0gbnVsbDtcblxuICBhc3luYyBnZW5lcmF0ZShvcHRpb25zOiBHZW5lcmF0ZUVtYWlsT3B0aW9ucyA9IHt9KTogUHJvbWlzZTxFbWFpbEluZm8+IHtcbiAgICB0aGlzLmVtYWlsSW5mbyA9IGF3YWl0IGdlbmVyYXRlRW1haWwob3B0aW9ucyk7XG4gICAgcmV0dXJuIHRoaXMuZW1haWxJbmZvO1xuICB9XG5cbiAgYXN5bmMgZ2V0RW1haWxzKCk6IFByb21pc2U8R2V0RW1haWxzUmVzdWx0PiB7XG4gICAgaWYgKCF0aGlzLmVtYWlsSW5mbykge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdObyBlbWFpbCBnZW5lcmF0ZWQuIENhbGwgZ2VuZXJhdGUoKSBmaXJzdC4nKTtcbiAgICB9XG5cbiAgICByZXR1cm4gZ2V0RW1haWxzKHtcbiAgICAgIGNoYW5uZWw6IHRoaXMuZW1haWxJbmZvLmNoYW5uZWwsXG4gICAgICBlbWFpbDogdGhpcy5lbWFpbEluZm8uZW1haWwsXG4gICAgICB0b2tlbjogdGhpcy5lbWFpbEluZm8udG9rZW4sXG4gICAgfSk7XG4gIH1cblxuICBnZXRFbWFpbEluZm8oKTogRW1haWxJbmZvIHwgbnVsbCB7XG4gICAgcmV0dXJuIHRoaXMuZW1haWxJbmZvO1xuICB9XG59XG5cbmV4cG9ydCBkZWZhdWx0IHtcbiAgbGlzdENoYW5uZWxzLFxuICBnZXRDaGFubmVsSW5mbyxcbiAgZ2VuZXJhdGVFbWFpbCxcbiAgZ2V0RW1haWxzLFxuICBUZW1wRW1haWxDbGllbnQsXG59O1xuIl19
@@ -0,0 +1,5 @@
1
+ import { Email } from './types';
2
+ /**
3
+ * 将各提供商返回的原始邮件数据标准化为统一的 Email 格式
4
+ */
5
+ export declare function normalizeEmail(raw: any, recipientEmail?: string): Email;