#!/usr/bin/env node /** * render-mail-header.mjs — erzeugt das Kopfbild der Willkommensmail * (apps/api/assets/mail/welcome-header.png, 1200x112 fuer hochaufloesende * Bildschirme, in der Mail 600x56 angezeigt) aus der daneben liegenden * Quelle welcome-header.svg. * * Warum ein PNG statt Inline-SVG oder CSS-Hintergrund: Outlook (Word- * Darstellung) und viele Webmailer zeigen weder SVG noch Hintergrundbilder * zuverlaessig an. Das PNG wird als CID-Anhang eingebettet (MailService), * die Mail laedt also nichts von aussen nach. * * Das PNG liegt fertig im Repo; dieses Skript ist nur noetig, wenn die SVG * geaendert wird. Kein neues Paket: `sharp` ist ueber Next.js (apps/web) * bereits installiert und wird von dort aufgeloest. Der Schriftzug wird * mit den Systemschriften des erzeugenden Rechners gesetzt (fontconfig: * Segoe UI, Inter, Noto Sans, DejaVu Sans — die erste vorhandene gewinnt). * * Aufruf (Repo-Wurzel): node apps/api/scripts/render-mail-header.mjs */ import { readFileSync, writeFileSync } from 'node:fs'; import { createRequire } from 'node:module'; import { dirname, join } from 'node:path'; import { fileURLToPath } from 'node:url'; const here = dirname(fileURLToPath(import.meta.url)); const assetDir = join(here, '..', 'assets', 'mail'); const webDir = join(here, '..', '..', 'web'); const require = createRequire(import.meta.url); const nextPkg = require.resolve('next/package.json', { paths: [webDir] }); const sharp = createRequire(nextPkg)('sharp'); const svg = readFileSync(join(assetDir, 'welcome-header.svg')); const png = await sharp(svg, { density: 72 }) .resize(1200, 112) .png({ compressionLevel: 9, palette: false }) .toBuffer(); writeFileSync(join(assetDir, 'welcome-header.png'), png); console.log(`welcome-header.png geschrieben (${png.length} Bytes)`);