@@ -2,6 +2,10 @@ import { TSESTree } from '@typescript-eslint/experimental-utils';
22import {
33 getPropertyIdentifierNode ,
44 isExpressionStatement ,
5+ isVariableDeclaration ,
6+ isAssignmentExpression ,
7+ isCallExpression ,
8+ isSequenceExpression ,
59} from '../node-utils' ;
610import { createTestingLibraryRule } from '../create-testing-library-rule' ;
711
@@ -32,7 +36,11 @@ export default createTestingLibraryRule<Options, MessageIds>({
3236 defaultOptions : [ ] ,
3337 create : function ( context , _ , helpers ) {
3438 function isCallerWaitFor (
35- node : TSESTree . BlockStatement | TSESTree . CallExpression
39+ node :
40+ | TSESTree . BlockStatement
41+ | TSESTree . CallExpression
42+ | TSESTree . AssignmentExpression
43+ | TSESTree . SequenceExpression
3644 ) : boolean {
3745 if ( ! node . parent ) {
3846 return false ;
@@ -48,22 +56,78 @@ export default createTestingLibraryRule<Options, MessageIds>({
4856 ) ;
4957 }
5058
59+ function isRenderInVariableDeclaration ( node : TSESTree . Node ) {
60+ return (
61+ isVariableDeclaration ( node ) &&
62+ node . declarations . some ( helpers . isRenderVariableDeclarator )
63+ ) ;
64+ }
65+
66+ function isRenderInExpressionStatement ( node : TSESTree . Node ) {
67+ if (
68+ ! isExpressionStatement ( node ) ||
69+ ! isAssignmentExpression ( node . expression )
70+ ) {
71+ return false ;
72+ }
73+
74+ const expressionIdentifier = getPropertyIdentifierNode (
75+ node . expression . right
76+ ) ;
77+
78+ if ( ! expressionIdentifier ) {
79+ return false ;
80+ }
81+
82+ return helpers . isRenderUtil ( expressionIdentifier ) ;
83+ }
84+
85+ function isRenderInAssignmentExpression ( node : TSESTree . Node ) {
86+ if ( ! isAssignmentExpression ( node ) ) {
87+ return false ;
88+ }
89+
90+ const expressionIdentifier = getPropertyIdentifierNode ( node . right ) ;
91+ if ( ! expressionIdentifier ) {
92+ return false ;
93+ }
94+
95+ return helpers . isRenderUtil ( expressionIdentifier ) ;
96+ }
97+
98+ function isRenderInSequenceAssignment ( node : TSESTree . Node ) {
99+ if ( ! isSequenceExpression ( node ) ) {
100+ return false ;
101+ }
102+
103+ return node . expressions . some ( isRenderInAssignmentExpression ) ;
104+ }
105+
51106 function getSideEffectNodes (
52107 body : TSESTree . Node [ ]
53108 ) : TSESTree . ExpressionStatement [ ] {
54109 return body . filter ( ( node ) => {
55- if ( ! isExpressionStatement ( node ) ) {
110+ if ( ! isExpressionStatement ( node ) && ! isVariableDeclaration ( node ) ) {
56111 return false ;
57112 }
58113
114+ if (
115+ isRenderInVariableDeclaration ( node ) ||
116+ isRenderInExpressionStatement ( node )
117+ ) {
118+ return true ;
119+ }
120+
59121 const expressionIdentifier = getPropertyIdentifierNode ( node ) ;
122+
60123 if ( ! expressionIdentifier ) {
61124 return false ;
62125 }
63126
64127 return (
65128 helpers . isFireEventUtil ( expressionIdentifier ) ||
66- helpers . isUserEventUtil ( expressionIdentifier )
129+ helpers . isUserEventUtil ( expressionIdentifier ) ||
130+ helpers . isRenderUtil ( expressionIdentifier )
67131 ) ;
68132 } ) as TSESTree . ExpressionStatement [ ] ;
69133 }
@@ -81,19 +145,33 @@ export default createTestingLibraryRule<Options, MessageIds>({
81145 ) ;
82146 }
83147
84- function reportImplicitReturnSideEffect ( node : TSESTree . CallExpression ) {
148+ function reportImplicitReturnSideEffect (
149+ node :
150+ | TSESTree . CallExpression
151+ | TSESTree . AssignmentExpression
152+ | TSESTree . SequenceExpression
153+ ) {
85154 if ( ! isCallerWaitFor ( node ) ) {
86155 return ;
87156 }
88157
89- const expressionIdentifier = getPropertyIdentifierNode ( node . callee ) ;
90- if ( ! expressionIdentifier ) {
158+ const expressionIdentifier = isCallExpression ( node )
159+ ? getPropertyIdentifierNode ( node . callee )
160+ : null ;
161+
162+ if (
163+ ! expressionIdentifier &&
164+ ! isRenderInAssignmentExpression ( node ) &&
165+ ! isRenderInSequenceAssignment ( node )
166+ ) {
91167 return ;
92168 }
93169
94170 if (
171+ expressionIdentifier &&
95172 ! helpers . isFireEventUtil ( expressionIdentifier ) &&
96- ! helpers . isUserEventUtil ( expressionIdentifier )
173+ ! helpers . isUserEventUtil ( expressionIdentifier ) &&
174+ ! helpers . isRenderUtil ( expressionIdentifier )
97175 ) {
98176 return ;
99177 }
@@ -107,6 +185,8 @@ export default createTestingLibraryRule<Options, MessageIds>({
107185 return {
108186 'CallExpression > ArrowFunctionExpression > BlockStatement' : reportSideEffects ,
109187 'CallExpression > ArrowFunctionExpression > CallExpression' : reportImplicitReturnSideEffect ,
188+ 'CallExpression > ArrowFunctionExpression > AssignmentExpression' : reportImplicitReturnSideEffect ,
189+ 'CallExpression > ArrowFunctionExpression > SequenceExpression' : reportImplicitReturnSideEffect ,
110190 'CallExpression > FunctionExpression > BlockStatement' : reportSideEffects ,
111191 } ;
112192 } ,
0 commit comments