@@ -186,6 +186,41 @@ module.exports = {
186186 )` . replace ( / \s / g, '' ) ;
187187 let isWithinChildrenToArray = false ;
188188
189+ /**
190+ * Checks if the given node is a push call expression that has JSX Elements or JSX Fragments as arguments,
191+ * and the JSX is missing a key prop
192+ * @param {ASTNode } node
193+ */
194+ function checkArrayPushArguments ( node ) {
195+ if ( isWithinChildrenToArray ) {
196+ return ;
197+ }
198+
199+ node . arguments . forEach ( ( arg ) => {
200+ if (
201+ arg . type === 'JSXElement'
202+ && ! hasProp ( arg . openingElement . attributes , 'key' )
203+ ) {
204+ report ( context , messages . missingArrayKey , 'missingArrayKey' , {
205+ node : arg ,
206+ } ) ;
207+ } else if ( checkFragmentShorthand && arg . type === 'JSXFragment' ) {
208+ report (
209+ context ,
210+ messages . missingArrayKeyUsePrag ,
211+ 'missingArrayKeyUsePrag' ,
212+ {
213+ node : arg ,
214+ data : {
215+ reactPrag : reactPragma ,
216+ fragPrag : fragmentPragma ,
217+ } ,
218+ }
219+ ) ;
220+ }
221+ } ) ;
222+ }
223+
189224 const seen = new WeakSet ( ) ;
190225
191226 return {
@@ -197,6 +232,12 @@ module.exports = {
197232 isWithinChildrenToArray = false ;
198233 } ,
199234
235+ 'CallExpression[callee.type="MemberExpression"][callee.property.name="push"]' (
236+ node
237+ ) {
238+ checkArrayPushArguments ( node ) ;
239+ } ,
240+
200241 'ArrayExpression, JSXElement > JSXElement' ( node ) {
201242 if ( isWithinChildrenToArray ) {
202243 return ;
0 commit comments