Skip to content

Commit be5ec8a

Browse files
committed
fix: escape dollar sequences in render replacement
1 parent 19db363 commit be5ec8a

2 files changed

Lines changed: 7 additions & 1 deletion

File tree

src/renderer.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@ export function render(template: string, values: Record<string, string>): string
44
for (const [key, value] of Object.entries(values)) {
55
const escaped = key.replace(/[.*+?^${}()|[\]\\]/g, '\\$&');
66
const pattern = new RegExp(`\\{\\{${escaped}\\}\\}`, 'g');
7-
result = result.replace(pattern, value);
7+
result = result.replace(pattern, () => value);
88
}
99

1010
return result;

tests/renderer.test.ts

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -29,4 +29,10 @@ describe('render', () => {
2929
const result = render('SELECT * FROM {{table}}', { table: '' });
3030
expect(result).toBe('SELECT * FROM ');
3131
});
32+
33+
it('treats $ sequences in values as literals', () => {
34+
const template = "SELECT * FROM t WHERE a = '{{a}}' AND b = '{{b}}' AND c = '{{c}}'";
35+
const result = render(template, { a: '$&', b: '$$', c: "$'" });
36+
expect(result).toBe("SELECT * FROM t WHERE a = '$&' AND b = '$$' AND c = '$''");
37+
});
3238
});

0 commit comments

Comments
 (0)