@@ -36,8 +36,8 @@ module.exports = {
36
36
} ,
37
37
38
38
create : Components . detect ( ( context , components , utils ) => {
39
- let propTypesPackageName ;
40
- let reactPackageName ;
39
+ let propTypesPackageName = null ;
40
+ let reactPackageName = null ;
41
41
42
42
function checkValidPropTypeQualfier ( node ) {
43
43
if ( node . name !== 'isRequired' ) {
@@ -57,43 +57,53 @@ module.exports = {
57
57
}
58
58
}
59
59
60
+ function isPropTypesPackage ( node ) {
61
+ return (
62
+ node . type === 'Identifier' &&
63
+ node . name == propTypesPackageName
64
+ ) || (
65
+ node . type === 'MemberExpression' &&
66
+ node . property . name === 'PropTypes' &&
67
+ node . object . name == reactPackageName
68
+ ) ;
69
+ }
70
+
71
+ function checkValidCallExpression ( node ) {
72
+ const callee = node . callee ;
73
+ if ( callee . type === 'MemberExpression' && callee . property . name === 'shape' ) {
74
+ checkValidPropObject ( node . arguments [ 0 ] ) ;
75
+ } else if ( callee . type === 'MemberExpression' && callee . property . name === 'oneOfType' ) {
76
+ const args = node . arguments [ 0 ] ;
77
+ if ( args && args . type === 'ArrayExpression' ) {
78
+ args . elements . forEach ( el => checkValidProp ( el ) ) ;
79
+ }
80
+ }
81
+ }
82
+
60
83
/* eslint-disable no-use-before-define */
61
84
function checkValidProp ( node ) {
62
85
if ( ( ! propTypesPackageName && ! reactPackageName ) || ! node ) {
63
86
return ;
64
87
}
65
88
66
- if (
67
- node . type === 'MemberExpression' &&
68
- node . object . type === 'MemberExpression' &&
69
- node . object . object . name === propTypesPackageName
70
- ) { // PropTypes.myProp.isRequired
71
- checkValidPropType ( node . object . property ) ;
72
- checkValidPropTypeQualfier ( node . property ) ;
73
- } else if (
74
- node . type === 'MemberExpression' &&
75
- node . object . type === 'Identifier' &&
76
- node . object . name === propTypesPackageName &&
77
- node . property . name !== 'isRequired'
78
- ) { // PropTypes.myProp
79
- checkValidPropType ( node . property ) ;
80
- } else if (
81
- ( node . type === 'MemberExpression' && node . object . type === 'CallExpression' ) ||
82
- node . type === 'CallExpression'
83
- ) { // Shapes
84
- if ( node . type === 'MemberExpression' ) {
89
+ if ( node . type === 'MemberExpression' ) {
90
+ if (
91
+ node . object . type === 'MemberExpression' &&
92
+ isPropTypesPackage ( node . object . object )
93
+ ) { // PropTypes.myProp.isRequired
94
+ checkValidPropType ( node . object . property ) ;
85
95
checkValidPropTypeQualfier ( node . property ) ;
86
- node = node . object ;
87
- }
88
- const callee = node . callee ;
89
- if ( callee . type === 'MemberExpression' && callee . property . name === 'shape' ) {
90
- checkValidPropObject ( node . arguments [ 0 ] ) ;
91
- } else if ( callee . type === 'MemberExpression' && callee . property . name === 'oneOfType' ) {
92
- const args = node . arguments [ 0 ] ;
93
- if ( args && args . type === 'ArrayExpression' ) {
94
- args . elements . forEach ( el => checkValidProp ( el ) ) ;
95
- }
96
+ } else if (
97
+ isPropTypesPackage ( node . object ) &&
98
+ node . property . name !== 'isRequired'
99
+ ) { // PropTypes.myProp
100
+ checkValidPropType ( node . property ) ;
101
+ } else if ( node . object . type === 'CallExpression' ) {
102
+ checkValidPropTypeQualfier ( node . property ) ;
103
+ checkValidCallExpression ( node . object ) ;
96
104
}
105
+ } else if ( node . type === 'CallExpression' ) {
106
+ checkValidCallExpression ( node ) ;
97
107
}
98
108
}
99
109
@@ -136,11 +146,11 @@ module.exports = {
136
146
} else if ( node . source && node . source . value === 'react' ) { // import { PropTypes } from "react"
137
147
reactPackageName = node . specifiers [ 0 ] . local . name ;
138
148
139
- propTypesPackageName = node . specifiers . length > 1 && (
149
+ propTypesPackageName = node . specifiers . length >= 1 ? (
140
150
node . specifiers
141
151
. filter ( specifier => specifier . imported && specifier . imported . name === 'PropTypes' )
142
152
. map ( specifier => specifier . local . name )
143
- ) ;
153
+ ) : null ;
144
154
}
145
155
} ,
146
156
0 commit comments