diff --git a/lib/rules/jsx-curly-brace-presence.js b/lib/rules/jsx-curly-brace-presence.js
index 0f17143ffa..1dcc5ac037 100755
--- a/lib/rules/jsx-curly-brace-presence.js
+++ b/lib/rules/jsx-curly-brace-presence.js
@@ -369,6 +369,17 @@ module.exports = {
return false;
}
+ // Don't flag empty string literals in JSX children — removing them changes
+ // the JSX tree and can affect whitespace rendering (autofixes must be safe).
+ if (
+ jsxUtil.isJSX(parent)
+ && node.expression
+ && node.expression.type === 'Literal'
+ && node.expression.value === ''
+ ) {
+ return false;
+ }
+
return areRuleConditionsSatisfied(parent, config, OPTION_NEVER);
}
diff --git a/tests/lib/rules/jsx-curly-brace-presence.js b/tests/lib/rules/jsx-curly-brace-presence.js
index 59d756737b..8fa075c57c 100755
--- a/tests/lib/rules/jsx-curly-brace-presence.js
+++ b/tests/lib/rules/jsx-curly-brace-presence.js
@@ -76,6 +76,33 @@ ruleTester.run('jsx-curly-brace-presence', rule, {
code: '{\' \'}',
options: [{ children: 'always' }],
},
+ /*
+ * Empty string expressions in JSX children must not be flagged:
+ * removing {""} changes the JSX tree and can affect whitespace rendering.
+ * Autofixes must not introduce semantic changes.
+ */
+ {
+ code: '{""}',
+ },
+ {
+ code: "{''}",
+ },
+ {
+ code: '{""}',
+ options: [{ children: 'never' }],
+ },
+ {
+ code: "{''}",
+ options: [{ children: 'never' }],
+ },
+ {
+ code: 'foo{""}',
+ options: [{ children: 'never' }],
+ },
+ {
+ code: '{""}foo',
+ options: [{ children: 'never' }],
+ },
{
code: 'foo',
options: [{ props: 'always' }],