index.js
1.35 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
/**
* 模板注册表:name → render(data) => { subject, html, text }(纯函数)。
* 加新模板 = 加 `templates/<name>.js` + 这里登记一行,不改 provider、不改调用方。
*/
import * as verifyCode from './verify-code.js'
import * as videoReady from './video-ready.js'
import * as waitlistInvite from './waitlist-invite.js'
import * as orderNotice from './order-notice.js'
import * as vokoNotice from './voko-notice.js'
import { EmailError } from '../map-error.js'
const REGISTRY = {
'verify-code': verifyCode.render,
'video-ready': videoReady.render,
'waitlist-invite': waitlistInvite.render,
'order-notice': orderNotice.render,
'voko-notice': vokoNotice.render,
}
/**
* 渲染指定模板。未知模板名抛 badTemplate;render 自身的缺字段错误透传。
* @param {string} name
* @param {object} data
* @returns {{ subject: string, html: string, text: string }}
*/
export function renderTemplate(name, data) {
const render = REGISTRY[name]
if (!render) {
const known = Object.keys(REGISTRY).join(', ')
throw new EmailError({
provider: 'template',
reason: 'badTemplate',
retryable: false,
message: `unknown template "${name}". known: ${known}`,
})
}
return render(data)
}
/** @returns {string[]} 已注册模板名 */
export function knownTemplates() {
return Object.keys(REGISTRY)
}