Skip to content

Commit 148f70c

Browse files
committed
feat(jsx-key): check for array related method calls with jsx elements/fragments
1 parent f2869fd commit 148f70c

File tree

2 files changed

+33
-0
lines changed

2 files changed

+33
-0
lines changed

lib/rules/jsx-key.js

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -263,6 +263,25 @@ module.exports = {
263263
}
264264
},
265265

266+
// eslint-disable-next-line no-multi-str
267+
'CallExpression[callee.type="MemberExpression"][callee.property.name=/^push|unshift|splice|with$/],\
268+
CallExpression[callee.type="OptionalMemberExpression"][callee.property.name=/^push|unshift|splice|with$/],\
269+
OptionalCallExpression[callee.type="MemberExpression"][callee.property.name=/^push|unshift|splice|with$/],\
270+
OptionalCallExpression[callee.type="OptionalMemberExpression"][callee.property.name=/^push|unshift|splice|with$/]'(node) {
271+
if (node.arguments.length === 0) {
272+
return;
273+
}
274+
275+
node.arguments.forEach((arg) => {
276+
if (arg.type === 'JSXElement' && !hasProp(arg.openingElement.attributes, 'key')) {
277+
report(context, messages.missingIterKey, 'missingArrayKey', { node });
278+
}
279+
if (arg.type === 'JSXFragment') {
280+
report(context, messages.missingIterKey, 'missingArrayKeyUsePrag', { node });
281+
}
282+
});
283+
},
284+
266285
// Array.prototype.map
267286
// eslint-disable-next-line no-multi-str
268287
'CallExpression[callee.type="MemberExpression"][callee.property.name="map"],\

tests/lib/rules/jsx-key.js

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -205,6 +205,12 @@ ruleTester.run('jsx-key', rule, {
205205
`,
206206
settings,
207207
},
208+
{
209+
code: 'arr.push(<App key="key" />);',
210+
},
211+
{
212+
code: 'arr.push(<React.Fragment key="key" />);',
213+
},
208214
]),
209215
invalid: parsers.all([
210216
{
@@ -424,5 +430,13 @@ ruleTester.run('jsx-key', rule, {
424430
options: [{ checkKeyMustBeforeSpread: true }],
425431
errors: [{ messageId: 'keyBeforeSpread' }],
426432
},
433+
{
434+
code: 'arr.push(<App />);',
435+
errors: [{ messageId: 'missingArrayKey' }],
436+
},
437+
{
438+
code: 'arr.push(<></>);',
439+
errors: [{ messageId: 'missingArrayKeyUsePrag' }],
440+
},
427441
]),
428442
});

0 commit comments

Comments
 (0)