@@ -4,66 +4,57 @@ import makeConfiguration from './makeConfiguration';
4
4
import isIterable from './isIterable' ;
5
5
import parseStyleName from './parseStyleName' ;
6
6
import generateAppendClassName from './generateAppendClassName' ;
7
+ import objectUnfreeze from 'object-unfreeze' ;
7
8
8
9
let linkElement ;
9
10
10
11
linkElement = ( element , styles , configuration ) => {
11
12
let appendClassName ,
12
- children ,
13
+ elementIsFrozen ,
13
14
clonedElement ,
14
15
newChildren ,
15
16
newProps ,
16
17
styleNames ;
17
18
18
- styleNames = parseStyleName ( element . props . styleName || '' , configuration . allowMultiple ) ;
19
+ if ( Object . isFrozen && Object . isFrozen ( element ) ) {
20
+ elementIsFrozen = true ;
19
21
20
- if ( styleNames . length ) {
21
- appendClassName = generateAppendClassName ( styles , styleNames , configuration . errorWhenNotFound ) ;
22
+ // https://github.com/facebook/react/blob/v0.13.3/src/classic/element/ReactElement.js#L131
23
+ element = objectUnfreeze ( element ) ;
24
+ element . props = objectUnfreeze ( element . props ) ;
22
25
}
23
26
24
- // element.props.children can be one of the following:
25
- // 'text'
26
- // ['text']
27
- // [ReactElement, 'text']
28
- // ReactElement
29
-
30
- children = element . props . children ;
27
+ styleNames = parseStyleName ( element . props . styleName || '' , configuration . allowMultiple ) ;
31
28
32
- if ( React . isValidElement ( children ) ) {
33
- newChildren = linkElement ( React . Children . only ( children ) , styles , configuration ) ;
34
- } else if ( _ . isArray ( children ) || isIterable ( children ) ) {
35
- newChildren = React . Children . map ( children , ( node ) => {
29
+ if ( React . isValidElement ( element . props . children ) ) {
30
+ element . props . children = linkElement ( React . Children . only ( element . props . children ) , styles , configuration ) ;
31
+ } else if ( _ . isArray ( element . props . children ) || isIterable ( element . props . children ) ) {
32
+ element . props . children = React . Children . map ( element . props . children , ( node ) => {
36
33
if ( React . isValidElement ( node ) ) {
37
34
return linkElement ( node , styles , configuration ) ;
38
35
} else {
39
36
return node ;
40
37
}
41
38
} ) ;
42
-
43
- // https://github.com/facebook/react/issues/4723#issuecomment-135555277
44
- // Forcing children into an array produces the following error:
45
- // Warning: A ReactFragment is an opaque type. Accessing any of its properties is deprecated. Pass it to one of the React.Children helpers.
46
- // newChildren = _.values(newChildren);
47
39
}
48
40
49
- if ( appendClassName ) {
41
+ if ( styleNames . length ) {
42
+ appendClassName = generateAppendClassName ( styles , styleNames , configuration . errorWhenNotFound ) ;
43
+
50
44
if ( element . props . className ) {
51
45
appendClassName = element . props . className + ' ' + appendClassName ;
52
46
}
53
47
54
- newProps = {
55
- className : appendClassName ,
56
- styleName : null
57
- } ;
48
+ element . props . className = appendClassName ;
49
+ element . props . styleName = null ;
58
50
}
59
51
60
- if ( newChildren ) {
61
- clonedElement = React . cloneElement ( element , newProps , newChildren ) ;
62
- } else {
63
- clonedElement = React . cloneElement ( element , newProps ) ;
52
+ if ( elementIsFrozen ) {
53
+ Object . freeze ( element ) ;
54
+ Object . freeze ( element . props ) ;
64
55
}
65
56
66
- return clonedElement ;
57
+ return element ;
67
58
} ;
68
59
69
60
/**
0 commit comments