UNPKG

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