-
Notifications
You must be signed in to change notification settings - Fork 859
Expand file tree
/
Copy pathmanaged-alias-utils.js
More file actions
175 lines (157 loc) · 6.16 KB
/
managed-alias-utils.js
File metadata and controls
175 lines (157 loc) · 6.16 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
(function attachManagedAliasUtils(root, factory) {
root.MultiPageManagedAliasUtils = factory();
})(typeof self !== 'undefined' ? self : globalThis, function createManagedAliasUtilsModule() {
const GMAIL_PROVIDER = 'gmail';
const MAIL_2925_PROVIDER = '2925';
const MAIL_2925_MODE_PROVIDE = 'provide';
const MAIL_2925_MODE_RECEIVE = 'receive';
const DEFAULT_MAIL_2925_MODE = MAIL_2925_MODE_PROVIDE;
const PROVIDER_CONFIGS = {
[GMAIL_PROVIDER]: {
baseLabel: 'Gmail 原邮箱',
basePlaceholder: '例如 yourname@gmail.com',
label: 'Gmail +tag 邮箱',
parseBaseEmail(rawValue = '') {
const value = String(rawValue || '').trim().toLowerCase();
const match = value.match(/^([^@\s+]+)@((?:gmail|googlemail)\.com)$/i);
if (!match) return null;
return {
localPart: match[1],
domain: match[2].toLowerCase(),
};
},
matchesProviderDomain(domain = '') {
return /^(?:gmail|googlemail)\.com$/i.test(String(domain || '').trim());
},
matchesAliasLocalPart(baseLocalPart = '', candidateLocalPart = '') {
return String(candidateLocalPart || '').split('+')[0] === String(baseLocalPart || '');
},
buildAlias(parsedBaseEmail, tag) {
return `${parsedBaseEmail.localPart}+${tag}@${parsedBaseEmail.domain}`;
},
generationHint: '先填写 Gmail 原邮箱后点“生成”,也可以直接手动填写完整的 Gmail 邮箱。',
registrationPlaceholder: '点击生成 Gmail +tag 邮箱,或手动填写完整邮箱',
},
[MAIL_2925_PROVIDER]: {
baseLabel: '2925 基邮箱',
basePlaceholder: '例如 yourname@2925.com',
label: '2925 邮箱',
parseBaseEmail(rawValue = '') {
const value = String(rawValue || '').trim().toLowerCase();
const match = value.match(/^([^@\s+]+)@(2925\.com)$/i);
if (!match) return null;
return {
localPart: match[1],
domain: match[2].toLowerCase(),
};
},
matchesProviderDomain(domain = '') {
return String(domain || '').trim().toLowerCase() === '2925.com';
},
matchesAliasLocalPart(baseLocalPart = '', candidateLocalPart = '') {
const normalizedBaseLocalPart = String(baseLocalPart || '');
const normalizedCandidateLocalPart = String(candidateLocalPart || '');
return normalizedCandidateLocalPart === normalizedBaseLocalPart
|| normalizedCandidateLocalPart.startsWith(normalizedBaseLocalPart);
},
buildAlias(parsedBaseEmail, tag) {
return `${parsedBaseEmail.localPart}${tag}@${parsedBaseEmail.domain}`;
},
generationHint: '先填写 2925 基邮箱后点“生成”,也可以直接手动填写完整的 2925 邮箱。',
registrationPlaceholder: '点击生成 2925 邮箱,或手动填写完整邮箱',
},
};
function getManagedAliasProviderConfig(provider = '') {
return PROVIDER_CONFIGS[String(provider || '').trim().toLowerCase()] || null;
}
function normalizeMail2925Mode(value = '') {
return String(value || '').trim().toLowerCase() === MAIL_2925_MODE_RECEIVE
? MAIL_2925_MODE_RECEIVE
: DEFAULT_MAIL_2925_MODE;
}
function isManagedAliasProvider(provider = '') {
return Boolean(getManagedAliasProviderConfig(provider));
}
function usesManagedAliasGeneration(provider = '', options = {}) {
const normalizedProvider = String(provider || '').trim().toLowerCase();
if (!isManagedAliasProvider(normalizedProvider)) {
return false;
}
if (normalizedProvider !== MAIL_2925_PROVIDER) {
return true;
}
const mail2925Mode = typeof options === 'string'
? options
: options?.mail2925Mode;
return normalizeMail2925Mode(mail2925Mode) === MAIL_2925_MODE_PROVIDE;
}
function parseEmailParts(rawValue = '') {
const value = String(rawValue || '').trim().toLowerCase();
const match = value.match(/^([^@\s]+)@([^@\s]+\.[^@\s]+)$/);
if (!match) return null;
return {
localPart: match[1],
domain: match[2],
};
}
function parseManagedAliasBaseEmail(rawValue, provider = '') {
const config = getManagedAliasProviderConfig(provider);
return config?.parseBaseEmail(rawValue) || null;
}
function isManagedAliasEmail(value, provider = '', baseEmail = '') {
const config = getManagedAliasProviderConfig(provider);
if (!config) return false;
const parsedEmail = parseEmailParts(value);
if (!parsedEmail || !config.matchesProviderDomain(parsedEmail.domain)) {
return false;
}
const parsedBaseEmail = parseManagedAliasBaseEmail(baseEmail, provider);
if (!parsedBaseEmail) {
return true;
}
return parsedEmail.domain === parsedBaseEmail.domain
&& config.matchesAliasLocalPart(parsedBaseEmail.localPart, parsedEmail.localPart);
}
function buildManagedAliasEmail(provider = '', baseEmail = '', tag = '') {
const config = getManagedAliasProviderConfig(provider);
if (!config) {
throw new Error(`Unsupported managed alias provider: ${provider}`);
}
const parsedBaseEmail = parseManagedAliasBaseEmail(baseEmail, provider);
if (!parsedBaseEmail) {
throw new Error(`${config.baseLabel}格式不正确`);
}
const normalizedTag = String(tag || '').trim();
if (!normalizedTag) {
throw new Error(`${config.label}生成标签为空`);
}
return config.buildAlias(parsedBaseEmail, normalizedTag);
}
function getManagedAliasProviderUiCopy(provider = '') {
const config = getManagedAliasProviderConfig(provider);
if (!config) return null;
return {
baseLabel: config.baseLabel,
basePlaceholder: config.basePlaceholder,
buttonLabel: '生成',
successVerb: '生成',
label: config.label,
placeholder: config.registrationPlaceholder,
hint: config.generationHint,
};
}
return {
buildManagedAliasEmail,
DEFAULT_MAIL_2925_MODE,
getManagedAliasProviderConfig,
getManagedAliasProviderUiCopy,
isManagedAliasEmail,
isManagedAliasProvider,
MAIL_2925_MODE_PROVIDE,
MAIL_2925_MODE_RECEIVE,
normalizeMail2925Mode,
parseEmailParts,
parseManagedAliasBaseEmail,
usesManagedAliasGeneration,
};
});