UNPKG

react-render-callback

Version:

render-prop helper to render anything (Functions, Components, Elements, ...)

83 lines (66 loc) 2.49 kB
import { createContext, forwardRef, isValidElement, createElement, cloneElement } from 'react'; import _extends from '@babel/runtime/helpers/esm/extends'; var constant = (function (value) { return function () { return value; }; }); var isIgnored = (function (value) { return value == null || value === false || value === true; }); var ignoredValuesToNull = (function (value) { return isIgnored(value) ? null : value; }); var context = /*#__PURE__*/ typeof createContext === 'function' && /*#__PURE__*/ createContext(); var REACT_PROVIDER_TYPE = context && context.Provider.$$typeof; var REACT_CONTEXT_TYPE = context && context.Consumer.$$typeof; // React.forwardRef is available since v16.3.0 var REACT_FORWARD_REF_TYPE = /*#__PURE__*/ typeof forwardRef === 'function' && /*#__PURE__*/ forwardRef( // need to access both params otherwise react warns // but as this is never used this is no-op /* istanbul ignore next line */ function (props, ref) { return { props: props, ref: ref }; }).$$typeof; var isReactComponent = (function (renderable) { if (renderable == null) return false; var type = typeof renderable; if (type === 'string') return false; if (type === 'function') { return !!(renderable.prototype && renderable.prototype.isReactComponent || // eslint-disable-next-line react/forbid-foreign-prop-types process.env.NODE_ENV !== 'production' && renderable.propTypes); } return type === 'object' && renderable.$$typeof && (renderable.$$typeof === REACT_PROVIDER_TYPE || renderable.$$typeof === REACT_CONTEXT_TYPE || renderable.$$typeof === REACT_FORWARD_REF_TYPE); }); var createRender = (function (renderable, options) { if (isReactComponent(renderable)) { return function (props) { return createElement(renderable, props); }; } if (typeof renderable === 'function') { return function () { return ignoredValuesToNull(renderable.defaultProps ? renderable(_extends({}, renderable.defaultProps, arguments.length <= 0 ? undefined : arguments[0])) : renderable.apply(void 0, arguments)); }; } if (options && options.cloneElement && isValidElement(renderable)) { return function (props) { return cloneElement(renderable, props); }; } // must be something else return constant(ignoredValuesToNull(renderable)); }); var render = (function (renderable, props, options) { return createRender(renderable, options)(props); }); export default render; export { createRender };