@@ -10,6 +10,30 @@ const doctrine = require('doctrine');
1010const variableUtil = require ( './variable' ) ;
1111const pragmaUtil = require ( './pragma' ) ;
1212
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+
1337/**
1438 * Components
1539 * @class
@@ -70,7 +94,16 @@ Components.prototype.set = function(node, props) {
7094 return ;
7195 }
7296 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+ }
73103 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+ }
74107} ;
75108
76109/**
0 commit comments