react-render-callback
Version:
render-prop helper to render anything (Functions, Components, Elements, ...)
88 lines (68 loc) • 2.63 kB
JavaScript
function _interopDefault (ex) { return (ex && (typeof ex === 'object') && 'default' in ex) ? ex['default'] : ex; }
var react = require('react');
var _extends = _interopDefault(require('@babel/runtime/helpers/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 react.createContext === 'function' &&
/*#__PURE__*/
react.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 react.forwardRef === 'function' &&
/*#__PURE__*/
react.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 react.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 && react.isValidElement(renderable)) {
return function (props) {
return react.cloneElement(renderable, props);
};
} // must be something else
return constant(ignoredValuesToNull(renderable));
});
var render = (function (renderable, props, options) {
return createRender(renderable, options)(props);
});
render.createRender = createRender;
module.exports = render;
;