UNPKG

4.83 kBJavaScriptView Raw
1"use strict";
2
3var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
4Object.defineProperty(exports, "__esModule", {
5 value: true
6});
7exports.copyStaticProperties = copyStaticProperties;
8exports.inject = inject;
9var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));
10var _react = _interopRequireDefault(require("react"));
11var _mobxReact = require("mobx-react");
12function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); enumerableOnly && (symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; })), keys.push.apply(keys, symbols); } return keys; }
13function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = null != arguments[i] ? arguments[i] : {}; i % 2 ? ownKeys(Object(source), !0).forEach(function (key) { (0, _defineProperty2["default"])(target, key, source[key]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)) : ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } return target; }
14var isDebug = false;
15
16// based on https://github.com/mridgway/hoist-non-react-statics/blob/master/src/index.js
17var hoistBlackList = {
18 $$typeof: 1,
19 render: 1,
20 compare: 1,
21 type: 1,
22 childContextTypes: 1,
23 contextType: 1,
24 contextTypes: 1,
25 defaultProps: 1,
26 getDefaultProps: 1,
27 getDerivedStateFromError: 1,
28 getDerivedStateFromProps: 1,
29 mixins: 1,
30 propTypes: 1
31};
32function copyStaticProperties(base, target) {
33 var protoProps = Object.getOwnPropertyNames(Object.getPrototypeOf(base));
34 Object.getOwnPropertyNames(base).forEach(function (key) {
35 if (!hoistBlackList[key] && protoProps.indexOf(key) === -1) {
36 Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(base, key));
37 }
38 });
39}
40
41/**
42 * Store Injection
43 */
44function createStoreInjector(grabStoresFn, component, injectNames, makeReactive) {
45 // Support forward refs
46 var Injector = /*#__PURE__*/_react["default"].forwardRef(function (props, ref) {
47 var newProps = _objectSpread({}, props);
48 var context = _react["default"].useContext(_mobxReact.MobXProviderContext);
49 // @ts-ignore
50 Object.assign(newProps, grabStoresFn(context || {}, newProps) || {});
51 if (ref) {
52 newProps.ref = ref;
53 }
54 return /*#__PURE__*/_react["default"].createElement(component, newProps);
55 });
56 if (makeReactive) Injector = (0, _mobxReact.observer)(Injector);
57 Injector["isMobxInjector"] = true; // assigned late to suppress observer warning
58
59 // Static fields from component should be visible on the generated Injector
60 copyStaticProperties(component, Injector);
61 Injector["wrappedComponent"] = component;
62 Injector.displayName = getInjectName(component, injectNames);
63 return Injector;
64}
65function getInjectName(component, injectNames) {
66 var displayName;
67 var componentName = component.displayName || component.name || component.constructor && component.constructor.name || "Component";
68 if (injectNames) displayName = "inject-with-" + injectNames + "(" + componentName + ")";else displayName = "inject(" + componentName + ")";
69 return displayName;
70}
71function grabStoresByName(storeNames) {
72 return function (baseStores, nextProps) {
73 storeNames.forEach(function (storeName) {
74 if (storeName in nextProps // prefer props over stores
75 ) return;
76 if (!(storeName in baseStores)) {
77 var err = new Error("MobX injector: Store '" + storeName + "' is not available! Make sure it is provided by some Provider");
78 if (isDebug) console.error('Mobx @inject', err);
79 nextProps[storeName] = null;
80 return;
81 }
82 nextProps[storeName] = baseStores[storeName];
83 });
84 return nextProps;
85 };
86}
87/**
88 * higher order component that injects stores to a child.
89 * takes either a varargs list of strings, which are stores read from the context,
90 * or a function that manually maps the available stores from the context to props:
91 * storesToProps(mobxStores, props, context) => newProps
92 */
93function inject() {
94 for (var _len = arguments.length, storeNames = new Array(_len), _key = 0; _key < _len; _key++) {
95 storeNames[_key] = arguments[_key];
96 }
97 if (typeof arguments[0] === "function") {
98 var grabStoresFn = arguments[0];
99 return function (componentClass) {
100 return createStoreInjector(grabStoresFn, componentClass, grabStoresFn.name, true);
101 };
102 } else {
103 return function (componentClass) {
104 return createStoreInjector(grabStoresByName(storeNames), componentClass, storeNames.join("-"), false);
105 };
106 }
107}
108//# sourceMappingURL=inject.js.map
\No newline at end of file