UNPKG

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