Skip to content

Commit c0aa40e

Browse files
committed
fix jsx-key bug - eslint not catching jsx-key error inside conditional statements
1 parent b9aa04b commit c0aa40e

File tree

2 files changed

+77
-6
lines changed

2 files changed

+77
-6
lines changed

lib/rules/jsx-key.js

Lines changed: 25 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -86,8 +86,25 @@ module.exports = {
8686
}
8787
}
8888

89-
function getReturnStatement(body) {
90-
return body.filter((item) => item.type === 'ReturnStatement')[0];
89+
function getReturnStatements(node) {
90+
const returnStatements = arguments[1] || [];
91+
if (node.type === 'IfStatement') {
92+
if (node.consequent) getReturnStatements(node.consequent, returnStatements);
93+
if (node.alternate) getReturnStatements(node.alternate, returnStatements);
94+
} else {
95+
const body = node.body;
96+
body.forEach((item) => {
97+
if (item.type === 'IfStatement') {
98+
getReturnStatements(item, returnStatements);
99+
}
100+
101+
if (item.type === 'ReturnStatement') {
102+
returnStatements.push(item);
103+
}
104+
});
105+
}
106+
107+
return returnStatements;
91108
}
92109

93110
function isKeyAfterSpread(attributes) {
@@ -189,10 +206,12 @@ module.exports = {
189206

190207
if (isFn || isArrFn) {
191208
if (fn.body.type === 'BlockStatement') {
192-
const returnStatement = getReturnStatement(fn.body.body);
193-
if (returnStatement && returnStatement.argument) {
194-
checkIteratorElement(returnStatement.argument);
195-
}
209+
const returnStatements = getReturnStatements(fn.body);
210+
returnStatements.forEach((returnStatement) => {
211+
if (returnStatement && returnStatement.argument) {
212+
checkIteratorElement(returnStatement.argument);
213+
}
214+
});
196215
}
197216
}
198217
},

tests/lib/rules/jsx-key.js

Lines changed: 52 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -230,5 +230,57 @@ ruleTester.run('jsx-key', rule, {
230230
{ messageId: 'nonUniqueKeys', line: 5 },
231231
],
232232
},
233+
{
234+
code: `
235+
const Test = () => {
236+
const list = [1, 2, 3, 4, 5];
237+
238+
return (
239+
<div>
240+
{list.map(item => {
241+
if (item < 2) {
242+
return <div>{item}</div>;
243+
}
244+
245+
return <div />;
246+
})}
247+
</div>
248+
);
249+
};
250+
`,
251+
errors: [
252+
{ messageId: 'missingIterKey' },
253+
{ messageId: 'missingIterKey' },
254+
],
255+
},
256+
{
257+
code: `
258+
const TestO = () => {
259+
const list = [1, 2, 3, 4, 5];
260+
261+
return (
262+
<div>
263+
{list.map(item => {
264+
if (item < 2) {
265+
return <div>{item}</div>;
266+
} else if (item < 5) {
267+
return <div></div>
268+
} else {
269+
return <div></div>
270+
}
271+
272+
return <div />;
273+
})}
274+
</div>
275+
);
276+
};
277+
`,
278+
errors: [
279+
{ messageId: 'missingIterKey' },
280+
{ messageId: 'missingIterKey' },
281+
{ messageId: 'missingIterKey' },
282+
{ messageId: 'missingIterKey' },
283+
],
284+
},
233285
]),
234286
});

0 commit comments

Comments
 (0)