12345678910111213141516171819202122232425262728293031323334353637383940 |
- 'use strict';
- const {htmlEscape} = require('escape-goat');
- module.exports = (template, data) => {
- if (typeof template !== 'string') {
- throw new TypeError(`Expected a \`string\` in the first argument, got \`${typeof template}\``);
- }
- if (typeof data !== 'object') {
- throw new TypeError(`Expected an \`object\` or \`Array\` in the second argument, got \`${typeof data}\``);
- }
- // The regex tries to match either a number inside `{{ }}` or a valid JS identifier or key path.
- const doubleBraceRegex = /{{(\d+|[a-z$_][a-z\d$_]*?(?:\.[a-z\d$_]*?)*?)}}/gi;
- if (doubleBraceRegex.test(template)) {
- template = template.replace(doubleBraceRegex, (_, key) => {
- let result = data;
- for (const property of key.split('.')) {
- result = result ? result[property] : '';
- }
- return htmlEscape(String(result));
- });
- }
- const braceRegex = /{(\d+|[a-z$_][a-z\d$_]*?(?:\.[a-z\d$_]*?)*?)}/gi;
- return template.replace(braceRegex, (_, key) => {
- let result = data;
- for (const property of key.split('.')) {
- result = result ? result[property] : '';
- }
- return String(result);
- });
- };
|