react-with-hoc
Version:
Work with React and HOCs (Higher-Order Components)
88 lines • 11.3 kB
JavaScript
import React from "react";
import { newHoc } from "../utils/newHoc";
/**
* Wraps the component with the provided Component Wrapper
*
* @example
* const NewComponent = withWrapper(Wrapper)(Component)
* <NewComponent a="a" b="b" c="c" />
* // is equivalent to
* <Wrapper> // by default, it does not bring any prop
* <Component a="a" b="b" c="c" />
* </Wrapper>
*
* @example
* const NewComponent = withWrapper(Wrapper, { pickProps: ['a', 'b'] })(Component)
* <NewComponent a="a" b="b" c="c" />
* // is equivalent to
* <Wrapper a="a" b="b">
* <Component a="a" b="b" c="c" />
* </Wrapper>
*
* @example
* const NewComponent = withWrapper(Wrapper, { omitProps: ['a', 'b'] })(Component)
* <NewComponent a="a" b="b" c="c" />
* // is equivalent to
* <Wrapper c="c">
* <Component a="a" b="b" c="c" />
* </Wrapper>
*
* @example
* // to carry all props, use omitProps with empty array
* const NewComponent = withWrapper(Wrapper, { omitProps: [] })(Component)
* <NewComponent a="a" b="b" c="c" />
* // is equivalent to
* <Wrapper a="a" b="b" c="c">
* <Component a="a" b="b" c="c" />
* </Wrapper>
*/
export const withWrapper = newHoc(function withWrapper(Component, Wrapper, {
pickProps,
omitProps
} = {
pickProps: []
}) {
if (process.env.NODE_ENV !== "production") {
const bothAssigned = pickProps && omitProps;
const noneAssigned = !pickProps && !omitProps;
if (bothAssigned || noneAssigned) {
throw new Error("withWrapper should have either pickProps or omitProps assigned");
}
}
const set = new Set(pickProps || omitProps);
return function WithWrapper(props) {
if (set.size === 0 && pickProps) {
return /*#__PURE__*/React.createElement(Wrapper, null, /*#__PURE__*/React.createElement(Component, {
...props
}));
}
if (set.size === 0 && omitProps) {
return /*#__PURE__*/React.createElement(Wrapper, {
...props
}, /*#__PURE__*/React.createElement(Component, {
...props
}));
}
const parentProps = {};
if (pickProps) {
for (const prop in props) {
if (set.has(prop)) {
parentProps[prop] = props[prop];
}
}
} else if (omitProps) {
for (const prop in props) {
if (!set.has(prop)) {
parentProps[prop] = props[prop];
}
}
}
return /*#__PURE__*/React.createElement(Wrapper, {
...parentProps
}, /*#__PURE__*/React.createElement(Component, {
...props
}));
};
});
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJSZWFjdCIsIm5ld0hvYyIsIndpdGhXcmFwcGVyIiwiQ29tcG9uZW50IiwiV3JhcHBlciIsInBpY2tQcm9wcyIsIm9taXRQcm9wcyIsInByb2Nlc3MiLCJlbnYiLCJOT0RFX0VOViIsImJvdGhBc3NpZ25lZCIsIm5vbmVBc3NpZ25lZCIsIkVycm9yIiwic2V0IiwiU2V0IiwiV2l0aFdyYXBwZXIiLCJwcm9wcyIsInNpemUiLCJjcmVhdGVFbGVtZW50IiwicGFyZW50UHJvcHMiLCJwcm9wIiwiaGFzIl0sInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2hvY3Mvd2l0aFdyYXBwZXIudHN4Il0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBSZWFjdCwgeyBDb21wb25lbnRUeXBlLCBGdW5jdGlvbkNvbXBvbmVudCB9IGZyb20gXCJyZWFjdFwiO1xuaW1wb3J0IHsgSW50ZXJzZWN0aW9uRm4sIFRvU2NoZW1hIH0gZnJvbSBcIi4uL3R5cGVzL0ZuXCI7XG5pbXBvcnQgeyBIb2MgfSBmcm9tIFwiLi4vdHlwZXMvSG9jXCI7XG5pbXBvcnQgeyBuZXdIb2MgfSBmcm9tIFwiLi4vdXRpbHMvbmV3SG9jXCI7XG5cbmV4cG9ydCBpbnRlcmZhY2UgV2l0aFdyYXBwZXJIb2Mge1xuICA8XG4gICAgY29uc3QgV3JhcHBlclByb3BzLFxuICAgIGNvbnN0IFBpY2tPcHRpb25zIGV4dGVuZHMgc3RyaW5nW10gPSBbbmV2ZXJdLFxuICAgIGNvbnN0IE9taXRPcHRpb25zIGV4dGVuZHMgc3RyaW5nW10gPSBbbmV2ZXJdLFxuICA+KFxuICAgIFdyYXBwZXI6IENvbXBvbmVudFR5cGU8V3JhcHBlclByb3BzPixcbiAgICBvcHRpb25zPzpcbiAgICAgIHwge1xuICAgICAgICAgIC8qKlxuICAgICAgICAgICAqIEBleGFtcGxlXG4gICAgICAgICAgICogY29uc3QgTmV3Q29tcG9uZW50ID0gd2l0aFdyYXBwZXIoV3JhcHBlciwgeyBwaWNrUHJvcHM6IFsnYScsICdiJ10gfSkoQ29tcG9uZW50KVxuICAgICAgICAgICAqIDxOZXdDb21wb25lbnQgYT1cImFcIiBiPVwiYlwiIGM9XCJjXCIgLz5cbiAgICAgICAgICAgKiAvLyBpcyBlcXVpdmFsZW50IHRvXG4gICAgICAgICAgICogPFdyYXBwZXIgYT1cImFcIiBiPVwiYlwiPlxuICAgICAgICAgICAqICAgPENvbXBvbmVudCBhPVwiYVwiIGI9XCJiXCIgYz1cImNcIiAvPlxuICAgICAgICAgICAqIDwvV3JhcHBlcj5cbiAgICAgICAgICAgKi9cbiAgICAgICAgICBwaWNrUHJvcHM6IFBpY2tPcHRpb25zO1xuICAgICAgICAgIG9taXRQcm9wcz86IHVuZGVmaW5lZDtcbiAgICAgICAgfVxuICAgICAgfCB7XG4gICAgICAgICAgLyoqXG4gICAgICAgICAgICogQGV4YW1wbGVcbiAgICAgICAgICAgKiBjb25zdCBOZXdDb21wb25lbnQgPSB3aXRoV3JhcHBlcihXcmFwcGVyLCB7IG9taXRQcm9wczogWydhJywgJ2InXSB9KShDb21wb25lbnQpXG4gICAgICAgICAgICogPE5ld0NvbXBvbmVudCBhPVwiYVwiIGI9XCJiXCIgYz1cImNcIiAvPlxuICAgICAgICAgICAqIC8vIGlzIGVxdWl2YWxlbnQgdG9cbiAgICAgICAgICAgKiA8V3JhcHBlciBjPVwiY1wiPlxuICAgICAgICAgICAqICAgPENvbXBvbmVudCBhPVwiYVwiIGI9XCJiXCIgYz1cImNcIiAvPlxuICAgICAgICAgICAqIDwvV3JhcHBlcj5cbiAgICAgICAgICAgKi9cbiAgICAgICAgICBvbWl0UHJvcHM6IE9taXRPcHRpb25zO1xuICAgICAgICAgIHBpY2tQcm9wcz86IHVuZGVmaW5lZDtcbiAgICAgICAgfSxcbiAgKTogUGlja09wdGlvbnMgZXh0ZW5kcyBbbmV2ZXJdXG4gICAgPyBPbWl0T3B0aW9ucyBleHRlbmRzIFtuZXZlcl1cbiAgICAgID8gLy8gaGFzIG5vbmVcbiAgICAgICAgSG9jPFtdPlxuICAgICAgOiAvLyBoYXMgb21pdFxuICAgICAgICBIb2M8XG4gICAgICAgICAgW1xuICAgICAgICAgICAgSW50ZXJzZWN0aW9uRm48XG4gICAgICAgICAgICAgIEV4Y2x1ZGU8XG4gICAgICAgICAgICAgICAgVG9TY2hlbWE8V3JhcHBlclByb3BzPixcbiAgICAgICAgICAgICAgICBbT21pdE9wdGlvbnNbbnVtYmVyXSB8IFwiY2hpbGRyZW5cIiwgYW55XVxuICAgICAgICAgICAgICA+XG4gICAgICAgICAgICA+LFxuICAgICAgICAgIF1cbiAgICAgICAgPlxuICAgIDogLy8gaGFzIHBpY2tcbiAgICAgIEhvYzxcbiAgICAgICAgW1xuICAgICAgICAgIEludGVyc2VjdGlvbkZuPFxuICAgICAgICAgICAgRXh0cmFjdDxcbiAgICAgICAgICAgICAgRXhjbHVkZTxUb1NjaGVtYTxXcmFwcGVyUHJvcHM+LCBbXCJjaGlsZHJlblwiLCBhbnldPixcbiAgICAgICAgICAgICAgW1BpY2tPcHRpb25zW251bWJlcl0sIGFueV1cbiAgICAgICAgICAgID5cbiAgICAgICAgICA+LFxuICAgICAgICBdXG4gICAgICA+O1xufVxuXG4vKipcbiAqIFdyYXBzIHRoZSBjb21wb25lbnQgd2l0aCB0aGUgcHJvdmlkZWQgQ29tcG9uZW50IFdyYXBwZXJcbiAqXG4gKiBAZXhhbXBsZVxuICogY29uc3QgTmV3Q29tcG9uZW50ID0gd2l0aFdyYXBwZXIoV3JhcHBlcikoQ29tcG9uZW50KVxuICogPE5ld0NvbXBvbmVudCBhPVwiYVwiIGI9XCJiXCIgYz1cImNcIiAvPlxuICogLy8gaXMgZXF1aXZhbGVudCB0b1xuICogPFdyYXBwZXI+IC8vIGJ5IGRlZmF1bHQsIGl0IGRvZXMgbm90IGJyaW5nIGFueSBwcm9wXG4gKiAgIDxDb21wb25lbnQgYT1cImFcIiBiPVwiYlwiIGM9XCJjXCIgLz5cbiAqIDwvV3JhcHBlcj5cbiAqXG4gKiBAZXhhbXBsZVxuICogY29uc3QgTmV3Q29tcG9uZW50ID0gd2l0aFdyYXBwZXIoV3JhcHBlciwgeyBwaWNrUHJvcHM6IFsnYScsICdiJ10gfSkoQ29tcG9uZW50KVxuICogPE5ld0NvbXBvbmVudCBhPVwiYVwiIGI9XCJiXCIgYz1cImNcIiAvPlxuICogLy8gaXMgZXF1aXZhbGVudCB0b1xuICogPFdyYXBwZXIgYT1cImFcIiBiPVwiYlwiPlxuICogICA8Q29tcG9uZW50IGE9XCJhXCIgYj1cImJcIiBjPVwiY1wiIC8+XG4gKiA8L1dyYXBwZXI+XG4gKlxuICogQGV4YW1wbGVcbiAqIGNvbnN0IE5ld0NvbXBvbmVudCA9IHdpdGhXcmFwcGVyKFdyYXBwZXIsIHsgb21pdFByb3BzOiBbJ2EnLCAnYiddIH0pKENvbXBvbmVudClcbiAqIDxOZXdDb21wb25lbnQgYT1cImFcIiBiPVwiYlwiIGM9XCJjXCIgLz5cbiAqIC8vIGlzIGVxdWl2YWxlbnQgdG9cbiAqIDxXcmFwcGVyIGM9XCJjXCI+XG4gKiAgIDxDb21wb25lbnQgYT1cImFcIiBiPVwiYlwiIGM9XCJjXCIgLz5cbiAqIDwvV3JhcHBlcj5cbiAqXG4gKiBAZXhhbXBsZVxuICogLy8gdG8gY2FycnkgYWxsIHByb3BzLCB1c2Ugb21pdFByb3BzIHdpdGggZW1wdHkgYXJyYXlcbiAqIGNvbnN0IE5ld0NvbXBvbmVudCA9IHdpdGhXcmFwcGVyKFdyYXBwZXIsIHsgb21pdFByb3BzOiBbXSB9KShDb21wb25lbnQpXG4gKiA8TmV3Q29tcG9uZW50IGE9XCJhXCIgYj1cImJcIiBjPVwiY1wiIC8+XG4gKiAvLyBpcyBlcXVpdmFsZW50IHRvXG4gKiA8V3JhcHBlciBhPVwiYVwiIGI9XCJiXCIgYz1cImNcIj5cbiAqICAgPENvbXBvbmVudCBhPVwiYVwiIGI9XCJiXCIgYz1cImNcIiAvPlxuICogPC9XcmFwcGVyPlxuICovXG5leHBvcnQgY29uc3Qgd2l0aFdyYXBwZXIgPSBuZXdIb2M8V2l0aFdyYXBwZXJIb2M+KGZ1bmN0aW9uIHdpdGhXcmFwcGVyKFxuICBDb21wb25lbnQ6IENvbXBvbmVudFR5cGU8YW55PixcbiAgV3JhcHBlcjogQ29tcG9uZW50VHlwZTxhbnk+LFxuICB7XG4gICAgcGlja1Byb3BzLFxuICAgIG9taXRQcm9wcyxcbiAgfToge1xuICAgIHBpY2tQcm9wcz86IHN0cmluZ1tdO1xuICAgIG9taXRQcm9wcz86IHN0cmluZ1tdO1xuICB9ID0geyBwaWNrUHJvcHM6IFtdIH0sXG4pOiBGdW5jdGlvbkNvbXBvbmVudCB7XG4gIGlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpIHtcbiAgICBjb25zdCBib3RoQXNzaWduZWQgPSBwaWNrUHJvcHMgJiYgb21pdFByb3BzO1xuICAgIGNvbnN0IG5vbmVBc3NpZ25lZCA9ICFwaWNrUHJvcHMgJiYgIW9taXRQcm9wcztcbiAgICBpZiAoYm90aEFzc2lnbmVkIHx8IG5vbmVBc3NpZ25lZCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICBcIndpdGhXcmFwcGVyIHNob3VsZCBoYXZlIGVpdGhlciBwaWNrUHJvcHMgb3Igb21pdFByb3BzIGFzc2lnbmVkXCIsXG4gICAgICApO1xuICAgIH1cbiAgfVxuXG4gIGNvbnN0IHNldCA9IG5ldyBTZXQocGlja1Byb3BzIHx8IG9taXRQcm9wcyk7XG5cbiAgcmV0dXJuIGZ1bmN0aW9uIFdpdGhXcmFwcGVyKHByb3BzOiBhbnkpOiBKU1guRWxlbWVudCB7XG4gICAgaWYgKHNldC5zaXplID09PSAwICYmIHBpY2tQcm9wcykge1xuICAgICAgcmV0dXJuIChcbiAgICAgICAgPFdyYXBwZXI+XG4gICAgICAgICAgPENvbXBvbmVudCB7Li4ucHJvcHN9IC8+XG4gICAgICAgIDwvV3JhcHBlcj5cbiAgICAgICk7XG4gICAgfVxuXG4gICAgaWYgKHNldC5zaXplID09PSAwICYmIG9taXRQcm9wcykge1xuICAgICAgcmV0dXJuIChcbiAgICAgICAgPFdyYXBwZXIgey4uLnByb3BzfT5cbiAgICAgICAgICA8Q29tcG9uZW50IHsuLi5wcm9wc30gLz5cbiAgICAgICAgPC9XcmFwcGVyPlxuICAgICAgKTtcbiAgICB9XG5cbiAgICBjb25zdCBwYXJlbnRQcm9wcyA9IHt9IGFzIGFueTtcbiAgICBpZiAocGlja1Byb3BzKSB7XG4gICAgICBmb3IgKGNvbnN0IHByb3AgaW4gcHJvcHMpIHtcbiAgICAgICAgaWYgKHNldC5oYXMocHJvcCkpIHtcbiAgICAgICAgICBwYXJlbnRQcm9wc1twcm9wXSA9IHByb3BzW3Byb3BdO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSBlbHNlIGlmIChvbWl0UHJvcHMpIHtcbiAgICAgIGZvciAoY29uc3QgcHJvcCBpbiBwcm9wcykge1xuICAgICAgICBpZiAoIXNldC5oYXMocHJvcCkpIHtcbiAgICAgICAgICBwYXJlbnRQcm9wc1twcm9wXSA9IHByb3BzW3Byb3BdO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIChcbiAgICAgIDxXcmFwcGVyIHsuLi5wYXJlbnRQcm9wc30+XG4gICAgICAgIDxDb21wb25lbnQgey4uLnByb3BzfSAvPlxuICAgICAgPC9XcmFwcGVyPlxuICAgICk7XG4gIH07XG59KTtcbiJdLCJtYXBwaW5ncyI6IkFBQUEsT0FBT0EsS0FBSyxNQUE0QyxPQUFPO0FBRy9ELFNBQVNDLE1BQU0sUUFBUSxpQkFBaUI7QUFnRXhDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU8sTUFBTUMsV0FBVyxHQUFHRCxNQUFNLENBQWlCLFNBQVNDLFdBQVdBLENBQ3BFQyxTQUE2QixFQUM3QkMsT0FBMkIsRUFDM0I7RUFDRUMsU0FBUztFQUNUQztBQUlGLENBQUMsR0FBRztFQUFFRCxTQUFTLEVBQUU7QUFBRyxDQUFDLEVBQ0Y7RUFDbkIsSUFBSUUsT0FBTyxDQUFDQyxHQUFHLENBQUNDLFFBQVEsS0FBSyxZQUFZLEVBQUU7SUFDekMsTUFBTUMsWUFBWSxHQUFHTCxTQUFTLElBQUlDLFNBQVM7SUFDM0MsTUFBTUssWUFBWSxHQUFHLENBQUNOLFNBQVMsSUFBSSxDQUFDQyxTQUFTO0lBQzdDLElBQUlJLFlBQVksSUFBSUMsWUFBWSxFQUFFO01BQ2hDLE1BQU0sSUFBSUMsS0FBSyxDQUNiLGdFQUNGLENBQUM7SUFDSDtFQUNGO0VBRUEsTUFBTUMsR0FBRyxHQUFHLElBQUlDLEdBQUcsQ0FBQ1QsU0FBUyxJQUFJQyxTQUFTLENBQUM7RUFFM0MsT0FBTyxTQUFTUyxXQUFXQSxDQUFDQyxLQUFVLEVBQWU7SUFDbkQsSUFBSUgsR0FBRyxDQUFDSSxJQUFJLEtBQUssQ0FBQyxJQUFJWixTQUFTLEVBQUU7TUFDL0Isb0JBQ0VMLEtBQUEsQ0FBQWtCLGFBQUEsQ0FBQ2QsT0FBTyxxQkFDTkosS0FBQSxDQUFBa0IsYUFBQSxDQUFDZixTQUFTO1FBQUEsR0FBS2E7TUFBSyxDQUFHLENBQ2hCLENBQUM7SUFFZDtJQUVBLElBQUlILEdBQUcsQ0FBQ0ksSUFBSSxLQUFLLENBQUMsSUFBSVgsU0FBUyxFQUFFO01BQy9CLG9CQUNFTixLQUFBLENBQUFrQixhQUFBLENBQUNkLE9BQU87UUFBQSxHQUFLWTtNQUFLLGdCQUNoQmhCLEtBQUEsQ0FBQWtCLGFBQUEsQ0FBQ2YsU0FBUztRQUFBLEdBQUthO01BQUssQ0FBRyxDQUNoQixDQUFDO0lBRWQ7SUFFQSxNQUFNRyxXQUFXLEdBQUcsQ0FBQyxDQUFRO0lBQzdCLElBQUlkLFNBQVMsRUFBRTtNQUNiLEtBQUssTUFBTWUsSUFBSSxJQUFJSixLQUFLLEVBQUU7UUFDeEIsSUFBSUgsR0FBRyxDQUFDUSxHQUFHLENBQUNELElBQUksQ0FBQyxFQUFFO1VBQ2pCRCxXQUFXLENBQUNDLElBQUksQ0FBQyxHQUFHSixLQUFLLENBQUNJLElBQUksQ0FBQztRQUNqQztNQUNGO0lBQ0YsQ0FBQyxNQUFNLElBQUlkLFNBQVMsRUFBRTtNQUNwQixLQUFLLE1BQU1jLElBQUksSUFBSUosS0FBSyxFQUFFO1FBQ3hCLElBQUksQ0FBQ0gsR0FBRyxDQUFDUSxHQUFHLENBQUNELElBQUksQ0FBQyxFQUFFO1VBQ2xCRCxXQUFXLENBQUNDLElBQUksQ0FBQyxHQUFHSixLQUFLLENBQUNJLElBQUksQ0FBQztRQUNqQztNQUNGO0lBQ0Y7SUFFQSxvQkFDRXBCLEtBQUEsQ0FBQWtCLGFBQUEsQ0FBQ2QsT0FBTztNQUFBLEdBQUtlO0lBQVcsZ0JBQ3RCbkIsS0FBQSxDQUFBa0IsYUFBQSxDQUFDZixTQUFTO01BQUEsR0FBS2E7SUFBSyxDQUFHLENBQ2hCLENBQUM7RUFFZCxDQUFDO0FBQ0gsQ0FBQyxDQUFDIn0=
//# sourceMappingURL=withWrapper.js.map