index.js 1.35 KB
/**
 * 模板注册表: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)
}