68 lines
2.2 KiB
TypeScript
68 lines
2.2 KiB
TypeScript
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;
|