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' }],