// Created on savesnippets.com · https://savesnippets.com/buEVSKVxSrF84j // HTML escape tag — safe client-side interpolation const escapeMap = { '&':'&','<':'<','>':'>','"':'"',"'":''' }; const escapeHtml = (s) => String(s).replace(/[&<>"']/g, (c) => escapeMap[c]); function html(strings, ...values) { return strings.reduce((out, str, i) => out + str + (values[i] !== undefined ? escapeHtml(values[i]) : ''), ''); } // SQL parameterisation tag — pairs with pg / mysql2 function sql(strings, ...values) { let text = ''; strings.forEach((str, i) => { text += str; if (i < values.length) text += `$${i + 1}`; }); return { text, values }; } // Usage const name = ''; document.querySelector('#output').innerHTML = html`

Hello, ${name}!

`; // →

Hello, <script>alert(1)</script>

const userId = 42; const query = sql`SELECT * FROM users WHERE id = ${userId}`; // → { text: 'SELECT * FROM users WHERE id = $1', values: [42] }