react-elegant-ui
Version:
Elegant UI components, made by BEM best practices for react
73 lines (72 loc) • 3.1 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.composeU = composeU;
var _react = _interopRequireDefault(require("react"));
var _getDisplayName = require("../getDisplayName");
var _utils = require("./utils");
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
var __assign = void 0 && (void 0).__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);
};
function composeU() {
var wrappers = [];
for (var _i = 0; _i < arguments.length; _i++) {
wrappers[_i] = arguments[_i];
}
return function (Component) {
var componentName = (0, _getDisplayName.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 (!(0, _utils.isHOCObject)(wrapper)) {
return WrappedComponent;
}
// Add display name
var requirements = wrapper.__hocOptions.matchProps;
var requirementsHash = (0, _utils.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 = (0, _utils.getPrivatePropsFromComposeUnits)(wrappers);
var HOC = function (props) {
// Find first matched wrapper
var matchedIndex = wrappers.findIndex(function (wrapper) {
return !(0, _utils.isHOCObject)(wrapper) || (0, _utils.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 && (0, _utils.isHOCObject)(selectedWrapper)) {
var options_1 = selectedWrapper.__hocOptions;
(0, _utils.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.default.createElement(NewComponent, __assign({}, localProps));
};
HOC.displayName = "composeU(".concat(componentName, ")");
return HOC;
};
}