Skip to content

Commit f2b0a0d

Browse files
committed
Quote props with double or single quotes, fall back to a string expr
1 parent 1da6fb7 commit f2b0a0d

File tree

2 files changed

+35
-9
lines changed

2 files changed

+35
-9
lines changed

packages/babel-plugin-transform-jsx-to-tagged-templates/src/index.mjs

Lines changed: 16 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,5 @@
11
import jsx from '@babel/plugin-syntax-jsx';
22

3-
function escapeValue(value) {
4-
if (value.match(/^[a-z0-9_' &]+$/gi)) {
5-
return `"${value}"`;
6-
}
7-
return JSON.stringify(value);
8-
}
9-
103
/**
114
* @param {Babel} babel
125
* @param {object} [options]
@@ -40,6 +33,21 @@ export default function jsxToTaggedTemplatesBabelPlugin({ types: t }, options =
4033
buffer += str;
4134
}
4235

36+
function escapeStringLiteral(node) {
37+
const value = node.value;
38+
39+
if (value.match(/^[a-z0-9_'" ]*$/gi)) {
40+
if (value.indexOf('"') < 0) {
41+
return raw(`"${value}"`);
42+
}
43+
else if (value.indexOf("'") < 0) {
44+
return raw(`'${value}'`);
45+
}
46+
}
47+
48+
return expr(node);
49+
}
50+
4351
function commit(force) {
4452
if (!buffer && !force) return;
4553
quasis.push(t.templateElement({
@@ -79,7 +87,7 @@ export default function jsxToTaggedTemplatesBabelPlugin({ types: t }, options =
7987
expr(value.expression);
8088
}
8189
else if (t.isStringLiteral(value)) {
82-
raw(escapeValue(value.value));
90+
escapeStringLiteral(value);
8391
}
8492
else {
8593
expr(value);

packages/babel-plugin-transform-jsx-to-tagged-templates/test/index.test.js

Lines changed: 19 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -56,7 +56,25 @@ describe('babel-plugin-transform-jsx-to-tagged-templates', () => {
5656
compile('(<div a="a" b="bb" c d />);')
5757
).toBe('html`<div a="a" b="bb" c d/>`;');
5858
});
59-
59+
60+
test('double quote values with single quotes', () => {
61+
expect(
62+
compile(`(<div a="'b'" />);`)
63+
).toBe(`html\`<div a="'b'"/>\`;`);
64+
});
65+
66+
test('single quote values with double quotes', () => {
67+
expect(
68+
compile(`(<div a='"b"' />);`)
69+
).toBe(`html\`<div a='"b"'/>\`;`);
70+
});
71+
72+
test('escape non-trivial values as expressions', () => {
73+
expect(
74+
compile(`(<div a="\x00" b="&abcd;" />);`)
75+
).toBe('html`<div a=${"\x00"} b=${"&abcd;"}/>`;');
76+
});
77+
6078
test('expression values', () => {
6179
expect(
6280
compile('const Foo = (props, a) => <div a={a} b={"b"} c={{}} d={props.d} e />;')

0 commit comments

Comments
 (0)