1 | 'use strict';
|
2 |
|
3 | Object.defineProperty(exports, '__esModule', { value: true });
|
4 |
|
5 | function _interopDefault (ex) { return (ex && (typeof ex === 'object') && 'default' in ex) ? ex['default'] : ex; }
|
6 |
|
7 | var mobx = require('mobx');
|
8 | var React = require('react');
|
9 | var React__default = _interopDefault(React);
|
10 | var reactDom = require('react-dom');
|
11 | var mobxReactLite = require('mobx-react-lite');
|
12 |
|
13 | let symbolId = 0;
|
14 |
|
15 | function 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 |
|
25 | const createdSymbols = {};
|
26 | function newSymbol(name) {
|
27 | if (!createdSymbols[name]) {
|
28 | createdSymbols[name] = createSymbol(name);
|
29 | }
|
30 |
|
31 | return createdSymbols[name];
|
32 | }
|
33 | function shallowEqual(objA, objB) {
|
34 |
|
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 |
|
54 | function is(x, y) {
|
55 |
|
56 | if (x === y) {
|
57 | return x !== 0 || 1 / x === 1 / y;
|
58 | } else {
|
59 | return x !== x && y !== y;
|
60 | }
|
61 | }
|
62 |
|
63 |
|
64 | const 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 | };
|
79 | function 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 |
|
89 |
|
90 |
|
91 |
|
92 |
|
93 |
|
94 | function 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 |
|
108 |
|
109 |
|
110 |
|
111 | const mobxMixins =
|
112 |
|
113 | newSymbol("patchMixins");
|
114 | const mobxPatchedDefinition =
|
115 |
|
116 | newSymbol("patchedDefinition");
|
117 |
|
118 | function 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 |
|
126 | function wrapper(realMethod, mixins, ...args) {
|
127 |
|
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 |
|
149 | function wrapFunction(realMethod, mixins) {
|
150 | const fn = function (...args) {
|
151 | wrapper.call(this, realMethod, mixins, ...args);
|
152 | };
|
153 |
|
154 | return fn;
|
155 | }
|
156 |
|
157 | function 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 |
|
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 |
|
176 | function 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 |
|
188 |
|
189 |
|
190 |
|
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 |
|
200 | const mobxAdminProperty = mobx.$mobx || "$mobx";
|
201 | const mobxIsUnmounted =
|
202 |
|
203 | newSymbol("isUnmounted");
|
204 | const skipRenderKey =
|
205 |
|
206 | newSymbol("skipRender");
|
207 | const isForcingUpdateKey =
|
208 |
|
209 | newSymbol("isForcingUpdate");
|
210 | function 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)
|
216 | throw new Error("It is not allowed to use shouldComponentUpdate in observer based components.");
|
217 | }
|
218 |
|
219 |
|
220 |
|
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 | }
|
245 |
|
246 | function getDisplayName(comp) {
|
247 | return comp.displayName || comp.name || comp.constructor && (comp.constructor.displayName || comp.constructor.name) || "<component>";
|
248 | }
|
249 |
|
250 | function makeComponentReactive(render) {
|
251 | if (mobxReactLite.isUsingStaticRendering() === true) return render.call(this);
|
252 | |
253 |
|
254 |
|
255 |
|
256 |
|
257 | setHiddenProp(this, skipRenderKey, false);
|
258 | |
259 |
|
260 |
|
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 |
|
270 |
|
271 |
|
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 |
|
314 | function 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 | }
|
318 |
|
319 |
|
320 | if (this.state !== nextState) {
|
321 | return true;
|
322 | }
|
323 |
|
324 |
|
325 |
|
326 |
|
327 |
|
328 | return !shallowEqual(this.props, nextProps);
|
329 | }
|
330 |
|
331 | function 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 |
|
374 | const hasSymbol = typeof Symbol === "function" && Symbol.for;
|
375 |
|
376 | const ReactForwardRefSymbol = hasSymbol ?
|
377 |
|
378 | Symbol.for("react.forward_ref") : typeof React.forwardRef === "function" &&
|
379 |
|
380 | React.forwardRef(props => null)["$$typeof"];
|
381 | const ReactMemoSymbol = hasSymbol ?
|
382 |
|
383 | Symbol.for("react.memo") : typeof React.memo === "function" &&
|
384 |
|
385 | React.memo(props => null)["$$typeof"];
|
386 |
|
387 |
|
388 |
|
389 |
|
390 | function 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 | }
|
398 |
|
399 |
|
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 | }
|
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 |
|
418 | const MobXProviderContext =
|
419 |
|
420 | React__default.createContext({});
|
421 | function 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 | };
|
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 | }
|
446 | Provider.displayName = "MobXProvider";
|
447 |
|
448 |
|
449 |
|
450 |
|
451 |
|
452 | function createStoreInjector(grabStoresFn, component, injectNames, makeReactive) {
|
453 |
|
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;
|
468 |
|
469 |
|
470 | copyStaticProperties(component, Injector);
|
471 | Injector["wrappedComponent"] = component;
|
472 | Injector.displayName = getInjectName(component, injectNames);
|
473 | return Injector;
|
474 | }
|
475 |
|
476 | function 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 |
|
483 | function grabStoresByName(storeNames) {
|
484 | return function (baseStores, nextProps) {
|
485 | storeNames.forEach(function (storeName) {
|
486 | if (storeName in nextProps
|
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 |
|
496 |
|
497 |
|
498 |
|
499 |
|
500 |
|
501 |
|
502 | function 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 |
|
513 | const protoStoreKey =
|
514 |
|
515 | newSymbol("disposeOnUnmountProto");
|
516 | const instStoreKey =
|
517 |
|
518 | newSymbol("disposeOnUnmountInst");
|
519 |
|
520 | function 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 |
|
530 | function 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 | }
|
545 |
|
546 |
|
547 | const isDecorator = typeof propertyKeyOrFunction === "string";
|
548 |
|
549 | const componentWasAlreadyModified = !!target[protoStoreKey] || !!target[instStoreKey];
|
550 | const store = isDecorator ?
|
551 | target[protoStoreKey] || (target[protoStoreKey] = []) :
|
552 | target[instStoreKey] || (target[instStoreKey] = []);
|
553 | store.push(propertyKeyOrFunction);
|
554 |
|
555 | if (!componentWasAlreadyModified) {
|
556 | patch(target, "componentWillUnmount", runDisposersOnWillUnmount);
|
557 | }
|
558 |
|
559 |
|
560 | if (typeof propertyKeyOrFunction !== "string") {
|
561 | return propertyKeyOrFunction;
|
562 | }
|
563 | }
|
564 |
|
565 | function 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 |
|
580 | return validator(props, propName, componentName, location, propFullName, ...rest);
|
581 | }
|
582 | });
|
583 | }
|
584 |
|
585 | const chainedCheckType = checkType.bind(null, false);
|
586 |
|
587 | chainedCheckType.isRequired = checkType.bind(null, true);
|
588 | return chainedCheckType;
|
589 | }
|
590 |
|
591 |
|
592 | function isSymbol(propType, propValue) {
|
593 |
|
594 | if (propType === "symbol") {
|
595 | return true;
|
596 | }
|
597 |
|
598 |
|
599 | if (propValue["@@toStringTag"] === "Symbol") {
|
600 | return true;
|
601 | }
|
602 |
|
603 |
|
604 | if (typeof Symbol === "function" && propValue instanceof Symbol) {
|
605 | return true;
|
606 | }
|
607 |
|
608 | return false;
|
609 | }
|
610 |
|
611 |
|
612 | function getPropType(propValue) {
|
613 | const propType = typeof propValue;
|
614 |
|
615 | if (Array.isArray(propValue)) {
|
616 | return "array";
|
617 | }
|
618 |
|
619 | if (propValue instanceof RegExp) {
|
620 |
|
621 |
|
622 |
|
623 | return "object";
|
624 | }
|
625 |
|
626 | if (isSymbol(propType, propValue)) {
|
627 | return "symbol";
|
628 | }
|
629 |
|
630 | return propType;
|
631 | }
|
632 |
|
633 |
|
634 |
|
635 | function 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 |
|
649 | function 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 |
|
688 | function 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 |
|
709 | const observableArray =
|
710 |
|
711 | createObservableTypeCheckerCreator(false, "Array");
|
712 | const observableArrayOf =
|
713 |
|
714 | createObservableArrayOfTypeChecker.bind(null, false);
|
715 | const observableMap =
|
716 |
|
717 | createObservableTypeCheckerCreator(false, "Map");
|
718 | const observableObject =
|
719 |
|
720 | createObservableTypeCheckerCreator(false, "Object");
|
721 | const arrayOrObservableArray =
|
722 |
|
723 | createObservableTypeCheckerCreator(true, "Array");
|
724 | const arrayOrObservableArrayOf =
|
725 |
|
726 | createObservableArrayOfTypeChecker.bind(null, true);
|
727 | const objectOrObservableObject =
|
728 |
|
729 | createObservableTypeCheckerCreator(true, "Object");
|
730 | const PropTypes = {
|
731 | observableArray,
|
732 | observableArrayOf,
|
733 | observableMap,
|
734 | observableObject,
|
735 | arrayOrObservableArray,
|
736 | arrayOrObservableArrayOf,
|
737 | objectOrObservableObject
|
738 | };
|
739 |
|
740 | if (!React.Component) throw new Error("mobx-react requires React to be available");
|
741 | if (!mobx.observable) throw new Error("mobx-react requires mobx to be available");
|
742 | if (typeof reactDom.unstable_batchedUpdates === "function") mobx.configure({
|
743 | reactionScheduler: reactDom.unstable_batchedUpdates
|
744 | });
|
745 |
|
746 | Object.defineProperty(exports, 'Observer', {
|
747 | enumerable: true,
|
748 | get: function () {
|
749 | return mobxReactLite.Observer;
|
750 | }
|
751 | });
|
752 | Object.defineProperty(exports, 'isUsingStaticRendering', {
|
753 | enumerable: true,
|
754 | get: function () {
|
755 | return mobxReactLite.isUsingStaticRendering;
|
756 | }
|
757 | });
|
758 | Object.defineProperty(exports, 'useAsObservableSource', {
|
759 | enumerable: true,
|
760 | get: function () {
|
761 | return mobxReactLite.useAsObservableSource;
|
762 | }
|
763 | });
|
764 | Object.defineProperty(exports, 'useLocalStore', {
|
765 | enumerable: true,
|
766 | get: function () {
|
767 | return mobxReactLite.useLocalStore;
|
768 | }
|
769 | });
|
770 | Object.defineProperty(exports, 'useObserver', {
|
771 | enumerable: true,
|
772 | get: function () {
|
773 | return mobxReactLite.useObserver;
|
774 | }
|
775 | });
|
776 | Object.defineProperty(exports, 'useStaticRendering', {
|
777 | enumerable: true,
|
778 | get: function () {
|
779 | return mobxReactLite.useStaticRendering;
|
780 | }
|
781 | });
|
782 | exports.MobXProviderContext = MobXProviderContext;
|
783 | exports.PropTypes = PropTypes;
|
784 | exports.Provider = Provider;
|
785 | exports.disposeOnUnmount = disposeOnUnmount;
|
786 | exports.inject = inject;
|
787 | exports.observer = observer;
|
788 |
|