@@ -10,6 +10,30 @@ const doctrine = require('doctrine');
10
10
const variableUtil = require ( './variable' ) ;
11
11
const pragmaUtil = require ( './pragma' ) ;
12
12
13
+ const usedPropTypesAreEquivalent = ( propA , propB ) => {
14
+ if ( propA . name === propB . name ) {
15
+ if ( ! propA . allNames && ! propB . allNames ) {
16
+ return true ;
17
+ } else if ( Array . isArray ( propA . allNames ) && Array . isArray ( propB . allNames ) && propA . allNames . join ( '' ) === propB . allNames . join ( '' ) ) {
18
+ return true ;
19
+ }
20
+ return false ;
21
+ }
22
+ return false ;
23
+ } ;
24
+
25
+ const mergeUsedPropTypes = ( propsList , newPropsList ) => {
26
+ const propsToAdd = [ ] ;
27
+ newPropsList . forEach ( newProp => {
28
+ const newPropisAlreadyInTheList = propsList . some ( prop => usedPropTypesAreEquivalent ( prop , newProp ) ) ;
29
+ if ( ! newPropisAlreadyInTheList ) {
30
+ propsToAdd . push ( newProp ) ;
31
+ }
32
+ } ) ;
33
+ return propsList . concat ( propsToAdd ) ;
34
+ } ;
35
+
36
+
13
37
/**
14
38
* Components
15
39
* @class
@@ -70,7 +94,16 @@ Components.prototype.set = function(node, props) {
70
94
return ;
71
95
}
72
96
const id = this . _getId ( node ) ;
97
+ let copyUsedPropTypes ;
98
+ if ( this . _list [ id ] ) {
99
+ // usedPropTypes is an array. _extend replaces existing array with a new one which caused issue #1309.
100
+ // preserving original array so it can be merged later on.
101
+ copyUsedPropTypes = this . _list [ id ] . usedPropTypes && this . _list [ id ] . usedPropTypes . slice ( ) ;
102
+ }
73
103
this . _list [ id ] = util . _extend ( this . _list [ id ] , props ) ;
104
+ if ( this . _list [ id ] && props . usedPropTypes ) {
105
+ this . _list [ id ] . usedPropTypes = mergeUsedPropTypes ( copyUsedPropTypes || [ ] , props . usedPropTypes ) ;
106
+ }
74
107
} ;
75
108
76
109
/**
0 commit comments