Skip to content

Commit f51ec45

Browse files
committed
[Fix] jsx-key: include duplicate-keyed jsx children in warnDuplicates option
See #2614 (comment); fixes #2614.
1 parent 6d6f5bd commit f51ec45

File tree

2 files changed

+26
-6
lines changed

2 files changed

+26
-6
lines changed

lib/rules/jsx-key.js

Lines changed: 11 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -104,9 +104,11 @@ module.exports = {
104104
});
105105
}
106106

107+
const seen = new WeakSet();
108+
107109
return {
108-
ArrayExpression(node) {
109-
const jsx = node.elements.filter((x) => x.type === 'JSXElement');
110+
'ArrayExpression, JSXElement > JSXElement'(node) {
111+
const jsx = (node.type === 'ArrayExpression' ? node.elements : node.parent.children).filter((x) => x.type === 'JSXElement');
110112
if (jsx.length === 0) {
111113
return;
112114
}
@@ -128,7 +130,7 @@ module.exports = {
128130

129131
if (checkKeyMustBeforeSpread && isKeyAfterSpread(attrs)) {
130132
report(context, messages.keyBeforeSpread, 'keyBeforeSpread', {
131-
node,
133+
node: node.type === 'ArrayExpression' ? node : node.parent,
132134
});
133135
}
134136
});
@@ -138,9 +140,12 @@ module.exports = {
138140
if (warnOnDuplicates) {
139141
values(map).filter((v) => v.length > 1).forEach((v) => {
140142
v.forEach((n) => {
141-
report(context, messages.nonUniqueKeys, 'nonUniqueKeys', {
142-
node: n,
143-
});
143+
if (!seen.has(n)) {
144+
seen.add(n);
145+
report(context, messages.nonUniqueKeys, 'nonUniqueKeys', {
146+
node: n,
147+
});
148+
}
144149
});
145150
});
146151
}

tests/lib/rules/jsx-key.js

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -165,5 +165,20 @@ ruleTester.run('jsx-key', rule, {
165165
{ messageId: 'nonUniqueKeys', line: 4 },
166166
],
167167
},
168+
{
169+
code: `
170+
const div = (
171+
<div>
172+
<span key="notunique"/>
173+
<span key="notunique"/>
174+
</div>
175+
);
176+
`,
177+
options: [{ warnOnDuplicates: true }],
178+
errors: [
179+
{ messageId: 'nonUniqueKeys', line: 4 },
180+
{ messageId: 'nonUniqueKeys', line: 5 },
181+
],
182+
},
168183
]),
169184
});

0 commit comments

Comments
 (0)