@@ -608,6 +608,7 @@ function componentRule(rule, context) {
608608 * @returns {ASTNode | undefined }
609609 */
610610 getStatelessComponent ( node ) {
611+ const parent = node . parent ;
611612 if (
612613 node . type === 'FunctionDeclaration'
613614 && ( ! node . id || isFirstLetterCapitalized ( node . id . name ) )
@@ -617,6 +618,13 @@ function componentRule(rule, context) {
617618 }
618619
619620 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+
620628 if ( node . parent . type === 'ExportDefaultDeclaration' ) {
621629 if ( utils . isReturningJSX ( node ) ) {
622630 return node ;
@@ -630,31 +638,38 @@ function componentRule(rule, context) {
630638 }
631639 return undefined ;
632640 }
633- if ( utils . isInAllowedPositionForComponent ( node ) && utils . isReturningJSXOrNull ( node ) ) {
634- if ( utils . isParentComponentNotStatelessComponent ( node ) ) return undefined ;
635641
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+ }
637647
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+ }
641651
642- if ( node . id && isFirstLetterCapitalized ( node . id . name ) ) {
643- return node ;
644- }
652+ if ( utils . isParentComponentNotStatelessComponent ( node ) ) {
653+ return undefined ;
654+ }
645655
646- if ( ! node . id ) {
647- return node ;
648- }
656+ if ( isMethod && ! isFirstLetterCapitalized ( node . parent . key . name ) ) {
657+ return utils . isReturningJSX ( node ) ? node : undefined ;
658+ }
649659
650- return undefined ;
660+ if ( node . id ) {
661+ return isFirstLetterCapitalized ( node . id . name ) ? node : undefined ;
651662 }
652663
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 ;
657670 }
671+
672+ return node ;
658673 }
659674
660675 return undefined ;
@@ -783,7 +798,7 @@ function componentRule(rule, context) {
783798 } ,
784799
785800 isParentComponentNotStatelessComponent ( node ) {
786- return (
801+ return ! ! (
787802 node . parent
788803 && node . parent . key
789804 && node . parent . key . type === 'Identifier'
0 commit comments