UNPKG

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