Skip to content

Commit 844939c

Browse files
authored
fix(core): preserve template replacement tokens (#1402)
* fix(core): preserve template replacement tokens * fix(core): stringify template variables once
1 parent 35efe17 commit 844939c

3 files changed

Lines changed: 29 additions & 1 deletion

File tree

‎.changeset/bright-prompts-smile.md‎

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
---
2+
"@voltagent/core": patch
3+
---
4+
5+
Preserve JavaScript replacement tokens in simple template variable values.

‎packages/core/src/voltops/template-engine.spec.ts‎

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -101,5 +101,27 @@ describe("Template Engine", () => {
101101

102102
expect(result).toBe("Pattern: $1.50 (special)");
103103
});
104+
105+
it("should preserve replacement tokens in variable values", () => {
106+
const content = "Amount: {{value}}";
107+
const variables = { value: "$&" };
108+
const result = engine.process(content, variables);
109+
110+
expect(result).toBe("Amount: $&");
111+
});
112+
113+
it("should convert each variable to a string only once", () => {
114+
let conversions = 0;
115+
const content = "{{value}}/{{value}}";
116+
const variables = {
117+
value: {
118+
[Symbol.toPrimitive]: () => `value-${++conversions}`,
119+
},
120+
};
121+
const result = engine.process(content, variables);
122+
123+
expect(result).toBe("value-1/value-1");
124+
expect(conversions).toBe(1);
125+
});
104126
});
105127
});

‎packages/core/src/voltops/template-engine.ts‎

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,8 @@ export const createSimpleTemplateEngine = (): TemplateEngine => ({
2222
let processed = content;
2323
for (const [key, value] of Object.entries(variables)) {
2424
const regex = new RegExp(`{{\\s*${key}\\s*}}`, "g");
25-
processed = processed.replace(regex, String(value));
25+
const replacement = String(value);
26+
processed = processed.replace(regex, () => replacement);
2627
}
2728
return processed;
2829
},

0 commit comments

Comments
 (0)