From 60d15dac03b3e4629f37e1e05d9fe1ccbedf46f6 Mon Sep 17 00:00:00 2001 From: "Hur Hyeon Bin (Max)" <160996936+hyeonbinHur@users.noreply.github.com> Date: Mon, 26 May 2025 20:36:23 +0900 Subject: [PATCH] [Fix]: detect missing keys in return statement with ternary operator Fix #3925 --- lib/rules/jsx-key.js | 15 +++++++++- tests/lib/rules/jsx-key.js | 57 ++++++++++++++++++++++++++++++++++++++ 2 files changed, 71 insertions(+), 1 deletion(-) diff --git a/lib/rules/jsx-key.js b/lib/rules/jsx-key.js index 825d21f4bb..a14c90cb38 100644 --- a/lib/rules/jsx-key.js +++ b/lib/rules/jsx-key.js @@ -146,7 +146,20 @@ module.exports = { getReturnStatements(node.body) .filter((returnStatement) => returnStatement && returnStatement.argument) .forEach((returnStatement) => { - checkIteratorElement(returnStatement.argument); + const argument = returnStatement.argument; + + if (argument.type === 'ConditionalExpression') { + const shouldCheckNode = (n) => n && (n.type === 'JSXElement' || n.type === 'JSXFragment'); + + if (shouldCheckNode(argument.consequent)) { + checkIteratorElement(argument.consequent); + } + if (shouldCheckNode(argument.alternate)) { + checkIteratorElement(argument.alternate); + } + } else { + checkIteratorElement(argument); + } }); } } diff --git a/tests/lib/rules/jsx-key.js b/tests/lib/rules/jsx-key.js index 2c5ba7a5c1..1166a9e600 100644 --- a/tests/lib/rules/jsx-key.js +++ b/tests/lib/rules/jsx-key.js @@ -36,6 +36,12 @@ const settings = { const ruleTester = new RuleTester({ parserOptions }); ruleTester.run('jsx-key', rule, { valid: parsers.all([ + { + code: ` + [1, 2, 3].map((item) => { + return item === 'bar' ?
{item}
: {item}; + })`, + }, { code: 'fn()' }, { code: '[1, 2, 3].map(function () {})' }, { code: ';' }, @@ -207,6 +213,57 @@ ruleTester.run('jsx-key', rule, { }, ]), invalid: parsers.all([ + { + code: ` + [1, 2, 3].map((item) => { + return item === 'bar' ?
{item}
: {item}; + })`, + errors: [ + { messageId: 'missingIterKey' }, + { messageId: 'missingIterKey' }, + ], + }, + { + code: ` + [1, 2, 3].map(function(item) { + return item === 'bar' ?
{item}
: {item}; + })`, + errors: [ + { messageId: 'missingIterKey' }, + { messageId: 'missingIterKey' }, + ], + }, + { + code: ` + Array.from([1, 2, 3], (item) => { + return item === 'bar' ?
{item}
: {item}; + })`, + errors: [ + { messageId: 'missingIterKey' }, + { messageId: 'missingIterKey' }, + ], + }, + { + code: ` + import { Fragment } from 'react'; + + const ITEMS = ['bar', 'foo']; + + export default function BugIssue() { + return ( + + {ITEMS.map((item) => { + return item === 'bar' ?
{item}
: {item}; + })} +
+ ); + } + `, + errors: [ + { messageId: 'missingIterKey' }, + { messageId: 'missingIterKey' }, + ], + }, { code: '[];', errors: [{ messageId: 'missingArrayKey' }],