Description
Example JSX code:
<span data-foo=""" />
The relevant part of the ESTree:
openingElement: Node {
type: 'JSXOpeningElement',
attributes: [
Node {
type: 'JSXAttribute',
name: Node {
type: 'JSXIdentifier',
name: 'data-foo'
},
value: Node {
type: 'Literal',
value: '"',
raw: '"""' // <-- problem is here
}
}
],
// ...
}
I believe the raw
property of the literal is wrong. When transforming such a tree and preserving the literals as-is, some code generators (e.g. astring) will prefer the raw
property and emit it as is:
This may lead to generated code that looks as follows:
React.createElement(
"span",
{ "data-foo": '"""' }
)
Naturally this is wrong, because React and other tools will escape values by themselves. Interestingly enough, escodegen appears to ignore the raw
property.
The naive solution would be to nuke all raw
properties nested within any JSX node, but that would be a little more than necessary:
<span data-foo={ "bla" } />
Here, the escaping rules are regular JS rules.
My proposal would be to remove raw
from all literals that are nested directly below an attribute.
The following situation is not affected:
<span>&</span>
... for the sole reason that text nested in elements are not parsed as literals, but rather as the separate JSXText
node type.