@@ -608,6 +608,7 @@ function componentRule(rule, context) {
608
608
* @returns {ASTNode | undefined }
609
609
*/
610
610
getStatelessComponent ( node ) {
611
+ const parent = node . parent ;
611
612
if (
612
613
node . type === 'FunctionDeclaration'
613
614
&& ( ! node . id || isFirstLetterCapitalized ( node . id . name ) )
@@ -617,6 +618,13 @@ function componentRule(rule, context) {
617
618
}
618
619
619
620
if ( node . type === 'FunctionExpression' || node . type === 'ArrowFunctionExpression' ) {
621
+ const isMethod = parent . type === 'Property' && parent . method ;
622
+ const isPropertyAssignment = parent . type === 'AssignmentExpression'
623
+ && parent . left . type === 'MemberExpression' ;
624
+ const isModuleExportsAssignment = isPropertyAssignment
625
+ && parent . left . object . name === 'module'
626
+ && parent . left . property . name === 'exports' ;
627
+
620
628
if ( node . parent . type === 'ExportDefaultDeclaration' ) {
621
629
if ( utils . isReturningJSX ( node ) ) {
622
630
return node ;
@@ -630,31 +638,38 @@ function componentRule(rule, context) {
630
638
}
631
639
return undefined ;
632
640
}
633
- if ( utils . isInAllowedPositionForComponent ( node ) && utils . isReturningJSXOrNull ( node ) ) {
634
- if ( utils . isParentComponentNotStatelessComponent ( node ) ) return undefined ;
635
641
636
- const isMethod = node . parent . type === 'Property' && node . parent . method ;
642
+ // Case like `React.memo(() => <></>)` or `React.forwardRef(...)`
643
+ const pragmaComponentWrapper = utils . getPragmaComponentWrapper ( node ) ;
644
+ if ( pragmaComponentWrapper ) {
645
+ return pragmaComponentWrapper ;
646
+ }
637
647
638
- if ( isMethod && ! isFirstLetterCapitalized ( node . parent . key . name ) ) {
639
- return utils . isReturningJSX ( node ) ? node : undefined ;
640
- }
648
+ if ( ! ( utils . isInAllowedPositionForComponent ( node ) && utils . isReturningJSXOrNull ( node ) ) ) {
649
+ return undefined ;
650
+ }
641
651
642
- if ( node . id && isFirstLetterCapitalized ( node . id . name ) ) {
643
- return node ;
644
- }
652
+ if ( utils . isParentComponentNotStatelessComponent ( node ) ) {
653
+ return undefined ;
654
+ }
645
655
646
- if ( ! node . id ) {
647
- return node ;
648
- }
656
+ if ( isMethod && ! isFirstLetterCapitalized ( node . parent . key . name ) ) {
657
+ return utils . isReturningJSX ( node ) ? node : undefined ;
658
+ }
649
659
650
- return undefined ;
660
+ if ( node . id ) {
661
+ return isFirstLetterCapitalized ( node . id . name ) ? node : undefined ;
651
662
}
652
663
653
- // Case like `React.memo(() => <></>)` or `React.forwardRef(...)`
654
- const pragmaComponentWrapper = utils . getPragmaComponentWrapper ( node ) ;
655
- if ( pragmaComponentWrapper ) {
656
- return pragmaComponentWrapper ;
664
+ if (
665
+ isPropertyAssignment
666
+ && ! isModuleExportsAssignment
667
+ && ! isFirstLetterCapitalized ( parent . left . property . name )
668
+ ) {
669
+ return undefined ;
657
670
}
671
+
672
+ return node ;
658
673
}
659
674
660
675
return undefined ;
@@ -783,7 +798,7 @@ function componentRule(rule, context) {
783
798
} ,
784
799
785
800
isParentComponentNotStatelessComponent ( node ) {
786
- return (
801
+ return ! ! (
787
802
node . parent
788
803
&& node . parent . key
789
804
&& node . parent . key . type === 'Identifier'
0 commit comments