Files
website/server/src/emailBlocks/index.js
wtclaude 12ff201ed5
All checks were successful
PR Checks / bot-tests (pull_request) Successful in 29s
PR Checks / client-build (pull_request) Successful in 31s
PR Checks / server-tests (pull_request) Successful in 2m38s
feat(engagement): templates — the email block family, renderer and seeded set (engagement Phase 5a)
Every subject and body moves out of `mailer.js` into `engagement_templates` rows an
operator can edit. A relocation, not a regression: nothing that sends mail today
starts depending on an operator authoring something first.

- `email.*` block family in its own registry, sharing the page family's envelope
  walk and validate-then-sanitize order by binding rather than by copy.
- A server-side renderer producing both parts of a multipart message; the text
  part is byte-identical to the literals this commit deletes.
- Nine seeded templates, six of them wired now; the seeder's `customized = 0`
  guard lives in the UPDATE's own WHERE.
- `renderByKey` falls back to the shipped seed when a row is missing or unusable,
  so no failure of the table can stop a password reset.

Also fixes `check:hosts` reading the template key `auth.email-verify` as the
hostname `auth.email`.

Co-Authored-By: Claude <noreply@anthropic.com>
2026-08-29 13:07:39 -05:00

27 lines
1017 B
JavaScript

// Email block registry entrypoint. Requiring this module registers every
// `email.*` block definition exactly once, then re-exports the registry API, the
// renderer and the registry-bound validator/sanitizer. Anything that needs to
// validate or render a mail template's blocks should require THIS module, not
// ./registry or ./render directly, so the definitions are guaranteed loaded.
//
// Same shape as `blocks/index.js`, on purpose — the two families are siblings
// (see ./registry.js for why they are not one registry).
const registry = require('./registry')
const render = require('./render')
const interpolate = require('./interpolate')
// ── Block definitions (self-register on require) ───────────────────────────
require('./types/heading')
require('./types/text')
require('./types/button')
require('./types/divider')
require('./types/image')
require('./types/itemList')
module.exports = {
...registry,
...render,
...interpolate,
}