import { createElement as h , cloneElement , version } from 'react' ; const isReact16Plus = parseInt ( version . substr ( 0 , version . indexOf ( '.' ) ) ) > 15 ; const isFn = fn => typeof fn === 'function' ; const render = ( props , data , ... more ) => { if ( process . env . NODE_ENV !== 'production' ) { if ( typeof props !== 'object' ) { throw new TypeError ( 'renderChildren(props, data) first argument must be a props object.' ) ; } const { children , render } = props ; if ( isFn ( children ) && isFn ( render ) ) { console . warn ( 'Both "render" and "children" are specified for in a universal interface component. ' + 'Children will be used.' ) ; console . trace ( ) ; } if ( typeof data !== 'object' ) { console . warn ( 'Universal component interface normally expects data to be an object, ' + `"${ typeof data }" received.` ) ; console . trace ( ) ; } } const { render , children = render , component , comp = component } = props ; if ( isFn ( children ) ) return children ( data , ... more ) ; if ( comp ) { return h ( comp , data ) ; } if ( children instanceof Array ) return isReact16Plus ? children : h ( 'div' , null , ... children ) ; if ( children && ( children instanceof Object ) ) { if ( process . env . NODE_ENV !== 'production' ) { if ( ! children . type || ( ( typeof children . type !== 'string' ) && ( typeof children . type !== 'function' ) && ( typeof children . type !== 'symbol' ) ) ) { console . warn ( 'Universal component interface received object as children, ' + 'expected React element, but received unexpected React "type".' ) ; console . trace ( ) ; } if ( typeof children . type === 'string' ) return children ; return cloneElement ( children , Object . assign ( { } , children . props , data ) ) ; } else { if ( typeof children . type === 'string' ) return children ; return cloneElement ( children , Object . assign ( { } , children . props , data ) ) ; } } return children || null ; } ; export default render ;