Skip to content

Commit 7d62880

Browse files
committed
fix: sanitize dynamic attr variable names for aria/data attributes
Hyphens in attribute names like :aria-required produced invalid JS variable names in generated render functions. Now replaced with underscores in the temp variable while preserving the HTML attr name.
1 parent 5752ead commit 7d62880

2 files changed

Lines changed: 6 additions & 5 deletions

File tree

packages/core/src/template-compiler.ts

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -255,9 +255,10 @@ function compileElement(element: Element, indent: number): string {
255255
continue;
256256
}
257257
// Conditionally render attribute only if value is truthy
258-
code += `${pad}const _${attrName}Val = ${attr.value};\n`;
259-
code += `${pad}if (_${attrName}Val) {\n`;
260-
code += `${pad} out += " ${attrName}=\\"" + escapeAttr(_${attrName}Val) + "\\"";\n`;
258+
const varName = attrName.replace(/[^a-zA-Z0-9_]/g, "_");
259+
code += `${pad}const _${varName}Val = ${attr.value};\n`;
260+
code += `${pad}if (_${varName}Val) {\n`;
261+
code += `${pad} out += " ${attrName}=\\"" + escapeAttr(_${varName}Val) + "\\"";\n`;
261262
code += `${pad}}\n`;
262263
}
263264
}

packages/core/test/template-compiler.test.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -288,8 +288,8 @@ describe("Template Compiler", () => {
288288
const template = '<div :data-id="props.id">content</div>';
289289
const result = compileTemplate(template, "test-block");
290290

291-
expect(result).toContain("_data-idVal = props.id");
292-
expect(result).toContain("escapeAttr(_data-idVal)");
291+
expect(result).toContain("_data_idVal = props.id");
292+
expect(result).toContain("escapeAttr(_data_idVal)");
293293
});
294294
});
295295

0 commit comments

Comments
 (0)