UNPKG

84.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 React = require('react');
8var React__default = _interopDefault(React);
9var shallowEqual = _interopDefault(require('shallowequal'));
10var ReactDOM = _interopDefault(require('react-dom'));
11var levenshtein = _interopDefault(require('fast-levenshtein'));
12var PropTypes = _interopDefault(require('prop-types'));
13var defaultPolyfill = require('react-lifecycles-compat');
14var defaultPolyfill__default = _interopDefault(defaultPolyfill);
15var hoistNonReactStatic = _interopDefault(require('hoist-non-react-statics'));
16
17var _typeof = typeof Symbol === "function" && typeof Symbol.iterator === "symbol" ? function (obj) {
18 return typeof obj;
19} : function (obj) {
20 return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj;
21};
22
23var classCallCheck = function (instance, Constructor) {
24 if (!(instance instanceof Constructor)) {
25 throw new TypeError("Cannot call a class as a function");
26 }
27};
28
29var _extends = Object.assign || function (target) {
30 for (var i = 1; i < arguments.length; i++) {
31 var source = arguments[i];
32
33 for (var key in source) {
34 if (Object.prototype.hasOwnProperty.call(source, key)) {
35 target[key] = source[key];
36 }
37 }
38 }
39
40 return target;
41};
42
43var inherits = function (subClass, superClass) {
44 if (typeof superClass !== "function" && superClass !== null) {
45 throw new TypeError("Super expression must either be null or a function, not " + typeof superClass);
46 }
47
48 subClass.prototype = Object.create(superClass && superClass.prototype, {
49 constructor: {
50 value: subClass,
51 enumerable: false,
52 writable: true,
53 configurable: true
54 }
55 });
56 if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass;
57};
58
59var possibleConstructorReturn = function (self, call) {
60 if (!self) {
61 throw new ReferenceError("this hasn't been initialised - super() hasn't been called");
62 }
63
64 return call && (typeof call === "object" || typeof call === "function") ? call : self;
65};
66
67/* eslint-disable no-underscore-dangle */
68
69var isCompositeComponent = function isCompositeComponent(type) {
70 return typeof type === 'function';
71};
72var isReloadableComponent = function isReloadableComponent(type) {
73 return typeof type === 'function' || (typeof type === 'undefined' ? 'undefined' : _typeof(type)) === 'object';
74};
75
76var getComponentDisplayName = function getComponentDisplayName(type) {
77 var displayName = type.displayName || type.name;
78 return displayName && displayName !== 'ReactComponent' ? displayName : 'Component';
79};
80
81var reactLifeCycleMountMethods = ['componentWillMount', 'componentDidMount'];
82
83function isReactClass(Component) {
84 return !!(Component.prototype && (React__default.Component.prototype.isPrototypeOf(Component.prototype) ||
85 // react 14 support
86 Component.prototype.isReactComponent || Component.prototype.componentWillMount || Component.prototype.componentWillUnmount || Component.prototype.componentDidMount || Component.prototype.componentDidUnmount || Component.prototype.render));
87}
88
89function isReactClassInstance(Component) {
90 return Component && isReactClass({ prototype: Object.getPrototypeOf(Component) });
91}
92
93var getInternalInstance = function getInternalInstance(instance) {
94 return instance._reactInternalFiber || // React 16
95 instance._reactInternalInstance || // React 15
96 null;
97};
98
99var updateInstance = function updateInstance(instance) {
100 var updater = instance.updater,
101 forceUpdate = instance.forceUpdate;
102
103 if (typeof forceUpdate === 'function') {
104 instance.forceUpdate();
105 } else if (updater && typeof updater.enqueueForceUpdate === 'function') {
106 updater.enqueueForceUpdate(instance);
107 }
108};
109
110var isFragmentNode = function isFragmentNode(_ref) {
111 var type = _ref.type;
112 return React__default.Fragment && type === React__default.Fragment;
113};
114
115var ContextType = React__default.createContext ? React__default.createContext() : null;
116var ConsumerType = ContextType && ContextType.Consumer.$$typeof;
117var ProviderType = ContextType && ContextType.Provider.$$typeof;
118var MemoType = React__default.memo && React__default.memo(function () {
119 return null;
120}).$$typeof;
121var LazyType = React__default.lazy && React__default.lazy(function () {
122 return null;
123}).$$typeof;
124var ForwardType = React__default.forwardRef && React__default.forwardRef(function () {
125 return null;
126}).$$typeof;
127
128var CONTEXT_CURRENT_VALUE = '_currentValue';
129
130var isContextConsumer = function isContextConsumer(_ref2) {
131 var type = _ref2.type;
132 return type && (typeof type === 'undefined' ? 'undefined' : _typeof(type)) === 'object' && '$$typeof' in type && type.$$typeof === ConsumerType && ConsumerType;
133};
134var isContextProvider = function isContextProvider(_ref3) {
135 var type = _ref3.type;
136 return type && (typeof type === 'undefined' ? 'undefined' : _typeof(type)) === 'object' && '$$typeof' in type && type.$$typeof === ProviderType && ProviderType;
137};
138var isMemoType = function isMemoType(_ref4) {
139 var type = _ref4.type;
140 return type && (typeof type === 'undefined' ? 'undefined' : _typeof(type)) === 'object' && '$$typeof' in type && type.$$typeof === MemoType && MemoType;
141};
142var isLazyType = function isLazyType(_ref5) {
143 var type = _ref5.type;
144 return type && (typeof type === 'undefined' ? 'undefined' : _typeof(type)) === 'object' && '$$typeof' in type && type.$$typeof === LazyType && LazyType;
145};
146var isForwardType = function isForwardType(_ref6) {
147 var type = _ref6.type;
148 return type && (typeof type === 'undefined' ? 'undefined' : _typeof(type)) === 'object' && '$$typeof' in type && type.$$typeof === ForwardType && ForwardType;
149};
150var isContextType = function isContextType(type) {
151 return isContextConsumer(type) || isContextProvider(type);
152};
153
154var getContextProvider = function getContextProvider(type) {
155 return type && type._context;
156};
157
158var configuration = {
159 // Log level
160 logLevel: 'error',
161
162 // Allows using SFC without changes
163 pureSFC: true,
164
165 // keep render method unpatched, moving sideEffect to componentDidUpdate
166 pureRender: true,
167
168 // Allows SFC to be used, enables "intermediate" components used by Relay, should be disabled for Preact
169 allowSFC: true,
170
171 // Disable "hot-replacement-render"
172 disableHotRenderer: false,
173
174 // Disable "hot-replacement-render" when injection into react-dom is made
175 disableHotRendererWhenInjected: false,
176
177 // Controls `react-🔥-dom patch` notification
178 showReactDomPatchNotification: true,
179
180 // Hook on babel component register.
181 onComponentRegister: false,
182
183 // Hook on React renders for a first time component
184 onComponentCreate: false,
185
186 // flag to completely disable RHL for SFC. Probably don't use it without dom patch made.
187 ignoreSFC: false,
188
189 // ignoreSFC when injection into react-dom is made
190 ignoreSFCWhenInjected: true,
191
192 // flag to completely disable RHL for Components
193 ignoreComponents: false,
194
195 // default value for AppContainer errorOverlay
196 errorReporter: undefined,
197
198 // Global error overlay
199 ErrorOverlay: undefined
200};
201
202var internalConfiguration = {
203 // control proxy creation
204 disableProxyCreation: false
205};
206
207var setConfiguration = function setConfiguration(config) {
208 // not using Object.assing for IE11 compliance
209 for (var i in config) {
210 if (config.hasOwnProperty(i)) {
211 configuration[i] = config[i];
212 }
213 }
214};
215
216/* eslint-disable no-console */
217
218var logger = {
219 debug: function debug() {
220 if (['debug'].indexOf(configuration.logLevel) !== -1) {
221 var _console;
222
223 (_console = console).debug.apply(_console, arguments);
224 }
225 },
226 log: function log() {
227 if (['debug', 'log'].indexOf(configuration.logLevel) !== -1) {
228 var _console2;
229
230 (_console2 = console).log.apply(_console2, arguments);
231 }
232 },
233 warn: function warn() {
234 if (['debug', 'log', 'warn'].indexOf(configuration.logLevel) !== -1) {
235 var _console3;
236
237 (_console3 = console).warn.apply(_console3, arguments);
238 }
239 },
240 error: function error() {
241 if (['debug', 'log', 'warn', 'error'].indexOf(configuration.logLevel) !== -1) {
242 var _console4;
243
244 (_console4 = console).error.apply(_console4, arguments);
245 }
246 }
247};
248
249/* eslint-disable no-eval, func-names */
250
251function safeReactConstructor(Component, lastInstance) {
252 try {
253 if (lastInstance) {
254 return new Component(lastInstance.props, lastInstance.context);
255 }
256 return new Component({}, {});
257 } catch (e) {
258 // some components, like Redux connect could not be created without proper context
259 }
260 return null;
261}
262
263function isNativeFunction(fn) {
264 return typeof fn === 'function' ? fn.toString().indexOf('[native code]') > 0 : false;
265}
266
267var identity = function identity(a) {
268 return a;
269};
270var indirectEval = eval;
271
272var doesSupportClasses = function () {
273 try {
274 indirectEval('class Test {}');
275 return true;
276 } catch (e) {
277 return false;
278 }
279}();
280
281var ES6ProxyComponentFactory = function ES6ProxyComponentFactory(InitialParent, postConstructionAction) {
282 return indirectEval('\n(function(InitialParent, postConstructionAction) {\n return class ' + (InitialParent.name || 'HotComponent') + ' extends InitialParent {\n constructor(props, context) {\n super(props, context)\n postConstructionAction.call(this)\n }\n }\n})\n')(InitialParent, postConstructionAction);
283};
284
285var ES5ProxyComponentFactory = function ES5ProxyComponentFactory(InitialParent, postConstructionAction) {
286 function ProxyComponent(props, context) {
287 InitialParent.call(this, props, context);
288 postConstructionAction.call(this);
289 }
290 ProxyComponent.prototype = Object.create(InitialParent.prototype);
291 Object.setPrototypeOf(ProxyComponent, InitialParent);
292 return ProxyComponent;
293};
294
295var proxyClassCreator = doesSupportClasses ? ES6ProxyComponentFactory : ES5ProxyComponentFactory;
296
297function getOwnKeys(target) {
298 return [].concat(Object.getOwnPropertyNames(target), Object.getOwnPropertySymbols(target));
299}
300
301function shallowStringsEqual(a, b) {
302 for (var key in a) {
303 if (String(a[key]) !== String(b[key])) {
304 return false;
305 }
306 }
307 return true;
308}
309
310function deepPrototypeUpdate(dest, source) {
311 var deepDest = Object.getPrototypeOf(dest);
312 var deepSrc = Object.getPrototypeOf(source);
313 if (deepDest && deepSrc && deepSrc !== deepDest) {
314 deepPrototypeUpdate(deepDest, deepSrc);
315 }
316 if (source.prototype && source.prototype !== dest.prototype) {
317 dest.prototype = source.prototype;
318 }
319}
320
321function safeDefineProperty(target, key, props) {
322 try {
323 Object.defineProperty(target, key, props);
324 } catch (e) {
325 logger.warn('Error while wrapping', key, ' -> ', e);
326 }
327}
328
329var PREFIX = '__reactstandin__';
330var PROXY_KEY = PREFIX + 'key';
331var GENERATION = PREFIX + 'proxyGeneration';
332var REGENERATE_METHOD = PREFIX + 'regenerateByEval';
333var UNWRAP_PROXY = PREFIX + 'getCurrent';
334var CACHED_RESULT = PREFIX + 'cachedResult';
335var PROXY_IS_MOUNTED = PREFIX + 'isMounted';
336
337var RENDERED_GENERATION = 'REACT_HOT_LOADER_RENDERED_GENERATION';
338
339var RESERVED_STATICS = ['length', 'displayName', 'name', 'arguments', 'caller', 'prototype', 'toString', 'valueOf', 'isStatelessFunctionalProxy', PROXY_KEY, UNWRAP_PROXY];
340
341function transferStaticProps(ProxyComponent, savedDescriptors, PreviousComponent, NextComponent) {
342 Object.getOwnPropertyNames(ProxyComponent).forEach(function (key) {
343 if (RESERVED_STATICS.indexOf(key) !== -1) {
344 return;
345 }
346
347 var prevDescriptor = Object.getOwnPropertyDescriptor(ProxyComponent, key);
348 var savedDescriptor = savedDescriptors[key];
349
350 if (!shallowEqual(prevDescriptor, savedDescriptor)) {
351 safeDefineProperty(NextComponent, key, prevDescriptor);
352 }
353 });
354
355 // Copy newly defined static methods and properties
356 Object.getOwnPropertyNames(NextComponent).forEach(function (key) {
357 if (RESERVED_STATICS.indexOf(key) !== -1) {
358 return;
359 }
360
361 var prevDescriptor = PreviousComponent && Object.getOwnPropertyDescriptor(ProxyComponent, key);
362 var savedDescriptor = savedDescriptors[key];
363
364 // Skip redefined descriptors
365 if (prevDescriptor && savedDescriptor && !shallowEqual(savedDescriptor, prevDescriptor)) {
366 safeDefineProperty(NextComponent, key, prevDescriptor);
367 return;
368 }
369
370 if (prevDescriptor && !savedDescriptor) {
371 safeDefineProperty(ProxyComponent, key, prevDescriptor);
372 return;
373 }
374
375 var nextDescriptor = _extends({}, Object.getOwnPropertyDescriptor(NextComponent, key), {
376 configurable: true
377 });
378
379 savedDescriptors[key] = nextDescriptor;
380 safeDefineProperty(ProxyComponent, key, nextDescriptor);
381 });
382
383 // Remove static methods and properties that are no longer defined
384 Object.getOwnPropertyNames(ProxyComponent).forEach(function (key) {
385 if (RESERVED_STATICS.indexOf(key) !== -1) {
386 return;
387 }
388 // Skip statics that exist on the next class
389 if (NextComponent.hasOwnProperty(key)) {
390 return;
391 }
392 // Skip non-configurable statics
393 var proxyDescriptor = Object.getOwnPropertyDescriptor(ProxyComponent, key);
394 if (proxyDescriptor && !proxyDescriptor.configurable) {
395 return;
396 }
397
398 var prevDescriptor = PreviousComponent && Object.getOwnPropertyDescriptor(PreviousComponent, key);
399 var savedDescriptor = savedDescriptors[key];
400
401 // Skip redefined descriptors
402 if (prevDescriptor && savedDescriptor && !shallowEqual(savedDescriptor, prevDescriptor)) {
403 return;
404 }
405
406 safeDefineProperty(ProxyComponent, key, {
407 value: undefined
408 });
409 });
410
411 return savedDescriptors;
412}
413
414function mergeComponents(ProxyComponent, NextComponent, InitialComponent, lastInstance, injectedMembers) {
415 var injectedCode = {};
416 try {
417 var nextInstance = safeReactConstructor(NextComponent, lastInstance);
418
419 try {
420 // Bypass babel class inheritance checking
421 deepPrototypeUpdate(InitialComponent, NextComponent);
422 } catch (e) {
423 // It was ES6 class
424 }
425
426 var proxyInstance = safeReactConstructor(ProxyComponent, lastInstance);
427
428 if (!nextInstance || !proxyInstance) {
429 return injectedCode;
430 }
431
432 var mergedAttrs = _extends({}, proxyInstance, nextInstance);
433 var hasRegenerate = proxyInstance[REGENERATE_METHOD];
434 var ownKeys = getOwnKeys(Object.getPrototypeOf(ProxyComponent.prototype));
435 Object.keys(mergedAttrs).forEach(function (key) {
436 if (key.indexOf(PREFIX) === 0) return;
437 var nextAttr = nextInstance[key];
438 var prevAttr = proxyInstance[key];
439 if (nextAttr) {
440 if (isNativeFunction(nextAttr) || isNativeFunction(prevAttr)) {
441 // this is bound method
442 var isSameArity = nextAttr.length === prevAttr.length;
443 var existsInPrototype = ownKeys.indexOf(key) >= 0 || ProxyComponent.prototype[key];
444 if ((isSameArity || !prevAttr) && existsInPrototype) {
445 if (hasRegenerate) {
446 injectedCode[key] = 'Object.getPrototypeOf(this)[\'' + key + '\'].bind(this)';
447 } else {
448 logger.warn('React Hot Loader:,', 'Non-controlled class', ProxyComponent.name, 'contains a new native or bound function ', key, nextAttr, '. Unable to reproduce');
449 }
450 } else {
451 logger.warn('React Hot Loader:', 'Updated class ', ProxyComponent.name, 'contains native or bound function ', key, nextAttr, '. Unable to reproduce, use arrow functions instead.', '(arity: ' + nextAttr.length + '/' + prevAttr.length + ', proto: ' + (existsInPrototype ? 'yes' : 'no'));
452 }
453 return;
454 }
455
456 var nextString = String(nextAttr);
457 var injectedBefore = injectedMembers[key];
458 var isArrow = nextString.indexOf('=>') >= 0;
459 var isFunction = nextString.indexOf('function') >= 0 || isArrow;
460 var referToThis = nextString.indexOf('this') >= 0;
461 if (nextString !== String(prevAttr) || injectedBefore && nextString !== String(injectedBefore) || isArrow && referToThis) {
462 if (!hasRegenerate) {
463 if (!isFunction) {
464 // just copy prop over
465 injectedCode[key] = nextAttr;
466 } else {
467 logger.warn('React Hot Loader:', ' Updated class ', ProxyComponent.name, 'had different code for', key, nextAttr, '. Unable to reproduce. Regeneration support needed.');
468 }
469 } else {
470 injectedCode[key] = nextAttr;
471 }
472 }
473 }
474 });
475 } catch (e) {
476 logger.warn('React Hot Loader:', e);
477 }
478 return injectedCode;
479}
480
481function checkLifeCycleMethods(ProxyComponent, NextComponent) {
482 try {
483 var p1 = Object.getPrototypeOf(ProxyComponent.prototype);
484 var p2 = NextComponent.prototype;
485 reactLifeCycleMountMethods.forEach(function (key) {
486 var d1 = Object.getOwnPropertyDescriptor(p1, key) || { value: p1[key] };
487 var d2 = Object.getOwnPropertyDescriptor(p2, key) || { value: p2[key] };
488 if (!shallowStringsEqual(d1, d2)) {
489 logger.warn('React Hot Loader:', 'You did update', ProxyComponent.name, 's lifecycle method', key, '. Unable to repeat');
490 }
491 });
492 } catch (e) {
493 // Ignore errors
494 }
495}
496
497function inject(target, currentGeneration, injectedMembers) {
498 if (target[GENERATION] !== currentGeneration) {
499 var hasRegenerate = !!target[REGENERATE_METHOD];
500 Object.keys(injectedMembers).forEach(function (key) {
501 try {
502 if (hasRegenerate) {
503 var usedThis = String(injectedMembers[key]).match(/_this([\d]+)/gi) || [];
504 target[REGENERATE_METHOD](key, '(function REACT_HOT_LOADER_SANDBOX () {\n var _this = this; // common babel transpile\n ' + usedThis.map(function (name) {
505 return 'var ' + name + ' = this;';
506 }) + '\n\n return ' + injectedMembers[key] + ';\n }).call(this)');
507 } else {
508 target[key] = injectedMembers[key];
509 }
510 } catch (e) {
511 logger.warn('React Hot Loader: Failed to regenerate method ', key, ' of class ', target);
512 logger.warn('got error', e);
513 }
514 });
515
516 target[GENERATION] = currentGeneration;
517 }
518}
519
520var has = Object.prototype.hasOwnProperty;
521
522var proxies = new WeakMap();
523
524var resetClassProxies = function resetClassProxies() {
525 proxies = new WeakMap();
526};
527
528var blackListedClassMembers = ['constructor', 'render', 'componentWillMount', 'componentDidMount', 'componentDidCatch', 'componentWillReceiveProps', 'componentWillUnmount', 'hotComponentRender', 'getInitialState', 'getDefaultProps'];
529
530var defaultRenderOptions = {
531 componentWillRender: identity,
532 componentDidUpdate: function componentDidUpdate(result) {
533 return result;
534 },
535 componentDidRender: function componentDidRender(result) {
536 return result;
537 }
538};
539
540var filteredPrototypeMethods = function filteredPrototypeMethods(Proto) {
541 return Object.getOwnPropertyNames(Proto).filter(function (prop) {
542 var descriptor = Object.getOwnPropertyDescriptor(Proto, prop);
543 return descriptor && prop.indexOf(PREFIX) !== 0 && blackListedClassMembers.indexOf(prop) < 0 && typeof descriptor.value === 'function';
544 });
545};
546
547var defineClassMember = function defineClassMember(Class, methodName, methodBody) {
548 return safeDefineProperty(Class.prototype, methodName, {
549 configurable: true,
550 writable: true,
551 enumerable: false,
552 value: methodBody
553 });
554};
555
556var defineClassMembers = function defineClassMembers(Class, methods) {
557 return Object.keys(methods).forEach(function (methodName) {
558 return defineClassMember(Class, methodName, methods[methodName]);
559 });
560};
561
562var setSFPFlag = function setSFPFlag(component, flag) {
563 return safeDefineProperty(component, 'isStatelessFunctionalProxy', {
564 configurable: false,
565 writable: false,
566 enumerable: false,
567 value: flag
568 });
569};
570
571var copyMethodDescriptors = function copyMethodDescriptors(target, source) {
572 if (source) {
573 // it is possible to use `function-double` to construct an ideal clone, but does not make a sence
574 var keys = Object.getOwnPropertyNames(source);
575
576 keys.forEach(function (key) {
577 return safeDefineProperty(target, key, Object.getOwnPropertyDescriptor(source, key));
578 });
579
580 safeDefineProperty(target, 'toString', {
581 configurable: true,
582 writable: false,
583 enumerable: false,
584 value: function toString() {
585 return String(source);
586 }
587 });
588 }
589
590 return target;
591};
592
593var knownClassComponents = [];
594
595var forEachKnownClass = function forEachKnownClass(cb) {
596 return knownClassComponents.forEach(cb);
597};
598
599function createClassProxy(InitialComponent, proxyKey) {
600 var options = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {};
601
602 var renderOptions = _extends({}, defaultRenderOptions, options);
603 var proxyConfig = _extends({}, configuration, options.proxy);
604 // Prevent double wrapping.
605 // Given a proxy class, return the existing proxy managing it.
606 var existingProxy = proxies.get(InitialComponent);
607
608 if (existingProxy) {
609 return existingProxy;
610 }
611
612 var CurrentComponent = void 0;
613 var savedDescriptors = {};
614 var injectedMembers = {};
615 var proxyGeneration = 0;
616 var classUpdatePostponed = null;
617 var instancesCount = 0;
618 var isFunctionalComponent = !isReactClass(InitialComponent);
619
620 var lastInstance = null;
621
622 function postConstructionAction() {
623 this[GENERATION] = 0;
624
625 lastInstance = this;
626 // is there is an update pending
627 if (classUpdatePostponed) {
628 var callUpdate = classUpdatePostponed;
629 classUpdatePostponed = null;
630 callUpdate();
631 }
632 // As long we can't override constructor
633 // every class shall evolve from a base class
634 inject(this, proxyGeneration, injectedMembers);
635 }
636
637 function proxiedUpdate() {
638 if (this) {
639 inject(this, proxyGeneration, injectedMembers);
640 }
641 }
642
643 function lifeCycleWrapperFactory(wrapperName) {
644 var sideEffect = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : identity;
645
646 return copyMethodDescriptors(function wrappedMethod() {
647 proxiedUpdate.call(this);
648 sideEffect(this);
649
650 for (var _len = arguments.length, rest = Array(_len), _key = 0; _key < _len; _key++) {
651 rest[_key] = arguments[_key];
652 }
653
654 return !isFunctionalComponent && CurrentComponent.prototype[wrapperName] && CurrentComponent.prototype[wrapperName].apply(this, rest);
655 }, InitialComponent.prototype && InitialComponent.prototype[wrapperName]);
656 }
657
658 function methodWrapperFactory(wrapperName, realMethod) {
659 return copyMethodDescriptors(function wrappedMethod() {
660 for (var _len2 = arguments.length, rest = Array(_len2), _key2 = 0; _key2 < _len2; _key2++) {
661 rest[_key2] = arguments[_key2];
662 }
663
664 return realMethod.apply(this, rest);
665 }, realMethod);
666 }
667
668 var fakeBasePrototype = function fakeBasePrototype(Proto) {
669 return filteredPrototypeMethods(Proto).reduce(function (acc, key) {
670 acc[key] = methodWrapperFactory(key, Proto[key]);
671 return acc;
672 }, {});
673 };
674
675 var componentDidMount = lifeCycleWrapperFactory('componentDidMount', function (target) {
676 target[PROXY_IS_MOUNTED] = true;
677 target[RENDERED_GENERATION] = get$1();
678 instancesCount++;
679 });
680 var componentDidUpdate = lifeCycleWrapperFactory('componentDidUpdate', renderOptions.componentDidUpdate);
681 var componentWillUnmount = lifeCycleWrapperFactory('componentWillUnmount', function (target) {
682 target[PROXY_IS_MOUNTED] = false;
683 instancesCount--;
684 });
685
686 function hotComponentRender() {
687 // repeating subrender call to keep RENDERED_GENERATION up to date
688 renderOptions.componentWillRender(this);
689 proxiedUpdate.call(this);
690 var result = void 0;
691
692 // We need to use hasOwnProperty here, as the cached result is a React node
693 // and can be null or some other falsy value.
694 if (has.call(this, CACHED_RESULT)) {
695 result = this[CACHED_RESULT];
696 delete this[CACHED_RESULT];
697 } else if (isFunctionalComponent) {
698 result = CurrentComponent(this.props, this.context);
699 } else {
700 var renderMethod = CurrentComponent.prototype.render || this.render;
701 /* eslint-disable no-use-before-define */
702 if (renderMethod === proxiedRender) {
703 throw new Error('React-Hot-Loader: you are trying to render Component without .render method');
704 }
705 /* eslint-enable */
706 result = renderMethod.apply(this,
707 // eslint-disable-next-line prefer-rest-params
708 arguments);
709 }
710
711 return renderOptions.componentDidRender.call(this, result);
712 }
713
714 function hotComponentUpdate() {
715 renderOptions.componentWillRender(this);
716 proxiedUpdate.call(this);
717 }
718
719 function proxiedRender() {
720 renderOptions.componentWillRender(this);
721
722 for (var _len3 = arguments.length, args = Array(_len3), _key3 = 0; _key3 < _len3; _key3++) {
723 args[_key3] = arguments[_key3];
724 }
725
726 return hotComponentRender.call.apply(hotComponentRender, [this].concat(args));
727 }
728
729 var defineProxyMethods = function defineProxyMethods(Proxy) {
730 var Base = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};
731
732 defineClassMembers(Proxy, _extends({}, fakeBasePrototype(Base), proxyConfig.pureRender ? {} : { render: proxiedRender }, {
733 hotComponentRender: hotComponentRender,
734 hotComponentUpdate: hotComponentUpdate,
735 componentDidMount: componentDidMount,
736 componentDidUpdate: componentDidUpdate,
737 componentWillUnmount: componentWillUnmount
738 }));
739 };
740
741 var _ProxyFacade = void 0;
742 var ProxyComponent = null;
743 var proxy = void 0;
744
745 if (!isFunctionalComponent) {
746 // Component
747 ProxyComponent = proxyClassCreator(InitialComponent, postConstructionAction);
748
749 defineProxyMethods(ProxyComponent, InitialComponent.prototype);
750
751 knownClassComponents.push(ProxyComponent);
752
753 _ProxyFacade = ProxyComponent;
754 } else if (!proxyConfig.allowSFC) {
755 proxyConfig.pureRender = false;
756 // SFC Converted to component. Does not support returning precreated instances from render.
757 ProxyComponent = proxyClassCreator(React.Component, postConstructionAction);
758
759 defineProxyMethods(ProxyComponent);
760 _ProxyFacade = ProxyComponent;
761 } else {
762 // SFC
763
764 // This function only gets called for the initial mount. The actual
765 // rendered component instance will be the return value.
766
767 // eslint-disable-next-line func-names
768 _ProxyFacade = function ProxyFacade(props, context) {
769 var result = CurrentComponent(props, context);
770
771 // This is a Relay-style container constructor. We can't do the prototype-
772 // style wrapping for this as we do elsewhere, so just we just pass it
773 // through as-is.
774 if (isReactClassInstance(result)) {
775 ProxyComponent = null;
776
777 // Relay lazily sets statics like getDerivedStateFromProps on initial
778 // render in lazy construction, so we need to do the same here.
779 transferStaticProps(_ProxyFacade, savedDescriptors, null, CurrentComponent);
780
781 return result;
782 }
783
784 // simple SFC, could continue to be SFC
785 if (proxyConfig.pureSFC) {
786 if (!CurrentComponent.contextTypes) {
787 if (!_ProxyFacade.isStatelessFunctionalProxy) {
788 setSFPFlag(_ProxyFacade, true);
789 }
790
791 return renderOptions.componentDidRender(result);
792 }
793 }
794 setSFPFlag(_ProxyFacade, false);
795 proxyConfig.pureRender = false;
796
797 // Otherwise, it's a normal functional component. Build the real proxy
798 // and use it going forward.
799 ProxyComponent = proxyClassCreator(React.Component, postConstructionAction);
800
801 defineProxyMethods(ProxyComponent);
802
803 var determinateResult = new ProxyComponent(props, context);
804
805 // Cache the initial render result so we don't call the component function
806 // a second time for the initial render.
807 determinateResult[CACHED_RESULT] = result;
808 return determinateResult;
809 };
810 }
811
812 function get$$1() {
813 return _ProxyFacade;
814 }
815
816 function getCurrent() {
817 return CurrentComponent;
818 }
819
820 safeDefineProperty(_ProxyFacade, UNWRAP_PROXY, {
821 configurable: false,
822 writable: false,
823 enumerable: false,
824 value: getCurrent
825 });
826
827 safeDefineProperty(_ProxyFacade, PROXY_KEY, {
828 configurable: false,
829 writable: false,
830 enumerable: false,
831 value: proxyKey
832 });
833
834 safeDefineProperty(_ProxyFacade, 'toString', {
835 configurable: true,
836 writable: false,
837 enumerable: false,
838 value: function toString() {
839 return String(CurrentComponent);
840 }
841 });
842
843 function update(NextComponent) {
844 if (typeof NextComponent !== 'function') {
845 throw new Error('Expected a constructor.');
846 }
847
848 if (NextComponent === CurrentComponent) {
849 return;
850 }
851
852 // Prevent proxy cycles
853 var existingProxy = proxies.get(NextComponent);
854 if (existingProxy) {
855 return;
856 }
857
858 isFunctionalComponent = !isReactClass(NextComponent);
859
860 proxies.set(NextComponent, proxy);
861
862 proxyGeneration++;
863
864 // Save the next constructor so we call it
865 var PreviousComponent = CurrentComponent;
866 CurrentComponent = NextComponent;
867
868 // Try to infer displayName
869 var displayName = getComponentDisplayName(CurrentComponent);
870
871 safeDefineProperty(_ProxyFacade, 'displayName', {
872 configurable: true,
873 writable: false,
874 enumerable: true,
875 value: displayName
876 });
877
878 if (ProxyComponent) {
879 safeDefineProperty(ProxyComponent, 'name', {
880 value: displayName
881 });
882 }
883
884 savedDescriptors = transferStaticProps(_ProxyFacade, savedDescriptors, PreviousComponent, NextComponent);
885
886 if (isFunctionalComponent || !ProxyComponent) ; else {
887 var classHotReplacement = function classHotReplacement() {
888 getElementCloseHook(ProxyComponent);
889 checkLifeCycleMethods(ProxyComponent, NextComponent);
890 if (proxyGeneration > 1) {
891 filteredPrototypeMethods(ProxyComponent.prototype).forEach(function (methodName) {
892 if (!has.call(NextComponent.prototype, methodName)) {
893 delete ProxyComponent.prototype[methodName];
894 }
895 });
896 }
897 Object.setPrototypeOf(ProxyComponent.prototype, NextComponent.prototype);
898 defineProxyMethods(ProxyComponent, NextComponent.prototype);
899 if (proxyGeneration > 1) {
900 injectedMembers = mergeComponents(ProxyComponent, NextComponent, InitialComponent, lastInstance, injectedMembers);
901 }
902 getElementComparisonHook(ProxyComponent);
903 };
904
905 // Was constructed once
906 if (instancesCount > 0) {
907 classHotReplacement();
908 } else {
909 classUpdatePostponed = classHotReplacement;
910 }
911 }
912 }
913
914 update(InitialComponent);
915
916 var dereference = function dereference() {
917 proxies.delete(InitialComponent);
918 proxies.delete(_ProxyFacade);
919 proxies.delete(CurrentComponent);
920 };
921
922 proxy = { get: get$$1, update: update, dereference: dereference, getCurrent: function getCurrent() {
923 return CurrentComponent;
924 } };
925
926 proxies.set(InitialComponent, proxy);
927 proxies.set(_ProxyFacade, proxy);
928
929 safeDefineProperty(proxy, UNWRAP_PROXY, {
930 configurable: false,
931 writable: false,
932 enumerable: false,
933 value: getCurrent
934 });
935
936 return proxy;
937}
938
939var generation = 1;
940var hotComparisonCounter = 0;
941var hotComparisonRuns = 0;
942var nullFunction = function nullFunction() {
943 return {};
944};
945var onHotComparisonOpen = nullFunction;
946var onHotComparisonElement = nullFunction;
947var onHotComparisonClose = nullFunction;
948
949var setComparisonHooks = function setComparisonHooks(open, element, close) {
950 onHotComparisonOpen = open;
951 onHotComparisonElement = element;
952 onHotComparisonClose = close;
953};
954
955var getElementComparisonHook = function getElementComparisonHook(component) {
956 return onHotComparisonElement(component);
957};
958var getElementCloseHook = function getElementCloseHook(component) {
959 return onHotComparisonClose(component);
960};
961
962var hotComparisonOpen = function hotComparisonOpen() {
963 return hotComparisonCounter > 0 && hotComparisonRuns > 0;
964};
965
966var openGeneration = function openGeneration() {
967 return forEachKnownClass(onHotComparisonElement);
968};
969
970var closeGeneration = function closeGeneration() {
971 return forEachKnownClass(onHotComparisonClose);
972};
973
974var incrementHot = function incrementHot() {
975 if (!hotComparisonCounter) {
976 openGeneration();
977 onHotComparisonOpen();
978 }
979 hotComparisonCounter++;
980};
981var decrementHot = function decrementHot() {
982 hotComparisonCounter--;
983 if (!hotComparisonCounter) {
984 closeGeneration();
985 hotComparisonRuns++;
986 }
987};
988
989var enterHotUpdate = function enterHotUpdate() {
990 Promise.resolve(incrementHot()).then(function () {
991 return setTimeout(decrementHot, 0);
992 });
993};
994
995var increment = function increment() {
996 enterHotUpdate();
997 return generation++;
998};
999var get$1 = function get() {
1000 return generation;
1001};
1002
1003var merge = require('lodash/merge');
1004
1005var proxiesByID = void 0;
1006var blackListedProxies = void 0;
1007var registeredComponents = void 0;
1008var idsByType = void 0;
1009
1010var elementCount = 0;
1011var renderOptions = {};
1012
1013var componentOptions = void 0;
1014
1015var generateTypeId = function generateTypeId() {
1016 return 'auto-' + elementCount++;
1017};
1018
1019var getIdByType = function getIdByType(type) {
1020 return idsByType.get(type);
1021};
1022var isProxyType = function isProxyType(type) {
1023 return type[PROXY_KEY];
1024};
1025
1026var getProxyById = function getProxyById(id) {
1027 return proxiesByID[id];
1028};
1029var getProxyByType = function getProxyByType(type) {
1030 return getProxyById(getIdByType(type));
1031};
1032
1033var registerComponent = function registerComponent(type) {
1034 return registeredComponents.set(type, 1);
1035};
1036var isRegisteredComponent = function isRegisteredComponent(type) {
1037 return registeredComponents.has(type);
1038};
1039
1040var setStandInOptions = function setStandInOptions(options) {
1041 renderOptions = options;
1042};
1043
1044var updateFunctionProxyById = function updateFunctionProxyById(id, type, updater) {
1045 // Remember the ID.
1046 idsByType.set(type, id);
1047 var proxy = proxiesByID[id];
1048 if (!proxy) {
1049 idsByType.set(type, id);
1050 proxiesByID[id] = type;
1051 }
1052 updater(proxiesByID[id], type);
1053
1054 return proxiesByID[id];
1055};
1056
1057var updateProxyById = function updateProxyById(id, type) {
1058 var options = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {};
1059
1060 if (!id) {
1061 return null;
1062 }
1063 // Remember the ID.
1064 idsByType.set(type, id);
1065
1066 if (!proxiesByID[id]) {
1067 proxiesByID[id] = createClassProxy(type, id, merge({}, renderOptions, { proxy: componentOptions.get(type) || {} }, options));
1068 } else {
1069 proxiesByID[id].update(type);
1070 }
1071 return proxiesByID[id];
1072};
1073
1074var createProxyForType = function createProxyForType(type, options) {
1075 return getProxyByType(type) || updateProxyById(generateTypeId(), type, options);
1076};
1077
1078var isColdType = function isColdType(type) {
1079 return blackListedProxies.has(type);
1080};
1081
1082var isTypeBlacklisted = function isTypeBlacklisted(type) {
1083 return isColdType(type) || isCompositeComponent(type) && (configuration.ignoreSFC && !isReactClass(type) || configuration.ignoreComponents && isReactClass(type));
1084};
1085var blacklistByType = function blacklistByType(type) {
1086 return blackListedProxies.set(type, true);
1087};
1088
1089var setComponentOptions = function setComponentOptions(component, options) {
1090 return componentOptions.set(component, options);
1091};
1092
1093var resetProxies = function resetProxies() {
1094 proxiesByID = {};
1095 idsByType = new WeakMap();
1096 blackListedProxies = new WeakMap();
1097 registeredComponents = new WeakMap();
1098 componentOptions = new WeakMap();
1099 resetClassProxies();
1100};
1101
1102resetProxies();
1103
1104var tune = {
1105 allowSFC: false
1106};
1107
1108var preactAdapter = function preactAdapter(instance, resolveType) {
1109 var oldHandler = instance.options.vnode;
1110
1111 setConfiguration(tune);
1112
1113 instance.options.vnode = function (vnode) {
1114 vnode.nodeName = resolveType(vnode.nodeName);
1115 if (oldHandler) {
1116 oldHandler(vnode);
1117 }
1118 };
1119};
1120
1121/* global document */
1122
1123var lastError = [];
1124
1125var overlayStyle = {
1126 position: 'fixed',
1127 left: 0,
1128 top: 0,
1129 right: 0,
1130
1131 backgroundColor: 'rgba(255,200,200,0.9)',
1132
1133 color: '#000',
1134 fontFamily: '-apple-system, BlinkMacSystemFont, "Segoe UI", "Roboto", "Oxygen", "Ubuntu", "Fira Sans", "Droid Sans", "Helvetica Neue", sans-serif',
1135 fontSize: '12px',
1136 margin: 0,
1137 padding: '16px',
1138 maxHeight: '50%',
1139 overflow: 'auto'
1140};
1141
1142var inlineErrorStyle = {
1143 backgroundColor: '#FEE'
1144};
1145
1146var liCounter = {
1147 position: 'absolute',
1148 left: '10px'
1149};
1150
1151var listStyle = {};
1152
1153var EmptyErrorPlaceholder = function EmptyErrorPlaceholder(_ref) {
1154 var component = _ref.component;
1155 return React__default.createElement(
1156 'span',
1157 { style: inlineErrorStyle, role: 'img', 'aria-label': 'Rect-Hot-Loader Error' },
1158 '\u269B\uFE0F\uD83D\uDD25\uD83E\uDD15 (',
1159 component ? getComponentDisplayName(component.constructor || component) : 'Unknown location',
1160 ')',
1161 component && component.retryHotLoaderError && React__default.createElement(
1162 'button',
1163 { onClick: function onClick() {
1164 return component.retryHotLoaderError();
1165 }, title: 'Retry' },
1166 '\u27F3'
1167 )
1168 );
1169};
1170
1171var errorHeader = function errorHeader(component, componentStack) {
1172 if (component || componentStack) {
1173 return React__default.createElement(
1174 'span',
1175 null,
1176 '(',
1177 component ? getComponentDisplayName(component.constructor || component) : 'Unknown location',
1178 component && ', ',
1179 componentStack && componentStack.split('\n').filter(Boolean)[0],
1180 ')'
1181 );
1182 }
1183 return null;
1184};
1185
1186var mapError = function mapError(_ref2) {
1187 var error = _ref2.error,
1188 errorInfo = _ref2.errorInfo,
1189 component = _ref2.component;
1190 return React__default.createElement(
1191 React__default.Fragment,
1192 null,
1193 React__default.createElement(
1194 'p',
1195 { style: { color: 'red' } },
1196 errorHeader(component, errorInfo && errorInfo.componentStack),
1197 ' ',
1198 error.toString ? error.toString() : error.message || 'undefined error'
1199 ),
1200 errorInfo && errorInfo.componentStack ? React__default.createElement(
1201 'div',
1202 null,
1203 React__default.createElement(
1204 'div',
1205 null,
1206 'Stack trace:'
1207 ),
1208 React__default.createElement(
1209 'ul',
1210 { style: { color: 'red', marginTop: '10px' } },
1211 error.stack.split('\n').slice(1, 2).map(function (line, i) {
1212 return React__default.createElement(
1213 'li',
1214 { key: String(i) },
1215 line
1216 );
1217 }),
1218 React__default.createElement('hr', null),
1219 errorInfo.componentStack.split('\n').filter(Boolean).map(function (line, i) {
1220 return React__default.createElement(
1221 'li',
1222 { key: String(i) },
1223 line
1224 );
1225 })
1226 )
1227 ) : error.stack && React__default.createElement(
1228 'div',
1229 null,
1230 React__default.createElement(
1231 'div',
1232 null,
1233 'Stack trace:'
1234 ),
1235 React__default.createElement(
1236 'ul',
1237 { style: { color: 'red', marginTop: '10px' } },
1238 error.stack.split('\n').map(function (line, i) {
1239 return React__default.createElement(
1240 'li',
1241 { key: String(i) },
1242 line
1243 );
1244 })
1245 )
1246 )
1247 );
1248};
1249
1250var ErrorOverlay = function (_React$Component) {
1251 inherits(ErrorOverlay, _React$Component);
1252
1253 function ErrorOverlay() {
1254 var _temp, _this, _ret;
1255
1256 classCallCheck(this, ErrorOverlay);
1257
1258 for (var _len = arguments.length, args = Array(_len), _key = 0; _key < _len; _key++) {
1259 args[_key] = arguments[_key];
1260 }
1261
1262 return _ret = (_temp = (_this = possibleConstructorReturn(this, _React$Component.call.apply(_React$Component, [this].concat(args))), _this), _this.state = {
1263 visible: true
1264 }, _this.toggle = function () {
1265 return _this.setState({ visible: !_this.state.visible });
1266 }, _this.retry = function () {
1267 return _this.setState(function () {
1268 var errors = _this.props.errors;
1269
1270 enterHotUpdate();
1271 clearExceptions();
1272 errors.map(function (_ref3) {
1273 var component = _ref3.component;
1274 return component;
1275 }).filter(Boolean).filter(function (_ref4) {
1276 var retryHotLoaderError = _ref4.retryHotLoaderError;
1277 return !!retryHotLoaderError;
1278 }).forEach(function (component) {
1279 return component.retryHotLoaderError();
1280 });
1281
1282 return {};
1283 });
1284 }, _temp), possibleConstructorReturn(_this, _ret);
1285 }
1286
1287 ErrorOverlay.prototype.render = function render() {
1288 var errors = this.props.errors;
1289
1290 if (!errors.length) {
1291 return null;
1292 }
1293 var visible = this.state.visible;
1294
1295 return React__default.createElement(
1296 'div',
1297 { style: overlayStyle },
1298 React__default.createElement(
1299 'h2',
1300 { style: { margin: 0 } },
1301 '\u269B\uFE0F\uD83D\uDD25\uD83D\uDE2D: hot update was not successful ',
1302 React__default.createElement(
1303 'button',
1304 { onClick: this.toggle },
1305 visible ? 'collapse' : 'expand'
1306 ),
1307 React__default.createElement(
1308 'button',
1309 { onClick: this.retry },
1310 'Retry'
1311 )
1312 ),
1313 visible && React__default.createElement(
1314 'ul',
1315 { style: listStyle },
1316 errors.map(function (err, i) {
1317 return React__default.createElement(
1318 'li',
1319 { key: i },
1320 React__default.createElement(
1321 'span',
1322 { style: liCounter },
1323 '(',
1324 i + 1,
1325 '/',
1326 errors.length,
1327 ')'
1328 ),
1329 mapError(err)
1330 );
1331 })
1332 )
1333 );
1334 };
1335
1336 return ErrorOverlay;
1337}(React__default.Component);
1338
1339var initErrorOverlay = function initErrorOverlay() {
1340 if (typeof document === 'undefined' || !document.body) {
1341 return;
1342 }
1343 var div = document.querySelector('.react-hot-loader-error-overlay');
1344 if (!div) {
1345 div = document.createElement('div');
1346 div.className = 'react-hot-loader-error-overlay';
1347 document.body.appendChild(div);
1348 }
1349 if (lastError.length) {
1350 var Overlay = configuration.ErrorOverlay || ErrorOverlay;
1351 ReactDOM.render(React__default.createElement(Overlay, { errors: lastError }), div);
1352 } else {
1353 div.parentNode.removeChild(div);
1354 }
1355};
1356
1357function clearExceptions() {
1358 if (lastError.length) {
1359 lastError = [];
1360 initErrorOverlay();
1361 }
1362}
1363
1364function logException(error, errorInfo, component) {
1365 // do not suppress error
1366
1367 /* eslint-disable no-console */
1368 console.error(error);
1369 /* eslint-enable */
1370
1371 lastError.push({ error: error, errorInfo: errorInfo, component: component });
1372 initErrorOverlay();
1373}
1374
1375/* eslint-disable no-underscore-dangle */
1376
1377var hotRenderWithHooks = ReactDOM.hotRenderWithHooks || function (fiber, render) {
1378 return render();
1379};
1380
1381function pushStack(stack, node) {
1382 stack.type = node.type;
1383 stack.elementType = node.elementType || node.type;
1384 stack.children = [];
1385 stack.instance = typeof node.type === 'function' ? node.stateNode : stack;
1386 stack.fiber = node;
1387
1388 if (!stack.instance) {
1389 stack.instance = {
1390 SFC_fake: stack.type,
1391 props: {},
1392 render: function render() {
1393 return hotRenderWithHooks(node, function () {
1394 return stack.type(stack.instance.props);
1395 });
1396 }
1397 };
1398 }
1399}
1400
1401function hydrateFiberStack(node, stack) {
1402 pushStack(stack, node);
1403 if (node.child) {
1404 var child = node.child;
1405
1406 do {
1407 var childStack = {};
1408 hydrateFiberStack(child, childStack);
1409 stack.children.push(childStack);
1410 child = child.sibling;
1411 } while (child);
1412 }
1413}
1414
1415/* eslint-disable no-underscore-dangle */
1416
1417function pushState(stack, type, instance) {
1418 stack.type = type;
1419 stack.elementType = type;
1420 stack.children = [];
1421 stack.instance = instance || stack;
1422
1423 if (typeof type === 'function' && type.isStatelessFunctionalProxy) {
1424 // In React 15 SFC is wrapped by component. We have to detect our proxies and change the way it works
1425 stack.instance = {
1426 SFC_fake: type,
1427 props: {},
1428 render: function render() {
1429 return type(stack.instance.props);
1430 }
1431 };
1432 }
1433}
1434
1435function hydrateLegacyStack(node, stack) {
1436 if (node._currentElement) {
1437 pushState(stack, node._currentElement.type, node._instance || stack);
1438 }
1439
1440 if (node._renderedComponent) {
1441 var childStack = {};
1442 hydrateLegacyStack(node._renderedComponent, childStack);
1443 stack.children.push(childStack);
1444 } else if (node._renderedChildren) {
1445 Object.keys(node._renderedChildren).forEach(function (key) {
1446 var childStack = {};
1447 hydrateLegacyStack(node._renderedChildren[key], childStack);
1448 stack.children.push(childStack);
1449 });
1450 }
1451}
1452
1453/* eslint-disable no-underscore-dangle */
1454
1455function getReactStack(instance) {
1456 var rootNode = getInternalInstance(instance);
1457 var stack = {};
1458 if (rootNode) {
1459 // React stack
1460 var isFiber = typeof rootNode.tag === 'number';
1461 if (isFiber) {
1462 hydrateFiberStack(rootNode, stack);
1463 } else {
1464 hydrateLegacyStack(rootNode, stack);
1465 }
1466 }
1467
1468 return stack;
1469}
1470
1471var markUpdate = function markUpdate(_ref) {
1472 var fiber = _ref.fiber;
1473
1474 if (!fiber) {
1475 return;
1476 }
1477 fiber.expirationTime = 1;
1478 if (fiber.alternate) {
1479 fiber.alternate.expirationTime = 1;
1480 fiber.alternate.type = fiber.type;
1481 }
1482
1483 if (fiber.memoizedProps && _typeof(fiber.memoizedProps) === 'object') {
1484 fiber.memoizedProps = _extends({
1485 cacheBusterProp: true
1486 }, fiber.memoizedProps);
1487 }
1488
1489 if (fiber.stateNode) ;
1490};
1491
1492var cleanupReact = function cleanupReact() {
1493 if (ReactDOM.hotCleanup) {
1494 ReactDOM.hotCleanup();
1495 }
1496};
1497
1498var deepMarkUpdate = function deepMarkUpdate(stack) {
1499 markUpdate(stack);
1500 if (stack.children) {
1501 stack.children.forEach(deepMarkUpdate);
1502 }
1503};
1504
1505// some `empty` names, React can autoset display name to...
1506var UNDEFINED_NAMES = {
1507 Unknown: true,
1508 Component: true
1509};
1510
1511var areNamesEqual = function areNamesEqual(a, b) {
1512 return a === b || UNDEFINED_NAMES[a] && UNDEFINED_NAMES[b];
1513};
1514
1515var isFunctional = function isFunctional(fn) {
1516 return typeof fn === 'function';
1517};
1518var getTypeOf = function getTypeOf(type) {
1519 if (isReactClass(type)) return 'ReactComponent';
1520 if (isFunctional(type)) return 'StatelessFunctional';
1521 return 'Fragment'; // ?
1522};
1523
1524var haveTextSimilarity = function haveTextSimilarity(a, b) {
1525 return (
1526 // equal or slight changed
1527 a === b || levenshtein.get(a, b) < a.length * 0.2
1528 );
1529};
1530
1531var getBaseProto = function getBaseProto(source) {
1532 return source.prototype.hotComponentRender ? Object.getPrototypeOf(source.prototype) : source.prototype;
1533};
1534
1535var equalClasses = function equalClasses(a, b) {
1536 var prototypeA = getBaseProto(a);
1537 var prototypeB = getBaseProto(b);
1538
1539 var hits = 0;
1540 var misses = 0;
1541 var comparisons = 0;
1542 Object.getOwnPropertyNames(prototypeA).forEach(function (key) {
1543 var descriptorA = Object.getOwnPropertyDescriptor(prototypeA, key);
1544 var valueA = descriptorA && (descriptorA.value || descriptorA.get || descriptorA.set);
1545 var descriptorB = Object.getOwnPropertyDescriptor(prototypeB, key);
1546 var valueB = descriptorB && (descriptorB.value || descriptorB.get || descriptorB.set);
1547
1548 if (typeof valueA === 'function' && key !== 'constructor') {
1549 comparisons++;
1550 if (haveTextSimilarity(String(valueA), String(valueB))) {
1551 hits++;
1552 } else {
1553 misses++;
1554 if (key === 'render') {
1555 misses++;
1556 }
1557 }
1558 }
1559 });
1560 // allow to add or remove one function
1561 return hits > 0 && misses <= 1 || comparisons === 0;
1562};
1563
1564var areSwappable = function areSwappable(a, b) {
1565 // both are registered components and have the same name
1566 if (getIdByType(b) && getIdByType(a) === getIdByType(b)) {
1567 return true;
1568 }
1569 if (getTypeOf(a) !== getTypeOf(b)) {
1570 return false;
1571 }
1572 if (isReactClass(a)) {
1573 return areNamesEqual(getComponentDisplayName(a), getComponentDisplayName(b)) && equalClasses(a, b);
1574 }
1575
1576 if (isFunctional(a)) {
1577 var nameA = getComponentDisplayName(a);
1578 return areNamesEqual(nameA, getComponentDisplayName(b)) || nameA !== 'Component' && haveTextSimilarity(String(a), String(b));
1579 }
1580 return false;
1581};
1582
1583var shouldNotPatchComponent = function shouldNotPatchComponent(type) {
1584 return isTypeBlacklisted(type);
1585};
1586
1587function resolveType(type) {
1588 var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};
1589
1590 if (isLazyType({ type: type }) || isMemoType({ type: type }) || isForwardType({ type: type })) {
1591 return getProxyByType(type) || type;
1592 }
1593
1594 if (!isCompositeComponent(type) || isProxyType(type)) {
1595 return type;
1596 }
1597
1598 var existingProxy = getProxyByType(type);
1599
1600 if (shouldNotPatchComponent(type)) {
1601 return existingProxy ? existingProxy.getCurrent() : type;
1602 }
1603
1604 if (!existingProxy && configuration.onComponentCreate) {
1605 configuration.onComponentCreate(type, getComponentDisplayName(type));
1606 if (shouldNotPatchComponent(type)) return type;
1607 }
1608
1609 var proxy = internalConfiguration.disableProxyCreation ? existingProxy : createProxyForType(type, options);
1610
1611 return proxy ? proxy.get() : type;
1612}
1613
1614var renderStack = [];
1615
1616var stackReport = function stackReport() {
1617 var rev = renderStack.slice().reverse();
1618 logger.warn('in', rev[0].name, rev);
1619};
1620
1621var emptyMap = new Map();
1622var stackContext = function stackContext() {
1623 return (renderStack[renderStack.length - 1] || {}).context || emptyMap;
1624};
1625
1626var shouldUseRenderMethod = function shouldUseRenderMethod(fn) {
1627 return fn && (isReactClassInstance(fn) || fn.SFC_fake);
1628};
1629
1630var getElementType = function getElementType(child) {
1631 return child.type[UNWRAP_PROXY] ? child.type[UNWRAP_PROXY]() : child.type;
1632};
1633
1634var filterNullArray = function filterNullArray(a) {
1635 if (!a) return [];
1636 return a.filter(function (x) {
1637 return !!x;
1638 });
1639};
1640
1641var unflatten = function unflatten(a) {
1642 return a.reduce(function (acc, a) {
1643 if (Array.isArray(a)) {
1644 acc.push.apply(acc, unflatten(a));
1645 } else {
1646 acc.push(a);
1647 }
1648 return acc;
1649 }, []);
1650};
1651
1652var isArray = function isArray(fn) {
1653 return Array.isArray(fn);
1654};
1655var asArray = function asArray(a) {
1656 return isArray(a) ? a : [a];
1657};
1658
1659var render = function render(component) {
1660 if (!component) {
1661 return [];
1662 }
1663 if (component.hotComponentUpdate) {
1664 component.hotComponentUpdate();
1665 }
1666 if (shouldUseRenderMethod(component)) {
1667 // not calling real render method to prevent call recursion.
1668 // stateless components does not have hotComponentRender
1669 return component.hotComponentRender ? component.hotComponentRender() : component.render();
1670 }
1671 if (isForwardType(component)) {
1672 return component.type.render(component.props, null);
1673 }
1674 if (isArray(component)) {
1675 return component.map(render);
1676 }
1677 if (component.children) {
1678 return component.children;
1679 }
1680
1681 return [];
1682};
1683
1684var NO_CHILDREN = { children: [] };
1685var mapChildren = function mapChildren(children, instances) {
1686 return {
1687 children: children.filter(function (c) {
1688 return c;
1689 }).map(function (child, index) {
1690 if ((typeof child === 'undefined' ? 'undefined' : _typeof(child)) !== 'object' || child.isMerged) {
1691 return child;
1692 }
1693 var instanceLine = instances[index] || {};
1694 var oldChildren = asArray(instanceLine.children || []);
1695
1696 if (Array.isArray(child)) {
1697 return _extends({
1698 type: null
1699 }, mapChildren(child, oldChildren));
1700 }
1701
1702 var newChildren = asArray(child.props && child.props.children || child.children || []);
1703 var nextChildren = child.type !== 'function' && oldChildren.length && mapChildren(newChildren, oldChildren);
1704
1705 return _extends({
1706 nextProps: child.props,
1707 isMerged: true
1708 }, instanceLine, nextChildren || {}, {
1709 type: child.type
1710 });
1711 })
1712 };
1713};
1714
1715var mergeInject = function mergeInject(a, b, instance) {
1716 if (a && !Array.isArray(a)) {
1717 return mergeInject([a], b);
1718 }
1719 if (b && !Array.isArray(b)) {
1720 return mergeInject(a, [b]);
1721 }
1722
1723 if (!a || !b) {
1724 return NO_CHILDREN;
1725 }
1726 if (a.length === b.length) {
1727 return mapChildren(a, b);
1728 }
1729
1730 // in some cases (no confidence here) B could contain A except null children
1731 // in some cases - could not.
1732 // this depends on React version and the way you build component.
1733
1734 var nonNullA = filterNullArray(a);
1735 if (nonNullA.length === b.length) {
1736 return mapChildren(nonNullA, b);
1737 }
1738
1739 var flatA = unflatten(nonNullA);
1740 var flatB = unflatten(b);
1741 if (flatA.length === flatB.length) {
1742 return mapChildren(flatA, flatB);
1743 }
1744 if (flatB.length === 0 && flatA.length === 1 && _typeof(flatA[0]) !== 'object') ; else {
1745 logger.warn('React-hot-loader: unable to merge ', a, 'and children of ', instance);
1746 stackReport();
1747 }
1748 return NO_CHILDREN;
1749};
1750
1751var transformFlowNode = function transformFlowNode(flow) {
1752 return flow.reduce(function (acc, node) {
1753 if (node && isFragmentNode(node)) {
1754 if (node.props && node.props.children) {
1755 return [].concat(acc, filterNullArray(asArray(node.props.children)));
1756 }
1757 if (node.children) {
1758 return [].concat(acc, filterNullArray(asArray(node.children)));
1759 }
1760 }
1761 return [].concat(acc, [node]);
1762 }, []);
1763};
1764
1765var scheduledUpdates = [];
1766var scheduledUpdate = 0;
1767
1768var flushScheduledUpdates = function flushScheduledUpdates() {
1769 var instances = scheduledUpdates;
1770 scheduledUpdates = [];
1771 scheduledUpdate = 0;
1772 instances.forEach(function (instance) {
1773 return instance[PROXY_IS_MOUNTED] && updateInstance(instance);
1774 });
1775};
1776
1777var unscheduleUpdate = function unscheduleUpdate(instance) {
1778 scheduledUpdates = scheduledUpdates.filter(function (inst) {
1779 return inst !== instance;
1780 });
1781};
1782
1783var scheduleInstanceUpdate = function scheduleInstanceUpdate(instance) {
1784 scheduledUpdates.push(instance);
1785 if (!scheduledUpdate) {
1786 scheduledUpdate = setTimeout(flushScheduledUpdates, 4);
1787 }
1788};
1789
1790var hotReplacementRender = function hotReplacementRender(instance, stack) {
1791 if (isReactClassInstance(instance)) {
1792 var type = getElementType(stack);
1793
1794 renderStack.push({
1795 name: getComponentDisplayName(type),
1796 type: type,
1797 props: stack.instance.props,
1798 context: stackContext()
1799 });
1800 }
1801
1802 try {
1803 var flow = transformFlowNode(filterNullArray(asArray(render(instance))));
1804
1805 var children = stack.children;
1806
1807
1808 flow.forEach(function (child, index) {
1809 var childType = child.type;
1810 var stackChild = children[index];
1811 var next = function next(instance) {
1812 // copy over props as long new component may be hidden inside them
1813 // child does not have all props, as long some of them can be calculated on componentMount.
1814 var realProps = instance.props;
1815 var nextProps = _extends({}, realProps, child.nextProps || {}, child.props || {});
1816
1817 if (isReactClassInstance(instance) && instance.componentWillUpdate) {
1818 // Force-refresh component (bypass redux renderedComponent)
1819 instance.componentWillUpdate(_extends({}, realProps), instance.state);
1820 }
1821 instance.props = nextProps;
1822 hotReplacementRender(instance, stackChild);
1823 instance.props = realProps;
1824 };
1825
1826 // text node
1827 if ((typeof child === 'undefined' ? 'undefined' : _typeof(child)) !== 'object' || !stackChild || !stackChild.instance) {
1828 if (stackChild && stackChild.children && stackChild.children.length) {
1829 logger.error('React-hot-loader: reconciliation failed', 'could not dive into [', child, '] while some elements are still present in the tree.');
1830 stackReport();
1831 }
1832 return;
1833 }
1834
1835 // comparing rendered type to fiber.ElementType
1836 if ((typeof childType === 'undefined' ? 'undefined' : _typeof(childType)) !== _typeof(stackChild.elementType)) {
1837 // Portals could generate undefined !== null
1838 if (childType && stackChild.type) {
1839 logger.warn('React-hot-loader: got ', childType, 'instead of', stackChild.type);
1840 stackReport();
1841 }
1842 return;
1843 }
1844
1845 if (isMemoType(child) || isLazyType(child)) {
1846 // force update memo children
1847 if (stackChild.children && stackChild.children[0]) {
1848 scheduleInstanceUpdate(stackChild.children[0].instance);
1849 }
1850 childType = childType.type || childType;
1851 }
1852
1853 if (isForwardType(child)) {
1854 next(stackChild.instance);
1855 } else if (isContextConsumer(child)) {
1856 try {
1857 var contextValue = stackContext().get(getContextProvider(childType));
1858 next({
1859 children: (child.props ? child.props.children : child.children[0])(contextValue !== undefined ? contextValue : childType[CONTEXT_CURRENT_VALUE])
1860 });
1861 } catch (e) {
1862 // do nothing, yet
1863 }
1864 } else if (typeof childType !== 'function') {
1865 // React
1866 var childName = childType ? getComponentDisplayName(childType) : 'empty';
1867 var extraContext = stackContext();
1868
1869 if (isContextProvider(child)) {
1870 extraContext = new Map(extraContext);
1871 extraContext.set(getContextProvider(childType), _extends({}, child.nextProps || {}, child.props || {}).value);
1872 childName = 'ContextProvider';
1873 }
1874
1875 renderStack.push({
1876 name: childName,
1877 type: childType,
1878 props: stack.instance.props,
1879 context: extraContext
1880 });
1881
1882 next(
1883 // move types from render to the instances of hydrated tree
1884 mergeInject(transformFlowNode(asArray(child.props ? child.props.children : child.children)), stackChild.instance.children, stackChild.instance));
1885 renderStack.pop();
1886 } else {
1887 if (childType === stackChild.type) {
1888 next(stackChild.instance);
1889 } else {
1890 // unwrap proxy
1891 var _childType = getElementType(child);
1892
1893 if (isMemoType(child)) {
1894 _childType = _childType.type || _childType;
1895 }
1896
1897 if (!stackChild.type[PROXY_KEY]) {
1898 if (!reactHotLoader.IS_REACT_MERGE_ENABLED) {
1899 if (isTypeBlacklisted(stackChild.type)) {
1900 logger.warn('React-hot-loader: cold element got updated ', stackChild.type);
1901 }
1902 }
1903 }
1904
1905 if (isRegisteredComponent(_childType) || isRegisteredComponent(stackChild.type)) {
1906 // one of elements are registered via babel plugin, and should not be handled by hot swap
1907 if (resolveType(_childType) === resolveType(stackChild.type)) {
1908 next(stackChild.instance);
1909 }
1910 } else if (areSwappable(_childType, stackChild.type)) {
1911 // they are both registered, or have equal code/displayname/signature
1912
1913 // update proxy using internal PROXY_KEY
1914 updateProxyById(stackChild.type[PROXY_KEY] || getIdByType(stackChild.type), _childType);
1915
1916 next(stackChild.instance);
1917 } else {
1918 logger.warn('React-hot-loader: a ' + getComponentDisplayName(_childType) + ' was found where a ' + getComponentDisplayName(stackChild) + ' was expected.\n ' + _childType);
1919 stackReport();
1920 }
1921 }
1922
1923 scheduleInstanceUpdate(stackChild.instance);
1924 }
1925 });
1926 } catch (e) {
1927 if (e.then) ; else {
1928 logger.warn('React-hot-loader: run time error during reconciliation', e);
1929 }
1930 }
1931
1932 if (isReactClassInstance(instance)) {
1933 renderStack.pop();
1934 }
1935};
1936
1937var hotReplacementRender$1 = (function (instance, stack) {
1938 if (configuration.disableHotRenderer) {
1939 return;
1940 }
1941 try {
1942 // disable reconciler to prevent upcoming components from proxying.
1943 internalConfiguration.disableProxyCreation = true;
1944 renderStack = [];
1945 hotReplacementRender(instance, stack);
1946 } catch (e) {
1947 logger.warn('React-hot-loader: reconcilation failed due to error', e);
1948 } finally {
1949 internalConfiguration.disableProxyCreation = false;
1950 }
1951});
1952
1953var reconcileHotReplacement = function reconcileHotReplacement(ReactInstance) {
1954 var stack = getReactStack(ReactInstance);
1955 hotReplacementRender$1(ReactInstance, stack);
1956 cleanupReact();
1957 deepMarkUpdate(stack);
1958};
1959
1960var renderReconciler = function renderReconciler(target, force) {
1961 // we are not inside parent reconcilation
1962 var currentGeneration = get$1();
1963 var componentGeneration = target[RENDERED_GENERATION];
1964
1965 target[RENDERED_GENERATION] = currentGeneration;
1966
1967 if (!internalConfiguration.disableProxyCreation) {
1968 if ((componentGeneration || force) && componentGeneration !== currentGeneration) {
1969 enterHotUpdate();
1970 reconcileHotReplacement(target);
1971 return true;
1972 }
1973 }
1974 return false;
1975};
1976
1977function asyncReconciledRender(target) {
1978 renderReconciler(target, false);
1979}
1980
1981function proxyWrapper(element) {
1982 // post wrap on post render
1983 if (!internalConfiguration.disableProxyCreation) {
1984 unscheduleUpdate(this);
1985 }
1986
1987 if (!element) {
1988 return element;
1989 }
1990 if (Array.isArray(element)) {
1991 return element.map(proxyWrapper);
1992 }
1993 if (typeof element.type === 'function') {
1994 var proxy = getProxyByType(element.type);
1995 if (proxy) {
1996 return _extends({}, element, {
1997 type: proxy.get()
1998 });
1999 }
2000 }
2001 return element;
2002}
2003
2004var ERROR_STATE = 'react_hot_loader_catched_error';
2005var ERROR_STATE_PROTO = 'react_hot_loader_catched_error-prototype';
2006var OLD_RENDER = 'react_hot_loader_original_render';
2007
2008function componentDidCatch(error, errorInfo) {
2009 this[ERROR_STATE] = {
2010 location: 'boundary',
2011 error: error,
2012 errorInfo: errorInfo,
2013 generation: get$1()
2014 };
2015 Object.getPrototypeOf(this)[ERROR_STATE_PROTO] = this[ERROR_STATE];
2016 if (!configuration.errorReporter) {
2017 logException(error, errorInfo, this);
2018 }
2019 this.forceUpdate();
2020}
2021
2022function componentRender() {
2023 var _ref = this[ERROR_STATE] || {},
2024 error = _ref.error,
2025 errorInfo = _ref.errorInfo,
2026 generation = _ref.generation;
2027
2028 if (error && generation === get$1()) {
2029 return React__default.createElement(configuration.errorReporter || EmptyErrorPlaceholder, {
2030 error: error,
2031 errorInfo: errorInfo,
2032 component: this
2033 });
2034 }
2035
2036 if (this.hotComponentUpdate) {
2037 this.hotComponentUpdate();
2038 }
2039 try {
2040 var _OLD_RENDER$render;
2041
2042 for (var _len = arguments.length, args = Array(_len), _key = 0; _key < _len; _key++) {
2043 args[_key] = arguments[_key];
2044 }
2045
2046 return (_OLD_RENDER$render = this[OLD_RENDER].render).call.apply(_OLD_RENDER$render, [this].concat(args));
2047 } catch (renderError) {
2048 this[ERROR_STATE] = {
2049 location: 'render',
2050 error: renderError,
2051 generation: get$1()
2052 };
2053 if (!configuration.errorReporter) {
2054 logException(renderError, undefined, this);
2055 }
2056 return componentRender.call(this);
2057 }
2058}
2059
2060function retryHotLoaderError() {
2061 delete this[ERROR_STATE];
2062 this.forceUpdate();
2063}
2064
2065setComparisonHooks(function () {
2066 return {};
2067}, function (component) {
2068 if (!hotComparisonOpen()) {
2069 return;
2070 }
2071 var prototype = component.prototype;
2072
2073 if (!prototype[OLD_RENDER]) {
2074 var renderDescriptior = Object.getOwnPropertyDescriptor(prototype, 'render');
2075 prototype[OLD_RENDER] = {
2076 descriptor: renderDescriptior ? renderDescriptior.value : undefined,
2077 render: prototype.render
2078 };
2079 prototype.componentDidCatch = componentDidCatch;
2080 prototype.retryHotLoaderError = retryHotLoaderError;
2081
2082 prototype.render = componentRender;
2083 }
2084 delete prototype[ERROR_STATE];
2085}, function (_ref2) {
2086 var prototype = _ref2.prototype;
2087
2088 if (prototype[OLD_RENDER]) {
2089 var _ref3 = prototype[ERROR_STATE_PROTO] || {},
2090 generation = _ref3.generation;
2091
2092 if (generation === get$1()) ; else {
2093 delete prototype.componentDidCatch;
2094 delete prototype.retryHotLoaderError;
2095 if (!prototype[OLD_RENDER].descriptor) {
2096 delete prototype.render;
2097 } else {
2098 prototype.render = prototype[OLD_RENDER].descriptor;
2099 }
2100 delete prototype[ERROR_STATE_PROTO];
2101 delete prototype[OLD_RENDER];
2102 }
2103 }
2104});
2105
2106setStandInOptions({
2107 componentWillRender: asyncReconciledRender,
2108 componentDidRender: proxyWrapper,
2109 componentDidUpdate: function componentDidUpdate(component) {
2110 component[RENDERED_GENERATION] = get$1();
2111 flushScheduledUpdates();
2112 }
2113});
2114
2115var AppContainer = function (_React$Component) {
2116 inherits(AppContainer, _React$Component);
2117
2118 AppContainer.getDerivedStateFromProps = function getDerivedStateFromProps(nextProps, prevState) {
2119 if (prevState.generation !== get$1()) {
2120 // Hot reload is happening.
2121 return {
2122 error: null,
2123 generation: get$1()
2124 };
2125 }
2126 return null;
2127 };
2128
2129 function AppContainer(props) {
2130 classCallCheck(this, AppContainer);
2131
2132 var _this = possibleConstructorReturn(this, _React$Component.call(this, props));
2133
2134 if (configuration.showReactDomPatchNotification) {
2135 configuration.showReactDomPatchNotification = false;
2136 console.warn('React-Hot-Loader: react-🔥-dom patch is not detected. React 16.6+ features may not work.');
2137 }
2138
2139 _this.state = {
2140 error: null,
2141 errorInfo: null,
2142 // eslint-disable-next-line react/no-unused-state
2143 generation: 0
2144 };
2145 return _this;
2146 }
2147
2148 AppContainer.prototype.shouldComponentUpdate = function shouldComponentUpdate(prevProps, prevState) {
2149 // Don't update the component if the state had an error and still has one.
2150 // This allows to break an infinite loop of error -> render -> error -> render
2151 // https://github.com/gaearon/react-hot-loader/issues/696
2152 if (prevState.error && this.state.error) {
2153 return false;
2154 }
2155
2156 return true;
2157 };
2158
2159 AppContainer.prototype.componentDidCatch = function componentDidCatch(error, errorInfo) {
2160 logger.error(error);
2161
2162 if (!hotComparisonOpen()) {
2163 // do not log error outside of HMR cycle
2164
2165 // trigger update to kick error
2166 this.setState({});
2167 throw error;
2168 }
2169 var _props$errorReporter = this.props.errorReporter,
2170 errorReporter = _props$errorReporter === undefined ? configuration.errorReporter : _props$errorReporter;
2171
2172 if (!errorReporter) {
2173 logException(error, errorInfo, this);
2174 }
2175 this.setState({
2176 error: error,
2177 errorInfo: errorInfo
2178 });
2179 };
2180
2181 AppContainer.prototype.retryHotLoaderError = function retryHotLoaderError$$1() {
2182 var _this2 = this;
2183
2184 this.setState({ error: null }, function () {
2185 retryHotLoaderError.call(_this2);
2186 });
2187 };
2188
2189 AppContainer.prototype.render = function render() {
2190 var _state = this.state,
2191 error = _state.error,
2192 errorInfo = _state.errorInfo;
2193 var _props$errorReporter2 = this.props.errorReporter,
2194 ErrorReporter = _props$errorReporter2 === undefined ? configuration.errorReporter || EmptyErrorPlaceholder : _props$errorReporter2;
2195
2196
2197 if (error && this.props.errorBoundary) {
2198 return React__default.createElement(ErrorReporter, { error: error, errorInfo: errorInfo, component: this });
2199 }
2200
2201 if (this.hotComponentUpdate) {
2202 this.hotComponentUpdate();
2203 } else {
2204 throw new Error('React-Hot-Loader: AppContainer should be patched');
2205 }
2206
2207 return React__default.Children.only(this.props.children);
2208 };
2209
2210 return AppContainer;
2211}(React__default.Component);
2212
2213AppContainer.reactHotLoadable = false;
2214
2215
2216AppContainer.propTypes = {
2217 children: function children(props) {
2218 if (React__default.Children.count(props.children) !== 1) {
2219 return new Error('Invalid prop "children" supplied to AppContainer. ' + 'Expected a single React element with your app’s root component, e.g. <App />.');
2220 }
2221
2222 return undefined;
2223 },
2224
2225 errorReporter: PropTypes.oneOfType([PropTypes.node, PropTypes.func]),
2226 errorBoundary: PropTypes.bool
2227};
2228
2229AppContainer.defaultProps = {
2230 errorBoundary: true
2231};
2232
2233// trying first react-lifecycles-compat.polyfill, then trying react-lifecycles-compat, which could be .default
2234var realPolyfill = defaultPolyfill.polyfill || defaultPolyfill__default;
2235realPolyfill(AppContainer);
2236
2237var lazyConstructor = '_ctor';
2238
2239var updateLazy = function updateLazy(target, type) {
2240 var ctor = type[lazyConstructor];
2241 if (target[lazyConstructor] !== type[lazyConstructor]) {
2242 // just execute `import` and RHL.register will do the job
2243 ctor();
2244 }
2245 if (!target[lazyConstructor].isPatchedByReactHotLoader) {
2246 target[lazyConstructor] = function () {
2247 return ctor().then(function (m) {
2248 var C = resolveType(m.default);
2249 // chunks has been updated - new hot loader process is taking a place
2250 enterHotUpdate();
2251 if (!React__default.forwardRef) {
2252 return {
2253 default: function _default(props) {
2254 return React__default.createElement(
2255 AppContainer,
2256 null,
2257 React__default.createElement(C, props)
2258 );
2259 }
2260 };
2261 }
2262 return {
2263 default: React__default.forwardRef(function (props, ref) {
2264 return React__default.createElement(
2265 AppContainer,
2266 null,
2267 React__default.createElement(C, _extends({}, props, { ref: ref }))
2268 );
2269 })
2270 };
2271 });
2272 };
2273 target[lazyConstructor].isPatchedByReactHotLoader = true;
2274 }
2275};
2276
2277var updateMemo = function updateMemo(target, _ref) {
2278 var type = _ref.type;
2279
2280 target.type = resolveType(type);
2281};
2282
2283var updateForward = function updateForward(target, _ref2) {
2284 var render = _ref2.render;
2285
2286 target.render = render;
2287};
2288
2289var updateContext = function updateContext() {
2290 // nil
2291};
2292
2293var getInnerComponentType = function getInnerComponentType(component) {
2294 var unwrapper = component[UNWRAP_PROXY];
2295 return unwrapper ? unwrapper() : component;
2296};
2297
2298var compareComponents = function compareComponents(oldType, newType, setNewType, baseType) {
2299 var defaultResult = oldType === newType;
2300
2301 if (oldType && !newType || !oldType && newType) {
2302 return false;
2303 }
2304
2305 if (isRegisteredComponent(oldType) || isRegisteredComponent(newType)) {
2306 if (resolveType(oldType) !== resolveType(newType)) {
2307 return false;
2308 }
2309 defaultResult = true;
2310 }
2311
2312 if (isForwardType({ type: oldType }) && isForwardType({ type: newType })) {
2313 if (oldType.render === newType.render || areSwappable(oldType.render, newType.render)) {
2314 setNewType(newType);
2315 return true;
2316 }
2317 return defaultResult;
2318 }
2319
2320 if (isMemoType({ type: oldType }) && isMemoType({ type: newType })) {
2321 if (oldType.type === newType.type || areSwappable(oldType.type, newType.type)) {
2322 if (baseType) {
2323 // memo form different fibers, why?
2324 if (baseType.$$typeof === newType.$$typeof) {
2325 setNewType(newType);
2326 } else {
2327 setNewType(newType.type);
2328 }
2329 } else {
2330 logger.warn('Please update hot-loader/react-dom');
2331 if (isReactClass(newType.type)) {
2332 setNewType(newType);
2333 } else {
2334 setNewType(newType.type);
2335 }
2336 }
2337
2338 return true;
2339 }
2340 return defaultResult;
2341 }
2342
2343 if (newType !== oldType && areSwappable(newType, oldType)) {
2344 var unwrapFactory = newType[UNWRAP_PROXY];
2345 var oldProxy = unwrapFactory && getProxyByType(unwrapFactory());
2346 if (oldProxy) {
2347 oldProxy.dereference();
2348 updateProxyById(oldType[PROXY_KEY] || getIdByType(oldType), getInnerComponentType(newType));
2349 } else {
2350 setNewType(newType);
2351 }
2352 return true;
2353 }
2354
2355 return defaultResult;
2356};
2357
2358var knownPairs = new WeakMap();
2359var emptyMap$1 = new WeakMap();
2360
2361var hotComponentCompare = function hotComponentCompare(oldType, newType, setNewType, baseType) {
2362 var hotActive = hotComparisonOpen();
2363 var result = oldType === newType;
2364
2365 if (!isReloadableComponent(oldType) || !isReloadableComponent(newType) || isColdType(oldType) || isColdType(oldType) || !oldType || !newType || 0) {
2366 return result;
2367 }
2368
2369 // comparison should be active only if hot update window
2370 // or it would merge components it shall not
2371 if (hotActive) {
2372 result = compareComponents(oldType, newType, setNewType, baseType);
2373 var _pair = knownPairs.get(oldType) || new WeakMap();
2374 _pair.set(newType, result);
2375 knownPairs.set(oldType, _pair);
2376 return result;
2377 }
2378
2379 if (result) {
2380 return result;
2381 }
2382
2383 var pair = knownPairs.get(oldType) || emptyMap$1;
2384 return pair.get(newType) || false;
2385};
2386
2387/* eslint-disable no-use-before-define */
2388
2389var forceSimpleSFC = { proxy: { pureSFC: true } };
2390
2391var reactHotLoader = {
2392 IS_REACT_MERGE_ENABLED: false,
2393 register: function register(type, uniqueLocalName, fileName) {
2394 var options = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : {};
2395
2396 var id = fileName + '#' + uniqueLocalName;
2397
2398 if (isCompositeComponent(type) && typeof uniqueLocalName === 'string' && uniqueLocalName && typeof fileName === 'string' && fileName) {
2399 var proxy = getProxyById(id);
2400
2401 if (proxy && proxy.getCurrent() !== type) {
2402 if (!reactHotLoader.IS_REACT_MERGE_ENABLED) {
2403 if (isTypeBlacklisted(type) || isTypeBlacklisted(proxy.getCurrent())) {
2404 logger.error('React-hot-loader: Cold component', uniqueLocalName, 'at', fileName, 'has been updated');
2405 }
2406 }
2407 }
2408
2409 if (configuration.onComponentRegister) {
2410 configuration.onComponentRegister(type, uniqueLocalName, fileName);
2411 }
2412 if (configuration.onComponentCreate) {
2413 configuration.onComponentCreate(type, getComponentDisplayName(type));
2414 }
2415
2416 registerComponent(updateProxyById(id, type, options).get(), 2);
2417 registerComponent(type);
2418 increment();
2419 }
2420 if (isContextType({ type: type })) {
2421 // possible options - Context, Consumer, Provider.
2422 ['Provider', 'Consumer'].forEach(function (prop) {
2423 var descriptor = Object.getOwnPropertyDescriptor(type, prop);
2424 if (descriptor && descriptor.value) {
2425 updateFunctionProxyById(id + ':' + prop, descriptor.value, updateContext);
2426 }
2427 });
2428 updateFunctionProxyById(id, type, updateContext);
2429 increment();
2430 }
2431 if (isLazyType({ type: type })) {
2432 updateFunctionProxyById(id, type, updateLazy);
2433 increment();
2434 }
2435 if (isForwardType({ type: type })) {
2436 updateFunctionProxyById(id, type, updateForward);
2437 increment();
2438 }
2439 if (isMemoType({ type: type })) {
2440 reactHotLoader.register(type.type, uniqueLocalName + ':memo', fileName, forceSimpleSFC);
2441 updateFunctionProxyById(id, type, updateMemo);
2442 increment();
2443 }
2444 },
2445 reset: function reset() {
2446 resetProxies();
2447 },
2448 preact: function preact(instance) {
2449 preactAdapter(instance, resolveType);
2450 },
2451 resolveType: function resolveType$$1(type) {
2452 return resolveType(type);
2453 },
2454 patch: function patch(React$$1, ReactDOM$$1) {
2455 /* eslint-disable no-console */
2456 if (ReactDOM$$1 && ReactDOM$$1.setHotElementComparator) {
2457 ReactDOM$$1.setHotElementComparator(hotComponentCompare);
2458 configuration.disableHotRenderer = configuration.disableHotRendererWhenInjected;
2459
2460 configuration.ignoreSFC = configuration.ignoreSFCWhenInjected;
2461
2462 reactHotLoader.IS_REACT_MERGE_ENABLED = true;
2463 configuration.showReactDomPatchNotification = false;
2464 // console.warn('react-🔥-loader activated.');
2465 }
2466 /* eslint-enable */
2467 if (!React$$1.createElement.isPatchedByReactHotLoader) {
2468 var originalCreateElement = React$$1.createElement;
2469 // Trick React into rendering a proxy so that
2470 // its state is preserved when the class changes.
2471 // This will update the proxy if it's for a known type.
2472 React$$1.createElement = function (type) {
2473 for (var _len = arguments.length, args = Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) {
2474 args[_key - 1] = arguments[_key];
2475 }
2476
2477 return originalCreateElement.apply(undefined, [resolveType(type)].concat(args));
2478 };
2479 React$$1.createElement.isPatchedByReactHotLoader = true;
2480 }
2481
2482 if (!React$$1.cloneElement.isPatchedByReactHotLoader) {
2483 var originalCloneElement = React$$1.cloneElement;
2484
2485 React$$1.cloneElement = function (element) {
2486 for (var _len2 = arguments.length, args = Array(_len2 > 1 ? _len2 - 1 : 0), _key2 = 1; _key2 < _len2; _key2++) {
2487 args[_key2 - 1] = arguments[_key2];
2488 }
2489
2490 var newType = element.type && resolveType(element.type);
2491 if (newType && newType !== element.type) {
2492 return originalCloneElement.apply(undefined, [_extends({}, element, {
2493 type: newType
2494 })].concat(args));
2495 }
2496 return originalCloneElement.apply(undefined, [element].concat(args));
2497 };
2498
2499 React$$1.cloneElement.isPatchedByReactHotLoader = true;
2500 }
2501
2502 if (!React$$1.createFactory.isPatchedByReactHotLoader) {
2503 // Patch React.createFactory to use patched createElement
2504 // because the original implementation uses the internal,
2505 // unpatched ReactElement.createElement
2506 React$$1.createFactory = function (type) {
2507 var factory = React$$1.createElement.bind(null, type);
2508 factory.type = type;
2509 return factory;
2510 };
2511 React$$1.createFactory.isPatchedByReactHotLoader = true;
2512 }
2513
2514 if (!React$$1.Children.only.isPatchedByReactHotLoader) {
2515 var originalChildrenOnly = React$$1.Children.only;
2516 // Use the same trick as React.createElement
2517 React$$1.Children.only = function (children) {
2518 return originalChildrenOnly(_extends({}, children, { type: resolveType(children.type) }));
2519 };
2520 React$$1.Children.only.isPatchedByReactHotLoader = true;
2521 }
2522
2523 // reactHotLoader.reset()
2524 }
2525};
2526
2527var openedModules = {};
2528var lastModuleOpened = '';
2529var getLastModuleOpened = function getLastModuleOpened() {
2530 return lastModuleOpened;
2531};
2532
2533var hotModules = {};
2534
2535var createHotModule = function createHotModule() {
2536 return { instances: [], updateTimeout: 0 };
2537};
2538
2539var hotModule = function hotModule(moduleId) {
2540 if (!hotModules[moduleId]) {
2541 hotModules[moduleId] = createHotModule();
2542 }
2543 return hotModules[moduleId];
2544};
2545
2546var isOpened = function isOpened(sourceModule) {
2547 return sourceModule && !!openedModules[sourceModule.id];
2548};
2549
2550var enter = function enter(sourceModule) {
2551 if (sourceModule && sourceModule.id) {
2552 lastModuleOpened = sourceModule.id;
2553 openedModules[sourceModule.id] = true;
2554 } else {
2555 logger.warn('React-hot-loader: no `module` variable found. Did you shadow a system variable?');
2556 }
2557};
2558
2559var leave = function leave(sourceModule) {
2560 if (sourceModule && sourceModule.id) {
2561 delete openedModules[sourceModule.id];
2562 }
2563};
2564
2565/* eslint-disable camelcase, no-undef */
2566var requireIndirect = typeof __webpack_require__ !== 'undefined' ? __webpack_require__ : require;
2567/* eslint-enable */
2568
2569var chargeFailbackTimer = function chargeFailbackTimer(id) {
2570 return setTimeout(function () {
2571 var error = 'hot update failed for module "' + id + '". Last file processed: "' + getLastModuleOpened() + '".';
2572 logger.error(error);
2573 logException({
2574 toString: function toString() {
2575 return error;
2576 }
2577 });
2578 // 100 ms more "code" tolerant that 0, and would catch error in any case
2579 }, 100);
2580};
2581
2582var clearFailbackTimer = function clearFailbackTimer(timerId) {
2583 return clearTimeout(timerId);
2584};
2585
2586var createHoc = function createHoc(SourceComponent, TargetComponent) {
2587 hoistNonReactStatic(TargetComponent, SourceComponent);
2588 TargetComponent.displayName = 'HotExported' + getComponentDisplayName(SourceComponent);
2589 return TargetComponent;
2590};
2591
2592var makeHotExport = function makeHotExport(sourceModule, moduleId) {
2593 var updateInstances = function updateInstances(possibleError) {
2594 if (possibleError && possibleError instanceof Error) {
2595 console.error(possibleError);
2596 return;
2597 }
2598 var module = hotModule(moduleId);
2599 clearTimeout(module.updateTimeout);
2600 module.updateTimeout = setTimeout(function () {
2601 try {
2602 requireIndirect(moduleId);
2603 } catch (e) {
2604 console.error('React-Hot-Loader: error detected while loading', moduleId);
2605 console.error(e);
2606 }
2607 module.instances.forEach(function (inst) {
2608 return inst.forceUpdate();
2609 });
2610 });
2611 };
2612
2613 if (sourceModule.hot) {
2614 // Mark as self-accepted for Webpack (callback is an Error Handler)
2615 // Update instances for Parcel (callback is an Accept Handler)
2616 sourceModule.hot.accept(updateInstances);
2617
2618 // Webpack way
2619 if (sourceModule.hot.addStatusHandler) {
2620 if (sourceModule.hot.status() === 'idle') {
2621 sourceModule.hot.addStatusHandler(function (status) {
2622 if (status === 'apply') {
2623 clearExceptions();
2624 updateInstances();
2625 }
2626 });
2627 }
2628 }
2629 } else {
2630 logger.warn('React-hot-loader: Hot Module Replacement is not enabled');
2631 }
2632};
2633
2634var hot = function hot(sourceModule) {
2635 if (!sourceModule) {
2636 // this is fatal
2637 throw new Error('React-hot-loader: `hot` was called without any argument provided');
2638 }
2639 var moduleId = sourceModule.id || sourceModule.i || sourceModule.filename;
2640 if (!moduleId) {
2641 console.error('`module` prodived', sourceModule);
2642 throw new Error('React-hot-loader: `hot` could not find the `name` of the the `module` you have provided');
2643 }
2644 var module = hotModule(moduleId);
2645 makeHotExport(sourceModule, moduleId);
2646
2647 clearExceptions();
2648 var failbackTimer = chargeFailbackTimer(moduleId);
2649 var firstHotRegistered = false;
2650
2651 // TODO: Ensure that all exports from this file are react components.
2652
2653 return function (WrappedComponent, props) {
2654 clearFailbackTimer(failbackTimer);
2655 // register proxy for wrapped component
2656 // only one hot per file would use this registration
2657 if (!firstHotRegistered) {
2658 firstHotRegistered = true;
2659 reactHotLoader.register(WrappedComponent, getComponentDisplayName(WrappedComponent), 'RHL' + moduleId);
2660 }
2661
2662 return createHoc(WrappedComponent, function (_Component) {
2663 inherits(ExportedComponent, _Component);
2664
2665 function ExportedComponent() {
2666 classCallCheck(this, ExportedComponent);
2667 return possibleConstructorReturn(this, _Component.apply(this, arguments));
2668 }
2669
2670 ExportedComponent.prototype.componentDidMount = function componentDidMount() {
2671 module.instances.push(this);
2672 };
2673
2674 ExportedComponent.prototype.componentWillUnmount = function componentWillUnmount() {
2675 var _this2 = this;
2676
2677 if (isOpened(sourceModule)) {
2678 var componentName = getComponentDisplayName(WrappedComponent);
2679 logger.error('React-hot-loader: Detected AppContainer unmount on module \'' + moduleId + '\' update.\n' + ('Did you use "hot(' + componentName + ')" and "ReactDOM.render()" in the same file?\n') + ('"hot(' + componentName + ')" shall only be used as export.\n') + 'Please refer to "Getting Started" (https://github.com/gaearon/react-hot-loader/).');
2680 }
2681 module.instances = module.instances.filter(function (a) {
2682 return a !== _this2;
2683 });
2684 };
2685
2686 ExportedComponent.prototype.render = function render() {
2687 return React__default.createElement(
2688 AppContainer,
2689 props,
2690 React__default.createElement(WrappedComponent, this.props)
2691 );
2692 };
2693
2694 return ExportedComponent;
2695 }(React.Component));
2696 };
2697};
2698
2699var getProxyOrType = function getProxyOrType(type) {
2700 var proxy = getProxyByType(type);
2701 return proxy ? proxy.get() : type;
2702};
2703
2704var areComponentsEqual = function areComponentsEqual(a, b) {
2705 return getProxyOrType(a) === getProxyOrType(b);
2706};
2707
2708var compareOrSwap = function compareOrSwap(oldType, newType) {
2709 return hotComponentCompare(oldType, newType);
2710};
2711
2712var cold = function cold(type) {
2713 blacklistByType(type);
2714 return type;
2715};
2716
2717var configureComponent = function configureComponent(component, options) {
2718 return setComponentOptions(component, options);
2719};
2720
2721var setConfig = function setConfig(config) {
2722 return setConfiguration(config);
2723};
2724
2725reactHotLoader.patch(React__default, ReactDOM);
2726
2727exports.default = reactHotLoader;
2728exports.AppContainer = AppContainer;
2729exports.hot = hot;
2730exports.enterModule = enter;
2731exports.leaveModule = leave;
2732exports.areComponentsEqual = areComponentsEqual;
2733exports.compareOrSwap = compareOrSwap;
2734exports.cold = cold;
2735exports.configureComponent = configureComponent;
2736exports.setConfig = setConfig;