UNPKG

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