fcs
2025-04-10 0163870d662dc5b7d69ceff977490ede594f7d82
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
'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);
    });
};