(element: ReactElement, styles: Object, configuration: Object)
| 23 | }; |
| 24 | |
| 25 | const linkElement = (element: ReactElement, styles: Object, configuration: Object): ReactElement => { |
| 26 | let appendClassName; |
| 27 | let elementShallowCopy; |
| 28 | |
| 29 | elementShallowCopy = element; |
| 30 | |
| 31 | if (Array.isArray(elementShallowCopy)) { |
| 32 | return elementShallowCopy.map((arrayElement) => { |
| 33 | return linkElement(arrayElement, styles, configuration); |
| 34 | }); |
| 35 | } |
| 36 | |
| 37 | const elementIsFrozen = Object.isFrozen && Object.isFrozen(elementShallowCopy); |
| 38 | const propsFrozen = Object.isFrozen && Object.isFrozen(elementShallowCopy.props); |
| 39 | const propsNotExtensible = Object.isExtensible && !Object.isExtensible(elementShallowCopy.props); |
| 40 | |
| 41 | if (elementIsFrozen) { |
| 42 | // https://github.com/facebook/react/blob/v0.13.3/src/classic/element/ReactElement.js#L131 |
| 43 | elementShallowCopy = objectUnfreeze(elementShallowCopy); |
| 44 | elementShallowCopy.props = objectUnfreeze(elementShallowCopy.props); |
| 45 | } else if (propsFrozen || propsNotExtensible) { |
| 46 | elementShallowCopy.props = objectUnfreeze(elementShallowCopy.props); |
| 47 | } |
| 48 | |
| 49 | const styleNames = parseStyleName(elementShallowCopy.props.styleName || '', configuration.allowMultiple); |
| 50 | const {children, ...restProps} = elementShallowCopy.props; |
| 51 | |
| 52 | if (React.isValidElement(children)) { |
| 53 | elementShallowCopy.props.children = linkElement(React.Children.only(children), styles, configuration); |
| 54 | } else if (_.isArray(children) || isIterable(children)) { |
| 55 | elementShallowCopy.props.children = linkArray(objectUnfreeze(children), styles, configuration); |
| 56 | } |
| 57 | |
| 58 | _.forEach(restProps, (propValue, propName) => { |
| 59 | if (React.isValidElement(propValue)) { |
| 60 | elementShallowCopy.props[propName] = linkElement(React.Children.only(propValue), styles, configuration); |
| 61 | } else if (_.isArray(propValue)) { |
| 62 | elementShallowCopy.props[propName] = linkArray(propValue, styles, configuration); |
| 63 | } |
| 64 | }); |
| 65 | |
| 66 | if (styleNames.length) { |
| 67 | appendClassName = generateAppendClassName(styles, styleNames, configuration.handleNotFoundStyleName); |
| 68 | |
| 69 | if (appendClassName) { |
| 70 | if (elementShallowCopy.props.className) { |
| 71 | appendClassName = elementShallowCopy.props.className + ' ' + appendClassName; |
| 72 | } |
| 73 | |
| 74 | elementShallowCopy.props.className = appendClassName; |
| 75 | } |
| 76 | } |
| 77 | |
| 78 | delete elementShallowCopy.props.styleName; |
| 79 | |
| 80 | if (elementIsFrozen) { |
| 81 | Object.freeze(elementShallowCopy.props); |
| 82 | Object.freeze(elementShallowCopy); |
no test coverage detected