@lskjs/uapp
Version:
LSK universal react app wrapper
112 lines (108 loc) • 5.07 kB
JavaScript
;
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.copyStaticProperties = copyStaticProperties;
exports.inject = inject;
var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));
var _react = _interopRequireDefault(require("react"));
var _mobxReact = require("mobx-react");
function 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; }
function _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; } /* eslint-disable */ // @ts-ignore
// @ts-ignore
// import { observer } from "mobx-react/dist/observer"
// import { copyStaticProperties } from "mobx-react/dist/utils/utils"
// import { MobXProviderContext } from "mobx-react/dist/Provider"
var isDebug = false;
// based on https://github.com/mridgway/hoist-non-react-statics/blob/master/src/index.js
var hoistBlackList = {
$$typeof: 1,
render: 1,
compare: 1,
type: 1,
childContextTypes: 1,
contextType: 1,
contextTypes: 1,
defaultProps: 1,
getDefaultProps: 1,
getDerivedStateFromError: 1,
getDerivedStateFromProps: 1,
mixins: 1,
propTypes: 1
};
function copyStaticProperties(base, target) {
var protoProps = Object.getOwnPropertyNames(Object.getPrototypeOf(base));
Object.getOwnPropertyNames(base).forEach(function (key) {
if (!hoistBlackList[key] && protoProps.indexOf(key) === -1) {
Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(base, key));
}
});
}
/**
* Store Injection
*/
function createStoreInjector(grabStoresFn, component, injectNames, makeReactive) {
// Support forward refs
var Injector = /*#__PURE__*/_react["default"].forwardRef(function (props, ref) {
var newProps = _objectSpread({}, props);
var context = _react["default"].useContext(_mobxReact.MobXProviderContext);
// @ts-ignore
Object.assign(newProps, grabStoresFn(context || {}, newProps) || {});
if (ref) {
newProps.ref = ref;
}
return /*#__PURE__*/_react["default"].createElement(component, newProps);
});
if (makeReactive) Injector = (0, _mobxReact.observer)(Injector);
Injector["isMobxInjector"] = true; // assigned late to suppress observer warning
// Static fields from component should be visible on the generated Injector
copyStaticProperties(component, Injector);
Injector["wrappedComponent"] = component;
Injector.displayName = getInjectName(component, injectNames);
return Injector;
}
function getInjectName(component, injectNames) {
var displayName;
var componentName = component.displayName || component.name || component.constructor && component.constructor.name || "Component";
if (injectNames) displayName = "inject-with-" + injectNames + "(" + componentName + ")";else displayName = "inject(" + componentName + ")";
return displayName;
}
function grabStoresByName(storeNames) {
return function (baseStores, nextProps) {
storeNames.forEach(function (storeName) {
if (storeName in nextProps // prefer props over stores
) return;
if (!(storeName in baseStores)) {
var err = new Error("MobX injector: Store '" + storeName + "' is not available! Make sure it is provided by some Provider");
if (isDebug) console.error('Mobx @inject', err);
nextProps[storeName] = null;
return;
}
nextProps[storeName] = baseStores[storeName];
});
return nextProps;
};
}
/**
* higher order component that injects stores to a child.
* takes either a varargs list of strings, which are stores read from the context,
* or a function that manually maps the available stores from the context to props:
* storesToProps(mobxStores, props, context) => newProps
*/
function inject() {
for (var _len = arguments.length, storeNames = new Array(_len), _key = 0; _key < _len; _key++) {
storeNames[_key] = arguments[_key];
}
if (typeof arguments[0] === "function") {
var grabStoresFn = arguments[0];
return function (componentClass) {
return createStoreInjector(grabStoresFn, componentClass, grabStoresFn.name, true);
};
} else {
return function (componentClass) {
return createStoreInjector(grabStoresByName(storeNames), componentClass, storeNames.join("-"), false);
};
}
}
//# sourceMappingURL=inject.js.map