Skip to content

Commit a77c0d1

Browse files
hasparusljharb
authored andcommitted
[Fix] jsx-no-useless-fragment: accept fragments with call expressions
1 parent de268ec commit a77c0d1

File tree

2 files changed

+30
-6
lines changed

2 files changed

+30
-6
lines changed

lib/rules/jsx-no-useless-fragment.js

Lines changed: 20 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -66,6 +66,17 @@ function isKeyedElement(node) {
6666
&& node.openingElement.attributes.some(jsxUtil.isJSXAttributeKey);
6767
}
6868

69+
/**
70+
* @param {ASTNode} node
71+
* @returns {boolean}
72+
*/
73+
function containsCallExpression(node) {
74+
return node
75+
&& node.type === 'JSXExpressionContainer'
76+
&& node.expression
77+
&& node.expression.type === 'CallExpression';
78+
}
79+
6980
module.exports = {
7081
meta: {
7182
type: 'suggestion',
@@ -103,15 +114,18 @@ module.exports = {
103114
* @returns {boolean}
104115
*/
105116
function hasLessThanTwoChildren(node) {
106-
if (!node || !node.children || node.children.length < 2) {
117+
if (!node || !node.children) {
107118
return true;
108119
}
109120

110-
return (
111-
node.children.length
112-
- (+isPaddingSpaces(node.children[0]))
113-
- (+isPaddingSpaces(node.children[node.children.length - 1]))
114-
) < 2;
121+
/** @type {ASTNode[]} */
122+
const nonPaddingChildren = node.children.filter(
123+
(child) => !isPaddingSpaces(child)
124+
);
125+
126+
if (nonPaddingChildren.length < 2) {
127+
return !containsCallExpression(nonPaddingChildren[0]);
128+
}
115129
}
116130

117131
/**

tests/lib/rules/jsx-no-useless-fragment.js

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -63,6 +63,10 @@ ruleTester.run('jsx-no-useless-fragment', rule, {
6363
{
6464
code: '<Fooo content={<>eeee ee eeeeeee eeeeeeee</>} />',
6565
parser: parsers.BABEL_ESLINT
66+
},
67+
{
68+
code: '<>{foos.map(foo => foo)}</>',
69+
parser: parsers.BABEL_ESLINT
6670
}
6771
],
6872
invalid: [
@@ -72,6 +76,12 @@ ruleTester.run('jsx-no-useless-fragment', rule, {
7276
errors: [{messageId: 'NeedsMoreChidren', type: 'JSXFragment'}],
7377
parser: parsers.BABEL_ESLINT
7478
},
79+
{
80+
code: '<>{}</>',
81+
output: null,
82+
errors: [{messageId: 'NeedsMoreChidren', type: 'JSXFragment'}],
83+
parser: parsers.BABEL_ESLINT
84+
},
7585
{
7686
code: '<p>moo<>foo</></p>',
7787
output: '<p>moofoo</p>',

0 commit comments

Comments
 (0)