mobxreact.umd.development.js 31 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851
  1. (function (global, factory) {
  2. typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports, require('mobx'), require('react'), require('react-dom'), require('mobx-react-lite')) :
  3. typeof define === 'function' && define.amd ? define(['exports', 'mobx', 'react', 'react-dom', 'mobx-react-lite'], factory) :
  4. (global = global || self, factory(global.mobxReact = {}, global.mobx, global.React, global.ReactDOM, global.mobxReactLite));
  5. }(this, (function (exports, mobx, React, reactDom, mobxReactLite) { 'use strict';
  6. var React__default = 'default' in React ? React['default'] : React;
  7. var symbolId = 0;
  8. function createSymbol(name) {
  9. if (typeof Symbol === "function") {
  10. return Symbol(name);
  11. }
  12. var symbol = "__$mobx-react " + name + " (" + symbolId + ")";
  13. symbolId++;
  14. return symbol;
  15. }
  16. var createdSymbols = {};
  17. function newSymbol(name) {
  18. if (!createdSymbols[name]) {
  19. createdSymbols[name] = createSymbol(name);
  20. }
  21. return createdSymbols[name];
  22. }
  23. function shallowEqual(objA, objB) {
  24. //From: https://github.com/facebook/fbjs/blob/c69904a511b900266935168223063dd8772dfc40/packages/fbjs/src/core/shallowEqual.js
  25. if (is(objA, objB)) return true;
  26. if (typeof objA !== "object" || objA === null || typeof objB !== "object" || objB === null) {
  27. return false;
  28. }
  29. var keysA = Object.keys(objA);
  30. var keysB = Object.keys(objB);
  31. if (keysA.length !== keysB.length) return false;
  32. for (var i = 0; i < keysA.length; i++) {
  33. if (!Object.hasOwnProperty.call(objB, keysA[i]) || !is(objA[keysA[i]], objB[keysA[i]])) {
  34. return false;
  35. }
  36. }
  37. return true;
  38. }
  39. function is(x, y) {
  40. // From: https://github.com/facebook/fbjs/blob/c69904a511b900266935168223063dd8772dfc40/packages/fbjs/src/core/shallowEqual.js
  41. if (x === y) {
  42. return x !== 0 || 1 / x === 1 / y;
  43. } else {
  44. return x !== x && y !== y;
  45. }
  46. } // based on https://github.com/mridgway/hoist-non-react-statics/blob/master/src/index.js
  47. var hoistBlackList = {
  48. $$typeof: 1,
  49. render: 1,
  50. compare: 1,
  51. type: 1,
  52. childContextTypes: 1,
  53. contextType: 1,
  54. contextTypes: 1,
  55. defaultProps: 1,
  56. getDefaultProps: 1,
  57. getDerivedStateFromError: 1,
  58. getDerivedStateFromProps: 1,
  59. mixins: 1,
  60. propTypes: 1
  61. };
  62. function copyStaticProperties(base, target) {
  63. var protoProps = Object.getOwnPropertyNames(Object.getPrototypeOf(base));
  64. Object.getOwnPropertyNames(base).forEach(function (key) {
  65. if (!hoistBlackList[key] && protoProps.indexOf(key) === -1) {
  66. Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(base, key));
  67. }
  68. });
  69. }
  70. /**
  71. * Helper to set `prop` to `this` as non-enumerable (hidden prop)
  72. * @param target
  73. * @param prop
  74. * @param value
  75. */
  76. function setHiddenProp(target, prop, value) {
  77. if (!Object.hasOwnProperty.call(target, prop)) {
  78. Object.defineProperty(target, prop, {
  79. enumerable: false,
  80. configurable: true,
  81. writable: true,
  82. value: value
  83. });
  84. } else {
  85. target[prop] = value;
  86. }
  87. }
  88. /**
  89. * Utilities for patching componentWillUnmount, to make sure @disposeOnUnmount works correctly icm with user defined hooks
  90. * and the handler provided by mobx-react
  91. */
  92. var mobxMixins =
  93. /*#__PURE__*/
  94. newSymbol("patchMixins");
  95. var mobxPatchedDefinition =
  96. /*#__PURE__*/
  97. newSymbol("patchedDefinition");
  98. function getMixins(target, methodName) {
  99. var mixins = target[mobxMixins] = target[mobxMixins] || {};
  100. var methodMixins = mixins[methodName] = mixins[methodName] || {};
  101. methodMixins.locks = methodMixins.locks || 0;
  102. methodMixins.methods = methodMixins.methods || [];
  103. return methodMixins;
  104. }
  105. function wrapper(realMethod, mixins) {
  106. var _this = this;
  107. for (var _len = arguments.length, args = new Array(_len > 2 ? _len - 2 : 0), _key = 2; _key < _len; _key++) {
  108. args[_key - 2] = arguments[_key];
  109. }
  110. // locks are used to ensure that mixins are invoked only once per invocation, even on recursive calls
  111. mixins.locks++;
  112. try {
  113. var retVal;
  114. if (realMethod !== undefined && realMethod !== null) {
  115. retVal = realMethod.apply(this, args);
  116. }
  117. return retVal;
  118. } finally {
  119. mixins.locks--;
  120. if (mixins.locks === 0) {
  121. mixins.methods.forEach(function (mx) {
  122. mx.apply(_this, args);
  123. });
  124. }
  125. }
  126. }
  127. function wrapFunction(realMethod, mixins) {
  128. var fn = function fn() {
  129. for (var _len2 = arguments.length, args = new Array(_len2), _key2 = 0; _key2 < _len2; _key2++) {
  130. args[_key2] = arguments[_key2];
  131. }
  132. wrapper.call.apply(wrapper, [this, realMethod, mixins].concat(args));
  133. };
  134. return fn;
  135. }
  136. function patch(target, methodName, mixinMethod) {
  137. var mixins = getMixins(target, methodName);
  138. if (mixins.methods.indexOf(mixinMethod) < 0) {
  139. mixins.methods.push(mixinMethod);
  140. }
  141. var oldDefinition = Object.getOwnPropertyDescriptor(target, methodName);
  142. if (oldDefinition && oldDefinition[mobxPatchedDefinition]) {
  143. // already patched definition, do not repatch
  144. return;
  145. }
  146. var originalMethod = target[methodName];
  147. var newDefinition = createDefinition(target, methodName, oldDefinition ? oldDefinition.enumerable : undefined, mixins, originalMethod);
  148. Object.defineProperty(target, methodName, newDefinition);
  149. }
  150. function createDefinition(target, methodName, enumerable, mixins, originalMethod) {
  151. var _ref;
  152. var wrappedFunc = wrapFunction(originalMethod, mixins);
  153. return _ref = {}, _ref[mobxPatchedDefinition] = true, _ref.get = function get() {
  154. return wrappedFunc;
  155. }, _ref.set = function set(value) {
  156. if (this === target) {
  157. wrappedFunc = wrapFunction(value, mixins);
  158. } else {
  159. // when it is an instance of the prototype/a child prototype patch that particular case again separately
  160. // since we need to store separate values depending on wether it is the actual instance, the prototype, etc
  161. // e.g. the method for super might not be the same as the method for the prototype which might be not the same
  162. // as the method for the instance
  163. var newDefinition = createDefinition(this, methodName, enumerable, mixins, value);
  164. Object.defineProperty(this, methodName, newDefinition);
  165. }
  166. }, _ref.configurable = true, _ref.enumerable = enumerable, _ref;
  167. }
  168. var mobxAdminProperty = mobx.$mobx || "$mobx";
  169. var mobxIsUnmounted =
  170. /*#__PURE__*/
  171. newSymbol("isUnmounted");
  172. var skipRenderKey =
  173. /*#__PURE__*/
  174. newSymbol("skipRender");
  175. var isForcingUpdateKey =
  176. /*#__PURE__*/
  177. newSymbol("isForcingUpdate");
  178. function makeClassComponentObserver(componentClass) {
  179. var target = componentClass.prototype;
  180. if (target.componentWillReact) throw new Error("The componentWillReact life-cycle event is no longer supported");
  181. if (componentClass["__proto__"] !== React.PureComponent) {
  182. if (!target.shouldComponentUpdate) target.shouldComponentUpdate = observerSCU;else if (target.shouldComponentUpdate !== observerSCU) // n.b. unequal check, instead of existence check, as @observer might be on superclass as well
  183. throw new Error("It is not allowed to use shouldComponentUpdate in observer based components.");
  184. } // this.props and this.state are made observable, just to make sure @computed fields that
  185. // are defined inside the component, and which rely on state or props, re-compute if state or props change
  186. // (otherwise the computed wouldn't update and become stale on props change, since props are not observable)
  187. // However, this solution is not without it's own problems: https://github.com/mobxjs/mobx-react/issues?utf8=%E2%9C%93&q=is%3Aissue+label%3Aobservable-props-or-not+
  188. makeObservableProp(target, "props");
  189. makeObservableProp(target, "state");
  190. var baseRender = target.render;
  191. target.render = function () {
  192. return makeComponentReactive.call(this, baseRender);
  193. };
  194. patch(target, "componentWillUnmount", function () {
  195. if (mobxReactLite.isUsingStaticRendering() === true) return;
  196. if (this.render[mobxAdminProperty]) {
  197. this.render[mobxAdminProperty].dispose();
  198. } else {
  199. var displayName = getDisplayName(this);
  200. console.warn("The render function for an observer component (" + displayName + ") was modified after MobX attached. This is not supported, since the new function can't be triggered by MobX.");
  201. }
  202. this[mobxIsUnmounted] = true;
  203. });
  204. return componentClass;
  205. } // Generates a friendly name for debugging
  206. function getDisplayName(comp) {
  207. return comp.displayName || comp.name || comp.constructor && (comp.constructor.displayName || comp.constructor.name) || "<component>";
  208. }
  209. function makeComponentReactive(render) {
  210. var _this = this;
  211. if (mobxReactLite.isUsingStaticRendering() === true) return render.call(this);
  212. /**
  213. * If props are shallowly modified, react will render anyway,
  214. * so atom.reportChanged() should not result in yet another re-render
  215. */
  216. setHiddenProp(this, skipRenderKey, false);
  217. /**
  218. * forceUpdate will re-assign this.props. We don't want that to cause a loop,
  219. * so detect these changes
  220. */
  221. setHiddenProp(this, isForcingUpdateKey, false);
  222. var initialName = getDisplayName(this);
  223. var baseRender = render.bind(this);
  224. var isRenderingPending = false;
  225. var reaction = new mobx.Reaction(initialName + ".render()", function () {
  226. if (!isRenderingPending) {
  227. // N.B. Getting here *before mounting* means that a component constructor has side effects (see the relevant test in misc.js)
  228. // This unidiomatic React usage but React will correctly warn about this so we continue as usual
  229. // See #85 / Pull #44
  230. isRenderingPending = true;
  231. if (_this[mobxIsUnmounted] !== true) {
  232. var hasError = true;
  233. try {
  234. setHiddenProp(_this, isForcingUpdateKey, true);
  235. if (!_this[skipRenderKey]) React.Component.prototype.forceUpdate.call(_this);
  236. hasError = false;
  237. } finally {
  238. setHiddenProp(_this, isForcingUpdateKey, false);
  239. if (hasError) reaction.dispose();
  240. }
  241. }
  242. }
  243. });
  244. reaction["reactComponent"] = this;
  245. reactiveRender[mobxAdminProperty] = reaction;
  246. this.render = reactiveRender;
  247. function reactiveRender() {
  248. isRenderingPending = false;
  249. var exception = undefined;
  250. var rendering = undefined;
  251. reaction.track(function () {
  252. try {
  253. rendering = mobx._allowStateChanges(false, baseRender);
  254. } catch (e) {
  255. exception = e;
  256. }
  257. });
  258. if (exception) {
  259. throw exception;
  260. }
  261. return rendering;
  262. }
  263. return reactiveRender.call(this);
  264. }
  265. function observerSCU(nextProps, nextState) {
  266. if (mobxReactLite.isUsingStaticRendering()) {
  267. console.warn("[mobx-react] It seems that a re-rendering of a React component is triggered while in static (server-side) mode. Please make sure components are rendered only once server-side.");
  268. } // update on any state changes (as is the default)
  269. if (this.state !== nextState) {
  270. return true;
  271. } // update if props are shallowly not equal, inspired by PureRenderMixin
  272. // we could return just 'false' here, and avoid the `skipRender` checks etc
  273. // however, it is nicer if lifecycle events are triggered like usually,
  274. // so we return true here if props are shallowly modified.
  275. return !shallowEqual(this.props, nextProps);
  276. }
  277. function makeObservableProp(target, propName) {
  278. var valueHolderKey = newSymbol("reactProp_" + propName + "_valueHolder");
  279. var atomHolderKey = newSymbol("reactProp_" + propName + "_atomHolder");
  280. function getAtom() {
  281. if (!this[atomHolderKey]) {
  282. setHiddenProp(this, atomHolderKey, mobx.createAtom("reactive " + propName));
  283. }
  284. return this[atomHolderKey];
  285. }
  286. Object.defineProperty(target, propName, {
  287. configurable: true,
  288. enumerable: true,
  289. get: function get() {
  290. var prevReadState = false;
  291. if (mobx._allowStateReadsStart && mobx._allowStateReadsEnd) {
  292. prevReadState = mobx._allowStateReadsStart(true);
  293. }
  294. getAtom.call(this).reportObserved();
  295. if (mobx._allowStateReadsStart && mobx._allowStateReadsEnd) {
  296. mobx._allowStateReadsEnd(prevReadState);
  297. }
  298. return this[valueHolderKey];
  299. },
  300. set: function set(v) {
  301. if (!this[isForcingUpdateKey] && !shallowEqual(this[valueHolderKey], v)) {
  302. setHiddenProp(this, valueHolderKey, v);
  303. setHiddenProp(this, skipRenderKey, true);
  304. getAtom.call(this).reportChanged();
  305. setHiddenProp(this, skipRenderKey, false);
  306. } else {
  307. setHiddenProp(this, valueHolderKey, v);
  308. }
  309. }
  310. });
  311. }
  312. var hasSymbol = typeof Symbol === "function" && Symbol.for; // Using react-is had some issues (and operates on elements, not on types), see #608 / #609
  313. var ReactForwardRefSymbol = hasSymbol ?
  314. /*#__PURE__*/
  315. Symbol.for("react.forward_ref") : typeof React.forwardRef === "function" &&
  316. /*#__PURE__*/
  317. React.forwardRef(function (props) {
  318. return null;
  319. })["$$typeof"];
  320. var ReactMemoSymbol = hasSymbol ?
  321. /*#__PURE__*/
  322. Symbol.for("react.memo") : typeof React.memo === "function" &&
  323. /*#__PURE__*/
  324. React.memo(function (props) {
  325. return null;
  326. })["$$typeof"];
  327. /**
  328. * Observer function / decorator
  329. */
  330. function observer(component) {
  331. if (component["isMobxInjector"] === true) {
  332. console.warn("Mobx observer: You are trying to use 'observer' on a component that already has 'inject'. Please apply 'observer' before applying 'inject'");
  333. }
  334. if (ReactMemoSymbol && component["$$typeof"] === ReactMemoSymbol) {
  335. throw new Error("Mobx observer: You are trying to use 'observer' on function component wrapped to either another observer or 'React.memo'. The observer already applies 'React.memo' for you.");
  336. } // Unwrap forward refs into `<Observer>` component
  337. // we need to unwrap the render, because it is the inner render that needs to be tracked,
  338. // not the ForwardRef HoC
  339. if (ReactForwardRefSymbol && component["$$typeof"] === ReactForwardRefSymbol) {
  340. var baseRender = component["render"];
  341. if (typeof baseRender !== "function") throw new Error("render property of ForwardRef was not a function");
  342. return React.forwardRef(function ObserverForwardRef() {
  343. var args = arguments;
  344. return React.createElement(mobxReactLite.Observer, null, function () {
  345. return baseRender.apply(undefined, args);
  346. });
  347. });
  348. } // Function component
  349. if (typeof component === "function" && (!component.prototype || !component.prototype.render) && !component["isReactClass"] && !Object.prototype.isPrototypeOf.call(React.Component, component)) {
  350. return mobxReactLite.observer(component);
  351. }
  352. return makeClassComponentObserver(component);
  353. }
  354. function _extends() {
  355. _extends = Object.assign || function (target) {
  356. for (var i = 1; i < arguments.length; i++) {
  357. var source = arguments[i];
  358. for (var key in source) {
  359. if (Object.prototype.hasOwnProperty.call(source, key)) {
  360. target[key] = source[key];
  361. }
  362. }
  363. }
  364. return target;
  365. };
  366. return _extends.apply(this, arguments);
  367. }
  368. function _objectWithoutPropertiesLoose(source, excluded) {
  369. if (source == null) return {};
  370. var target = {};
  371. var sourceKeys = Object.keys(source);
  372. var key, i;
  373. for (i = 0; i < sourceKeys.length; i++) {
  374. key = sourceKeys[i];
  375. if (excluded.indexOf(key) >= 0) continue;
  376. target[key] = source[key];
  377. }
  378. return target;
  379. }
  380. var MobXProviderContext =
  381. /*#__PURE__*/
  382. React__default.createContext({});
  383. function Provider(props) {
  384. var children = props.children,
  385. stores = _objectWithoutPropertiesLoose(props, ["children"]);
  386. var parentValue = React__default.useContext(MobXProviderContext);
  387. var mutableProviderRef = React__default.useRef(_extends({}, parentValue, {}, stores));
  388. var value = mutableProviderRef.current;
  389. {
  390. var newValue = _extends({}, value, {}, stores); // spread in previous state for the context based stores
  391. if (!shallowEqual(value, newValue)) {
  392. throw new Error("MobX Provider: The set of provided stores has changed. See: https://github.com/mobxjs/mobx-react#the-set-of-provided-stores-has-changed-error.");
  393. }
  394. }
  395. return React__default.createElement(MobXProviderContext.Provider, {
  396. value: value
  397. }, children);
  398. }
  399. Provider.displayName = "MobXProvider";
  400. /**
  401. * Store Injection
  402. */
  403. function createStoreInjector(grabStoresFn, component, injectNames, makeReactive) {
  404. // Support forward refs
  405. var Injector = React__default.forwardRef(function (props, ref) {
  406. var newProps = _extends({}, props);
  407. var context = React__default.useContext(MobXProviderContext);
  408. Object.assign(newProps, grabStoresFn(context || {}, newProps) || {});
  409. if (ref) {
  410. newProps.ref = ref;
  411. }
  412. return React__default.createElement(component, newProps);
  413. });
  414. if (makeReactive) Injector = observer(Injector);
  415. Injector["isMobxInjector"] = true; // assigned late to suppress observer warning
  416. // Static fields from component should be visible on the generated Injector
  417. copyStaticProperties(component, Injector);
  418. Injector["wrappedComponent"] = component;
  419. Injector.displayName = getInjectName(component, injectNames);
  420. return Injector;
  421. }
  422. function getInjectName(component, injectNames) {
  423. var displayName;
  424. var componentName = component.displayName || component.name || component.constructor && component.constructor.name || "Component";
  425. if (injectNames) displayName = "inject-with-" + injectNames + "(" + componentName + ")";else displayName = "inject(" + componentName + ")";
  426. return displayName;
  427. }
  428. function grabStoresByName(storeNames) {
  429. return function (baseStores, nextProps) {
  430. storeNames.forEach(function (storeName) {
  431. if (storeName in nextProps // prefer props over stores
  432. ) return;
  433. if (!(storeName in baseStores)) throw new Error("MobX injector: Store '" + storeName + "' is not available! Make sure it is provided by some Provider");
  434. nextProps[storeName] = baseStores[storeName];
  435. });
  436. return nextProps;
  437. };
  438. }
  439. /**
  440. * higher order component that injects stores to a child.
  441. * takes either a varargs list of strings, which are stores read from the context,
  442. * or a function that manually maps the available stores from the context to props:
  443. * storesToProps(mobxStores, props, context) => newProps
  444. */
  445. function inject() {
  446. for (var _len = arguments.length, storeNames = new Array(_len), _key = 0; _key < _len; _key++) {
  447. storeNames[_key] = arguments[_key];
  448. }
  449. if (typeof arguments[0] === "function") {
  450. var grabStoresFn = arguments[0];
  451. return function (componentClass) {
  452. return createStoreInjector(grabStoresFn, componentClass, grabStoresFn.name, true);
  453. };
  454. } else {
  455. return function (componentClass) {
  456. return createStoreInjector(grabStoresByName(storeNames), componentClass, storeNames.join("-"), false);
  457. };
  458. }
  459. }
  460. var protoStoreKey =
  461. /*#__PURE__*/
  462. newSymbol("disposeOnUnmountProto");
  463. var instStoreKey =
  464. /*#__PURE__*/
  465. newSymbol("disposeOnUnmountInst");
  466. function runDisposersOnWillUnmount() {
  467. var _this = this;
  468. [].concat(this[protoStoreKey] || [], this[instStoreKey] || []).forEach(function (propKeyOrFunction) {
  469. var prop = typeof propKeyOrFunction === "string" ? _this[propKeyOrFunction] : propKeyOrFunction;
  470. if (prop !== undefined && prop !== null) {
  471. if (Array.isArray(prop)) prop.map(function (f) {
  472. return f();
  473. });else prop();
  474. }
  475. });
  476. }
  477. function disposeOnUnmount(target, propertyKeyOrFunction) {
  478. if (Array.isArray(propertyKeyOrFunction)) {
  479. return propertyKeyOrFunction.map(function (fn) {
  480. return disposeOnUnmount(target, fn);
  481. });
  482. }
  483. var c = Object.getPrototypeOf(target).constructor || Object.getPrototypeOf(target.constructor);
  484. var c2 = Object.getPrototypeOf(target.constructor);
  485. if (!(c === React__default.Component || c === React__default.PureComponent || c2 === React__default.Component || c2 === React__default.PureComponent)) {
  486. throw new Error("[mobx-react] disposeOnUnmount only supports direct subclasses of React.Component or React.PureComponent.");
  487. }
  488. if (typeof propertyKeyOrFunction !== "string" && typeof propertyKeyOrFunction !== "function" && !Array.isArray(propertyKeyOrFunction)) {
  489. throw new Error("[mobx-react] disposeOnUnmount only works if the parameter is either a property key or a function.");
  490. } // decorator's target is the prototype, so it doesn't have any instance properties like props
  491. var isDecorator = typeof propertyKeyOrFunction === "string"; // add property key / function we want run (disposed) to the store
  492. var componentWasAlreadyModified = !!target[protoStoreKey] || !!target[instStoreKey];
  493. var store = isDecorator ? // decorators are added to the prototype store
  494. target[protoStoreKey] || (target[protoStoreKey] = []) : // functions are added to the instance store
  495. target[instStoreKey] || (target[instStoreKey] = []);
  496. store.push(propertyKeyOrFunction); // tweak the component class componentWillUnmount if not done already
  497. if (!componentWasAlreadyModified) {
  498. patch(target, "componentWillUnmount", runDisposersOnWillUnmount);
  499. } // return the disposer as is if invoked as a non decorator
  500. if (typeof propertyKeyOrFunction !== "string") {
  501. return propertyKeyOrFunction;
  502. }
  503. }
  504. function createChainableTypeChecker(validator) {
  505. function checkType(isRequired, props, propName, componentName, location, propFullName) {
  506. for (var _len = arguments.length, rest = new Array(_len > 6 ? _len - 6 : 0), _key = 6; _key < _len; _key++) {
  507. rest[_key - 6] = arguments[_key];
  508. }
  509. return mobx.untracked(function () {
  510. componentName = componentName || "<<anonymous>>";
  511. propFullName = propFullName || propName;
  512. if (props[propName] == null) {
  513. if (isRequired) {
  514. var actual = props[propName] === null ? "null" : "undefined";
  515. return new Error("The " + location + " `" + propFullName + "` is marked as required " + "in `" + componentName + "`, but its value is `" + actual + "`.");
  516. }
  517. return null;
  518. } else {
  519. // @ts-ignore rest arg is necessary for some React internals - fails tests otherwise
  520. return validator.apply(void 0, [props, propName, componentName, location, propFullName].concat(rest));
  521. }
  522. });
  523. }
  524. var chainedCheckType = checkType.bind(null, false); // Add isRequired to satisfy Requirable
  525. chainedCheckType.isRequired = checkType.bind(null, true);
  526. return chainedCheckType;
  527. } // Copied from React.PropTypes
  528. function isSymbol(propType, propValue) {
  529. // Native Symbol.
  530. if (propType === "symbol") {
  531. return true;
  532. } // 19.4.3.5 Symbol.prototype[@@toStringTag] === 'Symbol'
  533. if (propValue["@@toStringTag"] === "Symbol") {
  534. return true;
  535. } // Fallback for non-spec compliant Symbols which are polyfilled.
  536. if (typeof Symbol === "function" && propValue instanceof Symbol) {
  537. return true;
  538. }
  539. return false;
  540. } // Copied from React.PropTypes
  541. function getPropType(propValue) {
  542. var propType = typeof propValue;
  543. if (Array.isArray(propValue)) {
  544. return "array";
  545. }
  546. if (propValue instanceof RegExp) {
  547. // Old webkits (at least until Android 4.0) return 'function' rather than
  548. // 'object' for typeof a RegExp. We'll normalize this here so that /bla/
  549. // passes PropTypes.object.
  550. return "object";
  551. }
  552. if (isSymbol(propType, propValue)) {
  553. return "symbol";
  554. }
  555. return propType;
  556. } // This handles more types than `getPropType`. Only used for error messages.
  557. // Copied from React.PropTypes
  558. function getPreciseType(propValue) {
  559. var propType = getPropType(propValue);
  560. if (propType === "object") {
  561. if (propValue instanceof Date) {
  562. return "date";
  563. } else if (propValue instanceof RegExp) {
  564. return "regexp";
  565. }
  566. }
  567. return propType;
  568. }
  569. function createObservableTypeCheckerCreator(allowNativeType, mobxType) {
  570. return createChainableTypeChecker(function (props, propName, componentName, location, propFullName) {
  571. return mobx.untracked(function () {
  572. if (allowNativeType) {
  573. if (getPropType(props[propName]) === mobxType.toLowerCase()) return null;
  574. }
  575. var mobxChecker;
  576. switch (mobxType) {
  577. case "Array":
  578. mobxChecker = mobx.isObservableArray;
  579. break;
  580. case "Object":
  581. mobxChecker = mobx.isObservableObject;
  582. break;
  583. case "Map":
  584. mobxChecker = mobx.isObservableMap;
  585. break;
  586. default:
  587. throw new Error("Unexpected mobxType: " + mobxType);
  588. }
  589. var propValue = props[propName];
  590. if (!mobxChecker(propValue)) {
  591. var preciseType = getPreciseType(propValue);
  592. var nativeTypeExpectationMessage = allowNativeType ? " or javascript `" + mobxType.toLowerCase() + "`" : "";
  593. return new Error("Invalid prop `" + propFullName + "` of type `" + preciseType + "` supplied to" + " `" + componentName + "`, expected `mobx.Observable" + mobxType + "`" + nativeTypeExpectationMessage + ".");
  594. }
  595. return null;
  596. });
  597. });
  598. }
  599. function createObservableArrayOfTypeChecker(allowNativeType, typeChecker) {
  600. return createChainableTypeChecker(function (props, propName, componentName, location, propFullName) {
  601. for (var _len2 = arguments.length, rest = new Array(_len2 > 5 ? _len2 - 5 : 0), _key2 = 5; _key2 < _len2; _key2++) {
  602. rest[_key2 - 5] = arguments[_key2];
  603. }
  604. return mobx.untracked(function () {
  605. if (typeof typeChecker !== "function") {
  606. return new Error("Property `" + propFullName + "` of component `" + componentName + "` has " + "invalid PropType notation.");
  607. } else {
  608. var error = createObservableTypeCheckerCreator(allowNativeType, "Array")(props, propName, componentName, location, propFullName);
  609. if (error instanceof Error) return error;
  610. var propValue = props[propName];
  611. for (var i = 0; i < propValue.length; i++) {
  612. error = typeChecker.apply(void 0, [propValue, i, componentName, location, propFullName + "[" + i + "]"].concat(rest));
  613. if (error instanceof Error) return error;
  614. }
  615. return null;
  616. }
  617. });
  618. });
  619. }
  620. var observableArray =
  621. /*#__PURE__*/
  622. createObservableTypeCheckerCreator(false, "Array");
  623. var observableArrayOf =
  624. /*#__PURE__*/
  625. createObservableArrayOfTypeChecker.bind(null, false);
  626. var observableMap =
  627. /*#__PURE__*/
  628. createObservableTypeCheckerCreator(false, "Map");
  629. var observableObject =
  630. /*#__PURE__*/
  631. createObservableTypeCheckerCreator(false, "Object");
  632. var arrayOrObservableArray =
  633. /*#__PURE__*/
  634. createObservableTypeCheckerCreator(true, "Array");
  635. var arrayOrObservableArrayOf =
  636. /*#__PURE__*/
  637. createObservableArrayOfTypeChecker.bind(null, true);
  638. var objectOrObservableObject =
  639. /*#__PURE__*/
  640. createObservableTypeCheckerCreator(true, "Object");
  641. var PropTypes = {
  642. observableArray: observableArray,
  643. observableArrayOf: observableArrayOf,
  644. observableMap: observableMap,
  645. observableObject: observableObject,
  646. arrayOrObservableArray: arrayOrObservableArray,
  647. arrayOrObservableArrayOf: arrayOrObservableArrayOf,
  648. objectOrObservableObject: objectOrObservableObject
  649. };
  650. if (!React.Component) throw new Error("mobx-react requires React to be available");
  651. if (!mobx.observable) throw new Error("mobx-react requires mobx to be available");
  652. if (typeof reactDom.unstable_batchedUpdates === "function") mobx.configure({
  653. reactionScheduler: reactDom.unstable_batchedUpdates
  654. });
  655. Object.defineProperty(exports, 'Observer', {
  656. enumerable: true,
  657. get: function () {
  658. return mobxReactLite.Observer;
  659. }
  660. });
  661. Object.defineProperty(exports, 'isUsingStaticRendering', {
  662. enumerable: true,
  663. get: function () {
  664. return mobxReactLite.isUsingStaticRendering;
  665. }
  666. });
  667. Object.defineProperty(exports, 'useAsObservableSource', {
  668. enumerable: true,
  669. get: function () {
  670. return mobxReactLite.useAsObservableSource;
  671. }
  672. });
  673. Object.defineProperty(exports, 'useLocalStore', {
  674. enumerable: true,
  675. get: function () {
  676. return mobxReactLite.useLocalStore;
  677. }
  678. });
  679. Object.defineProperty(exports, 'useObserver', {
  680. enumerable: true,
  681. get: function () {
  682. return mobxReactLite.useObserver;
  683. }
  684. });
  685. Object.defineProperty(exports, 'useStaticRendering', {
  686. enumerable: true,
  687. get: function () {
  688. return mobxReactLite.useStaticRendering;
  689. }
  690. });
  691. exports.MobXProviderContext = MobXProviderContext;
  692. exports.PropTypes = PropTypes;
  693. exports.Provider = Provider;
  694. exports.disposeOnUnmount = disposeOnUnmount;
  695. exports.inject = inject;
  696. exports.observer = observer;
  697. Object.defineProperty(exports, '__esModule', { value: true });
  698. })));
  699. //# sourceMappingURL=mobxreact.umd.development.js.map