function escapeHtml(str) { return String(str).replace(/[&<>"']/g, (c) => ({ '&': '&', '<': '<', '>': '>', '"': '"', "'": ''', }[c])); } function formatPrice(price) { return price == null ? '—' : `€${Number(price).toFixed(2).replace('.', ',')}`; } function renderProductRow(product) { return ` ${escapeHtml(product.name)} bekijken ${formatPrice(product.last_price)} ${product.last_checked_at ? escapeHtml(product.last_checked_at) : '—'} ${escapeHtml(product.last_check_status || '—')}
`; } function renderIndex({ products, message }) { return ` Korting — prijstracker

Korting — prijstracker

${message ? `

${escapeHtml(message)}

` : ''}
${products.map(renderProductRow).join('')}
NaamURLPrijsLaatst gecontroleerdStatus
`; } module.exports = { renderIndex, escapeHtml, formatPrice };