UNPKG

react-elegant-ui

Version:

Elegant UI components, made by BEM best practices for react

66 lines 2.85 kB
var __assign = this && this.__assign || function () { __assign = Object.assign || function (t) { for (var s, i = 1, n = arguments.length; i < n; i++) { s = arguments[i]; for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p)) t[p] = s[p]; } return t; }; return __assign.apply(this, arguments); }; import React from 'react'; import { getDisplayName } from '../getDisplayName'; import { getPrivatePropsFromComposeUnits, isMatchHOCProps, isHOCObject, getObjectHash, getPropsFromHOCOptions } from './utils'; export function composeU() { var wrappers = []; for (var _i = 0; _i < arguments.length; _i++) { wrappers[_i] = arguments[_i]; } return function (Component) { var componentName = getDisplayName(Component); // Make cache where each wrapper apply to base component once var wrappedComponents = wrappers.map(function (wrapper) { var WrappedComponent = wrapper(Component); // Just wrap if it simple HOC if (!isHOCObject(wrapper)) { return WrappedComponent; } // Add display name var requirements = wrapper.__hocOptions.matchProps; var requirementsHash = getObjectHash(requirements); WrappedComponent.displayName = "composeU(".concat(componentName, ")[").concat(requirementsHash, "]"); return WrappedComponent; }); // List a private props of HOCs. All private props of not match HOCs will removed // Use object instead arr for performance var privatePropsDict = getPrivatePropsFromComposeUnits(wrappers); var HOC = function (props) { // Find first matched wrapper var matchedIndex = wrappers.findIndex(function (wrapper) { return !isHOCObject(wrapper) || isMatchHOCProps(props, wrapper.__hocOptions.matchProps); }); var selectedWrapper = wrappers[matchedIndex]; var ignoredProps = __assign({}, privatePropsDict); // Remove from ignore list a props of matched HOC if (selectedWrapper !== undefined && isHOCObject(selectedWrapper)) { var options_1 = selectedWrapper.__hocOptions; getPropsFromHOCOptions(options_1).forEach(function (name) { // Leave as private a props defined as match-only if (options_1.matchOnlyProps !== undefined && options_1.matchOnlyProps.indexOf(name) > -1) { return; } delete ignoredProps[name]; }); } var localProps = __assign({}, props); // Remove a private props of not matched HOCs Object.keys(ignoredProps).forEach(function (name) { delete localProps[name]; }); var NewComponent = wrappedComponents[matchedIndex] || Component; return /*#__PURE__*/React.createElement(NewComponent, __assign({}, localProps)); }; HOC.displayName = "composeU(".concat(componentName, ")"); return HOC; }; }