UNPKG

784 kBJavaScriptView Raw
1/** @license React v16.8.2
2 * react-dom-unstable-fire.development.js
3 *
4 * Copyright (c) Facebook, Inc. and its affiliates.
5 *
6 * This source code is licensed under the MIT license found in the
7 * LICENSE file in the root directory of this source tree.
8 */
9
10'use strict';
11
12(function (global, factory) {
13 typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory(require('react')) :
14 typeof define === 'function' && define.amd ? define(['react'], factory) :
15 (global.ReactFire = factory(global.React));
16}(this, (function (React) { 'use strict';
17
18/**
19 * Use invariant() to assert state which your program assumes to be true.
20 *
21 * Provide sprintf-style format (only %s is supported) and arguments
22 * to provide information about what broke and what you were
23 * expecting.
24 *
25 * The invariant message will be stripped in production, but the invariant
26 * will remain to ensure logic does not differ in production.
27 */
28
29var validateFormat = function () {};
30
31{
32 validateFormat = function (format) {
33 if (format === undefined) {
34 throw new Error('invariant requires an error message argument');
35 }
36 };
37}
38
39function invariant(condition, format, a, b, c, d, e, f) {
40 validateFormat(format);
41
42 if (!condition) {
43 var error = void 0;
44 if (format === undefined) {
45 error = new Error('Minified exception occurred; use the non-minified dev environment ' + 'for the full error message and additional helpful warnings.');
46 } else {
47 var args = [a, b, c, d, e, f];
48 var argIndex = 0;
49 error = new Error(format.replace(/%s/g, function () {
50 return args[argIndex++];
51 }));
52 error.name = 'Invariant Violation';
53 }
54
55 error.framesToPop = 1; // we don't care about invariant's own frame
56 throw error;
57 }
58}
59
60// Relying on the `invariant()` implementation lets us
61// preserve the format and params in the www builds.
62
63!React ? invariant(false, 'ReactDOM was loaded before React. Make sure you load the React package before loading ReactDOM.') : void 0;
64
65var invokeGuardedCallbackImpl = function (name, func, context, a, b, c, d, e, f) {
66 var funcArgs = Array.prototype.slice.call(arguments, 3);
67 try {
68 func.apply(context, funcArgs);
69 } catch (error) {
70 this.onError(error);
71 }
72};
73
74{
75 // In DEV mode, we swap out invokeGuardedCallback for a special version
76 // that plays more nicely with the browser's DevTools. The idea is to preserve
77 // "Pause on exceptions" behavior. Because React wraps all user-provided
78 // functions in invokeGuardedCallback, and the production version of
79 // invokeGuardedCallback uses a try-catch, all user exceptions are treated
80 // like caught exceptions, and the DevTools won't pause unless the developer
81 // takes the extra step of enabling pause on caught exceptions. This is
82 // unintuitive, though, because even though React has caught the error, from
83 // the developer's perspective, the error is uncaught.
84 //
85 // To preserve the expected "Pause on exceptions" behavior, we don't use a
86 // try-catch in DEV. Instead, we synchronously dispatch a fake event to a fake
87 // DOM node, and call the user-provided callback from inside an event handler
88 // for that fake event. If the callback throws, the error is "captured" using
89 // a global event handler. But because the error happens in a different
90 // event loop context, it does not interrupt the normal program flow.
91 // Effectively, this gives us try-catch behavior without actually using
92 // try-catch. Neat!
93
94 // Check that the browser supports the APIs we need to implement our special
95 // DEV version of invokeGuardedCallback
96 if (typeof window !== 'undefined' && typeof window.dispatchEvent === 'function' && typeof document !== 'undefined' && typeof document.createEvent === 'function') {
97 var fakeNode = document.createElement('react');
98
99 var invokeGuardedCallbackDev = function (name, func, context, a, b, c, d, e, f) {
100 // If document doesn't exist we know for sure we will crash in this method
101 // when we call document.createEvent(). However this can cause confusing
102 // errors: https://github.com/facebookincubator/create-react-app/issues/3482
103 // So we preemptively throw with a better message instead.
104 !(typeof document !== 'undefined') ? invariant(false, 'The `document` global was defined when React was initialized, but is not defined anymore. This can happen in a test environment if a component schedules an update from an asynchronous callback, but the test has already finished running. To solve this, you can either unmount the component at the end of your test (and ensure that any asynchronous operations get canceled in `componentWillUnmount`), or you can change the test itself to be asynchronous.') : void 0;
105 var evt = document.createEvent('Event');
106
107 // Keeps track of whether the user-provided callback threw an error. We
108 // set this to true at the beginning, then set it to false right after
109 // calling the function. If the function errors, `didError` will never be
110 // set to false. This strategy works even if the browser is flaky and
111 // fails to call our global error handler, because it doesn't rely on
112 // the error event at all.
113 var didError = true;
114
115 // Keeps track of the value of window.event so that we can reset it
116 // during the callback to let user code access window.event in the
117 // browsers that support it.
118 var windowEvent = window.event;
119
120 // Keeps track of the descriptor of window.event to restore it after event
121 // dispatching: https://github.com/facebook/react/issues/13688
122 var windowEventDescriptor = Object.getOwnPropertyDescriptor(window, 'event');
123
124 // Create an event handler for our fake event. We will synchronously
125 // dispatch our fake event using `dispatchEvent`. Inside the handler, we
126 // call the user-provided callback.
127 var funcArgs = Array.prototype.slice.call(arguments, 3);
128 function callCallback() {
129 // We immediately remove the callback from event listeners so that
130 // nested `invokeGuardedCallback` calls do not clash. Otherwise, a
131 // nested call would trigger the fake event handlers of any call higher
132 // in the stack.
133 fakeNode.removeEventListener(evtType, callCallback, false);
134
135 // We check for window.hasOwnProperty('event') to prevent the
136 // window.event assignment in both IE <= 10 as they throw an error
137 // "Member not found" in strict mode, and in Firefox which does not
138 // support window.event.
139 if (typeof window.event !== 'undefined' && window.hasOwnProperty('event')) {
140 window.event = windowEvent;
141 }
142
143 func.apply(context, funcArgs);
144 didError = false;
145 }
146
147 // Create a global error event handler. We use this to capture the value
148 // that was thrown. It's possible that this error handler will fire more
149 // than once; for example, if non-React code also calls `dispatchEvent`
150 // and a handler for that event throws. We should be resilient to most of
151 // those cases. Even if our error event handler fires more than once, the
152 // last error event is always used. If the callback actually does error,
153 // we know that the last error event is the correct one, because it's not
154 // possible for anything else to have happened in between our callback
155 // erroring and the code that follows the `dispatchEvent` call below. If
156 // the callback doesn't error, but the error event was fired, we know to
157 // ignore it because `didError` will be false, as described above.
158 var error = void 0;
159 // Use this to track whether the error event is ever called.
160 var didSetError = false;
161 var isCrossOriginError = false;
162
163 function handleWindowError(event) {
164 error = event.error;
165 didSetError = true;
166 if (error === null && event.colno === 0 && event.lineno === 0) {
167 isCrossOriginError = true;
168 }
169 if (event.defaultPrevented) {
170 // Some other error handler has prevented default.
171 // Browsers silence the error report if this happens.
172 // We'll remember this to later decide whether to log it or not.
173 if (error != null && typeof error === 'object') {
174 try {
175 error._suppressLogging = true;
176 } catch (inner) {
177 // Ignore.
178 }
179 }
180 }
181 }
182
183 // Create a fake event type.
184 var evtType = 'react-' + (name ? name : 'invokeguardedcallback');
185
186 // Attach our event handlers
187 window.addEventListener('error', handleWindowError);
188 fakeNode.addEventListener(evtType, callCallback, false);
189
190 // Synchronously dispatch our fake event. If the user-provided function
191 // errors, it will trigger our global error handler.
192 evt.initEvent(evtType, false, false);
193 fakeNode.dispatchEvent(evt);
194
195 if (windowEventDescriptor) {
196 Object.defineProperty(window, 'event', windowEventDescriptor);
197 }
198
199 if (didError) {
200 if (!didSetError) {
201 // The callback errored, but the error event never fired.
202 error = new Error('An error was thrown inside one of your components, but React ' + "doesn't know what it was. This is likely due to browser " + 'flakiness. React does its best to preserve the "Pause on ' + 'exceptions" behavior of the DevTools, which requires some ' + "DEV-mode only tricks. It's possible that these don't work in " + 'your browser. Try triggering the error in production mode, ' + 'or switching to a modern browser. If you suspect that this is ' + 'actually an issue with React, please file an issue.');
203 } else if (isCrossOriginError) {
204 error = new Error("A cross-origin error was thrown. React doesn't have access to " + 'the actual error object in development. ' + 'See https://fb.me/react-crossorigin-error for more information.');
205 }
206 this.onError(error);
207 }
208
209 // Remove our event listeners
210 window.removeEventListener('error', handleWindowError);
211 };
212
213 invokeGuardedCallbackImpl = invokeGuardedCallbackDev;
214 }
215}
216
217var invokeGuardedCallbackImpl$1 = invokeGuardedCallbackImpl;
218
219// Used by Fiber to simulate a try-catch.
220var hasError = false;
221var caughtError = null;
222
223// Used by event system to capture/rethrow the first error.
224var hasRethrowError = false;
225var rethrowError = null;
226
227var reporter = {
228 onError: function (error) {
229 hasError = true;
230 caughtError = error;
231 }
232};
233
234/**
235 * Call a function while guarding against errors that happens within it.
236 * Returns an error if it throws, otherwise null.
237 *
238 * In production, this is implemented using a try-catch. The reason we don't
239 * use a try-catch directly is so that we can swap out a different
240 * implementation in DEV mode.
241 *
242 * @param {String} name of the guard to use for logging or debugging
243 * @param {Function} func The function to invoke
244 * @param {*} context The context to use when calling the function
245 * @param {...*} args Arguments for function
246 */
247function invokeGuardedCallback(name, func, context, a, b, c, d, e, f) {
248 hasError = false;
249 caughtError = null;
250 invokeGuardedCallbackImpl$1.apply(reporter, arguments);
251}
252
253/**
254 * Same as invokeGuardedCallback, but instead of returning an error, it stores
255 * it in a global so it can be rethrown by `rethrowCaughtError` later.
256 * TODO: See if caughtError and rethrowError can be unified.
257 *
258 * @param {String} name of the guard to use for logging or debugging
259 * @param {Function} func The function to invoke
260 * @param {*} context The context to use when calling the function
261 * @param {...*} args Arguments for function
262 */
263function invokeGuardedCallbackAndCatchFirstError(name, func, context, a, b, c, d, e, f) {
264 invokeGuardedCallback.apply(this, arguments);
265 if (hasError) {
266 var error = clearCaughtError();
267 if (!hasRethrowError) {
268 hasRethrowError = true;
269 rethrowError = error;
270 }
271 }
272}
273
274/**
275 * During execution of guarded functions we will capture the first error which
276 * we will rethrow to be handled by the top level error handler.
277 */
278function rethrowCaughtError() {
279 if (hasRethrowError) {
280 var error = rethrowError;
281 hasRethrowError = false;
282 rethrowError = null;
283 throw error;
284 }
285}
286
287function hasCaughtError() {
288 return hasError;
289}
290
291function clearCaughtError() {
292 if (hasError) {
293 var error = caughtError;
294 hasError = false;
295 caughtError = null;
296 return error;
297 } else {
298 invariant(false, 'clearCaughtError was called but no error was captured. This error is likely caused by a bug in React. Please file an issue.');
299 }
300}
301
302/**
303 * Injectable ordering of event plugins.
304 */
305var eventPluginOrder = null;
306
307/**
308 * Injectable mapping from names to event plugin modules.
309 */
310var namesToPlugins = {};
311
312/**
313 * Recomputes the plugin list using the injected plugins and plugin ordering.
314 *
315 * @private
316 */
317function recomputePluginOrdering() {
318 if (!eventPluginOrder) {
319 // Wait until an `eventPluginOrder` is injected.
320 return;
321 }
322 for (var pluginName in namesToPlugins) {
323 var pluginModule = namesToPlugins[pluginName];
324 var pluginIndex = eventPluginOrder.indexOf(pluginName);
325 !(pluginIndex > -1) ? invariant(false, 'EventPluginRegistry: Cannot inject event plugins that do not exist in the plugin ordering, `%s`.', pluginName) : void 0;
326 if (plugins[pluginIndex]) {
327 continue;
328 }
329 !pluginModule.extractEvents ? invariant(false, 'EventPluginRegistry: Event plugins must implement an `extractEvents` method, but `%s` does not.', pluginName) : void 0;
330 plugins[pluginIndex] = pluginModule;
331 var publishedEvents = pluginModule.eventTypes;
332 for (var eventName in publishedEvents) {
333 !publishEventForPlugin(publishedEvents[eventName], pluginModule, eventName) ? invariant(false, 'EventPluginRegistry: Failed to publish event `%s` for plugin `%s`.', eventName, pluginName) : void 0;
334 }
335 }
336}
337
338/**
339 * Publishes an event so that it can be dispatched by the supplied plugin.
340 *
341 * @param {object} dispatchConfig Dispatch configuration for the event.
342 * @param {object} PluginModule Plugin publishing the event.
343 * @return {boolean} True if the event was successfully published.
344 * @private
345 */
346function publishEventForPlugin(dispatchConfig, pluginModule, eventName) {
347 !!eventNameDispatchConfigs.hasOwnProperty(eventName) ? invariant(false, 'EventPluginHub: More than one plugin attempted to publish the same event name, `%s`.', eventName) : void 0;
348 eventNameDispatchConfigs[eventName] = dispatchConfig;
349
350 var phasedRegistrationNames = dispatchConfig.phasedRegistrationNames;
351 if (phasedRegistrationNames) {
352 for (var phaseName in phasedRegistrationNames) {
353 if (phasedRegistrationNames.hasOwnProperty(phaseName)) {
354 var phasedRegistrationName = phasedRegistrationNames[phaseName];
355 publishRegistrationName(phasedRegistrationName, pluginModule, eventName);
356 }
357 }
358 return true;
359 } else if (dispatchConfig.registrationName) {
360 publishRegistrationName(dispatchConfig.registrationName, pluginModule, eventName);
361 return true;
362 }
363 return false;
364}
365
366/**
367 * Publishes a registration name that is used to identify dispatched events.
368 *
369 * @param {string} registrationName Registration name to add.
370 * @param {object} PluginModule Plugin publishing the event.
371 * @private
372 */
373function publishRegistrationName(registrationName, pluginModule, eventName) {
374 !!registrationNameModules[registrationName] ? invariant(false, 'EventPluginHub: More than one plugin attempted to publish the same registration name, `%s`.', registrationName) : void 0;
375 registrationNameModules[registrationName] = pluginModule;
376 registrationNameDependencies[registrationName] = pluginModule.eventTypes[eventName].dependencies;
377
378 {
379 var lowerCasedName = registrationName.toLowerCase();
380 possibleRegistrationNames[lowerCasedName] = registrationName;
381
382 if (registrationName === 'onDoubleClick') {
383 possibleRegistrationNames.ondblclick = registrationName;
384 }
385 }
386}
387
388/**
389 * Registers plugins so that they can extract and dispatch events.
390 *
391 * @see {EventPluginHub}
392 */
393
394/**
395 * Ordered list of injected plugins.
396 */
397var plugins = [];
398
399/**
400 * Mapping from event name to dispatch config
401 */
402var eventNameDispatchConfigs = {};
403
404/**
405 * Mapping from registration name to plugin module
406 */
407var registrationNameModules = {};
408
409/**
410 * Mapping from registration name to event name
411 */
412var registrationNameDependencies = {};
413
414/**
415 * Mapping from lowercase registration names to the properly cased version,
416 * used to warn in the case of missing event handlers. Available
417 * only in true.
418 * @type {Object}
419 */
420var possibleRegistrationNames = {};
421// Trust the developer to only use possibleRegistrationNames in true
422
423/**
424 * Injects an ordering of plugins (by plugin name). This allows the ordering
425 * to be decoupled from injection of the actual plugins so that ordering is
426 * always deterministic regardless of packaging, on-the-fly injection, etc.
427 *
428 * @param {array} InjectedEventPluginOrder
429 * @internal
430 * @see {EventPluginHub.injection.injectEventPluginOrder}
431 */
432function injectEventPluginOrder(injectedEventPluginOrder) {
433 !!eventPluginOrder ? invariant(false, 'EventPluginRegistry: Cannot inject event plugin ordering more than once. You are likely trying to load more than one copy of React.') : void 0;
434 // Clone the ordering so it cannot be dynamically mutated.
435 eventPluginOrder = Array.prototype.slice.call(injectedEventPluginOrder);
436 recomputePluginOrdering();
437}
438
439/**
440 * Injects plugins to be used by `EventPluginHub`. The plugin names must be
441 * in the ordering injected by `injectEventPluginOrder`.
442 *
443 * Plugins can be injected as part of page initialization or on-the-fly.
444 *
445 * @param {object} injectedNamesToPlugins Map from names to plugin modules.
446 * @internal
447 * @see {EventPluginHub.injection.injectEventPluginsByName}
448 */
449function injectEventPluginsByName(injectedNamesToPlugins) {
450 var isOrderingDirty = false;
451 for (var pluginName in injectedNamesToPlugins) {
452 if (!injectedNamesToPlugins.hasOwnProperty(pluginName)) {
453 continue;
454 }
455 var pluginModule = injectedNamesToPlugins[pluginName];
456 if (!namesToPlugins.hasOwnProperty(pluginName) || namesToPlugins[pluginName] !== pluginModule) {
457 !!namesToPlugins[pluginName] ? invariant(false, 'EventPluginRegistry: Cannot inject two different event plugins using the same name, `%s`.', pluginName) : void 0;
458 namesToPlugins[pluginName] = pluginModule;
459 isOrderingDirty = true;
460 }
461 }
462 if (isOrderingDirty) {
463 recomputePluginOrdering();
464 }
465}
466
467/**
468 * Similar to invariant but only logs a warning if the condition is not met.
469 * This can be used to log issues in development environments in critical
470 * paths. Removing the logging code for production environments will keep the
471 * same logic and follow the same code paths.
472 */
473
474var warningWithoutStack = function () {};
475
476{
477 warningWithoutStack = function (condition, format) {
478 for (var _len = arguments.length, args = Array(_len > 2 ? _len - 2 : 0), _key = 2; _key < _len; _key++) {
479 args[_key - 2] = arguments[_key];
480 }
481
482 if (format === undefined) {
483 throw new Error('`warningWithoutStack(condition, format, ...args)` requires a warning ' + 'message argument');
484 }
485 if (args.length > 8) {
486 // Check before the condition to catch violations early.
487 throw new Error('warningWithoutStack() currently supports at most 8 arguments.');
488 }
489 if (condition) {
490 return;
491 }
492 if (typeof console !== 'undefined') {
493 var argsWithFormat = args.map(function (item) {
494 return '' + item;
495 });
496 argsWithFormat.unshift('Warning: ' + format);
497
498 // We intentionally don't use spread (or .apply) directly because it
499 // breaks IE9: https://github.com/facebook/react/issues/13610
500 Function.prototype.apply.call(console.error, console, argsWithFormat);
501 }
502 try {
503 // --- Welcome to debugging React ---
504 // This error was thrown as a convenience so that you can use this stack
505 // to find the callsite that caused this warning to fire.
506 var argIndex = 0;
507 var message = 'Warning: ' + format.replace(/%s/g, function () {
508 return args[argIndex++];
509 });
510 throw new Error(message);
511 } catch (x) {}
512 };
513}
514
515var warningWithoutStack$1 = warningWithoutStack;
516
517var getFiberCurrentPropsFromNode = null;
518var getInstanceFromNode = null;
519var getNodeFromInstance = null;
520
521function setComponentTree(getFiberCurrentPropsFromNodeImpl, getInstanceFromNodeImpl, getNodeFromInstanceImpl) {
522 getFiberCurrentPropsFromNode = getFiberCurrentPropsFromNodeImpl;
523 getInstanceFromNode = getInstanceFromNodeImpl;
524 getNodeFromInstance = getNodeFromInstanceImpl;
525 {
526 !(getNodeFromInstance && getInstanceFromNode) ? warningWithoutStack$1(false, 'EventPluginUtils.setComponentTree(...): Injected ' + 'module is missing getNodeFromInstance or getInstanceFromNode.') : void 0;
527 }
528}
529
530var validateEventDispatches = void 0;
531{
532 validateEventDispatches = function (event) {
533 var dispatchListeners = event._dispatchListeners;
534 var dispatchInstances = event._dispatchInstances;
535
536 var listenersIsArr = Array.isArray(dispatchListeners);
537 var listenersLen = listenersIsArr ? dispatchListeners.length : dispatchListeners ? 1 : 0;
538
539 var instancesIsArr = Array.isArray(dispatchInstances);
540 var instancesLen = instancesIsArr ? dispatchInstances.length : dispatchInstances ? 1 : 0;
541
542 !(instancesIsArr === listenersIsArr && instancesLen === listenersLen) ? warningWithoutStack$1(false, 'EventPluginUtils: Invalid `event`.') : void 0;
543 };
544}
545
546/**
547 * Dispatch the event to the listener.
548 * @param {SyntheticEvent} event SyntheticEvent to handle
549 * @param {function} listener Application-level callback
550 * @param {*} inst Internal component instance
551 */
552function executeDispatch(event, listener, inst) {
553 var type = event.type || 'unknown-event';
554 event.currentTarget = getNodeFromInstance(inst);
555 invokeGuardedCallbackAndCatchFirstError(type, listener, undefined, event);
556 event.currentTarget = null;
557}
558
559/**
560 * Standard/simple iteration through an event's collected dispatches.
561 */
562function executeDispatchesInOrder(event) {
563 var dispatchListeners = event._dispatchListeners;
564 var dispatchInstances = event._dispatchInstances;
565 {
566 validateEventDispatches(event);
567 }
568 if (Array.isArray(dispatchListeners)) {
569 for (var i = 0; i < dispatchListeners.length; i++) {
570 if (event.isPropagationStopped()) {
571 break;
572 }
573 // Listeners and Instances are two parallel arrays that are always in sync.
574 executeDispatch(event, dispatchListeners[i], dispatchInstances[i]);
575 }
576 } else if (dispatchListeners) {
577 executeDispatch(event, dispatchListeners, dispatchInstances);
578 }
579 event._dispatchListeners = null;
580 event._dispatchInstances = null;
581}
582
583/**
584 * @see executeDispatchesInOrderStopAtTrueImpl
585 */
586
587
588/**
589 * Execution of a "direct" dispatch - there must be at most one dispatch
590 * accumulated on the event or it is considered an error. It doesn't really make
591 * sense for an event with multiple dispatches (bubbled) to keep track of the
592 * return values at each dispatch execution, but it does tend to make sense when
593 * dealing with "direct" dispatches.
594 *
595 * @return {*} The return value of executing the single dispatch.
596 */
597
598
599/**
600 * @param {SyntheticEvent} event
601 * @return {boolean} True iff number of dispatches accumulated is greater than 0.
602 */
603
604/**
605 * Accumulates items that must not be null or undefined into the first one. This
606 * is used to conserve memory by avoiding array allocations, and thus sacrifices
607 * API cleanness. Since `current` can be null before being passed in and not
608 * null after this function, make sure to assign it back to `current`:
609 *
610 * `a = accumulateInto(a, b);`
611 *
612 * This API should be sparingly used. Try `accumulate` for something cleaner.
613 *
614 * @return {*|array<*>} An accumulation of items.
615 */
616
617function accumulateInto(current, next) {
618 !(next != null) ? invariant(false, 'accumulateInto(...): Accumulated items must not be null or undefined.') : void 0;
619
620 if (current == null) {
621 return next;
622 }
623
624 // Both are not empty. Warning: Never call x.concat(y) when you are not
625 // certain that x is an Array (x could be a string with concat method).
626 if (Array.isArray(current)) {
627 if (Array.isArray(next)) {
628 current.push.apply(current, next);
629 return current;
630 }
631 current.push(next);
632 return current;
633 }
634
635 if (Array.isArray(next)) {
636 // A bit too dangerous to mutate `next`.
637 return [current].concat(next);
638 }
639
640 return [current, next];
641}
642
643/**
644 * @param {array} arr an "accumulation" of items which is either an Array or
645 * a single item. Useful when paired with the `accumulate` module. This is a
646 * simple utility that allows us to reason about a collection of items, but
647 * handling the case when there is exactly one item (and we do not need to
648 * allocate an array).
649 * @param {function} cb Callback invoked with each element or a collection.
650 * @param {?} [scope] Scope used as `this` in a callback.
651 */
652function forEachAccumulated(arr, cb, scope) {
653 if (Array.isArray(arr)) {
654 arr.forEach(cb, scope);
655 } else if (arr) {
656 cb.call(scope, arr);
657 }
658}
659
660/**
661 * Internal queue of events that have accumulated their dispatches and are
662 * waiting to have their dispatches executed.
663 */
664var eventQueue = null;
665
666/**
667 * Dispatches an event and releases it back into the pool, unless persistent.
668 *
669 * @param {?object} event Synthetic event to be dispatched.
670 * @private
671 */
672var executeDispatchesAndRelease = function (event) {
673 if (event) {
674 executeDispatchesInOrder(event);
675
676 if (!event.isPersistent()) {
677 event.constructor.release(event);
678 }
679 }
680};
681var executeDispatchesAndReleaseTopLevel = function (e) {
682 return executeDispatchesAndRelease(e);
683};
684
685function isInteractive(tag) {
686 return tag === 'button' || tag === 'input' || tag === 'select' || tag === 'textarea';
687}
688
689function shouldPreventMouseEvent(name, type, props) {
690 switch (name) {
691 case 'onClick':
692 case 'onClickCapture':
693 case 'onDoubleClick':
694 case 'onDoubleClickCapture':
695 case 'onMouseDown':
696 case 'onMouseDownCapture':
697 case 'onMouseMove':
698 case 'onMouseMoveCapture':
699 case 'onMouseUp':
700 case 'onMouseUpCapture':
701 return !!(props.disabled && isInteractive(type));
702 default:
703 return false;
704 }
705}
706
707/**
708 * This is a unified interface for event plugins to be installed and configured.
709 *
710 * Event plugins can implement the following properties:
711 *
712 * `extractEvents` {function(string, DOMEventTarget, string, object): *}
713 * Required. When a top-level event is fired, this method is expected to
714 * extract synthetic events that will in turn be queued and dispatched.
715 *
716 * `eventTypes` {object}
717 * Optional, plugins that fire events must publish a mapping of registration
718 * names that are used to register listeners. Values of this mapping must
719 * be objects that contain `registrationName` or `phasedRegistrationNames`.
720 *
721 * `executeDispatch` {function(object, function, string)}
722 * Optional, allows plugins to override how an event gets dispatched. By
723 * default, the listener is simply invoked.
724 *
725 * Each plugin that is injected into `EventsPluginHub` is immediately operable.
726 *
727 * @public
728 */
729
730/**
731 * Methods for injecting dependencies.
732 */
733var injection = {
734 /**
735 * @param {array} InjectedEventPluginOrder
736 * @public
737 */
738 injectEventPluginOrder: injectEventPluginOrder,
739
740 /**
741 * @param {object} injectedNamesToPlugins Map from names to plugin modules.
742 */
743 injectEventPluginsByName: injectEventPluginsByName
744};
745
746/**
747 * @param {object} inst The instance, which is the source of events.
748 * @param {string} registrationName Name of listener (e.g. `onClick`).
749 * @return {?function} The stored callback.
750 */
751function getListener(inst, registrationName) {
752 var listener = void 0;
753
754 // TODO: shouldPreventMouseEvent is DOM-specific and definitely should not
755 // live here; needs to be moved to a better place soon
756 var stateNode = inst.stateNode;
757 if (!stateNode) {
758 // Work in progress (ex: onload events in incremental mode).
759 return null;
760 }
761 var props = getFiberCurrentPropsFromNode(stateNode);
762 if (!props) {
763 // Work in progress.
764 return null;
765 }
766 listener = props[registrationName];
767 if (shouldPreventMouseEvent(registrationName, inst.type, props)) {
768 return null;
769 }
770 !(!listener || typeof listener === 'function') ? invariant(false, 'Expected `%s` listener to be a function, instead got a value of `%s` type.', registrationName, typeof listener) : void 0;
771 return listener;
772}
773
774/**
775 * Allows registered plugins an opportunity to extract events from top-level
776 * native browser events.
777 *
778 * @return {*} An accumulation of synthetic events.
779 * @internal
780 */
781function extractEvents(topLevelType, targetInst, nativeEvent, nativeEventTarget) {
782 var events = null;
783 for (var i = 0; i < plugins.length; i++) {
784 // Not every plugin in the ordering may be loaded at runtime.
785 var possiblePlugin = plugins[i];
786 if (possiblePlugin) {
787 var extractedEvents = possiblePlugin.extractEvents(topLevelType, targetInst, nativeEvent, nativeEventTarget);
788 if (extractedEvents) {
789 events = accumulateInto(events, extractedEvents);
790 }
791 }
792 }
793 return events;
794}
795
796function runEventsInBatch(events) {
797 if (events !== null) {
798 eventQueue = accumulateInto(eventQueue, events);
799 }
800
801 // Set `eventQueue` to null before processing it so that we can tell if more
802 // events get enqueued while processing.
803 var processingEventQueue = eventQueue;
804 eventQueue = null;
805
806 if (!processingEventQueue) {
807 return;
808 }
809
810 forEachAccumulated(processingEventQueue, executeDispatchesAndReleaseTopLevel);
811 !!eventQueue ? invariant(false, 'processEventQueue(): Additional events were enqueued while processing an event queue. Support for this has not yet been implemented.') : void 0;
812 // This would be a good time to rethrow if any of the event handlers threw.
813 rethrowCaughtError();
814}
815
816function runExtractedEventsInBatch(topLevelType, targetInst, nativeEvent, nativeEventTarget) {
817 var events = extractEvents(topLevelType, targetInst, nativeEvent, nativeEventTarget);
818 runEventsInBatch(events);
819}
820
821var FunctionComponent = 0;
822var ClassComponent = 1;
823var IndeterminateComponent = 2; // Before we know whether it is function or class
824var HostRoot = 3; // Root of a host tree. Could be nested inside another node.
825var HostPortal = 4; // A subtree. Could be an entry point to a different renderer.
826var HostComponent = 5;
827var HostText = 6;
828var Fragment = 7;
829var Mode = 8;
830var ContextConsumer = 9;
831var ContextProvider = 10;
832var ForwardRef = 11;
833var Profiler = 12;
834var SuspenseComponent = 13;
835var MemoComponent = 14;
836var SimpleMemoComponent = 15;
837var LazyComponent = 16;
838var IncompleteClassComponent = 17;
839var DehydratedSuspenseComponent = 18;
840
841var randomKey = Math.random().toString(36).slice(2);
842var internalInstanceKey = '__reactInternalInstance$' + randomKey;
843var internalEventHandlersKey = '__reactEventHandlers$' + randomKey;
844
845function precacheFiberNode(hostInst, node) {
846 node[internalInstanceKey] = hostInst;
847}
848
849/**
850 * Given a DOM node, return the closest ReactDOMComponent or
851 * ReactDOMTextComponent instance ancestor.
852 */
853function getClosestInstanceFromNode(node) {
854 if (node[internalInstanceKey]) {
855 return node[internalInstanceKey];
856 }
857
858 while (!node[internalInstanceKey]) {
859 if (node.parentNode) {
860 node = node.parentNode;
861 } else {
862 // Top of the tree. This node must not be part of a React tree (or is
863 // unmounted, potentially).
864 return null;
865 }
866 }
867
868 var inst = node[internalInstanceKey];
869 if (inst.tag === HostComponent || inst.tag === HostText) {
870 // In Fiber, this will always be the deepest root.
871 return inst;
872 }
873
874 return null;
875}
876
877/**
878 * Given a DOM node, return the ReactDOMComponent or ReactDOMTextComponent
879 * instance, or null if the node was not rendered by this React.
880 */
881function getInstanceFromNode$1(node) {
882 var inst = node[internalInstanceKey];
883 if (inst) {
884 if (inst.tag === HostComponent || inst.tag === HostText) {
885 return inst;
886 } else {
887 return null;
888 }
889 }
890 return null;
891}
892
893/**
894 * Given a ReactDOMComponent or ReactDOMTextComponent, return the corresponding
895 * DOM node.
896 */
897function getNodeFromInstance$1(inst) {
898 if (inst.tag === HostComponent || inst.tag === HostText) {
899 // In Fiber this, is just the state node right now. We assume it will be
900 // a host component or host text.
901 return inst.stateNode;
902 }
903
904 // Without this first invariant, passing a non-DOM-component triggers the next
905 // invariant for a missing parent, which is super confusing.
906 invariant(false, 'getNodeFromInstance: Invalid argument.');
907}
908
909function getFiberCurrentPropsFromNode$1(node) {
910 return node[internalEventHandlersKey] || null;
911}
912
913function updateFiberProps(node, props) {
914 node[internalEventHandlersKey] = props;
915}
916
917function getParent(inst) {
918 do {
919 inst = inst.return;
920 // TODO: If this is a HostRoot we might want to bail out.
921 // That is depending on if we want nested subtrees (layers) to bubble
922 // events to their parent. We could also go through parentNode on the
923 // host node but that wouldn't work for React Native and doesn't let us
924 // do the portal feature.
925 } while (inst && inst.tag !== HostComponent);
926 if (inst) {
927 return inst;
928 }
929 return null;
930}
931
932/**
933 * Return the lowest common ancestor of A and B, or null if they are in
934 * different trees.
935 */
936function getLowestCommonAncestor(instA, instB) {
937 var depthA = 0;
938 for (var tempA = instA; tempA; tempA = getParent(tempA)) {
939 depthA++;
940 }
941 var depthB = 0;
942 for (var tempB = instB; tempB; tempB = getParent(tempB)) {
943 depthB++;
944 }
945
946 // If A is deeper, crawl up.
947 while (depthA - depthB > 0) {
948 instA = getParent(instA);
949 depthA--;
950 }
951
952 // If B is deeper, crawl up.
953 while (depthB - depthA > 0) {
954 instB = getParent(instB);
955 depthB--;
956 }
957
958 // Walk in lockstep until we find a match.
959 var depth = depthA;
960 while (depth--) {
961 if (instA === instB || instA === instB.alternate) {
962 return instA;
963 }
964 instA = getParent(instA);
965 instB = getParent(instB);
966 }
967 return null;
968}
969
970/**
971 * Return if A is an ancestor of B.
972 */
973
974
975/**
976 * Return the parent instance of the passed-in instance.
977 */
978
979
980/**
981 * Simulates the traversal of a two-phase, capture/bubble event dispatch.
982 */
983function traverseTwoPhase(inst, fn, arg) {
984 var path = [];
985 while (inst) {
986 path.push(inst);
987 inst = getParent(inst);
988 }
989 var i = void 0;
990 for (i = path.length; i-- > 0;) {
991 fn(path[i], 'captured', arg);
992 }
993 for (i = 0; i < path.length; i++) {
994 fn(path[i], 'bubbled', arg);
995 }
996}
997
998/**
999 * Traverses the ID hierarchy and invokes the supplied `cb` on any IDs that
1000 * should would receive a `mouseEnter` or `mouseLeave` event.
1001 *
1002 * Does not invoke the callback on the nearest common ancestor because nothing
1003 * "entered" or "left" that element.
1004 */
1005function traverseEnterLeave(from, to, fn, argFrom, argTo) {
1006 var common = from && to ? getLowestCommonAncestor(from, to) : null;
1007 var pathFrom = [];
1008 while (true) {
1009 if (!from) {
1010 break;
1011 }
1012 if (from === common) {
1013 break;
1014 }
1015 var alternate = from.alternate;
1016 if (alternate !== null && alternate === common) {
1017 break;
1018 }
1019 pathFrom.push(from);
1020 from = getParent(from);
1021 }
1022 var pathTo = [];
1023 while (true) {
1024 if (!to) {
1025 break;
1026 }
1027 if (to === common) {
1028 break;
1029 }
1030 var _alternate = to.alternate;
1031 if (_alternate !== null && _alternate === common) {
1032 break;
1033 }
1034 pathTo.push(to);
1035 to = getParent(to);
1036 }
1037 for (var i = 0; i < pathFrom.length; i++) {
1038 fn(pathFrom[i], 'bubbled', argFrom);
1039 }
1040 for (var _i = pathTo.length; _i-- > 0;) {
1041 fn(pathTo[_i], 'captured', argTo);
1042 }
1043}
1044
1045/**
1046 * Some event types have a notion of different registration names for different
1047 * "phases" of propagation. This finds listeners by a given phase.
1048 */
1049function listenerAtPhase(inst, event, propagationPhase) {
1050 var registrationName = event.dispatchConfig.phasedRegistrationNames[propagationPhase];
1051 return getListener(inst, registrationName);
1052}
1053
1054/**
1055 * A small set of propagation patterns, each of which will accept a small amount
1056 * of information, and generate a set of "dispatch ready event objects" - which
1057 * are sets of events that have already been annotated with a set of dispatched
1058 * listener functions/ids. The API is designed this way to discourage these
1059 * propagation strategies from actually executing the dispatches, since we
1060 * always want to collect the entire set of dispatches before executing even a
1061 * single one.
1062 */
1063
1064/**
1065 * Tags a `SyntheticEvent` with dispatched listeners. Creating this function
1066 * here, allows us to not have to bind or create functions for each event.
1067 * Mutating the event's members allows us to not have to create a wrapping
1068 * "dispatch" object that pairs the event with the listener.
1069 */
1070function accumulateDirectionalDispatches(inst, phase, event) {
1071 {
1072 !inst ? warningWithoutStack$1(false, 'Dispatching inst must not be null') : void 0;
1073 }
1074 var listener = listenerAtPhase(inst, event, phase);
1075 if (listener) {
1076 event._dispatchListeners = accumulateInto(event._dispatchListeners, listener);
1077 event._dispatchInstances = accumulateInto(event._dispatchInstances, inst);
1078 }
1079}
1080
1081/**
1082 * Collect dispatches (must be entirely collected before dispatching - see unit
1083 * tests). Lazily allocate the array to conserve memory. We must loop through
1084 * each event and perform the traversal for each one. We cannot perform a
1085 * single traversal for the entire collection of events because each event may
1086 * have a different target.
1087 */
1088function accumulateTwoPhaseDispatchesSingle(event) {
1089 if (event && event.dispatchConfig.phasedRegistrationNames) {
1090 traverseTwoPhase(event._targetInst, accumulateDirectionalDispatches, event);
1091 }
1092}
1093
1094/**
1095 * Accumulates without regard to direction, does not look for phased
1096 * registration names. Same as `accumulateDirectDispatchesSingle` but without
1097 * requiring that the `dispatchMarker` be the same as the dispatched ID.
1098 */
1099function accumulateDispatches(inst, ignoredDirection, event) {
1100 if (inst && event && event.dispatchConfig.registrationName) {
1101 var registrationName = event.dispatchConfig.registrationName;
1102 var listener = getListener(inst, registrationName);
1103 if (listener) {
1104 event._dispatchListeners = accumulateInto(event._dispatchListeners, listener);
1105 event._dispatchInstances = accumulateInto(event._dispatchInstances, inst);
1106 }
1107 }
1108}
1109
1110/**
1111 * Accumulates dispatches on an `SyntheticEvent`, but only for the
1112 * `dispatchMarker`.
1113 * @param {SyntheticEvent} event
1114 */
1115function accumulateDirectDispatchesSingle(event) {
1116 if (event && event.dispatchConfig.registrationName) {
1117 accumulateDispatches(event._targetInst, null, event);
1118 }
1119}
1120
1121function accumulateTwoPhaseDispatches(events) {
1122 forEachAccumulated(events, accumulateTwoPhaseDispatchesSingle);
1123}
1124
1125
1126
1127function accumulateEnterLeaveDispatches(leave, enter, from, to) {
1128 traverseEnterLeave(from, to, accumulateDispatches, leave, enter);
1129}
1130
1131function accumulateDirectDispatches(events) {
1132 forEachAccumulated(events, accumulateDirectDispatchesSingle);
1133}
1134
1135var canUseDOM = !!(typeof window !== 'undefined' && window.document && window.document.createElement);
1136
1137// Do not uses the below two methods directly!
1138// Instead use constants exported from DOMTopLevelEventTypes in ReactDOM.
1139// (It is the only module that is allowed to access these methods.)
1140
1141function unsafeCastStringToDOMTopLevelType(topLevelType) {
1142 return topLevelType;
1143}
1144
1145function unsafeCastDOMTopLevelTypeToString(topLevelType) {
1146 return topLevelType;
1147}
1148
1149/**
1150 * Generate a mapping of standard vendor prefixes using the defined style property and event name.
1151 *
1152 * @param {string} styleProp
1153 * @param {string} eventName
1154 * @returns {object}
1155 */
1156function makePrefixMap(styleProp, eventName) {
1157 var prefixes = {};
1158
1159 prefixes[styleProp.toLowerCase()] = eventName.toLowerCase();
1160 prefixes['Webkit' + styleProp] = 'webkit' + eventName;
1161 prefixes['Moz' + styleProp] = 'moz' + eventName;
1162
1163 return prefixes;
1164}
1165
1166/**
1167 * A list of event names to a configurable list of vendor prefixes.
1168 */
1169var vendorPrefixes = {
1170 animationend: makePrefixMap('Animation', 'AnimationEnd'),
1171 animationiteration: makePrefixMap('Animation', 'AnimationIteration'),
1172 animationstart: makePrefixMap('Animation', 'AnimationStart'),
1173 transitionend: makePrefixMap('Transition', 'TransitionEnd')
1174};
1175
1176/**
1177 * Event names that have already been detected and prefixed (if applicable).
1178 */
1179var prefixedEventNames = {};
1180
1181/**
1182 * Element to check for prefixes on.
1183 */
1184var style = {};
1185
1186/**
1187 * Bootstrap if a DOM exists.
1188 */
1189if (canUseDOM) {
1190 style = document.createElement('div').style;
1191
1192 // On some platforms, in particular some releases of Android 4.x,
1193 // the un-prefixed "animation" and "transition" properties are defined on the
1194 // style object but the events that fire will still be prefixed, so we need
1195 // to check if the un-prefixed events are usable, and if not remove them from the map.
1196 if (!('AnimationEvent' in window)) {
1197 delete vendorPrefixes.animationend.animation;
1198 delete vendorPrefixes.animationiteration.animation;
1199 delete vendorPrefixes.animationstart.animation;
1200 }
1201
1202 // Same as above
1203 if (!('TransitionEvent' in window)) {
1204 delete vendorPrefixes.transitionend.transition;
1205 }
1206}
1207
1208/**
1209 * Attempts to determine the correct vendor prefixed event name.
1210 *
1211 * @param {string} eventName
1212 * @returns {string}
1213 */
1214function getVendorPrefixedEventName(eventName) {
1215 if (prefixedEventNames[eventName]) {
1216 return prefixedEventNames[eventName];
1217 } else if (!vendorPrefixes[eventName]) {
1218 return eventName;
1219 }
1220
1221 var prefixMap = vendorPrefixes[eventName];
1222
1223 for (var styleProp in prefixMap) {
1224 if (prefixMap.hasOwnProperty(styleProp) && styleProp in style) {
1225 return prefixedEventNames[eventName] = prefixMap[styleProp];
1226 }
1227 }
1228
1229 return eventName;
1230}
1231
1232/**
1233 * To identify top level events in ReactDOM, we use constants defined by this
1234 * module. This is the only module that uses the unsafe* methods to express
1235 * that the constants actually correspond to the browser event names. This lets
1236 * us save some bundle size by avoiding a top level type -> event name map.
1237 * The rest of ReactDOM code should import top level types from this file.
1238 */
1239var TOP_ABORT = unsafeCastStringToDOMTopLevelType('abort');
1240var TOP_ANIMATION_END = unsafeCastStringToDOMTopLevelType(getVendorPrefixedEventName('animationend'));
1241var TOP_ANIMATION_ITERATION = unsafeCastStringToDOMTopLevelType(getVendorPrefixedEventName('animationiteration'));
1242var TOP_ANIMATION_START = unsafeCastStringToDOMTopLevelType(getVendorPrefixedEventName('animationstart'));
1243var TOP_BLUR = unsafeCastStringToDOMTopLevelType('blur');
1244var TOP_CAN_PLAY = unsafeCastStringToDOMTopLevelType('canplay');
1245var TOP_CAN_PLAY_THROUGH = unsafeCastStringToDOMTopLevelType('canplaythrough');
1246var TOP_CANCEL = unsafeCastStringToDOMTopLevelType('cancel');
1247var TOP_CHANGE = unsafeCastStringToDOMTopLevelType('change');
1248var TOP_CLICK = unsafeCastStringToDOMTopLevelType('click');
1249var TOP_CLOSE = unsafeCastStringToDOMTopLevelType('close');
1250var TOP_COMPOSITION_END = unsafeCastStringToDOMTopLevelType('compositionend');
1251var TOP_COMPOSITION_START = unsafeCastStringToDOMTopLevelType('compositionstart');
1252var TOP_COMPOSITION_UPDATE = unsafeCastStringToDOMTopLevelType('compositionupdate');
1253var TOP_CONTEXT_MENU = unsafeCastStringToDOMTopLevelType('contextmenu');
1254var TOP_COPY = unsafeCastStringToDOMTopLevelType('copy');
1255var TOP_CUT = unsafeCastStringToDOMTopLevelType('cut');
1256var TOP_DOUBLE_CLICK = unsafeCastStringToDOMTopLevelType('dblclick');
1257var TOP_AUX_CLICK = unsafeCastStringToDOMTopLevelType('auxclick');
1258var TOP_DRAG = unsafeCastStringToDOMTopLevelType('drag');
1259var TOP_DRAG_END = unsafeCastStringToDOMTopLevelType('dragend');
1260var TOP_DRAG_ENTER = unsafeCastStringToDOMTopLevelType('dragenter');
1261var TOP_DRAG_EXIT = unsafeCastStringToDOMTopLevelType('dragexit');
1262var TOP_DRAG_LEAVE = unsafeCastStringToDOMTopLevelType('dragleave');
1263var TOP_DRAG_OVER = unsafeCastStringToDOMTopLevelType('dragover');
1264var TOP_DRAG_START = unsafeCastStringToDOMTopLevelType('dragstart');
1265var TOP_DROP = unsafeCastStringToDOMTopLevelType('drop');
1266var TOP_DURATION_CHANGE = unsafeCastStringToDOMTopLevelType('durationchange');
1267var TOP_EMPTIED = unsafeCastStringToDOMTopLevelType('emptied');
1268var TOP_ENCRYPTED = unsafeCastStringToDOMTopLevelType('encrypted');
1269var TOP_ENDED = unsafeCastStringToDOMTopLevelType('ended');
1270var TOP_ERROR = unsafeCastStringToDOMTopLevelType('error');
1271var TOP_FOCUS = unsafeCastStringToDOMTopLevelType('focus');
1272var TOP_GOT_POINTER_CAPTURE = unsafeCastStringToDOMTopLevelType('gotpointercapture');
1273var TOP_INPUT = unsafeCastStringToDOMTopLevelType('input');
1274var TOP_INVALID = unsafeCastStringToDOMTopLevelType('invalid');
1275var TOP_KEY_DOWN = unsafeCastStringToDOMTopLevelType('keydown');
1276var TOP_KEY_PRESS = unsafeCastStringToDOMTopLevelType('keypress');
1277var TOP_KEY_UP = unsafeCastStringToDOMTopLevelType('keyup');
1278var TOP_LOAD = unsafeCastStringToDOMTopLevelType('load');
1279var TOP_LOAD_START = unsafeCastStringToDOMTopLevelType('loadstart');
1280var TOP_LOADED_DATA = unsafeCastStringToDOMTopLevelType('loadeddata');
1281var TOP_LOADED_METADATA = unsafeCastStringToDOMTopLevelType('loadedmetadata');
1282var TOP_LOST_POINTER_CAPTURE = unsafeCastStringToDOMTopLevelType('lostpointercapture');
1283var TOP_MOUSE_DOWN = unsafeCastStringToDOMTopLevelType('mousedown');
1284var TOP_MOUSE_MOVE = unsafeCastStringToDOMTopLevelType('mousemove');
1285var TOP_MOUSE_OUT = unsafeCastStringToDOMTopLevelType('mouseout');
1286var TOP_MOUSE_OVER = unsafeCastStringToDOMTopLevelType('mouseover');
1287var TOP_MOUSE_UP = unsafeCastStringToDOMTopLevelType('mouseup');
1288var TOP_PASTE = unsafeCastStringToDOMTopLevelType('paste');
1289var TOP_PAUSE = unsafeCastStringToDOMTopLevelType('pause');
1290var TOP_PLAY = unsafeCastStringToDOMTopLevelType('play');
1291var TOP_PLAYING = unsafeCastStringToDOMTopLevelType('playing');
1292var TOP_POINTER_CANCEL = unsafeCastStringToDOMTopLevelType('pointercancel');
1293var TOP_POINTER_DOWN = unsafeCastStringToDOMTopLevelType('pointerdown');
1294
1295
1296var TOP_POINTER_MOVE = unsafeCastStringToDOMTopLevelType('pointermove');
1297var TOP_POINTER_OUT = unsafeCastStringToDOMTopLevelType('pointerout');
1298var TOP_POINTER_OVER = unsafeCastStringToDOMTopLevelType('pointerover');
1299var TOP_POINTER_UP = unsafeCastStringToDOMTopLevelType('pointerup');
1300var TOP_PROGRESS = unsafeCastStringToDOMTopLevelType('progress');
1301var TOP_RATE_CHANGE = unsafeCastStringToDOMTopLevelType('ratechange');
1302var TOP_RESET = unsafeCastStringToDOMTopLevelType('reset');
1303var TOP_SCROLL = unsafeCastStringToDOMTopLevelType('scroll');
1304var TOP_SEEKED = unsafeCastStringToDOMTopLevelType('seeked');
1305var TOP_SEEKING = unsafeCastStringToDOMTopLevelType('seeking');
1306var TOP_SELECTION_CHANGE = unsafeCastStringToDOMTopLevelType('selectionchange');
1307var TOP_STALLED = unsafeCastStringToDOMTopLevelType('stalled');
1308var TOP_SUBMIT = unsafeCastStringToDOMTopLevelType('submit');
1309var TOP_SUSPEND = unsafeCastStringToDOMTopLevelType('suspend');
1310var TOP_TEXT_INPUT = unsafeCastStringToDOMTopLevelType('textInput');
1311var TOP_TIME_UPDATE = unsafeCastStringToDOMTopLevelType('timeupdate');
1312var TOP_TOGGLE = unsafeCastStringToDOMTopLevelType('toggle');
1313var TOP_TOUCH_CANCEL = unsafeCastStringToDOMTopLevelType('touchcancel');
1314var TOP_TOUCH_END = unsafeCastStringToDOMTopLevelType('touchend');
1315var TOP_TOUCH_MOVE = unsafeCastStringToDOMTopLevelType('touchmove');
1316var TOP_TOUCH_START = unsafeCastStringToDOMTopLevelType('touchstart');
1317var TOP_TRANSITION_END = unsafeCastStringToDOMTopLevelType(getVendorPrefixedEventName('transitionend'));
1318var TOP_VOLUME_CHANGE = unsafeCastStringToDOMTopLevelType('volumechange');
1319var TOP_WAITING = unsafeCastStringToDOMTopLevelType('waiting');
1320var TOP_WHEEL = unsafeCastStringToDOMTopLevelType('wheel');
1321
1322// List of events that need to be individually attached to media elements.
1323// Note that events in this list will *not* be listened to at the top level
1324// unless they're explicitly whitelisted in `ReactBrowserEventEmitter.listenTo`.
1325var mediaEventTypes = [TOP_ABORT, TOP_CAN_PLAY, TOP_CAN_PLAY_THROUGH, TOP_DURATION_CHANGE, TOP_EMPTIED, TOP_ENCRYPTED, TOP_ENDED, TOP_ERROR, TOP_LOADED_DATA, TOP_LOADED_METADATA, TOP_LOAD_START, TOP_PAUSE, TOP_PLAY, TOP_PLAYING, TOP_PROGRESS, TOP_RATE_CHANGE, TOP_SEEKED, TOP_SEEKING, TOP_STALLED, TOP_SUSPEND, TOP_TIME_UPDATE, TOP_VOLUME_CHANGE, TOP_WAITING];
1326
1327function getRawEventName(topLevelType) {
1328 return unsafeCastDOMTopLevelTypeToString(topLevelType);
1329}
1330
1331/**
1332 * These variables store information about text content of a target node,
1333 * allowing comparison of content before and after a given event.
1334 *
1335 * Identify the node where selection currently begins, then observe
1336 * both its text content and its current position in the DOM. Since the
1337 * browser may natively replace the target node during composition, we can
1338 * use its position to find its replacement.
1339 *
1340 *
1341 */
1342
1343var root = null;
1344var startText = null;
1345var fallbackText = null;
1346
1347function initialize(nativeEventTarget) {
1348 root = nativeEventTarget;
1349 startText = getText();
1350 return true;
1351}
1352
1353function reset() {
1354 root = null;
1355 startText = null;
1356 fallbackText = null;
1357}
1358
1359function getData() {
1360 if (fallbackText) {
1361 return fallbackText;
1362 }
1363
1364 var start = void 0;
1365 var startValue = startText;
1366 var startLength = startValue.length;
1367 var end = void 0;
1368 var endValue = getText();
1369 var endLength = endValue.length;
1370
1371 for (start = 0; start < startLength; start++) {
1372 if (startValue[start] !== endValue[start]) {
1373 break;
1374 }
1375 }
1376
1377 var minEnd = startLength - start;
1378 for (end = 1; end <= minEnd; end++) {
1379 if (startValue[startLength - end] !== endValue[endLength - end]) {
1380 break;
1381 }
1382 }
1383
1384 var sliceTail = end > 1 ? 1 - end : undefined;
1385 fallbackText = endValue.slice(start, sliceTail);
1386 return fallbackText;
1387}
1388
1389function getText() {
1390 if ('value' in root) {
1391 return root.value;
1392 }
1393 return root.textContent;
1394}
1395
1396var ReactInternals = React.__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED;
1397
1398var _assign = ReactInternals.assign;
1399
1400/* eslint valid-typeof: 0 */
1401
1402var EVENT_POOL_SIZE = 10;
1403
1404/**
1405 * @interface Event
1406 * @see http://www.w3.org/TR/DOM-Level-3-Events/
1407 */
1408var EventInterface = {
1409 type: null,
1410 target: null,
1411 // currentTarget is set when dispatching; no use in copying it here
1412 currentTarget: function () {
1413 return null;
1414 },
1415 eventPhase: null,
1416 bubbles: null,
1417 cancelable: null,
1418 timeStamp: function (event) {
1419 return event.timeStamp || Date.now();
1420 },
1421 defaultPrevented: null,
1422 isTrusted: null
1423};
1424
1425function functionThatReturnsTrue() {
1426 return true;
1427}
1428
1429function functionThatReturnsFalse() {
1430 return false;
1431}
1432
1433/**
1434 * Synthetic events are dispatched by event plugins, typically in response to a
1435 * top-level event delegation handler.
1436 *
1437 * These systems should generally use pooling to reduce the frequency of garbage
1438 * collection. The system should check `isPersistent` to determine whether the
1439 * event should be released into the pool after being dispatched. Users that
1440 * need a persisted event should invoke `persist`.
1441 *
1442 * Synthetic events (and subclasses) implement the DOM Level 3 Events API by
1443 * normalizing browser quirks. Subclasses do not necessarily have to implement a
1444 * DOM interface; custom application-specific events can also subclass this.
1445 *
1446 * @param {object} dispatchConfig Configuration used to dispatch this event.
1447 * @param {*} targetInst Marker identifying the event target.
1448 * @param {object} nativeEvent Native browser event.
1449 * @param {DOMEventTarget} nativeEventTarget Target node.
1450 */
1451function SyntheticEvent(dispatchConfig, targetInst, nativeEvent, nativeEventTarget) {
1452 {
1453 // these have a getter/setter for warnings
1454 delete this.nativeEvent;
1455 delete this.preventDefault;
1456 delete this.stopPropagation;
1457 delete this.isDefaultPrevented;
1458 delete this.isPropagationStopped;
1459 }
1460
1461 this.dispatchConfig = dispatchConfig;
1462 this._targetInst = targetInst;
1463 this.nativeEvent = nativeEvent;
1464
1465 var Interface = this.constructor.Interface;
1466 for (var propName in Interface) {
1467 if (!Interface.hasOwnProperty(propName)) {
1468 continue;
1469 }
1470 {
1471 delete this[propName]; // this has a getter/setter for warnings
1472 }
1473 var normalize = Interface[propName];
1474 if (normalize) {
1475 this[propName] = normalize(nativeEvent);
1476 } else {
1477 if (propName === 'target') {
1478 this.target = nativeEventTarget;
1479 } else {
1480 this[propName] = nativeEvent[propName];
1481 }
1482 }
1483 }
1484
1485 var defaultPrevented = nativeEvent.defaultPrevented != null ? nativeEvent.defaultPrevented : nativeEvent.returnValue === false;
1486 if (defaultPrevented) {
1487 this.isDefaultPrevented = functionThatReturnsTrue;
1488 } else {
1489 this.isDefaultPrevented = functionThatReturnsFalse;
1490 }
1491 this.isPropagationStopped = functionThatReturnsFalse;
1492 return this;
1493}
1494
1495_assign(SyntheticEvent.prototype, {
1496 preventDefault: function () {
1497 this.defaultPrevented = true;
1498 var event = this.nativeEvent;
1499 if (!event) {
1500 return;
1501 }
1502
1503 if (event.preventDefault) {
1504 event.preventDefault();
1505 } else if (typeof event.returnValue !== 'unknown') {
1506 event.returnValue = false;
1507 }
1508 this.isDefaultPrevented = functionThatReturnsTrue;
1509 },
1510
1511 stopPropagation: function () {
1512 var event = this.nativeEvent;
1513 if (!event) {
1514 return;
1515 }
1516
1517 if (event.stopPropagation) {
1518 event.stopPropagation();
1519 } else if (typeof event.cancelBubble !== 'unknown') {
1520 // The ChangeEventPlugin registers a "propertychange" event for
1521 // IE. This event does not support bubbling or cancelling, and
1522 // any references to cancelBubble throw "Member not found". A
1523 // typeof check of "unknown" circumvents this issue (and is also
1524 // IE specific).
1525 event.cancelBubble = true;
1526 }
1527
1528 this.isPropagationStopped = functionThatReturnsTrue;
1529 },
1530
1531 /**
1532 * We release all dispatched `SyntheticEvent`s after each event loop, adding
1533 * them back into the pool. This allows a way to hold onto a reference that
1534 * won't be added back into the pool.
1535 */
1536 persist: function () {
1537 this.isPersistent = functionThatReturnsTrue;
1538 },
1539
1540 /**
1541 * Checks if this event should be released back into the pool.
1542 *
1543 * @return {boolean} True if this should not be released, false otherwise.
1544 */
1545 isPersistent: functionThatReturnsFalse,
1546
1547 /**
1548 * `PooledClass` looks for `destructor` on each instance it releases.
1549 */
1550 destructor: function () {
1551 var Interface = this.constructor.Interface;
1552 for (var propName in Interface) {
1553 {
1554 Object.defineProperty(this, propName, getPooledWarningPropertyDefinition(propName, Interface[propName]));
1555 }
1556 }
1557 this.dispatchConfig = null;
1558 this._targetInst = null;
1559 this.nativeEvent = null;
1560 this.isDefaultPrevented = functionThatReturnsFalse;
1561 this.isPropagationStopped = functionThatReturnsFalse;
1562 this._dispatchListeners = null;
1563 this._dispatchInstances = null;
1564 {
1565 Object.defineProperty(this, 'nativeEvent', getPooledWarningPropertyDefinition('nativeEvent', null));
1566 Object.defineProperty(this, 'isDefaultPrevented', getPooledWarningPropertyDefinition('isDefaultPrevented', functionThatReturnsFalse));
1567 Object.defineProperty(this, 'isPropagationStopped', getPooledWarningPropertyDefinition('isPropagationStopped', functionThatReturnsFalse));
1568 Object.defineProperty(this, 'preventDefault', getPooledWarningPropertyDefinition('preventDefault', function () {}));
1569 Object.defineProperty(this, 'stopPropagation', getPooledWarningPropertyDefinition('stopPropagation', function () {}));
1570 }
1571 }
1572});
1573
1574SyntheticEvent.Interface = EventInterface;
1575
1576/**
1577 * Helper to reduce boilerplate when creating subclasses.
1578 */
1579SyntheticEvent.extend = function (Interface) {
1580 var Super = this;
1581
1582 var E = function () {};
1583 E.prototype = Super.prototype;
1584 var prototype = new E();
1585
1586 function Class() {
1587 return Super.apply(this, arguments);
1588 }
1589 _assign(prototype, Class.prototype);
1590 Class.prototype = prototype;
1591 Class.prototype.constructor = Class;
1592
1593 Class.Interface = _assign({}, Super.Interface, Interface);
1594 Class.extend = Super.extend;
1595 addEventPoolingTo(Class);
1596
1597 return Class;
1598};
1599
1600addEventPoolingTo(SyntheticEvent);
1601
1602/**
1603 * Helper to nullify syntheticEvent instance properties when destructing
1604 *
1605 * @param {String} propName
1606 * @param {?object} getVal
1607 * @return {object} defineProperty object
1608 */
1609function getPooledWarningPropertyDefinition(propName, getVal) {
1610 var isFunction = typeof getVal === 'function';
1611 return {
1612 configurable: true,
1613 set: set,
1614 get: get
1615 };
1616
1617 function set(val) {
1618 var action = isFunction ? 'setting the method' : 'setting the property';
1619 warn(action, 'This is effectively a no-op');
1620 return val;
1621 }
1622
1623 function get() {
1624 var action = isFunction ? 'accessing the method' : 'accessing the property';
1625 var result = isFunction ? 'This is a no-op function' : 'This is set to null';
1626 warn(action, result);
1627 return getVal;
1628 }
1629
1630 function warn(action, result) {
1631 var warningCondition = false;
1632 !warningCondition ? warningWithoutStack$1(false, "This synthetic event is reused for performance reasons. If you're seeing this, " + "you're %s `%s` on a released/nullified synthetic event. %s. " + 'If you must keep the original synthetic event around, use event.persist(). ' + 'See https://fb.me/react-event-pooling for more information.', action, propName, result) : void 0;
1633 }
1634}
1635
1636function getPooledEvent(dispatchConfig, targetInst, nativeEvent, nativeInst) {
1637 var EventConstructor = this;
1638 if (EventConstructor.eventPool.length) {
1639 var instance = EventConstructor.eventPool.pop();
1640 EventConstructor.call(instance, dispatchConfig, targetInst, nativeEvent, nativeInst);
1641 return instance;
1642 }
1643 return new EventConstructor(dispatchConfig, targetInst, nativeEvent, nativeInst);
1644}
1645
1646function releasePooledEvent(event) {
1647 var EventConstructor = this;
1648 !(event instanceof EventConstructor) ? invariant(false, 'Trying to release an event instance into a pool of a different type.') : void 0;
1649 event.destructor();
1650 if (EventConstructor.eventPool.length < EVENT_POOL_SIZE) {
1651 EventConstructor.eventPool.push(event);
1652 }
1653}
1654
1655function addEventPoolingTo(EventConstructor) {
1656 EventConstructor.eventPool = [];
1657 EventConstructor.getPooled = getPooledEvent;
1658 EventConstructor.release = releasePooledEvent;
1659}
1660
1661/**
1662 * @interface Event
1663 * @see http://www.w3.org/TR/DOM-Level-3-Events/#events-compositionevents
1664 */
1665var SyntheticCompositionEvent = SyntheticEvent.extend({
1666 data: null
1667});
1668
1669/**
1670 * @interface Event
1671 * @see http://www.w3.org/TR/2013/WD-DOM-Level-3-Events-20131105
1672 * /#events-inputevents
1673 */
1674var SyntheticInputEvent = SyntheticEvent.extend({
1675 data: null
1676});
1677
1678var END_KEYCODES = [9, 13, 27, 32]; // Tab, Return, Esc, Space
1679var START_KEYCODE = 229;
1680
1681var canUseCompositionEvent = canUseDOM && 'CompositionEvent' in window;
1682
1683var documentMode = null;
1684if (canUseDOM && 'documentMode' in document) {
1685 documentMode = document.documentMode;
1686}
1687
1688// Webkit offers a very useful `textInput` event that can be used to
1689// directly represent `beforeInput`. The IE `textinput` event is not as
1690// useful, so we don't use it.
1691var canUseTextInputEvent = canUseDOM && 'TextEvent' in window && !documentMode;
1692
1693// In IE9+, we have access to composition events, but the data supplied
1694// by the native compositionend event may be incorrect. Japanese ideographic
1695// spaces, for instance (\u3000) are not recorded correctly.
1696var useFallbackCompositionData = canUseDOM && (!canUseCompositionEvent || documentMode && documentMode > 8 && documentMode <= 11);
1697
1698var SPACEBAR_CODE = 32;
1699var SPACEBAR_CHAR = String.fromCharCode(SPACEBAR_CODE);
1700
1701// Events and their corresponding property names.
1702var eventTypes = {
1703 beforeInput: {
1704 phasedRegistrationNames: {
1705 bubbled: 'onBeforeInput',
1706 captured: 'onBeforeInputCapture'
1707 },
1708 dependencies: [TOP_COMPOSITION_END, TOP_KEY_PRESS, TOP_TEXT_INPUT, TOP_PASTE]
1709 },
1710 compositionEnd: {
1711 phasedRegistrationNames: {
1712 bubbled: 'onCompositionEnd',
1713 captured: 'onCompositionEndCapture'
1714 },
1715 dependencies: [TOP_BLUR, TOP_COMPOSITION_END, TOP_KEY_DOWN, TOP_KEY_PRESS, TOP_KEY_UP, TOP_MOUSE_DOWN]
1716 },
1717 compositionStart: {
1718 phasedRegistrationNames: {
1719 bubbled: 'onCompositionStart',
1720 captured: 'onCompositionStartCapture'
1721 },
1722 dependencies: [TOP_BLUR, TOP_COMPOSITION_START, TOP_KEY_DOWN, TOP_KEY_PRESS, TOP_KEY_UP, TOP_MOUSE_DOWN]
1723 },
1724 compositionUpdate: {
1725 phasedRegistrationNames: {
1726 bubbled: 'onCompositionUpdate',
1727 captured: 'onCompositionUpdateCapture'
1728 },
1729 dependencies: [TOP_BLUR, TOP_COMPOSITION_UPDATE, TOP_KEY_DOWN, TOP_KEY_PRESS, TOP_KEY_UP, TOP_MOUSE_DOWN]
1730 }
1731};
1732
1733// Track whether we've ever handled a keypress on the space key.
1734var hasSpaceKeypress = false;
1735
1736/**
1737 * Return whether a native keypress event is assumed to be a command.
1738 * This is required because Firefox fires `keypress` events for key commands
1739 * (cut, copy, select-all, etc.) even though no character is inserted.
1740 */
1741function isKeypressCommand(nativeEvent) {
1742 return (nativeEvent.ctrlKey || nativeEvent.altKey || nativeEvent.metaKey) &&
1743 // ctrlKey && altKey is equivalent to AltGr, and is not a command.
1744 !(nativeEvent.ctrlKey && nativeEvent.altKey);
1745}
1746
1747/**
1748 * Translate native top level events into event types.
1749 *
1750 * @param {string} topLevelType
1751 * @return {object}
1752 */
1753function getCompositionEventType(topLevelType) {
1754 switch (topLevelType) {
1755 case TOP_COMPOSITION_START:
1756 return eventTypes.compositionStart;
1757 case TOP_COMPOSITION_END:
1758 return eventTypes.compositionEnd;
1759 case TOP_COMPOSITION_UPDATE:
1760 return eventTypes.compositionUpdate;
1761 }
1762}
1763
1764/**
1765 * Does our fallback best-guess model think this event signifies that
1766 * composition has begun?
1767 *
1768 * @param {string} topLevelType
1769 * @param {object} nativeEvent
1770 * @return {boolean}
1771 */
1772function isFallbackCompositionStart(topLevelType, nativeEvent) {
1773 return topLevelType === TOP_KEY_DOWN && nativeEvent.keyCode === START_KEYCODE;
1774}
1775
1776/**
1777 * Does our fallback mode think that this event is the end of composition?
1778 *
1779 * @param {string} topLevelType
1780 * @param {object} nativeEvent
1781 * @return {boolean}
1782 */
1783function isFallbackCompositionEnd(topLevelType, nativeEvent) {
1784 switch (topLevelType) {
1785 case TOP_KEY_UP:
1786 // Command keys insert or clear IME input.
1787 return END_KEYCODES.indexOf(nativeEvent.keyCode) !== -1;
1788 case TOP_KEY_DOWN:
1789 // Expect IME keyCode on each keydown. If we get any other
1790 // code we must have exited earlier.
1791 return nativeEvent.keyCode !== START_KEYCODE;
1792 case TOP_KEY_PRESS:
1793 case TOP_MOUSE_DOWN:
1794 case TOP_BLUR:
1795 // Events are not possible without cancelling IME.
1796 return true;
1797 default:
1798 return false;
1799 }
1800}
1801
1802/**
1803 * Google Input Tools provides composition data via a CustomEvent,
1804 * with the `data` property populated in the `detail` object. If this
1805 * is available on the event object, use it. If not, this is a plain
1806 * composition event and we have nothing special to extract.
1807 *
1808 * @param {object} nativeEvent
1809 * @return {?string}
1810 */
1811function getDataFromCustomEvent(nativeEvent) {
1812 var detail = nativeEvent.detail;
1813 if (typeof detail === 'object' && 'data' in detail) {
1814 return detail.data;
1815 }
1816 return null;
1817}
1818
1819/**
1820 * Check if a composition event was triggered by Korean IME.
1821 * Our fallback mode does not work well with IE's Korean IME,
1822 * so just use native composition events when Korean IME is used.
1823 * Although CompositionEvent.locale property is deprecated,
1824 * it is available in IE, where our fallback mode is enabled.
1825 *
1826 * @param {object} nativeEvent
1827 * @return {boolean}
1828 */
1829function isUsingKoreanIME(nativeEvent) {
1830 return nativeEvent.locale === 'ko';
1831}
1832
1833// Track the current IME composition status, if any.
1834var isComposing = false;
1835
1836/**
1837 * @return {?object} A SyntheticCompositionEvent.
1838 */
1839function extractCompositionEvent(topLevelType, targetInst, nativeEvent, nativeEventTarget) {
1840 var eventType = void 0;
1841 var fallbackData = void 0;
1842
1843 if (canUseCompositionEvent) {
1844 eventType = getCompositionEventType(topLevelType);
1845 } else if (!isComposing) {
1846 if (isFallbackCompositionStart(topLevelType, nativeEvent)) {
1847 eventType = eventTypes.compositionStart;
1848 }
1849 } else if (isFallbackCompositionEnd(topLevelType, nativeEvent)) {
1850 eventType = eventTypes.compositionEnd;
1851 }
1852
1853 if (!eventType) {
1854 return null;
1855 }
1856
1857 if (useFallbackCompositionData && !isUsingKoreanIME(nativeEvent)) {
1858 // The current composition is stored statically and must not be
1859 // overwritten while composition continues.
1860 if (!isComposing && eventType === eventTypes.compositionStart) {
1861 isComposing = initialize(nativeEventTarget);
1862 } else if (eventType === eventTypes.compositionEnd) {
1863 if (isComposing) {
1864 fallbackData = getData();
1865 }
1866 }
1867 }
1868
1869 var event = SyntheticCompositionEvent.getPooled(eventType, targetInst, nativeEvent, nativeEventTarget);
1870
1871 if (fallbackData) {
1872 // Inject data generated from fallback path into the synthetic event.
1873 // This matches the property of native CompositionEventInterface.
1874 event.data = fallbackData;
1875 } else {
1876 var customData = getDataFromCustomEvent(nativeEvent);
1877 if (customData !== null) {
1878 event.data = customData;
1879 }
1880 }
1881
1882 accumulateTwoPhaseDispatches(event);
1883 return event;
1884}
1885
1886/**
1887 * @param {TopLevelType} topLevelType Number from `TopLevelType`.
1888 * @param {object} nativeEvent Native browser event.
1889 * @return {?string} The string corresponding to this `beforeInput` event.
1890 */
1891function getNativeBeforeInputChars(topLevelType, nativeEvent) {
1892 switch (topLevelType) {
1893 case TOP_COMPOSITION_END:
1894 return getDataFromCustomEvent(nativeEvent);
1895 case TOP_KEY_PRESS:
1896 /**
1897 * If native `textInput` events are available, our goal is to make
1898 * use of them. However, there is a special case: the spacebar key.
1899 * In Webkit, preventing default on a spacebar `textInput` event
1900 * cancels character insertion, but it *also* causes the browser
1901 * to fall back to its default spacebar behavior of scrolling the
1902 * page.
1903 *
1904 * Tracking at:
1905 * https://code.google.com/p/chromium/issues/detail?id=355103
1906 *
1907 * To avoid this issue, use the keypress event as if no `textInput`
1908 * event is available.
1909 */
1910 var which = nativeEvent.which;
1911 if (which !== SPACEBAR_CODE) {
1912 return null;
1913 }
1914
1915 hasSpaceKeypress = true;
1916 return SPACEBAR_CHAR;
1917
1918 case TOP_TEXT_INPUT:
1919 // Record the characters to be added to the DOM.
1920 var chars = nativeEvent.data;
1921
1922 // If it's a spacebar character, assume that we have already handled
1923 // it at the keypress level and bail immediately. Android Chrome
1924 // doesn't give us keycodes, so we need to ignore it.
1925 if (chars === SPACEBAR_CHAR && hasSpaceKeypress) {
1926 return null;
1927 }
1928
1929 return chars;
1930
1931 default:
1932 // For other native event types, do nothing.
1933 return null;
1934 }
1935}
1936
1937/**
1938 * For browsers that do not provide the `textInput` event, extract the
1939 * appropriate string to use for SyntheticInputEvent.
1940 *
1941 * @param {number} topLevelType Number from `TopLevelEventTypes`.
1942 * @param {object} nativeEvent Native browser event.
1943 * @return {?string} The fallback string for this `beforeInput` event.
1944 */
1945function getFallbackBeforeInputChars(topLevelType, nativeEvent) {
1946 // If we are currently composing (IME) and using a fallback to do so,
1947 // try to extract the composed characters from the fallback object.
1948 // If composition event is available, we extract a string only at
1949 // compositionevent, otherwise extract it at fallback events.
1950 if (isComposing) {
1951 if (topLevelType === TOP_COMPOSITION_END || !canUseCompositionEvent && isFallbackCompositionEnd(topLevelType, nativeEvent)) {
1952 var chars = getData();
1953 reset();
1954 isComposing = false;
1955 return chars;
1956 }
1957 return null;
1958 }
1959
1960 switch (topLevelType) {
1961 case TOP_PASTE:
1962 // If a paste event occurs after a keypress, throw out the input
1963 // chars. Paste events should not lead to BeforeInput events.
1964 return null;
1965 case TOP_KEY_PRESS:
1966 /**
1967 * As of v27, Firefox may fire keypress events even when no character
1968 * will be inserted. A few possibilities:
1969 *
1970 * - `which` is `0`. Arrow keys, Esc key, etc.
1971 *
1972 * - `which` is the pressed key code, but no char is available.
1973 * Ex: 'AltGr + d` in Polish. There is no modified character for
1974 * this key combination and no character is inserted into the
1975 * document, but FF fires the keypress for char code `100` anyway.
1976 * No `input` event will occur.
1977 *
1978 * - `which` is the pressed key code, but a command combination is
1979 * being used. Ex: `Cmd+C`. No character is inserted, and no
1980 * `input` event will occur.
1981 */
1982 if (!isKeypressCommand(nativeEvent)) {
1983 // IE fires the `keypress` event when a user types an emoji via
1984 // Touch keyboard of Windows. In such a case, the `char` property
1985 // holds an emoji character like `\uD83D\uDE0A`. Because its length
1986 // is 2, the property `which` does not represent an emoji correctly.
1987 // In such a case, we directly return the `char` property instead of
1988 // using `which`.
1989 if (nativeEvent.char && nativeEvent.char.length > 1) {
1990 return nativeEvent.char;
1991 } else if (nativeEvent.which) {
1992 return String.fromCharCode(nativeEvent.which);
1993 }
1994 }
1995 return null;
1996 case TOP_COMPOSITION_END:
1997 return useFallbackCompositionData && !isUsingKoreanIME(nativeEvent) ? null : nativeEvent.data;
1998 default:
1999 return null;
2000 }
2001}
2002
2003/**
2004 * Extract a SyntheticInputEvent for `beforeInput`, based on either native
2005 * `textInput` or fallback behavior.
2006 *
2007 * @return {?object} A SyntheticInputEvent.
2008 */
2009function extractBeforeInputEvent(topLevelType, targetInst, nativeEvent, nativeEventTarget) {
2010 var chars = void 0;
2011
2012 if (canUseTextInputEvent) {
2013 chars = getNativeBeforeInputChars(topLevelType, nativeEvent);
2014 } else {
2015 chars = getFallbackBeforeInputChars(topLevelType, nativeEvent);
2016 }
2017
2018 // If no characters are being inserted, no BeforeInput event should
2019 // be fired.
2020 if (!chars) {
2021 return null;
2022 }
2023
2024 var event = SyntheticInputEvent.getPooled(eventTypes.beforeInput, targetInst, nativeEvent, nativeEventTarget);
2025
2026 event.data = chars;
2027 accumulateTwoPhaseDispatches(event);
2028 return event;
2029}
2030
2031/**
2032 * Create an `onBeforeInput` event to match
2033 * http://www.w3.org/TR/2013/WD-DOM-Level-3-Events-20131105/#events-inputevents.
2034 *
2035 * This event plugin is based on the native `textInput` event
2036 * available in Chrome, Safari, Opera, and IE. This event fires after
2037 * `onKeyPress` and `onCompositionEnd`, but before `onInput`.
2038 *
2039 * `beforeInput` is spec'd but not implemented in any browsers, and
2040 * the `input` event does not provide any useful information about what has
2041 * actually been added, contrary to the spec. Thus, `textInput` is the best
2042 * available event to identify the characters that have actually been inserted
2043 * into the target node.
2044 *
2045 * This plugin is also responsible for emitting `composition` events, thus
2046 * allowing us to share composition fallback code for both `beforeInput` and
2047 * `composition` event types.
2048 */
2049var BeforeInputEventPlugin = {
2050 eventTypes: eventTypes,
2051
2052 extractEvents: function (topLevelType, targetInst, nativeEvent, nativeEventTarget) {
2053 var composition = extractCompositionEvent(topLevelType, targetInst, nativeEvent, nativeEventTarget);
2054
2055 var beforeInput = extractBeforeInputEvent(topLevelType, targetInst, nativeEvent, nativeEventTarget);
2056
2057 if (composition === null) {
2058 return beforeInput;
2059 }
2060
2061 if (beforeInput === null) {
2062 return composition;
2063 }
2064
2065 return [composition, beforeInput];
2066 }
2067};
2068
2069// Use to restore controlled state after a change event has fired.
2070
2071var restoreImpl = null;
2072var restoreTarget = null;
2073var restoreQueue = null;
2074
2075function restoreStateOfTarget(target) {
2076 // We perform this translation at the end of the event loop so that we
2077 // always receive the correct fiber here
2078 var internalInstance = getInstanceFromNode(target);
2079 if (!internalInstance) {
2080 // Unmounted
2081 return;
2082 }
2083 !(typeof restoreImpl === 'function') ? invariant(false, 'setRestoreImplementation() needs to be called to handle a target for controlled events. This error is likely caused by a bug in React. Please file an issue.') : void 0;
2084 var props = getFiberCurrentPropsFromNode(internalInstance.stateNode);
2085 restoreImpl(internalInstance.stateNode, internalInstance.type, props);
2086}
2087
2088function setRestoreImplementation(impl) {
2089 restoreImpl = impl;
2090}
2091
2092function enqueueStateRestore(target) {
2093 if (restoreTarget) {
2094 if (restoreQueue) {
2095 restoreQueue.push(target);
2096 } else {
2097 restoreQueue = [target];
2098 }
2099 } else {
2100 restoreTarget = target;
2101 }
2102}
2103
2104function needsStateRestore() {
2105 return restoreTarget !== null || restoreQueue !== null;
2106}
2107
2108function restoreStateIfNeeded() {
2109 if (!restoreTarget) {
2110 return;
2111 }
2112 var target = restoreTarget;
2113 var queuedTargets = restoreQueue;
2114 restoreTarget = null;
2115 restoreQueue = null;
2116
2117 restoreStateOfTarget(target);
2118 if (queuedTargets) {
2119 for (var i = 0; i < queuedTargets.length; i++) {
2120 restoreStateOfTarget(queuedTargets[i]);
2121 }
2122 }
2123}
2124
2125// Used as a way to call batchedUpdates when we don't have a reference to
2126// the renderer. Such as when we're dispatching events or if third party
2127// libraries need to call batchedUpdates. Eventually, this API will go away when
2128// everything is batched by default. We'll then have a similar API to opt-out of
2129// scheduled work and instead do synchronous work.
2130
2131// Defaults
2132var _batchedUpdatesImpl = function (fn, bookkeeping) {
2133 return fn(bookkeeping);
2134};
2135var _interactiveUpdatesImpl = function (fn, a, b) {
2136 return fn(a, b);
2137};
2138var _flushInteractiveUpdatesImpl = function () {};
2139
2140var isBatching = false;
2141function batchedUpdates(fn, bookkeeping) {
2142 if (isBatching) {
2143 // If we are currently inside another batch, we need to wait until it
2144 // fully completes before restoring state.
2145 return fn(bookkeeping);
2146 }
2147 isBatching = true;
2148 try {
2149 return _batchedUpdatesImpl(fn, bookkeeping);
2150 } finally {
2151 // Here we wait until all updates have propagated, which is important
2152 // when using controlled components within layers:
2153 // https://github.com/facebook/react/issues/1698
2154 // Then we restore state of any controlled component.
2155 isBatching = false;
2156 var controlledComponentsHavePendingUpdates = needsStateRestore();
2157 if (controlledComponentsHavePendingUpdates) {
2158 // If a controlled event was fired, we may need to restore the state of
2159 // the DOM node back to the controlled value. This is necessary when React
2160 // bails out of the update without touching the DOM.
2161 _flushInteractiveUpdatesImpl();
2162 restoreStateIfNeeded();
2163 }
2164 }
2165}
2166
2167function interactiveUpdates(fn, a, b) {
2168 return _interactiveUpdatesImpl(fn, a, b);
2169}
2170
2171
2172
2173function setBatchingImplementation(batchedUpdatesImpl, interactiveUpdatesImpl, flushInteractiveUpdatesImpl) {
2174 _batchedUpdatesImpl = batchedUpdatesImpl;
2175 _interactiveUpdatesImpl = interactiveUpdatesImpl;
2176 _flushInteractiveUpdatesImpl = flushInteractiveUpdatesImpl;
2177}
2178
2179/**
2180 * @see http://www.whatwg.org/specs/web-apps/current-work/multipage/the-input-element.html#input-type-attr-summary
2181 */
2182var supportedInputTypes = {
2183 color: true,
2184 date: true,
2185 datetime: true,
2186 'datetime-local': true,
2187 email: true,
2188 month: true,
2189 number: true,
2190 password: true,
2191 range: true,
2192 search: true,
2193 tel: true,
2194 text: true,
2195 time: true,
2196 url: true,
2197 week: true
2198};
2199
2200function isTextInputElement(elem) {
2201 var nodeName = elem && elem.nodeName && elem.nodeName.toLowerCase();
2202
2203 if (nodeName === 'input') {
2204 return !!supportedInputTypes[elem.type];
2205 }
2206
2207 if (nodeName === 'textarea') {
2208 return true;
2209 }
2210
2211 return false;
2212}
2213
2214/**
2215 * HTML nodeType values that represent the type of the node
2216 */
2217
2218var ELEMENT_NODE = 1;
2219var TEXT_NODE = 3;
2220var COMMENT_NODE = 8;
2221var DOCUMENT_NODE = 9;
2222var DOCUMENT_FRAGMENT_NODE = 11;
2223
2224/**
2225 * Gets the target node from a native browser event by accounting for
2226 * inconsistencies in browser DOM APIs.
2227 *
2228 * @param {object} nativeEvent Native browser event.
2229 * @return {DOMEventTarget} Target node.
2230 */
2231function getEventTarget(nativeEvent) {
2232 // Fallback to nativeEvent.srcElement for IE9
2233 // https://github.com/facebook/react/issues/12506
2234 var target = nativeEvent.target || nativeEvent.srcElement || window;
2235
2236 // Normalize SVG <use> element events #4963
2237 if (target.correspondingUseElement) {
2238 target = target.correspondingUseElement;
2239 }
2240
2241 // Safari may fire events on text nodes (Node.TEXT_NODE is 3).
2242 // @see http://www.quirksmode.org/js/events_properties.html
2243 return target.nodeType === TEXT_NODE ? target.parentNode : target;
2244}
2245
2246/**
2247 * Checks if an event is supported in the current execution environment.
2248 *
2249 * NOTE: This will not work correctly for non-generic events such as `change`,
2250 * `reset`, `load`, `error`, and `select`.
2251 *
2252 * Borrows from Modernizr.
2253 *
2254 * @param {string} eventNameSuffix Event name, e.g. "click".
2255 * @return {boolean} True if the event is supported.
2256 * @internal
2257 * @license Modernizr 3.0.0pre (Custom Build) | MIT
2258 */
2259function isEventSupported(eventNameSuffix) {
2260 if (!canUseDOM) {
2261 return false;
2262 }
2263
2264 var eventName = 'on' + eventNameSuffix;
2265 var isSupported = eventName in document;
2266
2267 if (!isSupported) {
2268 var element = document.createElement('div');
2269 element.setAttribute(eventName, 'return;');
2270 isSupported = typeof element[eventName] === 'function';
2271 }
2272
2273 return isSupported;
2274}
2275
2276function isCheckable(elem) {
2277 var type = elem.type;
2278 var nodeName = elem.nodeName;
2279 return nodeName && nodeName.toLowerCase() === 'input' && (type === 'checkbox' || type === 'radio');
2280}
2281
2282function getTracker(node) {
2283 return node._valueTracker;
2284}
2285
2286function detachTracker(node) {
2287 node._valueTracker = null;
2288}
2289
2290function getValueFromNode(node) {
2291 var value = '';
2292 if (!node) {
2293 return value;
2294 }
2295
2296 if (isCheckable(node)) {
2297 value = node.checked ? 'true' : 'false';
2298 } else {
2299 value = node.value;
2300 }
2301
2302 return value;
2303}
2304
2305function trackValueOnNode(node) {
2306 var valueField = isCheckable(node) ? 'checked' : 'value';
2307 var descriptor = Object.getOwnPropertyDescriptor(node.constructor.prototype, valueField);
2308
2309 var currentValue = '' + node[valueField];
2310
2311 // if someone has already defined a value or Safari, then bail
2312 // and don't track value will cause over reporting of changes,
2313 // but it's better then a hard failure
2314 // (needed for certain tests that spyOn input values and Safari)
2315 if (node.hasOwnProperty(valueField) || typeof descriptor === 'undefined' || typeof descriptor.get !== 'function' || typeof descriptor.set !== 'function') {
2316 return;
2317 }
2318 var get = descriptor.get,
2319 set = descriptor.set;
2320
2321 Object.defineProperty(node, valueField, {
2322 configurable: true,
2323 get: function () {
2324 return get.call(this);
2325 },
2326 set: function (value) {
2327 currentValue = '' + value;
2328 set.call(this, value);
2329 }
2330 });
2331 // We could've passed this the first time
2332 // but it triggers a bug in IE11 and Edge 14/15.
2333 // Calling defineProperty() again should be equivalent.
2334 // https://github.com/facebook/react/issues/11768
2335 Object.defineProperty(node, valueField, {
2336 enumerable: descriptor.enumerable
2337 });
2338
2339 var tracker = {
2340 getValue: function () {
2341 return currentValue;
2342 },
2343 setValue: function (value) {
2344 currentValue = '' + value;
2345 },
2346 stopTracking: function () {
2347 detachTracker(node);
2348 delete node[valueField];
2349 }
2350 };
2351 return tracker;
2352}
2353
2354function track(node) {
2355 if (getTracker(node)) {
2356 return;
2357 }
2358
2359 // TODO: Once it's just Fiber we can move this to node._wrapperState
2360 node._valueTracker = trackValueOnNode(node);
2361}
2362
2363function updateValueIfChanged(node) {
2364 if (!node) {
2365 return false;
2366 }
2367
2368 var tracker = getTracker(node);
2369 // if there is no tracker at this point it's unlikely
2370 // that trying again will succeed
2371 if (!tracker) {
2372 return true;
2373 }
2374
2375 var lastValue = tracker.getValue();
2376 var nextValue = getValueFromNode(node);
2377 if (nextValue !== lastValue) {
2378 tracker.setValue(nextValue);
2379 return true;
2380 }
2381 return false;
2382}
2383
2384var ReactSharedInternals = React.__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED;
2385
2386// Prevent newer renderers from RTE when used with older react package versions.
2387// Current owner and dispatcher used to share the same ref,
2388// but PR #14548 split them out to better support the react-debug-tools package.
2389if (!ReactSharedInternals.hasOwnProperty('ReactCurrentDispatcher')) {
2390 ReactSharedInternals.ReactCurrentDispatcher = {
2391 current: null
2392 };
2393}
2394
2395var BEFORE_SLASH_RE = /^(.*)[\\\/]/;
2396
2397var describeComponentFrame = function (name, source, ownerName) {
2398 var sourceInfo = '';
2399 if (source) {
2400 var path = source.fileName;
2401 var fileName = path.replace(BEFORE_SLASH_RE, '');
2402 {
2403 // In DEV, include code for a common special case:
2404 // prefer "folder/index.js" instead of just "index.js".
2405 if (/^index\./.test(fileName)) {
2406 var match = path.match(BEFORE_SLASH_RE);
2407 if (match) {
2408 var pathBeforeSlash = match[1];
2409 if (pathBeforeSlash) {
2410 var folderName = pathBeforeSlash.replace(BEFORE_SLASH_RE, '');
2411 fileName = folderName + '/' + fileName;
2412 }
2413 }
2414 }
2415 }
2416 sourceInfo = ' (at ' + fileName + ':' + source.lineNumber + ')';
2417 } else if (ownerName) {
2418 sourceInfo = ' (created by ' + ownerName + ')';
2419 }
2420 return '\n in ' + (name || 'Unknown') + sourceInfo;
2421};
2422
2423// The Symbol used to tag the ReactElement-like types. If there is no native Symbol
2424// nor polyfill, then a plain number is used for performance.
2425var hasSymbol = typeof Symbol === 'function' && Symbol.for;
2426
2427var REACT_ELEMENT_TYPE = hasSymbol ? Symbol.for('react.element') : 0xeac7;
2428var REACT_PORTAL_TYPE = hasSymbol ? Symbol.for('react.portal') : 0xeaca;
2429var REACT_FRAGMENT_TYPE = hasSymbol ? Symbol.for('react.fragment') : 0xeacb;
2430var REACT_STRICT_MODE_TYPE = hasSymbol ? Symbol.for('react.strict_mode') : 0xeacc;
2431var REACT_PROFILER_TYPE = hasSymbol ? Symbol.for('react.profiler') : 0xead2;
2432var REACT_PROVIDER_TYPE = hasSymbol ? Symbol.for('react.provider') : 0xeacd;
2433var REACT_CONTEXT_TYPE = hasSymbol ? Symbol.for('react.context') : 0xeace;
2434
2435var REACT_CONCURRENT_MODE_TYPE = hasSymbol ? Symbol.for('react.concurrent_mode') : 0xeacf;
2436var REACT_FORWARD_REF_TYPE = hasSymbol ? Symbol.for('react.forward_ref') : 0xead0;
2437var REACT_SUSPENSE_TYPE = hasSymbol ? Symbol.for('react.suspense') : 0xead1;
2438var REACT_MEMO_TYPE = hasSymbol ? Symbol.for('react.memo') : 0xead3;
2439var REACT_LAZY_TYPE = hasSymbol ? Symbol.for('react.lazy') : 0xead4;
2440
2441var MAYBE_ITERATOR_SYMBOL = typeof Symbol === 'function' && Symbol.iterator;
2442var FAUX_ITERATOR_SYMBOL = '@@iterator';
2443
2444function getIteratorFn(maybeIterable) {
2445 if (maybeIterable === null || typeof maybeIterable !== 'object') {
2446 return null;
2447 }
2448 var maybeIterator = MAYBE_ITERATOR_SYMBOL && maybeIterable[MAYBE_ITERATOR_SYMBOL] || maybeIterable[FAUX_ITERATOR_SYMBOL];
2449 if (typeof maybeIterator === 'function') {
2450 return maybeIterator;
2451 }
2452 return null;
2453}
2454
2455var Pending = 0;
2456var Resolved = 1;
2457var Rejected = 2;
2458
2459function refineResolvedLazyComponent(lazyComponent) {
2460 return lazyComponent._status === Resolved ? lazyComponent._result : null;
2461}
2462
2463function getWrappedName(outerType, innerType, wrapperName) {
2464 var functionName = innerType.displayName || innerType.name || '';
2465 return outerType.displayName || (functionName !== '' ? wrapperName + '(' + functionName + ')' : wrapperName);
2466}
2467
2468function getComponentName(type) {
2469 if (type == null) {
2470 // Host root, text node or just invalid type.
2471 return null;
2472 }
2473 {
2474 if (typeof type.tag === 'number') {
2475 warningWithoutStack$1(false, 'Received an unexpected object in getComponentName(). ' + 'This is likely a bug in React. Please file an issue.');
2476 }
2477 }
2478 if (typeof type === 'function') {
2479 return type.displayName || type.name || null;
2480 }
2481 if (typeof type === 'string') {
2482 return type;
2483 }
2484 switch (type) {
2485 case REACT_CONCURRENT_MODE_TYPE:
2486 return 'ConcurrentMode';
2487 case REACT_FRAGMENT_TYPE:
2488 return 'Fragment';
2489 case REACT_PORTAL_TYPE:
2490 return 'Portal';
2491 case REACT_PROFILER_TYPE:
2492 return 'Profiler';
2493 case REACT_STRICT_MODE_TYPE:
2494 return 'StrictMode';
2495 case REACT_SUSPENSE_TYPE:
2496 return 'Suspense';
2497 }
2498 if (typeof type === 'object') {
2499 switch (type.$$typeof) {
2500 case REACT_CONTEXT_TYPE:
2501 return 'Context.Consumer';
2502 case REACT_PROVIDER_TYPE:
2503 return 'Context.Provider';
2504 case REACT_FORWARD_REF_TYPE:
2505 return getWrappedName(type, type.render, 'ForwardRef');
2506 case REACT_MEMO_TYPE:
2507 return getComponentName(type.type);
2508 case REACT_LAZY_TYPE:
2509 {
2510 var thenable = type;
2511 var resolvedThenable = refineResolvedLazyComponent(thenable);
2512 if (resolvedThenable) {
2513 return getComponentName(resolvedThenable);
2514 }
2515 }
2516 }
2517 }
2518 return null;
2519}
2520
2521var ReactDebugCurrentFrame = ReactSharedInternals.ReactDebugCurrentFrame;
2522
2523function describeFiber(fiber) {
2524 switch (fiber.tag) {
2525 case HostRoot:
2526 case HostPortal:
2527 case HostText:
2528 case Fragment:
2529 case ContextProvider:
2530 case ContextConsumer:
2531 return '';
2532 default:
2533 var owner = fiber._debugOwner;
2534 var source = fiber._debugSource;
2535 var name = getComponentName(fiber.type);
2536 var ownerName = null;
2537 if (owner) {
2538 ownerName = getComponentName(owner.type);
2539 }
2540 return describeComponentFrame(name, source, ownerName);
2541 }
2542}
2543
2544function getStackByFiberInDevAndProd(workInProgress) {
2545 var info = '';
2546 var node = workInProgress;
2547 do {
2548 info += describeFiber(node);
2549 node = node.return;
2550 } while (node);
2551 return info;
2552}
2553
2554var current = null;
2555var phase = null;
2556
2557function getCurrentFiberOwnerNameInDevOrNull() {
2558 {
2559 if (current === null) {
2560 return null;
2561 }
2562 var owner = current._debugOwner;
2563 if (owner !== null && typeof owner !== 'undefined') {
2564 return getComponentName(owner.type);
2565 }
2566 }
2567 return null;
2568}
2569
2570function getCurrentFiberStackInDev() {
2571 {
2572 if (current === null) {
2573 return '';
2574 }
2575 // Safe because if current fiber exists, we are reconciling,
2576 // and it is guaranteed to be the work-in-progress version.
2577 return getStackByFiberInDevAndProd(current);
2578 }
2579 return '';
2580}
2581
2582function resetCurrentFiber() {
2583 {
2584 ReactDebugCurrentFrame.getCurrentStack = null;
2585 current = null;
2586 phase = null;
2587 }
2588}
2589
2590function setCurrentFiber(fiber) {
2591 {
2592 ReactDebugCurrentFrame.getCurrentStack = getCurrentFiberStackInDev;
2593 current = fiber;
2594 phase = null;
2595 }
2596}
2597
2598function setCurrentPhase(lifeCyclePhase) {
2599 {
2600 phase = lifeCyclePhase;
2601 }
2602}
2603
2604/**
2605 * Similar to invariant but only logs a warning if the condition is not met.
2606 * This can be used to log issues in development environments in critical
2607 * paths. Removing the logging code for production environments will keep the
2608 * same logic and follow the same code paths.
2609 */
2610
2611var warning = warningWithoutStack$1;
2612
2613{
2614 warning = function (condition, format) {
2615 if (condition) {
2616 return;
2617 }
2618 var ReactDebugCurrentFrame = ReactSharedInternals.ReactDebugCurrentFrame;
2619 var stack = ReactDebugCurrentFrame.getStackAddendum();
2620 // eslint-disable-next-line react-internal/warning-and-invariant-args
2621
2622 for (var _len = arguments.length, args = Array(_len > 2 ? _len - 2 : 0), _key = 2; _key < _len; _key++) {
2623 args[_key - 2] = arguments[_key];
2624 }
2625
2626 warningWithoutStack$1.apply(undefined, [false, format + '%s'].concat(args, [stack]));
2627 };
2628}
2629
2630var warning$1 = warning;
2631
2632// A reserved attribute.
2633// It is handled by React separately and shouldn't be written to the DOM.
2634var RESERVED = 0;
2635
2636// A simple string attribute.
2637// Attributes that aren't in the whitelist are presumed to have this type.
2638var STRING = 1;
2639
2640// A string attribute that accepts booleans in React. In HTML, these are called
2641// "enumerated" attributes with "true" and "false" as possible values.
2642// When true, it should be set to a "true" string.
2643// When false, it should be set to a "false" string.
2644var BOOLEANISH_STRING = 2;
2645
2646// A real boolean attribute.
2647// When true, it should be present (set either to an empty string or its name).
2648// When false, it should be omitted.
2649var BOOLEAN = 3;
2650
2651// An attribute that can be used as a flag as well as with a value.
2652// When true, it should be present (set either to an empty string or its name).
2653// When false, it should be omitted.
2654// For any other value, should be present with that value.
2655var OVERLOADED_BOOLEAN = 4;
2656
2657// An attribute that must be numeric or parse as a numeric.
2658// When falsy, it should be removed.
2659var NUMERIC = 5;
2660
2661// An attribute that must be positive numeric or parse as a positive numeric.
2662// When falsy, it should be removed.
2663var POSITIVE_NUMERIC = 6;
2664
2665/* eslint-disable max-len */
2666var ATTRIBUTE_NAME_START_CHAR = ':A-Z_a-z\\u00C0-\\u00D6\\u00D8-\\u00F6\\u00F8-\\u02FF\\u0370-\\u037D\\u037F-\\u1FFF\\u200C-\\u200D\\u2070-\\u218F\\u2C00-\\u2FEF\\u3001-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFFD';
2667/* eslint-enable max-len */
2668var ATTRIBUTE_NAME_CHAR = ATTRIBUTE_NAME_START_CHAR + '\\-.0-9\\u00B7\\u0300-\\u036F\\u203F-\\u2040';
2669
2670
2671var ROOT_ATTRIBUTE_NAME = 'data-reactroot';
2672var VALID_ATTRIBUTE_NAME_REGEX = new RegExp('^[' + ATTRIBUTE_NAME_START_CHAR + '][' + ATTRIBUTE_NAME_CHAR + ']*$');
2673
2674var hasOwnProperty = Object.prototype.hasOwnProperty;
2675var illegalAttributeNameCache = {};
2676var validatedAttributeNameCache = {};
2677
2678function isAttributeNameSafe(attributeName) {
2679 if (hasOwnProperty.call(validatedAttributeNameCache, attributeName)) {
2680 return true;
2681 }
2682 if (hasOwnProperty.call(illegalAttributeNameCache, attributeName)) {
2683 return false;
2684 }
2685 if (VALID_ATTRIBUTE_NAME_REGEX.test(attributeName)) {
2686 validatedAttributeNameCache[attributeName] = true;
2687 return true;
2688 }
2689 illegalAttributeNameCache[attributeName] = true;
2690 {
2691 warning$1(false, 'Invalid attribute name: `%s`', attributeName);
2692 }
2693 return false;
2694}
2695
2696function shouldIgnoreAttribute(name, propertyInfo, isCustomComponentTag) {
2697 if (propertyInfo !== null) {
2698 return propertyInfo.type === RESERVED;
2699 }
2700 if (isCustomComponentTag) {
2701 return false;
2702 }
2703 if (name.length > 2 && (name[0] === 'o' || name[0] === 'O') && (name[1] === 'n' || name[1] === 'N')) {
2704 return true;
2705 }
2706 return false;
2707}
2708
2709function shouldRemoveAttributeWithWarning(name, value, propertyInfo, isCustomComponentTag) {
2710 if (propertyInfo !== null && propertyInfo.type === RESERVED) {
2711 return false;
2712 }
2713 switch (typeof value) {
2714 case 'function':
2715 // $FlowIssue symbol is perfectly valid here
2716 case 'symbol':
2717 // eslint-disable-line
2718 return true;
2719 case 'boolean':
2720 {
2721 if (isCustomComponentTag) {
2722 return false;
2723 }
2724 if (propertyInfo !== null) {
2725 return !propertyInfo.acceptsBooleans;
2726 } else {
2727 var prefix = name.toLowerCase().slice(0, 5);
2728 return prefix !== 'data-' && prefix !== 'aria-';
2729 }
2730 }
2731 default:
2732 return false;
2733 }
2734}
2735
2736function shouldRemoveAttribute(name, value, propertyInfo, isCustomComponentTag) {
2737 if (value === null || typeof value === 'undefined') {
2738 return true;
2739 }
2740 if (shouldRemoveAttributeWithWarning(name, value, propertyInfo, isCustomComponentTag)) {
2741 return true;
2742 }
2743 if (isCustomComponentTag) {
2744 return false;
2745 }
2746 if (propertyInfo !== null) {
2747 switch (propertyInfo.type) {
2748 case BOOLEAN:
2749 return !value;
2750 case OVERLOADED_BOOLEAN:
2751 return value === false;
2752 case NUMERIC:
2753 return isNaN(value);
2754 case POSITIVE_NUMERIC:
2755 return isNaN(value) || value < 1;
2756 }
2757 }
2758 return false;
2759}
2760
2761function getPropertyInfo(name) {
2762 return properties.hasOwnProperty(name) ? properties[name] : null;
2763}
2764
2765function PropertyInfoRecord(name, type, mustUseProperty, attributeName, attributeNamespace) {
2766 this.acceptsBooleans = type === BOOLEANISH_STRING || type === BOOLEAN || type === OVERLOADED_BOOLEAN;
2767 this.attributeName = attributeName;
2768 this.attributeNamespace = attributeNamespace;
2769 this.mustUseProperty = mustUseProperty;
2770 this.propertyName = name;
2771 this.type = type;
2772}
2773
2774// When adding attributes to this list, be sure to also add them to
2775// the `possibleStandardNames` module to ensure casing and incorrect
2776// name warnings.
2777var properties = {};
2778
2779// These props are reserved by React. They shouldn't be written to the DOM.
2780['children', 'dangerouslySetInnerHTML',
2781// TODO: This prevents the assignment of defaultValue to regular
2782// elements (not just inputs). Now that ReactDOMInput assigns to the
2783// defaultValue property -- do we need this?
2784'defaultValue', 'defaultChecked', 'innerHTML', 'suppressContentEditableWarning', 'suppressHydrationWarning', 'style'].forEach(function (name) {
2785 properties[name] = new PropertyInfoRecord(name, RESERVED, false, // mustUseProperty
2786 name, // attributeName
2787 null);
2788} // attributeNamespace
2789);
2790
2791// A few React string attributes have a different name.
2792// This is a mapping from React prop names to the attribute names.
2793[['acceptCharset', 'accept-charset'], ['className', 'class'], ['htmlFor', 'for'], ['httpEquiv', 'http-equiv']].forEach(function (_ref) {
2794 var name = _ref[0],
2795 attributeName = _ref[1];
2796
2797 properties[name] = new PropertyInfoRecord(name, STRING, false, // mustUseProperty
2798 attributeName, // attributeName
2799 null);
2800} // attributeNamespace
2801);
2802
2803// These are "enumerated" HTML attributes that accept "true" and "false".
2804// In React, we let users pass `true` and `false` even though technically
2805// these aren't boolean attributes (they are coerced to strings).
2806['contentEditable', 'draggable', 'spellCheck', 'value'].forEach(function (name) {
2807 properties[name] = new PropertyInfoRecord(name, BOOLEANISH_STRING, false, // mustUseProperty
2808 name.toLowerCase(), // attributeName
2809 null);
2810} // attributeNamespace
2811);
2812
2813// These are "enumerated" SVG attributes that accept "true" and "false".
2814// In React, we let users pass `true` and `false` even though technically
2815// these aren't boolean attributes (they are coerced to strings).
2816// Since these are SVG attributes, their attribute names are case-sensitive.
2817['autoReverse', 'externalResourcesRequired', 'focusable', 'preserveAlpha'].forEach(function (name) {
2818 properties[name] = new PropertyInfoRecord(name, BOOLEANISH_STRING, false, // mustUseProperty
2819 name, // attributeName
2820 null);
2821} // attributeNamespace
2822);
2823
2824// These are HTML boolean attributes.
2825['allowFullScreen', 'async',
2826// Note: there is a special case that prevents it from being written to the DOM
2827// on the client side because the browsers are inconsistent. Instead we call focus().
2828'autoFocus', 'autoPlay', 'controls', 'default', 'defer', 'disabled', 'formNoValidate', 'hidden', 'loop', 'noModule', 'noValidate', 'open', 'playsInline', 'readOnly', 'required', 'reversed', 'scoped', 'seamless',
2829// Microdata
2830'itemScope'].forEach(function (name) {
2831 properties[name] = new PropertyInfoRecord(name, BOOLEAN, false, // mustUseProperty
2832 name.toLowerCase(), // attributeName
2833 null);
2834} // attributeNamespace
2835);
2836
2837// These are the few React props that we set as DOM properties
2838// rather than attributes. These are all booleans.
2839['checked',
2840// Note: `option.selected` is not updated if `select.multiple` is
2841// disabled with `removeAttribute`. We have special logic for handling this.
2842'multiple', 'muted', 'selected'].forEach(function (name) {
2843 properties[name] = new PropertyInfoRecord(name, BOOLEAN, true, // mustUseProperty
2844 name, // attributeName
2845 null);
2846} // attributeNamespace
2847);
2848
2849// These are HTML attributes that are "overloaded booleans": they behave like
2850// booleans, but can also accept a string value.
2851['capture', 'download'].forEach(function (name) {
2852 properties[name] = new PropertyInfoRecord(name, OVERLOADED_BOOLEAN, false, // mustUseProperty
2853 name, // attributeName
2854 null);
2855} // attributeNamespace
2856);
2857
2858// These are HTML attributes that must be positive numbers.
2859['cols', 'rows', 'size', 'span'].forEach(function (name) {
2860 properties[name] = new PropertyInfoRecord(name, POSITIVE_NUMERIC, false, // mustUseProperty
2861 name, // attributeName
2862 null);
2863} // attributeNamespace
2864);
2865
2866// These are HTML attributes that must be numbers.
2867['rowSpan', 'start'].forEach(function (name) {
2868 properties[name] = new PropertyInfoRecord(name, NUMERIC, false, // mustUseProperty
2869 name.toLowerCase(), // attributeName
2870 null);
2871} // attributeNamespace
2872);
2873
2874var CAMELIZE = /[\-\:]([a-z])/g;
2875var capitalize = function (token) {
2876 return token[1].toUpperCase();
2877};
2878
2879// This is a list of all SVG attributes that need special casing, namespacing,
2880// or boolean value assignment. Regular attributes that just accept strings
2881// and have the same names are omitted, just like in the HTML whitelist.
2882// Some of these attributes can be hard to find. This list was created by
2883// scrapping the MDN documentation.
2884['accent-height', 'alignment-baseline', 'arabic-form', 'baseline-shift', 'cap-height', 'clip-path', 'clip-rule', 'color-interpolation', 'color-interpolation-filters', 'color-profile', 'color-rendering', 'dominant-baseline', 'enable-background', 'fill-opacity', 'fill-rule', 'flood-color', 'flood-opacity', 'font-family', 'font-size', 'font-size-adjust', 'font-stretch', 'font-style', 'font-variant', 'font-weight', 'glyph-name', 'glyph-orientation-horizontal', 'glyph-orientation-vertical', 'horiz-adv-x', 'horiz-origin-x', 'image-rendering', 'letter-spacing', 'lighting-color', 'marker-end', 'marker-mid', 'marker-start', 'overline-position', 'overline-thickness', 'paint-order', 'panose-1', 'pointer-events', 'rendering-intent', 'shape-rendering', 'stop-color', 'stop-opacity', 'strikethrough-position', 'strikethrough-thickness', 'stroke-dasharray', 'stroke-dashoffset', 'stroke-linecap', 'stroke-linejoin', 'stroke-miterlimit', 'stroke-opacity', 'stroke-width', 'text-anchor', 'text-decoration', 'text-rendering', 'underline-position', 'underline-thickness', 'unicode-bidi', 'unicode-range', 'units-per-em', 'v-alphabetic', 'v-hanging', 'v-ideographic', 'v-mathematical', 'vector-effect', 'vert-adv-y', 'vert-origin-x', 'vert-origin-y', 'word-spacing', 'writing-mode', 'xmlns:xlink', 'x-height'].forEach(function (attributeName) {
2885 var name = attributeName.replace(CAMELIZE, capitalize);
2886 properties[name] = new PropertyInfoRecord(name, STRING, false, // mustUseProperty
2887 attributeName, null);
2888} // attributeNamespace
2889);
2890
2891// String SVG attributes with the xlink namespace.
2892['xlink:actuate', 'xlink:arcrole', 'xlink:href', 'xlink:role', 'xlink:show', 'xlink:title', 'xlink:type'].forEach(function (attributeName) {
2893 var name = attributeName.replace(CAMELIZE, capitalize);
2894 properties[name] = new PropertyInfoRecord(name, STRING, false, // mustUseProperty
2895 attributeName, 'http://www.w3.org/1999/xlink');
2896});
2897
2898// String SVG attributes with the xml namespace.
2899['xml:base', 'xml:lang', 'xml:space'].forEach(function (attributeName) {
2900 var name = attributeName.replace(CAMELIZE, capitalize);
2901 properties[name] = new PropertyInfoRecord(name, STRING, false, // mustUseProperty
2902 attributeName, 'http://www.w3.org/XML/1998/namespace');
2903});
2904
2905// These attribute exists both in HTML and SVG.
2906// The attribute name is case-sensitive in SVG so we can't just use
2907// the React name like we do for attributes that exist only in HTML.
2908['tabIndex', 'crossOrigin'].forEach(function (attributeName) {
2909 properties[attributeName] = new PropertyInfoRecord(attributeName, STRING, false, // mustUseProperty
2910 attributeName.toLowerCase(), // attributeName
2911 null);
2912} // attributeNamespace
2913);
2914
2915/**
2916 * Get the value for a property on a node. Only used in DEV for SSR validation.
2917 * The "expected" argument is used as a hint of what the expected value is.
2918 * Some properties have multiple equivalent values.
2919 */
2920function getValueForProperty(node, name, expected, propertyInfo) {
2921 {
2922 if (propertyInfo.mustUseProperty) {
2923 var propertyName = propertyInfo.propertyName;
2924
2925 return node[propertyName];
2926 } else {
2927 var attributeName = propertyInfo.attributeName;
2928
2929 var stringValue = null;
2930
2931 if (propertyInfo.type === OVERLOADED_BOOLEAN) {
2932 if (node.hasAttribute(attributeName)) {
2933 var value = node.getAttribute(attributeName);
2934 if (value === '') {
2935 return true;
2936 }
2937 if (shouldRemoveAttribute(name, expected, propertyInfo, false)) {
2938 return value;
2939 }
2940 if (value === '' + expected) {
2941 return expected;
2942 }
2943 return value;
2944 }
2945 } else if (node.hasAttribute(attributeName)) {
2946 if (shouldRemoveAttribute(name, expected, propertyInfo, false)) {
2947 // We had an attribute but shouldn't have had one, so read it
2948 // for the error message.
2949 return node.getAttribute(attributeName);
2950 }
2951 if (propertyInfo.type === BOOLEAN) {
2952 // If this was a boolean, it doesn't matter what the value is
2953 // the fact that we have it is the same as the expected.
2954 return expected;
2955 }
2956 // Even if this property uses a namespace we use getAttribute
2957 // because we assume its namespaced name is the same as our config.
2958 // To use getAttributeNS we need the local name which we don't have
2959 // in our config atm.
2960 stringValue = node.getAttribute(attributeName);
2961 }
2962
2963 if (shouldRemoveAttribute(name, expected, propertyInfo, false)) {
2964 return stringValue === null ? expected : stringValue;
2965 } else if (stringValue === '' + expected) {
2966 return expected;
2967 } else {
2968 return stringValue;
2969 }
2970 }
2971 }
2972}
2973
2974/**
2975 * Get the value for a attribute on a node. Only used in DEV for SSR validation.
2976 * The third argument is used as a hint of what the expected value is. Some
2977 * attributes have multiple equivalent values.
2978 */
2979function getValueForAttribute(node, name, expected) {
2980 {
2981 if (!isAttributeNameSafe(name)) {
2982 return;
2983 }
2984 if (!node.hasAttribute(name)) {
2985 return expected === undefined ? undefined : null;
2986 }
2987 var value = node.getAttribute(name);
2988 if (value === '' + expected) {
2989 return expected;
2990 }
2991 return value;
2992 }
2993}
2994
2995/**
2996 * Sets the value for a property on a node.
2997 *
2998 * @param {DOMElement} node
2999 * @param {string} name
3000 * @param {*} value
3001 */
3002function setValueForProperty(node, name, value, isCustomComponentTag) {
3003 var propertyInfo = getPropertyInfo(name);
3004 if (shouldIgnoreAttribute(name, propertyInfo, isCustomComponentTag)) {
3005 return;
3006 }
3007 if (shouldRemoveAttribute(name, value, propertyInfo, isCustomComponentTag)) {
3008 value = null;
3009 }
3010 // If the prop isn't in the special list, treat it as a simple attribute.
3011 if (isCustomComponentTag || propertyInfo === null) {
3012 if (isAttributeNameSafe(name)) {
3013 var _attributeName = name;
3014 if (value === null) {
3015 node.removeAttribute(_attributeName);
3016 } else {
3017 node.setAttribute(_attributeName, '' + value);
3018 }
3019 }
3020 return;
3021 }
3022 var mustUseProperty = propertyInfo.mustUseProperty;
3023
3024 if (mustUseProperty) {
3025 var propertyName = propertyInfo.propertyName;
3026
3027 if (value === null) {
3028 var type = propertyInfo.type;
3029
3030 node[propertyName] = type === BOOLEAN ? false : '';
3031 } else {
3032 // Contrary to `setAttribute`, object properties are properly
3033 // `toString`ed by IE8/9.
3034 node[propertyName] = value;
3035 }
3036 return;
3037 }
3038 // The rest are treated as attributes with special cases.
3039 var attributeName = propertyInfo.attributeName,
3040 attributeNamespace = propertyInfo.attributeNamespace;
3041
3042 if (value === null) {
3043 node.removeAttribute(attributeName);
3044 } else {
3045 var _type = propertyInfo.type;
3046
3047 var attributeValue = void 0;
3048 if (_type === BOOLEAN || _type === OVERLOADED_BOOLEAN && value === true) {
3049 attributeValue = '';
3050 } else {
3051 // `setAttribute` with objects becomes only `[object]` in IE8/9,
3052 // ('' + value) makes it output the correct toString()-value.
3053 attributeValue = '' + value;
3054 }
3055 if (attributeNamespace) {
3056 node.setAttributeNS(attributeNamespace, attributeName, attributeValue);
3057 } else {
3058 node.setAttribute(attributeName, attributeValue);
3059 }
3060 }
3061}
3062
3063// Flow does not allow string concatenation of most non-string types. To work
3064// around this limitation, we use an opaque type that can only be obtained by
3065// passing the value through getToStringValue first.
3066function toString(value) {
3067 return '' + value;
3068}
3069
3070function getToStringValue(value) {
3071 switch (typeof value) {
3072 case 'boolean':
3073 case 'number':
3074 case 'object':
3075 case 'string':
3076 case 'undefined':
3077 return value;
3078 default:
3079 // function, symbol are assigned as empty strings
3080 return '';
3081 }
3082}
3083
3084/**
3085 * Copyright (c) 2013-present, Facebook, Inc.
3086 *
3087 * This source code is licensed under the MIT license found in the
3088 * LICENSE file in the root directory of this source tree.
3089 */
3090
3091
3092
3093var ReactPropTypesSecret$1 = 'SECRET_DO_NOT_PASS_THIS_OR_YOU_WILL_BE_FIRED';
3094
3095var ReactPropTypesSecret_1 = ReactPropTypesSecret$1;
3096
3097/**
3098 * Copyright (c) 2013-present, Facebook, Inc.
3099 *
3100 * This source code is licensed under the MIT license found in the
3101 * LICENSE file in the root directory of this source tree.
3102 */
3103
3104
3105
3106var printWarning = function() {};
3107
3108{
3109 var ReactPropTypesSecret = ReactPropTypesSecret_1;
3110 var loggedTypeFailures = {};
3111
3112 printWarning = function(text) {
3113 var message = 'Warning: ' + text;
3114 if (typeof console !== 'undefined') {
3115 console.error(message);
3116 }
3117 try {
3118 // --- Welcome to debugging React ---
3119 // This error was thrown as a convenience so that you can use this stack
3120 // to find the callsite that caused this warning to fire.
3121 throw new Error(message);
3122 } catch (x) {}
3123 };
3124}
3125
3126/**
3127 * Assert that the values match with the type specs.
3128 * Error messages are memorized and will only be shown once.
3129 *
3130 * @param {object} typeSpecs Map of name to a ReactPropType
3131 * @param {object} values Runtime values that need to be type-checked
3132 * @param {string} location e.g. "prop", "context", "child context"
3133 * @param {string} componentName Name of the component for error messages.
3134 * @param {?Function} getStack Returns the component stack.
3135 * @private
3136 */
3137function checkPropTypes(typeSpecs, values, location, componentName, getStack) {
3138 {
3139 for (var typeSpecName in typeSpecs) {
3140 if (typeSpecs.hasOwnProperty(typeSpecName)) {
3141 var error;
3142 // Prop type validation may throw. In case they do, we don't want to
3143 // fail the render phase where it didn't fail before. So we log it.
3144 // After these have been cleaned up, we'll let them throw.
3145 try {
3146 // This is intentionally an invariant that gets caught. It's the same
3147 // behavior as without this statement except with a better message.
3148 if (typeof typeSpecs[typeSpecName] !== 'function') {
3149 var err = Error(
3150 (componentName || 'React class') + ': ' + location + ' type `' + typeSpecName + '` is invalid; ' +
3151 'it must be a function, usually from the `prop-types` package, but received `' + typeof typeSpecs[typeSpecName] + '`.'
3152 );
3153 err.name = 'Invariant Violation';
3154 throw err;
3155 }
3156 error = typeSpecs[typeSpecName](values, typeSpecName, componentName, location, null, ReactPropTypesSecret);
3157 } catch (ex) {
3158 error = ex;
3159 }
3160 if (error && !(error instanceof Error)) {
3161 printWarning(
3162 (componentName || 'React class') + ': type specification of ' +
3163 location + ' `' + typeSpecName + '` is invalid; the type checker ' +
3164 'function must return `null` or an `Error` but returned a ' + typeof error + '. ' +
3165 'You may have forgotten to pass an argument to the type checker ' +
3166 'creator (arrayOf, instanceOf, objectOf, oneOf, oneOfType, and ' +
3167 'shape all require an argument).'
3168 );
3169
3170 }
3171 if (error instanceof Error && !(error.message in loggedTypeFailures)) {
3172 // Only monitor this failure once because there tends to be a lot of the
3173 // same error.
3174 loggedTypeFailures[error.message] = true;
3175
3176 var stack = getStack ? getStack() : '';
3177
3178 printWarning(
3179 'Failed ' + location + ' type: ' + error.message + (stack != null ? stack : '')
3180 );
3181 }
3182 }
3183 }
3184 }
3185}
3186
3187var checkPropTypes_1 = checkPropTypes;
3188
3189var ReactDebugCurrentFrame$1 = null;
3190
3191var ReactControlledValuePropTypes = {
3192 checkPropTypes: null
3193};
3194
3195{
3196 ReactDebugCurrentFrame$1 = ReactSharedInternals.ReactDebugCurrentFrame;
3197
3198 var hasReadOnlyValue = {
3199 button: true,
3200 checkbox: true,
3201 image: true,
3202 hidden: true,
3203 radio: true,
3204 reset: true,
3205 submit: true
3206 };
3207
3208 var propTypes = {
3209 value: function (props, propName, componentName) {
3210 if (hasReadOnlyValue[props.type] || props.onChange || props.readOnly || props.disabled || props[propName] == null) {
3211 return null;
3212 }
3213 return new Error('You provided a `value` prop to a form field without an ' + '`onChange` handler. This will render a read-only field. If ' + 'the field should be mutable use `defaultValue`. Otherwise, ' + 'set either `onChange` or `readOnly`.');
3214 },
3215 checked: function (props, propName, componentName) {
3216 if (props.onChange || props.readOnly || props.disabled || props[propName] == null) {
3217 return null;
3218 }
3219 return new Error('You provided a `checked` prop to a form field without an ' + '`onChange` handler. This will render a read-only field. If ' + 'the field should be mutable use `defaultChecked`. Otherwise, ' + 'set either `onChange` or `readOnly`.');
3220 }
3221 };
3222
3223 /**
3224 * Provide a linked `value` attribute for controlled forms. You should not use
3225 * this outside of the ReactDOM controlled form components.
3226 */
3227 ReactControlledValuePropTypes.checkPropTypes = function (tagName, props) {
3228 checkPropTypes_1(propTypes, props, 'prop', tagName, ReactDebugCurrentFrame$1.getStackAddendum);
3229 };
3230}
3231
3232var enableUserTimingAPI = true;
3233
3234// Helps identify side effects in begin-phase lifecycle hooks and setState reducers:
3235var debugRenderPhaseSideEffects = false;
3236
3237// In some cases, StrictMode should also double-render lifecycles.
3238// This can be confusing for tests though,
3239// And it can be bad for performance in production.
3240// This feature flag can be used to control the behavior:
3241var debugRenderPhaseSideEffectsForStrictMode = true;
3242
3243// To preserve the "Pause on caught exceptions" behavior of the debugger, we
3244// replay the begin phase of a failed component inside invokeGuardedCallback.
3245var replayFailedUnitOfWorkWithInvokeGuardedCallback = true;
3246
3247// Warn about deprecated, async-unsafe lifecycles; relates to RFC #6:
3248var warnAboutDeprecatedLifecycles = false;
3249
3250// Gather advanced timing metrics for Profiler subtrees.
3251var enableProfilerTimer = true;
3252
3253// Trace which interactions trigger each commit.
3254var enableSchedulerTracing = true;
3255
3256// Only used in www builds.
3257var enableSuspenseServerRenderer = false; // TODO: true? Here it might just be false.
3258
3259// Only used in www builds.
3260
3261
3262// Only used in www builds.
3263
3264
3265// React Fire: prevent the value and checked attributes from syncing
3266// with their related DOM properties
3267var disableInputAttributeSyncing = false;
3268
3269// These APIs will no longer be "unstable" in the upcoming 16.7 release,
3270// Control this behavior with a flag to support 16.6 minor releases in the meanwhile.
3271var enableStableConcurrentModeAPIs = false;
3272
3273var warnAboutShorthandPropertyCollision = false;
3274
3275// TODO: direct imports like some-package/src/* are bad. Fix me.
3276var didWarnValueDefaultValue = false;
3277var didWarnCheckedDefaultChecked = false;
3278var didWarnControlledToUncontrolled = false;
3279var didWarnUncontrolledToControlled = false;
3280
3281function isControlled(props) {
3282 var usesChecked = props.type === 'checkbox' || props.type === 'radio';
3283 return usesChecked ? props.checked != null : props.value != null;
3284}
3285
3286/**
3287 * Implements an <input> host component that allows setting these optional
3288 * props: `checked`, `value`, `defaultChecked`, and `defaultValue`.
3289 *
3290 * If `checked` or `value` are not supplied (or null/undefined), user actions
3291 * that affect the checked state or value will trigger updates to the element.
3292 *
3293 * If they are supplied (and not null/undefined), the rendered element will not
3294 * trigger updates to the element. Instead, the props must change in order for
3295 * the rendered element to be updated.
3296 *
3297 * The rendered element will be initialized as unchecked (or `defaultChecked`)
3298 * with an empty value (or `defaultValue`).
3299 *
3300 * See http://www.w3.org/TR/2012/WD-html5-20121025/the-input-element.html
3301 */
3302
3303function getHostProps(element, props) {
3304 var node = element;
3305 var checked = props.checked;
3306
3307 var hostProps = _assign({}, props, {
3308 defaultChecked: undefined,
3309 defaultValue: undefined,
3310 value: undefined,
3311 checked: checked != null ? checked : node._wrapperState.initialChecked
3312 });
3313
3314 return hostProps;
3315}
3316
3317function initWrapperState(element, props) {
3318 {
3319 ReactControlledValuePropTypes.checkPropTypes('input', props);
3320
3321 if (props.checked !== undefined && props.defaultChecked !== undefined && !didWarnCheckedDefaultChecked) {
3322 warning$1(false, '%s contains an input of type %s with both checked and defaultChecked props. ' + 'Input elements must be either controlled or uncontrolled ' + '(specify either the checked prop, or the defaultChecked prop, but not ' + 'both). Decide between using a controlled or uncontrolled input ' + 'element and remove one of these props. More info: ' + 'https://fb.me/react-controlled-components', getCurrentFiberOwnerNameInDevOrNull() || 'A component', props.type);
3323 didWarnCheckedDefaultChecked = true;
3324 }
3325 if (props.value !== undefined && props.defaultValue !== undefined && !didWarnValueDefaultValue) {
3326 warning$1(false, '%s contains an input of type %s with both value and defaultValue props. ' + 'Input elements must be either controlled or uncontrolled ' + '(specify either the value prop, or the defaultValue prop, but not ' + 'both). Decide between using a controlled or uncontrolled input ' + 'element and remove one of these props. More info: ' + 'https://fb.me/react-controlled-components', getCurrentFiberOwnerNameInDevOrNull() || 'A component', props.type);
3327 didWarnValueDefaultValue = true;
3328 }
3329 }
3330
3331 var node = element;
3332 var defaultValue = props.defaultValue == null ? '' : props.defaultValue;
3333
3334 node._wrapperState = {
3335 initialChecked: props.checked != null ? props.checked : props.defaultChecked,
3336 initialValue: getToStringValue(props.value != null ? props.value : defaultValue),
3337 controlled: isControlled(props)
3338 };
3339}
3340
3341function updateChecked(element, props) {
3342 var node = element;
3343 var checked = props.checked;
3344 if (checked != null) {
3345 setValueForProperty(node, 'checked', checked, false);
3346 }
3347}
3348
3349function updateWrapper(element, props) {
3350 var node = element;
3351 {
3352 var _controlled = isControlled(props);
3353
3354 if (!node._wrapperState.controlled && _controlled && !didWarnUncontrolledToControlled) {
3355 warning$1(false, 'A component is changing an uncontrolled input of type %s to be controlled. ' + 'Input elements should not switch from uncontrolled to controlled (or vice versa). ' + 'Decide between using a controlled or uncontrolled input ' + 'element for the lifetime of the component. More info: https://fb.me/react-controlled-components', props.type);
3356 didWarnUncontrolledToControlled = true;
3357 }
3358 if (node._wrapperState.controlled && !_controlled && !didWarnControlledToUncontrolled) {
3359 warning$1(false, 'A component is changing a controlled input of type %s to be uncontrolled. ' + 'Input elements should not switch from controlled to uncontrolled (or vice versa). ' + 'Decide between using a controlled or uncontrolled input ' + 'element for the lifetime of the component. More info: https://fb.me/react-controlled-components', props.type);
3360 didWarnControlledToUncontrolled = true;
3361 }
3362 }
3363
3364 updateChecked(element, props);
3365
3366 var value = getToStringValue(props.value);
3367 var type = props.type;
3368
3369 if (value != null) {
3370 if (type === 'number') {
3371 if (value === 0 && node.value === '' ||
3372 // We explicitly want to coerce to number here if possible.
3373 // eslint-disable-next-line
3374 node.value != value) {
3375 node.value = toString(value);
3376 }
3377 } else if (node.value !== toString(value)) {
3378 node.value = toString(value);
3379 }
3380 } else if (type === 'submit' || type === 'reset') {
3381 // Submit/reset inputs need the attribute removed completely to avoid
3382 // blank-text buttons.
3383 node.removeAttribute('value');
3384 return;
3385 }
3386
3387 if (disableInputAttributeSyncing) {
3388 // When not syncing the value attribute, React only assigns a new value
3389 // whenever the defaultValue React prop has changed. When not present,
3390 // React does nothing
3391 if (props.hasOwnProperty('defaultValue')) {
3392 setDefaultValue(node, props.type, getToStringValue(props.defaultValue));
3393 }
3394 } else {
3395 // When syncing the value attribute, the value comes from a cascade of
3396 // properties:
3397 // 1. The value React property
3398 // 2. The defaultValue React property
3399 // 3. Otherwise there should be no change
3400 if (props.hasOwnProperty('value')) {
3401 setDefaultValue(node, props.type, value);
3402 } else if (props.hasOwnProperty('defaultValue')) {
3403 setDefaultValue(node, props.type, getToStringValue(props.defaultValue));
3404 }
3405 }
3406
3407 if (disableInputAttributeSyncing) {
3408 // When not syncing the checked attribute, the attribute is directly
3409 // controllable from the defaultValue React property. It needs to be
3410 // updated as new props come in.
3411 if (props.defaultChecked == null) {
3412 node.removeAttribute('checked');
3413 } else {
3414 node.defaultChecked = !!props.defaultChecked;
3415 }
3416 } else {
3417 // When syncing the checked attribute, it only changes when it needs
3418 // to be removed, such as transitioning from a checkbox into a text input
3419 if (props.checked == null && props.defaultChecked != null) {
3420 node.defaultChecked = !!props.defaultChecked;
3421 }
3422 }
3423}
3424
3425function postMountWrapper(element, props, isHydrating) {
3426 var node = element;
3427
3428 // Do not assign value if it is already set. This prevents user text input
3429 // from being lost during SSR hydration.
3430 if (props.hasOwnProperty('value') || props.hasOwnProperty('defaultValue')) {
3431 var type = props.type;
3432 var isButton = type === 'submit' || type === 'reset';
3433
3434 // Avoid setting value attribute on submit/reset inputs as it overrides the
3435 // default value provided by the browser. See: #12872
3436 if (isButton && (props.value === undefined || props.value === null)) {
3437 return;
3438 }
3439
3440 var _initialValue = toString(node._wrapperState.initialValue);
3441
3442 // Do not assign value if it is already set. This prevents user text input
3443 // from being lost during SSR hydration.
3444 if (!isHydrating) {
3445 if (disableInputAttributeSyncing) {
3446 var value = getToStringValue(props.value);
3447
3448 // When not syncing the value attribute, the value property points
3449 // directly to the React prop. Only assign it if it exists.
3450 if (value != null) {
3451 // Always assign on buttons so that it is possible to assign an
3452 // empty string to clear button text.
3453 //
3454 // Otherwise, do not re-assign the value property if is empty. This
3455 // potentially avoids a DOM write and prevents Firefox (~60.0.1) from
3456 // prematurely marking required inputs as invalid. Equality is compared
3457 // to the current value in case the browser provided value is not an
3458 // empty string.
3459 if (isButton || value !== node.value) {
3460 node.value = toString(value);
3461 }
3462 }
3463 } else {
3464 // When syncing the value attribute, the value property should use
3465 // the wrapperState._initialValue property. This uses:
3466 //
3467 // 1. The value React property when present
3468 // 2. The defaultValue React property when present
3469 // 3. An empty string
3470 if (_initialValue !== node.value) {
3471 node.value = _initialValue;
3472 }
3473 }
3474 }
3475
3476 if (disableInputAttributeSyncing) {
3477 // When not syncing the value attribute, assign the value attribute
3478 // directly from the defaultValue React property (when present)
3479 var defaultValue = getToStringValue(props.defaultValue);
3480 if (defaultValue != null) {
3481 node.defaultValue = toString(defaultValue);
3482 }
3483 } else {
3484 // Otherwise, the value attribute is synchronized to the property,
3485 // so we assign defaultValue to the same thing as the value property
3486 // assignment step above.
3487 node.defaultValue = _initialValue;
3488 }
3489 }
3490
3491 // Normally, we'd just do `node.checked = node.checked` upon initial mount, less this bug
3492 // this is needed to work around a chrome bug where setting defaultChecked
3493 // will sometimes influence the value of checked (even after detachment).
3494 // Reference: https://bugs.chromium.org/p/chromium/issues/detail?id=608416
3495 // We need to temporarily unset name to avoid disrupting radio button groups.
3496 var name = node.name;
3497 if (name !== '') {
3498 node.name = '';
3499 }
3500
3501 if (disableInputAttributeSyncing) {
3502 // When not syncing the checked attribute, the checked property
3503 // never gets assigned. It must be manually set. We don't want
3504 // to do this when hydrating so that existing user input isn't
3505 // modified
3506 if (!isHydrating) {
3507 updateChecked(element, props);
3508 }
3509
3510 // Only assign the checked attribute if it is defined. This saves
3511 // a DOM write when controlling the checked attribute isn't needed
3512 // (text inputs, submit/reset)
3513 if (props.hasOwnProperty('defaultChecked')) {
3514 node.defaultChecked = !node.defaultChecked;
3515 node.defaultChecked = !!props.defaultChecked;
3516 }
3517 } else {
3518 // When syncing the checked attribute, both the checked property and
3519 // attribute are assigned at the same time using defaultChecked. This uses:
3520 //
3521 // 1. The checked React property when present
3522 // 2. The defaultChecked React property when present
3523 // 3. Otherwise, false
3524 node.defaultChecked = !node.defaultChecked;
3525 node.defaultChecked = !!node._wrapperState.initialChecked;
3526 }
3527
3528 if (name !== '') {
3529 node.name = name;
3530 }
3531}
3532
3533function restoreControlledState(element, props) {
3534 var node = element;
3535 updateWrapper(node, props);
3536 updateNamedCousins(node, props);
3537}
3538
3539function updateNamedCousins(rootNode, props) {
3540 var name = props.name;
3541 if (props.type === 'radio' && name != null) {
3542 var queryRoot = rootNode;
3543
3544 while (queryRoot.parentNode) {
3545 queryRoot = queryRoot.parentNode;
3546 }
3547
3548 // If `rootNode.form` was non-null, then we could try `form.elements`,
3549 // but that sometimes behaves strangely in IE8. We could also try using
3550 // `form.getElementsByName`, but that will only return direct children
3551 // and won't include inputs that use the HTML5 `form=` attribute. Since
3552 // the input might not even be in a form. It might not even be in the
3553 // document. Let's just use the local `querySelectorAll` to ensure we don't
3554 // miss anything.
3555 var group = queryRoot.querySelectorAll('input[name=' + JSON.stringify('' + name) + '][type="radio"]');
3556
3557 for (var i = 0; i < group.length; i++) {
3558 var otherNode = group[i];
3559 if (otherNode === rootNode || otherNode.form !== rootNode.form) {
3560 continue;
3561 }
3562 // This will throw if radio buttons rendered by different copies of React
3563 // and the same name are rendered into the same form (same as #1939).
3564 // That's probably okay; we don't support it just as we don't support
3565 // mixing React radio buttons with non-React ones.
3566 var otherProps = getFiberCurrentPropsFromNode$1(otherNode);
3567 !otherProps ? invariant(false, 'ReactDOMInput: Mixing React and non-React radio inputs with the same `name` is not supported.') : void 0;
3568
3569 // We need update the tracked value on the named cousin since the value
3570 // was changed but the input saw no event or value set
3571 updateValueIfChanged(otherNode);
3572
3573 // If this is a controlled radio button group, forcing the input that
3574 // was previously checked to update will cause it to be come re-checked
3575 // as appropriate.
3576 updateWrapper(otherNode, otherProps);
3577 }
3578 }
3579}
3580
3581// In Chrome, assigning defaultValue to certain input types triggers input validation.
3582// For number inputs, the display value loses trailing decimal points. For email inputs,
3583// Chrome raises "The specified value <x> is not a valid email address".
3584//
3585// Here we check to see if the defaultValue has actually changed, avoiding these problems
3586// when the user is inputting text
3587//
3588// https://github.com/facebook/react/issues/7253
3589function setDefaultValue(node, type, value) {
3590 if (
3591 // Focused number inputs synchronize on blur. See ChangeEventPlugin.js
3592 type !== 'number' || node.ownerDocument.activeElement !== node) {
3593 if (value == null) {
3594 node.defaultValue = toString(node._wrapperState.initialValue);
3595 } else if (node.defaultValue !== toString(value)) {
3596 node.defaultValue = toString(value);
3597 }
3598 }
3599}
3600
3601var eventTypes$1 = {
3602 change: {
3603 phasedRegistrationNames: {
3604 bubbled: 'onChange',
3605 captured: 'onChangeCapture'
3606 },
3607 dependencies: [TOP_BLUR, TOP_CHANGE, TOP_CLICK, TOP_FOCUS, TOP_INPUT, TOP_KEY_DOWN, TOP_KEY_UP, TOP_SELECTION_CHANGE]
3608 }
3609};
3610
3611function createAndAccumulateChangeEvent(inst, nativeEvent, target) {
3612 var event = SyntheticEvent.getPooled(eventTypes$1.change, inst, nativeEvent, target);
3613 event.type = 'change';
3614 // Flag this event loop as needing state restore.
3615 enqueueStateRestore(target);
3616 accumulateTwoPhaseDispatches(event);
3617 return event;
3618}
3619/**
3620 * For IE shims
3621 */
3622var activeElement = null;
3623var activeElementInst = null;
3624
3625/**
3626 * SECTION: handle `change` event
3627 */
3628function shouldUseChangeEvent(elem) {
3629 var nodeName = elem.nodeName && elem.nodeName.toLowerCase();
3630 return nodeName === 'select' || nodeName === 'input' && elem.type === 'file';
3631}
3632
3633function manualDispatchChangeEvent(nativeEvent) {
3634 var event = createAndAccumulateChangeEvent(activeElementInst, nativeEvent, getEventTarget(nativeEvent));
3635
3636 // If change and propertychange bubbled, we'd just bind to it like all the
3637 // other events and have it go through ReactBrowserEventEmitter. Since it
3638 // doesn't, we manually listen for the events and so we have to enqueue and
3639 // process the abstract event manually.
3640 //
3641 // Batching is necessary here in order to ensure that all event handlers run
3642 // before the next rerender (including event handlers attached to ancestor
3643 // elements instead of directly on the input). Without this, controlled
3644 // components don't work properly in conjunction with event bubbling because
3645 // the component is rerendered and the value reverted before all the event
3646 // handlers can run. See https://github.com/facebook/react/issues/708.
3647 batchedUpdates(runEventInBatch, event);
3648}
3649
3650function runEventInBatch(event) {
3651 runEventsInBatch(event);
3652}
3653
3654function getInstIfValueChanged(targetInst) {
3655 var targetNode = getNodeFromInstance$1(targetInst);
3656 if (updateValueIfChanged(targetNode)) {
3657 return targetInst;
3658 }
3659}
3660
3661function getTargetInstForChangeEvent(topLevelType, targetInst) {
3662 if (topLevelType === TOP_CHANGE) {
3663 return targetInst;
3664 }
3665}
3666
3667/**
3668 * SECTION: handle `input` event
3669 */
3670var isInputEventSupported = false;
3671if (canUseDOM) {
3672 // IE9 claims to support the input event but fails to trigger it when
3673 // deleting text, so we ignore its input events.
3674 isInputEventSupported = isEventSupported('input') && (!document.documentMode || document.documentMode > 9);
3675}
3676
3677/**
3678 * (For IE <=9) Starts tracking propertychange events on the passed-in element
3679 * and override the value property so that we can distinguish user events from
3680 * value changes in JS.
3681 */
3682function startWatchingForValueChange(target, targetInst) {
3683 activeElement = target;
3684 activeElementInst = targetInst;
3685 activeElement.attachEvent('onpropertychange', handlePropertyChange);
3686}
3687
3688/**
3689 * (For IE <=9) Removes the event listeners from the currently-tracked element,
3690 * if any exists.
3691 */
3692function stopWatchingForValueChange() {
3693 if (!activeElement) {
3694 return;
3695 }
3696 activeElement.detachEvent('onpropertychange', handlePropertyChange);
3697 activeElement = null;
3698 activeElementInst = null;
3699}
3700
3701/**
3702 * (For IE <=9) Handles a propertychange event, sending a `change` event if
3703 * the value of the active element has changed.
3704 */
3705function handlePropertyChange(nativeEvent) {
3706 if (nativeEvent.propertyName !== 'value') {
3707 return;
3708 }
3709 if (getInstIfValueChanged(activeElementInst)) {
3710 manualDispatchChangeEvent(nativeEvent);
3711 }
3712}
3713
3714function handleEventsForInputEventPolyfill(topLevelType, target, targetInst) {
3715 if (topLevelType === TOP_FOCUS) {
3716 // In IE9, propertychange fires for most input events but is buggy and
3717 // doesn't fire when text is deleted, but conveniently, selectionchange
3718 // appears to fire in all of the remaining cases so we catch those and
3719 // forward the event if the value has changed
3720 // In either case, we don't want to call the event handler if the value
3721 // is changed from JS so we redefine a setter for `.value` that updates
3722 // our activeElementValue variable, allowing us to ignore those changes
3723 //
3724 // stopWatching() should be a noop here but we call it just in case we
3725 // missed a blur event somehow.
3726 stopWatchingForValueChange();
3727 startWatchingForValueChange(target, targetInst);
3728 } else if (topLevelType === TOP_BLUR) {
3729 stopWatchingForValueChange();
3730 }
3731}
3732
3733// For IE8 and IE9.
3734function getTargetInstForInputEventPolyfill(topLevelType, targetInst) {
3735 if (topLevelType === TOP_SELECTION_CHANGE || topLevelType === TOP_KEY_UP || topLevelType === TOP_KEY_DOWN) {
3736 // On the selectionchange event, the target is just document which isn't
3737 // helpful for us so just check activeElement instead.
3738 //
3739 // 99% of the time, keydown and keyup aren't necessary. IE8 fails to fire
3740 // propertychange on the first input event after setting `value` from a
3741 // script and fires only keydown, keypress, keyup. Catching keyup usually
3742 // gets it and catching keydown lets us fire an event for the first
3743 // keystroke if user does a key repeat (it'll be a little delayed: right
3744 // before the second keystroke). Other input methods (e.g., paste) seem to
3745 // fire selectionchange normally.
3746 return getInstIfValueChanged(activeElementInst);
3747 }
3748}
3749
3750/**
3751 * SECTION: handle `click` event
3752 */
3753function shouldUseClickEvent(elem) {
3754 // Use the `click` event to detect changes to checkbox and radio inputs.
3755 // This approach works across all browsers, whereas `change` does not fire
3756 // until `blur` in IE8.
3757 var nodeName = elem.nodeName;
3758 return nodeName && nodeName.toLowerCase() === 'input' && (elem.type === 'checkbox' || elem.type === 'radio');
3759}
3760
3761function getTargetInstForClickEvent(topLevelType, targetInst) {
3762 if (topLevelType === TOP_CLICK) {
3763 return getInstIfValueChanged(targetInst);
3764 }
3765}
3766
3767function getTargetInstForInputOrChangeEvent(topLevelType, targetInst) {
3768 if (topLevelType === TOP_INPUT || topLevelType === TOP_CHANGE) {
3769 return getInstIfValueChanged(targetInst);
3770 }
3771}
3772
3773function handleControlledInputBlur(node) {
3774 var state = node._wrapperState;
3775
3776 if (!state || !state.controlled || node.type !== 'number') {
3777 return;
3778 }
3779
3780 if (!disableInputAttributeSyncing) {
3781 // If controlled, assign the value attribute to the current value on blur
3782 setDefaultValue(node, 'number', node.value);
3783 }
3784}
3785
3786/**
3787 * This plugin creates an `onChange` event that normalizes change events
3788 * across form elements. This event fires at a time when it's possible to
3789 * change the element's value without seeing a flicker.
3790 *
3791 * Supported elements are:
3792 * - input (see `isTextInputElement`)
3793 * - textarea
3794 * - select
3795 */
3796var ChangeEventPlugin = {
3797 eventTypes: eventTypes$1,
3798
3799 _isInputEventSupported: isInputEventSupported,
3800
3801 extractEvents: function (topLevelType, targetInst, nativeEvent, nativeEventTarget) {
3802 var targetNode = targetInst ? getNodeFromInstance$1(targetInst) : window;
3803
3804 var getTargetInstFunc = void 0,
3805 handleEventFunc = void 0;
3806 if (shouldUseChangeEvent(targetNode)) {
3807 getTargetInstFunc = getTargetInstForChangeEvent;
3808 } else if (isTextInputElement(targetNode)) {
3809 if (isInputEventSupported) {
3810 getTargetInstFunc = getTargetInstForInputOrChangeEvent;
3811 } else {
3812 getTargetInstFunc = getTargetInstForInputEventPolyfill;
3813 handleEventFunc = handleEventsForInputEventPolyfill;
3814 }
3815 } else if (shouldUseClickEvent(targetNode)) {
3816 getTargetInstFunc = getTargetInstForClickEvent;
3817 }
3818
3819 if (getTargetInstFunc) {
3820 var inst = getTargetInstFunc(topLevelType, targetInst);
3821 if (inst) {
3822 var event = createAndAccumulateChangeEvent(inst, nativeEvent, nativeEventTarget);
3823 return event;
3824 }
3825 }
3826
3827 if (handleEventFunc) {
3828 handleEventFunc(topLevelType, targetNode, targetInst);
3829 }
3830
3831 // When blurring, set the value attribute for number inputs
3832 if (topLevelType === TOP_BLUR) {
3833 handleControlledInputBlur(targetNode);
3834 }
3835 }
3836};
3837
3838/**
3839 * Module that is injectable into `EventPluginHub`, that specifies a
3840 * deterministic ordering of `EventPlugin`s. A convenient way to reason about
3841 * plugins, without having to package every one of them. This is better than
3842 * having plugins be ordered in the same order that they are injected because
3843 * that ordering would be influenced by the packaging order.
3844 * `ResponderEventPlugin` must occur before `SimpleEventPlugin` so that
3845 * preventing default on events is convenient in `SimpleEventPlugin` handlers.
3846 */
3847var DOMEventPluginOrder = ['ResponderEventPlugin', 'SimpleEventPlugin', 'EnterLeaveEventPlugin', 'ChangeEventPlugin', 'SelectEventPlugin', 'BeforeInputEventPlugin'];
3848
3849var SyntheticUIEvent = SyntheticEvent.extend({
3850 view: null,
3851 detail: null
3852});
3853
3854var modifierKeyToProp = {
3855 Alt: 'altKey',
3856 Control: 'ctrlKey',
3857 Meta: 'metaKey',
3858 Shift: 'shiftKey'
3859};
3860
3861// Older browsers (Safari <= 10, iOS Safari <= 10.2) do not support
3862// getModifierState. If getModifierState is not supported, we map it to a set of
3863// modifier keys exposed by the event. In this case, Lock-keys are not supported.
3864/**
3865 * Translation from modifier key to the associated property in the event.
3866 * @see http://www.w3.org/TR/DOM-Level-3-Events/#keys-Modifiers
3867 */
3868
3869function modifierStateGetter(keyArg) {
3870 var syntheticEvent = this;
3871 var nativeEvent = syntheticEvent.nativeEvent;
3872 if (nativeEvent.getModifierState) {
3873 return nativeEvent.getModifierState(keyArg);
3874 }
3875 var keyProp = modifierKeyToProp[keyArg];
3876 return keyProp ? !!nativeEvent[keyProp] : false;
3877}
3878
3879function getEventModifierState(nativeEvent) {
3880 return modifierStateGetter;
3881}
3882
3883var previousScreenX = 0;
3884var previousScreenY = 0;
3885// Use flags to signal movementX/Y has already been set
3886var isMovementXSet = false;
3887var isMovementYSet = false;
3888
3889/**
3890 * @interface MouseEvent
3891 * @see http://www.w3.org/TR/DOM-Level-3-Events/
3892 */
3893var SyntheticMouseEvent = SyntheticUIEvent.extend({
3894 screenX: null,
3895 screenY: null,
3896 clientX: null,
3897 clientY: null,
3898 pageX: null,
3899 pageY: null,
3900 ctrlKey: null,
3901 shiftKey: null,
3902 altKey: null,
3903 metaKey: null,
3904 getModifierState: getEventModifierState,
3905 button: null,
3906 buttons: null,
3907 relatedTarget: function (event) {
3908 return event.relatedTarget || (event.fromElement === event.srcElement ? event.toElement : event.fromElement);
3909 },
3910 movementX: function (event) {
3911 if ('movementX' in event) {
3912 return event.movementX;
3913 }
3914
3915 var screenX = previousScreenX;
3916 previousScreenX = event.screenX;
3917
3918 if (!isMovementXSet) {
3919 isMovementXSet = true;
3920 return 0;
3921 }
3922
3923 return event.type === 'mousemove' ? event.screenX - screenX : 0;
3924 },
3925 movementY: function (event) {
3926 if ('movementY' in event) {
3927 return event.movementY;
3928 }
3929
3930 var screenY = previousScreenY;
3931 previousScreenY = event.screenY;
3932
3933 if (!isMovementYSet) {
3934 isMovementYSet = true;
3935 return 0;
3936 }
3937
3938 return event.type === 'mousemove' ? event.screenY - screenY : 0;
3939 }
3940});
3941
3942/**
3943 * @interface PointerEvent
3944 * @see http://www.w3.org/TR/pointerevents/
3945 */
3946var SyntheticPointerEvent = SyntheticMouseEvent.extend({
3947 pointerId: null,
3948 width: null,
3949 height: null,
3950 pressure: null,
3951 tangentialPressure: null,
3952 tiltX: null,
3953 tiltY: null,
3954 twist: null,
3955 pointerType: null,
3956 isPrimary: null
3957});
3958
3959var eventTypes$2 = {
3960 mouseEnter: {
3961 registrationName: 'onMouseEnter',
3962 dependencies: [TOP_MOUSE_OUT, TOP_MOUSE_OVER]
3963 },
3964 mouseLeave: {
3965 registrationName: 'onMouseLeave',
3966 dependencies: [TOP_MOUSE_OUT, TOP_MOUSE_OVER]
3967 },
3968 pointerEnter: {
3969 registrationName: 'onPointerEnter',
3970 dependencies: [TOP_POINTER_OUT, TOP_POINTER_OVER]
3971 },
3972 pointerLeave: {
3973 registrationName: 'onPointerLeave',
3974 dependencies: [TOP_POINTER_OUT, TOP_POINTER_OVER]
3975 }
3976};
3977
3978var EnterLeaveEventPlugin = {
3979 eventTypes: eventTypes$2,
3980
3981 /**
3982 * For almost every interaction we care about, there will be both a top-level
3983 * `mouseover` and `mouseout` event that occurs. Only use `mouseout` so that
3984 * we do not extract duplicate events. However, moving the mouse into the
3985 * browser from outside will not fire a `mouseout` event. In this case, we use
3986 * the `mouseover` top-level event.
3987 */
3988 extractEvents: function (topLevelType, targetInst, nativeEvent, nativeEventTarget) {
3989 var isOverEvent = topLevelType === TOP_MOUSE_OVER || topLevelType === TOP_POINTER_OVER;
3990 var isOutEvent = topLevelType === TOP_MOUSE_OUT || topLevelType === TOP_POINTER_OUT;
3991
3992 if (isOverEvent && (nativeEvent.relatedTarget || nativeEvent.fromElement)) {
3993 return null;
3994 }
3995
3996 if (!isOutEvent && !isOverEvent) {
3997 // Must not be a mouse or pointer in or out - ignoring.
3998 return null;
3999 }
4000
4001 var win = void 0;
4002 if (nativeEventTarget.window === nativeEventTarget) {
4003 // `nativeEventTarget` is probably a window object.
4004 win = nativeEventTarget;
4005 } else {
4006 // TODO: Figure out why `ownerDocument` is sometimes undefined in IE8.
4007 var doc = nativeEventTarget.ownerDocument;
4008 if (doc) {
4009 win = doc.defaultView || doc.parentWindow;
4010 } else {
4011 win = window;
4012 }
4013 }
4014
4015 var from = void 0;
4016 var to = void 0;
4017 if (isOutEvent) {
4018 from = targetInst;
4019 var related = nativeEvent.relatedTarget || nativeEvent.toElement;
4020 to = related ? getClosestInstanceFromNode(related) : null;
4021 } else {
4022 // Moving to a node from outside the window.
4023 from = null;
4024 to = targetInst;
4025 }
4026
4027 if (from === to) {
4028 // Nothing pertains to our managed components.
4029 return null;
4030 }
4031
4032 var eventInterface = void 0,
4033 leaveEventType = void 0,
4034 enterEventType = void 0,
4035 eventTypePrefix = void 0;
4036
4037 if (topLevelType === TOP_MOUSE_OUT || topLevelType === TOP_MOUSE_OVER) {
4038 eventInterface = SyntheticMouseEvent;
4039 leaveEventType = eventTypes$2.mouseLeave;
4040 enterEventType = eventTypes$2.mouseEnter;
4041 eventTypePrefix = 'mouse';
4042 } else if (topLevelType === TOP_POINTER_OUT || topLevelType === TOP_POINTER_OVER) {
4043 eventInterface = SyntheticPointerEvent;
4044 leaveEventType = eventTypes$2.pointerLeave;
4045 enterEventType = eventTypes$2.pointerEnter;
4046 eventTypePrefix = 'pointer';
4047 }
4048
4049 var fromNode = from == null ? win : getNodeFromInstance$1(from);
4050 var toNode = to == null ? win : getNodeFromInstance$1(to);
4051
4052 var leave = eventInterface.getPooled(leaveEventType, from, nativeEvent, nativeEventTarget);
4053 leave.type = eventTypePrefix + 'leave';
4054 leave.target = fromNode;
4055 leave.relatedTarget = toNode;
4056
4057 var enter = eventInterface.getPooled(enterEventType, to, nativeEvent, nativeEventTarget);
4058 enter.type = eventTypePrefix + 'enter';
4059 enter.target = toNode;
4060 enter.relatedTarget = fromNode;
4061
4062 accumulateEnterLeaveDispatches(leave, enter, from, to);
4063
4064 return [leave, enter];
4065 }
4066};
4067
4068/**
4069 * inlined Object.is polyfill to avoid requiring consumers ship their own
4070 * https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/is
4071 */
4072function is(x, y) {
4073 return x === y && (x !== 0 || 1 / x === 1 / y) || x !== x && y !== y // eslint-disable-line no-self-compare
4074 ;
4075}
4076
4077var hasOwnProperty$1 = Object.prototype.hasOwnProperty;
4078
4079/**
4080 * Performs equality by iterating through keys on an object and returning false
4081 * when any key has values which are not strictly equal between the arguments.
4082 * Returns true when the values of all keys are strictly equal.
4083 */
4084function shallowEqual(objA, objB) {
4085 if (is(objA, objB)) {
4086 return true;
4087 }
4088
4089 if (typeof objA !== 'object' || objA === null || typeof objB !== 'object' || objB === null) {
4090 return false;
4091 }
4092
4093 var keysA = Object.keys(objA);
4094 var keysB = Object.keys(objB);
4095
4096 if (keysA.length !== keysB.length) {
4097 return false;
4098 }
4099
4100 // Test for A's keys different from B.
4101 for (var i = 0; i < keysA.length; i++) {
4102 if (!hasOwnProperty$1.call(objB, keysA[i]) || !is(objA[keysA[i]], objB[keysA[i]])) {
4103 return false;
4104 }
4105 }
4106
4107 return true;
4108}
4109
4110/**
4111 * `ReactInstanceMap` maintains a mapping from a public facing stateful
4112 * instance (key) and the internal representation (value). This allows public
4113 * methods to accept the user facing instance as an argument and map them back
4114 * to internal methods.
4115 *
4116 * Note that this module is currently shared and assumed to be stateless.
4117 * If this becomes an actual Map, that will break.
4118 */
4119
4120/**
4121 * This API should be called `delete` but we'd have to make sure to always
4122 * transform these to strings for IE support. When this transform is fully
4123 * supported we can rename it.
4124 */
4125
4126
4127function get(key) {
4128 return key._reactInternalFiber;
4129}
4130
4131function has(key) {
4132 return key._reactInternalFiber !== undefined;
4133}
4134
4135function set(key, value) {
4136 key._reactInternalFiber = value;
4137}
4138
4139// Don't change these two values. They're used by React Dev Tools.
4140var NoEffect = /* */0;
4141var PerformedWork = /* */1;
4142
4143// You can change the rest (and add more).
4144var Placement = /* */2;
4145var Update = /* */4;
4146var PlacementAndUpdate = /* */6;
4147var Deletion = /* */8;
4148var ContentReset = /* */16;
4149var Callback = /* */32;
4150var DidCapture = /* */64;
4151var Ref = /* */128;
4152var Snapshot = /* */256;
4153var Passive = /* */512;
4154
4155// Passive & Update & Callback & Ref & Snapshot
4156var LifecycleEffectMask = /* */932;
4157
4158// Union of all host effects
4159var HostEffectMask = /* */1023;
4160
4161var Incomplete = /* */1024;
4162var ShouldCapture = /* */2048;
4163
4164var ReactCurrentOwner$1 = ReactSharedInternals.ReactCurrentOwner;
4165
4166var MOUNTING = 1;
4167var MOUNTED = 2;
4168var UNMOUNTED = 3;
4169
4170function isFiberMountedImpl(fiber) {
4171 var node = fiber;
4172 if (!fiber.alternate) {
4173 // If there is no alternate, this might be a new tree that isn't inserted
4174 // yet. If it is, then it will have a pending insertion effect on it.
4175 if ((node.effectTag & Placement) !== NoEffect) {
4176 return MOUNTING;
4177 }
4178 while (node.return) {
4179 node = node.return;
4180 if ((node.effectTag & Placement) !== NoEffect) {
4181 return MOUNTING;
4182 }
4183 }
4184 } else {
4185 while (node.return) {
4186 node = node.return;
4187 }
4188 }
4189 if (node.tag === HostRoot) {
4190 // TODO: Check if this was a nested HostRoot when used with
4191 // renderContainerIntoSubtree.
4192 return MOUNTED;
4193 }
4194 // If we didn't hit the root, that means that we're in an disconnected tree
4195 // that has been unmounted.
4196 return UNMOUNTED;
4197}
4198
4199function isFiberMounted(fiber) {
4200 return isFiberMountedImpl(fiber) === MOUNTED;
4201}
4202
4203function isMounted(component) {
4204 {
4205 var owner = ReactCurrentOwner$1.current;
4206 if (owner !== null && owner.tag === ClassComponent) {
4207 var ownerFiber = owner;
4208 var instance = ownerFiber.stateNode;
4209 !instance._warnedAboutRefsInRender ? warningWithoutStack$1(false, '%s is accessing isMounted inside its render() function. ' + 'render() should be a pure function of props and state. It should ' + 'never access something that requires stale data from the previous ' + 'render, such as refs. Move this logic to componentDidMount and ' + 'componentDidUpdate instead.', getComponentName(ownerFiber.type) || 'A component') : void 0;
4210 instance._warnedAboutRefsInRender = true;
4211 }
4212 }
4213
4214 var fiber = get(component);
4215 if (!fiber) {
4216 return false;
4217 }
4218 return isFiberMountedImpl(fiber) === MOUNTED;
4219}
4220
4221function assertIsMounted(fiber) {
4222 !(isFiberMountedImpl(fiber) === MOUNTED) ? invariant(false, 'Unable to find node on an unmounted component.') : void 0;
4223}
4224
4225function findCurrentFiberUsingSlowPath(fiber) {
4226 var alternate = fiber.alternate;
4227 if (!alternate) {
4228 // If there is no alternate, then we only need to check if it is mounted.
4229 var state = isFiberMountedImpl(fiber);
4230 !(state !== UNMOUNTED) ? invariant(false, 'Unable to find node on an unmounted component.') : void 0;
4231 if (state === MOUNTING) {
4232 return null;
4233 }
4234 return fiber;
4235 }
4236 // If we have two possible branches, we'll walk backwards up to the root
4237 // to see what path the root points to. On the way we may hit one of the
4238 // special cases and we'll deal with them.
4239 var a = fiber;
4240 var b = alternate;
4241 while (true) {
4242 var parentA = a.return;
4243 var parentB = parentA ? parentA.alternate : null;
4244 if (!parentA || !parentB) {
4245 // We're at the root.
4246 break;
4247 }
4248
4249 // If both copies of the parent fiber point to the same child, we can
4250 // assume that the child is current. This happens when we bailout on low
4251 // priority: the bailed out fiber's child reuses the current child.
4252 if (parentA.child === parentB.child) {
4253 var child = parentA.child;
4254 while (child) {
4255 if (child === a) {
4256 // We've determined that A is the current branch.
4257 assertIsMounted(parentA);
4258 return fiber;
4259 }
4260 if (child === b) {
4261 // We've determined that B is the current branch.
4262 assertIsMounted(parentA);
4263 return alternate;
4264 }
4265 child = child.sibling;
4266 }
4267 // We should never have an alternate for any mounting node. So the only
4268 // way this could possibly happen is if this was unmounted, if at all.
4269 invariant(false, 'Unable to find node on an unmounted component.');
4270 }
4271
4272 if (a.return !== b.return) {
4273 // The return pointer of A and the return pointer of B point to different
4274 // fibers. We assume that return pointers never criss-cross, so A must
4275 // belong to the child set of A.return, and B must belong to the child
4276 // set of B.return.
4277 a = parentA;
4278 b = parentB;
4279 } else {
4280 // The return pointers point to the same fiber. We'll have to use the
4281 // default, slow path: scan the child sets of each parent alternate to see
4282 // which child belongs to which set.
4283 //
4284 // Search parent A's child set
4285 var didFindChild = false;
4286 var _child = parentA.child;
4287 while (_child) {
4288 if (_child === a) {
4289 didFindChild = true;
4290 a = parentA;
4291 b = parentB;
4292 break;
4293 }
4294 if (_child === b) {
4295 didFindChild = true;
4296 b = parentA;
4297 a = parentB;
4298 break;
4299 }
4300 _child = _child.sibling;
4301 }
4302 if (!didFindChild) {
4303 // Search parent B's child set
4304 _child = parentB.child;
4305 while (_child) {
4306 if (_child === a) {
4307 didFindChild = true;
4308 a = parentB;
4309 b = parentA;
4310 break;
4311 }
4312 if (_child === b) {
4313 didFindChild = true;
4314 b = parentB;
4315 a = parentA;
4316 break;
4317 }
4318 _child = _child.sibling;
4319 }
4320 !didFindChild ? invariant(false, 'Child was not found in either parent set. This indicates a bug in React related to the return pointer. Please file an issue.') : void 0;
4321 }
4322 }
4323
4324 !(a.alternate === b) ? invariant(false, 'Return fibers should always be each others\' alternates. This error is likely caused by a bug in React. Please file an issue.') : void 0;
4325 }
4326 // If the root is not a host container, we're in a disconnected tree. I.e.
4327 // unmounted.
4328 !(a.tag === HostRoot) ? invariant(false, 'Unable to find node on an unmounted component.') : void 0;
4329 if (a.stateNode.current === a) {
4330 // We've determined that A is the current branch.
4331 return fiber;
4332 }
4333 // Otherwise B has to be current branch.
4334 return alternate;
4335}
4336
4337function findCurrentHostFiber(parent) {
4338 var currentParent = findCurrentFiberUsingSlowPath(parent);
4339 if (!currentParent) {
4340 return null;
4341 }
4342
4343 // Next we'll drill down this component to find the first HostComponent/Text.
4344 var node = currentParent;
4345 while (true) {
4346 if (node.tag === HostComponent || node.tag === HostText) {
4347 return node;
4348 } else if (node.child) {
4349 node.child.return = node;
4350 node = node.child;
4351 continue;
4352 }
4353 if (node === currentParent) {
4354 return null;
4355 }
4356 while (!node.sibling) {
4357 if (!node.return || node.return === currentParent) {
4358 return null;
4359 }
4360 node = node.return;
4361 }
4362 node.sibling.return = node.return;
4363 node = node.sibling;
4364 }
4365 // Flow needs the return null here, but ESLint complains about it.
4366 // eslint-disable-next-line no-unreachable
4367 return null;
4368}
4369
4370function findCurrentHostFiberWithNoPortals(parent) {
4371 var currentParent = findCurrentFiberUsingSlowPath(parent);
4372 if (!currentParent) {
4373 return null;
4374 }
4375
4376 // Next we'll drill down this component to find the first HostComponent/Text.
4377 var node = currentParent;
4378 while (true) {
4379 if (node.tag === HostComponent || node.tag === HostText) {
4380 return node;
4381 } else if (node.child && node.tag !== HostPortal) {
4382 node.child.return = node;
4383 node = node.child;
4384 continue;
4385 }
4386 if (node === currentParent) {
4387 return null;
4388 }
4389 while (!node.sibling) {
4390 if (!node.return || node.return === currentParent) {
4391 return null;
4392 }
4393 node = node.return;
4394 }
4395 node.sibling.return = node.return;
4396 node = node.sibling;
4397 }
4398 // Flow needs the return null here, but ESLint complains about it.
4399 // eslint-disable-next-line no-unreachable
4400 return null;
4401}
4402
4403function addEventBubbleListener(element, eventType, listener) {
4404 element.addEventListener(eventType, listener, false);
4405}
4406
4407function addEventCaptureListener(element, eventType, listener) {
4408 element.addEventListener(eventType, listener, true);
4409}
4410
4411/**
4412 * @interface Event
4413 * @see http://www.w3.org/TR/css3-animations/#AnimationEvent-interface
4414 * @see https://developer.mozilla.org/en-US/docs/Web/API/AnimationEvent
4415 */
4416var SyntheticAnimationEvent = SyntheticEvent.extend({
4417 animationName: null,
4418 elapsedTime: null,
4419 pseudoElement: null
4420});
4421
4422/**
4423 * @interface Event
4424 * @see http://www.w3.org/TR/clipboard-apis/
4425 */
4426var SyntheticClipboardEvent = SyntheticEvent.extend({
4427 clipboardData: function (event) {
4428 return 'clipboardData' in event ? event.clipboardData : window.clipboardData;
4429 }
4430});
4431
4432/**
4433 * @interface FocusEvent
4434 * @see http://www.w3.org/TR/DOM-Level-3-Events/
4435 */
4436var SyntheticFocusEvent = SyntheticUIEvent.extend({
4437 relatedTarget: null
4438});
4439
4440/**
4441 * `charCode` represents the actual "character code" and is safe to use with
4442 * `String.fromCharCode`. As such, only keys that correspond to printable
4443 * characters produce a valid `charCode`, the only exception to this is Enter.
4444 * The Tab-key is considered non-printable and does not have a `charCode`,
4445 * presumably because it does not produce a tab-character in browsers.
4446 *
4447 * @param {object} nativeEvent Native browser event.
4448 * @return {number} Normalized `charCode` property.
4449 */
4450function getEventCharCode(nativeEvent) {
4451 var charCode = void 0;
4452 var keyCode = nativeEvent.keyCode;
4453
4454 if ('charCode' in nativeEvent) {
4455 charCode = nativeEvent.charCode;
4456
4457 // FF does not set `charCode` for the Enter-key, check against `keyCode`.
4458 if (charCode === 0 && keyCode === 13) {
4459 charCode = 13;
4460 }
4461 } else {
4462 // IE8 does not implement `charCode`, but `keyCode` has the correct value.
4463 charCode = keyCode;
4464 }
4465
4466 // IE and Edge (on Windows) and Chrome / Safari (on Windows and Linux)
4467 // report Enter as charCode 10 when ctrl is pressed.
4468 if (charCode === 10) {
4469 charCode = 13;
4470 }
4471
4472 // Some non-printable keys are reported in `charCode`/`keyCode`, discard them.
4473 // Must not discard the (non-)printable Enter-key.
4474 if (charCode >= 32 || charCode === 13) {
4475 return charCode;
4476 }
4477
4478 return 0;
4479}
4480
4481/**
4482 * Normalization of deprecated HTML5 `key` values
4483 * @see https://developer.mozilla.org/en-US/docs/Web/API/KeyboardEvent#Key_names
4484 */
4485var normalizeKey = {
4486 Esc: 'Escape',
4487 Spacebar: ' ',
4488 Left: 'ArrowLeft',
4489 Up: 'ArrowUp',
4490 Right: 'ArrowRight',
4491 Down: 'ArrowDown',
4492 Del: 'Delete',
4493 Win: 'OS',
4494 Menu: 'ContextMenu',
4495 Apps: 'ContextMenu',
4496 Scroll: 'ScrollLock',
4497 MozPrintableKey: 'Unidentified'
4498};
4499
4500/**
4501 * Translation from legacy `keyCode` to HTML5 `key`
4502 * Only special keys supported, all others depend on keyboard layout or browser
4503 * @see https://developer.mozilla.org/en-US/docs/Web/API/KeyboardEvent#Key_names
4504 */
4505var translateToKey = {
4506 '8': 'Backspace',
4507 '9': 'Tab',
4508 '12': 'Clear',
4509 '13': 'Enter',
4510 '16': 'Shift',
4511 '17': 'Control',
4512 '18': 'Alt',
4513 '19': 'Pause',
4514 '20': 'CapsLock',
4515 '27': 'Escape',
4516 '32': ' ',
4517 '33': 'PageUp',
4518 '34': 'PageDown',
4519 '35': 'End',
4520 '36': 'Home',
4521 '37': 'ArrowLeft',
4522 '38': 'ArrowUp',
4523 '39': 'ArrowRight',
4524 '40': 'ArrowDown',
4525 '45': 'Insert',
4526 '46': 'Delete',
4527 '112': 'F1',
4528 '113': 'F2',
4529 '114': 'F3',
4530 '115': 'F4',
4531 '116': 'F5',
4532 '117': 'F6',
4533 '118': 'F7',
4534 '119': 'F8',
4535 '120': 'F9',
4536 '121': 'F10',
4537 '122': 'F11',
4538 '123': 'F12',
4539 '144': 'NumLock',
4540 '145': 'ScrollLock',
4541 '224': 'Meta'
4542};
4543
4544/**
4545 * @param {object} nativeEvent Native browser event.
4546 * @return {string} Normalized `key` property.
4547 */
4548function getEventKey(nativeEvent) {
4549 if (nativeEvent.key) {
4550 // Normalize inconsistent values reported by browsers due to
4551 // implementations of a working draft specification.
4552
4553 // FireFox implements `key` but returns `MozPrintableKey` for all
4554 // printable characters (normalized to `Unidentified`), ignore it.
4555 var key = normalizeKey[nativeEvent.key] || nativeEvent.key;
4556 if (key !== 'Unidentified') {
4557 return key;
4558 }
4559 }
4560
4561 // Browser does not implement `key`, polyfill as much of it as we can.
4562 if (nativeEvent.type === 'keypress') {
4563 var charCode = getEventCharCode(nativeEvent);
4564
4565 // The enter-key is technically both printable and non-printable and can
4566 // thus be captured by `keypress`, no other non-printable key should.
4567 return charCode === 13 ? 'Enter' : String.fromCharCode(charCode);
4568 }
4569 if (nativeEvent.type === 'keydown' || nativeEvent.type === 'keyup') {
4570 // While user keyboard layout determines the actual meaning of each
4571 // `keyCode` value, almost all function keys have a universal value.
4572 return translateToKey[nativeEvent.keyCode] || 'Unidentified';
4573 }
4574 return '';
4575}
4576
4577/**
4578 * @interface KeyboardEvent
4579 * @see http://www.w3.org/TR/DOM-Level-3-Events/
4580 */
4581var SyntheticKeyboardEvent = SyntheticUIEvent.extend({
4582 key: getEventKey,
4583 location: null,
4584 ctrlKey: null,
4585 shiftKey: null,
4586 altKey: null,
4587 metaKey: null,
4588 repeat: null,
4589 locale: null,
4590 getModifierState: getEventModifierState,
4591 // Legacy Interface
4592 charCode: function (event) {
4593 // `charCode` is the result of a KeyPress event and represents the value of
4594 // the actual printable character.
4595
4596 // KeyPress is deprecated, but its replacement is not yet final and not
4597 // implemented in any major browser. Only KeyPress has charCode.
4598 if (event.type === 'keypress') {
4599 return getEventCharCode(event);
4600 }
4601 return 0;
4602 },
4603 keyCode: function (event) {
4604 // `keyCode` is the result of a KeyDown/Up event and represents the value of
4605 // physical keyboard key.
4606
4607 // The actual meaning of the value depends on the users' keyboard layout
4608 // which cannot be detected. Assuming that it is a US keyboard layout
4609 // provides a surprisingly accurate mapping for US and European users.
4610 // Due to this, it is left to the user to implement at this time.
4611 if (event.type === 'keydown' || event.type === 'keyup') {
4612 return event.keyCode;
4613 }
4614 return 0;
4615 },
4616 which: function (event) {
4617 // `which` is an alias for either `keyCode` or `charCode` depending on the
4618 // type of the event.
4619 if (event.type === 'keypress') {
4620 return getEventCharCode(event);
4621 }
4622 if (event.type === 'keydown' || event.type === 'keyup') {
4623 return event.keyCode;
4624 }
4625 return 0;
4626 }
4627});
4628
4629/**
4630 * @interface DragEvent
4631 * @see http://www.w3.org/TR/DOM-Level-3-Events/
4632 */
4633var SyntheticDragEvent = SyntheticMouseEvent.extend({
4634 dataTransfer: null
4635});
4636
4637/**
4638 * @interface TouchEvent
4639 * @see http://www.w3.org/TR/touch-events/
4640 */
4641var SyntheticTouchEvent = SyntheticUIEvent.extend({
4642 touches: null,
4643 targetTouches: null,
4644 changedTouches: null,
4645 altKey: null,
4646 metaKey: null,
4647 ctrlKey: null,
4648 shiftKey: null,
4649 getModifierState: getEventModifierState
4650});
4651
4652/**
4653 * @interface Event
4654 * @see http://www.w3.org/TR/2009/WD-css3-transitions-20090320/#transition-events-
4655 * @see https://developer.mozilla.org/en-US/docs/Web/API/TransitionEvent
4656 */
4657var SyntheticTransitionEvent = SyntheticEvent.extend({
4658 propertyName: null,
4659 elapsedTime: null,
4660 pseudoElement: null
4661});
4662
4663/**
4664 * @interface WheelEvent
4665 * @see http://www.w3.org/TR/DOM-Level-3-Events/
4666 */
4667var SyntheticWheelEvent = SyntheticMouseEvent.extend({
4668 deltaX: function (event) {
4669 return 'deltaX' in event ? event.deltaX : // Fallback to `wheelDeltaX` for Webkit and normalize (right is positive).
4670 'wheelDeltaX' in event ? -event.wheelDeltaX : 0;
4671 },
4672 deltaY: function (event) {
4673 return 'deltaY' in event ? event.deltaY : // Fallback to `wheelDeltaY` for Webkit and normalize (down is positive).
4674 'wheelDeltaY' in event ? -event.wheelDeltaY : // Fallback to `wheelDelta` for IE<9 and normalize (down is positive).
4675 'wheelDelta' in event ? -event.wheelDelta : 0;
4676 },
4677
4678 deltaZ: null,
4679
4680 // Browsers without "deltaMode" is reporting in raw wheel delta where one
4681 // notch on the scroll is always +/- 120, roughly equivalent to pixels.
4682 // A good approximation of DOM_DELTA_LINE (1) is 5% of viewport size or
4683 // ~40 pixels, for DOM_DELTA_SCREEN (2) it is 87.5% of viewport size.
4684 deltaMode: null
4685});
4686
4687/**
4688 * Turns
4689 * ['abort', ...]
4690 * into
4691 * eventTypes = {
4692 * 'abort': {
4693 * phasedRegistrationNames: {
4694 * bubbled: 'onAbort',
4695 * captured: 'onAbortCapture',
4696 * },
4697 * dependencies: [TOP_ABORT],
4698 * },
4699 * ...
4700 * };
4701 * topLevelEventsToDispatchConfig = new Map([
4702 * [TOP_ABORT, { sameConfig }],
4703 * ]);
4704 */
4705
4706var interactiveEventTypeNames = [[TOP_BLUR, 'blur'], [TOP_CANCEL, 'cancel'], [TOP_CLICK, 'click'], [TOP_CLOSE, 'close'], [TOP_CONTEXT_MENU, 'contextMenu'], [TOP_COPY, 'copy'], [TOP_CUT, 'cut'], [TOP_AUX_CLICK, 'auxClick'], [TOP_DOUBLE_CLICK, 'doubleClick'], [TOP_DRAG_END, 'dragEnd'], [TOP_DRAG_START, 'dragStart'], [TOP_DROP, 'drop'], [TOP_FOCUS, 'focus'], [TOP_INPUT, 'input'], [TOP_INVALID, 'invalid'], [TOP_KEY_DOWN, 'keyDown'], [TOP_KEY_PRESS, 'keyPress'], [TOP_KEY_UP, 'keyUp'], [TOP_MOUSE_DOWN, 'mouseDown'], [TOP_MOUSE_UP, 'mouseUp'], [TOP_PASTE, 'paste'], [TOP_PAUSE, 'pause'], [TOP_PLAY, 'play'], [TOP_POINTER_CANCEL, 'pointerCancel'], [TOP_POINTER_DOWN, 'pointerDown'], [TOP_POINTER_UP, 'pointerUp'], [TOP_RATE_CHANGE, 'rateChange'], [TOP_RESET, 'reset'], [TOP_SEEKED, 'seeked'], [TOP_SUBMIT, 'submit'], [TOP_TOUCH_CANCEL, 'touchCancel'], [TOP_TOUCH_END, 'touchEnd'], [TOP_TOUCH_START, 'touchStart'], [TOP_VOLUME_CHANGE, 'volumeChange']];
4707var nonInteractiveEventTypeNames = [[TOP_ABORT, 'abort'], [TOP_ANIMATION_END, 'animationEnd'], [TOP_ANIMATION_ITERATION, 'animationIteration'], [TOP_ANIMATION_START, 'animationStart'], [TOP_CAN_PLAY, 'canPlay'], [TOP_CAN_PLAY_THROUGH, 'canPlayThrough'], [TOP_DRAG, 'drag'], [TOP_DRAG_ENTER, 'dragEnter'], [TOP_DRAG_EXIT, 'dragExit'], [TOP_DRAG_LEAVE, 'dragLeave'], [TOP_DRAG_OVER, 'dragOver'], [TOP_DURATION_CHANGE, 'durationChange'], [TOP_EMPTIED, 'emptied'], [TOP_ENCRYPTED, 'encrypted'], [TOP_ENDED, 'ended'], [TOP_ERROR, 'error'], [TOP_GOT_POINTER_CAPTURE, 'gotPointerCapture'], [TOP_LOAD, 'load'], [TOP_LOADED_DATA, 'loadedData'], [TOP_LOADED_METADATA, 'loadedMetadata'], [TOP_LOAD_START, 'loadStart'], [TOP_LOST_POINTER_CAPTURE, 'lostPointerCapture'], [TOP_MOUSE_MOVE, 'mouseMove'], [TOP_MOUSE_OUT, 'mouseOut'], [TOP_MOUSE_OVER, 'mouseOver'], [TOP_PLAYING, 'playing'], [TOP_POINTER_MOVE, 'pointerMove'], [TOP_POINTER_OUT, 'pointerOut'], [TOP_POINTER_OVER, 'pointerOver'], [TOP_PROGRESS, 'progress'], [TOP_SCROLL, 'scroll'], [TOP_SEEKING, 'seeking'], [TOP_STALLED, 'stalled'], [TOP_SUSPEND, 'suspend'], [TOP_TIME_UPDATE, 'timeUpdate'], [TOP_TOGGLE, 'toggle'], [TOP_TOUCH_MOVE, 'touchMove'], [TOP_TRANSITION_END, 'transitionEnd'], [TOP_WAITING, 'waiting'], [TOP_WHEEL, 'wheel']];
4708
4709var eventTypes$4 = {};
4710var topLevelEventsToDispatchConfig = {};
4711
4712function addEventTypeNameToConfig(_ref, isInteractive) {
4713 var topEvent = _ref[0],
4714 event = _ref[1];
4715
4716 var capitalizedEvent = event[0].toUpperCase() + event.slice(1);
4717 var onEvent = 'on' + capitalizedEvent;
4718
4719 var type = {
4720 phasedRegistrationNames: {
4721 bubbled: onEvent,
4722 captured: onEvent + 'Capture'
4723 },
4724 dependencies: [topEvent],
4725 isInteractive: isInteractive
4726 };
4727 eventTypes$4[event] = type;
4728 topLevelEventsToDispatchConfig[topEvent] = type;
4729}
4730
4731interactiveEventTypeNames.forEach(function (eventTuple) {
4732 addEventTypeNameToConfig(eventTuple, true);
4733});
4734nonInteractiveEventTypeNames.forEach(function (eventTuple) {
4735 addEventTypeNameToConfig(eventTuple, false);
4736});
4737
4738// Only used in DEV for exhaustiveness validation.
4739var knownHTMLTopLevelTypes = [TOP_ABORT, TOP_CANCEL, TOP_CAN_PLAY, TOP_CAN_PLAY_THROUGH, TOP_CLOSE, TOP_DURATION_CHANGE, TOP_EMPTIED, TOP_ENCRYPTED, TOP_ENDED, TOP_ERROR, TOP_INPUT, TOP_INVALID, TOP_LOAD, TOP_LOADED_DATA, TOP_LOADED_METADATA, TOP_LOAD_START, TOP_PAUSE, TOP_PLAY, TOP_PLAYING, TOP_PROGRESS, TOP_RATE_CHANGE, TOP_RESET, TOP_SEEKED, TOP_SEEKING, TOP_STALLED, TOP_SUBMIT, TOP_SUSPEND, TOP_TIME_UPDATE, TOP_TOGGLE, TOP_VOLUME_CHANGE, TOP_WAITING];
4740
4741var SimpleEventPlugin = {
4742 eventTypes: eventTypes$4,
4743
4744 isInteractiveTopLevelEventType: function (topLevelType) {
4745 var config = topLevelEventsToDispatchConfig[topLevelType];
4746 return config !== undefined && config.isInteractive === true;
4747 },
4748
4749
4750 extractEvents: function (topLevelType, targetInst, nativeEvent, nativeEventTarget) {
4751 var dispatchConfig = topLevelEventsToDispatchConfig[topLevelType];
4752 if (!dispatchConfig) {
4753 return null;
4754 }
4755 var EventConstructor = void 0;
4756 switch (topLevelType) {
4757 case TOP_KEY_PRESS:
4758 // Firefox creates a keypress event for function keys too. This removes
4759 // the unwanted keypress events. Enter is however both printable and
4760 // non-printable. One would expect Tab to be as well (but it isn't).
4761 if (getEventCharCode(nativeEvent) === 0) {
4762 return null;
4763 }
4764 /* falls through */
4765 case TOP_KEY_DOWN:
4766 case TOP_KEY_UP:
4767 EventConstructor = SyntheticKeyboardEvent;
4768 break;
4769 case TOP_BLUR:
4770 case TOP_FOCUS:
4771 EventConstructor = SyntheticFocusEvent;
4772 break;
4773 case TOP_CLICK:
4774 // Firefox creates a click event on right mouse clicks. This removes the
4775 // unwanted click events.
4776 if (nativeEvent.button === 2) {
4777 return null;
4778 }
4779 /* falls through */
4780 case TOP_AUX_CLICK:
4781 case TOP_DOUBLE_CLICK:
4782 case TOP_MOUSE_DOWN:
4783 case TOP_MOUSE_MOVE:
4784 case TOP_MOUSE_UP:
4785 // TODO: Disabled elements should not respond to mouse events
4786 /* falls through */
4787 case TOP_MOUSE_OUT:
4788 case TOP_MOUSE_OVER:
4789 case TOP_CONTEXT_MENU:
4790 EventConstructor = SyntheticMouseEvent;
4791 break;
4792 case TOP_DRAG:
4793 case TOP_DRAG_END:
4794 case TOP_DRAG_ENTER:
4795 case TOP_DRAG_EXIT:
4796 case TOP_DRAG_LEAVE:
4797 case TOP_DRAG_OVER:
4798 case TOP_DRAG_START:
4799 case TOP_DROP:
4800 EventConstructor = SyntheticDragEvent;
4801 break;
4802 case TOP_TOUCH_CANCEL:
4803 case TOP_TOUCH_END:
4804 case TOP_TOUCH_MOVE:
4805 case TOP_TOUCH_START:
4806 EventConstructor = SyntheticTouchEvent;
4807 break;
4808 case TOP_ANIMATION_END:
4809 case TOP_ANIMATION_ITERATION:
4810 case TOP_ANIMATION_START:
4811 EventConstructor = SyntheticAnimationEvent;
4812 break;
4813 case TOP_TRANSITION_END:
4814 EventConstructor = SyntheticTransitionEvent;
4815 break;
4816 case TOP_SCROLL:
4817 EventConstructor = SyntheticUIEvent;
4818 break;
4819 case TOP_WHEEL:
4820 EventConstructor = SyntheticWheelEvent;
4821 break;
4822 case TOP_COPY:
4823 case TOP_CUT:
4824 case TOP_PASTE:
4825 EventConstructor = SyntheticClipboardEvent;
4826 break;
4827 case TOP_GOT_POINTER_CAPTURE:
4828 case TOP_LOST_POINTER_CAPTURE:
4829 case TOP_POINTER_CANCEL:
4830 case TOP_POINTER_DOWN:
4831 case TOP_POINTER_MOVE:
4832 case TOP_POINTER_OUT:
4833 case TOP_POINTER_OVER:
4834 case TOP_POINTER_UP:
4835 EventConstructor = SyntheticPointerEvent;
4836 break;
4837 default:
4838 {
4839 if (knownHTMLTopLevelTypes.indexOf(topLevelType) === -1) {
4840 warningWithoutStack$1(false, 'SimpleEventPlugin: Unhandled event type, `%s`. This warning ' + 'is likely caused by a bug in React. Please file an issue.', topLevelType);
4841 }
4842 }
4843 // HTML Events
4844 // @see http://www.w3.org/TR/html5/index.html#events-0
4845 EventConstructor = SyntheticEvent;
4846 break;
4847 }
4848 var event = EventConstructor.getPooled(dispatchConfig, targetInst, nativeEvent, nativeEventTarget);
4849 accumulateTwoPhaseDispatches(event);
4850 return event;
4851 }
4852};
4853
4854var isInteractiveTopLevelEventType = SimpleEventPlugin.isInteractiveTopLevelEventType;
4855
4856
4857var CALLBACK_BOOKKEEPING_POOL_SIZE = 10;
4858var callbackBookkeepingPool = [];
4859
4860/**
4861 * Find the deepest React component completely containing the root of the
4862 * passed-in instance (for use when entire React trees are nested within each
4863 * other). If React trees are not nested, returns null.
4864 */
4865function findRootContainerNode(inst) {
4866 // TODO: It may be a good idea to cache this to prevent unnecessary DOM
4867 // traversal, but caching is difficult to do correctly without using a
4868 // mutation observer to listen for all DOM changes.
4869 while (inst.return) {
4870 inst = inst.return;
4871 }
4872 if (inst.tag !== HostRoot) {
4873 // This can happen if we're in a detached tree.
4874 return null;
4875 }
4876 return inst.stateNode.containerInfo;
4877}
4878
4879// Used to store ancestor hierarchy in top level callback
4880function getTopLevelCallbackBookKeeping(topLevelType, nativeEvent, targetInst) {
4881 if (callbackBookkeepingPool.length) {
4882 var instance = callbackBookkeepingPool.pop();
4883 instance.topLevelType = topLevelType;
4884 instance.nativeEvent = nativeEvent;
4885 instance.targetInst = targetInst;
4886 return instance;
4887 }
4888 return {
4889 topLevelType: topLevelType,
4890 nativeEvent: nativeEvent,
4891 targetInst: targetInst,
4892 ancestors: []
4893 };
4894}
4895
4896function releaseTopLevelCallbackBookKeeping(instance) {
4897 instance.topLevelType = null;
4898 instance.nativeEvent = null;
4899 instance.targetInst = null;
4900 instance.ancestors.length = 0;
4901 if (callbackBookkeepingPool.length < CALLBACK_BOOKKEEPING_POOL_SIZE) {
4902 callbackBookkeepingPool.push(instance);
4903 }
4904}
4905
4906function handleTopLevel(bookKeeping) {
4907 var targetInst = bookKeeping.targetInst;
4908
4909 // Loop through the hierarchy, in case there's any nested components.
4910 // It's important that we build the array of ancestors before calling any
4911 // event handlers, because event handlers can modify the DOM, leading to
4912 // inconsistencies with ReactMount's node cache. See #1105.
4913 var ancestor = targetInst;
4914 do {
4915 if (!ancestor) {
4916 bookKeeping.ancestors.push(ancestor);
4917 break;
4918 }
4919 var root = findRootContainerNode(ancestor);
4920 if (!root) {
4921 break;
4922 }
4923 bookKeeping.ancestors.push(ancestor);
4924 ancestor = getClosestInstanceFromNode(root);
4925 } while (ancestor);
4926
4927 for (var i = 0; i < bookKeeping.ancestors.length; i++) {
4928 targetInst = bookKeeping.ancestors[i];
4929 runExtractedEventsInBatch(bookKeeping.topLevelType, targetInst, bookKeeping.nativeEvent, getEventTarget(bookKeeping.nativeEvent));
4930 }
4931}
4932
4933// TODO: can we stop exporting these?
4934var _enabled = true;
4935
4936function setEnabled(enabled) {
4937 _enabled = !!enabled;
4938}
4939
4940function isEnabled() {
4941 return _enabled;
4942}
4943
4944/**
4945 * Traps top-level events by using event bubbling.
4946 *
4947 * @param {number} topLevelType Number from `TopLevelEventTypes`.
4948 * @param {object} element Element on which to attach listener.
4949 * @return {?object} An object with a remove function which will forcefully
4950 * remove the listener.
4951 * @internal
4952 */
4953function trapBubbledEvent(topLevelType, element) {
4954 if (!element) {
4955 return null;
4956 }
4957 var dispatch = isInteractiveTopLevelEventType(topLevelType) ? dispatchInteractiveEvent : dispatchEvent;
4958
4959 addEventBubbleListener(element, getRawEventName(topLevelType),
4960 // Check if interactive and wrap in interactiveUpdates
4961 dispatch.bind(null, topLevelType));
4962}
4963
4964/**
4965 * Traps a top-level event by using event capturing.
4966 *
4967 * @param {number} topLevelType Number from `TopLevelEventTypes`.
4968 * @param {object} element Element on which to attach listener.
4969 * @return {?object} An object with a remove function which will forcefully
4970 * remove the listener.
4971 * @internal
4972 */
4973function trapCapturedEvent(topLevelType, element) {
4974 if (!element) {
4975 return null;
4976 }
4977 var dispatch = isInteractiveTopLevelEventType(topLevelType) ? dispatchInteractiveEvent : dispatchEvent;
4978
4979 addEventCaptureListener(element, getRawEventName(topLevelType),
4980 // Check if interactive and wrap in interactiveUpdates
4981 dispatch.bind(null, topLevelType));
4982}
4983
4984function dispatchInteractiveEvent(topLevelType, nativeEvent) {
4985 interactiveUpdates(dispatchEvent, topLevelType, nativeEvent);
4986}
4987
4988function dispatchEvent(topLevelType, nativeEvent) {
4989 if (!_enabled) {
4990 return;
4991 }
4992
4993 var nativeEventTarget = getEventTarget(nativeEvent);
4994 var targetInst = getClosestInstanceFromNode(nativeEventTarget);
4995 if (targetInst !== null && typeof targetInst.tag === 'number' && !isFiberMounted(targetInst)) {
4996 // If we get an event (ex: img onload) before committing that
4997 // component's mount, ignore it for now (that is, treat it as if it was an
4998 // event on a non-React tree). We might also consider queueing events and
4999 // dispatching them after the mount.
5000 targetInst = null;
5001 }
5002
5003 var bookKeeping = getTopLevelCallbackBookKeeping(topLevelType, nativeEvent, targetInst);
5004
5005 try {
5006 // Event queue being processed in the same cycle allows
5007 // `preventDefault`.
5008 batchedUpdates(handleTopLevel, bookKeeping);
5009 } finally {
5010 releaseTopLevelCallbackBookKeeping(bookKeeping);
5011 }
5012}
5013
5014/**
5015 * Summary of `ReactBrowserEventEmitter` event handling:
5016 *
5017 * - Top-level delegation is used to trap most native browser events. This
5018 * may only occur in the main thread and is the responsibility of
5019 * ReactDOMEventListener, which is injected and can therefore support
5020 * pluggable event sources. This is the only work that occurs in the main
5021 * thread.
5022 *
5023 * - We normalize and de-duplicate events to account for browser quirks. This
5024 * may be done in the worker thread.
5025 *
5026 * - Forward these native events (with the associated top-level type used to
5027 * trap it) to `EventPluginHub`, which in turn will ask plugins if they want
5028 * to extract any synthetic events.
5029 *
5030 * - The `EventPluginHub` will then process each event by annotating them with
5031 * "dispatches", a sequence of listeners and IDs that care about that event.
5032 *
5033 * - The `EventPluginHub` then dispatches the events.
5034 *
5035 * Overview of React and the event system:
5036 *
5037 * +------------+ .
5038 * | DOM | .
5039 * +------------+ .
5040 * | .
5041 * v .
5042 * +------------+ .
5043 * | ReactEvent | .
5044 * | Listener | .
5045 * +------------+ . +-----------+
5046 * | . +--------+|SimpleEvent|
5047 * | . | |Plugin |
5048 * +-----|------+ . v +-----------+
5049 * | | | . +--------------+ +------------+
5050 * | +-----------.--->|EventPluginHub| | Event |
5051 * | | . | | +-----------+ | Propagators|
5052 * | ReactEvent | . | | |TapEvent | |------------|
5053 * | Emitter | . | |<---+|Plugin | |other plugin|
5054 * | | . | | +-----------+ | utilities |
5055 * | +-----------.--->| | +------------+
5056 * | | | . +--------------+
5057 * +-----|------+ . ^ +-----------+
5058 * | . | |Enter/Leave|
5059 * + . +-------+|Plugin |
5060 * +-------------+ . +-----------+
5061 * | application | .
5062 * |-------------| .
5063 * | | .
5064 * | | .
5065 * +-------------+ .
5066 * .
5067 * React Core . General Purpose Event Plugin System
5068 */
5069
5070var alreadyListeningTo = {};
5071var reactTopListenersCounter = 0;
5072
5073/**
5074 * To ensure no conflicts with other potential React instances on the page
5075 */
5076var topListenersIDKey = '_reactListenersID' + ('' + Math.random()).slice(2);
5077
5078function getListeningForDocument(mountAt) {
5079 // In IE8, `mountAt` is a host object and doesn't have `hasOwnProperty`
5080 // directly.
5081 if (!Object.prototype.hasOwnProperty.call(mountAt, topListenersIDKey)) {
5082 mountAt[topListenersIDKey] = reactTopListenersCounter++;
5083 alreadyListeningTo[mountAt[topListenersIDKey]] = {};
5084 }
5085 return alreadyListeningTo[mountAt[topListenersIDKey]];
5086}
5087
5088/**
5089 * We listen for bubbled touch events on the document object.
5090 *
5091 * Firefox v8.01 (and possibly others) exhibited strange behavior when
5092 * mounting `onmousemove` events at some node that was not the document
5093 * element. The symptoms were that if your mouse is not moving over something
5094 * contained within that mount point (for example on the background) the
5095 * top-level listeners for `onmousemove` won't be called. However, if you
5096 * register the `mousemove` on the document object, then it will of course
5097 * catch all `mousemove`s. This along with iOS quirks, justifies restricting
5098 * top-level listeners to the document object only, at least for these
5099 * movement types of events and possibly all events.
5100 *
5101 * @see http://www.quirksmode.org/blog/archives/2010/09/click_event_del.html
5102 *
5103 * Also, `keyup`/`keypress`/`keydown` do not bubble to the window on IE, but
5104 * they bubble to document.
5105 *
5106 * @param {string} registrationName Name of listener (e.g. `onClick`).
5107 * @param {object} mountAt Container where to mount the listener
5108 */
5109function listenTo(registrationName, mountAt) {
5110 var isListening = getListeningForDocument(mountAt);
5111 var dependencies = registrationNameDependencies[registrationName];
5112
5113 for (var i = 0; i < dependencies.length; i++) {
5114 var dependency = dependencies[i];
5115 if (!(isListening.hasOwnProperty(dependency) && isListening[dependency])) {
5116 switch (dependency) {
5117 case TOP_SCROLL:
5118 trapCapturedEvent(TOP_SCROLL, mountAt);
5119 break;
5120 case TOP_FOCUS:
5121 case TOP_BLUR:
5122 trapCapturedEvent(TOP_FOCUS, mountAt);
5123 trapCapturedEvent(TOP_BLUR, mountAt);
5124 // We set the flag for a single dependency later in this function,
5125 // but this ensures we mark both as attached rather than just one.
5126 isListening[TOP_BLUR] = true;
5127 isListening[TOP_FOCUS] = true;
5128 break;
5129 case TOP_CANCEL:
5130 case TOP_CLOSE:
5131 if (isEventSupported(getRawEventName(dependency))) {
5132 trapCapturedEvent(dependency, mountAt);
5133 }
5134 break;
5135 case TOP_INVALID:
5136 case TOP_SUBMIT:
5137 case TOP_RESET:
5138 // We listen to them on the target DOM elements.
5139 // Some of them bubble so we don't want them to fire twice.
5140 break;
5141 default:
5142 // By default, listen on the top level to all non-media events.
5143 // Media events don't bubble so adding the listener wouldn't do anything.
5144 var isMediaEvent = mediaEventTypes.indexOf(dependency) !== -1;
5145 if (!isMediaEvent) {
5146 trapBubbledEvent(dependency, mountAt);
5147 }
5148 break;
5149 }
5150 isListening[dependency] = true;
5151 }
5152 }
5153}
5154
5155function isListeningToAllDependencies(registrationName, mountAt) {
5156 var isListening = getListeningForDocument(mountAt);
5157 var dependencies = registrationNameDependencies[registrationName];
5158 for (var i = 0; i < dependencies.length; i++) {
5159 var dependency = dependencies[i];
5160 if (!(isListening.hasOwnProperty(dependency) && isListening[dependency])) {
5161 return false;
5162 }
5163 }
5164 return true;
5165}
5166
5167function getActiveElement(doc) {
5168 doc = doc || (typeof document !== 'undefined' ? document : undefined);
5169 if (typeof doc === 'undefined') {
5170 return null;
5171 }
5172 try {
5173 return doc.activeElement || doc.body;
5174 } catch (e) {
5175 return doc.body;
5176 }
5177}
5178
5179/**
5180 * Given any node return the first leaf node without children.
5181 *
5182 * @param {DOMElement|DOMTextNode} node
5183 * @return {DOMElement|DOMTextNode}
5184 */
5185function getLeafNode(node) {
5186 while (node && node.firstChild) {
5187 node = node.firstChild;
5188 }
5189 return node;
5190}
5191
5192/**
5193 * Get the next sibling within a container. This will walk up the
5194 * DOM if a node's siblings have been exhausted.
5195 *
5196 * @param {DOMElement|DOMTextNode} node
5197 * @return {?DOMElement|DOMTextNode}
5198 */
5199function getSiblingNode(node) {
5200 while (node) {
5201 if (node.nextSibling) {
5202 return node.nextSibling;
5203 }
5204 node = node.parentNode;
5205 }
5206}
5207
5208/**
5209 * Get object describing the nodes which contain characters at offset.
5210 *
5211 * @param {DOMElement|DOMTextNode} root
5212 * @param {number} offset
5213 * @return {?object}
5214 */
5215function getNodeForCharacterOffset(root, offset) {
5216 var node = getLeafNode(root);
5217 var nodeStart = 0;
5218 var nodeEnd = 0;
5219
5220 while (node) {
5221 if (node.nodeType === TEXT_NODE) {
5222 nodeEnd = nodeStart + node.textContent.length;
5223
5224 if (nodeStart <= offset && nodeEnd >= offset) {
5225 return {
5226 node: node,
5227 offset: offset - nodeStart
5228 };
5229 }
5230
5231 nodeStart = nodeEnd;
5232 }
5233
5234 node = getLeafNode(getSiblingNode(node));
5235 }
5236}
5237
5238/**
5239 * @param {DOMElement} outerNode
5240 * @return {?object}
5241 */
5242function getOffsets(outerNode) {
5243 var ownerDocument = outerNode.ownerDocument;
5244
5245 var win = ownerDocument && ownerDocument.defaultView || window;
5246 var selection = win.getSelection && win.getSelection();
5247
5248 if (!selection || selection.rangeCount === 0) {
5249 return null;
5250 }
5251
5252 var anchorNode = selection.anchorNode,
5253 anchorOffset = selection.anchorOffset,
5254 focusNode = selection.focusNode,
5255 focusOffset = selection.focusOffset;
5256
5257 // In Firefox, anchorNode and focusNode can be "anonymous divs", e.g. the
5258 // up/down buttons on an <input type="number">. Anonymous divs do not seem to
5259 // expose properties, triggering a "Permission denied error" if any of its
5260 // properties are accessed. The only seemingly possible way to avoid erroring
5261 // is to access a property that typically works for non-anonymous divs and
5262 // catch any error that may otherwise arise. See
5263 // https://bugzilla.mozilla.org/show_bug.cgi?id=208427
5264
5265 try {
5266 /* eslint-disable no-unused-expressions */
5267 anchorNode.nodeType;
5268 focusNode.nodeType;
5269 /* eslint-enable no-unused-expressions */
5270 } catch (e) {
5271 return null;
5272 }
5273
5274 return getModernOffsetsFromPoints(outerNode, anchorNode, anchorOffset, focusNode, focusOffset);
5275}
5276
5277/**
5278 * Returns {start, end} where `start` is the character/codepoint index of
5279 * (anchorNode, anchorOffset) within the textContent of `outerNode`, and
5280 * `end` is the index of (focusNode, focusOffset).
5281 *
5282 * Returns null if you pass in garbage input but we should probably just crash.
5283 *
5284 * Exported only for testing.
5285 */
5286function getModernOffsetsFromPoints(outerNode, anchorNode, anchorOffset, focusNode, focusOffset) {
5287 var length = 0;
5288 var start = -1;
5289 var end = -1;
5290 var indexWithinAnchor = 0;
5291 var indexWithinFocus = 0;
5292 var node = outerNode;
5293 var parentNode = null;
5294
5295 outer: while (true) {
5296 var next = null;
5297
5298 while (true) {
5299 if (node === anchorNode && (anchorOffset === 0 || node.nodeType === TEXT_NODE)) {
5300 start = length + anchorOffset;
5301 }
5302 if (node === focusNode && (focusOffset === 0 || node.nodeType === TEXT_NODE)) {
5303 end = length + focusOffset;
5304 }
5305
5306 if (node.nodeType === TEXT_NODE) {
5307 length += node.nodeValue.length;
5308 }
5309
5310 if ((next = node.firstChild) === null) {
5311 break;
5312 }
5313 // Moving from `node` to its first child `next`.
5314 parentNode = node;
5315 node = next;
5316 }
5317
5318 while (true) {
5319 if (node === outerNode) {
5320 // If `outerNode` has children, this is always the second time visiting
5321 // it. If it has no children, this is still the first loop, and the only
5322 // valid selection is anchorNode and focusNode both equal to this node
5323 // and both offsets 0, in which case we will have handled above.
5324 break outer;
5325 }
5326 if (parentNode === anchorNode && ++indexWithinAnchor === anchorOffset) {
5327 start = length;
5328 }
5329 if (parentNode === focusNode && ++indexWithinFocus === focusOffset) {
5330 end = length;
5331 }
5332 if ((next = node.nextSibling) !== null) {
5333 break;
5334 }
5335 node = parentNode;
5336 parentNode = node.parentNode;
5337 }
5338
5339 // Moving from `node` to its next sibling `next`.
5340 node = next;
5341 }
5342
5343 if (start === -1 || end === -1) {
5344 // This should never happen. (Would happen if the anchor/focus nodes aren't
5345 // actually inside the passed-in node.)
5346 return null;
5347 }
5348
5349 return {
5350 start: start,
5351 end: end
5352 };
5353}
5354
5355/**
5356 * In modern non-IE browsers, we can support both forward and backward
5357 * selections.
5358 *
5359 * Note: IE10+ supports the Selection object, but it does not support
5360 * the `extend` method, which means that even in modern IE, it's not possible
5361 * to programmatically create a backward selection. Thus, for all IE
5362 * versions, we use the old IE API to create our selections.
5363 *
5364 * @param {DOMElement|DOMTextNode} node
5365 * @param {object} offsets
5366 */
5367function setOffsets(node, offsets) {
5368 var doc = node.ownerDocument || document;
5369 var win = doc && doc.defaultView || window;
5370
5371 // Edge fails with "Object expected" in some scenarios.
5372 // (For instance: TinyMCE editor used in a list component that supports pasting to add more,
5373 // fails when pasting 100+ items)
5374 if (!win.getSelection) {
5375 return;
5376 }
5377
5378 var selection = win.getSelection();
5379 var length = node.textContent.length;
5380 var start = Math.min(offsets.start, length);
5381 var end = offsets.end === undefined ? start : Math.min(offsets.end, length);
5382
5383 // IE 11 uses modern selection, but doesn't support the extend method.
5384 // Flip backward selections, so we can set with a single range.
5385 if (!selection.extend && start > end) {
5386 var temp = end;
5387 end = start;
5388 start = temp;
5389 }
5390
5391 var startMarker = getNodeForCharacterOffset(node, start);
5392 var endMarker = getNodeForCharacterOffset(node, end);
5393
5394 if (startMarker && endMarker) {
5395 if (selection.rangeCount === 1 && selection.anchorNode === startMarker.node && selection.anchorOffset === startMarker.offset && selection.focusNode === endMarker.node && selection.focusOffset === endMarker.offset) {
5396 return;
5397 }
5398 var range = doc.createRange();
5399 range.setStart(startMarker.node, startMarker.offset);
5400 selection.removeAllRanges();
5401
5402 if (start > end) {
5403 selection.addRange(range);
5404 selection.extend(endMarker.node, endMarker.offset);
5405 } else {
5406 range.setEnd(endMarker.node, endMarker.offset);
5407 selection.addRange(range);
5408 }
5409 }
5410}
5411
5412function isTextNode(node) {
5413 return node && node.nodeType === TEXT_NODE;
5414}
5415
5416function containsNode(outerNode, innerNode) {
5417 if (!outerNode || !innerNode) {
5418 return false;
5419 } else if (outerNode === innerNode) {
5420 return true;
5421 } else if (isTextNode(outerNode)) {
5422 return false;
5423 } else if (isTextNode(innerNode)) {
5424 return containsNode(outerNode, innerNode.parentNode);
5425 } else if ('contains' in outerNode) {
5426 return outerNode.contains(innerNode);
5427 } else if (outerNode.compareDocumentPosition) {
5428 return !!(outerNode.compareDocumentPosition(innerNode) & 16);
5429 } else {
5430 return false;
5431 }
5432}
5433
5434function isInDocument(node) {
5435 return node && node.ownerDocument && containsNode(node.ownerDocument.documentElement, node);
5436}
5437
5438function getActiveElementDeep() {
5439 var win = window;
5440 var element = getActiveElement();
5441 while (element instanceof win.HTMLIFrameElement) {
5442 // Accessing the contentDocument of a HTMLIframeElement can cause the browser
5443 // to throw, e.g. if it has a cross-origin src attribute
5444 try {
5445 win = element.contentDocument.defaultView;
5446 } catch (e) {
5447 return element;
5448 }
5449 element = getActiveElement(win.document);
5450 }
5451 return element;
5452}
5453
5454/**
5455 * @ReactInputSelection: React input selection module. Based on Selection.js,
5456 * but modified to be suitable for react and has a couple of bug fixes (doesn't
5457 * assume buttons have range selections allowed).
5458 * Input selection module for React.
5459 */
5460
5461/**
5462 * @hasSelectionCapabilities: we get the element types that support selection
5463 * from https://html.spec.whatwg.org/#do-not-apply, looking at `selectionStart`
5464 * and `selectionEnd` rows.
5465 */
5466function hasSelectionCapabilities(elem) {
5467 var nodeName = elem && elem.nodeName && elem.nodeName.toLowerCase();
5468 return nodeName && (nodeName === 'input' && (elem.type === 'text' || elem.type === 'search' || elem.type === 'tel' || elem.type === 'url' || elem.type === 'password') || nodeName === 'textarea' || elem.contentEditable === 'true');
5469}
5470
5471function getSelectionInformation() {
5472 var focusedElem = getActiveElementDeep();
5473 return {
5474 focusedElem: focusedElem,
5475 selectionRange: hasSelectionCapabilities(focusedElem) ? getSelection$1(focusedElem) : null
5476 };
5477}
5478
5479/**
5480 * @restoreSelection: If any selection information was potentially lost,
5481 * restore it. This is useful when performing operations that could remove dom
5482 * nodes and place them back in, resulting in focus being lost.
5483 */
5484function restoreSelection(priorSelectionInformation) {
5485 var curFocusedElem = getActiveElementDeep();
5486 var priorFocusedElem = priorSelectionInformation.focusedElem;
5487 var priorSelectionRange = priorSelectionInformation.selectionRange;
5488 if (curFocusedElem !== priorFocusedElem && isInDocument(priorFocusedElem)) {
5489 if (priorSelectionRange !== null && hasSelectionCapabilities(priorFocusedElem)) {
5490 setSelection(priorFocusedElem, priorSelectionRange);
5491 }
5492
5493 // Focusing a node can change the scroll position, which is undesirable
5494 var ancestors = [];
5495 var ancestor = priorFocusedElem;
5496 while (ancestor = ancestor.parentNode) {
5497 if (ancestor.nodeType === ELEMENT_NODE) {
5498 ancestors.push({
5499 element: ancestor,
5500 left: ancestor.scrollLeft,
5501 top: ancestor.scrollTop
5502 });
5503 }
5504 }
5505
5506 if (typeof priorFocusedElem.focus === 'function') {
5507 priorFocusedElem.focus();
5508 }
5509
5510 for (var i = 0; i < ancestors.length; i++) {
5511 var info = ancestors[i];
5512 info.element.scrollLeft = info.left;
5513 info.element.scrollTop = info.top;
5514 }
5515 }
5516}
5517
5518/**
5519 * @getSelection: Gets the selection bounds of a focused textarea, input or
5520 * contentEditable node.
5521 * -@input: Look up selection bounds of this input
5522 * -@return {start: selectionStart, end: selectionEnd}
5523 */
5524function getSelection$1(input) {
5525 var selection = void 0;
5526
5527 if ('selectionStart' in input) {
5528 // Modern browser with input or textarea.
5529 selection = {
5530 start: input.selectionStart,
5531 end: input.selectionEnd
5532 };
5533 } else {
5534 // Content editable or old IE textarea.
5535 selection = getOffsets(input);
5536 }
5537
5538 return selection || { start: 0, end: 0 };
5539}
5540
5541/**
5542 * @setSelection: Sets the selection bounds of a textarea or input and focuses
5543 * the input.
5544 * -@input Set selection bounds of this input or textarea
5545 * -@offsets Object of same form that is returned from get*
5546 */
5547function setSelection(input, offsets) {
5548 var start = offsets.start,
5549 end = offsets.end;
5550
5551 if (end === undefined) {
5552 end = start;
5553 }
5554
5555 if ('selectionStart' in input) {
5556 input.selectionStart = start;
5557 input.selectionEnd = Math.min(end, input.value.length);
5558 } else {
5559 setOffsets(input, offsets);
5560 }
5561}
5562
5563var skipSelectionChangeEvent = canUseDOM && 'documentMode' in document && document.documentMode <= 11;
5564
5565var eventTypes$3 = {
5566 select: {
5567 phasedRegistrationNames: {
5568 bubbled: 'onSelect',
5569 captured: 'onSelectCapture'
5570 },
5571 dependencies: [TOP_BLUR, TOP_CONTEXT_MENU, TOP_DRAG_END, TOP_FOCUS, TOP_KEY_DOWN, TOP_KEY_UP, TOP_MOUSE_DOWN, TOP_MOUSE_UP, TOP_SELECTION_CHANGE]
5572 }
5573};
5574
5575var activeElement$1 = null;
5576var activeElementInst$1 = null;
5577var lastSelection = null;
5578var mouseDown = false;
5579
5580/**
5581 * Get an object which is a unique representation of the current selection.
5582 *
5583 * The return value will not be consistent across nodes or browsers, but
5584 * two identical selections on the same node will return identical objects.
5585 *
5586 * @param {DOMElement} node
5587 * @return {object}
5588 */
5589function getSelection(node) {
5590 if ('selectionStart' in node && hasSelectionCapabilities(node)) {
5591 return {
5592 start: node.selectionStart,
5593 end: node.selectionEnd
5594 };
5595 } else {
5596 var win = node.ownerDocument && node.ownerDocument.defaultView || window;
5597 var selection = win.getSelection();
5598 return {
5599 anchorNode: selection.anchorNode,
5600 anchorOffset: selection.anchorOffset,
5601 focusNode: selection.focusNode,
5602 focusOffset: selection.focusOffset
5603 };
5604 }
5605}
5606
5607/**
5608 * Get document associated with the event target.
5609 *
5610 * @param {object} nativeEventTarget
5611 * @return {Document}
5612 */
5613function getEventTargetDocument(eventTarget) {
5614 return eventTarget.window === eventTarget ? eventTarget.document : eventTarget.nodeType === DOCUMENT_NODE ? eventTarget : eventTarget.ownerDocument;
5615}
5616
5617/**
5618 * Poll selection to see whether it's changed.
5619 *
5620 * @param {object} nativeEvent
5621 * @param {object} nativeEventTarget
5622 * @return {?SyntheticEvent}
5623 */
5624function constructSelectEvent(nativeEvent, nativeEventTarget) {
5625 // Ensure we have the right element, and that the user is not dragging a
5626 // selection (this matches native `select` event behavior). In HTML5, select
5627 // fires only on input and textarea thus if there's no focused element we
5628 // won't dispatch.
5629 var doc = getEventTargetDocument(nativeEventTarget);
5630
5631 if (mouseDown || activeElement$1 == null || activeElement$1 !== getActiveElement(doc)) {
5632 return null;
5633 }
5634
5635 // Only fire when selection has actually changed.
5636 var currentSelection = getSelection(activeElement$1);
5637 if (!lastSelection || !shallowEqual(lastSelection, currentSelection)) {
5638 lastSelection = currentSelection;
5639
5640 var syntheticEvent = SyntheticEvent.getPooled(eventTypes$3.select, activeElementInst$1, nativeEvent, nativeEventTarget);
5641
5642 syntheticEvent.type = 'select';
5643 syntheticEvent.target = activeElement$1;
5644
5645 accumulateTwoPhaseDispatches(syntheticEvent);
5646
5647 return syntheticEvent;
5648 }
5649
5650 return null;
5651}
5652
5653/**
5654 * This plugin creates an `onSelect` event that normalizes select events
5655 * across form elements.
5656 *
5657 * Supported elements are:
5658 * - input (see `isTextInputElement`)
5659 * - textarea
5660 * - contentEditable
5661 *
5662 * This differs from native browser implementations in the following ways:
5663 * - Fires on contentEditable fields as well as inputs.
5664 * - Fires for collapsed selection.
5665 * - Fires after user input.
5666 */
5667var SelectEventPlugin = {
5668 eventTypes: eventTypes$3,
5669
5670 extractEvents: function (topLevelType, targetInst, nativeEvent, nativeEventTarget) {
5671 var doc = getEventTargetDocument(nativeEventTarget);
5672 // Track whether all listeners exists for this plugin. If none exist, we do
5673 // not extract events. See #3639.
5674 if (!doc || !isListeningToAllDependencies('onSelect', doc)) {
5675 return null;
5676 }
5677
5678 var targetNode = targetInst ? getNodeFromInstance$1(targetInst) : window;
5679
5680 switch (topLevelType) {
5681 // Track the input node that has focus.
5682 case TOP_FOCUS:
5683 if (isTextInputElement(targetNode) || targetNode.contentEditable === 'true') {
5684 activeElement$1 = targetNode;
5685 activeElementInst$1 = targetInst;
5686 lastSelection = null;
5687 }
5688 break;
5689 case TOP_BLUR:
5690 activeElement$1 = null;
5691 activeElementInst$1 = null;
5692 lastSelection = null;
5693 break;
5694 // Don't fire the event while the user is dragging. This matches the
5695 // semantics of the native select event.
5696 case TOP_MOUSE_DOWN:
5697 mouseDown = true;
5698 break;
5699 case TOP_CONTEXT_MENU:
5700 case TOP_MOUSE_UP:
5701 case TOP_DRAG_END:
5702 mouseDown = false;
5703 return constructSelectEvent(nativeEvent, nativeEventTarget);
5704 // Chrome and IE fire non-standard event when selection is changed (and
5705 // sometimes when it hasn't). IE's event fires out of order with respect
5706 // to key and input events on deletion, so we discard it.
5707 //
5708 // Firefox doesn't support selectionchange, so check selection status
5709 // after each key entry. The selection changes after keydown and before
5710 // keyup, but we check on keydown as well in the case of holding down a
5711 // key, when multiple keydown events are fired but only one keyup is.
5712 // This is also our approach for IE handling, for the reason above.
5713 case TOP_SELECTION_CHANGE:
5714 if (skipSelectionChangeEvent) {
5715 break;
5716 }
5717 // falls through
5718 case TOP_KEY_DOWN:
5719 case TOP_KEY_UP:
5720 return constructSelectEvent(nativeEvent, nativeEventTarget);
5721 }
5722
5723 return null;
5724 }
5725};
5726
5727/**
5728 * Inject modules for resolving DOM hierarchy and plugin ordering.
5729 */
5730injection.injectEventPluginOrder(DOMEventPluginOrder);
5731setComponentTree(getFiberCurrentPropsFromNode$1, getInstanceFromNode$1, getNodeFromInstance$1);
5732
5733/**
5734 * Some important event plugins included by default (without having to require
5735 * them).
5736 */
5737injection.injectEventPluginsByName({
5738 SimpleEventPlugin: SimpleEventPlugin,
5739 EnterLeaveEventPlugin: EnterLeaveEventPlugin,
5740 ChangeEventPlugin: ChangeEventPlugin,
5741 SelectEventPlugin: SelectEventPlugin,
5742 BeforeInputEventPlugin: BeforeInputEventPlugin
5743});
5744
5745var didWarnSelectedSetOnOption = false;
5746var didWarnInvalidChild = false;
5747
5748function flattenChildren(children) {
5749 var content = '';
5750
5751 // Flatten children. We'll warn if they are invalid
5752 // during validateProps() which runs for hydration too.
5753 // Note that this would throw on non-element objects.
5754 // Elements are stringified (which is normally irrelevant
5755 // but matters for <fbt>).
5756 React.Children.forEach(children, function (child) {
5757 if (child == null) {
5758 return;
5759 }
5760 content += child;
5761 // Note: we don't warn about invalid children here.
5762 // Instead, this is done separately below so that
5763 // it happens during the hydration codepath too.
5764 });
5765
5766 return content;
5767}
5768
5769/**
5770 * Implements an <option> host component that warns when `selected` is set.
5771 */
5772
5773function validateProps(element, props) {
5774 {
5775 // This mirrors the codepath above, but runs for hydration too.
5776 // Warn about invalid children here so that client and hydration are consistent.
5777 // TODO: this seems like it could cause a DEV-only throw for hydration
5778 // if children contains a non-element object. We should try to avoid that.
5779 if (typeof props.children === 'object' && props.children !== null) {
5780 React.Children.forEach(props.children, function (child) {
5781 if (child == null) {
5782 return;
5783 }
5784 if (typeof child === 'string' || typeof child === 'number') {
5785 return;
5786 }
5787 if (typeof child.type !== 'string') {
5788 return;
5789 }
5790 if (!didWarnInvalidChild) {
5791 didWarnInvalidChild = true;
5792 warning$1(false, 'Only strings and numbers are supported as <option> children.');
5793 }
5794 });
5795 }
5796
5797 // TODO: Remove support for `selected` in <option>.
5798 if (props.selected != null && !didWarnSelectedSetOnOption) {
5799 warning$1(false, 'Use the `defaultValue` or `value` props on <select> instead of ' + 'setting `selected` on <option>.');
5800 didWarnSelectedSetOnOption = true;
5801 }
5802 }
5803}
5804
5805function postMountWrapper$1(element, props) {
5806 // value="" should make a value attribute (#6219)
5807 if (props.value != null) {
5808 element.setAttribute('value', toString(getToStringValue(props.value)));
5809 }
5810}
5811
5812function getHostProps$1(element, props) {
5813 var hostProps = _assign({ children: undefined }, props);
5814 var content = flattenChildren(props.children);
5815
5816 if (content) {
5817 hostProps.children = content;
5818 }
5819
5820 return hostProps;
5821}
5822
5823// TODO: direct imports like some-package/src/* are bad. Fix me.
5824var didWarnValueDefaultValue$1 = void 0;
5825
5826{
5827 didWarnValueDefaultValue$1 = false;
5828}
5829
5830function getDeclarationErrorAddendum() {
5831 var ownerName = getCurrentFiberOwnerNameInDevOrNull();
5832 if (ownerName) {
5833 return '\n\nCheck the render method of `' + ownerName + '`.';
5834 }
5835 return '';
5836}
5837
5838var valuePropNames = ['value', 'defaultValue'];
5839
5840/**
5841 * Validation function for `value` and `defaultValue`.
5842 */
5843function checkSelectPropTypes(props) {
5844 ReactControlledValuePropTypes.checkPropTypes('select', props);
5845
5846 for (var i = 0; i < valuePropNames.length; i++) {
5847 var propName = valuePropNames[i];
5848 if (props[propName] == null) {
5849 continue;
5850 }
5851 var isArray = Array.isArray(props[propName]);
5852 if (props.multiple && !isArray) {
5853 warning$1(false, 'The `%s` prop supplied to <select> must be an array if ' + '`multiple` is true.%s', propName, getDeclarationErrorAddendum());
5854 } else if (!props.multiple && isArray) {
5855 warning$1(false, 'The `%s` prop supplied to <select> must be a scalar ' + 'value if `multiple` is false.%s', propName, getDeclarationErrorAddendum());
5856 }
5857 }
5858}
5859
5860function updateOptions(node, multiple, propValue, setDefaultSelected) {
5861 var options = node.options;
5862
5863 if (multiple) {
5864 var selectedValues = propValue;
5865 var selectedValue = {};
5866 for (var i = 0; i < selectedValues.length; i++) {
5867 // Prefix to avoid chaos with special keys.
5868 selectedValue['$' + selectedValues[i]] = true;
5869 }
5870 for (var _i = 0; _i < options.length; _i++) {
5871 var selected = selectedValue.hasOwnProperty('$' + options[_i].value);
5872 if (options[_i].selected !== selected) {
5873 options[_i].selected = selected;
5874 }
5875 if (selected && setDefaultSelected) {
5876 options[_i].defaultSelected = true;
5877 }
5878 }
5879 } else {
5880 // Do not set `select.value` as exact behavior isn't consistent across all
5881 // browsers for all cases.
5882 var _selectedValue = toString(getToStringValue(propValue));
5883 var defaultSelected = null;
5884 for (var _i2 = 0; _i2 < options.length; _i2++) {
5885 if (options[_i2].value === _selectedValue) {
5886 options[_i2].selected = true;
5887 if (setDefaultSelected) {
5888 options[_i2].defaultSelected = true;
5889 }
5890 return;
5891 }
5892 if (defaultSelected === null && !options[_i2].disabled) {
5893 defaultSelected = options[_i2];
5894 }
5895 }
5896 if (defaultSelected !== null) {
5897 defaultSelected.selected = true;
5898 }
5899 }
5900}
5901
5902/**
5903 * Implements a <select> host component that allows optionally setting the
5904 * props `value` and `defaultValue`. If `multiple` is false, the prop must be a
5905 * stringable. If `multiple` is true, the prop must be an array of stringables.
5906 *
5907 * If `value` is not supplied (or null/undefined), user actions that change the
5908 * selected option will trigger updates to the rendered options.
5909 *
5910 * If it is supplied (and not null/undefined), the rendered options will not
5911 * update in response to user actions. Instead, the `value` prop must change in
5912 * order for the rendered options to update.
5913 *
5914 * If `defaultValue` is provided, any options with the supplied values will be
5915 * selected.
5916 */
5917
5918function getHostProps$2(element, props) {
5919 return _assign({}, props, {
5920 value: undefined
5921 });
5922}
5923
5924function initWrapperState$1(element, props) {
5925 var node = element;
5926 {
5927 checkSelectPropTypes(props);
5928 }
5929
5930 node._wrapperState = {
5931 wasMultiple: !!props.multiple
5932 };
5933
5934 {
5935 if (props.value !== undefined && props.defaultValue !== undefined && !didWarnValueDefaultValue$1) {
5936 warning$1(false, 'Select elements must be either controlled or uncontrolled ' + '(specify either the value prop, or the defaultValue prop, but not ' + 'both). Decide between using a controlled or uncontrolled select ' + 'element and remove one of these props. More info: ' + 'https://fb.me/react-controlled-components');
5937 didWarnValueDefaultValue$1 = true;
5938 }
5939 }
5940}
5941
5942function postMountWrapper$2(element, props) {
5943 var node = element;
5944 node.multiple = !!props.multiple;
5945 var value = props.value;
5946 if (value != null) {
5947 updateOptions(node, !!props.multiple, value, false);
5948 } else if (props.defaultValue != null) {
5949 updateOptions(node, !!props.multiple, props.defaultValue, true);
5950 }
5951}
5952
5953function postUpdateWrapper(element, props) {
5954 var node = element;
5955 var wasMultiple = node._wrapperState.wasMultiple;
5956 node._wrapperState.wasMultiple = !!props.multiple;
5957
5958 var value = props.value;
5959 if (value != null) {
5960 updateOptions(node, !!props.multiple, value, false);
5961 } else if (wasMultiple !== !!props.multiple) {
5962 // For simplicity, reapply `defaultValue` if `multiple` is toggled.
5963 if (props.defaultValue != null) {
5964 updateOptions(node, !!props.multiple, props.defaultValue, true);
5965 } else {
5966 // Revert the select back to its default unselected state.
5967 updateOptions(node, !!props.multiple, props.multiple ? [] : '', false);
5968 }
5969 }
5970}
5971
5972function restoreControlledState$2(element, props) {
5973 var node = element;
5974 var value = props.value;
5975
5976 if (value != null) {
5977 updateOptions(node, !!props.multiple, value, false);
5978 }
5979}
5980
5981var didWarnValDefaultVal = false;
5982
5983/**
5984 * Implements a <textarea> host component that allows setting `value`, and
5985 * `defaultValue`. This differs from the traditional DOM API because value is
5986 * usually set as PCDATA children.
5987 *
5988 * If `value` is not supplied (or null/undefined), user actions that affect the
5989 * value will trigger updates to the element.
5990 *
5991 * If `value` is supplied (and not null/undefined), the rendered element will
5992 * not trigger updates to the element. Instead, the `value` prop must change in
5993 * order for the rendered element to be updated.
5994 *
5995 * The rendered element will be initialized with an empty value, the prop
5996 * `defaultValue` if specified, or the children content (deprecated).
5997 */
5998
5999function getHostProps$3(element, props) {
6000 var node = element;
6001 !(props.dangerouslySetInnerHTML == null) ? invariant(false, '`dangerouslySetInnerHTML` does not make sense on <textarea>.') : void 0;
6002
6003 // Always set children to the same thing. In IE9, the selection range will
6004 // get reset if `textContent` is mutated. We could add a check in setTextContent
6005 // to only set the value if/when the value differs from the node value (which would
6006 // completely solve this IE9 bug), but Sebastian+Sophie seemed to like this
6007 // solution. The value can be a boolean or object so that's why it's forced
6008 // to be a string.
6009 var hostProps = _assign({}, props, {
6010 value: undefined,
6011 defaultValue: undefined,
6012 children: toString(node._wrapperState.initialValue)
6013 });
6014
6015 return hostProps;
6016}
6017
6018function initWrapperState$2(element, props) {
6019 var node = element;
6020 {
6021 ReactControlledValuePropTypes.checkPropTypes('textarea', props);
6022 if (props.value !== undefined && props.defaultValue !== undefined && !didWarnValDefaultVal) {
6023 warning$1(false, '%s contains a textarea with both value and defaultValue props. ' + 'Textarea elements must be either controlled or uncontrolled ' + '(specify either the value prop, or the defaultValue prop, but not ' + 'both). Decide between using a controlled or uncontrolled textarea ' + 'and remove one of these props. More info: ' + 'https://fb.me/react-controlled-components', getCurrentFiberOwnerNameInDevOrNull() || 'A component');
6024 didWarnValDefaultVal = true;
6025 }
6026 }
6027
6028 var initialValue = props.value;
6029
6030 // Only bother fetching default value if we're going to use it
6031 if (initialValue == null) {
6032 var defaultValue = props.defaultValue;
6033 // TODO (yungsters): Remove support for children content in <textarea>.
6034 var children = props.children;
6035 if (children != null) {
6036 {
6037 warning$1(false, 'Use the `defaultValue` or `value` props instead of setting ' + 'children on <textarea>.');
6038 }
6039 !(defaultValue == null) ? invariant(false, 'If you supply `defaultValue` on a <textarea>, do not pass children.') : void 0;
6040 if (Array.isArray(children)) {
6041 !(children.length <= 1) ? invariant(false, '<textarea> can only have at most one child.') : void 0;
6042 children = children[0];
6043 }
6044
6045 defaultValue = children;
6046 }
6047 if (defaultValue == null) {
6048 defaultValue = '';
6049 }
6050 initialValue = defaultValue;
6051 }
6052
6053 node._wrapperState = {
6054 initialValue: getToStringValue(initialValue)
6055 };
6056}
6057
6058function updateWrapper$1(element, props) {
6059 var node = element;
6060 var value = getToStringValue(props.value);
6061 var defaultValue = getToStringValue(props.defaultValue);
6062 if (value != null) {
6063 // Cast `value` to a string to ensure the value is set correctly. While
6064 // browsers typically do this as necessary, jsdom doesn't.
6065 var newValue = toString(value);
6066 // To avoid side effects (such as losing text selection), only set value if changed
6067 if (newValue !== node.value) {
6068 node.value = newValue;
6069 }
6070 if (props.defaultValue == null && node.defaultValue !== newValue) {
6071 node.defaultValue = newValue;
6072 }
6073 }
6074 if (defaultValue != null) {
6075 node.defaultValue = toString(defaultValue);
6076 }
6077}
6078
6079function postMountWrapper$3(element, props) {
6080 var node = element;
6081 // This is in postMount because we need access to the DOM node, which is not
6082 // available until after the component has mounted.
6083 var textContent = node.textContent;
6084
6085 // Only set node.value if textContent is equal to the expected
6086 // initial value. In IE10/IE11 there is a bug where the placeholder attribute
6087 // will populate textContent as well.
6088 // https://developer.microsoft.com/microsoft-edge/platform/issues/101525/
6089 if (textContent === node._wrapperState.initialValue) {
6090 node.value = textContent;
6091 }
6092}
6093
6094function restoreControlledState$3(element, props) {
6095 // DOM component is still mounted; update
6096 updateWrapper$1(element, props);
6097}
6098
6099var HTML_NAMESPACE$1 = 'http://www.w3.org/1999/xhtml';
6100var MATH_NAMESPACE = 'http://www.w3.org/1998/Math/MathML';
6101var SVG_NAMESPACE = 'http://www.w3.org/2000/svg';
6102
6103var Namespaces = {
6104 html: HTML_NAMESPACE$1,
6105 mathml: MATH_NAMESPACE,
6106 svg: SVG_NAMESPACE
6107};
6108
6109// Assumes there is no parent namespace.
6110function getIntrinsicNamespace(type) {
6111 switch (type) {
6112 case 'svg':
6113 return SVG_NAMESPACE;
6114 case 'math':
6115 return MATH_NAMESPACE;
6116 default:
6117 return HTML_NAMESPACE$1;
6118 }
6119}
6120
6121function getChildNamespace(parentNamespace, type) {
6122 if (parentNamespace == null || parentNamespace === HTML_NAMESPACE$1) {
6123 // No (or default) parent namespace: potential entry point.
6124 return getIntrinsicNamespace(type);
6125 }
6126 if (parentNamespace === SVG_NAMESPACE && type === 'foreignObject') {
6127 // We're leaving SVG.
6128 return HTML_NAMESPACE$1;
6129 }
6130 // By default, pass namespace below.
6131 return parentNamespace;
6132}
6133
6134/* globals MSApp */
6135
6136/**
6137 * Create a function which has 'unsafe' privileges (required by windows8 apps)
6138 */
6139var createMicrosoftUnsafeLocalFunction = function (func) {
6140 if (typeof MSApp !== 'undefined' && MSApp.execUnsafeLocalFunction) {
6141 return function (arg0, arg1, arg2, arg3) {
6142 MSApp.execUnsafeLocalFunction(function () {
6143 return func(arg0, arg1, arg2, arg3);
6144 });
6145 };
6146 } else {
6147 return func;
6148 }
6149};
6150
6151// SVG temp container for IE lacking innerHTML
6152var reusableSVGContainer = void 0;
6153
6154/**
6155 * Set the innerHTML property of a node
6156 *
6157 * @param {DOMElement} node
6158 * @param {string} html
6159 * @internal
6160 */
6161var setInnerHTML = createMicrosoftUnsafeLocalFunction(function (node, html) {
6162 // IE does not have innerHTML for SVG nodes, so instead we inject the
6163 // new markup in a temp node and then move the child nodes across into
6164 // the target node
6165
6166 if (node.namespaceURI === Namespaces.svg && !('innerHTML' in node)) {
6167 reusableSVGContainer = reusableSVGContainer || document.createElement('div');
6168 reusableSVGContainer.innerHTML = '<svg>' + html + '</svg>';
6169 var svgNode = reusableSVGContainer.firstChild;
6170 while (node.firstChild) {
6171 node.removeChild(node.firstChild);
6172 }
6173 while (svgNode.firstChild) {
6174 node.appendChild(svgNode.firstChild);
6175 }
6176 } else {
6177 node.innerHTML = html;
6178 }
6179});
6180
6181/**
6182 * Set the textContent property of a node. For text updates, it's faster
6183 * to set the `nodeValue` of the Text node directly instead of using
6184 * `.textContent` which will remove the existing node and create a new one.
6185 *
6186 * @param {DOMElement} node
6187 * @param {string} text
6188 * @internal
6189 */
6190var setTextContent = function (node, text) {
6191 if (text) {
6192 var firstChild = node.firstChild;
6193
6194 if (firstChild && firstChild === node.lastChild && firstChild.nodeType === TEXT_NODE) {
6195 firstChild.nodeValue = text;
6196 return;
6197 }
6198 }
6199 node.textContent = text;
6200};
6201
6202// List derived from Gecko source code:
6203// https://github.com/mozilla/gecko-dev/blob/4e638efc71/layout/style/test/property_database.js
6204var shorthandToLonghand = {
6205 animation: ['animationDelay', 'animationDirection', 'animationDuration', 'animationFillMode', 'animationIterationCount', 'animationName', 'animationPlayState', 'animationTimingFunction'],
6206 background: ['backgroundAttachment', 'backgroundClip', 'backgroundColor', 'backgroundImage', 'backgroundOrigin', 'backgroundPositionX', 'backgroundPositionY', 'backgroundRepeat', 'backgroundSize'],
6207 backgroundPosition: ['backgroundPositionX', 'backgroundPositionY'],
6208 border: ['borderBottomColor', 'borderBottomStyle', 'borderBottomWidth', 'borderImageOutset', 'borderImageRepeat', 'borderImageSlice', 'borderImageSource', 'borderImageWidth', 'borderLeftColor', 'borderLeftStyle', 'borderLeftWidth', 'borderRightColor', 'borderRightStyle', 'borderRightWidth', 'borderTopColor', 'borderTopStyle', 'borderTopWidth'],
6209 borderBlockEnd: ['borderBlockEndColor', 'borderBlockEndStyle', 'borderBlockEndWidth'],
6210 borderBlockStart: ['borderBlockStartColor', 'borderBlockStartStyle', 'borderBlockStartWidth'],
6211 borderBottom: ['borderBottomColor', 'borderBottomStyle', 'borderBottomWidth'],
6212 borderColor: ['borderBottomColor', 'borderLeftColor', 'borderRightColor', 'borderTopColor'],
6213 borderImage: ['borderImageOutset', 'borderImageRepeat', 'borderImageSlice', 'borderImageSource', 'borderImageWidth'],
6214 borderInlineEnd: ['borderInlineEndColor', 'borderInlineEndStyle', 'borderInlineEndWidth'],
6215 borderInlineStart: ['borderInlineStartColor', 'borderInlineStartStyle', 'borderInlineStartWidth'],
6216 borderLeft: ['borderLeftColor', 'borderLeftStyle', 'borderLeftWidth'],
6217 borderRadius: ['borderBottomLeftRadius', 'borderBottomRightRadius', 'borderTopLeftRadius', 'borderTopRightRadius'],
6218 borderRight: ['borderRightColor', 'borderRightStyle', 'borderRightWidth'],
6219 borderStyle: ['borderBottomStyle', 'borderLeftStyle', 'borderRightStyle', 'borderTopStyle'],
6220 borderTop: ['borderTopColor', 'borderTopStyle', 'borderTopWidth'],
6221 borderWidth: ['borderBottomWidth', 'borderLeftWidth', 'borderRightWidth', 'borderTopWidth'],
6222 columnRule: ['columnRuleColor', 'columnRuleStyle', 'columnRuleWidth'],
6223 columns: ['columnCount', 'columnWidth'],
6224 flex: ['flexBasis', 'flexGrow', 'flexShrink'],
6225 flexFlow: ['flexDirection', 'flexWrap'],
6226 font: ['fontFamily', 'fontFeatureSettings', 'fontKerning', 'fontLanguageOverride', 'fontSize', 'fontSizeAdjust', 'fontStretch', 'fontStyle', 'fontVariant', 'fontVariantAlternates', 'fontVariantCaps', 'fontVariantEastAsian', 'fontVariantLigatures', 'fontVariantNumeric', 'fontVariantPosition', 'fontWeight', 'lineHeight'],
6227 fontVariant: ['fontVariantAlternates', 'fontVariantCaps', 'fontVariantEastAsian', 'fontVariantLigatures', 'fontVariantNumeric', 'fontVariantPosition'],
6228 gap: ['columnGap', 'rowGap'],
6229 grid: ['gridAutoColumns', 'gridAutoFlow', 'gridAutoRows', 'gridTemplateAreas', 'gridTemplateColumns', 'gridTemplateRows'],
6230 gridArea: ['gridColumnEnd', 'gridColumnStart', 'gridRowEnd', 'gridRowStart'],
6231 gridColumn: ['gridColumnEnd', 'gridColumnStart'],
6232 gridColumnGap: ['columnGap'],
6233 gridGap: ['columnGap', 'rowGap'],
6234 gridRow: ['gridRowEnd', 'gridRowStart'],
6235 gridRowGap: ['rowGap'],
6236 gridTemplate: ['gridTemplateAreas', 'gridTemplateColumns', 'gridTemplateRows'],
6237 listStyle: ['listStyleImage', 'listStylePosition', 'listStyleType'],
6238 margin: ['marginBottom', 'marginLeft', 'marginRight', 'marginTop'],
6239 marker: ['markerEnd', 'markerMid', 'markerStart'],
6240 mask: ['maskClip', 'maskComposite', 'maskImage', 'maskMode', 'maskOrigin', 'maskPositionX', 'maskPositionY', 'maskRepeat', 'maskSize'],
6241 maskPosition: ['maskPositionX', 'maskPositionY'],
6242 outline: ['outlineColor', 'outlineStyle', 'outlineWidth'],
6243 overflow: ['overflowX', 'overflowY'],
6244 padding: ['paddingBottom', 'paddingLeft', 'paddingRight', 'paddingTop'],
6245 placeContent: ['alignContent', 'justifyContent'],
6246 placeItems: ['alignItems', 'justifyItems'],
6247 placeSelf: ['alignSelf', 'justifySelf'],
6248 textDecoration: ['textDecorationColor', 'textDecorationLine', 'textDecorationStyle'],
6249 textEmphasis: ['textEmphasisColor', 'textEmphasisStyle'],
6250 transition: ['transitionDelay', 'transitionDuration', 'transitionProperty', 'transitionTimingFunction'],
6251 wordWrap: ['overflowWrap']
6252};
6253
6254/**
6255 * CSS properties which accept numbers but are not in units of "px".
6256 */
6257var isUnitlessNumber = {
6258 animationIterationCount: true,
6259 borderImageOutset: true,
6260 borderImageSlice: true,
6261 borderImageWidth: true,
6262 boxFlex: true,
6263 boxFlexGroup: true,
6264 boxOrdinalGroup: true,
6265 columnCount: true,
6266 columns: true,
6267 flex: true,
6268 flexGrow: true,
6269 flexPositive: true,
6270 flexShrink: true,
6271 flexNegative: true,
6272 flexOrder: true,
6273 gridArea: true,
6274 gridRow: true,
6275 gridRowEnd: true,
6276 gridRowSpan: true,
6277 gridRowStart: true,
6278 gridColumn: true,
6279 gridColumnEnd: true,
6280 gridColumnSpan: true,
6281 gridColumnStart: true,
6282 fontWeight: true,
6283 lineClamp: true,
6284 lineHeight: true,
6285 opacity: true,
6286 order: true,
6287 orphans: true,
6288 tabSize: true,
6289 widows: true,
6290 zIndex: true,
6291 zoom: true,
6292
6293 // SVG-related properties
6294 fillOpacity: true,
6295 floodOpacity: true,
6296 stopOpacity: true,
6297 strokeDasharray: true,
6298 strokeDashoffset: true,
6299 strokeMiterlimit: true,
6300 strokeOpacity: true,
6301 strokeWidth: true
6302};
6303
6304/**
6305 * @param {string} prefix vendor-specific prefix, eg: Webkit
6306 * @param {string} key style name, eg: transitionDuration
6307 * @return {string} style name prefixed with `prefix`, properly camelCased, eg:
6308 * WebkitTransitionDuration
6309 */
6310function prefixKey(prefix, key) {
6311 return prefix + key.charAt(0).toUpperCase() + key.substring(1);
6312}
6313
6314/**
6315 * Support style names that may come passed in prefixed by adding permutations
6316 * of vendor prefixes.
6317 */
6318var prefixes = ['Webkit', 'ms', 'Moz', 'O'];
6319
6320// Using Object.keys here, or else the vanilla for-in loop makes IE8 go into an
6321// infinite loop, because it iterates over the newly added props too.
6322Object.keys(isUnitlessNumber).forEach(function (prop) {
6323 prefixes.forEach(function (prefix) {
6324 isUnitlessNumber[prefixKey(prefix, prop)] = isUnitlessNumber[prop];
6325 });
6326});
6327
6328/**
6329 * Convert a value into the proper css writable value. The style name `name`
6330 * should be logical (no hyphens), as specified
6331 * in `CSSProperty.isUnitlessNumber`.
6332 *
6333 * @param {string} name CSS property name such as `topMargin`.
6334 * @param {*} value CSS property value such as `10px`.
6335 * @return {string} Normalized style value with dimensions applied.
6336 */
6337function dangerousStyleValue(name, value, isCustomProperty) {
6338 // Note that we've removed escapeTextForBrowser() calls here since the
6339 // whole string will be escaped when the attribute is injected into
6340 // the markup. If you provide unsafe user data here they can inject
6341 // arbitrary CSS which may be problematic (I couldn't repro this):
6342 // https://www.owasp.org/index.php/XSS_Filter_Evasion_Cheat_Sheet
6343 // http://www.thespanner.co.uk/2007/11/26/ultimate-xss-css-injection/
6344 // This is not an XSS hole but instead a potential CSS injection issue
6345 // which has lead to a greater discussion about how we're going to
6346 // trust URLs moving forward. See #2115901
6347
6348 var isEmpty = value == null || typeof value === 'boolean' || value === '';
6349 if (isEmpty) {
6350 return '';
6351 }
6352
6353 if (!isCustomProperty && typeof value === 'number' && value !== 0 && !(isUnitlessNumber.hasOwnProperty(name) && isUnitlessNumber[name])) {
6354 return value + 'px'; // Presumes implicit 'px' suffix for unitless numbers
6355 }
6356
6357 return ('' + value).trim();
6358}
6359
6360var uppercasePattern = /([A-Z])/g;
6361var msPattern = /^ms-/;
6362
6363/**
6364 * Hyphenates a camelcased CSS property name, for example:
6365 *
6366 * > hyphenateStyleName('backgroundColor')
6367 * < "background-color"
6368 * > hyphenateStyleName('MozTransition')
6369 * < "-moz-transition"
6370 * > hyphenateStyleName('msTransition')
6371 * < "-ms-transition"
6372 *
6373 * As Modernizr suggests (http://modernizr.com/docs/#prefixed), an `ms` prefix
6374 * is converted to `-ms-`.
6375 */
6376function hyphenateStyleName(name) {
6377 return name.replace(uppercasePattern, '-$1').toLowerCase().replace(msPattern, '-ms-');
6378}
6379
6380var warnValidStyle = function () {};
6381
6382{
6383 // 'msTransform' is correct, but the other prefixes should be capitalized
6384 var badVendoredStyleNamePattern = /^(?:webkit|moz|o)[A-Z]/;
6385 var msPattern$1 = /^-ms-/;
6386 var hyphenPattern = /-(.)/g;
6387
6388 // style values shouldn't contain a semicolon
6389 var badStyleValueWithSemicolonPattern = /;\s*$/;
6390
6391 var warnedStyleNames = {};
6392 var warnedStyleValues = {};
6393 var warnedForNaNValue = false;
6394 var warnedForInfinityValue = false;
6395
6396 var camelize = function (string) {
6397 return string.replace(hyphenPattern, function (_, character) {
6398 return character.toUpperCase();
6399 });
6400 };
6401
6402 var warnHyphenatedStyleName = function (name) {
6403 if (warnedStyleNames.hasOwnProperty(name) && warnedStyleNames[name]) {
6404 return;
6405 }
6406
6407 warnedStyleNames[name] = true;
6408 warning$1(false, 'Unsupported style property %s. Did you mean %s?', name,
6409 // As Andi Smith suggests
6410 // (http://www.andismith.com/blog/2012/02/modernizr-prefixed/), an `-ms` prefix
6411 // is converted to lowercase `ms`.
6412 camelize(name.replace(msPattern$1, 'ms-')));
6413 };
6414
6415 var warnBadVendoredStyleName = function (name) {
6416 if (warnedStyleNames.hasOwnProperty(name) && warnedStyleNames[name]) {
6417 return;
6418 }
6419
6420 warnedStyleNames[name] = true;
6421 warning$1(false, 'Unsupported vendor-prefixed style property %s. Did you mean %s?', name, name.charAt(0).toUpperCase() + name.slice(1));
6422 };
6423
6424 var warnStyleValueWithSemicolon = function (name, value) {
6425 if (warnedStyleValues.hasOwnProperty(value) && warnedStyleValues[value]) {
6426 return;
6427 }
6428
6429 warnedStyleValues[value] = true;
6430 warning$1(false, "Style property values shouldn't contain a semicolon. " + 'Try "%s: %s" instead.', name, value.replace(badStyleValueWithSemicolonPattern, ''));
6431 };
6432
6433 var warnStyleValueIsNaN = function (name, value) {
6434 if (warnedForNaNValue) {
6435 return;
6436 }
6437
6438 warnedForNaNValue = true;
6439 warning$1(false, '`NaN` is an invalid value for the `%s` css style property.', name);
6440 };
6441
6442 var warnStyleValueIsInfinity = function (name, value) {
6443 if (warnedForInfinityValue) {
6444 return;
6445 }
6446
6447 warnedForInfinityValue = true;
6448 warning$1(false, '`Infinity` is an invalid value for the `%s` css style property.', name);
6449 };
6450
6451 warnValidStyle = function (name, value) {
6452 if (name.indexOf('-') > -1) {
6453 warnHyphenatedStyleName(name);
6454 } else if (badVendoredStyleNamePattern.test(name)) {
6455 warnBadVendoredStyleName(name);
6456 } else if (badStyleValueWithSemicolonPattern.test(value)) {
6457 warnStyleValueWithSemicolon(name, value);
6458 }
6459
6460 if (typeof value === 'number') {
6461 if (isNaN(value)) {
6462 warnStyleValueIsNaN(name, value);
6463 } else if (!isFinite(value)) {
6464 warnStyleValueIsInfinity(name, value);
6465 }
6466 }
6467 };
6468}
6469
6470var warnValidStyle$1 = warnValidStyle;
6471
6472/**
6473 * Operations for dealing with CSS properties.
6474 */
6475
6476/**
6477 * This creates a string that is expected to be equivalent to the style
6478 * attribute generated by server-side rendering. It by-passes warnings and
6479 * security checks so it's not safe to use this value for anything other than
6480 * comparison. It is only used in DEV for SSR validation.
6481 */
6482function createDangerousStringForStyles(styles) {
6483 {
6484 var serialized = '';
6485 var delimiter = '';
6486 for (var styleName in styles) {
6487 if (!styles.hasOwnProperty(styleName)) {
6488 continue;
6489 }
6490 var styleValue = styles[styleName];
6491 if (styleValue != null) {
6492 var isCustomProperty = styleName.indexOf('--') === 0;
6493 serialized += delimiter + hyphenateStyleName(styleName) + ':';
6494 serialized += dangerousStyleValue(styleName, styleValue, isCustomProperty);
6495
6496 delimiter = ';';
6497 }
6498 }
6499 return serialized || null;
6500 }
6501}
6502
6503/**
6504 * Sets the value for multiple styles on a node. If a value is specified as
6505 * '' (empty string), the corresponding style property will be unset.
6506 *
6507 * @param {DOMElement} node
6508 * @param {object} styles
6509 */
6510function setValueForStyles(node, styles) {
6511 var style = node.style;
6512 for (var styleName in styles) {
6513 if (!styles.hasOwnProperty(styleName)) {
6514 continue;
6515 }
6516 var isCustomProperty = styleName.indexOf('--') === 0;
6517 {
6518 if (!isCustomProperty) {
6519 warnValidStyle$1(styleName, styles[styleName]);
6520 }
6521 }
6522 var styleValue = dangerousStyleValue(styleName, styles[styleName], isCustomProperty);
6523 if (styleName === 'float') {
6524 styleName = 'cssFloat';
6525 }
6526 if (isCustomProperty) {
6527 style.setProperty(styleName, styleValue);
6528 } else {
6529 style[styleName] = styleValue;
6530 }
6531 }
6532}
6533
6534function isValueEmpty(value) {
6535 return value == null || typeof value === 'boolean' || value === '';
6536}
6537
6538/**
6539 * Given {color: 'red', overflow: 'hidden'} returns {
6540 * color: 'color',
6541 * overflowX: 'overflow',
6542 * overflowY: 'overflow',
6543 * }. This can be read as "the overflowY property was set by the overflow
6544 * shorthand". That is, the values are the property that each was derived from.
6545 */
6546function expandShorthandMap(styles) {
6547 var expanded = {};
6548 for (var key in styles) {
6549 var longhands = shorthandToLonghand[key] || [key];
6550 for (var i = 0; i < longhands.length; i++) {
6551 expanded[longhands[i]] = key;
6552 }
6553 }
6554 return expanded;
6555}
6556
6557/**
6558 * When mixing shorthand and longhand property names, we warn during updates if
6559 * we expect an incorrect result to occur. In particular, we warn for:
6560 *
6561 * Updating a shorthand property (longhand gets overwritten):
6562 * {font: 'foo', fontVariant: 'bar'} -> {font: 'baz', fontVariant: 'bar'}
6563 * becomes .style.font = 'baz'
6564 * Removing a shorthand property (longhand gets lost too):
6565 * {font: 'foo', fontVariant: 'bar'} -> {fontVariant: 'bar'}
6566 * becomes .style.font = ''
6567 * Removing a longhand property (should revert to shorthand; doesn't):
6568 * {font: 'foo', fontVariant: 'bar'} -> {font: 'foo'}
6569 * becomes .style.fontVariant = ''
6570 */
6571function validateShorthandPropertyCollisionInDev(styleUpdates, nextStyles) {
6572 if (!warnAboutShorthandPropertyCollision) {
6573 return;
6574 }
6575
6576 if (!nextStyles) {
6577 return;
6578 }
6579
6580 var expandedUpdates = expandShorthandMap(styleUpdates);
6581 var expandedStyles = expandShorthandMap(nextStyles);
6582 var warnedAbout = {};
6583 for (var key in expandedUpdates) {
6584 var originalKey = expandedUpdates[key];
6585 var correctOriginalKey = expandedStyles[key];
6586 if (correctOriginalKey && originalKey !== correctOriginalKey) {
6587 var warningKey = originalKey + ',' + correctOriginalKey;
6588 if (warnedAbout[warningKey]) {
6589 continue;
6590 }
6591 warnedAbout[warningKey] = true;
6592 warning$1(false, '%s a style property during rerender (%s) when a ' + 'conflicting property is set (%s) can lead to styling bugs. To ' + "avoid this, don't mix shorthand and non-shorthand properties " + 'for the same value; instead, replace the shorthand with ' + 'separate values.', isValueEmpty(styleUpdates[originalKey]) ? 'Removing' : 'Updating', originalKey, correctOriginalKey);
6593 }
6594 }
6595}
6596
6597// For HTML, certain tags should omit their close tag. We keep a whitelist for
6598// those special-case tags.
6599
6600var omittedCloseTags = {
6601 area: true,
6602 base: true,
6603 br: true,
6604 col: true,
6605 embed: true,
6606 hr: true,
6607 img: true,
6608 input: true,
6609 keygen: true,
6610 link: true,
6611 meta: true,
6612 param: true,
6613 source: true,
6614 track: true,
6615 wbr: true
6616 // NOTE: menuitem's close tag should be omitted, but that causes problems.
6617};
6618
6619// For HTML, certain tags cannot have children. This has the same purpose as
6620// `omittedCloseTags` except that `menuitem` should still have its closing tag.
6621
6622var voidElementTags = _assign({
6623 menuitem: true
6624}, omittedCloseTags);
6625
6626// TODO: We can remove this if we add invariantWithStack()
6627// or add stack by default to invariants where possible.
6628var HTML$1 = '__html';
6629
6630var ReactDebugCurrentFrame$2 = null;
6631{
6632 ReactDebugCurrentFrame$2 = ReactSharedInternals.ReactDebugCurrentFrame;
6633}
6634
6635function assertValidProps(tag, props) {
6636 if (!props) {
6637 return;
6638 }
6639 // Note the use of `==` which checks for null or undefined.
6640 if (voidElementTags[tag]) {
6641 !(props.children == null && props.dangerouslySetInnerHTML == null) ? invariant(false, '%s is a void element tag and must neither have `children` nor use `dangerouslySetInnerHTML`.%s', tag, ReactDebugCurrentFrame$2.getStackAddendum()) : void 0;
6642 }
6643 if (props.dangerouslySetInnerHTML != null) {
6644 !(props.children == null) ? invariant(false, 'Can only set one of `children` or `props.dangerouslySetInnerHTML`.') : void 0;
6645 !(typeof props.dangerouslySetInnerHTML === 'object' && HTML$1 in props.dangerouslySetInnerHTML) ? invariant(false, '`props.dangerouslySetInnerHTML` must be in the form `{__html: ...}`. Please visit https://fb.me/react-invariant-dangerously-set-inner-html for more information.') : void 0;
6646 }
6647 {
6648 !(props.suppressContentEditableWarning || !props.contentEditable || props.children == null) ? warning$1(false, 'A component is `contentEditable` and contains `children` managed by ' + 'React. It is now your responsibility to guarantee that none of ' + 'those nodes are unexpectedly modified or duplicated. This is ' + 'probably not intentional.') : void 0;
6649 }
6650 !(props.style == null || typeof props.style === 'object') ? invariant(false, 'The `style` prop expects a mapping from style properties to values, not a string. For example, style={{marginRight: spacing + \'em\'}} when using JSX.%s', ReactDebugCurrentFrame$2.getStackAddendum()) : void 0;
6651}
6652
6653function isCustomComponent(tagName, props) {
6654 if (tagName.indexOf('-') === -1) {
6655 return typeof props.is === 'string';
6656 }
6657 switch (tagName) {
6658 // These are reserved SVG and MathML elements.
6659 // We don't mind this whitelist too much because we expect it to never grow.
6660 // The alternative is to track the namespace in a few places which is convoluted.
6661 // https://w3c.github.io/webcomponents/spec/custom/#custom-elements-core-concepts
6662 case 'annotation-xml':
6663 case 'color-profile':
6664 case 'font-face':
6665 case 'font-face-src':
6666 case 'font-face-uri':
6667 case 'font-face-format':
6668 case 'font-face-name':
6669 case 'missing-glyph':
6670 return false;
6671 default:
6672 return true;
6673 }
6674}
6675
6676// When adding attributes to the HTML or SVG whitelist, be sure to
6677// also add them to this module to ensure casing and incorrect name
6678// warnings.
6679var possibleStandardNames = {
6680 // HTML
6681 accept: 'accept',
6682 acceptcharset: 'acceptCharset',
6683 'accept-charset': 'acceptCharset',
6684 accesskey: 'accessKey',
6685 action: 'action',
6686 allowfullscreen: 'allowFullScreen',
6687 alt: 'alt',
6688 as: 'as',
6689 async: 'async',
6690 autocapitalize: 'autoCapitalize',
6691 autocomplete: 'autoComplete',
6692 autocorrect: 'autoCorrect',
6693 autofocus: 'autoFocus',
6694 autoplay: 'autoPlay',
6695 autosave: 'autoSave',
6696 capture: 'capture',
6697 cellpadding: 'cellPadding',
6698 cellspacing: 'cellSpacing',
6699 challenge: 'challenge',
6700 charset: 'charSet',
6701 checked: 'checked',
6702 children: 'children',
6703 cite: 'cite',
6704 class: 'className',
6705 classid: 'classID',
6706 classname: 'className',
6707 cols: 'cols',
6708 colspan: 'colSpan',
6709 content: 'content',
6710 contenteditable: 'contentEditable',
6711 contextmenu: 'contextMenu',
6712 controls: 'controls',
6713 controlslist: 'controlsList',
6714 coords: 'coords',
6715 crossorigin: 'crossOrigin',
6716 dangerouslysetinnerhtml: 'dangerouslySetInnerHTML',
6717 data: 'data',
6718 datetime: 'dateTime',
6719 default: 'default',
6720 defaultchecked: 'defaultChecked',
6721 defaultvalue: 'defaultValue',
6722 defer: 'defer',
6723 dir: 'dir',
6724 disabled: 'disabled',
6725 download: 'download',
6726 draggable: 'draggable',
6727 enctype: 'encType',
6728 for: 'htmlFor',
6729 form: 'form',
6730 formmethod: 'formMethod',
6731 formaction: 'formAction',
6732 formenctype: 'formEncType',
6733 formnovalidate: 'formNoValidate',
6734 formtarget: 'formTarget',
6735 frameborder: 'frameBorder',
6736 headers: 'headers',
6737 height: 'height',
6738 hidden: 'hidden',
6739 high: 'high',
6740 href: 'href',
6741 hreflang: 'hrefLang',
6742 htmlfor: 'htmlFor',
6743 httpequiv: 'httpEquiv',
6744 'http-equiv': 'httpEquiv',
6745 icon: 'icon',
6746 id: 'id',
6747 innerhtml: 'innerHTML',
6748 inputmode: 'inputMode',
6749 integrity: 'integrity',
6750 is: 'is',
6751 itemid: 'itemID',
6752 itemprop: 'itemProp',
6753 itemref: 'itemRef',
6754 itemscope: 'itemScope',
6755 itemtype: 'itemType',
6756 keyparams: 'keyParams',
6757 keytype: 'keyType',
6758 kind: 'kind',
6759 label: 'label',
6760 lang: 'lang',
6761 list: 'list',
6762 loop: 'loop',
6763 low: 'low',
6764 manifest: 'manifest',
6765 marginwidth: 'marginWidth',
6766 marginheight: 'marginHeight',
6767 max: 'max',
6768 maxlength: 'maxLength',
6769 media: 'media',
6770 mediagroup: 'mediaGroup',
6771 method: 'method',
6772 min: 'min',
6773 minlength: 'minLength',
6774 multiple: 'multiple',
6775 muted: 'muted',
6776 name: 'name',
6777 nomodule: 'noModule',
6778 nonce: 'nonce',
6779 novalidate: 'noValidate',
6780 open: 'open',
6781 optimum: 'optimum',
6782 pattern: 'pattern',
6783 placeholder: 'placeholder',
6784 playsinline: 'playsInline',
6785 poster: 'poster',
6786 preload: 'preload',
6787 profile: 'profile',
6788 radiogroup: 'radioGroup',
6789 readonly: 'readOnly',
6790 referrerpolicy: 'referrerPolicy',
6791 rel: 'rel',
6792 required: 'required',
6793 reversed: 'reversed',
6794 role: 'role',
6795 rows: 'rows',
6796 rowspan: 'rowSpan',
6797 sandbox: 'sandbox',
6798 scope: 'scope',
6799 scoped: 'scoped',
6800 scrolling: 'scrolling',
6801 seamless: 'seamless',
6802 selected: 'selected',
6803 shape: 'shape',
6804 size: 'size',
6805 sizes: 'sizes',
6806 span: 'span',
6807 spellcheck: 'spellCheck',
6808 src: 'src',
6809 srcdoc: 'srcDoc',
6810 srclang: 'srcLang',
6811 srcset: 'srcSet',
6812 start: 'start',
6813 step: 'step',
6814 style: 'style',
6815 summary: 'summary',
6816 tabindex: 'tabIndex',
6817 target: 'target',
6818 title: 'title',
6819 type: 'type',
6820 usemap: 'useMap',
6821 value: 'value',
6822 width: 'width',
6823 wmode: 'wmode',
6824 wrap: 'wrap',
6825
6826 // SVG
6827 about: 'about',
6828 accentheight: 'accentHeight',
6829 'accent-height': 'accentHeight',
6830 accumulate: 'accumulate',
6831 additive: 'additive',
6832 alignmentbaseline: 'alignmentBaseline',
6833 'alignment-baseline': 'alignmentBaseline',
6834 allowreorder: 'allowReorder',
6835 alphabetic: 'alphabetic',
6836 amplitude: 'amplitude',
6837 arabicform: 'arabicForm',
6838 'arabic-form': 'arabicForm',
6839 ascent: 'ascent',
6840 attributename: 'attributeName',
6841 attributetype: 'attributeType',
6842 autoreverse: 'autoReverse',
6843 azimuth: 'azimuth',
6844 basefrequency: 'baseFrequency',
6845 baselineshift: 'baselineShift',
6846 'baseline-shift': 'baselineShift',
6847 baseprofile: 'baseProfile',
6848 bbox: 'bbox',
6849 begin: 'begin',
6850 bias: 'bias',
6851 by: 'by',
6852 calcmode: 'calcMode',
6853 capheight: 'capHeight',
6854 'cap-height': 'capHeight',
6855 clip: 'clip',
6856 clippath: 'clipPath',
6857 'clip-path': 'clipPath',
6858 clippathunits: 'clipPathUnits',
6859 cliprule: 'clipRule',
6860 'clip-rule': 'clipRule',
6861 color: 'color',
6862 colorinterpolation: 'colorInterpolation',
6863 'color-interpolation': 'colorInterpolation',
6864 colorinterpolationfilters: 'colorInterpolationFilters',
6865 'color-interpolation-filters': 'colorInterpolationFilters',
6866 colorprofile: 'colorProfile',
6867 'color-profile': 'colorProfile',
6868 colorrendering: 'colorRendering',
6869 'color-rendering': 'colorRendering',
6870 contentscripttype: 'contentScriptType',
6871 contentstyletype: 'contentStyleType',
6872 cursor: 'cursor',
6873 cx: 'cx',
6874 cy: 'cy',
6875 d: 'd',
6876 datatype: 'datatype',
6877 decelerate: 'decelerate',
6878 descent: 'descent',
6879 diffuseconstant: 'diffuseConstant',
6880 direction: 'direction',
6881 display: 'display',
6882 divisor: 'divisor',
6883 dominantbaseline: 'dominantBaseline',
6884 'dominant-baseline': 'dominantBaseline',
6885 dur: 'dur',
6886 dx: 'dx',
6887 dy: 'dy',
6888 edgemode: 'edgeMode',
6889 elevation: 'elevation',
6890 enablebackground: 'enableBackground',
6891 'enable-background': 'enableBackground',
6892 end: 'end',
6893 exponent: 'exponent',
6894 externalresourcesrequired: 'externalResourcesRequired',
6895 fill: 'fill',
6896 fillopacity: 'fillOpacity',
6897 'fill-opacity': 'fillOpacity',
6898 fillrule: 'fillRule',
6899 'fill-rule': 'fillRule',
6900 filter: 'filter',
6901 filterres: 'filterRes',
6902 filterunits: 'filterUnits',
6903 floodopacity: 'floodOpacity',
6904 'flood-opacity': 'floodOpacity',
6905 floodcolor: 'floodColor',
6906 'flood-color': 'floodColor',
6907 focusable: 'focusable',
6908 fontfamily: 'fontFamily',
6909 'font-family': 'fontFamily',
6910 fontsize: 'fontSize',
6911 'font-size': 'fontSize',
6912 fontsizeadjust: 'fontSizeAdjust',
6913 'font-size-adjust': 'fontSizeAdjust',
6914 fontstretch: 'fontStretch',
6915 'font-stretch': 'fontStretch',
6916 fontstyle: 'fontStyle',
6917 'font-style': 'fontStyle',
6918 fontvariant: 'fontVariant',
6919 'font-variant': 'fontVariant',
6920 fontweight: 'fontWeight',
6921 'font-weight': 'fontWeight',
6922 format: 'format',
6923 from: 'from',
6924 fx: 'fx',
6925 fy: 'fy',
6926 g1: 'g1',
6927 g2: 'g2',
6928 glyphname: 'glyphName',
6929 'glyph-name': 'glyphName',
6930 glyphorientationhorizontal: 'glyphOrientationHorizontal',
6931 'glyph-orientation-horizontal': 'glyphOrientationHorizontal',
6932 glyphorientationvertical: 'glyphOrientationVertical',
6933 'glyph-orientation-vertical': 'glyphOrientationVertical',
6934 glyphref: 'glyphRef',
6935 gradienttransform: 'gradientTransform',
6936 gradientunits: 'gradientUnits',
6937 hanging: 'hanging',
6938 horizadvx: 'horizAdvX',
6939 'horiz-adv-x': 'horizAdvX',
6940 horizoriginx: 'horizOriginX',
6941 'horiz-origin-x': 'horizOriginX',
6942 ideographic: 'ideographic',
6943 imagerendering: 'imageRendering',
6944 'image-rendering': 'imageRendering',
6945 in2: 'in2',
6946 in: 'in',
6947 inlist: 'inlist',
6948 intercept: 'intercept',
6949 k1: 'k1',
6950 k2: 'k2',
6951 k3: 'k3',
6952 k4: 'k4',
6953 k: 'k',
6954 kernelmatrix: 'kernelMatrix',
6955 kernelunitlength: 'kernelUnitLength',
6956 kerning: 'kerning',
6957 keypoints: 'keyPoints',
6958 keysplines: 'keySplines',
6959 keytimes: 'keyTimes',
6960 lengthadjust: 'lengthAdjust',
6961 letterspacing: 'letterSpacing',
6962 'letter-spacing': 'letterSpacing',
6963 lightingcolor: 'lightingColor',
6964 'lighting-color': 'lightingColor',
6965 limitingconeangle: 'limitingConeAngle',
6966 local: 'local',
6967 markerend: 'markerEnd',
6968 'marker-end': 'markerEnd',
6969 markerheight: 'markerHeight',
6970 markermid: 'markerMid',
6971 'marker-mid': 'markerMid',
6972 markerstart: 'markerStart',
6973 'marker-start': 'markerStart',
6974 markerunits: 'markerUnits',
6975 markerwidth: 'markerWidth',
6976 mask: 'mask',
6977 maskcontentunits: 'maskContentUnits',
6978 maskunits: 'maskUnits',
6979 mathematical: 'mathematical',
6980 mode: 'mode',
6981 numoctaves: 'numOctaves',
6982 offset: 'offset',
6983 opacity: 'opacity',
6984 operator: 'operator',
6985 order: 'order',
6986 orient: 'orient',
6987 orientation: 'orientation',
6988 origin: 'origin',
6989 overflow: 'overflow',
6990 overlineposition: 'overlinePosition',
6991 'overline-position': 'overlinePosition',
6992 overlinethickness: 'overlineThickness',
6993 'overline-thickness': 'overlineThickness',
6994 paintorder: 'paintOrder',
6995 'paint-order': 'paintOrder',
6996 panose1: 'panose1',
6997 'panose-1': 'panose1',
6998 pathlength: 'pathLength',
6999 patterncontentunits: 'patternContentUnits',
7000 patterntransform: 'patternTransform',
7001 patternunits: 'patternUnits',
7002 pointerevents: 'pointerEvents',
7003 'pointer-events': 'pointerEvents',
7004 points: 'points',
7005 pointsatx: 'pointsAtX',
7006 pointsaty: 'pointsAtY',
7007 pointsatz: 'pointsAtZ',
7008 prefix: 'prefix',
7009 preservealpha: 'preserveAlpha',
7010 preserveaspectratio: 'preserveAspectRatio',
7011 primitiveunits: 'primitiveUnits',
7012 property: 'property',
7013 r: 'r',
7014 radius: 'radius',
7015 refx: 'refX',
7016 refy: 'refY',
7017 renderingintent: 'renderingIntent',
7018 'rendering-intent': 'renderingIntent',
7019 repeatcount: 'repeatCount',
7020 repeatdur: 'repeatDur',
7021 requiredextensions: 'requiredExtensions',
7022 requiredfeatures: 'requiredFeatures',
7023 resource: 'resource',
7024 restart: 'restart',
7025 result: 'result',
7026 results: 'results',
7027 rotate: 'rotate',
7028 rx: 'rx',
7029 ry: 'ry',
7030 scale: 'scale',
7031 security: 'security',
7032 seed: 'seed',
7033 shaperendering: 'shapeRendering',
7034 'shape-rendering': 'shapeRendering',
7035 slope: 'slope',
7036 spacing: 'spacing',
7037 specularconstant: 'specularConstant',
7038 specularexponent: 'specularExponent',
7039 speed: 'speed',
7040 spreadmethod: 'spreadMethod',
7041 startoffset: 'startOffset',
7042 stddeviation: 'stdDeviation',
7043 stemh: 'stemh',
7044 stemv: 'stemv',
7045 stitchtiles: 'stitchTiles',
7046 stopcolor: 'stopColor',
7047 'stop-color': 'stopColor',
7048 stopopacity: 'stopOpacity',
7049 'stop-opacity': 'stopOpacity',
7050 strikethroughposition: 'strikethroughPosition',
7051 'strikethrough-position': 'strikethroughPosition',
7052 strikethroughthickness: 'strikethroughThickness',
7053 'strikethrough-thickness': 'strikethroughThickness',
7054 string: 'string',
7055 stroke: 'stroke',
7056 strokedasharray: 'strokeDasharray',
7057 'stroke-dasharray': 'strokeDasharray',
7058 strokedashoffset: 'strokeDashoffset',
7059 'stroke-dashoffset': 'strokeDashoffset',
7060 strokelinecap: 'strokeLinecap',
7061 'stroke-linecap': 'strokeLinecap',
7062 strokelinejoin: 'strokeLinejoin',
7063 'stroke-linejoin': 'strokeLinejoin',
7064 strokemiterlimit: 'strokeMiterlimit',
7065 'stroke-miterlimit': 'strokeMiterlimit',
7066 strokewidth: 'strokeWidth',
7067 'stroke-width': 'strokeWidth',
7068 strokeopacity: 'strokeOpacity',
7069 'stroke-opacity': 'strokeOpacity',
7070 suppresscontenteditablewarning: 'suppressContentEditableWarning',
7071 suppresshydrationwarning: 'suppressHydrationWarning',
7072 surfacescale: 'surfaceScale',
7073 systemlanguage: 'systemLanguage',
7074 tablevalues: 'tableValues',
7075 targetx: 'targetX',
7076 targety: 'targetY',
7077 textanchor: 'textAnchor',
7078 'text-anchor': 'textAnchor',
7079 textdecoration: 'textDecoration',
7080 'text-decoration': 'textDecoration',
7081 textlength: 'textLength',
7082 textrendering: 'textRendering',
7083 'text-rendering': 'textRendering',
7084 to: 'to',
7085 transform: 'transform',
7086 typeof: 'typeof',
7087 u1: 'u1',
7088 u2: 'u2',
7089 underlineposition: 'underlinePosition',
7090 'underline-position': 'underlinePosition',
7091 underlinethickness: 'underlineThickness',
7092 'underline-thickness': 'underlineThickness',
7093 unicode: 'unicode',
7094 unicodebidi: 'unicodeBidi',
7095 'unicode-bidi': 'unicodeBidi',
7096 unicoderange: 'unicodeRange',
7097 'unicode-range': 'unicodeRange',
7098 unitsperem: 'unitsPerEm',
7099 'units-per-em': 'unitsPerEm',
7100 unselectable: 'unselectable',
7101 valphabetic: 'vAlphabetic',
7102 'v-alphabetic': 'vAlphabetic',
7103 values: 'values',
7104 vectoreffect: 'vectorEffect',
7105 'vector-effect': 'vectorEffect',
7106 version: 'version',
7107 vertadvy: 'vertAdvY',
7108 'vert-adv-y': 'vertAdvY',
7109 vertoriginx: 'vertOriginX',
7110 'vert-origin-x': 'vertOriginX',
7111 vertoriginy: 'vertOriginY',
7112 'vert-origin-y': 'vertOriginY',
7113 vhanging: 'vHanging',
7114 'v-hanging': 'vHanging',
7115 videographic: 'vIdeographic',
7116 'v-ideographic': 'vIdeographic',
7117 viewbox: 'viewBox',
7118 viewtarget: 'viewTarget',
7119 visibility: 'visibility',
7120 vmathematical: 'vMathematical',
7121 'v-mathematical': 'vMathematical',
7122 vocab: 'vocab',
7123 widths: 'widths',
7124 wordspacing: 'wordSpacing',
7125 'word-spacing': 'wordSpacing',
7126 writingmode: 'writingMode',
7127 'writing-mode': 'writingMode',
7128 x1: 'x1',
7129 x2: 'x2',
7130 x: 'x',
7131 xchannelselector: 'xChannelSelector',
7132 xheight: 'xHeight',
7133 'x-height': 'xHeight',
7134 xlinkactuate: 'xlinkActuate',
7135 'xlink:actuate': 'xlinkActuate',
7136 xlinkarcrole: 'xlinkArcrole',
7137 'xlink:arcrole': 'xlinkArcrole',
7138 xlinkhref: 'xlinkHref',
7139 'xlink:href': 'xlinkHref',
7140 xlinkrole: 'xlinkRole',
7141 'xlink:role': 'xlinkRole',
7142 xlinkshow: 'xlinkShow',
7143 'xlink:show': 'xlinkShow',
7144 xlinktitle: 'xlinkTitle',
7145 'xlink:title': 'xlinkTitle',
7146 xlinktype: 'xlinkType',
7147 'xlink:type': 'xlinkType',
7148 xmlbase: 'xmlBase',
7149 'xml:base': 'xmlBase',
7150 xmllang: 'xmlLang',
7151 'xml:lang': 'xmlLang',
7152 xmlns: 'xmlns',
7153 'xml:space': 'xmlSpace',
7154 xmlnsxlink: 'xmlnsXlink',
7155 'xmlns:xlink': 'xmlnsXlink',
7156 xmlspace: 'xmlSpace',
7157 y1: 'y1',
7158 y2: 'y2',
7159 y: 'y',
7160 ychannelselector: 'yChannelSelector',
7161 z: 'z',
7162 zoomandpan: 'zoomAndPan'
7163};
7164
7165var ariaProperties = {
7166 'aria-current': 0, // state
7167 'aria-details': 0,
7168 'aria-disabled': 0, // state
7169 'aria-hidden': 0, // state
7170 'aria-invalid': 0, // state
7171 'aria-keyshortcuts': 0,
7172 'aria-label': 0,
7173 'aria-roledescription': 0,
7174 // Widget Attributes
7175 'aria-autocomplete': 0,
7176 'aria-checked': 0,
7177 'aria-expanded': 0,
7178 'aria-haspopup': 0,
7179 'aria-level': 0,
7180 'aria-modal': 0,
7181 'aria-multiline': 0,
7182 'aria-multiselectable': 0,
7183 'aria-orientation': 0,
7184 'aria-placeholder': 0,
7185 'aria-pressed': 0,
7186 'aria-readonly': 0,
7187 'aria-required': 0,
7188 'aria-selected': 0,
7189 'aria-sort': 0,
7190 'aria-valuemax': 0,
7191 'aria-valuemin': 0,
7192 'aria-valuenow': 0,
7193 'aria-valuetext': 0,
7194 // Live Region Attributes
7195 'aria-atomic': 0,
7196 'aria-busy': 0,
7197 'aria-live': 0,
7198 'aria-relevant': 0,
7199 // Drag-and-Drop Attributes
7200 'aria-dropeffect': 0,
7201 'aria-grabbed': 0,
7202 // Relationship Attributes
7203 'aria-activedescendant': 0,
7204 'aria-colcount': 0,
7205 'aria-colindex': 0,
7206 'aria-colspan': 0,
7207 'aria-controls': 0,
7208 'aria-describedby': 0,
7209 'aria-errormessage': 0,
7210 'aria-flowto': 0,
7211 'aria-labelledby': 0,
7212 'aria-owns': 0,
7213 'aria-posinset': 0,
7214 'aria-rowcount': 0,
7215 'aria-rowindex': 0,
7216 'aria-rowspan': 0,
7217 'aria-setsize': 0
7218};
7219
7220var warnedProperties = {};
7221var rARIA = new RegExp('^(aria)-[' + ATTRIBUTE_NAME_CHAR + ']*$');
7222var rARIACamel = new RegExp('^(aria)[A-Z][' + ATTRIBUTE_NAME_CHAR + ']*$');
7223
7224var hasOwnProperty$2 = Object.prototype.hasOwnProperty;
7225
7226function validateProperty(tagName, name) {
7227 if (hasOwnProperty$2.call(warnedProperties, name) && warnedProperties[name]) {
7228 return true;
7229 }
7230
7231 if (rARIACamel.test(name)) {
7232 var ariaName = 'aria-' + name.slice(4).toLowerCase();
7233 var correctName = ariaProperties.hasOwnProperty(ariaName) ? ariaName : null;
7234
7235 // If this is an aria-* attribute, but is not listed in the known DOM
7236 // DOM properties, then it is an invalid aria-* attribute.
7237 if (correctName == null) {
7238 warning$1(false, 'Invalid ARIA attribute `%s`. ARIA attributes follow the pattern aria-* and must be lowercase.', name);
7239 warnedProperties[name] = true;
7240 return true;
7241 }
7242 // aria-* attributes should be lowercase; suggest the lowercase version.
7243 if (name !== correctName) {
7244 warning$1(false, 'Invalid ARIA attribute `%s`. Did you mean `%s`?', name, correctName);
7245 warnedProperties[name] = true;
7246 return true;
7247 }
7248 }
7249
7250 if (rARIA.test(name)) {
7251 var lowerCasedName = name.toLowerCase();
7252 var standardName = ariaProperties.hasOwnProperty(lowerCasedName) ? lowerCasedName : null;
7253
7254 // If this is an aria-* attribute, but is not listed in the known DOM
7255 // DOM properties, then it is an invalid aria-* attribute.
7256 if (standardName == null) {
7257 warnedProperties[name] = true;
7258 return false;
7259 }
7260 // aria-* attributes should be lowercase; suggest the lowercase version.
7261 if (name !== standardName) {
7262 warning$1(false, 'Unknown ARIA attribute `%s`. Did you mean `%s`?', name, standardName);
7263 warnedProperties[name] = true;
7264 return true;
7265 }
7266 }
7267
7268 return true;
7269}
7270
7271function warnInvalidARIAProps(type, props) {
7272 var invalidProps = [];
7273
7274 for (var key in props) {
7275 var isValid = validateProperty(type, key);
7276 if (!isValid) {
7277 invalidProps.push(key);
7278 }
7279 }
7280
7281 var unknownPropString = invalidProps.map(function (prop) {
7282 return '`' + prop + '`';
7283 }).join(', ');
7284
7285 if (invalidProps.length === 1) {
7286 warning$1(false, 'Invalid aria prop %s on <%s> tag. ' + 'For details, see https://fb.me/invalid-aria-prop', unknownPropString, type);
7287 } else if (invalidProps.length > 1) {
7288 warning$1(false, 'Invalid aria props %s on <%s> tag. ' + 'For details, see https://fb.me/invalid-aria-prop', unknownPropString, type);
7289 }
7290}
7291
7292function validateProperties(type, props) {
7293 if (isCustomComponent(type, props)) {
7294 return;
7295 }
7296 warnInvalidARIAProps(type, props);
7297}
7298
7299var didWarnValueNull = false;
7300
7301function validateProperties$1(type, props) {
7302 if (type !== 'input' && type !== 'textarea' && type !== 'select') {
7303 return;
7304 }
7305
7306 if (props != null && props.value === null && !didWarnValueNull) {
7307 didWarnValueNull = true;
7308 if (type === 'select' && props.multiple) {
7309 warning$1(false, '`value` prop on `%s` should not be null. ' + 'Consider using an empty array when `multiple` is set to `true` ' + 'to clear the component or `undefined` for uncontrolled components.', type);
7310 } else {
7311 warning$1(false, '`value` prop on `%s` should not be null. ' + 'Consider using an empty string to clear the component or `undefined` ' + 'for uncontrolled components.', type);
7312 }
7313 }
7314}
7315
7316var validateProperty$1 = function () {};
7317
7318{
7319 var warnedProperties$1 = {};
7320 var _hasOwnProperty = Object.prototype.hasOwnProperty;
7321 var EVENT_NAME_REGEX = /^on./;
7322 var INVALID_EVENT_NAME_REGEX = /^on[^A-Z]/;
7323 var rARIA$1 = new RegExp('^(aria)-[' + ATTRIBUTE_NAME_CHAR + ']*$');
7324 var rARIACamel$1 = new RegExp('^(aria)[A-Z][' + ATTRIBUTE_NAME_CHAR + ']*$');
7325
7326 validateProperty$1 = function (tagName, name, value, canUseEventSystem) {
7327 if (_hasOwnProperty.call(warnedProperties$1, name) && warnedProperties$1[name]) {
7328 return true;
7329 }
7330
7331 var lowerCasedName = name.toLowerCase();
7332 if (lowerCasedName === 'onfocusin' || lowerCasedName === 'onfocusout') {
7333 warning$1(false, 'React uses onFocus and onBlur instead of onFocusIn and onFocusOut. ' + 'All React events are normalized to bubble, so onFocusIn and onFocusOut ' + 'are not needed/supported by React.');
7334 warnedProperties$1[name] = true;
7335 return true;
7336 }
7337
7338 // We can't rely on the event system being injected on the server.
7339 if (canUseEventSystem) {
7340 if (registrationNameModules.hasOwnProperty(name)) {
7341 return true;
7342 }
7343 var registrationName = possibleRegistrationNames.hasOwnProperty(lowerCasedName) ? possibleRegistrationNames[lowerCasedName] : null;
7344 if (registrationName != null) {
7345 warning$1(false, 'Invalid event handler property `%s`. Did you mean `%s`?', name, registrationName);
7346 warnedProperties$1[name] = true;
7347 return true;
7348 }
7349 if (EVENT_NAME_REGEX.test(name)) {
7350 warning$1(false, 'Unknown event handler property `%s`. It will be ignored.', name);
7351 warnedProperties$1[name] = true;
7352 return true;
7353 }
7354 } else if (EVENT_NAME_REGEX.test(name)) {
7355 // If no event plugins have been injected, we are in a server environment.
7356 // So we can't tell if the event name is correct for sure, but we can filter
7357 // out known bad ones like `onclick`. We can't suggest a specific replacement though.
7358 if (INVALID_EVENT_NAME_REGEX.test(name)) {
7359 warning$1(false, 'Invalid event handler property `%s`. ' + 'React events use the camelCase naming convention, for example `onClick`.', name);
7360 }
7361 warnedProperties$1[name] = true;
7362 return true;
7363 }
7364
7365 // Let the ARIA attribute hook validate ARIA attributes
7366 if (rARIA$1.test(name) || rARIACamel$1.test(name)) {
7367 return true;
7368 }
7369
7370 if (lowerCasedName === 'innerhtml') {
7371 warning$1(false, 'Directly setting property `innerHTML` is not permitted. ' + 'For more information, lookup documentation on `dangerouslySetInnerHTML`.');
7372 warnedProperties$1[name] = true;
7373 return true;
7374 }
7375
7376 if (lowerCasedName === 'aria') {
7377 warning$1(false, 'The `aria` attribute is reserved for future use in React. ' + 'Pass individual `aria-` attributes instead.');
7378 warnedProperties$1[name] = true;
7379 return true;
7380 }
7381
7382 if (lowerCasedName === 'is' && value !== null && value !== undefined && typeof value !== 'string') {
7383 warning$1(false, 'Received a `%s` for a string attribute `is`. If this is expected, cast ' + 'the value to a string.', typeof value);
7384 warnedProperties$1[name] = true;
7385 return true;
7386 }
7387
7388 if (typeof value === 'number' && isNaN(value)) {
7389 warning$1(false, 'Received NaN for the `%s` attribute. If this is expected, cast ' + 'the value to a string.', name);
7390 warnedProperties$1[name] = true;
7391 return true;
7392 }
7393
7394 var propertyInfo = getPropertyInfo(name);
7395 var isReserved = propertyInfo !== null && propertyInfo.type === RESERVED;
7396
7397 // Known attributes should match the casing specified in the property config.
7398 if (possibleStandardNames.hasOwnProperty(lowerCasedName)) {
7399 var standardName = possibleStandardNames[lowerCasedName];
7400 if (standardName !== name) {
7401 warning$1(false, 'Invalid DOM property `%s`. Did you mean `%s`?', name, standardName);
7402 warnedProperties$1[name] = true;
7403 return true;
7404 }
7405 } else if (!isReserved && name !== lowerCasedName) {
7406 // Unknown attributes should have lowercase casing since that's how they
7407 // will be cased anyway with server rendering.
7408 warning$1(false, 'React does not recognize the `%s` prop on a DOM element. If you ' + 'intentionally want it to appear in the DOM as a custom ' + 'attribute, spell it as lowercase `%s` instead. ' + 'If you accidentally passed it from a parent component, remove ' + 'it from the DOM element.', name, lowerCasedName);
7409 warnedProperties$1[name] = true;
7410 return true;
7411 }
7412
7413 if (typeof value === 'boolean' && shouldRemoveAttributeWithWarning(name, value, propertyInfo, false)) {
7414 if (value) {
7415 warning$1(false, 'Received `%s` for a non-boolean attribute `%s`.\n\n' + 'If you want to write it to the DOM, pass a string instead: ' + '%s="%s" or %s={value.toString()}.', value, name, name, value, name);
7416 } else {
7417 warning$1(false, 'Received `%s` for a non-boolean attribute `%s`.\n\n' + 'If you want to write it to the DOM, pass a string instead: ' + '%s="%s" or %s={value.toString()}.\n\n' + 'If you used to conditionally omit it with %s={condition && value}, ' + 'pass %s={condition ? value : undefined} instead.', value, name, name, value, name, name, name);
7418 }
7419 warnedProperties$1[name] = true;
7420 return true;
7421 }
7422
7423 // Now that we've validated casing, do not validate
7424 // data types for reserved props
7425 if (isReserved) {
7426 return true;
7427 }
7428
7429 // Warn when a known attribute is a bad type
7430 if (shouldRemoveAttributeWithWarning(name, value, propertyInfo, false)) {
7431 warnedProperties$1[name] = true;
7432 return false;
7433 }
7434
7435 // Warn when passing the strings 'false' or 'true' into a boolean prop
7436 if ((value === 'false' || value === 'true') && propertyInfo !== null && propertyInfo.type === BOOLEAN) {
7437 warning$1(false, 'Received the string `%s` for the boolean attribute `%s`. ' + '%s ' + 'Did you mean %s={%s}?', value, name, value === 'false' ? 'The browser will interpret it as a truthy value.' : 'Although this works, it will not work as expected if you pass the string "false".', name, value);
7438 warnedProperties$1[name] = true;
7439 return true;
7440 }
7441
7442 return true;
7443 };
7444}
7445
7446var warnUnknownProperties = function (type, props, canUseEventSystem) {
7447 var unknownProps = [];
7448 for (var key in props) {
7449 var isValid = validateProperty$1(type, key, props[key], canUseEventSystem);
7450 if (!isValid) {
7451 unknownProps.push(key);
7452 }
7453 }
7454
7455 var unknownPropString = unknownProps.map(function (prop) {
7456 return '`' + prop + '`';
7457 }).join(', ');
7458 if (unknownProps.length === 1) {
7459 warning$1(false, 'Invalid value for prop %s on <%s> tag. Either remove it from the element, ' + 'or pass a string or number value to keep it in the DOM. ' + 'For details, see https://fb.me/react-attribute-behavior', unknownPropString, type);
7460 } else if (unknownProps.length > 1) {
7461 warning$1(false, 'Invalid values for props %s on <%s> tag. Either remove them from the element, ' + 'or pass a string or number value to keep them in the DOM. ' + 'For details, see https://fb.me/react-attribute-behavior', unknownPropString, type);
7462 }
7463};
7464
7465function validateProperties$2(type, props, canUseEventSystem) {
7466 if (isCustomComponent(type, props)) {
7467 return;
7468 }
7469 warnUnknownProperties(type, props, canUseEventSystem);
7470}
7471
7472// TODO: direct imports like some-package/src/* are bad. Fix me.
7473var didWarnInvalidHydration = false;
7474var didWarnShadyDOM = false;
7475
7476var DANGEROUSLY_SET_INNER_HTML = 'dangerouslySetInnerHTML';
7477var SUPPRESS_CONTENT_EDITABLE_WARNING = 'suppressContentEditableWarning';
7478var SUPPRESS_HYDRATION_WARNING$1 = 'suppressHydrationWarning';
7479var AUTOFOCUS = 'autoFocus';
7480var CHILDREN = 'children';
7481var STYLE$1 = 'style';
7482var HTML = '__html';
7483
7484var HTML_NAMESPACE = Namespaces.html;
7485
7486
7487var warnedUnknownTags = void 0;
7488var suppressHydrationWarning = void 0;
7489
7490var validatePropertiesInDevelopment = void 0;
7491var warnForTextDifference = void 0;
7492var warnForPropDifference = void 0;
7493var warnForExtraAttributes = void 0;
7494var warnForInvalidEventListener = void 0;
7495var canDiffStyleForHydrationWarning = void 0;
7496
7497var normalizeMarkupForTextOrAttribute = void 0;
7498var normalizeHTML = void 0;
7499
7500{
7501 warnedUnknownTags = {
7502 // Chrome is the only major browser not shipping <time>. But as of July
7503 // 2017 it intends to ship it due to widespread usage. We intentionally
7504 // *don't* warn for <time> even if it's unrecognized by Chrome because
7505 // it soon will be, and many apps have been using it anyway.
7506 time: true,
7507 // There are working polyfills for <dialog>. Let people use it.
7508 dialog: true,
7509 // Electron ships a custom <webview> tag to display external web content in
7510 // an isolated frame and process.
7511 // This tag is not present in non Electron environments such as JSDom which
7512 // is often used for testing purposes.
7513 // @see https://electronjs.org/docs/api/webview-tag
7514 webview: true
7515 };
7516
7517 validatePropertiesInDevelopment = function (type, props) {
7518 validateProperties(type, props);
7519 validateProperties$1(type, props);
7520 validateProperties$2(type, props, /* canUseEventSystem */true);
7521 };
7522
7523 // IE 11 parses & normalizes the style attribute as opposed to other
7524 // browsers. It adds spaces and sorts the properties in some
7525 // non-alphabetical order. Handling that would require sorting CSS
7526 // properties in the client & server versions or applying
7527 // `expectedStyle` to a temporary DOM node to read its `style` attribute
7528 // normalized. Since it only affects IE, we're skipping style warnings
7529 // in that browser completely in favor of doing all that work.
7530 // See https://github.com/facebook/react/issues/11807
7531 canDiffStyleForHydrationWarning = canUseDOM && !document.documentMode;
7532
7533 // HTML parsing normalizes CR and CRLF to LF.
7534 // It also can turn \u0000 into \uFFFD inside attributes.
7535 // https://www.w3.org/TR/html5/single-page.html#preprocessing-the-input-stream
7536 // If we have a mismatch, it might be caused by that.
7537 // We will still patch up in this case but not fire the warning.
7538 var NORMALIZE_NEWLINES_REGEX = /\r\n?/g;
7539 var NORMALIZE_NULL_AND_REPLACEMENT_REGEX = /\u0000|\uFFFD/g;
7540
7541 normalizeMarkupForTextOrAttribute = function (markup) {
7542 var markupString = typeof markup === 'string' ? markup : '' + markup;
7543 return markupString.replace(NORMALIZE_NEWLINES_REGEX, '\n').replace(NORMALIZE_NULL_AND_REPLACEMENT_REGEX, '');
7544 };
7545
7546 warnForTextDifference = function (serverText, clientText) {
7547 if (didWarnInvalidHydration) {
7548 return;
7549 }
7550 var normalizedClientText = normalizeMarkupForTextOrAttribute(clientText);
7551 var normalizedServerText = normalizeMarkupForTextOrAttribute(serverText);
7552 if (normalizedServerText === normalizedClientText) {
7553 return;
7554 }
7555 didWarnInvalidHydration = true;
7556 warningWithoutStack$1(false, 'Text content did not match. Server: "%s" Client: "%s"', normalizedServerText, normalizedClientText);
7557 };
7558
7559 warnForPropDifference = function (propName, serverValue, clientValue) {
7560 if (didWarnInvalidHydration) {
7561 return;
7562 }
7563 var normalizedClientValue = normalizeMarkupForTextOrAttribute(clientValue);
7564 var normalizedServerValue = normalizeMarkupForTextOrAttribute(serverValue);
7565 if (normalizedServerValue === normalizedClientValue) {
7566 return;
7567 }
7568 didWarnInvalidHydration = true;
7569 warningWithoutStack$1(false, 'Prop `%s` did not match. Server: %s Client: %s', propName, JSON.stringify(normalizedServerValue), JSON.stringify(normalizedClientValue));
7570 };
7571
7572 warnForExtraAttributes = function (attributeNames) {
7573 if (didWarnInvalidHydration) {
7574 return;
7575 }
7576 didWarnInvalidHydration = true;
7577 var names = [];
7578 attributeNames.forEach(function (name) {
7579 names.push(name);
7580 });
7581 warningWithoutStack$1(false, 'Extra attributes from the server: %s', names);
7582 };
7583
7584 warnForInvalidEventListener = function (registrationName, listener) {
7585 if (listener === false) {
7586 warning$1(false, 'Expected `%s` listener to be a function, instead got `false`.\n\n' + 'If you used to conditionally omit it with %s={condition && value}, ' + 'pass %s={condition ? value : undefined} instead.', registrationName, registrationName, registrationName);
7587 } else {
7588 warning$1(false, 'Expected `%s` listener to be a function, instead got a value of `%s` type.', registrationName, typeof listener);
7589 }
7590 };
7591
7592 // Parse the HTML and read it back to normalize the HTML string so that it
7593 // can be used for comparison.
7594 normalizeHTML = function (parent, html) {
7595 // We could have created a separate document here to avoid
7596 // re-initializing custom elements if they exist. But this breaks
7597 // how <noscript> is being handled. So we use the same document.
7598 // See the discussion in https://github.com/facebook/react/pull/11157.
7599 var testElement = parent.namespaceURI === HTML_NAMESPACE ? parent.ownerDocument.createElement(parent.tagName) : parent.ownerDocument.createElementNS(parent.namespaceURI, parent.tagName);
7600 testElement.innerHTML = html;
7601 return testElement.innerHTML;
7602 };
7603}
7604
7605function ensureListeningTo(rootContainerElement, registrationName) {
7606 var isDocumentOrFragment = rootContainerElement.nodeType === DOCUMENT_NODE || rootContainerElement.nodeType === DOCUMENT_FRAGMENT_NODE;
7607 var doc = isDocumentOrFragment ? rootContainerElement : rootContainerElement.ownerDocument;
7608 listenTo(registrationName, doc);
7609}
7610
7611function getOwnerDocumentFromRootContainer(rootContainerElement) {
7612 return rootContainerElement.nodeType === DOCUMENT_NODE ? rootContainerElement : rootContainerElement.ownerDocument;
7613}
7614
7615function noop() {}
7616
7617function trapClickOnNonInteractiveElement(node) {
7618 // Mobile Safari does not fire properly bubble click events on
7619 // non-interactive elements, which means delegated click listeners do not
7620 // fire. The workaround for this bug involves attaching an empty click
7621 // listener on the target node.
7622 // http://www.quirksmode.org/blog/archives/2010/09/click_event_del.html
7623 // Just set it using the onclick property so that we don't have to manage any
7624 // bookkeeping for it. Not sure if we need to clear it when the listener is
7625 // removed.
7626 // TODO: Only do this for the relevant Safaris maybe?
7627 node.onclick = noop;
7628}
7629
7630function setInitialDOMProperties(tag, domElement, rootContainerElement, nextProps, isCustomComponentTag) {
7631 for (var propKey in nextProps) {
7632 if (!nextProps.hasOwnProperty(propKey)) {
7633 continue;
7634 }
7635 var nextProp = nextProps[propKey];
7636 if (propKey === STYLE$1) {
7637 {
7638 if (nextProp) {
7639 // Freeze the next style object so that we can assume it won't be
7640 // mutated. We have already warned for this in the past.
7641 Object.freeze(nextProp);
7642 }
7643 }
7644 // Relies on `updateStylesByID` not mutating `styleUpdates`.
7645 setValueForStyles(domElement, nextProp);
7646 } else if (propKey === DANGEROUSLY_SET_INNER_HTML) {
7647 var nextHtml = nextProp ? nextProp[HTML] : undefined;
7648 if (nextHtml != null) {
7649 setInnerHTML(domElement, nextHtml);
7650 }
7651 } else if (propKey === CHILDREN) {
7652 if (typeof nextProp === 'string') {
7653 // Avoid setting initial textContent when the text is empty. In IE11 setting
7654 // textContent on a <textarea> will cause the placeholder to not
7655 // show within the <textarea> until it has been focused and blurred again.
7656 // https://github.com/facebook/react/issues/6731#issuecomment-254874553
7657 var canSetTextContent = tag !== 'textarea' || nextProp !== '';
7658 if (canSetTextContent) {
7659 setTextContent(domElement, nextProp);
7660 }
7661 } else if (typeof nextProp === 'number') {
7662 setTextContent(domElement, '' + nextProp);
7663 }
7664 } else if (propKey === SUPPRESS_CONTENT_EDITABLE_WARNING || propKey === SUPPRESS_HYDRATION_WARNING$1) {
7665 // Noop
7666 } else if (propKey === AUTOFOCUS) {
7667 // We polyfill it separately on the client during commit.
7668 // We could have excluded it in the property list instead of
7669 // adding a special case here, but then it wouldn't be emitted
7670 // on server rendering (but we *do* want to emit it in SSR).
7671 } else if (registrationNameModules.hasOwnProperty(propKey)) {
7672 if (nextProp != null) {
7673 if (true && typeof nextProp !== 'function') {
7674 warnForInvalidEventListener(propKey, nextProp);
7675 }
7676 ensureListeningTo(rootContainerElement, propKey);
7677 }
7678 } else if (nextProp != null) {
7679 setValueForProperty(domElement, propKey, nextProp, isCustomComponentTag);
7680 }
7681 }
7682}
7683
7684function updateDOMProperties(domElement, updatePayload, wasCustomComponentTag, isCustomComponentTag) {
7685 // TODO: Handle wasCustomComponentTag
7686 for (var i = 0; i < updatePayload.length; i += 2) {
7687 var propKey = updatePayload[i];
7688 var propValue = updatePayload[i + 1];
7689 if (propKey === STYLE$1) {
7690 setValueForStyles(domElement, propValue);
7691 } else if (propKey === DANGEROUSLY_SET_INNER_HTML) {
7692 setInnerHTML(domElement, propValue);
7693 } else if (propKey === CHILDREN) {
7694 setTextContent(domElement, propValue);
7695 } else {
7696 setValueForProperty(domElement, propKey, propValue, isCustomComponentTag);
7697 }
7698 }
7699}
7700
7701function createElement(type, props, rootContainerElement, parentNamespace) {
7702 var isCustomComponentTag = void 0;
7703
7704 // We create tags in the namespace of their parent container, except HTML
7705 // tags get no namespace.
7706 var ownerDocument = getOwnerDocumentFromRootContainer(rootContainerElement);
7707 var domElement = void 0;
7708 var namespaceURI = parentNamespace;
7709 if (namespaceURI === HTML_NAMESPACE) {
7710 namespaceURI = getIntrinsicNamespace(type);
7711 }
7712 if (namespaceURI === HTML_NAMESPACE) {
7713 {
7714 isCustomComponentTag = isCustomComponent(type, props);
7715 // Should this check be gated by parent namespace? Not sure we want to
7716 // allow <SVG> or <mATH>.
7717 !(isCustomComponentTag || type === type.toLowerCase()) ? warning$1(false, '<%s /> is using incorrect casing. ' + 'Use PascalCase for React components, ' + 'or lowercase for HTML elements.', type) : void 0;
7718 }
7719
7720 if (type === 'script') {
7721 // Create the script via .innerHTML so its "parser-inserted" flag is
7722 // set to true and it does not execute
7723 var div = ownerDocument.createElement('div');
7724 div.innerHTML = '<script><' + '/script>'; // eslint-disable-line
7725 // This is guaranteed to yield a script element.
7726 var firstChild = div.firstChild;
7727 domElement = div.removeChild(firstChild);
7728 } else if (typeof props.is === 'string') {
7729 // $FlowIssue `createElement` should be updated for Web Components
7730 domElement = ownerDocument.createElement(type, { is: props.is });
7731 } else {
7732 // Separate else branch instead of using `props.is || undefined` above because of a Firefox bug.
7733 // See discussion in https://github.com/facebook/react/pull/6896
7734 // and discussion in https://bugzilla.mozilla.org/show_bug.cgi?id=1276240
7735 domElement = ownerDocument.createElement(type);
7736 // Normally attributes are assigned in `setInitialDOMProperties`, however the `multiple`
7737 // attribute on `select`s needs to be added before `option`s are inserted. This prevents
7738 // a bug where the `select` does not scroll to the correct option because singular
7739 // `select` elements automatically pick the first item.
7740 // See https://github.com/facebook/react/issues/13222
7741 if (type === 'select' && props.multiple) {
7742 var node = domElement;
7743 node.multiple = true;
7744 }
7745 }
7746 } else {
7747 domElement = ownerDocument.createElementNS(namespaceURI, type);
7748 }
7749
7750 {
7751 if (namespaceURI === HTML_NAMESPACE) {
7752 if (!isCustomComponentTag && Object.prototype.toString.call(domElement) === '[object HTMLUnknownElement]' && !Object.prototype.hasOwnProperty.call(warnedUnknownTags, type)) {
7753 warnedUnknownTags[type] = true;
7754 warning$1(false, 'The tag <%s> is unrecognized in this browser. ' + 'If you meant to render a React component, start its name with ' + 'an uppercase letter.', type);
7755 }
7756 }
7757 }
7758
7759 return domElement;
7760}
7761
7762function createTextNode(text, rootContainerElement) {
7763 return getOwnerDocumentFromRootContainer(rootContainerElement).createTextNode(text);
7764}
7765
7766function setInitialProperties(domElement, tag, rawProps, rootContainerElement) {
7767 var isCustomComponentTag = isCustomComponent(tag, rawProps);
7768 {
7769 validatePropertiesInDevelopment(tag, rawProps);
7770 if (isCustomComponentTag && !didWarnShadyDOM && domElement.shadyRoot) {
7771 warning$1(false, '%s is using shady DOM. Using shady DOM with React can ' + 'cause things to break subtly.', getCurrentFiberOwnerNameInDevOrNull() || 'A component');
7772 didWarnShadyDOM = true;
7773 }
7774 }
7775
7776 // TODO: Make sure that we check isMounted before firing any of these events.
7777 var props = void 0;
7778 switch (tag) {
7779 case 'iframe':
7780 case 'object':
7781 trapBubbledEvent(TOP_LOAD, domElement);
7782 props = rawProps;
7783 break;
7784 case 'video':
7785 case 'audio':
7786 // Create listener for each media event
7787 for (var i = 0; i < mediaEventTypes.length; i++) {
7788 trapBubbledEvent(mediaEventTypes[i], domElement);
7789 }
7790 props = rawProps;
7791 break;
7792 case 'source':
7793 trapBubbledEvent(TOP_ERROR, domElement);
7794 props = rawProps;
7795 break;
7796 case 'img':
7797 case 'image':
7798 case 'link':
7799 trapBubbledEvent(TOP_ERROR, domElement);
7800 trapBubbledEvent(TOP_LOAD, domElement);
7801 props = rawProps;
7802 break;
7803 case 'form':
7804 trapBubbledEvent(TOP_RESET, domElement);
7805 trapBubbledEvent(TOP_SUBMIT, domElement);
7806 props = rawProps;
7807 break;
7808 case 'details':
7809 trapBubbledEvent(TOP_TOGGLE, domElement);
7810 props = rawProps;
7811 break;
7812 case 'input':
7813 initWrapperState(domElement, rawProps);
7814 props = getHostProps(domElement, rawProps);
7815 trapBubbledEvent(TOP_INVALID, domElement);
7816 // For controlled components we always need to ensure we're listening
7817 // to onChange. Even if there is no listener.
7818 ensureListeningTo(rootContainerElement, 'onChange');
7819 break;
7820 case 'option':
7821 validateProps(domElement, rawProps);
7822 props = getHostProps$1(domElement, rawProps);
7823 break;
7824 case 'select':
7825 initWrapperState$1(domElement, rawProps);
7826 props = getHostProps$2(domElement, rawProps);
7827 trapBubbledEvent(TOP_INVALID, domElement);
7828 // For controlled components we always need to ensure we're listening
7829 // to onChange. Even if there is no listener.
7830 ensureListeningTo(rootContainerElement, 'onChange');
7831 break;
7832 case 'textarea':
7833 initWrapperState$2(domElement, rawProps);
7834 props = getHostProps$3(domElement, rawProps);
7835 trapBubbledEvent(TOP_INVALID, domElement);
7836 // For controlled components we always need to ensure we're listening
7837 // to onChange. Even if there is no listener.
7838 ensureListeningTo(rootContainerElement, 'onChange');
7839 break;
7840 default:
7841 props = rawProps;
7842 }
7843
7844 assertValidProps(tag, props);
7845
7846 setInitialDOMProperties(tag, domElement, rootContainerElement, props, isCustomComponentTag);
7847
7848 switch (tag) {
7849 case 'input':
7850 // TODO: Make sure we check if this is still unmounted or do any clean
7851 // up necessary since we never stop tracking anymore.
7852 track(domElement);
7853 postMountWrapper(domElement, rawProps, false);
7854 break;
7855 case 'textarea':
7856 // TODO: Make sure we check if this is still unmounted or do any clean
7857 // up necessary since we never stop tracking anymore.
7858 track(domElement);
7859 postMountWrapper$3(domElement, rawProps);
7860 break;
7861 case 'option':
7862 postMountWrapper$1(domElement, rawProps);
7863 break;
7864 case 'select':
7865 postMountWrapper$2(domElement, rawProps);
7866 break;
7867 default:
7868 if (typeof props.onClick === 'function') {
7869 // TODO: This cast may not be sound for SVG, MathML or custom elements.
7870 trapClickOnNonInteractiveElement(domElement);
7871 }
7872 break;
7873 }
7874}
7875
7876// Calculate the diff between the two objects.
7877function diffProperties(domElement, tag, lastRawProps, nextRawProps, rootContainerElement) {
7878 {
7879 validatePropertiesInDevelopment(tag, nextRawProps);
7880 }
7881
7882 var updatePayload = null;
7883
7884 var lastProps = void 0;
7885 var nextProps = void 0;
7886 switch (tag) {
7887 case 'input':
7888 lastProps = getHostProps(domElement, lastRawProps);
7889 nextProps = getHostProps(domElement, nextRawProps);
7890 updatePayload = [];
7891 break;
7892 case 'option':
7893 lastProps = getHostProps$1(domElement, lastRawProps);
7894 nextProps = getHostProps$1(domElement, nextRawProps);
7895 updatePayload = [];
7896 break;
7897 case 'select':
7898 lastProps = getHostProps$2(domElement, lastRawProps);
7899 nextProps = getHostProps$2(domElement, nextRawProps);
7900 updatePayload = [];
7901 break;
7902 case 'textarea':
7903 lastProps = getHostProps$3(domElement, lastRawProps);
7904 nextProps = getHostProps$3(domElement, nextRawProps);
7905 updatePayload = [];
7906 break;
7907 default:
7908 lastProps = lastRawProps;
7909 nextProps = nextRawProps;
7910 if (typeof lastProps.onClick !== 'function' && typeof nextProps.onClick === 'function') {
7911 // TODO: This cast may not be sound for SVG, MathML or custom elements.
7912 trapClickOnNonInteractiveElement(domElement);
7913 }
7914 break;
7915 }
7916
7917 assertValidProps(tag, nextProps);
7918
7919 var propKey = void 0;
7920 var styleName = void 0;
7921 var styleUpdates = null;
7922 for (propKey in lastProps) {
7923 if (nextProps.hasOwnProperty(propKey) || !lastProps.hasOwnProperty(propKey) || lastProps[propKey] == null) {
7924 continue;
7925 }
7926 if (propKey === STYLE$1) {
7927 var lastStyle = lastProps[propKey];
7928 for (styleName in lastStyle) {
7929 if (lastStyle.hasOwnProperty(styleName)) {
7930 if (!styleUpdates) {
7931 styleUpdates = {};
7932 }
7933 styleUpdates[styleName] = '';
7934 }
7935 }
7936 } else if (propKey === DANGEROUSLY_SET_INNER_HTML || propKey === CHILDREN) {
7937 // Noop. This is handled by the clear text mechanism.
7938 } else if (propKey === SUPPRESS_CONTENT_EDITABLE_WARNING || propKey === SUPPRESS_HYDRATION_WARNING$1) {
7939 // Noop
7940 } else if (propKey === AUTOFOCUS) {
7941 // Noop. It doesn't work on updates anyway.
7942 } else if (registrationNameModules.hasOwnProperty(propKey)) {
7943 // This is a special case. If any listener updates we need to ensure
7944 // that the "current" fiber pointer gets updated so we need a commit
7945 // to update this element.
7946 if (!updatePayload) {
7947 updatePayload = [];
7948 }
7949 } else {
7950 // For all other deleted properties we add it to the queue. We use
7951 // the whitelist in the commit phase instead.
7952 (updatePayload = updatePayload || []).push(propKey, null);
7953 }
7954 }
7955 for (propKey in nextProps) {
7956 var nextProp = nextProps[propKey];
7957 var lastProp = lastProps != null ? lastProps[propKey] : undefined;
7958 if (!nextProps.hasOwnProperty(propKey) || nextProp === lastProp || nextProp == null && lastProp == null) {
7959 continue;
7960 }
7961 if (propKey === STYLE$1) {
7962 {
7963 if (nextProp) {
7964 // Freeze the next style object so that we can assume it won't be
7965 // mutated. We have already warned for this in the past.
7966 Object.freeze(nextProp);
7967 }
7968 }
7969 if (lastProp) {
7970 // Unset styles on `lastProp` but not on `nextProp`.
7971 for (styleName in lastProp) {
7972 if (lastProp.hasOwnProperty(styleName) && (!nextProp || !nextProp.hasOwnProperty(styleName))) {
7973 if (!styleUpdates) {
7974 styleUpdates = {};
7975 }
7976 styleUpdates[styleName] = '';
7977 }
7978 }
7979 // Update styles that changed since `lastProp`.
7980 for (styleName in nextProp) {
7981 if (nextProp.hasOwnProperty(styleName) && lastProp[styleName] !== nextProp[styleName]) {
7982 if (!styleUpdates) {
7983 styleUpdates = {};
7984 }
7985 styleUpdates[styleName] = nextProp[styleName];
7986 }
7987 }
7988 } else {
7989 // Relies on `updateStylesByID` not mutating `styleUpdates`.
7990 if (!styleUpdates) {
7991 if (!updatePayload) {
7992 updatePayload = [];
7993 }
7994 updatePayload.push(propKey, styleUpdates);
7995 }
7996 styleUpdates = nextProp;
7997 }
7998 } else if (propKey === DANGEROUSLY_SET_INNER_HTML) {
7999 var nextHtml = nextProp ? nextProp[HTML] : undefined;
8000 var lastHtml = lastProp ? lastProp[HTML] : undefined;
8001 if (nextHtml != null) {
8002 if (lastHtml !== nextHtml) {
8003 (updatePayload = updatePayload || []).push(propKey, '' + nextHtml);
8004 }
8005 } else {
8006 // TODO: It might be too late to clear this if we have children
8007 // inserted already.
8008 }
8009 } else if (propKey === CHILDREN) {
8010 if (lastProp !== nextProp && (typeof nextProp === 'string' || typeof nextProp === 'number')) {
8011 (updatePayload = updatePayload || []).push(propKey, '' + nextProp);
8012 }
8013 } else if (propKey === SUPPRESS_CONTENT_EDITABLE_WARNING || propKey === SUPPRESS_HYDRATION_WARNING$1) {
8014 // Noop
8015 } else if (registrationNameModules.hasOwnProperty(propKey)) {
8016 if (nextProp != null) {
8017 // We eagerly listen to this even though we haven't committed yet.
8018 if (true && typeof nextProp !== 'function') {
8019 warnForInvalidEventListener(propKey, nextProp);
8020 }
8021 ensureListeningTo(rootContainerElement, propKey);
8022 }
8023 if (!updatePayload && lastProp !== nextProp) {
8024 // This is a special case. If any listener updates we need to ensure
8025 // that the "current" props pointer gets updated so we need a commit
8026 // to update this element.
8027 updatePayload = [];
8028 }
8029 } else {
8030 // For any other property we always add it to the queue and then we
8031 // filter it out using the whitelist during the commit.
8032 (updatePayload = updatePayload || []).push(propKey, nextProp);
8033 }
8034 }
8035 if (styleUpdates) {
8036 {
8037 validateShorthandPropertyCollisionInDev(styleUpdates, nextProps[STYLE$1]);
8038 }
8039 (updatePayload = updatePayload || []).push(STYLE$1, styleUpdates);
8040 }
8041 return updatePayload;
8042}
8043
8044// Apply the diff.
8045function updateProperties(domElement, updatePayload, tag, lastRawProps, nextRawProps) {
8046 // Update checked *before* name.
8047 // In the middle of an update, it is possible to have multiple checked.
8048 // When a checked radio tries to change name, browser makes another radio's checked false.
8049 if (tag === 'input' && nextRawProps.type === 'radio' && nextRawProps.name != null) {
8050 updateChecked(domElement, nextRawProps);
8051 }
8052
8053 var wasCustomComponentTag = isCustomComponent(tag, lastRawProps);
8054 var isCustomComponentTag = isCustomComponent(tag, nextRawProps);
8055 // Apply the diff.
8056 updateDOMProperties(domElement, updatePayload, wasCustomComponentTag, isCustomComponentTag);
8057
8058 // TODO: Ensure that an update gets scheduled if any of the special props
8059 // changed.
8060 switch (tag) {
8061 case 'input':
8062 // Update the wrapper around inputs *after* updating props. This has to
8063 // happen after `updateDOMProperties`. Otherwise HTML5 input validations
8064 // raise warnings and prevent the new value from being assigned.
8065 updateWrapper(domElement, nextRawProps);
8066 break;
8067 case 'textarea':
8068 updateWrapper$1(domElement, nextRawProps);
8069 break;
8070 case 'select':
8071 // <select> value update needs to occur after <option> children
8072 // reconciliation
8073 postUpdateWrapper(domElement, nextRawProps);
8074 break;
8075 }
8076}
8077
8078function getPossibleStandardName(propName) {
8079 {
8080 var lowerCasedName = propName.toLowerCase();
8081 if (!possibleStandardNames.hasOwnProperty(lowerCasedName)) {
8082 return null;
8083 }
8084 return possibleStandardNames[lowerCasedName] || null;
8085 }
8086 return null;
8087}
8088
8089function diffHydratedProperties(domElement, tag, rawProps, parentNamespace, rootContainerElement) {
8090 var isCustomComponentTag = void 0;
8091 var extraAttributeNames = void 0;
8092
8093 {
8094 suppressHydrationWarning = rawProps[SUPPRESS_HYDRATION_WARNING$1] === true;
8095 isCustomComponentTag = isCustomComponent(tag, rawProps);
8096 validatePropertiesInDevelopment(tag, rawProps);
8097 if (isCustomComponentTag && !didWarnShadyDOM && domElement.shadyRoot) {
8098 warning$1(false, '%s is using shady DOM. Using shady DOM with React can ' + 'cause things to break subtly.', getCurrentFiberOwnerNameInDevOrNull() || 'A component');
8099 didWarnShadyDOM = true;
8100 }
8101 }
8102
8103 // TODO: Make sure that we check isMounted before firing any of these events.
8104 switch (tag) {
8105 case 'iframe':
8106 case 'object':
8107 trapBubbledEvent(TOP_LOAD, domElement);
8108 break;
8109 case 'video':
8110 case 'audio':
8111 // Create listener for each media event
8112 for (var i = 0; i < mediaEventTypes.length; i++) {
8113 trapBubbledEvent(mediaEventTypes[i], domElement);
8114 }
8115 break;
8116 case 'source':
8117 trapBubbledEvent(TOP_ERROR, domElement);
8118 break;
8119 case 'img':
8120 case 'image':
8121 case 'link':
8122 trapBubbledEvent(TOP_ERROR, domElement);
8123 trapBubbledEvent(TOP_LOAD, domElement);
8124 break;
8125 case 'form':
8126 trapBubbledEvent(TOP_RESET, domElement);
8127 trapBubbledEvent(TOP_SUBMIT, domElement);
8128 break;
8129 case 'details':
8130 trapBubbledEvent(TOP_TOGGLE, domElement);
8131 break;
8132 case 'input':
8133 initWrapperState(domElement, rawProps);
8134 trapBubbledEvent(TOP_INVALID, domElement);
8135 // For controlled components we always need to ensure we're listening
8136 // to onChange. Even if there is no listener.
8137 ensureListeningTo(rootContainerElement, 'onChange');
8138 break;
8139 case 'option':
8140 validateProps(domElement, rawProps);
8141 break;
8142 case 'select':
8143 initWrapperState$1(domElement, rawProps);
8144 trapBubbledEvent(TOP_INVALID, domElement);
8145 // For controlled components we always need to ensure we're listening
8146 // to onChange. Even if there is no listener.
8147 ensureListeningTo(rootContainerElement, 'onChange');
8148 break;
8149 case 'textarea':
8150 initWrapperState$2(domElement, rawProps);
8151 trapBubbledEvent(TOP_INVALID, domElement);
8152 // For controlled components we always need to ensure we're listening
8153 // to onChange. Even if there is no listener.
8154 ensureListeningTo(rootContainerElement, 'onChange');
8155 break;
8156 }
8157
8158 assertValidProps(tag, rawProps);
8159
8160 {
8161 extraAttributeNames = new Set();
8162 var attributes = domElement.attributes;
8163 for (var _i = 0; _i < attributes.length; _i++) {
8164 var name = attributes[_i].name.toLowerCase();
8165 switch (name) {
8166 // Built-in SSR attribute is whitelisted
8167 case 'data-reactroot':
8168 break;
8169 // Controlled attributes are not validated
8170 // TODO: Only ignore them on controlled tags.
8171 case 'value':
8172 break;
8173 case 'checked':
8174 break;
8175 case 'selected':
8176 break;
8177 default:
8178 // Intentionally use the original name.
8179 // See discussion in https://github.com/facebook/react/pull/10676.
8180 extraAttributeNames.add(attributes[_i].name);
8181 }
8182 }
8183 }
8184
8185 var updatePayload = null;
8186 for (var propKey in rawProps) {
8187 if (!rawProps.hasOwnProperty(propKey)) {
8188 continue;
8189 }
8190 var nextProp = rawProps[propKey];
8191 if (propKey === CHILDREN) {
8192 // For text content children we compare against textContent. This
8193 // might match additional HTML that is hidden when we read it using
8194 // textContent. E.g. "foo" will match "f<span>oo</span>" but that still
8195 // satisfies our requirement. Our requirement is not to produce perfect
8196 // HTML and attributes. Ideally we should preserve structure but it's
8197 // ok not to if the visible content is still enough to indicate what
8198 // even listeners these nodes might be wired up to.
8199 // TODO: Warn if there is more than a single textNode as a child.
8200 // TODO: Should we use domElement.firstChild.nodeValue to compare?
8201 if (typeof nextProp === 'string') {
8202 if (domElement.textContent !== nextProp) {
8203 if (true && !suppressHydrationWarning) {
8204 warnForTextDifference(domElement.textContent, nextProp);
8205 }
8206 updatePayload = [CHILDREN, nextProp];
8207 }
8208 } else if (typeof nextProp === 'number') {
8209 if (domElement.textContent !== '' + nextProp) {
8210 if (true && !suppressHydrationWarning) {
8211 warnForTextDifference(domElement.textContent, nextProp);
8212 }
8213 updatePayload = [CHILDREN, '' + nextProp];
8214 }
8215 }
8216 } else if (registrationNameModules.hasOwnProperty(propKey)) {
8217 if (nextProp != null) {
8218 if (true && typeof nextProp !== 'function') {
8219 warnForInvalidEventListener(propKey, nextProp);
8220 }
8221 ensureListeningTo(rootContainerElement, propKey);
8222 }
8223 } else if (true &&
8224 // Convince Flow we've calculated it (it's DEV-only in this method.)
8225 typeof isCustomComponentTag === 'boolean') {
8226 // Validate that the properties correspond to their expected values.
8227 var serverValue = void 0;
8228 var propertyInfo = getPropertyInfo(propKey);
8229 if (suppressHydrationWarning) {
8230 // Don't bother comparing. We're ignoring all these warnings.
8231 } else if (propKey === SUPPRESS_CONTENT_EDITABLE_WARNING || propKey === SUPPRESS_HYDRATION_WARNING$1 ||
8232 // Controlled attributes are not validated
8233 // TODO: Only ignore them on controlled tags.
8234 propKey === 'value' || propKey === 'checked' || propKey === 'selected') {
8235 // Noop
8236 } else if (propKey === DANGEROUSLY_SET_INNER_HTML) {
8237 var serverHTML = domElement.innerHTML;
8238 var nextHtml = nextProp ? nextProp[HTML] : undefined;
8239 var expectedHTML = normalizeHTML(domElement, nextHtml != null ? nextHtml : '');
8240 if (expectedHTML !== serverHTML) {
8241 warnForPropDifference(propKey, serverHTML, expectedHTML);
8242 }
8243 } else if (propKey === STYLE$1) {
8244 // $FlowFixMe - Should be inferred as not undefined.
8245 extraAttributeNames.delete(propKey);
8246
8247 if (canDiffStyleForHydrationWarning) {
8248 var expectedStyle = createDangerousStringForStyles(nextProp);
8249 serverValue = domElement.getAttribute('style');
8250 if (expectedStyle !== serverValue) {
8251 warnForPropDifference(propKey, serverValue, expectedStyle);
8252 }
8253 }
8254 } else if (isCustomComponentTag) {
8255 // $FlowFixMe - Should be inferred as not undefined.
8256 extraAttributeNames.delete(propKey.toLowerCase());
8257 serverValue = getValueForAttribute(domElement, propKey, nextProp);
8258
8259 if (nextProp !== serverValue) {
8260 warnForPropDifference(propKey, serverValue, nextProp);
8261 }
8262 } else if (!shouldIgnoreAttribute(propKey, propertyInfo, isCustomComponentTag) && !shouldRemoveAttribute(propKey, nextProp, propertyInfo, isCustomComponentTag)) {
8263 var isMismatchDueToBadCasing = false;
8264 if (propertyInfo !== null) {
8265 // $FlowFixMe - Should be inferred as not undefined.
8266 extraAttributeNames.delete(propertyInfo.attributeName);
8267 serverValue = getValueForProperty(domElement, propKey, nextProp, propertyInfo);
8268 } else {
8269 var ownNamespace = parentNamespace;
8270 if (ownNamespace === HTML_NAMESPACE) {
8271 ownNamespace = getIntrinsicNamespace(tag);
8272 }
8273 if (ownNamespace === HTML_NAMESPACE) {
8274 // $FlowFixMe - Should be inferred as not undefined.
8275 extraAttributeNames.delete(propKey.toLowerCase());
8276 } else {
8277 var standardName = getPossibleStandardName(propKey);
8278 if (standardName !== null && standardName !== propKey) {
8279 // If an SVG prop is supplied with bad casing, it will
8280 // be successfully parsed from HTML, but will produce a mismatch
8281 // (and would be incorrectly rendered on the client).
8282 // However, we already warn about bad casing elsewhere.
8283 // So we'll skip the misleading extra mismatch warning in this case.
8284 isMismatchDueToBadCasing = true;
8285 // $FlowFixMe - Should be inferred as not undefined.
8286 extraAttributeNames.delete(standardName);
8287 }
8288 // $FlowFixMe - Should be inferred as not undefined.
8289 extraAttributeNames.delete(propKey);
8290 }
8291 serverValue = getValueForAttribute(domElement, propKey, nextProp);
8292 }
8293
8294 if (nextProp !== serverValue && !isMismatchDueToBadCasing) {
8295 warnForPropDifference(propKey, serverValue, nextProp);
8296 }
8297 }
8298 }
8299 }
8300
8301 {
8302 // $FlowFixMe - Should be inferred as not undefined.
8303 if (extraAttributeNames.size > 0 && !suppressHydrationWarning) {
8304 // $FlowFixMe - Should be inferred as not undefined.
8305 warnForExtraAttributes(extraAttributeNames);
8306 }
8307 }
8308
8309 switch (tag) {
8310 case 'input':
8311 // TODO: Make sure we check if this is still unmounted or do any clean
8312 // up necessary since we never stop tracking anymore.
8313 track(domElement);
8314 postMountWrapper(domElement, rawProps, true);
8315 break;
8316 case 'textarea':
8317 // TODO: Make sure we check if this is still unmounted or do any clean
8318 // up necessary since we never stop tracking anymore.
8319 track(domElement);
8320 postMountWrapper$3(domElement, rawProps);
8321 break;
8322 case 'select':
8323 case 'option':
8324 // For input and textarea we current always set the value property at
8325 // post mount to force it to diverge from attributes. However, for
8326 // option and select we don't quite do the same thing and select
8327 // is not resilient to the DOM state changing so we don't do that here.
8328 // TODO: Consider not doing this for input and textarea.
8329 break;
8330 default:
8331 if (typeof rawProps.onClick === 'function') {
8332 // TODO: This cast may not be sound for SVG, MathML or custom elements.
8333 trapClickOnNonInteractiveElement(domElement);
8334 }
8335 break;
8336 }
8337
8338 return updatePayload;
8339}
8340
8341function diffHydratedText(textNode, text) {
8342 var isDifferent = textNode.nodeValue !== text;
8343 return isDifferent;
8344}
8345
8346function warnForUnmatchedText(textNode, text) {
8347 {
8348 warnForTextDifference(textNode.nodeValue, text);
8349 }
8350}
8351
8352function warnForDeletedHydratableElement(parentNode, child) {
8353 {
8354 if (didWarnInvalidHydration) {
8355 return;
8356 }
8357 didWarnInvalidHydration = true;
8358 warningWithoutStack$1(false, 'Did not expect server HTML to contain a <%s> in <%s>.', child.nodeName.toLowerCase(), parentNode.nodeName.toLowerCase());
8359 }
8360}
8361
8362function warnForDeletedHydratableText(parentNode, child) {
8363 {
8364 if (didWarnInvalidHydration) {
8365 return;
8366 }
8367 didWarnInvalidHydration = true;
8368 warningWithoutStack$1(false, 'Did not expect server HTML to contain the text node "%s" in <%s>.', child.nodeValue, parentNode.nodeName.toLowerCase());
8369 }
8370}
8371
8372function warnForInsertedHydratedElement(parentNode, tag, props) {
8373 {
8374 if (didWarnInvalidHydration) {
8375 return;
8376 }
8377 didWarnInvalidHydration = true;
8378 warningWithoutStack$1(false, 'Expected server HTML to contain a matching <%s> in <%s>.', tag, parentNode.nodeName.toLowerCase());
8379 }
8380}
8381
8382function warnForInsertedHydratedText(parentNode, text) {
8383 {
8384 if (text === '') {
8385 // We expect to insert empty text nodes since they're not represented in
8386 // the HTML.
8387 // TODO: Remove this special case if we can just avoid inserting empty
8388 // text nodes.
8389 return;
8390 }
8391 if (didWarnInvalidHydration) {
8392 return;
8393 }
8394 didWarnInvalidHydration = true;
8395 warningWithoutStack$1(false, 'Expected server HTML to contain a matching text node for "%s" in <%s>.', text, parentNode.nodeName.toLowerCase());
8396 }
8397}
8398
8399function restoreControlledState$1(domElement, tag, props) {
8400 switch (tag) {
8401 case 'input':
8402 restoreControlledState(domElement, props);
8403 return;
8404 case 'textarea':
8405 restoreControlledState$3(domElement, props);
8406 return;
8407 case 'select':
8408 restoreControlledState$2(domElement, props);
8409 return;
8410 }
8411}
8412
8413// TODO: direct imports like some-package/src/* are bad. Fix me.
8414var validateDOMNesting = function () {};
8415var updatedAncestorInfo = function () {};
8416
8417{
8418 // This validation code was written based on the HTML5 parsing spec:
8419 // https://html.spec.whatwg.org/multipage/syntax.html#has-an-element-in-scope
8420 //
8421 // Note: this does not catch all invalid nesting, nor does it try to (as it's
8422 // not clear what practical benefit doing so provides); instead, we warn only
8423 // for cases where the parser will give a parse tree differing from what React
8424 // intended. For example, <b><div></div></b> is invalid but we don't warn
8425 // because it still parses correctly; we do warn for other cases like nested
8426 // <p> tags where the beginning of the second element implicitly closes the
8427 // first, causing a confusing mess.
8428
8429 // https://html.spec.whatwg.org/multipage/syntax.html#special
8430 var specialTags = ['address', 'applet', 'area', 'article', 'aside', 'base', 'basefont', 'bgsound', 'blockquote', 'body', 'br', 'button', 'caption', 'center', 'col', 'colgroup', 'dd', 'details', 'dir', 'div', 'dl', 'dt', 'embed', 'fieldset', 'figcaption', 'figure', 'footer', 'form', 'frame', 'frameset', 'h1', 'h2', 'h3', 'h4', 'h5', 'h6', 'head', 'header', 'hgroup', 'hr', 'html', 'iframe', 'img', 'input', 'isindex', 'li', 'link', 'listing', 'main', 'marquee', 'menu', 'menuitem', 'meta', 'nav', 'noembed', 'noframes', 'noscript', 'object', 'ol', 'p', 'param', 'plaintext', 'pre', 'script', 'section', 'select', 'source', 'style', 'summary', 'table', 'tbody', 'td', 'template', 'textarea', 'tfoot', 'th', 'thead', 'title', 'tr', 'track', 'ul', 'wbr', 'xmp'];
8431
8432 // https://html.spec.whatwg.org/multipage/syntax.html#has-an-element-in-scope
8433 var inScopeTags = ['applet', 'caption', 'html', 'table', 'td', 'th', 'marquee', 'object', 'template',
8434
8435 // https://html.spec.whatwg.org/multipage/syntax.html#html-integration-point
8436 // TODO: Distinguish by namespace here -- for <title>, including it here
8437 // errs on the side of fewer warnings
8438 'foreignObject', 'desc', 'title'];
8439
8440 // https://html.spec.whatwg.org/multipage/syntax.html#has-an-element-in-button-scope
8441 var buttonScopeTags = inScopeTags.concat(['button']);
8442
8443 // https://html.spec.whatwg.org/multipage/syntax.html#generate-implied-end-tags
8444 var impliedEndTags = ['dd', 'dt', 'li', 'option', 'optgroup', 'p', 'rp', 'rt'];
8445
8446 var emptyAncestorInfo = {
8447 current: null,
8448
8449 formTag: null,
8450 aTagInScope: null,
8451 buttonTagInScope: null,
8452 nobrTagInScope: null,
8453 pTagInButtonScope: null,
8454
8455 listItemTagAutoclosing: null,
8456 dlItemTagAutoclosing: null
8457 };
8458
8459 updatedAncestorInfo = function (oldInfo, tag) {
8460 var ancestorInfo = _assign({}, oldInfo || emptyAncestorInfo);
8461 var info = { tag: tag };
8462
8463 if (inScopeTags.indexOf(tag) !== -1) {
8464 ancestorInfo.aTagInScope = null;
8465 ancestorInfo.buttonTagInScope = null;
8466 ancestorInfo.nobrTagInScope = null;
8467 }
8468 if (buttonScopeTags.indexOf(tag) !== -1) {
8469 ancestorInfo.pTagInButtonScope = null;
8470 }
8471
8472 // See rules for 'li', 'dd', 'dt' start tags in
8473 // https://html.spec.whatwg.org/multipage/syntax.html#parsing-main-inbody
8474 if (specialTags.indexOf(tag) !== -1 && tag !== 'address' && tag !== 'div' && tag !== 'p') {
8475 ancestorInfo.listItemTagAutoclosing = null;
8476 ancestorInfo.dlItemTagAutoclosing = null;
8477 }
8478
8479 ancestorInfo.current = info;
8480
8481 if (tag === 'form') {
8482 ancestorInfo.formTag = info;
8483 }
8484 if (tag === 'a') {
8485 ancestorInfo.aTagInScope = info;
8486 }
8487 if (tag === 'button') {
8488 ancestorInfo.buttonTagInScope = info;
8489 }
8490 if (tag === 'nobr') {
8491 ancestorInfo.nobrTagInScope = info;
8492 }
8493 if (tag === 'p') {
8494 ancestorInfo.pTagInButtonScope = info;
8495 }
8496 if (tag === 'li') {
8497 ancestorInfo.listItemTagAutoclosing = info;
8498 }
8499 if (tag === 'dd' || tag === 'dt') {
8500 ancestorInfo.dlItemTagAutoclosing = info;
8501 }
8502
8503 return ancestorInfo;
8504 };
8505
8506 /**
8507 * Returns whether
8508 */
8509 var isTagValidWithParent = function (tag, parentTag) {
8510 // First, let's check if we're in an unusual parsing mode...
8511 switch (parentTag) {
8512 // https://html.spec.whatwg.org/multipage/syntax.html#parsing-main-inselect
8513 case 'select':
8514 return tag === 'option' || tag === 'optgroup' || tag === '#text';
8515 case 'optgroup':
8516 return tag === 'option' || tag === '#text';
8517 // Strictly speaking, seeing an <option> doesn't mean we're in a <select>
8518 // but
8519 case 'option':
8520 return tag === '#text';
8521 // https://html.spec.whatwg.org/multipage/syntax.html#parsing-main-intd
8522 // https://html.spec.whatwg.org/multipage/syntax.html#parsing-main-incaption
8523 // No special behavior since these rules fall back to "in body" mode for
8524 // all except special table nodes which cause bad parsing behavior anyway.
8525
8526 // https://html.spec.whatwg.org/multipage/syntax.html#parsing-main-intr
8527 case 'tr':
8528 return tag === 'th' || tag === 'td' || tag === 'style' || tag === 'script' || tag === 'template';
8529 // https://html.spec.whatwg.org/multipage/syntax.html#parsing-main-intbody
8530 case 'tbody':
8531 case 'thead':
8532 case 'tfoot':
8533 return tag === 'tr' || tag === 'style' || tag === 'script' || tag === 'template';
8534 // https://html.spec.whatwg.org/multipage/syntax.html#parsing-main-incolgroup
8535 case 'colgroup':
8536 return tag === 'col' || tag === 'template';
8537 // https://html.spec.whatwg.org/multipage/syntax.html#parsing-main-intable
8538 case 'table':
8539 return tag === 'caption' || tag === 'colgroup' || tag === 'tbody' || tag === 'tfoot' || tag === 'thead' || tag === 'style' || tag === 'script' || tag === 'template';
8540 // https://html.spec.whatwg.org/multipage/syntax.html#parsing-main-inhead
8541 case 'head':
8542 return tag === 'base' || tag === 'basefont' || tag === 'bgsound' || tag === 'link' || tag === 'meta' || tag === 'title' || tag === 'noscript' || tag === 'noframes' || tag === 'style' || tag === 'script' || tag === 'template';
8543 // https://html.spec.whatwg.org/multipage/semantics.html#the-html-element
8544 case 'html':
8545 return tag === 'head' || tag === 'body';
8546 case '#document':
8547 return tag === 'html';
8548 }
8549
8550 // Probably in the "in body" parsing mode, so we outlaw only tag combos
8551 // where the parsing rules cause implicit opens or closes to be added.
8552 // https://html.spec.whatwg.org/multipage/syntax.html#parsing-main-inbody
8553 switch (tag) {
8554 case 'h1':
8555 case 'h2':
8556 case 'h3':
8557 case 'h4':
8558 case 'h5':
8559 case 'h6':
8560 return parentTag !== 'h1' && parentTag !== 'h2' && parentTag !== 'h3' && parentTag !== 'h4' && parentTag !== 'h5' && parentTag !== 'h6';
8561
8562 case 'rp':
8563 case 'rt':
8564 return impliedEndTags.indexOf(parentTag) === -1;
8565
8566 case 'body':
8567 case 'caption':
8568 case 'col':
8569 case 'colgroup':
8570 case 'frame':
8571 case 'head':
8572 case 'html':
8573 case 'tbody':
8574 case 'td':
8575 case 'tfoot':
8576 case 'th':
8577 case 'thead':
8578 case 'tr':
8579 // These tags are only valid with a few parents that have special child
8580 // parsing rules -- if we're down here, then none of those matched and
8581 // so we allow it only if we don't know what the parent is, as all other
8582 // cases are invalid.
8583 return parentTag == null;
8584 }
8585
8586 return true;
8587 };
8588
8589 /**
8590 * Returns whether
8591 */
8592 var findInvalidAncestorForTag = function (tag, ancestorInfo) {
8593 switch (tag) {
8594 case 'address':
8595 case 'article':
8596 case 'aside':
8597 case 'blockquote':
8598 case 'center':
8599 case 'details':
8600 case 'dialog':
8601 case 'dir':
8602 case 'div':
8603 case 'dl':
8604 case 'fieldset':
8605 case 'figcaption':
8606 case 'figure':
8607 case 'footer':
8608 case 'header':
8609 case 'hgroup':
8610 case 'main':
8611 case 'menu':
8612 case 'nav':
8613 case 'ol':
8614 case 'p':
8615 case 'section':
8616 case 'summary':
8617 case 'ul':
8618 case 'pre':
8619 case 'listing':
8620 case 'table':
8621 case 'hr':
8622 case 'xmp':
8623 case 'h1':
8624 case 'h2':
8625 case 'h3':
8626 case 'h4':
8627 case 'h5':
8628 case 'h6':
8629 return ancestorInfo.pTagInButtonScope;
8630
8631 case 'form':
8632 return ancestorInfo.formTag || ancestorInfo.pTagInButtonScope;
8633
8634 case 'li':
8635 return ancestorInfo.listItemTagAutoclosing;
8636
8637 case 'dd':
8638 case 'dt':
8639 return ancestorInfo.dlItemTagAutoclosing;
8640
8641 case 'button':
8642 return ancestorInfo.buttonTagInScope;
8643
8644 case 'a':
8645 // Spec says something about storing a list of markers, but it sounds
8646 // equivalent to this check.
8647 return ancestorInfo.aTagInScope;
8648
8649 case 'nobr':
8650 return ancestorInfo.nobrTagInScope;
8651 }
8652
8653 return null;
8654 };
8655
8656 var didWarn = {};
8657
8658 validateDOMNesting = function (childTag, childText, ancestorInfo) {
8659 ancestorInfo = ancestorInfo || emptyAncestorInfo;
8660 var parentInfo = ancestorInfo.current;
8661 var parentTag = parentInfo && parentInfo.tag;
8662
8663 if (childText != null) {
8664 !(childTag == null) ? warningWithoutStack$1(false, 'validateDOMNesting: when childText is passed, childTag should be null') : void 0;
8665 childTag = '#text';
8666 }
8667
8668 var invalidParent = isTagValidWithParent(childTag, parentTag) ? null : parentInfo;
8669 var invalidAncestor = invalidParent ? null : findInvalidAncestorForTag(childTag, ancestorInfo);
8670 var invalidParentOrAncestor = invalidParent || invalidAncestor;
8671 if (!invalidParentOrAncestor) {
8672 return;
8673 }
8674
8675 var ancestorTag = invalidParentOrAncestor.tag;
8676 var addendum = getCurrentFiberStackInDev();
8677
8678 var warnKey = !!invalidParent + '|' + childTag + '|' + ancestorTag + '|' + addendum;
8679 if (didWarn[warnKey]) {
8680 return;
8681 }
8682 didWarn[warnKey] = true;
8683
8684 var tagDisplayName = childTag;
8685 var whitespaceInfo = '';
8686 if (childTag === '#text') {
8687 if (/\S/.test(childText)) {
8688 tagDisplayName = 'Text nodes';
8689 } else {
8690 tagDisplayName = 'Whitespace text nodes';
8691 whitespaceInfo = " Make sure you don't have any extra whitespace between tags on " + 'each line of your source code.';
8692 }
8693 } else {
8694 tagDisplayName = '<' + childTag + '>';
8695 }
8696
8697 if (invalidParent) {
8698 var info = '';
8699 if (ancestorTag === 'table' && childTag === 'tr') {
8700 info += ' Add a <tbody> to your code to match the DOM tree generated by ' + 'the browser.';
8701 }
8702 warningWithoutStack$1(false, 'validateDOMNesting(...): %s cannot appear as a child of <%s>.%s%s%s', tagDisplayName, ancestorTag, whitespaceInfo, info, addendum);
8703 } else {
8704 warningWithoutStack$1(false, 'validateDOMNesting(...): %s cannot appear as a descendant of ' + '<%s>.%s', tagDisplayName, ancestorTag, addendum);
8705 }
8706 };
8707}
8708
8709var ReactInternals$1 = React.__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED;
8710
8711var _ReactInternals$Sched = ReactInternals$1.Scheduler;
8712var unstable_cancelCallback = _ReactInternals$Sched.unstable_cancelCallback;
8713var unstable_now = _ReactInternals$Sched.unstable_now;
8714var unstable_scheduleCallback = _ReactInternals$Sched.unstable_scheduleCallback;
8715var unstable_shouldYield = _ReactInternals$Sched.unstable_shouldYield;
8716var unstable_getFirstCallbackNode = _ReactInternals$Sched.unstable_getFirstCallbackNode;
8717var unstable_runWithPriority = _ReactInternals$Sched.unstable_runWithPriority;
8718var unstable_next = _ReactInternals$Sched.unstable_next;
8719var unstable_continueExecution = _ReactInternals$Sched.unstable_continueExecution;
8720var unstable_pauseExecution = _ReactInternals$Sched.unstable_pauseExecution;
8721var unstable_getCurrentPriorityLevel = _ReactInternals$Sched.unstable_getCurrentPriorityLevel;
8722var unstable_ImmediatePriority = _ReactInternals$Sched.unstable_ImmediatePriority;
8723var unstable_UserBlockingPriority = _ReactInternals$Sched.unstable_UserBlockingPriority;
8724var unstable_NormalPriority = _ReactInternals$Sched.unstable_NormalPriority;
8725var unstable_LowPriority = _ReactInternals$Sched.unstable_LowPriority;
8726var unstable_IdlePriority = _ReactInternals$Sched.unstable_IdlePriority;
8727
8728// Renderers that don't support persistence
8729// can re-export everything from this module.
8730
8731function shim() {
8732 invariant(false, 'The current renderer does not support persistence. This error is likely caused by a bug in React. Please file an issue.');
8733}
8734
8735// Persistence (when unsupported)
8736var supportsPersistence = false;
8737var cloneInstance = shim;
8738var createContainerChildSet = shim;
8739var appendChildToContainerChildSet = shim;
8740var finalizeContainerChildren = shim;
8741var replaceContainerChildren = shim;
8742var cloneHiddenInstance = shim;
8743var cloneUnhiddenInstance = shim;
8744var createHiddenTextInstance = shim;
8745
8746var SUPPRESS_HYDRATION_WARNING = void 0;
8747{
8748 SUPPRESS_HYDRATION_WARNING = 'suppressHydrationWarning';
8749}
8750
8751var SUSPENSE_START_DATA = '$';
8752var SUSPENSE_END_DATA = '/$';
8753
8754var STYLE = 'style';
8755
8756var eventsEnabled = null;
8757var selectionInformation = null;
8758
8759function shouldAutoFocusHostComponent(type, props) {
8760 switch (type) {
8761 case 'button':
8762 case 'input':
8763 case 'select':
8764 case 'textarea':
8765 return !!props.autoFocus;
8766 }
8767 return false;
8768}
8769
8770function getRootHostContext(rootContainerInstance) {
8771 var type = void 0;
8772 var namespace = void 0;
8773 var nodeType = rootContainerInstance.nodeType;
8774 switch (nodeType) {
8775 case DOCUMENT_NODE:
8776 case DOCUMENT_FRAGMENT_NODE:
8777 {
8778 type = nodeType === DOCUMENT_NODE ? '#document' : '#fragment';
8779 var root = rootContainerInstance.documentElement;
8780 namespace = root ? root.namespaceURI : getChildNamespace(null, '');
8781 break;
8782 }
8783 default:
8784 {
8785 var container = nodeType === COMMENT_NODE ? rootContainerInstance.parentNode : rootContainerInstance;
8786 var ownNamespace = container.namespaceURI || null;
8787 type = container.tagName;
8788 namespace = getChildNamespace(ownNamespace, type);
8789 break;
8790 }
8791 }
8792 {
8793 var validatedTag = type.toLowerCase();
8794 var _ancestorInfo = updatedAncestorInfo(null, validatedTag);
8795 return { namespace: namespace, ancestorInfo: _ancestorInfo };
8796 }
8797 return namespace;
8798}
8799
8800function getChildHostContext(parentHostContext, type, rootContainerInstance) {
8801 {
8802 var parentHostContextDev = parentHostContext;
8803 var _namespace = getChildNamespace(parentHostContextDev.namespace, type);
8804 var _ancestorInfo2 = updatedAncestorInfo(parentHostContextDev.ancestorInfo, type);
8805 return { namespace: _namespace, ancestorInfo: _ancestorInfo2 };
8806 }
8807 var parentNamespace = parentHostContext;
8808 return getChildNamespace(parentNamespace, type);
8809}
8810
8811function getPublicInstance(instance) {
8812 return instance;
8813}
8814
8815function prepareForCommit(containerInfo) {
8816 eventsEnabled = isEnabled();
8817 selectionInformation = getSelectionInformation();
8818 setEnabled(false);
8819}
8820
8821function resetAfterCommit(containerInfo) {
8822 restoreSelection(selectionInformation);
8823 selectionInformation = null;
8824 setEnabled(eventsEnabled);
8825 eventsEnabled = null;
8826}
8827
8828function createInstance(type, props, rootContainerInstance, hostContext, internalInstanceHandle) {
8829 var parentNamespace = void 0;
8830 {
8831 // TODO: take namespace into account when validating.
8832 var hostContextDev = hostContext;
8833 validateDOMNesting(type, null, hostContextDev.ancestorInfo);
8834 if (typeof props.children === 'string' || typeof props.children === 'number') {
8835 var string = '' + props.children;
8836 var ownAncestorInfo = updatedAncestorInfo(hostContextDev.ancestorInfo, type);
8837 validateDOMNesting(null, string, ownAncestorInfo);
8838 }
8839 parentNamespace = hostContextDev.namespace;
8840 }
8841 var domElement = createElement(type, props, rootContainerInstance, parentNamespace);
8842 precacheFiberNode(internalInstanceHandle, domElement);
8843 updateFiberProps(domElement, props);
8844 return domElement;
8845}
8846
8847function appendInitialChild(parentInstance, child) {
8848 parentInstance.appendChild(child);
8849}
8850
8851function finalizeInitialChildren(domElement, type, props, rootContainerInstance, hostContext) {
8852 setInitialProperties(domElement, type, props, rootContainerInstance);
8853 return shouldAutoFocusHostComponent(type, props);
8854}
8855
8856function prepareUpdate(domElement, type, oldProps, newProps, rootContainerInstance, hostContext) {
8857 {
8858 var hostContextDev = hostContext;
8859 if (typeof newProps.children !== typeof oldProps.children && (typeof newProps.children === 'string' || typeof newProps.children === 'number')) {
8860 var string = '' + newProps.children;
8861 var ownAncestorInfo = updatedAncestorInfo(hostContextDev.ancestorInfo, type);
8862 validateDOMNesting(null, string, ownAncestorInfo);
8863 }
8864 }
8865 return diffProperties(domElement, type, oldProps, newProps, rootContainerInstance);
8866}
8867
8868function shouldSetTextContent(type, props) {
8869 return type === 'textarea' || type === 'option' || type === 'noscript' || typeof props.children === 'string' || typeof props.children === 'number' || typeof props.dangerouslySetInnerHTML === 'object' && props.dangerouslySetInnerHTML !== null && props.dangerouslySetInnerHTML.__html != null;
8870}
8871
8872function shouldDeprioritizeSubtree(type, props) {
8873 return !!props.hidden;
8874}
8875
8876function createTextInstance(text, rootContainerInstance, hostContext, internalInstanceHandle) {
8877 {
8878 var hostContextDev = hostContext;
8879 validateDOMNesting(null, text, hostContextDev.ancestorInfo);
8880 }
8881 var textNode = createTextNode(text, rootContainerInstance);
8882 precacheFiberNode(internalInstanceHandle, textNode);
8883 return textNode;
8884}
8885
8886var isPrimaryRenderer = true;
8887// This initialization code may run even on server environments
8888// if a component just imports ReactDOM (e.g. for findDOMNode).
8889// Some environments might not have setTimeout or clearTimeout.
8890var scheduleTimeout = typeof setTimeout === 'function' ? setTimeout : undefined;
8891var cancelTimeout = typeof clearTimeout === 'function' ? clearTimeout : undefined;
8892var noTimeout = -1;
8893var schedulePassiveEffects = unstable_scheduleCallback;
8894var cancelPassiveEffects = unstable_cancelCallback;
8895
8896// -------------------
8897// Mutation
8898// -------------------
8899
8900var supportsMutation = true;
8901
8902function commitMount(domElement, type, newProps, internalInstanceHandle) {
8903 // Despite the naming that might imply otherwise, this method only
8904 // fires if there is an `Update` effect scheduled during mounting.
8905 // This happens if `finalizeInitialChildren` returns `true` (which it
8906 // does to implement the `autoFocus` attribute on the client). But
8907 // there are also other cases when this might happen (such as patching
8908 // up text content during hydration mismatch). So we'll check this again.
8909 if (shouldAutoFocusHostComponent(type, newProps)) {
8910 domElement.focus();
8911 }
8912}
8913
8914function commitUpdate(domElement, updatePayload, type, oldProps, newProps, internalInstanceHandle) {
8915 // Update the props handle so that we know which props are the ones with
8916 // with current event handlers.
8917 updateFiberProps(domElement, newProps);
8918 // Apply the diff to the DOM node.
8919 updateProperties(domElement, updatePayload, type, oldProps, newProps);
8920}
8921
8922function resetTextContent(domElement) {
8923 setTextContent(domElement, '');
8924}
8925
8926function commitTextUpdate(textInstance, oldText, newText) {
8927 textInstance.nodeValue = newText;
8928}
8929
8930function appendChild(parentInstance, child) {
8931 parentInstance.appendChild(child);
8932}
8933
8934function appendChildToContainer(container, child) {
8935 var parentNode = void 0;
8936 if (container.nodeType === COMMENT_NODE) {
8937 parentNode = container.parentNode;
8938 parentNode.insertBefore(child, container);
8939 } else {
8940 parentNode = container;
8941 parentNode.appendChild(child);
8942 }
8943 // This container might be used for a portal.
8944 // If something inside a portal is clicked, that click should bubble
8945 // through the React tree. However, on Mobile Safari the click would
8946 // never bubble through the *DOM* tree unless an ancestor with onclick
8947 // event exists. So we wouldn't see it and dispatch it.
8948 // This is why we ensure that non React root containers have inline onclick
8949 // defined.
8950 // https://github.com/facebook/react/issues/11918
8951 var reactRootContainer = container._reactRootContainer;
8952 if ((reactRootContainer === null || reactRootContainer === undefined) && parentNode.onclick === null) {
8953 // TODO: This cast may not be sound for SVG, MathML or custom elements.
8954 trapClickOnNonInteractiveElement(parentNode);
8955 }
8956}
8957
8958function insertBefore(parentInstance, child, beforeChild) {
8959 parentInstance.insertBefore(child, beforeChild);
8960}
8961
8962function insertInContainerBefore(container, child, beforeChild) {
8963 if (container.nodeType === COMMENT_NODE) {
8964 container.parentNode.insertBefore(child, beforeChild);
8965 } else {
8966 container.insertBefore(child, beforeChild);
8967 }
8968}
8969
8970function removeChild(parentInstance, child) {
8971 parentInstance.removeChild(child);
8972}
8973
8974function removeChildFromContainer(container, child) {
8975 if (container.nodeType === COMMENT_NODE) {
8976 container.parentNode.removeChild(child);
8977 } else {
8978 container.removeChild(child);
8979 }
8980}
8981
8982function clearSuspenseBoundary(parentInstance, suspenseInstance) {
8983 var node = suspenseInstance;
8984 // Delete all nodes within this suspense boundary.
8985 // There might be nested nodes so we need to keep track of how
8986 // deep we are and only break out when we're back on top.
8987 var depth = 0;
8988 do {
8989 var nextNode = node.nextSibling;
8990 parentInstance.removeChild(node);
8991 if (nextNode && nextNode.nodeType === COMMENT_NODE) {
8992 var data = nextNode.data;
8993 if (data === SUSPENSE_END_DATA) {
8994 if (depth === 0) {
8995 parentInstance.removeChild(nextNode);
8996 return;
8997 } else {
8998 depth--;
8999 }
9000 } else if (data === SUSPENSE_START_DATA) {
9001 depth++;
9002 }
9003 }
9004 node = nextNode;
9005 } while (node);
9006 // TODO: Warn, we didn't find the end comment boundary.
9007}
9008
9009function clearSuspenseBoundaryFromContainer(container, suspenseInstance) {
9010 if (container.nodeType === COMMENT_NODE) {
9011 clearSuspenseBoundary(container.parentNode, suspenseInstance);
9012 } else if (container.nodeType === ELEMENT_NODE) {
9013 clearSuspenseBoundary(container, suspenseInstance);
9014 } else {
9015 // Document nodes should never contain suspense boundaries.
9016 }
9017}
9018
9019function hideInstance(instance) {
9020 // TODO: Does this work for all element types? What about MathML? Should we
9021 // pass host context to this method?
9022 instance = instance;
9023 instance.style.display = 'none';
9024}
9025
9026function hideTextInstance(textInstance) {
9027 textInstance.nodeValue = '';
9028}
9029
9030function unhideInstance(instance, props) {
9031 instance = instance;
9032 var styleProp = props[STYLE];
9033 var display = styleProp !== undefined && styleProp !== null && styleProp.hasOwnProperty('display') ? styleProp.display : null;
9034 instance.style.display = dangerousStyleValue('display', display);
9035}
9036
9037function unhideTextInstance(textInstance, text) {
9038 textInstance.nodeValue = text;
9039}
9040
9041// -------------------
9042// Hydration
9043// -------------------
9044
9045var supportsHydration = true;
9046
9047function canHydrateInstance(instance, type, props) {
9048 if (instance.nodeType !== ELEMENT_NODE || type.toLowerCase() !== instance.nodeName.toLowerCase()) {
9049 return null;
9050 }
9051 // This has now been refined to an element node.
9052 return instance;
9053}
9054
9055function canHydrateTextInstance(instance, text) {
9056 if (text === '' || instance.nodeType !== TEXT_NODE) {
9057 // Empty strings are not parsed by HTML so there won't be a correct match here.
9058 return null;
9059 }
9060 // This has now been refined to a text node.
9061 return instance;
9062}
9063
9064function canHydrateSuspenseInstance(instance) {
9065 if (instance.nodeType !== COMMENT_NODE) {
9066 // Empty strings are not parsed by HTML so there won't be a correct match here.
9067 return null;
9068 }
9069 // This has now been refined to a suspense node.
9070 return instance;
9071}
9072
9073function getNextHydratableSibling(instance) {
9074 var node = instance.nextSibling;
9075 // Skip non-hydratable nodes.
9076 while (node && node.nodeType !== ELEMENT_NODE && node.nodeType !== TEXT_NODE && (!enableSuspenseServerRenderer || node.nodeType !== COMMENT_NODE || node.data !== SUSPENSE_START_DATA)) {
9077 node = node.nextSibling;
9078 }
9079 return node;
9080}
9081
9082function getFirstHydratableChild(parentInstance) {
9083 var next = parentInstance.firstChild;
9084 // Skip non-hydratable nodes.
9085 while (next && next.nodeType !== ELEMENT_NODE && next.nodeType !== TEXT_NODE && (!enableSuspenseServerRenderer || next.nodeType !== COMMENT_NODE || next.data !== SUSPENSE_START_DATA)) {
9086 next = next.nextSibling;
9087 }
9088 return next;
9089}
9090
9091function hydrateInstance(instance, type, props, rootContainerInstance, hostContext, internalInstanceHandle) {
9092 precacheFiberNode(internalInstanceHandle, instance);
9093 // TODO: Possibly defer this until the commit phase where all the events
9094 // get attached.
9095 updateFiberProps(instance, props);
9096 var parentNamespace = void 0;
9097 {
9098 var hostContextDev = hostContext;
9099 parentNamespace = hostContextDev.namespace;
9100 }
9101 return diffHydratedProperties(instance, type, props, parentNamespace, rootContainerInstance);
9102}
9103
9104function hydrateTextInstance(textInstance, text, internalInstanceHandle) {
9105 precacheFiberNode(internalInstanceHandle, textInstance);
9106 return diffHydratedText(textInstance, text);
9107}
9108
9109function getNextHydratableInstanceAfterSuspenseInstance(suspenseInstance) {
9110 var node = suspenseInstance.nextSibling;
9111 // Skip past all nodes within this suspense boundary.
9112 // There might be nested nodes so we need to keep track of how
9113 // deep we are and only break out when we're back on top.
9114 var depth = 0;
9115 while (node) {
9116 if (node.nodeType === COMMENT_NODE) {
9117 var data = node.data;
9118 if (data === SUSPENSE_END_DATA) {
9119 if (depth === 0) {
9120 return getNextHydratableSibling(node);
9121 } else {
9122 depth--;
9123 }
9124 } else if (data === SUSPENSE_START_DATA) {
9125 depth++;
9126 }
9127 }
9128 node = node.nextSibling;
9129 }
9130 // TODO: Warn, we didn't find the end comment boundary.
9131 return null;
9132}
9133
9134function didNotMatchHydratedContainerTextInstance(parentContainer, textInstance, text) {
9135 {
9136 warnForUnmatchedText(textInstance, text);
9137 }
9138}
9139
9140function didNotMatchHydratedTextInstance(parentType, parentProps, parentInstance, textInstance, text) {
9141 if (true && parentProps[SUPPRESS_HYDRATION_WARNING] !== true) {
9142 warnForUnmatchedText(textInstance, text);
9143 }
9144}
9145
9146function didNotHydrateContainerInstance(parentContainer, instance) {
9147 {
9148 if (instance.nodeType === ELEMENT_NODE) {
9149 warnForDeletedHydratableElement(parentContainer, instance);
9150 } else if (instance.nodeType === COMMENT_NODE) {
9151 // TODO: warnForDeletedHydratableSuspenseBoundary
9152 } else {
9153 warnForDeletedHydratableText(parentContainer, instance);
9154 }
9155 }
9156}
9157
9158function didNotHydrateInstance(parentType, parentProps, parentInstance, instance) {
9159 if (true && parentProps[SUPPRESS_HYDRATION_WARNING] !== true) {
9160 if (instance.nodeType === ELEMENT_NODE) {
9161 warnForDeletedHydratableElement(parentInstance, instance);
9162 } else if (instance.nodeType === COMMENT_NODE) {
9163 // TODO: warnForDeletedHydratableSuspenseBoundary
9164 } else {
9165 warnForDeletedHydratableText(parentInstance, instance);
9166 }
9167 }
9168}
9169
9170function didNotFindHydratableContainerInstance(parentContainer, type, props) {
9171 {
9172 warnForInsertedHydratedElement(parentContainer, type, props);
9173 }
9174}
9175
9176function didNotFindHydratableContainerTextInstance(parentContainer, text) {
9177 {
9178 warnForInsertedHydratedText(parentContainer, text);
9179 }
9180}
9181
9182
9183
9184function didNotFindHydratableInstance(parentType, parentProps, parentInstance, type, props) {
9185 if (true && parentProps[SUPPRESS_HYDRATION_WARNING] !== true) {
9186 warnForInsertedHydratedElement(parentInstance, type, props);
9187 }
9188}
9189
9190function didNotFindHydratableTextInstance(parentType, parentProps, parentInstance, text) {
9191 if (true && parentProps[SUPPRESS_HYDRATION_WARNING] !== true) {
9192 warnForInsertedHydratedText(parentInstance, text);
9193 }
9194}
9195
9196function didNotFindHydratableSuspenseInstance(parentType, parentProps, parentInstance) {
9197 if (true && parentProps[SUPPRESS_HYDRATION_WARNING] !== true) {
9198 // TODO: warnForInsertedHydratedSuspense(parentInstance);
9199 }
9200}
9201
9202// This is just to get the setup running.
9203// TODO: real implementation.
9204// console.log('Hello from Fire host config.');
9205
9206// Prefix measurements so that it's possible to filter them.
9207// Longer prefixes are hard to read in DevTools.
9208var reactEmoji = '\u269B';
9209var warningEmoji = '\u26D4';
9210var supportsUserTiming = typeof performance !== 'undefined' && typeof performance.mark === 'function' && typeof performance.clearMarks === 'function' && typeof performance.measure === 'function' && typeof performance.clearMeasures === 'function';
9211
9212// Keep track of current fiber so that we know the path to unwind on pause.
9213// TODO: this looks the same as nextUnitOfWork in scheduler. Can we unify them?
9214var currentFiber = null;
9215// If we're in the middle of user code, which fiber and method is it?
9216// Reusing `currentFiber` would be confusing for this because user code fiber
9217// can change during commit phase too, but we don't need to unwind it (since
9218// lifecycles in the commit phase don't resemble a tree).
9219var currentPhase = null;
9220var currentPhaseFiber = null;
9221// Did lifecycle hook schedule an update? This is often a performance problem,
9222// so we will keep track of it, and include it in the report.
9223// Track commits caused by cascading updates.
9224var isCommitting = false;
9225var hasScheduledUpdateInCurrentCommit = false;
9226var hasScheduledUpdateInCurrentPhase = false;
9227var commitCountInCurrentWorkLoop = 0;
9228var effectCountInCurrentCommit = 0;
9229var isWaitingForCallback = false;
9230// During commits, we only show a measurement once per method name
9231// to avoid stretch the commit phase with measurement overhead.
9232var labelsInCurrentCommit = new Set();
9233
9234var formatMarkName = function (markName) {
9235 return reactEmoji + ' ' + markName;
9236};
9237
9238var formatLabel = function (label, warning) {
9239 var prefix = warning ? warningEmoji + ' ' : reactEmoji + ' ';
9240 var suffix = warning ? ' Warning: ' + warning : '';
9241 return '' + prefix + label + suffix;
9242};
9243
9244var beginMark = function (markName) {
9245 performance.mark(formatMarkName(markName));
9246};
9247
9248var clearMark = function (markName) {
9249 performance.clearMarks(formatMarkName(markName));
9250};
9251
9252var endMark = function (label, markName, warning) {
9253 var formattedMarkName = formatMarkName(markName);
9254 var formattedLabel = formatLabel(label, warning);
9255 try {
9256 performance.measure(formattedLabel, formattedMarkName);
9257 } catch (err) {}
9258 // If previous mark was missing for some reason, this will throw.
9259 // This could only happen if React crashed in an unexpected place earlier.
9260 // Don't pile on with more errors.
9261
9262 // Clear marks immediately to avoid growing buffer.
9263 performance.clearMarks(formattedMarkName);
9264 performance.clearMeasures(formattedLabel);
9265};
9266
9267var getFiberMarkName = function (label, debugID) {
9268 return label + ' (#' + debugID + ')';
9269};
9270
9271var getFiberLabel = function (componentName, isMounted, phase) {
9272 if (phase === null) {
9273 // These are composite component total time measurements.
9274 return componentName + ' [' + (isMounted ? 'update' : 'mount') + ']';
9275 } else {
9276 // Composite component methods.
9277 return componentName + '.' + phase;
9278 }
9279};
9280
9281var beginFiberMark = function (fiber, phase) {
9282 var componentName = getComponentName(fiber.type) || 'Unknown';
9283 var debugID = fiber._debugID;
9284 var isMounted = fiber.alternate !== null;
9285 var label = getFiberLabel(componentName, isMounted, phase);
9286
9287 if (isCommitting && labelsInCurrentCommit.has(label)) {
9288 // During the commit phase, we don't show duplicate labels because
9289 // there is a fixed overhead for every measurement, and we don't
9290 // want to stretch the commit phase beyond necessary.
9291 return false;
9292 }
9293 labelsInCurrentCommit.add(label);
9294
9295 var markName = getFiberMarkName(label, debugID);
9296 beginMark(markName);
9297 return true;
9298};
9299
9300var clearFiberMark = function (fiber, phase) {
9301 var componentName = getComponentName(fiber.type) || 'Unknown';
9302 var debugID = fiber._debugID;
9303 var isMounted = fiber.alternate !== null;
9304 var label = getFiberLabel(componentName, isMounted, phase);
9305 var markName = getFiberMarkName(label, debugID);
9306 clearMark(markName);
9307};
9308
9309var endFiberMark = function (fiber, phase, warning) {
9310 var componentName = getComponentName(fiber.type) || 'Unknown';
9311 var debugID = fiber._debugID;
9312 var isMounted = fiber.alternate !== null;
9313 var label = getFiberLabel(componentName, isMounted, phase);
9314 var markName = getFiberMarkName(label, debugID);
9315 endMark(label, markName, warning);
9316};
9317
9318var shouldIgnoreFiber = function (fiber) {
9319 // Host components should be skipped in the timeline.
9320 // We could check typeof fiber.type, but does this work with RN?
9321 switch (fiber.tag) {
9322 case HostRoot:
9323 case HostComponent:
9324 case HostText:
9325 case HostPortal:
9326 case Fragment:
9327 case ContextProvider:
9328 case ContextConsumer:
9329 case Mode:
9330 return true;
9331 default:
9332 return false;
9333 }
9334};
9335
9336var clearPendingPhaseMeasurement = function () {
9337 if (currentPhase !== null && currentPhaseFiber !== null) {
9338 clearFiberMark(currentPhaseFiber, currentPhase);
9339 }
9340 currentPhaseFiber = null;
9341 currentPhase = null;
9342 hasScheduledUpdateInCurrentPhase = false;
9343};
9344
9345var pauseTimers = function () {
9346 // Stops all currently active measurements so that they can be resumed
9347 // if we continue in a later deferred loop from the same unit of work.
9348 var fiber = currentFiber;
9349 while (fiber) {
9350 if (fiber._debugIsCurrentlyTiming) {
9351 endFiberMark(fiber, null, null);
9352 }
9353 fiber = fiber.return;
9354 }
9355};
9356
9357var resumeTimersRecursively = function (fiber) {
9358 if (fiber.return !== null) {
9359 resumeTimersRecursively(fiber.return);
9360 }
9361 if (fiber._debugIsCurrentlyTiming) {
9362 beginFiberMark(fiber, null);
9363 }
9364};
9365
9366var resumeTimers = function () {
9367 // Resumes all measurements that were active during the last deferred loop.
9368 if (currentFiber !== null) {
9369 resumeTimersRecursively(currentFiber);
9370 }
9371};
9372
9373function recordEffect() {
9374 if (enableUserTimingAPI) {
9375 effectCountInCurrentCommit++;
9376 }
9377}
9378
9379function recordScheduleUpdate() {
9380 if (enableUserTimingAPI) {
9381 if (isCommitting) {
9382 hasScheduledUpdateInCurrentCommit = true;
9383 }
9384 if (currentPhase !== null && currentPhase !== 'componentWillMount' && currentPhase !== 'componentWillReceiveProps') {
9385 hasScheduledUpdateInCurrentPhase = true;
9386 }
9387 }
9388}
9389
9390function startRequestCallbackTimer() {
9391 if (enableUserTimingAPI) {
9392 if (supportsUserTiming && !isWaitingForCallback) {
9393 isWaitingForCallback = true;
9394 beginMark('(Waiting for async callback...)');
9395 }
9396 }
9397}
9398
9399function stopRequestCallbackTimer(didExpire, expirationTime) {
9400 if (enableUserTimingAPI) {
9401 if (supportsUserTiming) {
9402 isWaitingForCallback = false;
9403 var warning = didExpire ? 'React was blocked by main thread' : null;
9404 endMark('(Waiting for async callback... will force flush in ' + expirationTime + ' ms)', '(Waiting for async callback...)', warning);
9405 }
9406 }
9407}
9408
9409function startWorkTimer(fiber) {
9410 if (enableUserTimingAPI) {
9411 if (!supportsUserTiming || shouldIgnoreFiber(fiber)) {
9412 return;
9413 }
9414 // If we pause, this is the fiber to unwind from.
9415 currentFiber = fiber;
9416 if (!beginFiberMark(fiber, null)) {
9417 return;
9418 }
9419 fiber._debugIsCurrentlyTiming = true;
9420 }
9421}
9422
9423function cancelWorkTimer(fiber) {
9424 if (enableUserTimingAPI) {
9425 if (!supportsUserTiming || shouldIgnoreFiber(fiber)) {
9426 return;
9427 }
9428 // Remember we shouldn't complete measurement for this fiber.
9429 // Otherwise flamechart will be deep even for small updates.
9430 fiber._debugIsCurrentlyTiming = false;
9431 clearFiberMark(fiber, null);
9432 }
9433}
9434
9435function stopWorkTimer(fiber) {
9436 if (enableUserTimingAPI) {
9437 if (!supportsUserTiming || shouldIgnoreFiber(fiber)) {
9438 return;
9439 }
9440 // If we pause, its parent is the fiber to unwind from.
9441 currentFiber = fiber.return;
9442 if (!fiber._debugIsCurrentlyTiming) {
9443 return;
9444 }
9445 fiber._debugIsCurrentlyTiming = false;
9446 endFiberMark(fiber, null, null);
9447 }
9448}
9449
9450function stopFailedWorkTimer(fiber) {
9451 if (enableUserTimingAPI) {
9452 if (!supportsUserTiming || shouldIgnoreFiber(fiber)) {
9453 return;
9454 }
9455 // If we pause, its parent is the fiber to unwind from.
9456 currentFiber = fiber.return;
9457 if (!fiber._debugIsCurrentlyTiming) {
9458 return;
9459 }
9460 fiber._debugIsCurrentlyTiming = false;
9461 var warning = fiber.tag === SuspenseComponent || fiber.tag === DehydratedSuspenseComponent ? 'Rendering was suspended' : 'An error was thrown inside this error boundary';
9462 endFiberMark(fiber, null, warning);
9463 }
9464}
9465
9466function startPhaseTimer(fiber, phase) {
9467 if (enableUserTimingAPI) {
9468 if (!supportsUserTiming) {
9469 return;
9470 }
9471 clearPendingPhaseMeasurement();
9472 if (!beginFiberMark(fiber, phase)) {
9473 return;
9474 }
9475 currentPhaseFiber = fiber;
9476 currentPhase = phase;
9477 }
9478}
9479
9480function stopPhaseTimer() {
9481 if (enableUserTimingAPI) {
9482 if (!supportsUserTiming) {
9483 return;
9484 }
9485 if (currentPhase !== null && currentPhaseFiber !== null) {
9486 var warning = hasScheduledUpdateInCurrentPhase ? 'Scheduled a cascading update' : null;
9487 endFiberMark(currentPhaseFiber, currentPhase, warning);
9488 }
9489 currentPhase = null;
9490 currentPhaseFiber = null;
9491 }
9492}
9493
9494function startWorkLoopTimer(nextUnitOfWork) {
9495 if (enableUserTimingAPI) {
9496 currentFiber = nextUnitOfWork;
9497 if (!supportsUserTiming) {
9498 return;
9499 }
9500 commitCountInCurrentWorkLoop = 0;
9501 // This is top level call.
9502 // Any other measurements are performed within.
9503 beginMark('(React Tree Reconciliation)');
9504 // Resume any measurements that were in progress during the last loop.
9505 resumeTimers();
9506 }
9507}
9508
9509function stopWorkLoopTimer(interruptedBy, didCompleteRoot) {
9510 if (enableUserTimingAPI) {
9511 if (!supportsUserTiming) {
9512 return;
9513 }
9514 var warning = null;
9515 if (interruptedBy !== null) {
9516 if (interruptedBy.tag === HostRoot) {
9517 warning = 'A top-level update interrupted the previous render';
9518 } else {
9519 var componentName = getComponentName(interruptedBy.type) || 'Unknown';
9520 warning = 'An update to ' + componentName + ' interrupted the previous render';
9521 }
9522 } else if (commitCountInCurrentWorkLoop > 1) {
9523 warning = 'There were cascading updates';
9524 }
9525 commitCountInCurrentWorkLoop = 0;
9526 var label = didCompleteRoot ? '(React Tree Reconciliation: Completed Root)' : '(React Tree Reconciliation: Yielded)';
9527 // Pause any measurements until the next loop.
9528 pauseTimers();
9529 endMark(label, '(React Tree Reconciliation)', warning);
9530 }
9531}
9532
9533function startCommitTimer() {
9534 if (enableUserTimingAPI) {
9535 if (!supportsUserTiming) {
9536 return;
9537 }
9538 isCommitting = true;
9539 hasScheduledUpdateInCurrentCommit = false;
9540 labelsInCurrentCommit.clear();
9541 beginMark('(Committing Changes)');
9542 }
9543}
9544
9545function stopCommitTimer() {
9546 if (enableUserTimingAPI) {
9547 if (!supportsUserTiming) {
9548 return;
9549 }
9550
9551 var warning = null;
9552 if (hasScheduledUpdateInCurrentCommit) {
9553 warning = 'Lifecycle hook scheduled a cascading update';
9554 } else if (commitCountInCurrentWorkLoop > 0) {
9555 warning = 'Caused by a cascading update in earlier commit';
9556 }
9557 hasScheduledUpdateInCurrentCommit = false;
9558 commitCountInCurrentWorkLoop++;
9559 isCommitting = false;
9560 labelsInCurrentCommit.clear();
9561
9562 endMark('(Committing Changes)', '(Committing Changes)', warning);
9563 }
9564}
9565
9566function startCommitSnapshotEffectsTimer() {
9567 if (enableUserTimingAPI) {
9568 if (!supportsUserTiming) {
9569 return;
9570 }
9571 effectCountInCurrentCommit = 0;
9572 beginMark('(Committing Snapshot Effects)');
9573 }
9574}
9575
9576function stopCommitSnapshotEffectsTimer() {
9577 if (enableUserTimingAPI) {
9578 if (!supportsUserTiming) {
9579 return;
9580 }
9581 var count = effectCountInCurrentCommit;
9582 effectCountInCurrentCommit = 0;
9583 endMark('(Committing Snapshot Effects: ' + count + ' Total)', '(Committing Snapshot Effects)', null);
9584 }
9585}
9586
9587function startCommitHostEffectsTimer() {
9588 if (enableUserTimingAPI) {
9589 if (!supportsUserTiming) {
9590 return;
9591 }
9592 effectCountInCurrentCommit = 0;
9593 beginMark('(Committing Host Effects)');
9594 }
9595}
9596
9597function stopCommitHostEffectsTimer() {
9598 if (enableUserTimingAPI) {
9599 if (!supportsUserTiming) {
9600 return;
9601 }
9602 var count = effectCountInCurrentCommit;
9603 effectCountInCurrentCommit = 0;
9604 endMark('(Committing Host Effects: ' + count + ' Total)', '(Committing Host Effects)', null);
9605 }
9606}
9607
9608function startCommitLifeCyclesTimer() {
9609 if (enableUserTimingAPI) {
9610 if (!supportsUserTiming) {
9611 return;
9612 }
9613 effectCountInCurrentCommit = 0;
9614 beginMark('(Calling Lifecycle Methods)');
9615 }
9616}
9617
9618function stopCommitLifeCyclesTimer() {
9619 if (enableUserTimingAPI) {
9620 if (!supportsUserTiming) {
9621 return;
9622 }
9623 var count = effectCountInCurrentCommit;
9624 effectCountInCurrentCommit = 0;
9625 endMark('(Calling Lifecycle Methods: ' + count + ' Total)', '(Calling Lifecycle Methods)', null);
9626 }
9627}
9628
9629var valueStack = [];
9630
9631var fiberStack = void 0;
9632
9633{
9634 fiberStack = [];
9635}
9636
9637var index = -1;
9638
9639function createCursor(defaultValue) {
9640 return {
9641 current: defaultValue
9642 };
9643}
9644
9645function pop(cursor, fiber) {
9646 if (index < 0) {
9647 {
9648 warningWithoutStack$1(false, 'Unexpected pop.');
9649 }
9650 return;
9651 }
9652
9653 {
9654 if (fiber !== fiberStack[index]) {
9655 warningWithoutStack$1(false, 'Unexpected Fiber popped.');
9656 }
9657 }
9658
9659 cursor.current = valueStack[index];
9660
9661 valueStack[index] = null;
9662
9663 {
9664 fiberStack[index] = null;
9665 }
9666
9667 index--;
9668}
9669
9670function push(cursor, value, fiber) {
9671 index++;
9672
9673 valueStack[index] = cursor.current;
9674
9675 {
9676 fiberStack[index] = fiber;
9677 }
9678
9679 cursor.current = value;
9680}
9681
9682function checkThatStackIsEmpty() {
9683 {
9684 if (index !== -1) {
9685 warningWithoutStack$1(false, 'Expected an empty stack. Something was not reset properly.');
9686 }
9687 }
9688}
9689
9690function resetStackAfterFatalErrorInDev() {
9691 {
9692 index = -1;
9693 valueStack.length = 0;
9694 fiberStack.length = 0;
9695 }
9696}
9697
9698var warnedAboutMissingGetChildContext = void 0;
9699
9700{
9701 warnedAboutMissingGetChildContext = {};
9702}
9703
9704var emptyContextObject = {};
9705{
9706 Object.freeze(emptyContextObject);
9707}
9708
9709// A cursor to the current merged context object on the stack.
9710var contextStackCursor = createCursor(emptyContextObject);
9711// A cursor to a boolean indicating whether the context has changed.
9712var didPerformWorkStackCursor = createCursor(false);
9713// Keep track of the previous context object that was on the stack.
9714// We use this to get access to the parent context after we have already
9715// pushed the next context provider, and now need to merge their contexts.
9716var previousContext = emptyContextObject;
9717
9718function getUnmaskedContext(workInProgress, Component, didPushOwnContextIfProvider) {
9719 if (didPushOwnContextIfProvider && isContextProvider(Component)) {
9720 // If the fiber is a context provider itself, when we read its context
9721 // we may have already pushed its own child context on the stack. A context
9722 // provider should not "see" its own child context. Therefore we read the
9723 // previous (parent) context instead for a context provider.
9724 return previousContext;
9725 }
9726 return contextStackCursor.current;
9727}
9728
9729function cacheContext(workInProgress, unmaskedContext, maskedContext) {
9730 var instance = workInProgress.stateNode;
9731 instance.__reactInternalMemoizedUnmaskedChildContext = unmaskedContext;
9732 instance.__reactInternalMemoizedMaskedChildContext = maskedContext;
9733}
9734
9735function getMaskedContext(workInProgress, unmaskedContext) {
9736 var type = workInProgress.type;
9737 var contextTypes = type.contextTypes;
9738 if (!contextTypes) {
9739 return emptyContextObject;
9740 }
9741
9742 // Avoid recreating masked context unless unmasked context has changed.
9743 // Failing to do this will result in unnecessary calls to componentWillReceiveProps.
9744 // This may trigger infinite loops if componentWillReceiveProps calls setState.
9745 var instance = workInProgress.stateNode;
9746 if (instance && instance.__reactInternalMemoizedUnmaskedChildContext === unmaskedContext) {
9747 return instance.__reactInternalMemoizedMaskedChildContext;
9748 }
9749
9750 var context = {};
9751 for (var key in contextTypes) {
9752 context[key] = unmaskedContext[key];
9753 }
9754
9755 {
9756 var name = getComponentName(type) || 'Unknown';
9757 checkPropTypes_1(contextTypes, context, 'context', name, getCurrentFiberStackInDev);
9758 }
9759
9760 // Cache unmasked context so we can avoid recreating masked context unless necessary.
9761 // Context is created before the class component is instantiated so check for instance.
9762 if (instance) {
9763 cacheContext(workInProgress, unmaskedContext, context);
9764 }
9765
9766 return context;
9767}
9768
9769function hasContextChanged() {
9770 return didPerformWorkStackCursor.current;
9771}
9772
9773function isContextProvider(type) {
9774 var childContextTypes = type.childContextTypes;
9775 return childContextTypes !== null && childContextTypes !== undefined;
9776}
9777
9778function popContext(fiber) {
9779 pop(didPerformWorkStackCursor, fiber);
9780 pop(contextStackCursor, fiber);
9781}
9782
9783function popTopLevelContextObject(fiber) {
9784 pop(didPerformWorkStackCursor, fiber);
9785 pop(contextStackCursor, fiber);
9786}
9787
9788function pushTopLevelContextObject(fiber, context, didChange) {
9789 !(contextStackCursor.current === emptyContextObject) ? invariant(false, 'Unexpected context found on stack. This error is likely caused by a bug in React. Please file an issue.') : void 0;
9790
9791 push(contextStackCursor, context, fiber);
9792 push(didPerformWorkStackCursor, didChange, fiber);
9793}
9794
9795function processChildContext(fiber, type, parentContext) {
9796 var instance = fiber.stateNode;
9797 var childContextTypes = type.childContextTypes;
9798
9799 // TODO (bvaughn) Replace this behavior with an invariant() in the future.
9800 // It has only been added in Fiber to match the (unintentional) behavior in Stack.
9801 if (typeof instance.getChildContext !== 'function') {
9802 {
9803 var componentName = getComponentName(type) || 'Unknown';
9804
9805 if (!warnedAboutMissingGetChildContext[componentName]) {
9806 warnedAboutMissingGetChildContext[componentName] = true;
9807 warningWithoutStack$1(false, '%s.childContextTypes is specified but there is no getChildContext() method ' + 'on the instance. You can either define getChildContext() on %s or remove ' + 'childContextTypes from it.', componentName, componentName);
9808 }
9809 }
9810 return parentContext;
9811 }
9812
9813 var childContext = void 0;
9814 {
9815 setCurrentPhase('getChildContext');
9816 }
9817 startPhaseTimer(fiber, 'getChildContext');
9818 childContext = instance.getChildContext();
9819 stopPhaseTimer();
9820 {
9821 setCurrentPhase(null);
9822 }
9823 for (var contextKey in childContext) {
9824 !(contextKey in childContextTypes) ? invariant(false, '%s.getChildContext(): key "%s" is not defined in childContextTypes.', getComponentName(type) || 'Unknown', contextKey) : void 0;
9825 }
9826 {
9827 var name = getComponentName(type) || 'Unknown';
9828 checkPropTypes_1(childContextTypes, childContext, 'child context', name,
9829 // In practice, there is one case in which we won't get a stack. It's when
9830 // somebody calls unstable_renderSubtreeIntoContainer() and we process
9831 // context from the parent component instance. The stack will be missing
9832 // because it's outside of the reconciliation, and so the pointer has not
9833 // been set. This is rare and doesn't matter. We'll also remove that API.
9834 getCurrentFiberStackInDev);
9835 }
9836
9837 return _assign({}, parentContext, childContext);
9838}
9839
9840function pushContextProvider(workInProgress) {
9841 var instance = workInProgress.stateNode;
9842 // We push the context as early as possible to ensure stack integrity.
9843 // If the instance does not exist yet, we will push null at first,
9844 // and replace it on the stack later when invalidating the context.
9845 var memoizedMergedChildContext = instance && instance.__reactInternalMemoizedMergedChildContext || emptyContextObject;
9846
9847 // Remember the parent context so we can merge with it later.
9848 // Inherit the parent's did-perform-work value to avoid inadvertently blocking updates.
9849 previousContext = contextStackCursor.current;
9850 push(contextStackCursor, memoizedMergedChildContext, workInProgress);
9851 push(didPerformWorkStackCursor, didPerformWorkStackCursor.current, workInProgress);
9852
9853 return true;
9854}
9855
9856function invalidateContextProvider(workInProgress, type, didChange) {
9857 var instance = workInProgress.stateNode;
9858 !instance ? invariant(false, 'Expected to have an instance by this point. This error is likely caused by a bug in React. Please file an issue.') : void 0;
9859
9860 if (didChange) {
9861 // Merge parent and own context.
9862 // Skip this if we're not updating due to sCU.
9863 // This avoids unnecessarily recomputing memoized values.
9864 var mergedContext = processChildContext(workInProgress, type, previousContext);
9865 instance.__reactInternalMemoizedMergedChildContext = mergedContext;
9866
9867 // Replace the old (or empty) context with the new one.
9868 // It is important to unwind the context in the reverse order.
9869 pop(didPerformWorkStackCursor, workInProgress);
9870 pop(contextStackCursor, workInProgress);
9871 // Now push the new context and mark that it has changed.
9872 push(contextStackCursor, mergedContext, workInProgress);
9873 push(didPerformWorkStackCursor, didChange, workInProgress);
9874 } else {
9875 pop(didPerformWorkStackCursor, workInProgress);
9876 push(didPerformWorkStackCursor, didChange, workInProgress);
9877 }
9878}
9879
9880function findCurrentUnmaskedContext(fiber) {
9881 // Currently this is only used with renderSubtreeIntoContainer; not sure if it
9882 // makes sense elsewhere
9883 !(isFiberMounted(fiber) && fiber.tag === ClassComponent) ? invariant(false, 'Expected subtree parent to be a mounted class component. This error is likely caused by a bug in React. Please file an issue.') : void 0;
9884
9885 var node = fiber;
9886 do {
9887 switch (node.tag) {
9888 case HostRoot:
9889 return node.stateNode.context;
9890 case ClassComponent:
9891 {
9892 var Component = node.type;
9893 if (isContextProvider(Component)) {
9894 return node.stateNode.__reactInternalMemoizedMergedChildContext;
9895 }
9896 break;
9897 }
9898 }
9899 node = node.return;
9900 } while (node !== null);
9901 invariant(false, 'Found unexpected detached subtree parent. This error is likely caused by a bug in React. Please file an issue.');
9902}
9903
9904var onCommitFiberRoot = null;
9905var onCommitFiberUnmount = null;
9906var hasLoggedError = false;
9907
9908function catchErrors(fn) {
9909 return function (arg) {
9910 try {
9911 return fn(arg);
9912 } catch (err) {
9913 if (true && !hasLoggedError) {
9914 hasLoggedError = true;
9915 warningWithoutStack$1(false, 'React DevTools encountered an error: %s', err);
9916 }
9917 }
9918 };
9919}
9920
9921var isDevToolsPresent = typeof __REACT_DEVTOOLS_GLOBAL_HOOK__ !== 'undefined';
9922
9923function injectInternals(internals) {
9924 if (typeof __REACT_DEVTOOLS_GLOBAL_HOOK__ === 'undefined') {
9925 // No DevTools
9926 return false;
9927 }
9928 var hook = __REACT_DEVTOOLS_GLOBAL_HOOK__;
9929 if (hook.isDisabled) {
9930 // This isn't a real property on the hook, but it can be set to opt out
9931 // of DevTools integration and associated warnings and logs.
9932 // https://github.com/facebook/react/issues/3877
9933 return true;
9934 }
9935 if (!hook.supportsFiber) {
9936 {
9937 warningWithoutStack$1(false, 'The installed version of React DevTools is too old and will not work ' + 'with the current version of React. Please update React DevTools. ' + 'https://fb.me/react-devtools');
9938 }
9939 // DevTools exists, even though it doesn't support Fiber.
9940 return true;
9941 }
9942 try {
9943 var rendererID = hook.inject(internals);
9944 // We have successfully injected, so now it is safe to set up hooks.
9945 onCommitFiberRoot = catchErrors(function (root) {
9946 return hook.onCommitFiberRoot(rendererID, root);
9947 });
9948 onCommitFiberUnmount = catchErrors(function (fiber) {
9949 return hook.onCommitFiberUnmount(rendererID, fiber);
9950 });
9951 } catch (err) {
9952 // Catch all errors because it is unsafe to throw during initialization.
9953 {
9954 warningWithoutStack$1(false, 'React DevTools encountered an error: %s.', err);
9955 }
9956 }
9957 // DevTools exists
9958 return true;
9959}
9960
9961function onCommitRoot(root) {
9962 if (typeof onCommitFiberRoot === 'function') {
9963 onCommitFiberRoot(root);
9964 }
9965}
9966
9967function onCommitUnmount(fiber) {
9968 if (typeof onCommitFiberUnmount === 'function') {
9969 onCommitFiberUnmount(fiber);
9970 }
9971}
9972
9973// Max 31 bit integer. The max integer size in V8 for 32-bit systems.
9974// Math.pow(2, 30) - 1
9975// 0b111111111111111111111111111111
9976var maxSigned31BitInt = 1073741823;
9977
9978var NoWork = 0;
9979var Never = 1;
9980var Sync = maxSigned31BitInt;
9981
9982var UNIT_SIZE = 10;
9983var MAGIC_NUMBER_OFFSET = maxSigned31BitInt - 1;
9984
9985// 1 unit of expiration time represents 10ms.
9986function msToExpirationTime(ms) {
9987 // Always add an offset so that we don't clash with the magic number for NoWork.
9988 return MAGIC_NUMBER_OFFSET - (ms / UNIT_SIZE | 0);
9989}
9990
9991function expirationTimeToMs(expirationTime) {
9992 return (MAGIC_NUMBER_OFFSET - expirationTime) * UNIT_SIZE;
9993}
9994
9995function ceiling(num, precision) {
9996 return ((num / precision | 0) + 1) * precision;
9997}
9998
9999function computeExpirationBucket(currentTime, expirationInMs, bucketSizeMs) {
10000 return MAGIC_NUMBER_OFFSET - ceiling(MAGIC_NUMBER_OFFSET - currentTime + expirationInMs / UNIT_SIZE, bucketSizeMs / UNIT_SIZE);
10001}
10002
10003var LOW_PRIORITY_EXPIRATION = 5000;
10004var LOW_PRIORITY_BATCH_SIZE = 250;
10005
10006function computeAsyncExpiration(currentTime) {
10007 return computeExpirationBucket(currentTime, LOW_PRIORITY_EXPIRATION, LOW_PRIORITY_BATCH_SIZE);
10008}
10009
10010// We intentionally set a higher expiration time for interactive updates in
10011// dev than in production.
10012//
10013// If the main thread is being blocked so long that you hit the expiration,
10014// it's a problem that could be solved with better scheduling.
10015//
10016// People will be more likely to notice this and fix it with the long
10017// expiration time in development.
10018//
10019// In production we opt for better UX at the risk of masking scheduling
10020// problems, by expiring fast.
10021var HIGH_PRIORITY_EXPIRATION = 500;
10022var HIGH_PRIORITY_BATCH_SIZE = 100;
10023
10024function computeInteractiveExpiration(currentTime) {
10025 return computeExpirationBucket(currentTime, HIGH_PRIORITY_EXPIRATION, HIGH_PRIORITY_BATCH_SIZE);
10026}
10027
10028var NoContext = 0;
10029var ConcurrentMode = 1;
10030var StrictMode = 2;
10031var ProfileMode = 4;
10032
10033var hasBadMapPolyfill = void 0;
10034
10035{
10036 hasBadMapPolyfill = false;
10037 try {
10038 var nonExtensibleObject = Object.preventExtensions({});
10039 var testMap = new Map([[nonExtensibleObject, null]]);
10040 var testSet = new Set([nonExtensibleObject]);
10041 // This is necessary for Rollup to not consider these unused.
10042 // https://github.com/rollup/rollup/issues/1771
10043 // TODO: we can remove these if Rollup fixes the bug.
10044 testMap.set(0, 0);
10045 testSet.add(0);
10046 } catch (e) {
10047 // TODO: Consider warning about bad polyfills
10048 hasBadMapPolyfill = true;
10049 }
10050}
10051
10052// A Fiber is work on a Component that needs to be done or was done. There can
10053// be more than one per component.
10054
10055
10056var debugCounter = void 0;
10057
10058{
10059 debugCounter = 1;
10060}
10061
10062function FiberNode(tag, pendingProps, key, mode) {
10063 // Instance
10064 this.tag = tag;
10065 this.key = key;
10066 this.elementType = null;
10067 this.type = null;
10068 this.stateNode = null;
10069
10070 // Fiber
10071 this.return = null;
10072 this.child = null;
10073 this.sibling = null;
10074 this.index = 0;
10075
10076 this.ref = null;
10077
10078 this.pendingProps = pendingProps;
10079 this.memoizedProps = null;
10080 this.updateQueue = null;
10081 this.memoizedState = null;
10082 this.contextDependencies = null;
10083
10084 this.mode = mode;
10085
10086 // Effects
10087 this.effectTag = NoEffect;
10088 this.nextEffect = null;
10089
10090 this.firstEffect = null;
10091 this.lastEffect = null;
10092
10093 this.expirationTime = NoWork;
10094 this.childExpirationTime = NoWork;
10095
10096 this.alternate = null;
10097
10098 if (enableProfilerTimer) {
10099 // Note: The following is done to avoid a v8 performance cliff.
10100 //
10101 // Initializing the fields below to smis and later updating them with
10102 // double values will cause Fibers to end up having separate shapes.
10103 // This behavior/bug has something to do with Object.preventExtension().
10104 // Fortunately this only impacts DEV builds.
10105 // Unfortunately it makes React unusably slow for some applications.
10106 // To work around this, initialize the fields below with doubles.
10107 //
10108 // Learn more about this here:
10109 // https://github.com/facebook/react/issues/14365
10110 // https://bugs.chromium.org/p/v8/issues/detail?id=8538
10111 this.actualDuration = Number.NaN;
10112 this.actualStartTime = Number.NaN;
10113 this.selfBaseDuration = Number.NaN;
10114 this.treeBaseDuration = Number.NaN;
10115
10116 // It's okay to replace the initial doubles with smis after initialization.
10117 // This won't trigger the performance cliff mentioned above,
10118 // and it simplifies other profiler code (including DevTools).
10119 this.actualDuration = 0;
10120 this.actualStartTime = -1;
10121 this.selfBaseDuration = 0;
10122 this.treeBaseDuration = 0;
10123 }
10124
10125 {
10126 this._debugID = debugCounter++;
10127 this._debugSource = null;
10128 this._debugOwner = null;
10129 this._debugIsCurrentlyTiming = false;
10130 if (!hasBadMapPolyfill && typeof Object.preventExtensions === 'function') {
10131 Object.preventExtensions(this);
10132 }
10133 }
10134}
10135
10136// This is a constructor function, rather than a POJO constructor, still
10137// please ensure we do the following:
10138// 1) Nobody should add any instance methods on this. Instance methods can be
10139// more difficult to predict when they get optimized and they are almost
10140// never inlined properly in static compilers.
10141// 2) Nobody should rely on `instanceof Fiber` for type testing. We should
10142// always know when it is a fiber.
10143// 3) We might want to experiment with using numeric keys since they are easier
10144// to optimize in a non-JIT environment.
10145// 4) We can easily go from a constructor to a createFiber object literal if that
10146// is faster.
10147// 5) It should be easy to port this to a C struct and keep a C implementation
10148// compatible.
10149var createFiber = function (tag, pendingProps, key, mode) {
10150 // $FlowFixMe: the shapes are exact here but Flow doesn't like constructors
10151 return new FiberNode(tag, pendingProps, key, mode);
10152};
10153
10154function shouldConstruct(Component) {
10155 var prototype = Component.prototype;
10156 return !!(prototype && prototype.isReactComponent);
10157}
10158
10159function isSimpleFunctionComponent(type) {
10160 return typeof type === 'function' && !shouldConstruct(type) && type.defaultProps === undefined;
10161}
10162
10163function resolveLazyComponentTag(Component) {
10164 if (typeof Component === 'function') {
10165 return shouldConstruct(Component) ? ClassComponent : FunctionComponent;
10166 } else if (Component !== undefined && Component !== null) {
10167 var $$typeof = Component.$$typeof;
10168 if ($$typeof === REACT_FORWARD_REF_TYPE) {
10169 return ForwardRef;
10170 }
10171 if ($$typeof === REACT_MEMO_TYPE) {
10172 return MemoComponent;
10173 }
10174 }
10175 return IndeterminateComponent;
10176}
10177
10178// This is used to create an alternate fiber to do work on.
10179function createWorkInProgress(current, pendingProps, expirationTime) {
10180 var workInProgress = current.alternate;
10181 if (workInProgress === null) {
10182 // We use a double buffering pooling technique because we know that we'll
10183 // only ever need at most two versions of a tree. We pool the "other" unused
10184 // node that we're free to reuse. This is lazily created to avoid allocating
10185 // extra objects for things that are never updated. It also allow us to
10186 // reclaim the extra memory if needed.
10187 workInProgress = createFiber(current.tag, pendingProps, current.key, current.mode);
10188 workInProgress.elementType = current.elementType;
10189 workInProgress.type = current.type;
10190 workInProgress.stateNode = current.stateNode;
10191
10192 {
10193 // DEV-only fields
10194 workInProgress._debugID = current._debugID;
10195 workInProgress._debugSource = current._debugSource;
10196 workInProgress._debugOwner = current._debugOwner;
10197 }
10198
10199 workInProgress.alternate = current;
10200 current.alternate = workInProgress;
10201 } else {
10202 workInProgress.pendingProps = pendingProps;
10203
10204 // We already have an alternate.
10205 // Reset the effect tag.
10206 workInProgress.effectTag = NoEffect;
10207
10208 // The effect list is no longer valid.
10209 workInProgress.nextEffect = null;
10210 workInProgress.firstEffect = null;
10211 workInProgress.lastEffect = null;
10212
10213 if (enableProfilerTimer) {
10214 // We intentionally reset, rather than copy, actualDuration & actualStartTime.
10215 // This prevents time from endlessly accumulating in new commits.
10216 // This has the downside of resetting values for different priority renders,
10217 // But works for yielding (the common case) and should support resuming.
10218 workInProgress.actualDuration = 0;
10219 workInProgress.actualStartTime = -1;
10220 }
10221 }
10222
10223 workInProgress.childExpirationTime = current.childExpirationTime;
10224 workInProgress.expirationTime = current.expirationTime;
10225
10226 workInProgress.child = current.child;
10227 workInProgress.memoizedProps = current.memoizedProps;
10228 workInProgress.memoizedState = current.memoizedState;
10229 workInProgress.updateQueue = current.updateQueue;
10230 workInProgress.contextDependencies = current.contextDependencies;
10231
10232 // These will be overridden during the parent's reconciliation
10233 workInProgress.sibling = current.sibling;
10234 workInProgress.index = current.index;
10235 workInProgress.ref = current.ref;
10236
10237 if (enableProfilerTimer) {
10238 workInProgress.selfBaseDuration = current.selfBaseDuration;
10239 workInProgress.treeBaseDuration = current.treeBaseDuration;
10240 }
10241
10242 return workInProgress;
10243}
10244
10245function createHostRootFiber(isConcurrent) {
10246 var mode = isConcurrent ? ConcurrentMode | StrictMode : NoContext;
10247
10248 if (enableProfilerTimer && isDevToolsPresent) {
10249 // Always collect profile timings when DevTools are present.
10250 // This enables DevTools to start capturing timing at any point–
10251 // Without some nodes in the tree having empty base times.
10252 mode |= ProfileMode;
10253 }
10254
10255 return createFiber(HostRoot, null, null, mode);
10256}
10257
10258function createFiberFromTypeAndProps(type, // React$ElementType
10259key, pendingProps, owner, mode, expirationTime) {
10260 var fiber = void 0;
10261
10262 var fiberTag = IndeterminateComponent;
10263 // The resolved type is set if we know what the final type will be. I.e. it's not lazy.
10264 var resolvedType = type;
10265 if (typeof type === 'function') {
10266 if (shouldConstruct(type)) {
10267 fiberTag = ClassComponent;
10268 }
10269 } else if (typeof type === 'string') {
10270 fiberTag = HostComponent;
10271 } else {
10272 getTag: switch (type) {
10273 case REACT_FRAGMENT_TYPE:
10274 return createFiberFromFragment(pendingProps.children, mode, expirationTime, key);
10275 case REACT_CONCURRENT_MODE_TYPE:
10276 return createFiberFromMode(pendingProps, mode | ConcurrentMode | StrictMode, expirationTime, key);
10277 case REACT_STRICT_MODE_TYPE:
10278 return createFiberFromMode(pendingProps, mode | StrictMode, expirationTime, key);
10279 case REACT_PROFILER_TYPE:
10280 return createFiberFromProfiler(pendingProps, mode, expirationTime, key);
10281 case REACT_SUSPENSE_TYPE:
10282 return createFiberFromSuspense(pendingProps, mode, expirationTime, key);
10283 default:
10284 {
10285 if (typeof type === 'object' && type !== null) {
10286 switch (type.$$typeof) {
10287 case REACT_PROVIDER_TYPE:
10288 fiberTag = ContextProvider;
10289 break getTag;
10290 case REACT_CONTEXT_TYPE:
10291 // This is a consumer
10292 fiberTag = ContextConsumer;
10293 break getTag;
10294 case REACT_FORWARD_REF_TYPE:
10295 fiberTag = ForwardRef;
10296 break getTag;
10297 case REACT_MEMO_TYPE:
10298 fiberTag = MemoComponent;
10299 break getTag;
10300 case REACT_LAZY_TYPE:
10301 fiberTag = LazyComponent;
10302 resolvedType = null;
10303 break getTag;
10304 }
10305 }
10306 var info = '';
10307 {
10308 if (type === undefined || typeof type === 'object' && type !== null && Object.keys(type).length === 0) {
10309 info += ' You likely forgot to export your component from the file ' + "it's defined in, or you might have mixed up default and " + 'named imports.';
10310 }
10311 var ownerName = owner ? getComponentName(owner.type) : null;
10312 if (ownerName) {
10313 info += '\n\nCheck the render method of `' + ownerName + '`.';
10314 }
10315 }
10316 invariant(false, 'Element type is invalid: expected a string (for built-in components) or a class/function (for composite components) but got: %s.%s', type == null ? type : typeof type, info);
10317 }
10318 }
10319 }
10320
10321 fiber = createFiber(fiberTag, pendingProps, key, mode);
10322 fiber.elementType = type;
10323 fiber.type = resolvedType;
10324 fiber.expirationTime = expirationTime;
10325
10326 return fiber;
10327}
10328
10329function createFiberFromElement(element, mode, expirationTime) {
10330 var owner = null;
10331 {
10332 owner = element._owner;
10333 }
10334 var type = element.type;
10335 var key = element.key;
10336 var pendingProps = element.props;
10337 var fiber = createFiberFromTypeAndProps(type, key, pendingProps, owner, mode, expirationTime);
10338 {
10339 fiber._debugSource = element._source;
10340 fiber._debugOwner = element._owner;
10341 }
10342 return fiber;
10343}
10344
10345function createFiberFromFragment(elements, mode, expirationTime, key) {
10346 var fiber = createFiber(Fragment, elements, key, mode);
10347 fiber.expirationTime = expirationTime;
10348 return fiber;
10349}
10350
10351function createFiberFromProfiler(pendingProps, mode, expirationTime, key) {
10352 {
10353 if (typeof pendingProps.id !== 'string' || typeof pendingProps.onRender !== 'function') {
10354 warningWithoutStack$1(false, 'Profiler must specify an "id" string and "onRender" function as props');
10355 }
10356 }
10357
10358 var fiber = createFiber(Profiler, pendingProps, key, mode | ProfileMode);
10359 // TODO: The Profiler fiber shouldn't have a type. It has a tag.
10360 fiber.elementType = REACT_PROFILER_TYPE;
10361 fiber.type = REACT_PROFILER_TYPE;
10362 fiber.expirationTime = expirationTime;
10363
10364 return fiber;
10365}
10366
10367function createFiberFromMode(pendingProps, mode, expirationTime, key) {
10368 var fiber = createFiber(Mode, pendingProps, key, mode);
10369
10370 // TODO: The Mode fiber shouldn't have a type. It has a tag.
10371 var type = (mode & ConcurrentMode) === NoContext ? REACT_STRICT_MODE_TYPE : REACT_CONCURRENT_MODE_TYPE;
10372 fiber.elementType = type;
10373 fiber.type = type;
10374
10375 fiber.expirationTime = expirationTime;
10376 return fiber;
10377}
10378
10379function createFiberFromSuspense(pendingProps, mode, expirationTime, key) {
10380 var fiber = createFiber(SuspenseComponent, pendingProps, key, mode);
10381
10382 // TODO: The SuspenseComponent fiber shouldn't have a type. It has a tag.
10383 var type = REACT_SUSPENSE_TYPE;
10384 fiber.elementType = type;
10385 fiber.type = type;
10386
10387 fiber.expirationTime = expirationTime;
10388 return fiber;
10389}
10390
10391function createFiberFromText(content, mode, expirationTime) {
10392 var fiber = createFiber(HostText, content, null, mode);
10393 fiber.expirationTime = expirationTime;
10394 return fiber;
10395}
10396
10397function createFiberFromHostInstanceForDeletion() {
10398 var fiber = createFiber(HostComponent, null, null, NoContext);
10399 // TODO: These should not need a type.
10400 fiber.elementType = 'DELETED';
10401 fiber.type = 'DELETED';
10402 return fiber;
10403}
10404
10405function createFiberFromPortal(portal, mode, expirationTime) {
10406 var pendingProps = portal.children !== null ? portal.children : [];
10407 var fiber = createFiber(HostPortal, pendingProps, portal.key, mode);
10408 fiber.expirationTime = expirationTime;
10409 fiber.stateNode = {
10410 containerInfo: portal.containerInfo,
10411 pendingChildren: null, // Used by persistent updates
10412 implementation: portal.implementation
10413 };
10414 return fiber;
10415}
10416
10417// Used for stashing WIP properties to replay failed work in DEV.
10418function assignFiberPropertiesInDEV(target, source) {
10419 if (target === null) {
10420 // This Fiber's initial properties will always be overwritten.
10421 // We only use a Fiber to ensure the same hidden class so DEV isn't slow.
10422 target = createFiber(IndeterminateComponent, null, null, NoContext);
10423 }
10424
10425 // This is intentionally written as a list of all properties.
10426 // We tried to use Object.assign() instead but this is called in
10427 // the hottest path, and Object.assign() was too slow:
10428 // https://github.com/facebook/react/issues/12502
10429 // This code is DEV-only so size is not a concern.
10430
10431 target.tag = source.tag;
10432 target.key = source.key;
10433 target.elementType = source.elementType;
10434 target.type = source.type;
10435 target.stateNode = source.stateNode;
10436 target.return = source.return;
10437 target.child = source.child;
10438 target.sibling = source.sibling;
10439 target.index = source.index;
10440 target.ref = source.ref;
10441 target.pendingProps = source.pendingProps;
10442 target.memoizedProps = source.memoizedProps;
10443 target.updateQueue = source.updateQueue;
10444 target.memoizedState = source.memoizedState;
10445 target.contextDependencies = source.contextDependencies;
10446 target.mode = source.mode;
10447 target.effectTag = source.effectTag;
10448 target.nextEffect = source.nextEffect;
10449 target.firstEffect = source.firstEffect;
10450 target.lastEffect = source.lastEffect;
10451 target.expirationTime = source.expirationTime;
10452 target.childExpirationTime = source.childExpirationTime;
10453 target.alternate = source.alternate;
10454 if (enableProfilerTimer) {
10455 target.actualDuration = source.actualDuration;
10456 target.actualStartTime = source.actualStartTime;
10457 target.selfBaseDuration = source.selfBaseDuration;
10458 target.treeBaseDuration = source.treeBaseDuration;
10459 }
10460 target._debugID = source._debugID;
10461 target._debugSource = source._debugSource;
10462 target._debugOwner = source._debugOwner;
10463 target._debugIsCurrentlyTiming = source._debugIsCurrentlyTiming;
10464 return target;
10465}
10466
10467var ReactInternals$2 = React.__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED;
10468
10469var _ReactInternals$Sched$1 = ReactInternals$2.SchedulerTracing;
10470var __interactionsRef = _ReactInternals$Sched$1.__interactionsRef;
10471var __subscriberRef = _ReactInternals$Sched$1.__subscriberRef;
10472var unstable_clear = _ReactInternals$Sched$1.unstable_clear;
10473var unstable_getCurrent = _ReactInternals$Sched$1.unstable_getCurrent;
10474var unstable_getThreadID = _ReactInternals$Sched$1.unstable_getThreadID;
10475var unstable_subscribe = _ReactInternals$Sched$1.unstable_subscribe;
10476var unstable_trace = _ReactInternals$Sched$1.unstable_trace;
10477var unstable_unsubscribe = _ReactInternals$Sched$1.unstable_unsubscribe;
10478var unstable_wrap = _ReactInternals$Sched$1.unstable_wrap;
10479
10480// TODO: This should be lifted into the renderer.
10481
10482
10483// The following attributes are only used by interaction tracing builds.
10484// They enable interactions to be associated with their async work,
10485// And expose interaction metadata to the React DevTools Profiler plugin.
10486// Note that these attributes are only defined when the enableSchedulerTracing flag is enabled.
10487
10488
10489// Exported FiberRoot type includes all properties,
10490// To avoid requiring potentially error-prone :any casts throughout the project.
10491// Profiling properties are only safe to access in profiling builds (when enableSchedulerTracing is true).
10492// The types are defined separately within this file to ensure they stay in sync.
10493// (We don't have to use an inline :any cast when enableSchedulerTracing is disabled.)
10494
10495
10496function createFiberRoot(containerInfo, isConcurrent, hydrate) {
10497 // Cyclic construction. This cheats the type system right now because
10498 // stateNode is any.
10499 var uninitializedFiber = createHostRootFiber(isConcurrent);
10500
10501 var root = void 0;
10502 if (enableSchedulerTracing) {
10503 root = {
10504 current: uninitializedFiber,
10505 containerInfo: containerInfo,
10506 pendingChildren: null,
10507
10508 earliestPendingTime: NoWork,
10509 latestPendingTime: NoWork,
10510 earliestSuspendedTime: NoWork,
10511 latestSuspendedTime: NoWork,
10512 latestPingedTime: NoWork,
10513
10514 pingCache: null,
10515
10516 didError: false,
10517
10518 pendingCommitExpirationTime: NoWork,
10519 finishedWork: null,
10520 timeoutHandle: noTimeout,
10521 context: null,
10522 pendingContext: null,
10523 hydrate: hydrate,
10524 nextExpirationTimeToWorkOn: NoWork,
10525 expirationTime: NoWork,
10526 firstBatch: null,
10527 nextScheduledRoot: null,
10528
10529 interactionThreadID: unstable_getThreadID(),
10530 memoizedInteractions: new Set(),
10531 pendingInteractionMap: new Map()
10532 };
10533 } else {
10534 root = {
10535 current: uninitializedFiber,
10536 containerInfo: containerInfo,
10537 pendingChildren: null,
10538
10539 pingCache: null,
10540
10541 earliestPendingTime: NoWork,
10542 latestPendingTime: NoWork,
10543 earliestSuspendedTime: NoWork,
10544 latestSuspendedTime: NoWork,
10545 latestPingedTime: NoWork,
10546
10547 didError: false,
10548
10549 pendingCommitExpirationTime: NoWork,
10550 finishedWork: null,
10551 timeoutHandle: noTimeout,
10552 context: null,
10553 pendingContext: null,
10554 hydrate: hydrate,
10555 nextExpirationTimeToWorkOn: NoWork,
10556 expirationTime: NoWork,
10557 firstBatch: null,
10558 nextScheduledRoot: null
10559 };
10560 }
10561
10562 uninitializedFiber.stateNode = root;
10563
10564 // The reason for the way the Flow types are structured in this file,
10565 // Is to avoid needing :any casts everywhere interaction tracing fields are used.
10566 // Unfortunately that requires an :any cast for non-interaction tracing capable builds.
10567 // $FlowFixMe Remove this :any cast and replace it with something better.
10568 return root;
10569}
10570
10571/**
10572 * Forked from fbjs/warning:
10573 * https://github.com/facebook/fbjs/blob/e66ba20ad5be433eb54423f2b097d829324d9de6/packages/fbjs/src/__forks__/warning.js
10574 *
10575 * Only change is we use console.warn instead of console.error,
10576 * and do nothing when 'console' is not supported.
10577 * This really simplifies the code.
10578 * ---
10579 * Similar to invariant but only logs a warning if the condition is not met.
10580 * This can be used to log issues in development environments in critical
10581 * paths. Removing the logging code for production environments will keep the
10582 * same logic and follow the same code paths.
10583 */
10584
10585var lowPriorityWarning = function () {};
10586
10587{
10588 var printWarning$1 = function (format) {
10589 for (var _len = arguments.length, args = Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) {
10590 args[_key - 1] = arguments[_key];
10591 }
10592
10593 var argIndex = 0;
10594 var message = 'Warning: ' + format.replace(/%s/g, function () {
10595 return args[argIndex++];
10596 });
10597 if (typeof console !== 'undefined') {
10598 console.warn(message);
10599 }
10600 try {
10601 // --- Welcome to debugging React ---
10602 // This error was thrown as a convenience so that you can use this stack
10603 // to find the callsite that caused this warning to fire.
10604 throw new Error(message);
10605 } catch (x) {}
10606 };
10607
10608 lowPriorityWarning = function (condition, format) {
10609 if (format === undefined) {
10610 throw new Error('`lowPriorityWarning(condition, format, ...args)` requires a warning ' + 'message argument');
10611 }
10612 if (!condition) {
10613 for (var _len2 = arguments.length, args = Array(_len2 > 2 ? _len2 - 2 : 0), _key2 = 2; _key2 < _len2; _key2++) {
10614 args[_key2 - 2] = arguments[_key2];
10615 }
10616
10617 printWarning$1.apply(undefined, [format].concat(args));
10618 }
10619 };
10620}
10621
10622var lowPriorityWarning$1 = lowPriorityWarning;
10623
10624var ReactStrictModeWarnings = {
10625 discardPendingWarnings: function () {},
10626 flushPendingDeprecationWarnings: function () {},
10627 flushPendingUnsafeLifecycleWarnings: function () {},
10628 recordDeprecationWarnings: function (fiber, instance) {},
10629 recordUnsafeLifecycleWarnings: function (fiber, instance) {},
10630 recordLegacyContextWarning: function (fiber, instance) {},
10631 flushLegacyContextWarning: function () {}
10632};
10633
10634{
10635 var LIFECYCLE_SUGGESTIONS = {
10636 UNSAFE_componentWillMount: 'componentDidMount',
10637 UNSAFE_componentWillReceiveProps: 'static getDerivedStateFromProps',
10638 UNSAFE_componentWillUpdate: 'componentDidUpdate'
10639 };
10640
10641 var pendingComponentWillMountWarnings = [];
10642 var pendingComponentWillReceivePropsWarnings = [];
10643 var pendingComponentWillUpdateWarnings = [];
10644 var pendingUnsafeLifecycleWarnings = new Map();
10645 var pendingLegacyContextWarning = new Map();
10646
10647 // Tracks components we have already warned about.
10648 var didWarnAboutDeprecatedLifecycles = new Set();
10649 var didWarnAboutUnsafeLifecycles = new Set();
10650 var didWarnAboutLegacyContext = new Set();
10651
10652 var setToSortedString = function (set) {
10653 var array = [];
10654 set.forEach(function (value) {
10655 array.push(value);
10656 });
10657 return array.sort().join(', ');
10658 };
10659
10660 ReactStrictModeWarnings.discardPendingWarnings = function () {
10661 pendingComponentWillMountWarnings = [];
10662 pendingComponentWillReceivePropsWarnings = [];
10663 pendingComponentWillUpdateWarnings = [];
10664 pendingUnsafeLifecycleWarnings = new Map();
10665 pendingLegacyContextWarning = new Map();
10666 };
10667
10668 ReactStrictModeWarnings.flushPendingUnsafeLifecycleWarnings = function () {
10669 pendingUnsafeLifecycleWarnings.forEach(function (lifecycleWarningsMap, strictRoot) {
10670 var lifecyclesWarningMessages = [];
10671
10672 Object.keys(lifecycleWarningsMap).forEach(function (lifecycle) {
10673 var lifecycleWarnings = lifecycleWarningsMap[lifecycle];
10674 if (lifecycleWarnings.length > 0) {
10675 var componentNames = new Set();
10676 lifecycleWarnings.forEach(function (fiber) {
10677 componentNames.add(getComponentName(fiber.type) || 'Component');
10678 didWarnAboutUnsafeLifecycles.add(fiber.type);
10679 });
10680
10681 var formatted = lifecycle.replace('UNSAFE_', '');
10682 var suggestion = LIFECYCLE_SUGGESTIONS[lifecycle];
10683 var sortedComponentNames = setToSortedString(componentNames);
10684
10685 lifecyclesWarningMessages.push(formatted + ': Please update the following components to use ' + (suggestion + ' instead: ' + sortedComponentNames));
10686 }
10687 });
10688
10689 if (lifecyclesWarningMessages.length > 0) {
10690 var strictRootComponentStack = getStackByFiberInDevAndProd(strictRoot);
10691
10692 warningWithoutStack$1(false, 'Unsafe lifecycle methods were found within a strict-mode tree:%s' + '\n\n%s' + '\n\nLearn more about this warning here:' + '\nhttps://fb.me/react-strict-mode-warnings', strictRootComponentStack, lifecyclesWarningMessages.join('\n\n'));
10693 }
10694 });
10695
10696 pendingUnsafeLifecycleWarnings = new Map();
10697 };
10698
10699 var findStrictRoot = function (fiber) {
10700 var maybeStrictRoot = null;
10701
10702 var node = fiber;
10703 while (node !== null) {
10704 if (node.mode & StrictMode) {
10705 maybeStrictRoot = node;
10706 }
10707 node = node.return;
10708 }
10709
10710 return maybeStrictRoot;
10711 };
10712
10713 ReactStrictModeWarnings.flushPendingDeprecationWarnings = function () {
10714 if (pendingComponentWillMountWarnings.length > 0) {
10715 var uniqueNames = new Set();
10716 pendingComponentWillMountWarnings.forEach(function (fiber) {
10717 uniqueNames.add(getComponentName(fiber.type) || 'Component');
10718 didWarnAboutDeprecatedLifecycles.add(fiber.type);
10719 });
10720
10721 var sortedNames = setToSortedString(uniqueNames);
10722
10723 lowPriorityWarning$1(false, 'componentWillMount is deprecated and will be removed in the next major version. ' + 'Use componentDidMount instead. As a temporary workaround, ' + 'you can rename to UNSAFE_componentWillMount.' + '\n\nPlease update the following components: %s' + '\n\nLearn more about this warning here:' + '\nhttps://fb.me/react-async-component-lifecycle-hooks', sortedNames);
10724
10725 pendingComponentWillMountWarnings = [];
10726 }
10727
10728 if (pendingComponentWillReceivePropsWarnings.length > 0) {
10729 var _uniqueNames = new Set();
10730 pendingComponentWillReceivePropsWarnings.forEach(function (fiber) {
10731 _uniqueNames.add(getComponentName(fiber.type) || 'Component');
10732 didWarnAboutDeprecatedLifecycles.add(fiber.type);
10733 });
10734
10735 var _sortedNames = setToSortedString(_uniqueNames);
10736
10737 lowPriorityWarning$1(false, 'componentWillReceiveProps is deprecated and will be removed in the next major version. ' + 'Use static getDerivedStateFromProps instead.' + '\n\nPlease update the following components: %s' + '\n\nLearn more about this warning here:' + '\nhttps://fb.me/react-async-component-lifecycle-hooks', _sortedNames);
10738
10739 pendingComponentWillReceivePropsWarnings = [];
10740 }
10741
10742 if (pendingComponentWillUpdateWarnings.length > 0) {
10743 var _uniqueNames2 = new Set();
10744 pendingComponentWillUpdateWarnings.forEach(function (fiber) {
10745 _uniqueNames2.add(getComponentName(fiber.type) || 'Component');
10746 didWarnAboutDeprecatedLifecycles.add(fiber.type);
10747 });
10748
10749 var _sortedNames2 = setToSortedString(_uniqueNames2);
10750
10751 lowPriorityWarning$1(false, 'componentWillUpdate is deprecated and will be removed in the next major version. ' + 'Use componentDidUpdate instead. As a temporary workaround, ' + 'you can rename to UNSAFE_componentWillUpdate.' + '\n\nPlease update the following components: %s' + '\n\nLearn more about this warning here:' + '\nhttps://fb.me/react-async-component-lifecycle-hooks', _sortedNames2);
10752
10753 pendingComponentWillUpdateWarnings = [];
10754 }
10755 };
10756
10757 ReactStrictModeWarnings.recordDeprecationWarnings = function (fiber, instance) {
10758 // Dedup strategy: Warn once per component.
10759 if (didWarnAboutDeprecatedLifecycles.has(fiber.type)) {
10760 return;
10761 }
10762
10763 // Don't warn about react-lifecycles-compat polyfilled components.
10764 if (typeof instance.componentWillMount === 'function' && instance.componentWillMount.__suppressDeprecationWarning !== true) {
10765 pendingComponentWillMountWarnings.push(fiber);
10766 }
10767 if (typeof instance.componentWillReceiveProps === 'function' && instance.componentWillReceiveProps.__suppressDeprecationWarning !== true) {
10768 pendingComponentWillReceivePropsWarnings.push(fiber);
10769 }
10770 if (typeof instance.componentWillUpdate === 'function' && instance.componentWillUpdate.__suppressDeprecationWarning !== true) {
10771 pendingComponentWillUpdateWarnings.push(fiber);
10772 }
10773 };
10774
10775 ReactStrictModeWarnings.recordUnsafeLifecycleWarnings = function (fiber, instance) {
10776 var strictRoot = findStrictRoot(fiber);
10777 if (strictRoot === null) {
10778 warningWithoutStack$1(false, 'Expected to find a StrictMode component in a strict mode tree. ' + 'This error is likely caused by a bug in React. Please file an issue.');
10779 return;
10780 }
10781
10782 // Dedup strategy: Warn once per component.
10783 // This is difficult to track any other way since component names
10784 // are often vague and are likely to collide between 3rd party libraries.
10785 // An expand property is probably okay to use here since it's DEV-only,
10786 // and will only be set in the event of serious warnings.
10787 if (didWarnAboutUnsafeLifecycles.has(fiber.type)) {
10788 return;
10789 }
10790
10791 var warningsForRoot = void 0;
10792 if (!pendingUnsafeLifecycleWarnings.has(strictRoot)) {
10793 warningsForRoot = {
10794 UNSAFE_componentWillMount: [],
10795 UNSAFE_componentWillReceiveProps: [],
10796 UNSAFE_componentWillUpdate: []
10797 };
10798
10799 pendingUnsafeLifecycleWarnings.set(strictRoot, warningsForRoot);
10800 } else {
10801 warningsForRoot = pendingUnsafeLifecycleWarnings.get(strictRoot);
10802 }
10803
10804 var unsafeLifecycles = [];
10805 if (typeof instance.componentWillMount === 'function' && instance.componentWillMount.__suppressDeprecationWarning !== true || typeof instance.UNSAFE_componentWillMount === 'function') {
10806 unsafeLifecycles.push('UNSAFE_componentWillMount');
10807 }
10808 if (typeof instance.componentWillReceiveProps === 'function' && instance.componentWillReceiveProps.__suppressDeprecationWarning !== true || typeof instance.UNSAFE_componentWillReceiveProps === 'function') {
10809 unsafeLifecycles.push('UNSAFE_componentWillReceiveProps');
10810 }
10811 if (typeof instance.componentWillUpdate === 'function' && instance.componentWillUpdate.__suppressDeprecationWarning !== true || typeof instance.UNSAFE_componentWillUpdate === 'function') {
10812 unsafeLifecycles.push('UNSAFE_componentWillUpdate');
10813 }
10814
10815 if (unsafeLifecycles.length > 0) {
10816 unsafeLifecycles.forEach(function (lifecycle) {
10817 warningsForRoot[lifecycle].push(fiber);
10818 });
10819 }
10820 };
10821
10822 ReactStrictModeWarnings.recordLegacyContextWarning = function (fiber, instance) {
10823 var strictRoot = findStrictRoot(fiber);
10824 if (strictRoot === null) {
10825 warningWithoutStack$1(false, 'Expected to find a StrictMode component in a strict mode tree. ' + 'This error is likely caused by a bug in React. Please file an issue.');
10826 return;
10827 }
10828
10829 // Dedup strategy: Warn once per component.
10830 if (didWarnAboutLegacyContext.has(fiber.type)) {
10831 return;
10832 }
10833
10834 var warningsForRoot = pendingLegacyContextWarning.get(strictRoot);
10835
10836 if (fiber.type.contextTypes != null || fiber.type.childContextTypes != null || instance !== null && typeof instance.getChildContext === 'function') {
10837 if (warningsForRoot === undefined) {
10838 warningsForRoot = [];
10839 pendingLegacyContextWarning.set(strictRoot, warningsForRoot);
10840 }
10841 warningsForRoot.push(fiber);
10842 }
10843 };
10844
10845 ReactStrictModeWarnings.flushLegacyContextWarning = function () {
10846 pendingLegacyContextWarning.forEach(function (fiberArray, strictRoot) {
10847 var uniqueNames = new Set();
10848 fiberArray.forEach(function (fiber) {
10849 uniqueNames.add(getComponentName(fiber.type) || 'Component');
10850 didWarnAboutLegacyContext.add(fiber.type);
10851 });
10852
10853 var sortedNames = setToSortedString(uniqueNames);
10854 var strictRootComponentStack = getStackByFiberInDevAndProd(strictRoot);
10855
10856 warningWithoutStack$1(false, 'Legacy context API has been detected within a strict-mode tree: %s' + '\n\nPlease update the following components: %s' + '\n\nLearn more about this warning here:' + '\nhttps://fb.me/react-strict-mode-warnings', strictRootComponentStack, sortedNames);
10857 });
10858 };
10859}
10860
10861// This lets us hook into Fiber to debug what it's doing.
10862// See https://github.com/facebook/react/pull/8033.
10863// This is not part of the public API, not even for React DevTools.
10864// You may only inject a debugTool if you work on React Fiber itself.
10865var ReactFiberInstrumentation = {
10866 debugTool: null
10867};
10868
10869var ReactFiberInstrumentation_1 = ReactFiberInstrumentation;
10870
10871// TODO: Offscreen updates should never suspend. However, a promise that
10872// suspended inside an offscreen subtree should be able to ping at the priority
10873// of the outer render.
10874
10875function markPendingPriorityLevel(root, expirationTime) {
10876 // If there's a gap between completing a failed root and retrying it,
10877 // additional updates may be scheduled. Clear `didError`, in case the update
10878 // is sufficient to fix the error.
10879 root.didError = false;
10880
10881 // Update the latest and earliest pending times
10882 var earliestPendingTime = root.earliestPendingTime;
10883 if (earliestPendingTime === NoWork) {
10884 // No other pending updates.
10885 root.earliestPendingTime = root.latestPendingTime = expirationTime;
10886 } else {
10887 if (earliestPendingTime < expirationTime) {
10888 // This is the earliest pending update.
10889 root.earliestPendingTime = expirationTime;
10890 } else {
10891 var latestPendingTime = root.latestPendingTime;
10892 if (latestPendingTime > expirationTime) {
10893 // This is the latest pending update
10894 root.latestPendingTime = expirationTime;
10895 }
10896 }
10897 }
10898 findNextExpirationTimeToWorkOn(expirationTime, root);
10899}
10900
10901function markCommittedPriorityLevels(root, earliestRemainingTime) {
10902 root.didError = false;
10903
10904 if (earliestRemainingTime === NoWork) {
10905 // Fast path. There's no remaining work. Clear everything.
10906 root.earliestPendingTime = NoWork;
10907 root.latestPendingTime = NoWork;
10908 root.earliestSuspendedTime = NoWork;
10909 root.latestSuspendedTime = NoWork;
10910 root.latestPingedTime = NoWork;
10911 findNextExpirationTimeToWorkOn(NoWork, root);
10912 return;
10913 }
10914
10915 if (earliestRemainingTime < root.latestPingedTime) {
10916 root.latestPingedTime = NoWork;
10917 }
10918
10919 // Let's see if the previous latest known pending level was just flushed.
10920 var latestPendingTime = root.latestPendingTime;
10921 if (latestPendingTime !== NoWork) {
10922 if (latestPendingTime > earliestRemainingTime) {
10923 // We've flushed all the known pending levels.
10924 root.earliestPendingTime = root.latestPendingTime = NoWork;
10925 } else {
10926 var earliestPendingTime = root.earliestPendingTime;
10927 if (earliestPendingTime > earliestRemainingTime) {
10928 // We've flushed the earliest known pending level. Set this to the
10929 // latest pending time.
10930 root.earliestPendingTime = root.latestPendingTime;
10931 }
10932 }
10933 }
10934
10935 // Now let's handle the earliest remaining level in the whole tree. We need to
10936 // decide whether to treat it as a pending level or as suspended. Check
10937 // it falls within the range of known suspended levels.
10938
10939 var earliestSuspendedTime = root.earliestSuspendedTime;
10940 if (earliestSuspendedTime === NoWork) {
10941 // There's no suspended work. Treat the earliest remaining level as a
10942 // pending level.
10943 markPendingPriorityLevel(root, earliestRemainingTime);
10944 findNextExpirationTimeToWorkOn(NoWork, root);
10945 return;
10946 }
10947
10948 var latestSuspendedTime = root.latestSuspendedTime;
10949 if (earliestRemainingTime < latestSuspendedTime) {
10950 // The earliest remaining level is later than all the suspended work. That
10951 // means we've flushed all the suspended work.
10952 root.earliestSuspendedTime = NoWork;
10953 root.latestSuspendedTime = NoWork;
10954 root.latestPingedTime = NoWork;
10955
10956 // There's no suspended work. Treat the earliest remaining level as a
10957 // pending level.
10958 markPendingPriorityLevel(root, earliestRemainingTime);
10959 findNextExpirationTimeToWorkOn(NoWork, root);
10960 return;
10961 }
10962
10963 if (earliestRemainingTime > earliestSuspendedTime) {
10964 // The earliest remaining time is earlier than all the suspended work.
10965 // Treat it as a pending update.
10966 markPendingPriorityLevel(root, earliestRemainingTime);
10967 findNextExpirationTimeToWorkOn(NoWork, root);
10968 return;
10969 }
10970
10971 // The earliest remaining time falls within the range of known suspended
10972 // levels. We should treat this as suspended work.
10973 findNextExpirationTimeToWorkOn(NoWork, root);
10974}
10975
10976function hasLowerPriorityWork(root, erroredExpirationTime) {
10977 var latestPendingTime = root.latestPendingTime;
10978 var latestSuspendedTime = root.latestSuspendedTime;
10979 var latestPingedTime = root.latestPingedTime;
10980 return latestPendingTime !== NoWork && latestPendingTime < erroredExpirationTime || latestSuspendedTime !== NoWork && latestSuspendedTime < erroredExpirationTime || latestPingedTime !== NoWork && latestPingedTime < erroredExpirationTime;
10981}
10982
10983function isPriorityLevelSuspended(root, expirationTime) {
10984 var earliestSuspendedTime = root.earliestSuspendedTime;
10985 var latestSuspendedTime = root.latestSuspendedTime;
10986 return earliestSuspendedTime !== NoWork && expirationTime <= earliestSuspendedTime && expirationTime >= latestSuspendedTime;
10987}
10988
10989function markSuspendedPriorityLevel(root, suspendedTime) {
10990 root.didError = false;
10991 clearPing(root, suspendedTime);
10992
10993 // First, check the known pending levels and update them if needed.
10994 var earliestPendingTime = root.earliestPendingTime;
10995 var latestPendingTime = root.latestPendingTime;
10996 if (earliestPendingTime === suspendedTime) {
10997 if (latestPendingTime === suspendedTime) {
10998 // Both known pending levels were suspended. Clear them.
10999 root.earliestPendingTime = root.latestPendingTime = NoWork;
11000 } else {
11001 // The earliest pending level was suspended. Clear by setting it to the
11002 // latest pending level.
11003 root.earliestPendingTime = latestPendingTime;
11004 }
11005 } else if (latestPendingTime === suspendedTime) {
11006 // The latest pending level was suspended. Clear by setting it to the
11007 // latest pending level.
11008 root.latestPendingTime = earliestPendingTime;
11009 }
11010
11011 // Finally, update the known suspended levels.
11012 var earliestSuspendedTime = root.earliestSuspendedTime;
11013 var latestSuspendedTime = root.latestSuspendedTime;
11014 if (earliestSuspendedTime === NoWork) {
11015 // No other suspended levels.
11016 root.earliestSuspendedTime = root.latestSuspendedTime = suspendedTime;
11017 } else {
11018 if (earliestSuspendedTime < suspendedTime) {
11019 // This is the earliest suspended level.
11020 root.earliestSuspendedTime = suspendedTime;
11021 } else if (latestSuspendedTime > suspendedTime) {
11022 // This is the latest suspended level
11023 root.latestSuspendedTime = suspendedTime;
11024 }
11025 }
11026
11027 findNextExpirationTimeToWorkOn(suspendedTime, root);
11028}
11029
11030function markPingedPriorityLevel(root, pingedTime) {
11031 root.didError = false;
11032
11033 // TODO: When we add back resuming, we need to ensure the progressed work
11034 // is thrown out and not reused during the restarted render. One way to
11035 // invalidate the progressed work is to restart at expirationTime + 1.
11036 var latestPingedTime = root.latestPingedTime;
11037 if (latestPingedTime === NoWork || latestPingedTime > pingedTime) {
11038 root.latestPingedTime = pingedTime;
11039 }
11040 findNextExpirationTimeToWorkOn(pingedTime, root);
11041}
11042
11043function clearPing(root, completedTime) {
11044 var latestPingedTime = root.latestPingedTime;
11045 if (latestPingedTime >= completedTime) {
11046 root.latestPingedTime = NoWork;
11047 }
11048}
11049
11050function findEarliestOutstandingPriorityLevel(root, renderExpirationTime) {
11051 var earliestExpirationTime = renderExpirationTime;
11052
11053 var earliestPendingTime = root.earliestPendingTime;
11054 var earliestSuspendedTime = root.earliestSuspendedTime;
11055 if (earliestPendingTime > earliestExpirationTime) {
11056 earliestExpirationTime = earliestPendingTime;
11057 }
11058 if (earliestSuspendedTime > earliestExpirationTime) {
11059 earliestExpirationTime = earliestSuspendedTime;
11060 }
11061 return earliestExpirationTime;
11062}
11063
11064function didExpireAtExpirationTime(root, currentTime) {
11065 var expirationTime = root.expirationTime;
11066 if (expirationTime !== NoWork && currentTime <= expirationTime) {
11067 // The root has expired. Flush all work up to the current time.
11068 root.nextExpirationTimeToWorkOn = currentTime;
11069 }
11070}
11071
11072function findNextExpirationTimeToWorkOn(completedExpirationTime, root) {
11073 var earliestSuspendedTime = root.earliestSuspendedTime;
11074 var latestSuspendedTime = root.latestSuspendedTime;
11075 var earliestPendingTime = root.earliestPendingTime;
11076 var latestPingedTime = root.latestPingedTime;
11077
11078 // Work on the earliest pending time. Failing that, work on the latest
11079 // pinged time.
11080 var nextExpirationTimeToWorkOn = earliestPendingTime !== NoWork ? earliestPendingTime : latestPingedTime;
11081
11082 // If there is no pending or pinged work, check if there's suspended work
11083 // that's lower priority than what we just completed.
11084 if (nextExpirationTimeToWorkOn === NoWork && (completedExpirationTime === NoWork || latestSuspendedTime < completedExpirationTime)) {
11085 // The lowest priority suspended work is the work most likely to be
11086 // committed next. Let's start rendering it again, so that if it times out,
11087 // it's ready to commit.
11088 nextExpirationTimeToWorkOn = latestSuspendedTime;
11089 }
11090
11091 var expirationTime = nextExpirationTimeToWorkOn;
11092 if (expirationTime !== NoWork && earliestSuspendedTime > expirationTime) {
11093 // Expire using the earliest known expiration time.
11094 expirationTime = earliestSuspendedTime;
11095 }
11096
11097 root.nextExpirationTimeToWorkOn = nextExpirationTimeToWorkOn;
11098 root.expirationTime = expirationTime;
11099}
11100
11101function resolveDefaultProps(Component, baseProps) {
11102 if (Component && Component.defaultProps) {
11103 // Resolve default props. Taken from ReactElement
11104 var props = _assign({}, baseProps);
11105 var defaultProps = Component.defaultProps;
11106 for (var propName in defaultProps) {
11107 if (props[propName] === undefined) {
11108 props[propName] = defaultProps[propName];
11109 }
11110 }
11111 return props;
11112 }
11113 return baseProps;
11114}
11115
11116function readLazyComponentType(lazyComponent) {
11117 var status = lazyComponent._status;
11118 var result = lazyComponent._result;
11119 switch (status) {
11120 case Resolved:
11121 {
11122 var Component = result;
11123 return Component;
11124 }
11125 case Rejected:
11126 {
11127 var error = result;
11128 throw error;
11129 }
11130 case Pending:
11131 {
11132 var thenable = result;
11133 throw thenable;
11134 }
11135 default:
11136 {
11137 lazyComponent._status = Pending;
11138 var ctor = lazyComponent._ctor;
11139 var _thenable = ctor();
11140 _thenable.then(function (moduleObject) {
11141 if (lazyComponent._status === Pending) {
11142 var defaultExport = moduleObject.default;
11143 {
11144 if (defaultExport === undefined) {
11145 warning$1(false, 'lazy: Expected the result of a dynamic import() call. ' + 'Instead received: %s\n\nYour code should look like: \n ' + "const MyComponent = lazy(() => import('./MyComponent'))", moduleObject);
11146 }
11147 }
11148 lazyComponent._status = Resolved;
11149 lazyComponent._result = defaultExport;
11150 }
11151 }, function (error) {
11152 if (lazyComponent._status === Pending) {
11153 lazyComponent._status = Rejected;
11154 lazyComponent._result = error;
11155 }
11156 });
11157 // Handle synchronous thenables.
11158 switch (lazyComponent._status) {
11159 case Resolved:
11160 return lazyComponent._result;
11161 case Rejected:
11162 throw lazyComponent._result;
11163 }
11164 lazyComponent._result = _thenable;
11165 throw _thenable;
11166 }
11167 }
11168}
11169
11170var fakeInternalInstance = {};
11171var isArray$1 = Array.isArray;
11172
11173// React.Component uses a shared frozen object by default.
11174// We'll use it to determine whether we need to initialize legacy refs.
11175var emptyRefsObject = new React.Component().refs;
11176
11177var didWarnAboutStateAssignmentForComponent = void 0;
11178var didWarnAboutUninitializedState = void 0;
11179var didWarnAboutGetSnapshotBeforeUpdateWithoutDidUpdate = void 0;
11180var didWarnAboutLegacyLifecyclesAndDerivedState = void 0;
11181var didWarnAboutUndefinedDerivedState = void 0;
11182var warnOnUndefinedDerivedState = void 0;
11183var warnOnInvalidCallback$1 = void 0;
11184var didWarnAboutDirectlyAssigningPropsToState = void 0;
11185var didWarnAboutContextTypeAndContextTypes = void 0;
11186var didWarnAboutInvalidateContextType = void 0;
11187
11188{
11189 didWarnAboutStateAssignmentForComponent = new Set();
11190 didWarnAboutUninitializedState = new Set();
11191 didWarnAboutGetSnapshotBeforeUpdateWithoutDidUpdate = new Set();
11192 didWarnAboutLegacyLifecyclesAndDerivedState = new Set();
11193 didWarnAboutDirectlyAssigningPropsToState = new Set();
11194 didWarnAboutUndefinedDerivedState = new Set();
11195 didWarnAboutContextTypeAndContextTypes = new Set();
11196 didWarnAboutInvalidateContextType = new Set();
11197
11198 var didWarnOnInvalidCallback = new Set();
11199
11200 warnOnInvalidCallback$1 = function (callback, callerName) {
11201 if (callback === null || typeof callback === 'function') {
11202 return;
11203 }
11204 var key = callerName + '_' + callback;
11205 if (!didWarnOnInvalidCallback.has(key)) {
11206 didWarnOnInvalidCallback.add(key);
11207 warningWithoutStack$1(false, '%s(...): Expected the last optional `callback` argument to be a ' + 'function. Instead received: %s.', callerName, callback);
11208 }
11209 };
11210
11211 warnOnUndefinedDerivedState = function (type, partialState) {
11212 if (partialState === undefined) {
11213 var componentName = getComponentName(type) || 'Component';
11214 if (!didWarnAboutUndefinedDerivedState.has(componentName)) {
11215 didWarnAboutUndefinedDerivedState.add(componentName);
11216 warningWithoutStack$1(false, '%s.getDerivedStateFromProps(): A valid state object (or null) must be returned. ' + 'You have returned undefined.', componentName);
11217 }
11218 }
11219 };
11220
11221 // This is so gross but it's at least non-critical and can be removed if
11222 // it causes problems. This is meant to give a nicer error message for
11223 // ReactDOM15.unstable_renderSubtreeIntoContainer(reactDOM16Component,
11224 // ...)) which otherwise throws a "_processChildContext is not a function"
11225 // exception.
11226 Object.defineProperty(fakeInternalInstance, '_processChildContext', {
11227 enumerable: false,
11228 value: function () {
11229 invariant(false, '_processChildContext is not available in React 16+. This likely means you have multiple copies of React and are attempting to nest a React 15 tree inside a React 16 tree using unstable_renderSubtreeIntoContainer, which isn\'t supported. Try to make sure you have only one copy of React (and ideally, switch to ReactDOM.createPortal).');
11230 }
11231 });
11232 Object.freeze(fakeInternalInstance);
11233}
11234
11235function applyDerivedStateFromProps(workInProgress, ctor, getDerivedStateFromProps, nextProps) {
11236 var prevState = workInProgress.memoizedState;
11237
11238 {
11239 if (debugRenderPhaseSideEffects || debugRenderPhaseSideEffectsForStrictMode && workInProgress.mode & StrictMode) {
11240 // Invoke the function an extra time to help detect side-effects.
11241 getDerivedStateFromProps(nextProps, prevState);
11242 }
11243 }
11244
11245 var partialState = getDerivedStateFromProps(nextProps, prevState);
11246
11247 {
11248 warnOnUndefinedDerivedState(ctor, partialState);
11249 }
11250 // Merge the partial state and the previous state.
11251 var memoizedState = partialState === null || partialState === undefined ? prevState : _assign({}, prevState, partialState);
11252 workInProgress.memoizedState = memoizedState;
11253
11254 // Once the update queue is empty, persist the derived state onto the
11255 // base state.
11256 var updateQueue = workInProgress.updateQueue;
11257 if (updateQueue !== null && workInProgress.expirationTime === NoWork) {
11258 updateQueue.baseState = memoizedState;
11259 }
11260}
11261
11262var classComponentUpdater = {
11263 isMounted: isMounted,
11264 enqueueSetState: function (inst, payload, callback) {
11265 var fiber = get(inst);
11266 var currentTime = requestCurrentTime();
11267 var expirationTime = computeExpirationForFiber(currentTime, fiber);
11268
11269 var update = createUpdate(expirationTime);
11270 update.payload = payload;
11271 if (callback !== undefined && callback !== null) {
11272 {
11273 warnOnInvalidCallback$1(callback, 'setState');
11274 }
11275 update.callback = callback;
11276 }
11277
11278 flushPassiveEffects();
11279 enqueueUpdate(fiber, update);
11280 scheduleWork(fiber, expirationTime);
11281 },
11282 enqueueReplaceState: function (inst, payload, callback) {
11283 var fiber = get(inst);
11284 var currentTime = requestCurrentTime();
11285 var expirationTime = computeExpirationForFiber(currentTime, fiber);
11286
11287 var update = createUpdate(expirationTime);
11288 update.tag = ReplaceState;
11289 update.payload = payload;
11290
11291 if (callback !== undefined && callback !== null) {
11292 {
11293 warnOnInvalidCallback$1(callback, 'replaceState');
11294 }
11295 update.callback = callback;
11296 }
11297
11298 flushPassiveEffects();
11299 enqueueUpdate(fiber, update);
11300 scheduleWork(fiber, expirationTime);
11301 },
11302 enqueueForceUpdate: function (inst, callback) {
11303 var fiber = get(inst);
11304 var currentTime = requestCurrentTime();
11305 var expirationTime = computeExpirationForFiber(currentTime, fiber);
11306
11307 var update = createUpdate(expirationTime);
11308 update.tag = ForceUpdate;
11309
11310 if (callback !== undefined && callback !== null) {
11311 {
11312 warnOnInvalidCallback$1(callback, 'forceUpdate');
11313 }
11314 update.callback = callback;
11315 }
11316
11317 flushPassiveEffects();
11318 enqueueUpdate(fiber, update);
11319 scheduleWork(fiber, expirationTime);
11320 }
11321};
11322
11323function checkShouldComponentUpdate(workInProgress, ctor, oldProps, newProps, oldState, newState, nextContext) {
11324 var instance = workInProgress.stateNode;
11325 if (typeof instance.shouldComponentUpdate === 'function') {
11326 startPhaseTimer(workInProgress, 'shouldComponentUpdate');
11327 var shouldUpdate = instance.shouldComponentUpdate(newProps, newState, nextContext);
11328 stopPhaseTimer();
11329
11330 {
11331 !(shouldUpdate !== undefined) ? warningWithoutStack$1(false, '%s.shouldComponentUpdate(): Returned undefined instead of a ' + 'boolean value. Make sure to return true or false.', getComponentName(ctor) || 'Component') : void 0;
11332 }
11333
11334 return shouldUpdate;
11335 }
11336
11337 if (ctor.prototype && ctor.prototype.isPureReactComponent) {
11338 return !shallowEqual(oldProps, newProps) || !shallowEqual(oldState, newState);
11339 }
11340
11341 return true;
11342}
11343
11344function checkClassInstance(workInProgress, ctor, newProps) {
11345 var instance = workInProgress.stateNode;
11346 {
11347 var name = getComponentName(ctor) || 'Component';
11348 var renderPresent = instance.render;
11349
11350 if (!renderPresent) {
11351 if (ctor.prototype && typeof ctor.prototype.render === 'function') {
11352 warningWithoutStack$1(false, '%s(...): No `render` method found on the returned component ' + 'instance: did you accidentally return an object from the constructor?', name);
11353 } else {
11354 warningWithoutStack$1(false, '%s(...): No `render` method found on the returned component ' + 'instance: you may have forgotten to define `render`.', name);
11355 }
11356 }
11357
11358 var noGetInitialStateOnES6 = !instance.getInitialState || instance.getInitialState.isReactClassApproved || instance.state;
11359 !noGetInitialStateOnES6 ? warningWithoutStack$1(false, 'getInitialState was defined on %s, a plain JavaScript class. ' + 'This is only supported for classes created using React.createClass. ' + 'Did you mean to define a state property instead?', name) : void 0;
11360 var noGetDefaultPropsOnES6 = !instance.getDefaultProps || instance.getDefaultProps.isReactClassApproved;
11361 !noGetDefaultPropsOnES6 ? warningWithoutStack$1(false, 'getDefaultProps was defined on %s, a plain JavaScript class. ' + 'This is only supported for classes created using React.createClass. ' + 'Use a static property to define defaultProps instead.', name) : void 0;
11362 var noInstancePropTypes = !instance.propTypes;
11363 !noInstancePropTypes ? warningWithoutStack$1(false, 'propTypes was defined as an instance property on %s. Use a static ' + 'property to define propTypes instead.', name) : void 0;
11364 var noInstanceContextType = !instance.contextType;
11365 !noInstanceContextType ? warningWithoutStack$1(false, 'contextType was defined as an instance property on %s. Use a static ' + 'property to define contextType instead.', name) : void 0;
11366 var noInstanceContextTypes = !instance.contextTypes;
11367 !noInstanceContextTypes ? warningWithoutStack$1(false, 'contextTypes was defined as an instance property on %s. Use a static ' + 'property to define contextTypes instead.', name) : void 0;
11368
11369 if (ctor.contextType && ctor.contextTypes && !didWarnAboutContextTypeAndContextTypes.has(ctor)) {
11370 didWarnAboutContextTypeAndContextTypes.add(ctor);
11371 warningWithoutStack$1(false, '%s declares both contextTypes and contextType static properties. ' + 'The legacy contextTypes property will be ignored.', name);
11372 }
11373
11374 var noComponentShouldUpdate = typeof instance.componentShouldUpdate !== 'function';
11375 !noComponentShouldUpdate ? warningWithoutStack$1(false, '%s has a method called ' + 'componentShouldUpdate(). Did you mean shouldComponentUpdate()? ' + 'The name is phrased as a question because the function is ' + 'expected to return a value.', name) : void 0;
11376 if (ctor.prototype && ctor.prototype.isPureReactComponent && typeof instance.shouldComponentUpdate !== 'undefined') {
11377 warningWithoutStack$1(false, '%s has a method called shouldComponentUpdate(). ' + 'shouldComponentUpdate should not be used when extending React.PureComponent. ' + 'Please extend React.Component if shouldComponentUpdate is used.', getComponentName(ctor) || 'A pure component');
11378 }
11379 var noComponentDidUnmount = typeof instance.componentDidUnmount !== 'function';
11380 !noComponentDidUnmount ? warningWithoutStack$1(false, '%s has a method called ' + 'componentDidUnmount(). But there is no such lifecycle method. ' + 'Did you mean componentWillUnmount()?', name) : void 0;
11381 var noComponentDidReceiveProps = typeof instance.componentDidReceiveProps !== 'function';
11382 !noComponentDidReceiveProps ? warningWithoutStack$1(false, '%s has a method called ' + 'componentDidReceiveProps(). But there is no such lifecycle method. ' + 'If you meant to update the state in response to changing props, ' + 'use componentWillReceiveProps(). If you meant to fetch data or ' + 'run side-effects or mutations after React has updated the UI, use componentDidUpdate().', name) : void 0;
11383 var noComponentWillRecieveProps = typeof instance.componentWillRecieveProps !== 'function';
11384 !noComponentWillRecieveProps ? warningWithoutStack$1(false, '%s has a method called ' + 'componentWillRecieveProps(). Did you mean componentWillReceiveProps()?', name) : void 0;
11385 var noUnsafeComponentWillRecieveProps = typeof instance.UNSAFE_componentWillRecieveProps !== 'function';
11386 !noUnsafeComponentWillRecieveProps ? warningWithoutStack$1(false, '%s has a method called ' + 'UNSAFE_componentWillRecieveProps(). Did you mean UNSAFE_componentWillReceiveProps()?', name) : void 0;
11387 var hasMutatedProps = instance.props !== newProps;
11388 !(instance.props === undefined || !hasMutatedProps) ? warningWithoutStack$1(false, '%s(...): When calling super() in `%s`, make sure to pass ' + "up the same props that your component's constructor was passed.", name, name) : void 0;
11389 var noInstanceDefaultProps = !instance.defaultProps;
11390 !noInstanceDefaultProps ? warningWithoutStack$1(false, 'Setting defaultProps as an instance property on %s is not supported and will be ignored.' + ' Instead, define defaultProps as a static property on %s.', name, name) : void 0;
11391
11392 if (typeof instance.getSnapshotBeforeUpdate === 'function' && typeof instance.componentDidUpdate !== 'function' && !didWarnAboutGetSnapshotBeforeUpdateWithoutDidUpdate.has(ctor)) {
11393 didWarnAboutGetSnapshotBeforeUpdateWithoutDidUpdate.add(ctor);
11394 warningWithoutStack$1(false, '%s: getSnapshotBeforeUpdate() should be used with componentDidUpdate(). ' + 'This component defines getSnapshotBeforeUpdate() only.', getComponentName(ctor));
11395 }
11396
11397 var noInstanceGetDerivedStateFromProps = typeof instance.getDerivedStateFromProps !== 'function';
11398 !noInstanceGetDerivedStateFromProps ? warningWithoutStack$1(false, '%s: getDerivedStateFromProps() is defined as an instance method ' + 'and will be ignored. Instead, declare it as a static method.', name) : void 0;
11399 var noInstanceGetDerivedStateFromCatch = typeof instance.getDerivedStateFromError !== 'function';
11400 !noInstanceGetDerivedStateFromCatch ? warningWithoutStack$1(false, '%s: getDerivedStateFromError() is defined as an instance method ' + 'and will be ignored. Instead, declare it as a static method.', name) : void 0;
11401 var noStaticGetSnapshotBeforeUpdate = typeof ctor.getSnapshotBeforeUpdate !== 'function';
11402 !noStaticGetSnapshotBeforeUpdate ? warningWithoutStack$1(false, '%s: getSnapshotBeforeUpdate() is defined as a static method ' + 'and will be ignored. Instead, declare it as an instance method.', name) : void 0;
11403 var _state = instance.state;
11404 if (_state && (typeof _state !== 'object' || isArray$1(_state))) {
11405 warningWithoutStack$1(false, '%s.state: must be set to an object or null', name);
11406 }
11407 if (typeof instance.getChildContext === 'function') {
11408 !(typeof ctor.childContextTypes === 'object') ? warningWithoutStack$1(false, '%s.getChildContext(): childContextTypes must be defined in order to ' + 'use getChildContext().', name) : void 0;
11409 }
11410 }
11411}
11412
11413function adoptClassInstance(workInProgress, instance) {
11414 instance.updater = classComponentUpdater;
11415 workInProgress.stateNode = instance;
11416 // The instance needs access to the fiber so that it can schedule updates
11417 set(instance, workInProgress);
11418 {
11419 instance._reactInternalInstance = fakeInternalInstance;
11420 }
11421}
11422
11423function constructClassInstance(workInProgress, ctor, props, renderExpirationTime) {
11424 var isLegacyContextConsumer = false;
11425 var unmaskedContext = emptyContextObject;
11426 var context = null;
11427 var contextType = ctor.contextType;
11428 if (typeof contextType === 'object' && contextType !== null) {
11429 {
11430 if (contextType.$$typeof !== REACT_CONTEXT_TYPE && !didWarnAboutInvalidateContextType.has(ctor)) {
11431 didWarnAboutInvalidateContextType.add(ctor);
11432 warningWithoutStack$1(false, '%s defines an invalid contextType. ' + 'contextType should point to the Context object returned by React.createContext(). ' + 'Did you accidentally pass the Context.Provider instead?', getComponentName(ctor) || 'Component');
11433 }
11434 }
11435
11436 context = readContext(contextType);
11437 } else {
11438 unmaskedContext = getUnmaskedContext(workInProgress, ctor, true);
11439 var contextTypes = ctor.contextTypes;
11440 isLegacyContextConsumer = contextTypes !== null && contextTypes !== undefined;
11441 context = isLegacyContextConsumer ? getMaskedContext(workInProgress, unmaskedContext) : emptyContextObject;
11442 }
11443
11444 // Instantiate twice to help detect side-effects.
11445 {
11446 if (debugRenderPhaseSideEffects || debugRenderPhaseSideEffectsForStrictMode && workInProgress.mode & StrictMode) {
11447 new ctor(props, context); // eslint-disable-line no-new
11448 }
11449 }
11450
11451 var instance = new ctor(props, context);
11452 var state = workInProgress.memoizedState = instance.state !== null && instance.state !== undefined ? instance.state : null;
11453 adoptClassInstance(workInProgress, instance);
11454
11455 {
11456 if (typeof ctor.getDerivedStateFromProps === 'function' && state === null) {
11457 var componentName = getComponentName(ctor) || 'Component';
11458 if (!didWarnAboutUninitializedState.has(componentName)) {
11459 didWarnAboutUninitializedState.add(componentName);
11460 warningWithoutStack$1(false, '`%s` uses `getDerivedStateFromProps` but its initial state is ' + '%s. This is not recommended. Instead, define the initial state by ' + 'assigning an object to `this.state` in the constructor of `%s`. ' + 'This ensures that `getDerivedStateFromProps` arguments have a consistent shape.', componentName, instance.state === null ? 'null' : 'undefined', componentName);
11461 }
11462 }
11463
11464 // If new component APIs are defined, "unsafe" lifecycles won't be called.
11465 // Warn about these lifecycles if they are present.
11466 // Don't warn about react-lifecycles-compat polyfilled methods though.
11467 if (typeof ctor.getDerivedStateFromProps === 'function' || typeof instance.getSnapshotBeforeUpdate === 'function') {
11468 var foundWillMountName = null;
11469 var foundWillReceivePropsName = null;
11470 var foundWillUpdateName = null;
11471 if (typeof instance.componentWillMount === 'function' && instance.componentWillMount.__suppressDeprecationWarning !== true) {
11472 foundWillMountName = 'componentWillMount';
11473 } else if (typeof instance.UNSAFE_componentWillMount === 'function') {
11474 foundWillMountName = 'UNSAFE_componentWillMount';
11475 }
11476 if (typeof instance.componentWillReceiveProps === 'function' && instance.componentWillReceiveProps.__suppressDeprecationWarning !== true) {
11477 foundWillReceivePropsName = 'componentWillReceiveProps';
11478 } else if (typeof instance.UNSAFE_componentWillReceiveProps === 'function') {
11479 foundWillReceivePropsName = 'UNSAFE_componentWillReceiveProps';
11480 }
11481 if (typeof instance.componentWillUpdate === 'function' && instance.componentWillUpdate.__suppressDeprecationWarning !== true) {
11482 foundWillUpdateName = 'componentWillUpdate';
11483 } else if (typeof instance.UNSAFE_componentWillUpdate === 'function') {
11484 foundWillUpdateName = 'UNSAFE_componentWillUpdate';
11485 }
11486 if (foundWillMountName !== null || foundWillReceivePropsName !== null || foundWillUpdateName !== null) {
11487 var _componentName = getComponentName(ctor) || 'Component';
11488 var newApiName = typeof ctor.getDerivedStateFromProps === 'function' ? 'getDerivedStateFromProps()' : 'getSnapshotBeforeUpdate()';
11489 if (!didWarnAboutLegacyLifecyclesAndDerivedState.has(_componentName)) {
11490 didWarnAboutLegacyLifecyclesAndDerivedState.add(_componentName);
11491 warningWithoutStack$1(false, 'Unsafe legacy lifecycles will not be called for components using new component APIs.\n\n' + '%s uses %s but also contains the following legacy lifecycles:%s%s%s\n\n' + 'The above lifecycles should be removed. Learn more about this warning here:\n' + 'https://fb.me/react-async-component-lifecycle-hooks', _componentName, newApiName, foundWillMountName !== null ? '\n ' + foundWillMountName : '', foundWillReceivePropsName !== null ? '\n ' + foundWillReceivePropsName : '', foundWillUpdateName !== null ? '\n ' + foundWillUpdateName : '');
11492 }
11493 }
11494 }
11495 }
11496
11497 // Cache unmasked context so we can avoid recreating masked context unless necessary.
11498 // ReactFiberContext usually updates this cache but can't for newly-created instances.
11499 if (isLegacyContextConsumer) {
11500 cacheContext(workInProgress, unmaskedContext, context);
11501 }
11502
11503 return instance;
11504}
11505
11506function callComponentWillMount(workInProgress, instance) {
11507 startPhaseTimer(workInProgress, 'componentWillMount');
11508 var oldState = instance.state;
11509
11510 if (typeof instance.componentWillMount === 'function') {
11511 instance.componentWillMount();
11512 }
11513 if (typeof instance.UNSAFE_componentWillMount === 'function') {
11514 instance.UNSAFE_componentWillMount();
11515 }
11516
11517 stopPhaseTimer();
11518
11519 if (oldState !== instance.state) {
11520 {
11521 warningWithoutStack$1(false, '%s.componentWillMount(): Assigning directly to this.state is ' + "deprecated (except inside a component's " + 'constructor). Use setState instead.', getComponentName(workInProgress.type) || 'Component');
11522 }
11523 classComponentUpdater.enqueueReplaceState(instance, instance.state, null);
11524 }
11525}
11526
11527function callComponentWillReceiveProps(workInProgress, instance, newProps, nextContext) {
11528 var oldState = instance.state;
11529 startPhaseTimer(workInProgress, 'componentWillReceiveProps');
11530 if (typeof instance.componentWillReceiveProps === 'function') {
11531 instance.componentWillReceiveProps(newProps, nextContext);
11532 }
11533 if (typeof instance.UNSAFE_componentWillReceiveProps === 'function') {
11534 instance.UNSAFE_componentWillReceiveProps(newProps, nextContext);
11535 }
11536 stopPhaseTimer();
11537
11538 if (instance.state !== oldState) {
11539 {
11540 var componentName = getComponentName(workInProgress.type) || 'Component';
11541 if (!didWarnAboutStateAssignmentForComponent.has(componentName)) {
11542 didWarnAboutStateAssignmentForComponent.add(componentName);
11543 warningWithoutStack$1(false, '%s.componentWillReceiveProps(): Assigning directly to ' + "this.state is deprecated (except inside a component's " + 'constructor). Use setState instead.', componentName);
11544 }
11545 }
11546 classComponentUpdater.enqueueReplaceState(instance, instance.state, null);
11547 }
11548}
11549
11550// Invokes the mount life-cycles on a previously never rendered instance.
11551function mountClassInstance(workInProgress, ctor, newProps, renderExpirationTime) {
11552 {
11553 checkClassInstance(workInProgress, ctor, newProps);
11554 }
11555
11556 var instance = workInProgress.stateNode;
11557 instance.props = newProps;
11558 instance.state = workInProgress.memoizedState;
11559 instance.refs = emptyRefsObject;
11560
11561 var contextType = ctor.contextType;
11562 if (typeof contextType === 'object' && contextType !== null) {
11563 instance.context = readContext(contextType);
11564 } else {
11565 var unmaskedContext = getUnmaskedContext(workInProgress, ctor, true);
11566 instance.context = getMaskedContext(workInProgress, unmaskedContext);
11567 }
11568
11569 {
11570 if (instance.state === newProps) {
11571 var componentName = getComponentName(ctor) || 'Component';
11572 if (!didWarnAboutDirectlyAssigningPropsToState.has(componentName)) {
11573 didWarnAboutDirectlyAssigningPropsToState.add(componentName);
11574 warningWithoutStack$1(false, '%s: It is not recommended to assign props directly to state ' + "because updates to props won't be reflected in state. " + 'In most cases, it is better to use props directly.', componentName);
11575 }
11576 }
11577
11578 if (workInProgress.mode & StrictMode) {
11579 ReactStrictModeWarnings.recordUnsafeLifecycleWarnings(workInProgress, instance);
11580
11581 ReactStrictModeWarnings.recordLegacyContextWarning(workInProgress, instance);
11582 }
11583
11584 if (warnAboutDeprecatedLifecycles) {
11585 ReactStrictModeWarnings.recordDeprecationWarnings(workInProgress, instance);
11586 }
11587 }
11588
11589 var updateQueue = workInProgress.updateQueue;
11590 if (updateQueue !== null) {
11591 processUpdateQueue(workInProgress, updateQueue, newProps, instance, renderExpirationTime);
11592 instance.state = workInProgress.memoizedState;
11593 }
11594
11595 var getDerivedStateFromProps = ctor.getDerivedStateFromProps;
11596 if (typeof getDerivedStateFromProps === 'function') {
11597 applyDerivedStateFromProps(workInProgress, ctor, getDerivedStateFromProps, newProps);
11598 instance.state = workInProgress.memoizedState;
11599 }
11600
11601 // In order to support react-lifecycles-compat polyfilled components,
11602 // Unsafe lifecycles should not be invoked for components using the new APIs.
11603 if (typeof ctor.getDerivedStateFromProps !== 'function' && typeof instance.getSnapshotBeforeUpdate !== 'function' && (typeof instance.UNSAFE_componentWillMount === 'function' || typeof instance.componentWillMount === 'function')) {
11604 callComponentWillMount(workInProgress, instance);
11605 // If we had additional state updates during this life-cycle, let's
11606 // process them now.
11607 updateQueue = workInProgress.updateQueue;
11608 if (updateQueue !== null) {
11609 processUpdateQueue(workInProgress, updateQueue, newProps, instance, renderExpirationTime);
11610 instance.state = workInProgress.memoizedState;
11611 }
11612 }
11613
11614 if (typeof instance.componentDidMount === 'function') {
11615 workInProgress.effectTag |= Update;
11616 }
11617}
11618
11619function resumeMountClassInstance(workInProgress, ctor, newProps, renderExpirationTime) {
11620 var instance = workInProgress.stateNode;
11621
11622 var oldProps = workInProgress.memoizedProps;
11623 instance.props = oldProps;
11624
11625 var oldContext = instance.context;
11626 var contextType = ctor.contextType;
11627 var nextContext = void 0;
11628 if (typeof contextType === 'object' && contextType !== null) {
11629 nextContext = readContext(contextType);
11630 } else {
11631 var nextLegacyUnmaskedContext = getUnmaskedContext(workInProgress, ctor, true);
11632 nextContext = getMaskedContext(workInProgress, nextLegacyUnmaskedContext);
11633 }
11634
11635 var getDerivedStateFromProps = ctor.getDerivedStateFromProps;
11636 var hasNewLifecycles = typeof getDerivedStateFromProps === 'function' || typeof instance.getSnapshotBeforeUpdate === 'function';
11637
11638 // Note: During these life-cycles, instance.props/instance.state are what
11639 // ever the previously attempted to render - not the "current". However,
11640 // during componentDidUpdate we pass the "current" props.
11641
11642 // In order to support react-lifecycles-compat polyfilled components,
11643 // Unsafe lifecycles should not be invoked for components using the new APIs.
11644 if (!hasNewLifecycles && (typeof instance.UNSAFE_componentWillReceiveProps === 'function' || typeof instance.componentWillReceiveProps === 'function')) {
11645 if (oldProps !== newProps || oldContext !== nextContext) {
11646 callComponentWillReceiveProps(workInProgress, instance, newProps, nextContext);
11647 }
11648 }
11649
11650 resetHasForceUpdateBeforeProcessing();
11651
11652 var oldState = workInProgress.memoizedState;
11653 var newState = instance.state = oldState;
11654 var updateQueue = workInProgress.updateQueue;
11655 if (updateQueue !== null) {
11656 processUpdateQueue(workInProgress, updateQueue, newProps, instance, renderExpirationTime);
11657 newState = workInProgress.memoizedState;
11658 }
11659 if (oldProps === newProps && oldState === newState && !hasContextChanged() && !checkHasForceUpdateAfterProcessing()) {
11660 // If an update was already in progress, we should schedule an Update
11661 // effect even though we're bailing out, so that cWU/cDU are called.
11662 if (typeof instance.componentDidMount === 'function') {
11663 workInProgress.effectTag |= Update;
11664 }
11665 return false;
11666 }
11667
11668 if (typeof getDerivedStateFromProps === 'function') {
11669 applyDerivedStateFromProps(workInProgress, ctor, getDerivedStateFromProps, newProps);
11670 newState = workInProgress.memoizedState;
11671 }
11672
11673 var shouldUpdate = checkHasForceUpdateAfterProcessing() || checkShouldComponentUpdate(workInProgress, ctor, oldProps, newProps, oldState, newState, nextContext);
11674
11675 if (shouldUpdate) {
11676 // In order to support react-lifecycles-compat polyfilled components,
11677 // Unsafe lifecycles should not be invoked for components using the new APIs.
11678 if (!hasNewLifecycles && (typeof instance.UNSAFE_componentWillMount === 'function' || typeof instance.componentWillMount === 'function')) {
11679 startPhaseTimer(workInProgress, 'componentWillMount');
11680 if (typeof instance.componentWillMount === 'function') {
11681 instance.componentWillMount();
11682 }
11683 if (typeof instance.UNSAFE_componentWillMount === 'function') {
11684 instance.UNSAFE_componentWillMount();
11685 }
11686 stopPhaseTimer();
11687 }
11688 if (typeof instance.componentDidMount === 'function') {
11689 workInProgress.effectTag |= Update;
11690 }
11691 } else {
11692 // If an update was already in progress, we should schedule an Update
11693 // effect even though we're bailing out, so that cWU/cDU are called.
11694 if (typeof instance.componentDidMount === 'function') {
11695 workInProgress.effectTag |= Update;
11696 }
11697
11698 // If shouldComponentUpdate returned false, we should still update the
11699 // memoized state to indicate that this work can be reused.
11700 workInProgress.memoizedProps = newProps;
11701 workInProgress.memoizedState = newState;
11702 }
11703
11704 // Update the existing instance's state, props, and context pointers even
11705 // if shouldComponentUpdate returns false.
11706 instance.props = newProps;
11707 instance.state = newState;
11708 instance.context = nextContext;
11709
11710 return shouldUpdate;
11711}
11712
11713// Invokes the update life-cycles and returns false if it shouldn't rerender.
11714function updateClassInstance(current, workInProgress, ctor, newProps, renderExpirationTime) {
11715 var instance = workInProgress.stateNode;
11716
11717 var oldProps = workInProgress.memoizedProps;
11718 instance.props = workInProgress.type === workInProgress.elementType ? oldProps : resolveDefaultProps(workInProgress.type, oldProps);
11719
11720 var oldContext = instance.context;
11721 var contextType = ctor.contextType;
11722 var nextContext = void 0;
11723 if (typeof contextType === 'object' && contextType !== null) {
11724 nextContext = readContext(contextType);
11725 } else {
11726 var nextUnmaskedContext = getUnmaskedContext(workInProgress, ctor, true);
11727 nextContext = getMaskedContext(workInProgress, nextUnmaskedContext);
11728 }
11729
11730 var getDerivedStateFromProps = ctor.getDerivedStateFromProps;
11731 var hasNewLifecycles = typeof getDerivedStateFromProps === 'function' || typeof instance.getSnapshotBeforeUpdate === 'function';
11732
11733 // Note: During these life-cycles, instance.props/instance.state are what
11734 // ever the previously attempted to render - not the "current". However,
11735 // during componentDidUpdate we pass the "current" props.
11736
11737 // In order to support react-lifecycles-compat polyfilled components,
11738 // Unsafe lifecycles should not be invoked for components using the new APIs.
11739 if (!hasNewLifecycles && (typeof instance.UNSAFE_componentWillReceiveProps === 'function' || typeof instance.componentWillReceiveProps === 'function')) {
11740 if (oldProps !== newProps || oldContext !== nextContext) {
11741 callComponentWillReceiveProps(workInProgress, instance, newProps, nextContext);
11742 }
11743 }
11744
11745 resetHasForceUpdateBeforeProcessing();
11746
11747 var oldState = workInProgress.memoizedState;
11748 var newState = instance.state = oldState;
11749 var updateQueue = workInProgress.updateQueue;
11750 if (updateQueue !== null) {
11751 processUpdateQueue(workInProgress, updateQueue, newProps, instance, renderExpirationTime);
11752 newState = workInProgress.memoizedState;
11753 }
11754
11755 if (oldProps === newProps && oldState === newState && !hasContextChanged() && !checkHasForceUpdateAfterProcessing()) {
11756 // If an update was already in progress, we should schedule an Update
11757 // effect even though we're bailing out, so that cWU/cDU are called.
11758 if (typeof instance.componentDidUpdate === 'function') {
11759 if (oldProps !== current.memoizedProps || oldState !== current.memoizedState) {
11760 workInProgress.effectTag |= Update;
11761 }
11762 }
11763 if (typeof instance.getSnapshotBeforeUpdate === 'function') {
11764 if (oldProps !== current.memoizedProps || oldState !== current.memoizedState) {
11765 workInProgress.effectTag |= Snapshot;
11766 }
11767 }
11768 return false;
11769 }
11770
11771 if (typeof getDerivedStateFromProps === 'function') {
11772 applyDerivedStateFromProps(workInProgress, ctor, getDerivedStateFromProps, newProps);
11773 newState = workInProgress.memoizedState;
11774 }
11775
11776 var shouldUpdate = checkHasForceUpdateAfterProcessing() || checkShouldComponentUpdate(workInProgress, ctor, oldProps, newProps, oldState, newState, nextContext);
11777
11778 if (shouldUpdate) {
11779 // In order to support react-lifecycles-compat polyfilled components,
11780 // Unsafe lifecycles should not be invoked for components using the new APIs.
11781 if (!hasNewLifecycles && (typeof instance.UNSAFE_componentWillUpdate === 'function' || typeof instance.componentWillUpdate === 'function')) {
11782 startPhaseTimer(workInProgress, 'componentWillUpdate');
11783 if (typeof instance.componentWillUpdate === 'function') {
11784 instance.componentWillUpdate(newProps, newState, nextContext);
11785 }
11786 if (typeof instance.UNSAFE_componentWillUpdate === 'function') {
11787 instance.UNSAFE_componentWillUpdate(newProps, newState, nextContext);
11788 }
11789 stopPhaseTimer();
11790 }
11791 if (typeof instance.componentDidUpdate === 'function') {
11792 workInProgress.effectTag |= Update;
11793 }
11794 if (typeof instance.getSnapshotBeforeUpdate === 'function') {
11795 workInProgress.effectTag |= Snapshot;
11796 }
11797 } else {
11798 // If an update was already in progress, we should schedule an Update
11799 // effect even though we're bailing out, so that cWU/cDU are called.
11800 if (typeof instance.componentDidUpdate === 'function') {
11801 if (oldProps !== current.memoizedProps || oldState !== current.memoizedState) {
11802 workInProgress.effectTag |= Update;
11803 }
11804 }
11805 if (typeof instance.getSnapshotBeforeUpdate === 'function') {
11806 if (oldProps !== current.memoizedProps || oldState !== current.memoizedState) {
11807 workInProgress.effectTag |= Snapshot;
11808 }
11809 }
11810
11811 // If shouldComponentUpdate returned false, we should still update the
11812 // memoized props/state to indicate that this work can be reused.
11813 workInProgress.memoizedProps = newProps;
11814 workInProgress.memoizedState = newState;
11815 }
11816
11817 // Update the existing instance's state, props, and context pointers even
11818 // if shouldComponentUpdate returns false.
11819 instance.props = newProps;
11820 instance.state = newState;
11821 instance.context = nextContext;
11822
11823 return shouldUpdate;
11824}
11825
11826var didWarnAboutMaps = void 0;
11827var didWarnAboutGenerators = void 0;
11828var didWarnAboutStringRefInStrictMode = void 0;
11829var ownerHasKeyUseWarning = void 0;
11830var ownerHasFunctionTypeWarning = void 0;
11831var warnForMissingKey = function (child) {};
11832
11833{
11834 didWarnAboutMaps = false;
11835 didWarnAboutGenerators = false;
11836 didWarnAboutStringRefInStrictMode = {};
11837
11838 /**
11839 * Warn if there's no key explicitly set on dynamic arrays of children or
11840 * object keys are not valid. This allows us to keep track of children between
11841 * updates.
11842 */
11843 ownerHasKeyUseWarning = {};
11844 ownerHasFunctionTypeWarning = {};
11845
11846 warnForMissingKey = function (child) {
11847 if (child === null || typeof child !== 'object') {
11848 return;
11849 }
11850 if (!child._store || child._store.validated || child.key != null) {
11851 return;
11852 }
11853 !(typeof child._store === 'object') ? invariant(false, 'React Component in warnForMissingKey should have a _store. This error is likely caused by a bug in React. Please file an issue.') : void 0;
11854 child._store.validated = true;
11855
11856 var currentComponentErrorInfo = 'Each child in a list should have a unique ' + '"key" prop. See https://fb.me/react-warning-keys for ' + 'more information.' + getCurrentFiberStackInDev();
11857 if (ownerHasKeyUseWarning[currentComponentErrorInfo]) {
11858 return;
11859 }
11860 ownerHasKeyUseWarning[currentComponentErrorInfo] = true;
11861
11862 warning$1(false, 'Each child in a list should have a unique ' + '"key" prop. See https://fb.me/react-warning-keys for ' + 'more information.');
11863 };
11864}
11865
11866var isArray = Array.isArray;
11867
11868function coerceRef(returnFiber, current$$1, element) {
11869 var mixedRef = element.ref;
11870 if (mixedRef !== null && typeof mixedRef !== 'function' && typeof mixedRef !== 'object') {
11871 {
11872 if (returnFiber.mode & StrictMode) {
11873 var componentName = getComponentName(returnFiber.type) || 'Component';
11874 if (!didWarnAboutStringRefInStrictMode[componentName]) {
11875 warningWithoutStack$1(false, 'A string ref, "%s", has been found within a strict mode tree. ' + 'String refs are a source of potential bugs and should be avoided. ' + 'We recommend using createRef() instead.' + '\n%s' + '\n\nLearn more about using refs safely here:' + '\nhttps://fb.me/react-strict-mode-string-ref', mixedRef, getStackByFiberInDevAndProd(returnFiber));
11876 didWarnAboutStringRefInStrictMode[componentName] = true;
11877 }
11878 }
11879 }
11880
11881 if (element._owner) {
11882 var owner = element._owner;
11883 var inst = void 0;
11884 if (owner) {
11885 var ownerFiber = owner;
11886 !(ownerFiber.tag === ClassComponent) ? invariant(false, 'Function components cannot have refs. Did you mean to use React.forwardRef()?') : void 0;
11887 inst = ownerFiber.stateNode;
11888 }
11889 !inst ? invariant(false, 'Missing owner for string ref %s. This error is likely caused by a bug in React. Please file an issue.', mixedRef) : void 0;
11890 var stringRef = '' + mixedRef;
11891 // Check if previous string ref matches new string ref
11892 if (current$$1 !== null && current$$1.ref !== null && typeof current$$1.ref === 'function' && current$$1.ref._stringRef === stringRef) {
11893 return current$$1.ref;
11894 }
11895 var ref = function (value) {
11896 var refs = inst.refs;
11897 if (refs === emptyRefsObject) {
11898 // This is a lazy pooled frozen object, so we need to initialize.
11899 refs = inst.refs = {};
11900 }
11901 if (value === null) {
11902 delete refs[stringRef];
11903 } else {
11904 refs[stringRef] = value;
11905 }
11906 };
11907 ref._stringRef = stringRef;
11908 return ref;
11909 } else {
11910 !(typeof mixedRef === 'string') ? invariant(false, 'Expected ref to be a function, a string, an object returned by React.createRef(), or null.') : void 0;
11911 !element._owner ? invariant(false, 'Element ref was specified as a string (%s) but no owner was set. This could happen for one of the following reasons:\n1. You may be adding a ref to a function component\n2. You may be adding a ref to a component that was not created inside a component\'s render method\n3. You have multiple copies of React loaded\nSee https://fb.me/react-refs-must-have-owner for more information.', mixedRef) : void 0;
11912 }
11913 }
11914 return mixedRef;
11915}
11916
11917function throwOnInvalidObjectType(returnFiber, newChild) {
11918 if (returnFiber.type !== 'textarea') {
11919 var addendum = '';
11920 {
11921 addendum = ' If you meant to render a collection of children, use an array ' + 'instead.' + getCurrentFiberStackInDev();
11922 }
11923 invariant(false, 'Objects are not valid as a React child (found: %s).%s', Object.prototype.toString.call(newChild) === '[object Object]' ? 'object with keys {' + Object.keys(newChild).join(', ') + '}' : newChild, addendum);
11924 }
11925}
11926
11927function warnOnFunctionType() {
11928 var currentComponentErrorInfo = 'Functions are not valid as a React child. This may happen if ' + 'you return a Component instead of <Component /> from render. ' + 'Or maybe you meant to call this function rather than return it.' + getCurrentFiberStackInDev();
11929
11930 if (ownerHasFunctionTypeWarning[currentComponentErrorInfo]) {
11931 return;
11932 }
11933 ownerHasFunctionTypeWarning[currentComponentErrorInfo] = true;
11934
11935 warning$1(false, 'Functions are not valid as a React child. This may happen if ' + 'you return a Component instead of <Component /> from render. ' + 'Or maybe you meant to call this function rather than return it.');
11936}
11937
11938// This wrapper function exists because I expect to clone the code in each path
11939// to be able to optimize each path individually by branching early. This needs
11940// a compiler or we can do it manually. Helpers that don't need this branching
11941// live outside of this function.
11942function ChildReconciler(shouldTrackSideEffects) {
11943 function deleteChild(returnFiber, childToDelete) {
11944 if (!shouldTrackSideEffects) {
11945 // Noop.
11946 return;
11947 }
11948 // Deletions are added in reversed order so we add it to the front.
11949 // At this point, the return fiber's effect list is empty except for
11950 // deletions, so we can just append the deletion to the list. The remaining
11951 // effects aren't added until the complete phase. Once we implement
11952 // resuming, this may not be true.
11953 var last = returnFiber.lastEffect;
11954 if (last !== null) {
11955 last.nextEffect = childToDelete;
11956 returnFiber.lastEffect = childToDelete;
11957 } else {
11958 returnFiber.firstEffect = returnFiber.lastEffect = childToDelete;
11959 }
11960 childToDelete.nextEffect = null;
11961 childToDelete.effectTag = Deletion;
11962 }
11963
11964 function deleteRemainingChildren(returnFiber, currentFirstChild) {
11965 if (!shouldTrackSideEffects) {
11966 // Noop.
11967 return null;
11968 }
11969
11970 // TODO: For the shouldClone case, this could be micro-optimized a bit by
11971 // assuming that after the first child we've already added everything.
11972 var childToDelete = currentFirstChild;
11973 while (childToDelete !== null) {
11974 deleteChild(returnFiber, childToDelete);
11975 childToDelete = childToDelete.sibling;
11976 }
11977 return null;
11978 }
11979
11980 function mapRemainingChildren(returnFiber, currentFirstChild) {
11981 // Add the remaining children to a temporary map so that we can find them by
11982 // keys quickly. Implicit (null) keys get added to this set with their index
11983 var existingChildren = new Map();
11984
11985 var existingChild = currentFirstChild;
11986 while (existingChild !== null) {
11987 if (existingChild.key !== null) {
11988 existingChildren.set(existingChild.key, existingChild);
11989 } else {
11990 existingChildren.set(existingChild.index, existingChild);
11991 }
11992 existingChild = existingChild.sibling;
11993 }
11994 return existingChildren;
11995 }
11996
11997 function useFiber(fiber, pendingProps, expirationTime) {
11998 // We currently set sibling to null and index to 0 here because it is easy
11999 // to forget to do before returning it. E.g. for the single child case.
12000 var clone = createWorkInProgress(fiber, pendingProps, expirationTime);
12001 clone.index = 0;
12002 clone.sibling = null;
12003 return clone;
12004 }
12005
12006 function placeChild(newFiber, lastPlacedIndex, newIndex) {
12007 newFiber.index = newIndex;
12008 if (!shouldTrackSideEffects) {
12009 // Noop.
12010 return lastPlacedIndex;
12011 }
12012 var current$$1 = newFiber.alternate;
12013 if (current$$1 !== null) {
12014 var oldIndex = current$$1.index;
12015 if (oldIndex < lastPlacedIndex) {
12016 // This is a move.
12017 newFiber.effectTag = Placement;
12018 return lastPlacedIndex;
12019 } else {
12020 // This item can stay in place.
12021 return oldIndex;
12022 }
12023 } else {
12024 // This is an insertion.
12025 newFiber.effectTag = Placement;
12026 return lastPlacedIndex;
12027 }
12028 }
12029
12030 function placeSingleChild(newFiber) {
12031 // This is simpler for the single child case. We only need to do a
12032 // placement for inserting new children.
12033 if (shouldTrackSideEffects && newFiber.alternate === null) {
12034 newFiber.effectTag = Placement;
12035 }
12036 return newFiber;
12037 }
12038
12039 function updateTextNode(returnFiber, current$$1, textContent, expirationTime) {
12040 if (current$$1 === null || current$$1.tag !== HostText) {
12041 // Insert
12042 var created = createFiberFromText(textContent, returnFiber.mode, expirationTime);
12043 created.return = returnFiber;
12044 return created;
12045 } else {
12046 // Update
12047 var existing = useFiber(current$$1, textContent, expirationTime);
12048 existing.return = returnFiber;
12049 return existing;
12050 }
12051 }
12052
12053 function updateElement(returnFiber, current$$1, element, expirationTime) {
12054 if (current$$1 !== null && current$$1.elementType === element.type) {
12055 // Move based on index
12056 var existing = useFiber(current$$1, element.props, expirationTime);
12057 existing.ref = coerceRef(returnFiber, current$$1, element);
12058 existing.return = returnFiber;
12059 {
12060 existing._debugSource = element._source;
12061 existing._debugOwner = element._owner;
12062 }
12063 return existing;
12064 } else {
12065 // Insert
12066 var created = createFiberFromElement(element, returnFiber.mode, expirationTime);
12067 created.ref = coerceRef(returnFiber, current$$1, element);
12068 created.return = returnFiber;
12069 return created;
12070 }
12071 }
12072
12073 function updatePortal(returnFiber, current$$1, portal, expirationTime) {
12074 if (current$$1 === null || current$$1.tag !== HostPortal || current$$1.stateNode.containerInfo !== portal.containerInfo || current$$1.stateNode.implementation !== portal.implementation) {
12075 // Insert
12076 var created = createFiberFromPortal(portal, returnFiber.mode, expirationTime);
12077 created.return = returnFiber;
12078 return created;
12079 } else {
12080 // Update
12081 var existing = useFiber(current$$1, portal.children || [], expirationTime);
12082 existing.return = returnFiber;
12083 return existing;
12084 }
12085 }
12086
12087 function updateFragment(returnFiber, current$$1, fragment, expirationTime, key) {
12088 if (current$$1 === null || current$$1.tag !== Fragment) {
12089 // Insert
12090 var created = createFiberFromFragment(fragment, returnFiber.mode, expirationTime, key);
12091 created.return = returnFiber;
12092 return created;
12093 } else {
12094 // Update
12095 var existing = useFiber(current$$1, fragment, expirationTime);
12096 existing.return = returnFiber;
12097 return existing;
12098 }
12099 }
12100
12101 function createChild(returnFiber, newChild, expirationTime) {
12102 if (typeof newChild === 'string' || typeof newChild === 'number') {
12103 // Text nodes don't have keys. If the previous node is implicitly keyed
12104 // we can continue to replace it without aborting even if it is not a text
12105 // node.
12106 var created = createFiberFromText('' + newChild, returnFiber.mode, expirationTime);
12107 created.return = returnFiber;
12108 return created;
12109 }
12110
12111 if (typeof newChild === 'object' && newChild !== null) {
12112 switch (newChild.$$typeof) {
12113 case REACT_ELEMENT_TYPE:
12114 {
12115 var _created = createFiberFromElement(newChild, returnFiber.mode, expirationTime);
12116 _created.ref = coerceRef(returnFiber, null, newChild);
12117 _created.return = returnFiber;
12118 return _created;
12119 }
12120 case REACT_PORTAL_TYPE:
12121 {
12122 var _created2 = createFiberFromPortal(newChild, returnFiber.mode, expirationTime);
12123 _created2.return = returnFiber;
12124 return _created2;
12125 }
12126 }
12127
12128 if (isArray(newChild) || getIteratorFn(newChild)) {
12129 var _created3 = createFiberFromFragment(newChild, returnFiber.mode, expirationTime, null);
12130 _created3.return = returnFiber;
12131 return _created3;
12132 }
12133
12134 throwOnInvalidObjectType(returnFiber, newChild);
12135 }
12136
12137 {
12138 if (typeof newChild === 'function') {
12139 warnOnFunctionType();
12140 }
12141 }
12142
12143 return null;
12144 }
12145
12146 function updateSlot(returnFiber, oldFiber, newChild, expirationTime) {
12147 // Update the fiber if the keys match, otherwise return null.
12148
12149 var key = oldFiber !== null ? oldFiber.key : null;
12150
12151 if (typeof newChild === 'string' || typeof newChild === 'number') {
12152 // Text nodes don't have keys. If the previous node is implicitly keyed
12153 // we can continue to replace it without aborting even if it is not a text
12154 // node.
12155 if (key !== null) {
12156 return null;
12157 }
12158 return updateTextNode(returnFiber, oldFiber, '' + newChild, expirationTime);
12159 }
12160
12161 if (typeof newChild === 'object' && newChild !== null) {
12162 switch (newChild.$$typeof) {
12163 case REACT_ELEMENT_TYPE:
12164 {
12165 if (newChild.key === key) {
12166 if (newChild.type === REACT_FRAGMENT_TYPE) {
12167 return updateFragment(returnFiber, oldFiber, newChild.props.children, expirationTime, key);
12168 }
12169 return updateElement(returnFiber, oldFiber, newChild, expirationTime);
12170 } else {
12171 return null;
12172 }
12173 }
12174 case REACT_PORTAL_TYPE:
12175 {
12176 if (newChild.key === key) {
12177 return updatePortal(returnFiber, oldFiber, newChild, expirationTime);
12178 } else {
12179 return null;
12180 }
12181 }
12182 }
12183
12184 if (isArray(newChild) || getIteratorFn(newChild)) {
12185 if (key !== null) {
12186 return null;
12187 }
12188
12189 return updateFragment(returnFiber, oldFiber, newChild, expirationTime, null);
12190 }
12191
12192 throwOnInvalidObjectType(returnFiber, newChild);
12193 }
12194
12195 {
12196 if (typeof newChild === 'function') {
12197 warnOnFunctionType();
12198 }
12199 }
12200
12201 return null;
12202 }
12203
12204 function updateFromMap(existingChildren, returnFiber, newIdx, newChild, expirationTime) {
12205 if (typeof newChild === 'string' || typeof newChild === 'number') {
12206 // Text nodes don't have keys, so we neither have to check the old nor
12207 // new node for the key. If both are text nodes, they match.
12208 var matchedFiber = existingChildren.get(newIdx) || null;
12209 return updateTextNode(returnFiber, matchedFiber, '' + newChild, expirationTime);
12210 }
12211
12212 if (typeof newChild === 'object' && newChild !== null) {
12213 switch (newChild.$$typeof) {
12214 case REACT_ELEMENT_TYPE:
12215 {
12216 var _matchedFiber = existingChildren.get(newChild.key === null ? newIdx : newChild.key) || null;
12217 if (newChild.type === REACT_FRAGMENT_TYPE) {
12218 return updateFragment(returnFiber, _matchedFiber, newChild.props.children, expirationTime, newChild.key);
12219 }
12220 return updateElement(returnFiber, _matchedFiber, newChild, expirationTime);
12221 }
12222 case REACT_PORTAL_TYPE:
12223 {
12224 var _matchedFiber2 = existingChildren.get(newChild.key === null ? newIdx : newChild.key) || null;
12225 return updatePortal(returnFiber, _matchedFiber2, newChild, expirationTime);
12226 }
12227 }
12228
12229 if (isArray(newChild) || getIteratorFn(newChild)) {
12230 var _matchedFiber3 = existingChildren.get(newIdx) || null;
12231 return updateFragment(returnFiber, _matchedFiber3, newChild, expirationTime, null);
12232 }
12233
12234 throwOnInvalidObjectType(returnFiber, newChild);
12235 }
12236
12237 {
12238 if (typeof newChild === 'function') {
12239 warnOnFunctionType();
12240 }
12241 }
12242
12243 return null;
12244 }
12245
12246 /**
12247 * Warns if there is a duplicate or missing key
12248 */
12249 function warnOnInvalidKey(child, knownKeys) {
12250 {
12251 if (typeof child !== 'object' || child === null) {
12252 return knownKeys;
12253 }
12254 switch (child.$$typeof) {
12255 case REACT_ELEMENT_TYPE:
12256 case REACT_PORTAL_TYPE:
12257 warnForMissingKey(child);
12258 var key = child.key;
12259 if (typeof key !== 'string') {
12260 break;
12261 }
12262 if (knownKeys === null) {
12263 knownKeys = new Set();
12264 knownKeys.add(key);
12265 break;
12266 }
12267 if (!knownKeys.has(key)) {
12268 knownKeys.add(key);
12269 break;
12270 }
12271 warning$1(false, 'Encountered two children with the same key, `%s`. ' + 'Keys should be unique so that components maintain their identity ' + 'across updates. Non-unique keys may cause children to be ' + 'duplicated and/or omitted — the behavior is unsupported and ' + 'could change in a future version.', key);
12272 break;
12273 default:
12274 break;
12275 }
12276 }
12277 return knownKeys;
12278 }
12279
12280 function reconcileChildrenArray(returnFiber, currentFirstChild, newChildren, expirationTime) {
12281 // This algorithm can't optimize by searching from both ends since we
12282 // don't have backpointers on fibers. I'm trying to see how far we can get
12283 // with that model. If it ends up not being worth the tradeoffs, we can
12284 // add it later.
12285
12286 // Even with a two ended optimization, we'd want to optimize for the case
12287 // where there are few changes and brute force the comparison instead of
12288 // going for the Map. It'd like to explore hitting that path first in
12289 // forward-only mode and only go for the Map once we notice that we need
12290 // lots of look ahead. This doesn't handle reversal as well as two ended
12291 // search but that's unusual. Besides, for the two ended optimization to
12292 // work on Iterables, we'd need to copy the whole set.
12293
12294 // In this first iteration, we'll just live with hitting the bad case
12295 // (adding everything to a Map) in for every insert/move.
12296
12297 // If you change this code, also update reconcileChildrenIterator() which
12298 // uses the same algorithm.
12299
12300 {
12301 // First, validate keys.
12302 var knownKeys = null;
12303 for (var i = 0; i < newChildren.length; i++) {
12304 var child = newChildren[i];
12305 knownKeys = warnOnInvalidKey(child, knownKeys);
12306 }
12307 }
12308
12309 var resultingFirstChild = null;
12310 var previousNewFiber = null;
12311
12312 var oldFiber = currentFirstChild;
12313 var lastPlacedIndex = 0;
12314 var newIdx = 0;
12315 var nextOldFiber = null;
12316 for (; oldFiber !== null && newIdx < newChildren.length; newIdx++) {
12317 if (oldFiber.index > newIdx) {
12318 nextOldFiber = oldFiber;
12319 oldFiber = null;
12320 } else {
12321 nextOldFiber = oldFiber.sibling;
12322 }
12323 var newFiber = updateSlot(returnFiber, oldFiber, newChildren[newIdx], expirationTime);
12324 if (newFiber === null) {
12325 // TODO: This breaks on empty slots like null children. That's
12326 // unfortunate because it triggers the slow path all the time. We need
12327 // a better way to communicate whether this was a miss or null,
12328 // boolean, undefined, etc.
12329 if (oldFiber === null) {
12330 oldFiber = nextOldFiber;
12331 }
12332 break;
12333 }
12334 if (shouldTrackSideEffects) {
12335 if (oldFiber && newFiber.alternate === null) {
12336 // We matched the slot, but we didn't reuse the existing fiber, so we
12337 // need to delete the existing child.
12338 deleteChild(returnFiber, oldFiber);
12339 }
12340 }
12341 lastPlacedIndex = placeChild(newFiber, lastPlacedIndex, newIdx);
12342 if (previousNewFiber === null) {
12343 // TODO: Move out of the loop. This only happens for the first run.
12344 resultingFirstChild = newFiber;
12345 } else {
12346 // TODO: Defer siblings if we're not at the right index for this slot.
12347 // I.e. if we had null values before, then we want to defer this
12348 // for each null value. However, we also don't want to call updateSlot
12349 // with the previous one.
12350 previousNewFiber.sibling = newFiber;
12351 }
12352 previousNewFiber = newFiber;
12353 oldFiber = nextOldFiber;
12354 }
12355
12356 if (newIdx === newChildren.length) {
12357 // We've reached the end of the new children. We can delete the rest.
12358 deleteRemainingChildren(returnFiber, oldFiber);
12359 return resultingFirstChild;
12360 }
12361
12362 if (oldFiber === null) {
12363 // If we don't have any more existing children we can choose a fast path
12364 // since the rest will all be insertions.
12365 for (; newIdx < newChildren.length; newIdx++) {
12366 var _newFiber = createChild(returnFiber, newChildren[newIdx], expirationTime);
12367 if (!_newFiber) {
12368 continue;
12369 }
12370 lastPlacedIndex = placeChild(_newFiber, lastPlacedIndex, newIdx);
12371 if (previousNewFiber === null) {
12372 // TODO: Move out of the loop. This only happens for the first run.
12373 resultingFirstChild = _newFiber;
12374 } else {
12375 previousNewFiber.sibling = _newFiber;
12376 }
12377 previousNewFiber = _newFiber;
12378 }
12379 return resultingFirstChild;
12380 }
12381
12382 // Add all children to a key map for quick lookups.
12383 var existingChildren = mapRemainingChildren(returnFiber, oldFiber);
12384
12385 // Keep scanning and use the map to restore deleted items as moves.
12386 for (; newIdx < newChildren.length; newIdx++) {
12387 var _newFiber2 = updateFromMap(existingChildren, returnFiber, newIdx, newChildren[newIdx], expirationTime);
12388 if (_newFiber2) {
12389 if (shouldTrackSideEffects) {
12390 if (_newFiber2.alternate !== null) {
12391 // The new fiber is a work in progress, but if there exists a
12392 // current, that means that we reused the fiber. We need to delete
12393 // it from the child list so that we don't add it to the deletion
12394 // list.
12395 existingChildren.delete(_newFiber2.key === null ? newIdx : _newFiber2.key);
12396 }
12397 }
12398 lastPlacedIndex = placeChild(_newFiber2, lastPlacedIndex, newIdx);
12399 if (previousNewFiber === null) {
12400 resultingFirstChild = _newFiber2;
12401 } else {
12402 previousNewFiber.sibling = _newFiber2;
12403 }
12404 previousNewFiber = _newFiber2;
12405 }
12406 }
12407
12408 if (shouldTrackSideEffects) {
12409 // Any existing children that weren't consumed above were deleted. We need
12410 // to add them to the deletion list.
12411 existingChildren.forEach(function (child) {
12412 return deleteChild(returnFiber, child);
12413 });
12414 }
12415
12416 return resultingFirstChild;
12417 }
12418
12419 function reconcileChildrenIterator(returnFiber, currentFirstChild, newChildrenIterable, expirationTime) {
12420 // This is the same implementation as reconcileChildrenArray(),
12421 // but using the iterator instead.
12422
12423 var iteratorFn = getIteratorFn(newChildrenIterable);
12424 !(typeof iteratorFn === 'function') ? invariant(false, 'An object is not an iterable. This error is likely caused by a bug in React. Please file an issue.') : void 0;
12425
12426 {
12427 // We don't support rendering Generators because it's a mutation.
12428 // See https://github.com/facebook/react/issues/12995
12429 if (typeof Symbol === 'function' &&
12430 // $FlowFixMe Flow doesn't know about toStringTag
12431 newChildrenIterable[Symbol.toStringTag] === 'Generator') {
12432 !didWarnAboutGenerators ? warning$1(false, 'Using Generators as children is unsupported and will likely yield ' + 'unexpected results because enumerating a generator mutates it. ' + 'You may convert it to an array with `Array.from()` or the ' + '`[...spread]` operator before rendering. Keep in mind ' + 'you might need to polyfill these features for older browsers.') : void 0;
12433 didWarnAboutGenerators = true;
12434 }
12435
12436 // Warn about using Maps as children
12437 if (newChildrenIterable.entries === iteratorFn) {
12438 !didWarnAboutMaps ? warning$1(false, 'Using Maps as children is unsupported and will likely yield ' + 'unexpected results. Convert it to a sequence/iterable of keyed ' + 'ReactElements instead.') : void 0;
12439 didWarnAboutMaps = true;
12440 }
12441
12442 // First, validate keys.
12443 // We'll get a different iterator later for the main pass.
12444 var _newChildren = iteratorFn.call(newChildrenIterable);
12445 if (_newChildren) {
12446 var knownKeys = null;
12447 var _step = _newChildren.next();
12448 for (; !_step.done; _step = _newChildren.next()) {
12449 var child = _step.value;
12450 knownKeys = warnOnInvalidKey(child, knownKeys);
12451 }
12452 }
12453 }
12454
12455 var newChildren = iteratorFn.call(newChildrenIterable);
12456 !(newChildren != null) ? invariant(false, 'An iterable object provided no iterator.') : void 0;
12457
12458 var resultingFirstChild = null;
12459 var previousNewFiber = null;
12460
12461 var oldFiber = currentFirstChild;
12462 var lastPlacedIndex = 0;
12463 var newIdx = 0;
12464 var nextOldFiber = null;
12465
12466 var step = newChildren.next();
12467 for (; oldFiber !== null && !step.done; newIdx++, step = newChildren.next()) {
12468 if (oldFiber.index > newIdx) {
12469 nextOldFiber = oldFiber;
12470 oldFiber = null;
12471 } else {
12472 nextOldFiber = oldFiber.sibling;
12473 }
12474 var newFiber = updateSlot(returnFiber, oldFiber, step.value, expirationTime);
12475 if (newFiber === null) {
12476 // TODO: This breaks on empty slots like null children. That's
12477 // unfortunate because it triggers the slow path all the time. We need
12478 // a better way to communicate whether this was a miss or null,
12479 // boolean, undefined, etc.
12480 if (!oldFiber) {
12481 oldFiber = nextOldFiber;
12482 }
12483 break;
12484 }
12485 if (shouldTrackSideEffects) {
12486 if (oldFiber && newFiber.alternate === null) {
12487 // We matched the slot, but we didn't reuse the existing fiber, so we
12488 // need to delete the existing child.
12489 deleteChild(returnFiber, oldFiber);
12490 }
12491 }
12492 lastPlacedIndex = placeChild(newFiber, lastPlacedIndex, newIdx);
12493 if (previousNewFiber === null) {
12494 // TODO: Move out of the loop. This only happens for the first run.
12495 resultingFirstChild = newFiber;
12496 } else {
12497 // TODO: Defer siblings if we're not at the right index for this slot.
12498 // I.e. if we had null values before, then we want to defer this
12499 // for each null value. However, we also don't want to call updateSlot
12500 // with the previous one.
12501 previousNewFiber.sibling = newFiber;
12502 }
12503 previousNewFiber = newFiber;
12504 oldFiber = nextOldFiber;
12505 }
12506
12507 if (step.done) {
12508 // We've reached the end of the new children. We can delete the rest.
12509 deleteRemainingChildren(returnFiber, oldFiber);
12510 return resultingFirstChild;
12511 }
12512
12513 if (oldFiber === null) {
12514 // If we don't have any more existing children we can choose a fast path
12515 // since the rest will all be insertions.
12516 for (; !step.done; newIdx++, step = newChildren.next()) {
12517 var _newFiber3 = createChild(returnFiber, step.value, expirationTime);
12518 if (_newFiber3 === null) {
12519 continue;
12520 }
12521 lastPlacedIndex = placeChild(_newFiber3, lastPlacedIndex, newIdx);
12522 if (previousNewFiber === null) {
12523 // TODO: Move out of the loop. This only happens for the first run.
12524 resultingFirstChild = _newFiber3;
12525 } else {
12526 previousNewFiber.sibling = _newFiber3;
12527 }
12528 previousNewFiber = _newFiber3;
12529 }
12530 return resultingFirstChild;
12531 }
12532
12533 // Add all children to a key map for quick lookups.
12534 var existingChildren = mapRemainingChildren(returnFiber, oldFiber);
12535
12536 // Keep scanning and use the map to restore deleted items as moves.
12537 for (; !step.done; newIdx++, step = newChildren.next()) {
12538 var _newFiber4 = updateFromMap(existingChildren, returnFiber, newIdx, step.value, expirationTime);
12539 if (_newFiber4 !== null) {
12540 if (shouldTrackSideEffects) {
12541 if (_newFiber4.alternate !== null) {
12542 // The new fiber is a work in progress, but if there exists a
12543 // current, that means that we reused the fiber. We need to delete
12544 // it from the child list so that we don't add it to the deletion
12545 // list.
12546 existingChildren.delete(_newFiber4.key === null ? newIdx : _newFiber4.key);
12547 }
12548 }
12549 lastPlacedIndex = placeChild(_newFiber4, lastPlacedIndex, newIdx);
12550 if (previousNewFiber === null) {
12551 resultingFirstChild = _newFiber4;
12552 } else {
12553 previousNewFiber.sibling = _newFiber4;
12554 }
12555 previousNewFiber = _newFiber4;
12556 }
12557 }
12558
12559 if (shouldTrackSideEffects) {
12560 // Any existing children that weren't consumed above were deleted. We need
12561 // to add them to the deletion list.
12562 existingChildren.forEach(function (child) {
12563 return deleteChild(returnFiber, child);
12564 });
12565 }
12566
12567 return resultingFirstChild;
12568 }
12569
12570 function reconcileSingleTextNode(returnFiber, currentFirstChild, textContent, expirationTime) {
12571 // There's no need to check for keys on text nodes since we don't have a
12572 // way to define them.
12573 if (currentFirstChild !== null && currentFirstChild.tag === HostText) {
12574 // We already have an existing node so let's just update it and delete
12575 // the rest.
12576 deleteRemainingChildren(returnFiber, currentFirstChild.sibling);
12577 var existing = useFiber(currentFirstChild, textContent, expirationTime);
12578 existing.return = returnFiber;
12579 return existing;
12580 }
12581 // The existing first child is not a text node so we need to create one
12582 // and delete the existing ones.
12583 deleteRemainingChildren(returnFiber, currentFirstChild);
12584 var created = createFiberFromText(textContent, returnFiber.mode, expirationTime);
12585 created.return = returnFiber;
12586 return created;
12587 }
12588
12589 function reconcileSingleElement(returnFiber, currentFirstChild, element, expirationTime) {
12590 var key = element.key;
12591 var child = currentFirstChild;
12592 while (child !== null) {
12593 // TODO: If key === null and child.key === null, then this only applies to
12594 // the first item in the list.
12595 if (child.key === key) {
12596 if (child.tag === Fragment ? element.type === REACT_FRAGMENT_TYPE : child.elementType === element.type) {
12597 deleteRemainingChildren(returnFiber, child.sibling);
12598 var existing = useFiber(child, element.type === REACT_FRAGMENT_TYPE ? element.props.children : element.props, expirationTime);
12599 existing.ref = coerceRef(returnFiber, child, element);
12600 existing.return = returnFiber;
12601 {
12602 existing._debugSource = element._source;
12603 existing._debugOwner = element._owner;
12604 }
12605 return existing;
12606 } else {
12607 deleteRemainingChildren(returnFiber, child);
12608 break;
12609 }
12610 } else {
12611 deleteChild(returnFiber, child);
12612 }
12613 child = child.sibling;
12614 }
12615
12616 if (element.type === REACT_FRAGMENT_TYPE) {
12617 var created = createFiberFromFragment(element.props.children, returnFiber.mode, expirationTime, element.key);
12618 created.return = returnFiber;
12619 return created;
12620 } else {
12621 var _created4 = createFiberFromElement(element, returnFiber.mode, expirationTime);
12622 _created4.ref = coerceRef(returnFiber, currentFirstChild, element);
12623 _created4.return = returnFiber;
12624 return _created4;
12625 }
12626 }
12627
12628 function reconcileSinglePortal(returnFiber, currentFirstChild, portal, expirationTime) {
12629 var key = portal.key;
12630 var child = currentFirstChild;
12631 while (child !== null) {
12632 // TODO: If key === null and child.key === null, then this only applies to
12633 // the first item in the list.
12634 if (child.key === key) {
12635 if (child.tag === HostPortal && child.stateNode.containerInfo === portal.containerInfo && child.stateNode.implementation === portal.implementation) {
12636 deleteRemainingChildren(returnFiber, child.sibling);
12637 var existing = useFiber(child, portal.children || [], expirationTime);
12638 existing.return = returnFiber;
12639 return existing;
12640 } else {
12641 deleteRemainingChildren(returnFiber, child);
12642 break;
12643 }
12644 } else {
12645 deleteChild(returnFiber, child);
12646 }
12647 child = child.sibling;
12648 }
12649
12650 var created = createFiberFromPortal(portal, returnFiber.mode, expirationTime);
12651 created.return = returnFiber;
12652 return created;
12653 }
12654
12655 // This API will tag the children with the side-effect of the reconciliation
12656 // itself. They will be added to the side-effect list as we pass through the
12657 // children and the parent.
12658 function reconcileChildFibers(returnFiber, currentFirstChild, newChild, expirationTime) {
12659 // This function is not recursive.
12660 // If the top level item is an array, we treat it as a set of children,
12661 // not as a fragment. Nested arrays on the other hand will be treated as
12662 // fragment nodes. Recursion happens at the normal flow.
12663
12664 // Handle top level unkeyed fragments as if they were arrays.
12665 // This leads to an ambiguity between <>{[...]}</> and <>...</>.
12666 // We treat the ambiguous cases above the same.
12667 var isUnkeyedTopLevelFragment = typeof newChild === 'object' && newChild !== null && newChild.type === REACT_FRAGMENT_TYPE && newChild.key === null;
12668 if (isUnkeyedTopLevelFragment) {
12669 newChild = newChild.props.children;
12670 }
12671
12672 // Handle object types
12673 var isObject = typeof newChild === 'object' && newChild !== null;
12674
12675 if (isObject) {
12676 switch (newChild.$$typeof) {
12677 case REACT_ELEMENT_TYPE:
12678 return placeSingleChild(reconcileSingleElement(returnFiber, currentFirstChild, newChild, expirationTime));
12679 case REACT_PORTAL_TYPE:
12680 return placeSingleChild(reconcileSinglePortal(returnFiber, currentFirstChild, newChild, expirationTime));
12681 }
12682 }
12683
12684 if (typeof newChild === 'string' || typeof newChild === 'number') {
12685 return placeSingleChild(reconcileSingleTextNode(returnFiber, currentFirstChild, '' + newChild, expirationTime));
12686 }
12687
12688 if (isArray(newChild)) {
12689 return reconcileChildrenArray(returnFiber, currentFirstChild, newChild, expirationTime);
12690 }
12691
12692 if (getIteratorFn(newChild)) {
12693 return reconcileChildrenIterator(returnFiber, currentFirstChild, newChild, expirationTime);
12694 }
12695
12696 if (isObject) {
12697 throwOnInvalidObjectType(returnFiber, newChild);
12698 }
12699
12700 {
12701 if (typeof newChild === 'function') {
12702 warnOnFunctionType();
12703 }
12704 }
12705 if (typeof newChild === 'undefined' && !isUnkeyedTopLevelFragment) {
12706 // If the new child is undefined, and the return fiber is a composite
12707 // component, throw an error. If Fiber return types are disabled,
12708 // we already threw above.
12709 switch (returnFiber.tag) {
12710 case ClassComponent:
12711 {
12712 {
12713 var instance = returnFiber.stateNode;
12714 if (instance.render._isMockFunction) {
12715 // We allow auto-mocks to proceed as if they're returning null.
12716 break;
12717 }
12718 }
12719 }
12720 // Intentionally fall through to the next case, which handles both
12721 // functions and classes
12722 // eslint-disable-next-lined no-fallthrough
12723 case FunctionComponent:
12724 {
12725 var Component = returnFiber.type;
12726 invariant(false, '%s(...): Nothing was returned from render. This usually means a return statement is missing. Or, to render nothing, return null.', Component.displayName || Component.name || 'Component');
12727 }
12728 }
12729 }
12730
12731 // Remaining cases are all treated as empty.
12732 return deleteRemainingChildren(returnFiber, currentFirstChild);
12733 }
12734
12735 return reconcileChildFibers;
12736}
12737
12738var reconcileChildFibers = ChildReconciler(true);
12739var mountChildFibers = ChildReconciler(false);
12740
12741function cloneChildFibers(current$$1, workInProgress) {
12742 !(current$$1 === null || workInProgress.child === current$$1.child) ? invariant(false, 'Resuming work not yet implemented.') : void 0;
12743
12744 if (workInProgress.child === null) {
12745 return;
12746 }
12747
12748 var currentChild = workInProgress.child;
12749 var newChild = createWorkInProgress(currentChild, currentChild.pendingProps, currentChild.expirationTime);
12750 workInProgress.child = newChild;
12751
12752 newChild.return = workInProgress;
12753 while (currentChild.sibling !== null) {
12754 currentChild = currentChild.sibling;
12755 newChild = newChild.sibling = createWorkInProgress(currentChild, currentChild.pendingProps, currentChild.expirationTime);
12756 newChild.return = workInProgress;
12757 }
12758 newChild.sibling = null;
12759}
12760
12761var NO_CONTEXT = {};
12762
12763var contextStackCursor$1 = createCursor(NO_CONTEXT);
12764var contextFiberStackCursor = createCursor(NO_CONTEXT);
12765var rootInstanceStackCursor = createCursor(NO_CONTEXT);
12766
12767function requiredContext(c) {
12768 !(c !== NO_CONTEXT) ? invariant(false, 'Expected host context to exist. This error is likely caused by a bug in React. Please file an issue.') : void 0;
12769 return c;
12770}
12771
12772function getRootHostContainer() {
12773 var rootInstance = requiredContext(rootInstanceStackCursor.current);
12774 return rootInstance;
12775}
12776
12777function pushHostContainer(fiber, nextRootInstance) {
12778 // Push current root instance onto the stack;
12779 // This allows us to reset root when portals are popped.
12780 push(rootInstanceStackCursor, nextRootInstance, fiber);
12781 // Track the context and the Fiber that provided it.
12782 // This enables us to pop only Fibers that provide unique contexts.
12783 push(contextFiberStackCursor, fiber, fiber);
12784
12785 // Finally, we need to push the host context to the stack.
12786 // However, we can't just call getRootHostContext() and push it because
12787 // we'd have a different number of entries on the stack depending on
12788 // whether getRootHostContext() throws somewhere in renderer code or not.
12789 // So we push an empty value first. This lets us safely unwind on errors.
12790 push(contextStackCursor$1, NO_CONTEXT, fiber);
12791 var nextRootContext = getRootHostContext(nextRootInstance);
12792 // Now that we know this function doesn't throw, replace it.
12793 pop(contextStackCursor$1, fiber);
12794 push(contextStackCursor$1, nextRootContext, fiber);
12795}
12796
12797function popHostContainer(fiber) {
12798 pop(contextStackCursor$1, fiber);
12799 pop(contextFiberStackCursor, fiber);
12800 pop(rootInstanceStackCursor, fiber);
12801}
12802
12803function getHostContext() {
12804 var context = requiredContext(contextStackCursor$1.current);
12805 return context;
12806}
12807
12808function pushHostContext(fiber) {
12809 var rootInstance = requiredContext(rootInstanceStackCursor.current);
12810 var context = requiredContext(contextStackCursor$1.current);
12811 var nextContext = getChildHostContext(context, fiber.type, rootInstance);
12812
12813 // Don't push this Fiber's context unless it's unique.
12814 if (context === nextContext) {
12815 return;
12816 }
12817
12818 // Track the context and the Fiber that provided it.
12819 // This enables us to pop only Fibers that provide unique contexts.
12820 push(contextFiberStackCursor, fiber, fiber);
12821 push(contextStackCursor$1, nextContext, fiber);
12822}
12823
12824function popHostContext(fiber) {
12825 // Do not pop unless this Fiber provided the current context.
12826 // pushHostContext() only pushes Fibers that provide unique contexts.
12827 if (contextFiberStackCursor.current !== fiber) {
12828 return;
12829 }
12830
12831 pop(contextStackCursor$1, fiber);
12832 pop(contextFiberStackCursor, fiber);
12833}
12834
12835var NoEffect$1 = /* */0;
12836var UnmountSnapshot = /* */2;
12837var UnmountMutation = /* */4;
12838var MountMutation = /* */8;
12839var UnmountLayout = /* */16;
12840var MountLayout = /* */32;
12841var MountPassive = /* */64;
12842var UnmountPassive = /* */128;
12843
12844var ReactCurrentDispatcher$1 = ReactSharedInternals.ReactCurrentDispatcher;
12845
12846
12847var didWarnAboutMismatchedHooksForComponent = void 0;
12848{
12849 didWarnAboutMismatchedHooksForComponent = new Set();
12850}
12851
12852// These are set right before calling the component.
12853var renderExpirationTime = NoWork;
12854// The work-in-progress fiber. I've named it differently to distinguish it from
12855// the work-in-progress hook.
12856var currentlyRenderingFiber$1 = null;
12857
12858// Hooks are stored as a linked list on the fiber's memoizedState field. The
12859// current hook list is the list that belongs to the current fiber. The
12860// work-in-progress hook list is a new list that will be added to the
12861// work-in-progress fiber.
12862var firstCurrentHook = null;
12863var currentHook = null;
12864var nextCurrentHook = null;
12865var firstWorkInProgressHook = null;
12866var workInProgressHook = null;
12867var nextWorkInProgressHook = null;
12868
12869var remainingExpirationTime = NoWork;
12870var componentUpdateQueue = null;
12871var sideEffectTag = 0;
12872
12873// Updates scheduled during render will trigger an immediate re-render at the
12874// end of the current pass. We can't store these updates on the normal queue,
12875// because if the work is aborted, they should be discarded. Because this is
12876// a relatively rare case, we also don't want to add an additional field to
12877// either the hook or queue object types. So we store them in a lazily create
12878// map of queue -> render-phase updates, which are discarded once the component
12879// completes without re-rendering.
12880
12881// Whether an update was scheduled during the currently executing render pass.
12882var didScheduleRenderPhaseUpdate = false;
12883// Lazily created map of render-phase updates
12884var renderPhaseUpdates = null;
12885// Counter to prevent infinite loops.
12886var numberOfReRenders = 0;
12887var RE_RENDER_LIMIT = 25;
12888
12889// In DEV, this is the name of the currently executing primitive hook
12890var currentHookNameInDev = null;
12891
12892function warnOnHookMismatchInDev() {
12893 {
12894 var componentName = getComponentName(currentlyRenderingFiber$1.type);
12895 if (!didWarnAboutMismatchedHooksForComponent.has(componentName)) {
12896 didWarnAboutMismatchedHooksForComponent.add(componentName);
12897
12898 var secondColumnStart = 22;
12899
12900 var table = '';
12901 var prevHook = firstCurrentHook;
12902 var nextHook = firstWorkInProgressHook;
12903 var n = 1;
12904 while (prevHook !== null && nextHook !== null) {
12905 var oldHookName = prevHook._debugType;
12906 var newHookName = nextHook._debugType;
12907
12908 var row = n + '. ' + oldHookName;
12909
12910 // Extra space so second column lines up
12911 // lol @ IE not supporting String#repeat
12912 while (row.length < secondColumnStart) {
12913 row += ' ';
12914 }
12915
12916 row += newHookName + '\n';
12917
12918 table += row;
12919 prevHook = prevHook.next;
12920 nextHook = nextHook.next;
12921 n++;
12922 }
12923
12924 warning$1(false, 'React has detected a change in the order of Hooks called by %s. ' + 'This will lead to bugs and errors if not fixed. ' + 'For more information, read the Rules of Hooks: https://fb.me/rules-of-hooks\n\n' + ' Previous render Next render\n' + ' -------------------------------\n' + '%s' + ' ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n', componentName, table);
12925 }
12926 }
12927}
12928
12929function throwInvalidHookError() {
12930 invariant(false, 'Hooks can only be called inside the body of a function component. (https://fb.me/react-invalid-hook-call)');
12931}
12932
12933function areHookInputsEqual(nextDeps, prevDeps) {
12934 if (prevDeps === null) {
12935 {
12936 warning$1(false, '%s received a final argument during this render, but not during ' + 'the previous render. Even though the final argument is optional, ' + 'its type cannot change between renders.', currentHookNameInDev);
12937 }
12938 return false;
12939 }
12940
12941 {
12942 // Don't bother comparing lengths in prod because these arrays should be
12943 // passed inline.
12944 if (nextDeps.length !== prevDeps.length) {
12945 warning$1(false, 'The final argument passed to %s changed size between renders. The ' + 'order and size of this array must remain constant.\n\n' + 'Previous: %s\n' + 'Incoming: %s', currentHookNameInDev, '[' + nextDeps.join(', ') + ']', '[' + prevDeps.join(', ') + ']');
12946 }
12947 }
12948 for (var i = 0; i < prevDeps.length && i < nextDeps.length; i++) {
12949 if (is(nextDeps[i], prevDeps[i])) {
12950 continue;
12951 }
12952 return false;
12953 }
12954 return true;
12955}
12956
12957function renderWithHooks(current, workInProgress, Component, props, refOrContext, nextRenderExpirationTime) {
12958 renderExpirationTime = nextRenderExpirationTime;
12959 currentlyRenderingFiber$1 = workInProgress;
12960 firstCurrentHook = nextCurrentHook = current !== null ? current.memoizedState : null;
12961
12962 // The following should have already been reset
12963 // currentHook = null;
12964 // workInProgressHook = null;
12965
12966 // remainingExpirationTime = NoWork;
12967 // componentUpdateQueue = null;
12968
12969 // didScheduleRenderPhaseUpdate = false;
12970 // renderPhaseUpdates = null;
12971 // numberOfReRenders = 0;
12972 // sideEffectTag = 0;
12973
12974 {
12975 ReactCurrentDispatcher$1.current = nextCurrentHook === null ? HooksDispatcherOnMountInDEV : HooksDispatcherOnUpdateInDEV;
12976 }
12977
12978 var children = Component(props, refOrContext);
12979
12980 if (didScheduleRenderPhaseUpdate) {
12981 do {
12982 didScheduleRenderPhaseUpdate = false;
12983 numberOfReRenders += 1;
12984
12985 // Start over from the beginning of the list
12986 firstCurrentHook = nextCurrentHook = current !== null ? current.memoizedState : null;
12987 nextWorkInProgressHook = firstWorkInProgressHook;
12988
12989 currentHook = null;
12990 workInProgressHook = null;
12991 componentUpdateQueue = null;
12992
12993 ReactCurrentDispatcher$1.current = HooksDispatcherOnUpdateInDEV;
12994
12995 children = Component(props, refOrContext);
12996 } while (didScheduleRenderPhaseUpdate);
12997
12998 renderPhaseUpdates = null;
12999 numberOfReRenders = 0;
13000 }
13001
13002 {
13003 currentHookNameInDev = null;
13004 }
13005
13006 // We can assume the previous dispatcher is always this one, since we set it
13007 // at the beginning of the render phase and there's no re-entrancy.
13008 ReactCurrentDispatcher$1.current = ContextOnlyDispatcher;
13009
13010 var renderedWork = currentlyRenderingFiber$1;
13011
13012 renderedWork.memoizedState = firstWorkInProgressHook;
13013 renderedWork.expirationTime = remainingExpirationTime;
13014 renderedWork.updateQueue = componentUpdateQueue;
13015 renderedWork.effectTag |= sideEffectTag;
13016
13017 var didRenderTooFewHooks = currentHook !== null && currentHook.next !== null;
13018
13019 renderExpirationTime = NoWork;
13020 currentlyRenderingFiber$1 = null;
13021
13022 firstCurrentHook = null;
13023 currentHook = null;
13024 nextCurrentHook = null;
13025 firstWorkInProgressHook = null;
13026 workInProgressHook = null;
13027 nextWorkInProgressHook = null;
13028
13029 remainingExpirationTime = NoWork;
13030 componentUpdateQueue = null;
13031 sideEffectTag = 0;
13032
13033 // These were reset above
13034 // didScheduleRenderPhaseUpdate = false;
13035 // renderPhaseUpdates = null;
13036 // numberOfReRenders = 0;
13037
13038 !!didRenderTooFewHooks ? invariant(false, 'Rendered fewer hooks than expected. This may be caused by an accidental early return statement.') : void 0;
13039
13040 return children;
13041}
13042
13043function bailoutHooks(current, workInProgress, expirationTime) {
13044 workInProgress.updateQueue = current.updateQueue;
13045 workInProgress.effectTag &= ~(Passive | Update);
13046 if (current.expirationTime <= expirationTime) {
13047 current.expirationTime = NoWork;
13048 }
13049}
13050
13051function resetHooks() {
13052 // We can assume the previous dispatcher is always this one, since we set it
13053 // at the beginning of the render phase and there's no re-entrancy.
13054 ReactCurrentDispatcher$1.current = ContextOnlyDispatcher;
13055
13056 // This is used to reset the state of this module when a component throws.
13057 // It's also called inside mountIndeterminateComponent if we determine the
13058 // component is a module-style component.
13059 renderExpirationTime = NoWork;
13060 currentlyRenderingFiber$1 = null;
13061
13062 firstCurrentHook = null;
13063 currentHook = null;
13064 nextCurrentHook = null;
13065 firstWorkInProgressHook = null;
13066 workInProgressHook = null;
13067 nextWorkInProgressHook = null;
13068
13069 remainingExpirationTime = NoWork;
13070 componentUpdateQueue = null;
13071 sideEffectTag = 0;
13072
13073 {
13074 currentHookNameInDev = null;
13075 }
13076
13077 didScheduleRenderPhaseUpdate = false;
13078 renderPhaseUpdates = null;
13079 numberOfReRenders = 0;
13080}
13081
13082function mountWorkInProgressHook() {
13083 var hook = {
13084 memoizedState: null,
13085
13086 baseState: null,
13087 queue: null,
13088 baseUpdate: null,
13089
13090 next: null
13091 };
13092
13093 {
13094 hook._debugType = currentHookNameInDev;
13095 }
13096 if (workInProgressHook === null) {
13097 // This is the first hook in the list
13098 firstWorkInProgressHook = workInProgressHook = hook;
13099 } else {
13100 // Append to the end of the list
13101 workInProgressHook = workInProgressHook.next = hook;
13102 }
13103 return workInProgressHook;
13104}
13105
13106function updateWorkInProgressHook() {
13107 // This function is used both for updates and for re-renders triggered by a
13108 // render phase update. It assumes there is either a current hook we can
13109 // clone, or a work-in-progress hook from a previous render pass that we can
13110 // use as a base. When we reach the end of the base list, we must switch to
13111 // the dispatcher used for mounts.
13112 if (nextWorkInProgressHook !== null) {
13113 // There's already a work-in-progress. Reuse it.
13114 workInProgressHook = nextWorkInProgressHook;
13115 nextWorkInProgressHook = workInProgressHook.next;
13116
13117 currentHook = nextCurrentHook;
13118 nextCurrentHook = currentHook !== null ? currentHook.next : null;
13119 } else {
13120 // Clone from the current hook.
13121 !(nextCurrentHook !== null) ? invariant(false, 'Rendered more hooks than during the previous render.') : void 0;
13122 currentHook = nextCurrentHook;
13123
13124 var newHook = {
13125 memoizedState: currentHook.memoizedState,
13126
13127 baseState: currentHook.baseState,
13128 queue: currentHook.queue,
13129 baseUpdate: currentHook.baseUpdate,
13130
13131 next: null
13132 };
13133
13134 if (workInProgressHook === null) {
13135 // This is the first hook in the list.
13136 workInProgressHook = firstWorkInProgressHook = newHook;
13137 } else {
13138 // Append to the end of the list.
13139 workInProgressHook = workInProgressHook.next = newHook;
13140 }
13141 nextCurrentHook = currentHook.next;
13142
13143 {
13144 newHook._debugType = currentHookNameInDev;
13145 if (currentHookNameInDev !== currentHook._debugType) {
13146 warnOnHookMismatchInDev();
13147 }
13148 }
13149 }
13150 return workInProgressHook;
13151}
13152
13153function createFunctionComponentUpdateQueue() {
13154 return {
13155 lastEffect: null
13156 };
13157}
13158
13159function basicStateReducer(state, action) {
13160 return typeof action === 'function' ? action(state) : action;
13161}
13162
13163function mountContext(context, observedBits) {
13164 {
13165 mountWorkInProgressHook();
13166 }
13167 return readContext(context, observedBits);
13168}
13169
13170function updateContext(context, observedBits) {
13171 {
13172 updateWorkInProgressHook();
13173 }
13174 return readContext(context, observedBits);
13175}
13176
13177function mountReducer(reducer, initialArg, init) {
13178 var hook = mountWorkInProgressHook();
13179 var initialState = void 0;
13180 if (init !== undefined) {
13181 initialState = init(initialArg);
13182 } else {
13183 initialState = initialArg;
13184 }
13185 hook.memoizedState = hook.baseState = initialState;
13186 var queue = hook.queue = {
13187 last: null,
13188 dispatch: null,
13189 eagerReducer: reducer,
13190 eagerState: initialState
13191 };
13192 var dispatch = queue.dispatch = dispatchAction.bind(null,
13193 // Flow doesn't know this is non-null, but we do.
13194 currentlyRenderingFiber$1, queue);
13195 return [hook.memoizedState, dispatch];
13196}
13197
13198function updateReducer(reducer, initialArg, init) {
13199 var hook = updateWorkInProgressHook();
13200 var queue = hook.queue;
13201 !(queue !== null) ? invariant(false, 'Should have a queue. This is likely a bug in React. Please file an issue.') : void 0;
13202
13203 if (numberOfReRenders > 0) {
13204 // This is a re-render. Apply the new render phase updates to the previous
13205 var _dispatch = queue.dispatch;
13206 if (renderPhaseUpdates !== null) {
13207 // Render phase updates are stored in a map of queue -> linked list
13208 var firstRenderPhaseUpdate = renderPhaseUpdates.get(queue);
13209 if (firstRenderPhaseUpdate !== undefined) {
13210 renderPhaseUpdates.delete(queue);
13211 var newState = hook.memoizedState;
13212 var update = firstRenderPhaseUpdate;
13213 do {
13214 // Process this render phase update. We don't have to check the
13215 // priority because it will always be the same as the current
13216 // render's.
13217 var _action = update.action;
13218 newState = reducer(newState, _action);
13219 update = update.next;
13220 } while (update !== null);
13221
13222 // Mark that the fiber performed work, but only if the new state is
13223 // different from the current state.
13224 if (!is(newState, hook.memoizedState)) {
13225 markWorkInProgressReceivedUpdate();
13226 }
13227
13228 hook.memoizedState = newState;
13229
13230 // Don't persist the state accumlated from the render phase updates to
13231 // the base state unless the queue is empty.
13232 // TODO: Not sure if this is the desired semantics, but it's what we
13233 // do for gDSFP. I can't remember why.
13234 if (hook.baseUpdate === queue.last) {
13235 hook.baseState = newState;
13236 }
13237
13238 return [newState, _dispatch];
13239 }
13240 }
13241 return [hook.memoizedState, _dispatch];
13242 }
13243
13244 // The last update in the entire queue
13245 var last = queue.last;
13246 // The last update that is part of the base state.
13247 var baseUpdate = hook.baseUpdate;
13248 var baseState = hook.baseState;
13249
13250 // Find the first unprocessed update.
13251 var first = void 0;
13252 if (baseUpdate !== null) {
13253 if (last !== null) {
13254 // For the first update, the queue is a circular linked list where
13255 // `queue.last.next = queue.first`. Once the first update commits, and
13256 // the `baseUpdate` is no longer empty, we can unravel the list.
13257 last.next = null;
13258 }
13259 first = baseUpdate.next;
13260 } else {
13261 first = last !== null ? last.next : null;
13262 }
13263 if (first !== null) {
13264 var _newState = baseState;
13265 var newBaseState = null;
13266 var newBaseUpdate = null;
13267 var prevUpdate = baseUpdate;
13268 var _update = first;
13269 var didSkip = false;
13270 do {
13271 var updateExpirationTime = _update.expirationTime;
13272 if (updateExpirationTime < renderExpirationTime) {
13273 // Priority is insufficient. Skip this update. If this is the first
13274 // skipped update, the previous update/state is the new base
13275 // update/state.
13276 if (!didSkip) {
13277 didSkip = true;
13278 newBaseUpdate = prevUpdate;
13279 newBaseState = _newState;
13280 }
13281 // Update the remaining priority in the queue.
13282 if (updateExpirationTime > remainingExpirationTime) {
13283 remainingExpirationTime = updateExpirationTime;
13284 }
13285 } else {
13286 // Process this update.
13287 if (_update.eagerReducer === reducer) {
13288 // If this update was processed eagerly, and its reducer matches the
13289 // current reducer, we can use the eagerly computed state.
13290 _newState = _update.eagerState;
13291 } else {
13292 var _action2 = _update.action;
13293 _newState = reducer(_newState, _action2);
13294 }
13295 }
13296 prevUpdate = _update;
13297 _update = _update.next;
13298 } while (_update !== null && _update !== first);
13299
13300 if (!didSkip) {
13301 newBaseUpdate = prevUpdate;
13302 newBaseState = _newState;
13303 }
13304
13305 // Mark that the fiber performed work, but only if the new state is
13306 // different from the current state.
13307 if (!is(_newState, hook.memoizedState)) {
13308 markWorkInProgressReceivedUpdate();
13309 }
13310
13311 hook.memoizedState = _newState;
13312 hook.baseUpdate = newBaseUpdate;
13313 hook.baseState = newBaseState;
13314
13315 queue.eagerReducer = reducer;
13316 queue.eagerState = _newState;
13317 }
13318
13319 var dispatch = queue.dispatch;
13320 return [hook.memoizedState, dispatch];
13321}
13322
13323function mountState(initialState) {
13324 var hook = mountWorkInProgressHook();
13325 if (typeof initialState === 'function') {
13326 initialState = initialState();
13327 }
13328 hook.memoizedState = hook.baseState = initialState;
13329 var queue = hook.queue = {
13330 last: null,
13331 dispatch: null,
13332 eagerReducer: basicStateReducer,
13333 eagerState: initialState
13334 };
13335 var dispatch = queue.dispatch = dispatchAction.bind(null,
13336 // Flow doesn't know this is non-null, but we do.
13337 currentlyRenderingFiber$1, queue);
13338 return [hook.memoizedState, dispatch];
13339}
13340
13341function updateState(initialState) {
13342 return updateReducer(basicStateReducer, initialState);
13343}
13344
13345function pushEffect(tag, create, destroy, deps) {
13346 var effect = {
13347 tag: tag,
13348 create: create,
13349 destroy: destroy,
13350 deps: deps,
13351 // Circular
13352 next: null
13353 };
13354 if (componentUpdateQueue === null) {
13355 componentUpdateQueue = createFunctionComponentUpdateQueue();
13356 componentUpdateQueue.lastEffect = effect.next = effect;
13357 } else {
13358 var _lastEffect = componentUpdateQueue.lastEffect;
13359 if (_lastEffect === null) {
13360 componentUpdateQueue.lastEffect = effect.next = effect;
13361 } else {
13362 var firstEffect = _lastEffect.next;
13363 _lastEffect.next = effect;
13364 effect.next = firstEffect;
13365 componentUpdateQueue.lastEffect = effect;
13366 }
13367 }
13368 return effect;
13369}
13370
13371function mountRef(initialValue) {
13372 var hook = mountWorkInProgressHook();
13373 var ref = { current: initialValue };
13374 {
13375 Object.seal(ref);
13376 }
13377 hook.memoizedState = ref;
13378 return ref;
13379}
13380
13381function updateRef(initialValue) {
13382 var hook = updateWorkInProgressHook();
13383 return hook.memoizedState;
13384}
13385
13386function mountEffectImpl(fiberEffectTag, hookEffectTag, create, deps) {
13387 var hook = mountWorkInProgressHook();
13388 var nextDeps = deps === undefined ? null : deps;
13389 sideEffectTag |= fiberEffectTag;
13390 hook.memoizedState = pushEffect(hookEffectTag, create, undefined, nextDeps);
13391}
13392
13393function updateEffectImpl(fiberEffectTag, hookEffectTag, create, deps) {
13394 var hook = updateWorkInProgressHook();
13395 var nextDeps = deps === undefined ? null : deps;
13396 var destroy = undefined;
13397
13398 if (currentHook !== null) {
13399 var prevEffect = currentHook.memoizedState;
13400 destroy = prevEffect.destroy;
13401 if (nextDeps !== null) {
13402 var prevDeps = prevEffect.deps;
13403 if (areHookInputsEqual(nextDeps, prevDeps)) {
13404 pushEffect(NoEffect$1, create, destroy, nextDeps);
13405 return;
13406 }
13407 }
13408 }
13409
13410 sideEffectTag |= fiberEffectTag;
13411 hook.memoizedState = pushEffect(hookEffectTag, create, destroy, nextDeps);
13412}
13413
13414function mountEffect(create, deps) {
13415 return mountEffectImpl(Update | Passive, UnmountPassive | MountPassive, create, deps);
13416}
13417
13418function updateEffect(create, deps) {
13419 return updateEffectImpl(Update | Passive, UnmountPassive | MountPassive, create, deps);
13420}
13421
13422function mountLayoutEffect(create, deps) {
13423 return mountEffectImpl(Update, UnmountMutation | MountLayout, create, deps);
13424}
13425
13426function updateLayoutEffect(create, deps) {
13427 return updateEffectImpl(Update, UnmountMutation | MountLayout, create, deps);
13428}
13429
13430function imperativeHandleEffect(create, ref) {
13431 if (typeof ref === 'function') {
13432 var refCallback = ref;
13433 var _inst = create();
13434 refCallback(_inst);
13435 return function () {
13436 refCallback(null);
13437 };
13438 } else if (ref !== null && ref !== undefined) {
13439 var refObject = ref;
13440 {
13441 !refObject.hasOwnProperty('current') ? warning$1(false, 'Expected useImperativeHandle() first argument to either be a ' + 'ref callback or React.createRef() object. Instead received: %s.', 'an object with keys {' + Object.keys(refObject).join(', ') + '}') : void 0;
13442 }
13443 var _inst2 = create();
13444 refObject.current = _inst2;
13445 return function () {
13446 refObject.current = null;
13447 };
13448 }
13449}
13450
13451function mountImperativeHandle(ref, create, deps) {
13452 {
13453 !(typeof create === 'function') ? warning$1(false, 'Expected useImperativeHandle() second argument to be a function ' + 'that creates a handle. Instead received: %s.', create !== null ? typeof create : 'null') : void 0;
13454 }
13455
13456 // TODO: If deps are provided, should we skip comparing the ref itself?
13457 var effectDeps = deps !== null && deps !== undefined ? deps.concat([ref]) : null;
13458
13459 return mountEffectImpl(Update, UnmountMutation | MountLayout, imperativeHandleEffect.bind(null, create, ref), effectDeps);
13460}
13461
13462function updateImperativeHandle(ref, create, deps) {
13463 {
13464 !(typeof create === 'function') ? warning$1(false, 'Expected useImperativeHandle() second argument to be a function ' + 'that creates a handle. Instead received: %s.', create !== null ? typeof create : 'null') : void 0;
13465 }
13466
13467 // TODO: If deps are provided, should we skip comparing the ref itself?
13468 var effectDeps = deps !== null && deps !== undefined ? deps.concat([ref]) : null;
13469
13470 return updateEffectImpl(Update, UnmountMutation | MountLayout, imperativeHandleEffect.bind(null, create, ref), effectDeps);
13471}
13472
13473function mountDebugValue(value, formatterFn) {
13474 // This hook is normally a no-op.
13475 // The react-debug-hooks package injects its own implementation
13476 // so that e.g. DevTools can display custom hook values.
13477}
13478
13479var updateDebugValue = mountDebugValue;
13480
13481function mountCallback(callback, deps) {
13482 var hook = mountWorkInProgressHook();
13483 var nextDeps = deps === undefined ? null : deps;
13484 hook.memoizedState = [callback, nextDeps];
13485 return callback;
13486}
13487
13488function updateCallback(callback, deps) {
13489 var hook = updateWorkInProgressHook();
13490 var nextDeps = deps === undefined ? null : deps;
13491 var prevState = hook.memoizedState;
13492 if (prevState !== null) {
13493 if (nextDeps !== null) {
13494 var prevDeps = prevState[1];
13495 if (areHookInputsEqual(nextDeps, prevDeps)) {
13496 return prevState[0];
13497 }
13498 }
13499 }
13500 hook.memoizedState = [callback, nextDeps];
13501 return callback;
13502}
13503
13504function mountMemo(nextCreate, deps) {
13505 var hook = mountWorkInProgressHook();
13506 var nextDeps = deps === undefined ? null : deps;
13507 var nextValue = nextCreate();
13508 hook.memoizedState = [nextValue, nextDeps];
13509 return nextValue;
13510}
13511
13512function updateMemo(nextCreate, deps) {
13513 var hook = updateWorkInProgressHook();
13514 var nextDeps = deps === undefined ? null : deps;
13515 var prevState = hook.memoizedState;
13516 if (prevState !== null) {
13517 // Assume these are defined. If they're not, areHookInputsEqual will warn.
13518 if (nextDeps !== null) {
13519 var prevDeps = prevState[1];
13520 if (areHookInputsEqual(nextDeps, prevDeps)) {
13521 return prevState[0];
13522 }
13523 }
13524 }
13525 var nextValue = nextCreate();
13526 hook.memoizedState = [nextValue, nextDeps];
13527 return nextValue;
13528}
13529
13530// in a test-like environment, we want to warn if dispatchAction()
13531// is called outside of a batchedUpdates/TestUtils.act(...) call.
13532var shouldWarnForUnbatchedSetState = false;
13533
13534{
13535 // jest isn't a 'global', it's just exposed to tests via a wrapped function
13536 // further, this isn't a test file, so flow doesn't recognize the symbol. So...
13537 // $FlowExpectedError - because requirements don't give a damn about your type sigs.
13538 if ('undefined' !== typeof jest) {
13539 shouldWarnForUnbatchedSetState = true;
13540 }
13541}
13542
13543function dispatchAction(fiber, queue, action) {
13544 !(numberOfReRenders < RE_RENDER_LIMIT) ? invariant(false, 'Too many re-renders. React limits the number of renders to prevent an infinite loop.') : void 0;
13545
13546 {
13547 !(arguments.length <= 3) ? warning$1(false, "State updates from the useState() and useReducer() Hooks don't support the " + 'second callback argument. To execute a side effect after ' + 'rendering, declare it in the component body with useEffect().') : void 0;
13548 }
13549
13550 var alternate = fiber.alternate;
13551 if (fiber === currentlyRenderingFiber$1 || alternate !== null && alternate === currentlyRenderingFiber$1) {
13552 // This is a render phase update. Stash it in a lazily-created map of
13553 // queue -> linked list of updates. After this render pass, we'll restart
13554 // and apply the stashed updates on top of the work-in-progress hook.
13555 didScheduleRenderPhaseUpdate = true;
13556 var update = {
13557 expirationTime: renderExpirationTime,
13558 action: action,
13559 eagerReducer: null,
13560 eagerState: null,
13561 next: null
13562 };
13563 if (renderPhaseUpdates === null) {
13564 renderPhaseUpdates = new Map();
13565 }
13566 var firstRenderPhaseUpdate = renderPhaseUpdates.get(queue);
13567 if (firstRenderPhaseUpdate === undefined) {
13568 renderPhaseUpdates.set(queue, update);
13569 } else {
13570 // Append the update to the end of the list.
13571 var lastRenderPhaseUpdate = firstRenderPhaseUpdate;
13572 while (lastRenderPhaseUpdate.next !== null) {
13573 lastRenderPhaseUpdate = lastRenderPhaseUpdate.next;
13574 }
13575 lastRenderPhaseUpdate.next = update;
13576 }
13577 } else {
13578 flushPassiveEffects();
13579
13580 var currentTime = requestCurrentTime();
13581 var _expirationTime = computeExpirationForFiber(currentTime, fiber);
13582
13583 var _update2 = {
13584 expirationTime: _expirationTime,
13585 action: action,
13586 eagerReducer: null,
13587 eagerState: null,
13588 next: null
13589 };
13590
13591 // Append the update to the end of the list.
13592 var _last = queue.last;
13593 if (_last === null) {
13594 // This is the first update. Create a circular list.
13595 _update2.next = _update2;
13596 } else {
13597 var first = _last.next;
13598 if (first !== null) {
13599 // Still circular.
13600 _update2.next = first;
13601 }
13602 _last.next = _update2;
13603 }
13604 queue.last = _update2;
13605
13606 if (fiber.expirationTime === NoWork && (alternate === null || alternate.expirationTime === NoWork)) {
13607 // The queue is currently empty, which means we can eagerly compute the
13608 // next state before entering the render phase. If the new state is the
13609 // same as the current state, we may be able to bail out entirely.
13610 var _eagerReducer = queue.eagerReducer;
13611 if (_eagerReducer !== null) {
13612 var prevDispatcher = void 0;
13613 {
13614 prevDispatcher = ReactCurrentDispatcher$1.current;
13615 ReactCurrentDispatcher$1.current = InvalidNestedHooksDispatcherOnUpdateInDEV;
13616 }
13617 try {
13618 var currentState = queue.eagerState;
13619 var _eagerState = _eagerReducer(currentState, action);
13620 // Stash the eagerly computed state, and the reducer used to compute
13621 // it, on the update object. If the reducer hasn't changed by the
13622 // time we enter the render phase, then the eager state can be used
13623 // without calling the reducer again.
13624 _update2.eagerReducer = _eagerReducer;
13625 _update2.eagerState = _eagerState;
13626 if (is(_eagerState, currentState)) {
13627 // Fast path. We can bail out without scheduling React to re-render.
13628 // It's still possible that we'll need to rebase this update later,
13629 // if the component re-renders for a different reason and by that
13630 // time the reducer has changed.
13631 return;
13632 }
13633 } catch (error) {
13634 // Suppress the error. It will throw again in the render phase.
13635 } finally {
13636 {
13637 ReactCurrentDispatcher$1.current = prevDispatcher;
13638 }
13639 }
13640 }
13641 }
13642 {
13643 if (shouldWarnForUnbatchedSetState === true) {
13644 warnIfNotCurrentlyBatchingInDev(fiber);
13645 }
13646 }
13647 scheduleWork(fiber, _expirationTime);
13648 }
13649}
13650
13651var ContextOnlyDispatcher = {
13652 readContext: readContext,
13653
13654 useCallback: throwInvalidHookError,
13655 useContext: throwInvalidHookError,
13656 useEffect: throwInvalidHookError,
13657 useImperativeHandle: throwInvalidHookError,
13658 useLayoutEffect: throwInvalidHookError,
13659 useMemo: throwInvalidHookError,
13660 useReducer: throwInvalidHookError,
13661 useRef: throwInvalidHookError,
13662 useState: throwInvalidHookError,
13663 useDebugValue: throwInvalidHookError
13664};
13665
13666var HooksDispatcherOnMountInDEV = null;
13667var HooksDispatcherOnUpdateInDEV = null;
13668var InvalidNestedHooksDispatcherOnMountInDEV = null;
13669var InvalidNestedHooksDispatcherOnUpdateInDEV = null;
13670
13671{
13672 var warnInvalidContextAccess = function () {
13673 warning$1(false, 'Context can only be read while React is rendering. ' + 'In classes, you can read it in the render method or getDerivedStateFromProps. ' + 'In function components, you can read it directly in the function body, but not ' + 'inside Hooks like useReducer() or useMemo().');
13674 };
13675
13676 var warnInvalidHookAccess = function () {
13677 warning$1(false, 'Do not call Hooks inside useEffect(...), useMemo(...), or other built-in Hooks. ' + 'You can only call Hooks at the top level of your React function. ' + 'For more information, see ' + 'https://fb.me/rules-of-hooks');
13678 };
13679
13680 HooksDispatcherOnMountInDEV = {
13681 readContext: function (context, observedBits) {
13682 return readContext(context, observedBits);
13683 },
13684 useCallback: function (callback, deps) {
13685 currentHookNameInDev = 'useCallback';
13686 return mountCallback(callback, deps);
13687 },
13688 useContext: function (context, observedBits) {
13689 currentHookNameInDev = 'useContext';
13690 return mountContext(context, observedBits);
13691 },
13692 useEffect: function (create, deps) {
13693 currentHookNameInDev = 'useEffect';
13694 return mountEffect(create, deps);
13695 },
13696 useImperativeHandle: function (ref, create, deps) {
13697 currentHookNameInDev = 'useImperativeHandle';
13698 return mountImperativeHandle(ref, create, deps);
13699 },
13700 useLayoutEffect: function (create, deps) {
13701 currentHookNameInDev = 'useLayoutEffect';
13702 return mountLayoutEffect(create, deps);
13703 },
13704 useMemo: function (create, deps) {
13705 currentHookNameInDev = 'useMemo';
13706 var prevDispatcher = ReactCurrentDispatcher$1.current;
13707 ReactCurrentDispatcher$1.current = InvalidNestedHooksDispatcherOnMountInDEV;
13708 try {
13709 return mountMemo(create, deps);
13710 } finally {
13711 ReactCurrentDispatcher$1.current = prevDispatcher;
13712 }
13713 },
13714 useReducer: function (reducer, initialArg, init) {
13715 currentHookNameInDev = 'useReducer';
13716 var prevDispatcher = ReactCurrentDispatcher$1.current;
13717 ReactCurrentDispatcher$1.current = InvalidNestedHooksDispatcherOnMountInDEV;
13718 try {
13719 return mountReducer(reducer, initialArg, init);
13720 } finally {
13721 ReactCurrentDispatcher$1.current = prevDispatcher;
13722 }
13723 },
13724 useRef: function (initialValue) {
13725 currentHookNameInDev = 'useRef';
13726 return mountRef(initialValue);
13727 },
13728 useState: function (initialState) {
13729 currentHookNameInDev = 'useState';
13730 var prevDispatcher = ReactCurrentDispatcher$1.current;
13731 ReactCurrentDispatcher$1.current = InvalidNestedHooksDispatcherOnMountInDEV;
13732 try {
13733 return mountState(initialState);
13734 } finally {
13735 ReactCurrentDispatcher$1.current = prevDispatcher;
13736 }
13737 },
13738 useDebugValue: function (value, formatterFn) {
13739 currentHookNameInDev = 'useDebugValue';
13740 return mountDebugValue(value, formatterFn);
13741 }
13742 };
13743
13744 HooksDispatcherOnUpdateInDEV = {
13745 readContext: function (context, observedBits) {
13746 return readContext(context, observedBits);
13747 },
13748 useCallback: function (callback, deps) {
13749 currentHookNameInDev = 'useCallback';
13750 return updateCallback(callback, deps);
13751 },
13752 useContext: function (context, observedBits) {
13753 currentHookNameInDev = 'useContext';
13754 return updateContext(context, observedBits);
13755 },
13756 useEffect: function (create, deps) {
13757 currentHookNameInDev = 'useEffect';
13758 return updateEffect(create, deps);
13759 },
13760 useImperativeHandle: function (ref, create, deps) {
13761 currentHookNameInDev = 'useImperativeHandle';
13762 return updateImperativeHandle(ref, create, deps);
13763 },
13764 useLayoutEffect: function (create, deps) {
13765 currentHookNameInDev = 'useLayoutEffect';
13766 return updateLayoutEffect(create, deps);
13767 },
13768 useMemo: function (create, deps) {
13769 currentHookNameInDev = 'useMemo';
13770 var prevDispatcher = ReactCurrentDispatcher$1.current;
13771 ReactCurrentDispatcher$1.current = InvalidNestedHooksDispatcherOnUpdateInDEV;
13772 try {
13773 return updateMemo(create, deps);
13774 } finally {
13775 ReactCurrentDispatcher$1.current = prevDispatcher;
13776 }
13777 },
13778 useReducer: function (reducer, initialArg, init) {
13779 currentHookNameInDev = 'useReducer';
13780 var prevDispatcher = ReactCurrentDispatcher$1.current;
13781 ReactCurrentDispatcher$1.current = InvalidNestedHooksDispatcherOnUpdateInDEV;
13782 try {
13783 return updateReducer(reducer, initialArg, init);
13784 } finally {
13785 ReactCurrentDispatcher$1.current = prevDispatcher;
13786 }
13787 },
13788 useRef: function (initialValue) {
13789 currentHookNameInDev = 'useRef';
13790 return updateRef(initialValue);
13791 },
13792 useState: function (initialState) {
13793 currentHookNameInDev = 'useState';
13794 var prevDispatcher = ReactCurrentDispatcher$1.current;
13795 ReactCurrentDispatcher$1.current = InvalidNestedHooksDispatcherOnUpdateInDEV;
13796 try {
13797 return updateState(initialState);
13798 } finally {
13799 ReactCurrentDispatcher$1.current = prevDispatcher;
13800 }
13801 },
13802 useDebugValue: function (value, formatterFn) {
13803 currentHookNameInDev = 'useDebugValue';
13804 return updateDebugValue(value, formatterFn);
13805 }
13806 };
13807
13808 InvalidNestedHooksDispatcherOnMountInDEV = {
13809 readContext: function (context, observedBits) {
13810 warnInvalidContextAccess();
13811 return readContext(context, observedBits);
13812 },
13813 useCallback: function (callback, deps) {
13814 currentHookNameInDev = 'useCallback';
13815 warnInvalidHookAccess();
13816 return mountCallback(callback, deps);
13817 },
13818 useContext: function (context, observedBits) {
13819 currentHookNameInDev = 'useContext';
13820 warnInvalidHookAccess();
13821 return mountContext(context, observedBits);
13822 },
13823 useEffect: function (create, deps) {
13824 currentHookNameInDev = 'useEffect';
13825 warnInvalidHookAccess();
13826 return mountEffect(create, deps);
13827 },
13828 useImperativeHandle: function (ref, create, deps) {
13829 currentHookNameInDev = 'useImperativeHandle';
13830 warnInvalidHookAccess();
13831 return mountImperativeHandle(ref, create, deps);
13832 },
13833 useLayoutEffect: function (create, deps) {
13834 currentHookNameInDev = 'useLayoutEffect';
13835 warnInvalidHookAccess();
13836 return mountLayoutEffect(create, deps);
13837 },
13838 useMemo: function (create, deps) {
13839 currentHookNameInDev = 'useMemo';
13840 warnInvalidHookAccess();
13841 var prevDispatcher = ReactCurrentDispatcher$1.current;
13842 ReactCurrentDispatcher$1.current = InvalidNestedHooksDispatcherOnMountInDEV;
13843 try {
13844 return mountMemo(create, deps);
13845 } finally {
13846 ReactCurrentDispatcher$1.current = prevDispatcher;
13847 }
13848 },
13849 useReducer: function (reducer, initialArg, init) {
13850 currentHookNameInDev = 'useReducer';
13851 warnInvalidHookAccess();
13852 var prevDispatcher = ReactCurrentDispatcher$1.current;
13853 ReactCurrentDispatcher$1.current = InvalidNestedHooksDispatcherOnMountInDEV;
13854 try {
13855 return mountReducer(reducer, initialArg, init);
13856 } finally {
13857 ReactCurrentDispatcher$1.current = prevDispatcher;
13858 }
13859 },
13860 useRef: function (initialValue) {
13861 currentHookNameInDev = 'useRef';
13862 warnInvalidHookAccess();
13863 return mountRef(initialValue);
13864 },
13865 useState: function (initialState) {
13866 currentHookNameInDev = 'useState';
13867 warnInvalidHookAccess();
13868 var prevDispatcher = ReactCurrentDispatcher$1.current;
13869 ReactCurrentDispatcher$1.current = InvalidNestedHooksDispatcherOnMountInDEV;
13870 try {
13871 return mountState(initialState);
13872 } finally {
13873 ReactCurrentDispatcher$1.current = prevDispatcher;
13874 }
13875 },
13876 useDebugValue: function (value, formatterFn) {
13877 currentHookNameInDev = 'useDebugValue';
13878 warnInvalidHookAccess();
13879 return mountDebugValue(value, formatterFn);
13880 }
13881 };
13882
13883 InvalidNestedHooksDispatcherOnUpdateInDEV = {
13884 readContext: function (context, observedBits) {
13885 warnInvalidContextAccess();
13886 return readContext(context, observedBits);
13887 },
13888 useCallback: function (callback, deps) {
13889 currentHookNameInDev = 'useCallback';
13890 warnInvalidHookAccess();
13891 return updateCallback(callback, deps);
13892 },
13893 useContext: function (context, observedBits) {
13894 currentHookNameInDev = 'useContext';
13895 warnInvalidHookAccess();
13896 return updateContext(context, observedBits);
13897 },
13898 useEffect: function (create, deps) {
13899 currentHookNameInDev = 'useEffect';
13900 warnInvalidHookAccess();
13901 return updateEffect(create, deps);
13902 },
13903 useImperativeHandle: function (ref, create, deps) {
13904 currentHookNameInDev = 'useImperativeHandle';
13905 warnInvalidHookAccess();
13906 return updateImperativeHandle(ref, create, deps);
13907 },
13908 useLayoutEffect: function (create, deps) {
13909 currentHookNameInDev = 'useLayoutEffect';
13910 warnInvalidHookAccess();
13911 return updateLayoutEffect(create, deps);
13912 },
13913 useMemo: function (create, deps) {
13914 currentHookNameInDev = 'useMemo';
13915 warnInvalidHookAccess();
13916 var prevDispatcher = ReactCurrentDispatcher$1.current;
13917 ReactCurrentDispatcher$1.current = InvalidNestedHooksDispatcherOnUpdateInDEV;
13918 try {
13919 return updateMemo(create, deps);
13920 } finally {
13921 ReactCurrentDispatcher$1.current = prevDispatcher;
13922 }
13923 },
13924 useReducer: function (reducer, initialArg, init) {
13925 currentHookNameInDev = 'useReducer';
13926 warnInvalidHookAccess();
13927 var prevDispatcher = ReactCurrentDispatcher$1.current;
13928 ReactCurrentDispatcher$1.current = InvalidNestedHooksDispatcherOnUpdateInDEV;
13929 try {
13930 return updateReducer(reducer, initialArg, init);
13931 } finally {
13932 ReactCurrentDispatcher$1.current = prevDispatcher;
13933 }
13934 },
13935 useRef: function (initialValue) {
13936 currentHookNameInDev = 'useRef';
13937 warnInvalidHookAccess();
13938 return updateRef(initialValue);
13939 },
13940 useState: function (initialState) {
13941 currentHookNameInDev = 'useState';
13942 warnInvalidHookAccess();
13943 var prevDispatcher = ReactCurrentDispatcher$1.current;
13944 ReactCurrentDispatcher$1.current = InvalidNestedHooksDispatcherOnUpdateInDEV;
13945 try {
13946 return updateState(initialState);
13947 } finally {
13948 ReactCurrentDispatcher$1.current = prevDispatcher;
13949 }
13950 },
13951 useDebugValue: function (value, formatterFn) {
13952 currentHookNameInDev = 'useDebugValue';
13953 warnInvalidHookAccess();
13954 return updateDebugValue(value, formatterFn);
13955 }
13956 };
13957}
13958
13959var commitTime = 0;
13960var profilerStartTime = -1;
13961
13962function getCommitTime() {
13963 return commitTime;
13964}
13965
13966function recordCommitTime() {
13967 if (!enableProfilerTimer) {
13968 return;
13969 }
13970 commitTime = unstable_now();
13971}
13972
13973function startProfilerTimer(fiber) {
13974 if (!enableProfilerTimer) {
13975 return;
13976 }
13977
13978 profilerStartTime = unstable_now();
13979
13980 if (fiber.actualStartTime < 0) {
13981 fiber.actualStartTime = unstable_now();
13982 }
13983}
13984
13985function stopProfilerTimerIfRunning(fiber) {
13986 if (!enableProfilerTimer) {
13987 return;
13988 }
13989 profilerStartTime = -1;
13990}
13991
13992function stopProfilerTimerIfRunningAndRecordDelta(fiber, overrideBaseTime) {
13993 if (!enableProfilerTimer) {
13994 return;
13995 }
13996
13997 if (profilerStartTime >= 0) {
13998 var elapsedTime = unstable_now() - profilerStartTime;
13999 fiber.actualDuration += elapsedTime;
14000 if (overrideBaseTime) {
14001 fiber.selfBaseDuration = elapsedTime;
14002 }
14003 profilerStartTime = -1;
14004 }
14005}
14006
14007// The deepest Fiber on the stack involved in a hydration context.
14008// This may have been an insertion or a hydration.
14009var hydrationParentFiber = null;
14010var nextHydratableInstance = null;
14011var isHydrating = false;
14012
14013function enterHydrationState(fiber) {
14014 if (!supportsHydration) {
14015 return false;
14016 }
14017
14018 var parentInstance = fiber.stateNode.containerInfo;
14019 nextHydratableInstance = getFirstHydratableChild(parentInstance);
14020 hydrationParentFiber = fiber;
14021 isHydrating = true;
14022 return true;
14023}
14024
14025function reenterHydrationStateFromDehydratedSuspenseInstance(fiber) {
14026 if (!supportsHydration) {
14027 return false;
14028 }
14029
14030 var suspenseInstance = fiber.stateNode;
14031 nextHydratableInstance = getNextHydratableSibling(suspenseInstance);
14032 popToNextHostParent(fiber);
14033 isHydrating = true;
14034 return true;
14035}
14036
14037function deleteHydratableInstance(returnFiber, instance) {
14038 {
14039 switch (returnFiber.tag) {
14040 case HostRoot:
14041 didNotHydrateContainerInstance(returnFiber.stateNode.containerInfo, instance);
14042 break;
14043 case HostComponent:
14044 didNotHydrateInstance(returnFiber.type, returnFiber.memoizedProps, returnFiber.stateNode, instance);
14045 break;
14046 }
14047 }
14048
14049 var childToDelete = createFiberFromHostInstanceForDeletion();
14050 childToDelete.stateNode = instance;
14051 childToDelete.return = returnFiber;
14052 childToDelete.effectTag = Deletion;
14053
14054 // This might seem like it belongs on progressedFirstDeletion. However,
14055 // these children are not part of the reconciliation list of children.
14056 // Even if we abort and rereconcile the children, that will try to hydrate
14057 // again and the nodes are still in the host tree so these will be
14058 // recreated.
14059 if (returnFiber.lastEffect !== null) {
14060 returnFiber.lastEffect.nextEffect = childToDelete;
14061 returnFiber.lastEffect = childToDelete;
14062 } else {
14063 returnFiber.firstEffect = returnFiber.lastEffect = childToDelete;
14064 }
14065}
14066
14067function insertNonHydratedInstance(returnFiber, fiber) {
14068 fiber.effectTag |= Placement;
14069 {
14070 switch (returnFiber.tag) {
14071 case HostRoot:
14072 {
14073 var parentContainer = returnFiber.stateNode.containerInfo;
14074 switch (fiber.tag) {
14075 case HostComponent:
14076 var type = fiber.type;
14077 var props = fiber.pendingProps;
14078 didNotFindHydratableContainerInstance(parentContainer, type, props);
14079 break;
14080 case HostText:
14081 var text = fiber.pendingProps;
14082 didNotFindHydratableContainerTextInstance(parentContainer, text);
14083 break;
14084 case SuspenseComponent:
14085
14086 break;
14087 }
14088 break;
14089 }
14090 case HostComponent:
14091 {
14092 var parentType = returnFiber.type;
14093 var parentProps = returnFiber.memoizedProps;
14094 var parentInstance = returnFiber.stateNode;
14095 switch (fiber.tag) {
14096 case HostComponent:
14097 var _type = fiber.type;
14098 var _props = fiber.pendingProps;
14099 didNotFindHydratableInstance(parentType, parentProps, parentInstance, _type, _props);
14100 break;
14101 case HostText:
14102 var _text = fiber.pendingProps;
14103 didNotFindHydratableTextInstance(parentType, parentProps, parentInstance, _text);
14104 break;
14105 case SuspenseComponent:
14106 didNotFindHydratableSuspenseInstance(parentType, parentProps, parentInstance);
14107 break;
14108 }
14109 break;
14110 }
14111 default:
14112 return;
14113 }
14114 }
14115}
14116
14117function tryHydrate(fiber, nextInstance) {
14118 switch (fiber.tag) {
14119 case HostComponent:
14120 {
14121 var type = fiber.type;
14122 var props = fiber.pendingProps;
14123 var instance = canHydrateInstance(nextInstance, type, props);
14124 if (instance !== null) {
14125 fiber.stateNode = instance;
14126 return true;
14127 }
14128 return false;
14129 }
14130 case HostText:
14131 {
14132 var text = fiber.pendingProps;
14133 var textInstance = canHydrateTextInstance(nextInstance, text);
14134 if (textInstance !== null) {
14135 fiber.stateNode = textInstance;
14136 return true;
14137 }
14138 return false;
14139 }
14140 case SuspenseComponent:
14141 {
14142 if (enableSuspenseServerRenderer) {
14143 var suspenseInstance = canHydrateSuspenseInstance(nextInstance);
14144 if (suspenseInstance !== null) {
14145 // Downgrade the tag to a dehydrated component until we've hydrated it.
14146 fiber.tag = DehydratedSuspenseComponent;
14147 fiber.stateNode = suspenseInstance;
14148 return true;
14149 }
14150 }
14151 return false;
14152 }
14153 default:
14154 return false;
14155 }
14156}
14157
14158function tryToClaimNextHydratableInstance(fiber) {
14159 if (!isHydrating) {
14160 return;
14161 }
14162 var nextInstance = nextHydratableInstance;
14163 if (!nextInstance) {
14164 // Nothing to hydrate. Make it an insertion.
14165 insertNonHydratedInstance(hydrationParentFiber, fiber);
14166 isHydrating = false;
14167 hydrationParentFiber = fiber;
14168 return;
14169 }
14170 var firstAttemptedInstance = nextInstance;
14171 if (!tryHydrate(fiber, nextInstance)) {
14172 // If we can't hydrate this instance let's try the next one.
14173 // We use this as a heuristic. It's based on intuition and not data so it
14174 // might be flawed or unnecessary.
14175 nextInstance = getNextHydratableSibling(firstAttemptedInstance);
14176 if (!nextInstance || !tryHydrate(fiber, nextInstance)) {
14177 // Nothing to hydrate. Make it an insertion.
14178 insertNonHydratedInstance(hydrationParentFiber, fiber);
14179 isHydrating = false;
14180 hydrationParentFiber = fiber;
14181 return;
14182 }
14183 // We matched the next one, we'll now assume that the first one was
14184 // superfluous and we'll delete it. Since we can't eagerly delete it
14185 // we'll have to schedule a deletion. To do that, this node needs a dummy
14186 // fiber associated with it.
14187 deleteHydratableInstance(hydrationParentFiber, firstAttemptedInstance);
14188 }
14189 hydrationParentFiber = fiber;
14190 nextHydratableInstance = getFirstHydratableChild(nextInstance);
14191}
14192
14193function prepareToHydrateHostInstance(fiber, rootContainerInstance, hostContext) {
14194 if (!supportsHydration) {
14195 invariant(false, 'Expected prepareToHydrateHostInstance() to never be called. This error is likely caused by a bug in React. Please file an issue.');
14196 }
14197
14198 var instance = fiber.stateNode;
14199 var updatePayload = hydrateInstance(instance, fiber.type, fiber.memoizedProps, rootContainerInstance, hostContext, fiber);
14200 // TODO: Type this specific to this type of component.
14201 fiber.updateQueue = updatePayload;
14202 // If the update payload indicates that there is a change or if there
14203 // is a new ref we mark this as an update.
14204 if (updatePayload !== null) {
14205 return true;
14206 }
14207 return false;
14208}
14209
14210function prepareToHydrateHostTextInstance(fiber) {
14211 if (!supportsHydration) {
14212 invariant(false, 'Expected prepareToHydrateHostTextInstance() to never be called. This error is likely caused by a bug in React. Please file an issue.');
14213 }
14214
14215 var textInstance = fiber.stateNode;
14216 var textContent = fiber.memoizedProps;
14217 var shouldUpdate = hydrateTextInstance(textInstance, textContent, fiber);
14218 {
14219 if (shouldUpdate) {
14220 // We assume that prepareToHydrateHostTextInstance is called in a context where the
14221 // hydration parent is the parent host component of this host text.
14222 var returnFiber = hydrationParentFiber;
14223 if (returnFiber !== null) {
14224 switch (returnFiber.tag) {
14225 case HostRoot:
14226 {
14227 var parentContainer = returnFiber.stateNode.containerInfo;
14228 didNotMatchHydratedContainerTextInstance(parentContainer, textInstance, textContent);
14229 break;
14230 }
14231 case HostComponent:
14232 {
14233 var parentType = returnFiber.type;
14234 var parentProps = returnFiber.memoizedProps;
14235 var parentInstance = returnFiber.stateNode;
14236 didNotMatchHydratedTextInstance(parentType, parentProps, parentInstance, textInstance, textContent);
14237 break;
14238 }
14239 }
14240 }
14241 }
14242 }
14243 return shouldUpdate;
14244}
14245
14246function skipPastDehydratedSuspenseInstance(fiber) {
14247 if (!supportsHydration) {
14248 invariant(false, 'Expected skipPastDehydratedSuspenseInstance() to never be called. This error is likely caused by a bug in React. Please file an issue.');
14249 }
14250 var suspenseInstance = fiber.stateNode;
14251 !suspenseInstance ? invariant(false, 'Expected to have a hydrated suspense instance. This error is likely caused by a bug in React. Please file an issue.') : void 0;
14252 nextHydratableInstance = getNextHydratableInstanceAfterSuspenseInstance(suspenseInstance);
14253}
14254
14255function popToNextHostParent(fiber) {
14256 var parent = fiber.return;
14257 while (parent !== null && parent.tag !== HostComponent && parent.tag !== HostRoot && parent.tag !== DehydratedSuspenseComponent) {
14258 parent = parent.return;
14259 }
14260 hydrationParentFiber = parent;
14261}
14262
14263function popHydrationState(fiber) {
14264 if (!supportsHydration) {
14265 return false;
14266 }
14267 if (fiber !== hydrationParentFiber) {
14268 // We're deeper than the current hydration context, inside an inserted
14269 // tree.
14270 return false;
14271 }
14272 if (!isHydrating) {
14273 // If we're not currently hydrating but we're in a hydration context, then
14274 // we were an insertion and now need to pop up reenter hydration of our
14275 // siblings.
14276 popToNextHostParent(fiber);
14277 isHydrating = true;
14278 return false;
14279 }
14280
14281 var type = fiber.type;
14282
14283 // If we have any remaining hydratable nodes, we need to delete them now.
14284 // We only do this deeper than head and body since they tend to have random
14285 // other nodes in them. We also ignore components with pure text content in
14286 // side of them.
14287 // TODO: Better heuristic.
14288 if (fiber.tag !== HostComponent || type !== 'head' && type !== 'body' && !shouldSetTextContent(type, fiber.memoizedProps)) {
14289 var nextInstance = nextHydratableInstance;
14290 while (nextInstance) {
14291 deleteHydratableInstance(fiber, nextInstance);
14292 nextInstance = getNextHydratableSibling(nextInstance);
14293 }
14294 }
14295
14296 popToNextHostParent(fiber);
14297 nextHydratableInstance = hydrationParentFiber ? getNextHydratableSibling(fiber.stateNode) : null;
14298 return true;
14299}
14300
14301function resetHydrationState() {
14302 if (!supportsHydration) {
14303 return;
14304 }
14305
14306 hydrationParentFiber = null;
14307 nextHydratableInstance = null;
14308 isHydrating = false;
14309}
14310
14311var ReactCurrentOwner$3 = ReactSharedInternals.ReactCurrentOwner;
14312
14313var didReceiveUpdate = false;
14314
14315var didWarnAboutBadClass = void 0;
14316var didWarnAboutContextTypeOnFunctionComponent = void 0;
14317var didWarnAboutGetDerivedStateOnFunctionComponent = void 0;
14318var didWarnAboutFunctionRefs = void 0;
14319var didWarnAboutReassigningProps = void 0;
14320
14321{
14322 didWarnAboutBadClass = {};
14323 didWarnAboutContextTypeOnFunctionComponent = {};
14324 didWarnAboutGetDerivedStateOnFunctionComponent = {};
14325 didWarnAboutFunctionRefs = {};
14326 didWarnAboutReassigningProps = false;
14327}
14328
14329function reconcileChildren(current$$1, workInProgress, nextChildren, renderExpirationTime) {
14330 if (current$$1 === null) {
14331 // If this is a fresh new component that hasn't been rendered yet, we
14332 // won't update its child set by applying minimal side-effects. Instead,
14333 // we will add them all to the child before it gets rendered. That means
14334 // we can optimize this reconciliation pass by not tracking side-effects.
14335 workInProgress.child = mountChildFibers(workInProgress, null, nextChildren, renderExpirationTime);
14336 } else {
14337 // If the current child is the same as the work in progress, it means that
14338 // we haven't yet started any work on these children. Therefore, we use
14339 // the clone algorithm to create a copy of all the current children.
14340
14341 // If we had any progressed work already, that is invalid at this point so
14342 // let's throw it out.
14343 workInProgress.child = reconcileChildFibers(workInProgress, current$$1.child, nextChildren, renderExpirationTime);
14344 }
14345}
14346
14347function forceUnmountCurrentAndReconcile(current$$1, workInProgress, nextChildren, renderExpirationTime) {
14348 // This function is fork of reconcileChildren. It's used in cases where we
14349 // want to reconcile without matching against the existing set. This has the
14350 // effect of all current children being unmounted; even if the type and key
14351 // are the same, the old child is unmounted and a new child is created.
14352 //
14353 // To do this, we're going to go through the reconcile algorithm twice. In
14354 // the first pass, we schedule a deletion for all the current children by
14355 // passing null.
14356 workInProgress.child = reconcileChildFibers(workInProgress, current$$1.child, null, renderExpirationTime);
14357 // In the second pass, we mount the new children. The trick here is that we
14358 // pass null in place of where we usually pass the current child set. This has
14359 // the effect of remounting all children regardless of whether their their
14360 // identity matches.
14361 workInProgress.child = reconcileChildFibers(workInProgress, null, nextChildren, renderExpirationTime);
14362}
14363
14364function updateForwardRef(current$$1, workInProgress, Component, nextProps, renderExpirationTime) {
14365 // TODO: current can be non-null here even if the component
14366 // hasn't yet mounted. This happens after the first render suspends.
14367 // We'll need to figure out if this is fine or can cause issues.
14368
14369 {
14370 if (workInProgress.type !== workInProgress.elementType) {
14371 // Lazy component props can't be validated in createElement
14372 // because they're only guaranteed to be resolved here.
14373 var innerPropTypes = Component.propTypes;
14374 if (innerPropTypes) {
14375 checkPropTypes_1(innerPropTypes, nextProps, // Resolved props
14376 'prop', getComponentName(Component), getCurrentFiberStackInDev);
14377 }
14378 }
14379 }
14380
14381 var render = Component.render;
14382 var ref = workInProgress.ref;
14383
14384 // The rest is a fork of updateFunctionComponent
14385 var nextChildren = void 0;
14386 prepareToReadContext(workInProgress, renderExpirationTime);
14387 {
14388 ReactCurrentOwner$3.current = workInProgress;
14389 setCurrentPhase('render');
14390 nextChildren = renderWithHooks(current$$1, workInProgress, render, nextProps, ref, renderExpirationTime);
14391 if (debugRenderPhaseSideEffects || debugRenderPhaseSideEffectsForStrictMode && workInProgress.mode & StrictMode) {
14392 // Only double-render components with Hooks
14393 if (workInProgress.memoizedState !== null) {
14394 nextChildren = renderWithHooks(current$$1, workInProgress, render, nextProps, ref, renderExpirationTime);
14395 }
14396 }
14397 setCurrentPhase(null);
14398 }
14399
14400 if (current$$1 !== null && !didReceiveUpdate) {
14401 bailoutHooks(current$$1, workInProgress, renderExpirationTime);
14402 return bailoutOnAlreadyFinishedWork(current$$1, workInProgress, renderExpirationTime);
14403 }
14404
14405 // React DevTools reads this flag.
14406 workInProgress.effectTag |= PerformedWork;
14407 reconcileChildren(current$$1, workInProgress, nextChildren, renderExpirationTime);
14408 return workInProgress.child;
14409}
14410
14411function updateMemoComponent(current$$1, workInProgress, Component, nextProps, updateExpirationTime, renderExpirationTime) {
14412 if (current$$1 === null) {
14413 var type = Component.type;
14414 if (isSimpleFunctionComponent(type) && Component.compare === null &&
14415 // SimpleMemoComponent codepath doesn't resolve outer props either.
14416 Component.defaultProps === undefined) {
14417 // If this is a plain function component without default props,
14418 // and with only the default shallow comparison, we upgrade it
14419 // to a SimpleMemoComponent to allow fast path updates.
14420 workInProgress.tag = SimpleMemoComponent;
14421 workInProgress.type = type;
14422 {
14423 validateFunctionComponentInDev(workInProgress, type);
14424 }
14425 return updateSimpleMemoComponent(current$$1, workInProgress, type, nextProps, updateExpirationTime, renderExpirationTime);
14426 }
14427 {
14428 var innerPropTypes = type.propTypes;
14429 if (innerPropTypes) {
14430 // Inner memo component props aren't currently validated in createElement.
14431 // We could move it there, but we'd still need this for lazy code path.
14432 checkPropTypes_1(innerPropTypes, nextProps, // Resolved props
14433 'prop', getComponentName(type), getCurrentFiberStackInDev);
14434 }
14435 }
14436 var child = createFiberFromTypeAndProps(Component.type, null, nextProps, null, workInProgress.mode, renderExpirationTime);
14437 child.ref = workInProgress.ref;
14438 child.return = workInProgress;
14439 workInProgress.child = child;
14440 return child;
14441 }
14442 {
14443 var _type = Component.type;
14444 var _innerPropTypes = _type.propTypes;
14445 if (_innerPropTypes) {
14446 // Inner memo component props aren't currently validated in createElement.
14447 // We could move it there, but we'd still need this for lazy code path.
14448 checkPropTypes_1(_innerPropTypes, nextProps, // Resolved props
14449 'prop', getComponentName(_type), getCurrentFiberStackInDev);
14450 }
14451 }
14452 var currentChild = current$$1.child; // This is always exactly one child
14453 if (updateExpirationTime < renderExpirationTime) {
14454 // This will be the props with resolved defaultProps,
14455 // unlike current.memoizedProps which will be the unresolved ones.
14456 var prevProps = currentChild.memoizedProps;
14457 // Default to shallow comparison
14458 var compare = Component.compare;
14459 compare = compare !== null ? compare : shallowEqual;
14460 if (compare(prevProps, nextProps) && current$$1.ref === workInProgress.ref) {
14461 return bailoutOnAlreadyFinishedWork(current$$1, workInProgress, renderExpirationTime);
14462 }
14463 }
14464 // React DevTools reads this flag.
14465 workInProgress.effectTag |= PerformedWork;
14466 var newChild = createWorkInProgress(currentChild, nextProps, renderExpirationTime);
14467 newChild.ref = workInProgress.ref;
14468 newChild.return = workInProgress;
14469 workInProgress.child = newChild;
14470 return newChild;
14471}
14472
14473function updateSimpleMemoComponent(current$$1, workInProgress, Component, nextProps, updateExpirationTime, renderExpirationTime) {
14474 // TODO: current can be non-null here even if the component
14475 // hasn't yet mounted. This happens when the inner render suspends.
14476 // We'll need to figure out if this is fine or can cause issues.
14477
14478 {
14479 if (workInProgress.type !== workInProgress.elementType) {
14480 // Lazy component props can't be validated in createElement
14481 // because they're only guaranteed to be resolved here.
14482 var outerMemoType = workInProgress.elementType;
14483 if (outerMemoType.$$typeof === REACT_LAZY_TYPE) {
14484 // We warn when you define propTypes on lazy()
14485 // so let's just skip over it to find memo() outer wrapper.
14486 // Inner props for memo are validated later.
14487 outerMemoType = refineResolvedLazyComponent(outerMemoType);
14488 }
14489 var outerPropTypes = outerMemoType && outerMemoType.propTypes;
14490 if (outerPropTypes) {
14491 checkPropTypes_1(outerPropTypes, nextProps, // Resolved (SimpleMemoComponent has no defaultProps)
14492 'prop', getComponentName(outerMemoType), getCurrentFiberStackInDev);
14493 }
14494 // Inner propTypes will be validated in the function component path.
14495 }
14496 }
14497 if (current$$1 !== null) {
14498 var prevProps = current$$1.memoizedProps;
14499 if (shallowEqual(prevProps, nextProps) && current$$1.ref === workInProgress.ref) {
14500 didReceiveUpdate = false;
14501 if (updateExpirationTime < renderExpirationTime) {
14502 return bailoutOnAlreadyFinishedWork(current$$1, workInProgress, renderExpirationTime);
14503 }
14504 }
14505 }
14506 return updateFunctionComponent(current$$1, workInProgress, Component, nextProps, renderExpirationTime);
14507}
14508
14509function updateFragment(current$$1, workInProgress, renderExpirationTime) {
14510 var nextChildren = workInProgress.pendingProps;
14511 reconcileChildren(current$$1, workInProgress, nextChildren, renderExpirationTime);
14512 return workInProgress.child;
14513}
14514
14515function updateMode(current$$1, workInProgress, renderExpirationTime) {
14516 var nextChildren = workInProgress.pendingProps.children;
14517 reconcileChildren(current$$1, workInProgress, nextChildren, renderExpirationTime);
14518 return workInProgress.child;
14519}
14520
14521function updateProfiler(current$$1, workInProgress, renderExpirationTime) {
14522 if (enableProfilerTimer) {
14523 workInProgress.effectTag |= Update;
14524 }
14525 var nextProps = workInProgress.pendingProps;
14526 var nextChildren = nextProps.children;
14527 reconcileChildren(current$$1, workInProgress, nextChildren, renderExpirationTime);
14528 return workInProgress.child;
14529}
14530
14531function markRef(current$$1, workInProgress) {
14532 var ref = workInProgress.ref;
14533 if (current$$1 === null && ref !== null || current$$1 !== null && current$$1.ref !== ref) {
14534 // Schedule a Ref effect
14535 workInProgress.effectTag |= Ref;
14536 }
14537}
14538
14539function updateFunctionComponent(current$$1, workInProgress, Component, nextProps, renderExpirationTime) {
14540 {
14541 if (workInProgress.type !== workInProgress.elementType) {
14542 // Lazy component props can't be validated in createElement
14543 // because they're only guaranteed to be resolved here.
14544 var innerPropTypes = Component.propTypes;
14545 if (innerPropTypes) {
14546 checkPropTypes_1(innerPropTypes, nextProps, // Resolved props
14547 'prop', getComponentName(Component), getCurrentFiberStackInDev);
14548 }
14549 }
14550 }
14551
14552 var unmaskedContext = getUnmaskedContext(workInProgress, Component, true);
14553 var context = getMaskedContext(workInProgress, unmaskedContext);
14554
14555 var nextChildren = void 0;
14556 prepareToReadContext(workInProgress, renderExpirationTime);
14557 {
14558 ReactCurrentOwner$3.current = workInProgress;
14559 setCurrentPhase('render');
14560 nextChildren = renderWithHooks(current$$1, workInProgress, Component, nextProps, context, renderExpirationTime);
14561 if (debugRenderPhaseSideEffects || debugRenderPhaseSideEffectsForStrictMode && workInProgress.mode & StrictMode) {
14562 // Only double-render components with Hooks
14563 if (workInProgress.memoizedState !== null) {
14564 nextChildren = renderWithHooks(current$$1, workInProgress, Component, nextProps, context, renderExpirationTime);
14565 }
14566 }
14567 setCurrentPhase(null);
14568 }
14569
14570 if (current$$1 !== null && !didReceiveUpdate) {
14571 bailoutHooks(current$$1, workInProgress, renderExpirationTime);
14572 return bailoutOnAlreadyFinishedWork(current$$1, workInProgress, renderExpirationTime);
14573 }
14574
14575 // React DevTools reads this flag.
14576 workInProgress.effectTag |= PerformedWork;
14577 reconcileChildren(current$$1, workInProgress, nextChildren, renderExpirationTime);
14578 return workInProgress.child;
14579}
14580
14581function updateClassComponent(current$$1, workInProgress, Component, nextProps, renderExpirationTime) {
14582 {
14583 if (workInProgress.type !== workInProgress.elementType) {
14584 // Lazy component props can't be validated in createElement
14585 // because they're only guaranteed to be resolved here.
14586 var innerPropTypes = Component.propTypes;
14587 if (innerPropTypes) {
14588 checkPropTypes_1(innerPropTypes, nextProps, // Resolved props
14589 'prop', getComponentName(Component), getCurrentFiberStackInDev);
14590 }
14591 }
14592 }
14593
14594 // Push context providers early to prevent context stack mismatches.
14595 // During mounting we don't know the child context yet as the instance doesn't exist.
14596 // We will invalidate the child context in finishClassComponent() right after rendering.
14597 var hasContext = void 0;
14598 if (isContextProvider(Component)) {
14599 hasContext = true;
14600 pushContextProvider(workInProgress);
14601 } else {
14602 hasContext = false;
14603 }
14604 prepareToReadContext(workInProgress, renderExpirationTime);
14605
14606 var instance = workInProgress.stateNode;
14607 var shouldUpdate = void 0;
14608 if (instance === null) {
14609 if (current$$1 !== null) {
14610 // An class component without an instance only mounts if it suspended
14611 // inside a non- concurrent tree, in an inconsistent state. We want to
14612 // tree it like a new mount, even though an empty version of it already
14613 // committed. Disconnect the alternate pointers.
14614 current$$1.alternate = null;
14615 workInProgress.alternate = null;
14616 // Since this is conceptually a new fiber, schedule a Placement effect
14617 workInProgress.effectTag |= Placement;
14618 }
14619 // In the initial pass we might need to construct the instance.
14620 constructClassInstance(workInProgress, Component, nextProps, renderExpirationTime);
14621 mountClassInstance(workInProgress, Component, nextProps, renderExpirationTime);
14622 shouldUpdate = true;
14623 } else if (current$$1 === null) {
14624 // In a resume, we'll already have an instance we can reuse.
14625 shouldUpdate = resumeMountClassInstance(workInProgress, Component, nextProps, renderExpirationTime);
14626 } else {
14627 shouldUpdate = updateClassInstance(current$$1, workInProgress, Component, nextProps, renderExpirationTime);
14628 }
14629 var nextUnitOfWork = finishClassComponent(current$$1, workInProgress, Component, shouldUpdate, hasContext, renderExpirationTime);
14630 {
14631 var inst = workInProgress.stateNode;
14632 if (inst.props !== nextProps) {
14633 !didWarnAboutReassigningProps ? warning$1(false, 'It looks like %s is reassigning its own `this.props` while rendering. ' + 'This is not supported and can lead to confusing bugs.', getComponentName(workInProgress.type) || 'a component') : void 0;
14634 didWarnAboutReassigningProps = true;
14635 }
14636 }
14637 return nextUnitOfWork;
14638}
14639
14640function finishClassComponent(current$$1, workInProgress, Component, shouldUpdate, hasContext, renderExpirationTime) {
14641 // Refs should update even if shouldComponentUpdate returns false
14642 markRef(current$$1, workInProgress);
14643
14644 var didCaptureError = (workInProgress.effectTag & DidCapture) !== NoEffect;
14645
14646 if (!shouldUpdate && !didCaptureError) {
14647 // Context providers should defer to sCU for rendering
14648 if (hasContext) {
14649 invalidateContextProvider(workInProgress, Component, false);
14650 }
14651
14652 return bailoutOnAlreadyFinishedWork(current$$1, workInProgress, renderExpirationTime);
14653 }
14654
14655 var instance = workInProgress.stateNode;
14656
14657 // Rerender
14658 ReactCurrentOwner$3.current = workInProgress;
14659 var nextChildren = void 0;
14660 if (didCaptureError && typeof Component.getDerivedStateFromError !== 'function') {
14661 // If we captured an error, but getDerivedStateFrom catch is not defined,
14662 // unmount all the children. componentDidCatch will schedule an update to
14663 // re-render a fallback. This is temporary until we migrate everyone to
14664 // the new API.
14665 // TODO: Warn in a future release.
14666 nextChildren = null;
14667
14668 if (enableProfilerTimer) {
14669 stopProfilerTimerIfRunning(workInProgress);
14670 }
14671 } else {
14672 {
14673 setCurrentPhase('render');
14674 nextChildren = instance.render();
14675 if (debugRenderPhaseSideEffects || debugRenderPhaseSideEffectsForStrictMode && workInProgress.mode & StrictMode) {
14676 instance.render();
14677 }
14678 setCurrentPhase(null);
14679 }
14680 }
14681
14682 // React DevTools reads this flag.
14683 workInProgress.effectTag |= PerformedWork;
14684 if (current$$1 !== null && didCaptureError) {
14685 // If we're recovering from an error, reconcile without reusing any of
14686 // the existing children. Conceptually, the normal children and the children
14687 // that are shown on error are two different sets, so we shouldn't reuse
14688 // normal children even if their identities match.
14689 forceUnmountCurrentAndReconcile(current$$1, workInProgress, nextChildren, renderExpirationTime);
14690 } else {
14691 reconcileChildren(current$$1, workInProgress, nextChildren, renderExpirationTime);
14692 }
14693
14694 // Memoize state using the values we just used to render.
14695 // TODO: Restructure so we never read values from the instance.
14696 workInProgress.memoizedState = instance.state;
14697
14698 // The context might have changed so we need to recalculate it.
14699 if (hasContext) {
14700 invalidateContextProvider(workInProgress, Component, true);
14701 }
14702
14703 return workInProgress.child;
14704}
14705
14706function pushHostRootContext(workInProgress) {
14707 var root = workInProgress.stateNode;
14708 if (root.pendingContext) {
14709 pushTopLevelContextObject(workInProgress, root.pendingContext, root.pendingContext !== root.context);
14710 } else if (root.context) {
14711 // Should always be set
14712 pushTopLevelContextObject(workInProgress, root.context, false);
14713 }
14714 pushHostContainer(workInProgress, root.containerInfo);
14715}
14716
14717function updateHostRoot(current$$1, workInProgress, renderExpirationTime) {
14718 pushHostRootContext(workInProgress);
14719 var updateQueue = workInProgress.updateQueue;
14720 !(updateQueue !== null) ? invariant(false, 'If the root does not have an updateQueue, we should have already bailed out. This error is likely caused by a bug in React. Please file an issue.') : void 0;
14721 var nextProps = workInProgress.pendingProps;
14722 var prevState = workInProgress.memoizedState;
14723 var prevChildren = prevState !== null ? prevState.element : null;
14724 processUpdateQueue(workInProgress, updateQueue, nextProps, null, renderExpirationTime);
14725 var nextState = workInProgress.memoizedState;
14726 // Caution: React DevTools currently depends on this property
14727 // being called "element".
14728 var nextChildren = nextState.element;
14729 if (nextChildren === prevChildren) {
14730 // If the state is the same as before, that's a bailout because we had
14731 // no work that expires at this time.
14732 resetHydrationState();
14733 return bailoutOnAlreadyFinishedWork(current$$1, workInProgress, renderExpirationTime);
14734 }
14735 var root = workInProgress.stateNode;
14736 if ((current$$1 === null || current$$1.child === null) && root.hydrate && enterHydrationState(workInProgress)) {
14737 // If we don't have any current children this might be the first pass.
14738 // We always try to hydrate. If this isn't a hydration pass there won't
14739 // be any children to hydrate which is effectively the same thing as
14740 // not hydrating.
14741
14742 // This is a bit of a hack. We track the host root as a placement to
14743 // know that we're currently in a mounting state. That way isMounted
14744 // works as expected. We must reset this before committing.
14745 // TODO: Delete this when we delete isMounted and findDOMNode.
14746 workInProgress.effectTag |= Placement;
14747
14748 // Ensure that children mount into this root without tracking
14749 // side-effects. This ensures that we don't store Placement effects on
14750 // nodes that will be hydrated.
14751 workInProgress.child = mountChildFibers(workInProgress, null, nextChildren, renderExpirationTime);
14752 } else {
14753 // Otherwise reset hydration state in case we aborted and resumed another
14754 // root.
14755 reconcileChildren(current$$1, workInProgress, nextChildren, renderExpirationTime);
14756 resetHydrationState();
14757 }
14758 return workInProgress.child;
14759}
14760
14761function updateHostComponent(current$$1, workInProgress, renderExpirationTime) {
14762 pushHostContext(workInProgress);
14763
14764 if (current$$1 === null) {
14765 tryToClaimNextHydratableInstance(workInProgress);
14766 }
14767
14768 var type = workInProgress.type;
14769 var nextProps = workInProgress.pendingProps;
14770 var prevProps = current$$1 !== null ? current$$1.memoizedProps : null;
14771
14772 var nextChildren = nextProps.children;
14773 var isDirectTextChild = shouldSetTextContent(type, nextProps);
14774
14775 if (isDirectTextChild) {
14776 // We special case a direct text child of a host node. This is a common
14777 // case. We won't handle it as a reified child. We will instead handle
14778 // this in the host environment that also have access to this prop. That
14779 // avoids allocating another HostText fiber and traversing it.
14780 nextChildren = null;
14781 } else if (prevProps !== null && shouldSetTextContent(type, prevProps)) {
14782 // If we're switching from a direct text child to a normal child, or to
14783 // empty, we need to schedule the text content to be reset.
14784 workInProgress.effectTag |= ContentReset;
14785 }
14786
14787 markRef(current$$1, workInProgress);
14788
14789 // Check the host config to see if the children are offscreen/hidden.
14790 if (renderExpirationTime !== Never && workInProgress.mode & ConcurrentMode && shouldDeprioritizeSubtree(type, nextProps)) {
14791 // Schedule this fiber to re-render at offscreen priority. Then bailout.
14792 workInProgress.expirationTime = workInProgress.childExpirationTime = Never;
14793 return null;
14794 }
14795
14796 reconcileChildren(current$$1, workInProgress, nextChildren, renderExpirationTime);
14797 return workInProgress.child;
14798}
14799
14800function updateHostText(current$$1, workInProgress) {
14801 if (current$$1 === null) {
14802 tryToClaimNextHydratableInstance(workInProgress);
14803 }
14804 // Nothing to do here. This is terminal. We'll do the completion step
14805 // immediately after.
14806 return null;
14807}
14808
14809function mountLazyComponent(_current, workInProgress, elementType, updateExpirationTime, renderExpirationTime) {
14810 if (_current !== null) {
14811 // An lazy component only mounts if it suspended inside a non-
14812 // concurrent tree, in an inconsistent state. We want to treat it like
14813 // a new mount, even though an empty version of it already committed.
14814 // Disconnect the alternate pointers.
14815 _current.alternate = null;
14816 workInProgress.alternate = null;
14817 // Since this is conceptually a new fiber, schedule a Placement effect
14818 workInProgress.effectTag |= Placement;
14819 }
14820
14821 var props = workInProgress.pendingProps;
14822 // We can't start a User Timing measurement with correct label yet.
14823 // Cancel and resume right after we know the tag.
14824 cancelWorkTimer(workInProgress);
14825 var Component = readLazyComponentType(elementType);
14826 // Store the unwrapped component in the type.
14827 workInProgress.type = Component;
14828 var resolvedTag = workInProgress.tag = resolveLazyComponentTag(Component);
14829 startWorkTimer(workInProgress);
14830 var resolvedProps = resolveDefaultProps(Component, props);
14831 var child = void 0;
14832 switch (resolvedTag) {
14833 case FunctionComponent:
14834 {
14835 {
14836 validateFunctionComponentInDev(workInProgress, Component);
14837 }
14838 child = updateFunctionComponent(null, workInProgress, Component, resolvedProps, renderExpirationTime);
14839 break;
14840 }
14841 case ClassComponent:
14842 {
14843 child = updateClassComponent(null, workInProgress, Component, resolvedProps, renderExpirationTime);
14844 break;
14845 }
14846 case ForwardRef:
14847 {
14848 child = updateForwardRef(null, workInProgress, Component, resolvedProps, renderExpirationTime);
14849 break;
14850 }
14851 case MemoComponent:
14852 {
14853 {
14854 if (workInProgress.type !== workInProgress.elementType) {
14855 var outerPropTypes = Component.propTypes;
14856 if (outerPropTypes) {
14857 checkPropTypes_1(outerPropTypes, resolvedProps, // Resolved for outer only
14858 'prop', getComponentName(Component), getCurrentFiberStackInDev);
14859 }
14860 }
14861 }
14862 child = updateMemoComponent(null, workInProgress, Component, resolveDefaultProps(Component.type, resolvedProps), // The inner type can have defaults too
14863 updateExpirationTime, renderExpirationTime);
14864 break;
14865 }
14866 default:
14867 {
14868 var hint = '';
14869 {
14870 if (Component !== null && typeof Component === 'object' && Component.$$typeof === REACT_LAZY_TYPE) {
14871 hint = ' Did you wrap a component in React.lazy() more than once?';
14872 }
14873 }
14874 // This message intentionally doesn't mention ForwardRef or MemoComponent
14875 // because the fact that it's a separate type of work is an
14876 // implementation detail.
14877 invariant(false, 'Element type is invalid. Received a promise that resolves to: %s. Lazy element type must resolve to a class or function.%s', Component, hint);
14878 }
14879 }
14880 return child;
14881}
14882
14883function mountIncompleteClassComponent(_current, workInProgress, Component, nextProps, renderExpirationTime) {
14884 if (_current !== null) {
14885 // An incomplete component only mounts if it suspended inside a non-
14886 // concurrent tree, in an inconsistent state. We want to treat it like
14887 // a new mount, even though an empty version of it already committed.
14888 // Disconnect the alternate pointers.
14889 _current.alternate = null;
14890 workInProgress.alternate = null;
14891 // Since this is conceptually a new fiber, schedule a Placement effect
14892 workInProgress.effectTag |= Placement;
14893 }
14894
14895 // Promote the fiber to a class and try rendering again.
14896 workInProgress.tag = ClassComponent;
14897
14898 // The rest of this function is a fork of `updateClassComponent`
14899
14900 // Push context providers early to prevent context stack mismatches.
14901 // During mounting we don't know the child context yet as the instance doesn't exist.
14902 // We will invalidate the child context in finishClassComponent() right after rendering.
14903 var hasContext = void 0;
14904 if (isContextProvider(Component)) {
14905 hasContext = true;
14906 pushContextProvider(workInProgress);
14907 } else {
14908 hasContext = false;
14909 }
14910 prepareToReadContext(workInProgress, renderExpirationTime);
14911
14912 constructClassInstance(workInProgress, Component, nextProps, renderExpirationTime);
14913 mountClassInstance(workInProgress, Component, nextProps, renderExpirationTime);
14914
14915 return finishClassComponent(null, workInProgress, Component, true, hasContext, renderExpirationTime);
14916}
14917
14918function mountIndeterminateComponent(_current, workInProgress, Component, renderExpirationTime) {
14919 if (_current !== null) {
14920 // An indeterminate component only mounts if it suspended inside a non-
14921 // concurrent tree, in an inconsistent state. We want to treat it like
14922 // a new mount, even though an empty version of it already committed.
14923 // Disconnect the alternate pointers.
14924 _current.alternate = null;
14925 workInProgress.alternate = null;
14926 // Since this is conceptually a new fiber, schedule a Placement effect
14927 workInProgress.effectTag |= Placement;
14928 }
14929
14930 var props = workInProgress.pendingProps;
14931 var unmaskedContext = getUnmaskedContext(workInProgress, Component, false);
14932 var context = getMaskedContext(workInProgress, unmaskedContext);
14933
14934 prepareToReadContext(workInProgress, renderExpirationTime);
14935
14936 var value = void 0;
14937
14938 {
14939 if (Component.prototype && typeof Component.prototype.render === 'function') {
14940 var componentName = getComponentName(Component) || 'Unknown';
14941
14942 if (!didWarnAboutBadClass[componentName]) {
14943 warningWithoutStack$1(false, "The <%s /> component appears to have a render method, but doesn't extend React.Component. " + 'This is likely to cause errors. Change %s to extend React.Component instead.', componentName, componentName);
14944 didWarnAboutBadClass[componentName] = true;
14945 }
14946 }
14947
14948 if (workInProgress.mode & StrictMode) {
14949 ReactStrictModeWarnings.recordLegacyContextWarning(workInProgress, null);
14950 }
14951
14952 ReactCurrentOwner$3.current = workInProgress;
14953 value = renderWithHooks(null, workInProgress, Component, props, context, renderExpirationTime);
14954 }
14955 // React DevTools reads this flag.
14956 workInProgress.effectTag |= PerformedWork;
14957
14958 if (typeof value === 'object' && value !== null && typeof value.render === 'function' && value.$$typeof === undefined) {
14959 // Proceed under the assumption that this is a class instance
14960 workInProgress.tag = ClassComponent;
14961
14962 // Throw out any hooks that were used.
14963 resetHooks();
14964
14965 // Push context providers early to prevent context stack mismatches.
14966 // During mounting we don't know the child context yet as the instance doesn't exist.
14967 // We will invalidate the child context in finishClassComponent() right after rendering.
14968 var hasContext = false;
14969 if (isContextProvider(Component)) {
14970 hasContext = true;
14971 pushContextProvider(workInProgress);
14972 } else {
14973 hasContext = false;
14974 }
14975
14976 workInProgress.memoizedState = value.state !== null && value.state !== undefined ? value.state : null;
14977
14978 var getDerivedStateFromProps = Component.getDerivedStateFromProps;
14979 if (typeof getDerivedStateFromProps === 'function') {
14980 applyDerivedStateFromProps(workInProgress, Component, getDerivedStateFromProps, props);
14981 }
14982
14983 adoptClassInstance(workInProgress, value);
14984 mountClassInstance(workInProgress, Component, props, renderExpirationTime);
14985 return finishClassComponent(null, workInProgress, Component, true, hasContext, renderExpirationTime);
14986 } else {
14987 // Proceed under the assumption that this is a function component
14988 workInProgress.tag = FunctionComponent;
14989 {
14990 if (debugRenderPhaseSideEffects || debugRenderPhaseSideEffectsForStrictMode && workInProgress.mode & StrictMode) {
14991 // Only double-render components with Hooks
14992 if (workInProgress.memoizedState !== null) {
14993 value = renderWithHooks(null, workInProgress, Component, props, context, renderExpirationTime);
14994 }
14995 }
14996 }
14997 reconcileChildren(null, workInProgress, value, renderExpirationTime);
14998 {
14999 validateFunctionComponentInDev(workInProgress, Component);
15000 }
15001 return workInProgress.child;
15002 }
15003}
15004
15005function validateFunctionComponentInDev(workInProgress, Component) {
15006 if (Component) {
15007 !!Component.childContextTypes ? warningWithoutStack$1(false, '%s(...): childContextTypes cannot be defined on a function component.', Component.displayName || Component.name || 'Component') : void 0;
15008 }
15009 if (workInProgress.ref !== null) {
15010 var info = '';
15011 var ownerName = getCurrentFiberOwnerNameInDevOrNull();
15012 if (ownerName) {
15013 info += '\n\nCheck the render method of `' + ownerName + '`.';
15014 }
15015
15016 var warningKey = ownerName || workInProgress._debugID || '';
15017 var debugSource = workInProgress._debugSource;
15018 if (debugSource) {
15019 warningKey = debugSource.fileName + ':' + debugSource.lineNumber;
15020 }
15021 if (!didWarnAboutFunctionRefs[warningKey]) {
15022 didWarnAboutFunctionRefs[warningKey] = true;
15023 warning$1(false, 'Function components cannot be given refs. ' + 'Attempts to access this ref will fail. ' + 'Did you mean to use React.forwardRef()?%s', info);
15024 }
15025 }
15026
15027 if (typeof Component.getDerivedStateFromProps === 'function') {
15028 var componentName = getComponentName(Component) || 'Unknown';
15029
15030 if (!didWarnAboutGetDerivedStateOnFunctionComponent[componentName]) {
15031 warningWithoutStack$1(false, '%s: Function components do not support getDerivedStateFromProps.', componentName);
15032 didWarnAboutGetDerivedStateOnFunctionComponent[componentName] = true;
15033 }
15034 }
15035
15036 if (typeof Component.contextType === 'object' && Component.contextType !== null) {
15037 var _componentName = getComponentName(Component) || 'Unknown';
15038
15039 if (!didWarnAboutContextTypeOnFunctionComponent[_componentName]) {
15040 warningWithoutStack$1(false, '%s: Function components do not support contextType.', _componentName);
15041 didWarnAboutContextTypeOnFunctionComponent[_componentName] = true;
15042 }
15043 }
15044}
15045
15046function updateSuspenseComponent(current$$1, workInProgress, renderExpirationTime) {
15047 var mode = workInProgress.mode;
15048 var nextProps = workInProgress.pendingProps;
15049
15050 // We should attempt to render the primary children unless this boundary
15051 // already suspended during this render (`alreadyCaptured` is true).
15052 var nextState = workInProgress.memoizedState;
15053
15054 var nextDidTimeout = void 0;
15055 if ((workInProgress.effectTag & DidCapture) === NoEffect) {
15056 // This is the first attempt.
15057 nextState = null;
15058 nextDidTimeout = false;
15059 } else {
15060 // Something in this boundary's subtree already suspended. Switch to
15061 // rendering the fallback children.
15062 nextState = {
15063 timedOutAt: nextState !== null ? nextState.timedOutAt : NoWork
15064 };
15065 nextDidTimeout = true;
15066 workInProgress.effectTag &= ~DidCapture;
15067 }
15068
15069 // This next part is a bit confusing. If the children timeout, we switch to
15070 // showing the fallback children in place of the "primary" children.
15071 // However, we don't want to delete the primary children because then their
15072 // state will be lost (both the React state and the host state, e.g.
15073 // uncontrolled form inputs). Instead we keep them mounted and hide them.
15074 // Both the fallback children AND the primary children are rendered at the
15075 // same time. Once the primary children are un-suspended, we can delete
15076 // the fallback children — don't need to preserve their state.
15077 //
15078 // The two sets of children are siblings in the host environment, but
15079 // semantically, for purposes of reconciliation, they are two separate sets.
15080 // So we store them using two fragment fibers.
15081 //
15082 // However, we want to avoid allocating extra fibers for every placeholder.
15083 // They're only necessary when the children time out, because that's the
15084 // only time when both sets are mounted.
15085 //
15086 // So, the extra fragment fibers are only used if the children time out.
15087 // Otherwise, we render the primary children directly. This requires some
15088 // custom reconciliation logic to preserve the state of the primary
15089 // children. It's essentially a very basic form of re-parenting.
15090
15091 // `child` points to the child fiber. In the normal case, this is the first
15092 // fiber of the primary children set. In the timed-out case, it's a
15093 // a fragment fiber containing the primary children.
15094 var child = void 0;
15095 // `next` points to the next fiber React should render. In the normal case,
15096 // it's the same as `child`: the first fiber of the primary children set.
15097 // In the timed-out case, it's a fragment fiber containing the *fallback*
15098 // children -- we skip over the primary children entirely.
15099 var next = void 0;
15100 if (current$$1 === null) {
15101 if (enableSuspenseServerRenderer) {
15102 // If we're currently hydrating, try to hydrate this boundary.
15103 // But only if this has a fallback.
15104 if (nextProps.fallback !== undefined) {
15105 tryToClaimNextHydratableInstance(workInProgress);
15106 // This could've changed the tag if this was a dehydrated suspense component.
15107 if (workInProgress.tag === DehydratedSuspenseComponent) {
15108 return updateDehydratedSuspenseComponent(null, workInProgress, renderExpirationTime);
15109 }
15110 }
15111 }
15112
15113 // This is the initial mount. This branch is pretty simple because there's
15114 // no previous state that needs to be preserved.
15115 if (nextDidTimeout) {
15116 // Mount separate fragments for primary and fallback children.
15117 var nextFallbackChildren = nextProps.fallback;
15118 var primaryChildFragment = createFiberFromFragment(null, mode, NoWork, null);
15119
15120 if ((workInProgress.mode & ConcurrentMode) === NoContext) {
15121 // Outside of concurrent mode, we commit the effects from the
15122 var progressedState = workInProgress.memoizedState;
15123 var progressedPrimaryChild = progressedState !== null ? workInProgress.child.child : workInProgress.child;
15124 primaryChildFragment.child = progressedPrimaryChild;
15125 }
15126
15127 var fallbackChildFragment = createFiberFromFragment(nextFallbackChildren, mode, renderExpirationTime, null);
15128 primaryChildFragment.sibling = fallbackChildFragment;
15129 child = primaryChildFragment;
15130 // Skip the primary children, and continue working on the
15131 // fallback children.
15132 next = fallbackChildFragment;
15133 child.return = next.return = workInProgress;
15134 } else {
15135 // Mount the primary children without an intermediate fragment fiber.
15136 var nextPrimaryChildren = nextProps.children;
15137 child = next = mountChildFibers(workInProgress, null, nextPrimaryChildren, renderExpirationTime);
15138 }
15139 } else {
15140 // This is an update. This branch is more complicated because we need to
15141 // ensure the state of the primary children is preserved.
15142 var prevState = current$$1.memoizedState;
15143 var prevDidTimeout = prevState !== null;
15144 if (prevDidTimeout) {
15145 // The current tree already timed out. That means each child set is
15146 var currentPrimaryChildFragment = current$$1.child;
15147 var currentFallbackChildFragment = currentPrimaryChildFragment.sibling;
15148 if (nextDidTimeout) {
15149 // Still timed out. Reuse the current primary children by cloning
15150 // its fragment. We're going to skip over these entirely.
15151 var _nextFallbackChildren = nextProps.fallback;
15152 var _primaryChildFragment = createWorkInProgress(currentPrimaryChildFragment, currentPrimaryChildFragment.pendingProps, NoWork);
15153
15154 if ((workInProgress.mode & ConcurrentMode) === NoContext) {
15155 // Outside of concurrent mode, we commit the effects from the
15156 var _progressedState = workInProgress.memoizedState;
15157 var _progressedPrimaryChild = _progressedState !== null ? workInProgress.child.child : workInProgress.child;
15158 if (_progressedPrimaryChild !== currentPrimaryChildFragment.child) {
15159 _primaryChildFragment.child = _progressedPrimaryChild;
15160 }
15161 }
15162
15163 // Because primaryChildFragment is a new fiber that we're inserting as the
15164 // parent of a new tree, we need to set its treeBaseDuration.
15165 if (enableProfilerTimer && workInProgress.mode & ProfileMode) {
15166 // treeBaseDuration is the sum of all the child tree base durations.
15167 var treeBaseDuration = 0;
15168 var hiddenChild = _primaryChildFragment.child;
15169 while (hiddenChild !== null) {
15170 treeBaseDuration += hiddenChild.treeBaseDuration;
15171 hiddenChild = hiddenChild.sibling;
15172 }
15173 _primaryChildFragment.treeBaseDuration = treeBaseDuration;
15174 }
15175
15176 // Clone the fallback child fragment, too. These we'll continue
15177 // working on.
15178 var _fallbackChildFragment = _primaryChildFragment.sibling = createWorkInProgress(currentFallbackChildFragment, _nextFallbackChildren, currentFallbackChildFragment.expirationTime);
15179 child = _primaryChildFragment;
15180 _primaryChildFragment.childExpirationTime = NoWork;
15181 // Skip the primary children, and continue working on the
15182 // fallback children.
15183 next = _fallbackChildFragment;
15184 child.return = next.return = workInProgress;
15185 } else {
15186 // No longer suspended. Switch back to showing the primary children,
15187 // and remove the intermediate fragment fiber.
15188 var _nextPrimaryChildren = nextProps.children;
15189 var currentPrimaryChild = currentPrimaryChildFragment.child;
15190 var primaryChild = reconcileChildFibers(workInProgress, currentPrimaryChild, _nextPrimaryChildren, renderExpirationTime);
15191
15192 // If this render doesn't suspend, we need to delete the fallback
15193 // children. Wait until the complete phase, after we've confirmed the
15194 // fallback is no longer needed.
15195 // TODO: Would it be better to store the fallback fragment on
15196 // the stateNode?
15197
15198 // Continue rendering the children, like we normally do.
15199 child = next = primaryChild;
15200 }
15201 } else {
15202 // The current tree has not already timed out. That means the primary
15203 // children are not wrapped in a fragment fiber.
15204 var _currentPrimaryChild = current$$1.child;
15205 if (nextDidTimeout) {
15206 // Timed out. Wrap the children in a fragment fiber to keep them
15207 // separate from the fallback children.
15208 var _nextFallbackChildren2 = nextProps.fallback;
15209 var _primaryChildFragment2 = createFiberFromFragment(
15210 // It shouldn't matter what the pending props are because we aren't
15211 // going to render this fragment.
15212 null, mode, NoWork, null);
15213 _primaryChildFragment2.child = _currentPrimaryChild;
15214
15215 // Even though we're creating a new fiber, there are no new children,
15216 // because we're reusing an already mounted tree. So we don't need to
15217 // schedule a placement.
15218 // primaryChildFragment.effectTag |= Placement;
15219
15220 if ((workInProgress.mode & ConcurrentMode) === NoContext) {
15221 // Outside of concurrent mode, we commit the effects from the
15222 var _progressedState2 = workInProgress.memoizedState;
15223 var _progressedPrimaryChild2 = _progressedState2 !== null ? workInProgress.child.child : workInProgress.child;
15224 _primaryChildFragment2.child = _progressedPrimaryChild2;
15225 }
15226
15227 // Because primaryChildFragment is a new fiber that we're inserting as the
15228 // parent of a new tree, we need to set its treeBaseDuration.
15229 if (enableProfilerTimer && workInProgress.mode & ProfileMode) {
15230 // treeBaseDuration is the sum of all the child tree base durations.
15231 var _treeBaseDuration = 0;
15232 var _hiddenChild = _primaryChildFragment2.child;
15233 while (_hiddenChild !== null) {
15234 _treeBaseDuration += _hiddenChild.treeBaseDuration;
15235 _hiddenChild = _hiddenChild.sibling;
15236 }
15237 _primaryChildFragment2.treeBaseDuration = _treeBaseDuration;
15238 }
15239
15240 // Create a fragment from the fallback children, too.
15241 var _fallbackChildFragment2 = _primaryChildFragment2.sibling = createFiberFromFragment(_nextFallbackChildren2, mode, renderExpirationTime, null);
15242 _fallbackChildFragment2.effectTag |= Placement;
15243 child = _primaryChildFragment2;
15244 _primaryChildFragment2.childExpirationTime = NoWork;
15245 // Skip the primary children, and continue working on the
15246 // fallback children.
15247 next = _fallbackChildFragment2;
15248 child.return = next.return = workInProgress;
15249 } else {
15250 // Still haven't timed out. Continue rendering the children, like we
15251 // normally do.
15252 var _nextPrimaryChildren2 = nextProps.children;
15253 next = child = reconcileChildFibers(workInProgress, _currentPrimaryChild, _nextPrimaryChildren2, renderExpirationTime);
15254 }
15255 }
15256 workInProgress.stateNode = current$$1.stateNode;
15257 }
15258
15259 workInProgress.memoizedState = nextState;
15260 workInProgress.child = child;
15261 return next;
15262}
15263
15264function updateDehydratedSuspenseComponent(current$$1, workInProgress, renderExpirationTime) {
15265 if (current$$1 === null) {
15266 // During the first pass, we'll bail out and not drill into the children.
15267 // Instead, we'll leave the content in place and try to hydrate it later.
15268 workInProgress.expirationTime = Never;
15269 return null;
15270 }
15271 // We use childExpirationTime to indicate that a child might depend on context, so if
15272 // any context has changed, we need to treat is as if the input might have changed.
15273 var hasContextChanged$$1 = current$$1.childExpirationTime >= renderExpirationTime;
15274 if (didReceiveUpdate || hasContextChanged$$1) {
15275 // This boundary has changed since the first render. This means that we are now unable to
15276 // hydrate it. We might still be able to hydrate it using an earlier expiration time but
15277 // during this render we can't. Instead, we're going to delete the whole subtree and
15278 // instead inject a new real Suspense boundary to take its place, which may render content
15279 // or fallback. The real Suspense boundary will suspend for a while so we have some time
15280 // to ensure it can produce real content, but all state and pending events will be lost.
15281
15282 // Detach from the current dehydrated boundary.
15283 current$$1.alternate = null;
15284 workInProgress.alternate = null;
15285
15286 // Insert a deletion in the effect list.
15287 var returnFiber = workInProgress.return;
15288 !(returnFiber !== null) ? invariant(false, 'Suspense boundaries are never on the root. This is probably a bug in React.') : void 0;
15289 var last = returnFiber.lastEffect;
15290 if (last !== null) {
15291 last.nextEffect = current$$1;
15292 returnFiber.lastEffect = current$$1;
15293 } else {
15294 returnFiber.firstEffect = returnFiber.lastEffect = current$$1;
15295 }
15296 current$$1.nextEffect = null;
15297 current$$1.effectTag = Deletion;
15298
15299 // Upgrade this work in progress to a real Suspense component.
15300 workInProgress.tag = SuspenseComponent;
15301 workInProgress.stateNode = null;
15302 workInProgress.memoizedState = null;
15303 // This is now an insertion.
15304 workInProgress.effectTag |= Placement;
15305 // Retry as a real Suspense component.
15306 return updateSuspenseComponent(null, workInProgress, renderExpirationTime);
15307 }
15308 if ((workInProgress.effectTag & DidCapture) === NoEffect) {
15309 // This is the first attempt.
15310 reenterHydrationStateFromDehydratedSuspenseInstance(workInProgress);
15311 var nextProps = workInProgress.pendingProps;
15312 var nextChildren = nextProps.children;
15313 workInProgress.child = mountChildFibers(workInProgress, null, nextChildren, renderExpirationTime);
15314 return workInProgress.child;
15315 } else {
15316 // Something suspended. Leave the existing children in place.
15317 // TODO: In non-concurrent mode, should we commit the nodes we have hydrated so far?
15318 workInProgress.child = null;
15319 return null;
15320 }
15321}
15322
15323function updatePortalComponent(current$$1, workInProgress, renderExpirationTime) {
15324 pushHostContainer(workInProgress, workInProgress.stateNode.containerInfo);
15325 var nextChildren = workInProgress.pendingProps;
15326 if (current$$1 === null) {
15327 // Portals are special because we don't append the children during mount
15328 // but at commit. Therefore we need to track insertions which the normal
15329 // flow doesn't do during mount. This doesn't happen at the root because
15330 // the root always starts with a "current" with a null child.
15331 // TODO: Consider unifying this with how the root works.
15332 workInProgress.child = reconcileChildFibers(workInProgress, null, nextChildren, renderExpirationTime);
15333 } else {
15334 reconcileChildren(current$$1, workInProgress, nextChildren, renderExpirationTime);
15335 }
15336 return workInProgress.child;
15337}
15338
15339function updateContextProvider(current$$1, workInProgress, renderExpirationTime) {
15340 var providerType = workInProgress.type;
15341 var context = providerType._context;
15342
15343 var newProps = workInProgress.pendingProps;
15344 var oldProps = workInProgress.memoizedProps;
15345
15346 var newValue = newProps.value;
15347
15348 {
15349 var providerPropTypes = workInProgress.type.propTypes;
15350
15351 if (providerPropTypes) {
15352 checkPropTypes_1(providerPropTypes, newProps, 'prop', 'Context.Provider', getCurrentFiberStackInDev);
15353 }
15354 }
15355
15356 pushProvider(workInProgress, newValue);
15357
15358 if (oldProps !== null) {
15359 var oldValue = oldProps.value;
15360 var changedBits = calculateChangedBits(context, newValue, oldValue);
15361 if (changedBits === 0) {
15362 // No change. Bailout early if children are the same.
15363 if (oldProps.children === newProps.children && !hasContextChanged()) {
15364 return bailoutOnAlreadyFinishedWork(current$$1, workInProgress, renderExpirationTime);
15365 }
15366 } else {
15367 // The context value changed. Search for matching consumers and schedule
15368 // them to update.
15369 propagateContextChange(workInProgress, context, changedBits, renderExpirationTime);
15370 }
15371 }
15372
15373 var newChildren = newProps.children;
15374 reconcileChildren(current$$1, workInProgress, newChildren, renderExpirationTime);
15375 return workInProgress.child;
15376}
15377
15378var hasWarnedAboutUsingContextAsConsumer = false;
15379
15380function updateContextConsumer(current$$1, workInProgress, renderExpirationTime) {
15381 var context = workInProgress.type;
15382 // The logic below for Context differs depending on PROD or DEV mode. In
15383 // DEV mode, we create a separate object for Context.Consumer that acts
15384 // like a proxy to Context. This proxy object adds unnecessary code in PROD
15385 // so we use the old behaviour (Context.Consumer references Context) to
15386 // reduce size and overhead. The separate object references context via
15387 // a property called "_context", which also gives us the ability to check
15388 // in DEV mode if this property exists or not and warn if it does not.
15389 {
15390 if (context._context === undefined) {
15391 // This may be because it's a Context (rather than a Consumer).
15392 // Or it may be because it's older React where they're the same thing.
15393 // We only want to warn if we're sure it's a new React.
15394 if (context !== context.Consumer) {
15395 if (!hasWarnedAboutUsingContextAsConsumer) {
15396 hasWarnedAboutUsingContextAsConsumer = true;
15397 warning$1(false, 'Rendering <Context> directly is not supported and will be removed in ' + 'a future major release. Did you mean to render <Context.Consumer> instead?');
15398 }
15399 }
15400 } else {
15401 context = context._context;
15402 }
15403 }
15404 var newProps = workInProgress.pendingProps;
15405 var render = newProps.children;
15406
15407 {
15408 !(typeof render === 'function') ? warningWithoutStack$1(false, 'A context consumer was rendered with multiple children, or a child ' + "that isn't a function. A context consumer expects a single child " + 'that is a function. If you did pass a function, make sure there ' + 'is no trailing or leading whitespace around it.') : void 0;
15409 }
15410
15411 prepareToReadContext(workInProgress, renderExpirationTime);
15412 var newValue = readContext(context, newProps.unstable_observedBits);
15413 var newChildren = void 0;
15414 {
15415 ReactCurrentOwner$3.current = workInProgress;
15416 setCurrentPhase('render');
15417 newChildren = render(newValue);
15418 setCurrentPhase(null);
15419 }
15420
15421 // React DevTools reads this flag.
15422 workInProgress.effectTag |= PerformedWork;
15423 reconcileChildren(current$$1, workInProgress, newChildren, renderExpirationTime);
15424 return workInProgress.child;
15425}
15426
15427function markWorkInProgressReceivedUpdate() {
15428 didReceiveUpdate = true;
15429}
15430
15431function bailoutOnAlreadyFinishedWork(current$$1, workInProgress, renderExpirationTime) {
15432 cancelWorkTimer(workInProgress);
15433
15434 if (current$$1 !== null) {
15435 // Reuse previous context list
15436 workInProgress.contextDependencies = current$$1.contextDependencies;
15437 }
15438
15439 if (enableProfilerTimer) {
15440 // Don't update "base" render times for bailouts.
15441 stopProfilerTimerIfRunning(workInProgress);
15442 }
15443
15444 // Check if the children have any pending work.
15445 var childExpirationTime = workInProgress.childExpirationTime;
15446 if (childExpirationTime < renderExpirationTime) {
15447 // The children don't have any work either. We can skip them.
15448 // TODO: Once we add back resuming, we should check if the children are
15449 // a work-in-progress set. If so, we need to transfer their effects.
15450 return null;
15451 } else {
15452 // This fiber doesn't have work, but its subtree does. Clone the child
15453 // fibers and continue.
15454 cloneChildFibers(current$$1, workInProgress);
15455 return workInProgress.child;
15456 }
15457}
15458
15459function beginWork(current$$1, workInProgress, renderExpirationTime) {
15460 var updateExpirationTime = workInProgress.expirationTime;
15461
15462 if (current$$1 !== null) {
15463 var oldProps = current$$1.memoizedProps;
15464 var newProps = workInProgress.pendingProps;
15465
15466 if (oldProps !== newProps || hasContextChanged()) {
15467 // If props or context changed, mark the fiber as having performed work.
15468 // This may be unset if the props are determined to be equal later (memo).
15469 didReceiveUpdate = true;
15470 } else if (updateExpirationTime < renderExpirationTime) {
15471 didReceiveUpdate = false;
15472 // This fiber does not have any pending work. Bailout without entering
15473 // the begin phase. There's still some bookkeeping we that needs to be done
15474 // in this optimized path, mostly pushing stuff onto the stack.
15475 switch (workInProgress.tag) {
15476 case HostRoot:
15477 pushHostRootContext(workInProgress);
15478 resetHydrationState();
15479 break;
15480 case HostComponent:
15481 pushHostContext(workInProgress);
15482 break;
15483 case ClassComponent:
15484 {
15485 var Component = workInProgress.type;
15486 if (isContextProvider(Component)) {
15487 pushContextProvider(workInProgress);
15488 }
15489 break;
15490 }
15491 case HostPortal:
15492 pushHostContainer(workInProgress, workInProgress.stateNode.containerInfo);
15493 break;
15494 case ContextProvider:
15495 {
15496 var newValue = workInProgress.memoizedProps.value;
15497 pushProvider(workInProgress, newValue);
15498 break;
15499 }
15500 case Profiler:
15501 if (enableProfilerTimer) {
15502 workInProgress.effectTag |= Update;
15503 }
15504 break;
15505 case SuspenseComponent:
15506 {
15507 var state = workInProgress.memoizedState;
15508 var didTimeout = state !== null;
15509 if (didTimeout) {
15510 // If this boundary is currently timed out, we need to decide
15511 // whether to retry the primary children, or to skip over it and
15512 // go straight to the fallback. Check the priority of the primary
15513 var primaryChildFragment = workInProgress.child;
15514 var primaryChildExpirationTime = primaryChildFragment.childExpirationTime;
15515 if (primaryChildExpirationTime !== NoWork && primaryChildExpirationTime >= renderExpirationTime) {
15516 // The primary children have pending work. Use the normal path
15517 // to attempt to render the primary children again.
15518 return updateSuspenseComponent(current$$1, workInProgress, renderExpirationTime);
15519 } else {
15520 // The primary children do not have pending work with sufficient
15521 // priority. Bailout.
15522 var child = bailoutOnAlreadyFinishedWork(current$$1, workInProgress, renderExpirationTime);
15523 if (child !== null) {
15524 // The fallback children have pending work. Skip over the
15525 // primary children and work on the fallback.
15526 return child.sibling;
15527 } else {
15528 return null;
15529 }
15530 }
15531 }
15532 break;
15533 }
15534 case DehydratedSuspenseComponent:
15535 {
15536 if (enableSuspenseServerRenderer) {
15537 // We know that this component will suspend again because if it has
15538 // been unsuspended it has committed as a regular Suspense component.
15539 // If it needs to be retried, it should have work scheduled on it.
15540 workInProgress.effectTag |= DidCapture;
15541 break;
15542 }
15543 }
15544 }
15545 return bailoutOnAlreadyFinishedWork(current$$1, workInProgress, renderExpirationTime);
15546 }
15547 } else {
15548 didReceiveUpdate = false;
15549 }
15550
15551 // Before entering the begin phase, clear the expiration time.
15552 workInProgress.expirationTime = NoWork;
15553
15554 switch (workInProgress.tag) {
15555 case IndeterminateComponent:
15556 {
15557 var elementType = workInProgress.elementType;
15558 return mountIndeterminateComponent(current$$1, workInProgress, elementType, renderExpirationTime);
15559 }
15560 case LazyComponent:
15561 {
15562 var _elementType = workInProgress.elementType;
15563 return mountLazyComponent(current$$1, workInProgress, _elementType, updateExpirationTime, renderExpirationTime);
15564 }
15565 case FunctionComponent:
15566 {
15567 var _Component = workInProgress.type;
15568 var unresolvedProps = workInProgress.pendingProps;
15569 var resolvedProps = workInProgress.elementType === _Component ? unresolvedProps : resolveDefaultProps(_Component, unresolvedProps);
15570 return updateFunctionComponent(current$$1, workInProgress, _Component, resolvedProps, renderExpirationTime);
15571 }
15572 case ClassComponent:
15573 {
15574 var _Component2 = workInProgress.type;
15575 var _unresolvedProps = workInProgress.pendingProps;
15576 var _resolvedProps = workInProgress.elementType === _Component2 ? _unresolvedProps : resolveDefaultProps(_Component2, _unresolvedProps);
15577 return updateClassComponent(current$$1, workInProgress, _Component2, _resolvedProps, renderExpirationTime);
15578 }
15579 case HostRoot:
15580 return updateHostRoot(current$$1, workInProgress, renderExpirationTime);
15581 case HostComponent:
15582 return updateHostComponent(current$$1, workInProgress, renderExpirationTime);
15583 case HostText:
15584 return updateHostText(current$$1, workInProgress);
15585 case SuspenseComponent:
15586 return updateSuspenseComponent(current$$1, workInProgress, renderExpirationTime);
15587 case HostPortal:
15588 return updatePortalComponent(current$$1, workInProgress, renderExpirationTime);
15589 case ForwardRef:
15590 {
15591 var type = workInProgress.type;
15592 var _unresolvedProps2 = workInProgress.pendingProps;
15593 var _resolvedProps2 = workInProgress.elementType === type ? _unresolvedProps2 : resolveDefaultProps(type, _unresolvedProps2);
15594 return updateForwardRef(current$$1, workInProgress, type, _resolvedProps2, renderExpirationTime);
15595 }
15596 case Fragment:
15597 return updateFragment(current$$1, workInProgress, renderExpirationTime);
15598 case Mode:
15599 return updateMode(current$$1, workInProgress, renderExpirationTime);
15600 case Profiler:
15601 return updateProfiler(current$$1, workInProgress, renderExpirationTime);
15602 case ContextProvider:
15603 return updateContextProvider(current$$1, workInProgress, renderExpirationTime);
15604 case ContextConsumer:
15605 return updateContextConsumer(current$$1, workInProgress, renderExpirationTime);
15606 case MemoComponent:
15607 {
15608 var _type2 = workInProgress.type;
15609 var _unresolvedProps3 = workInProgress.pendingProps;
15610 // Resolve outer props first, then resolve inner props.
15611 var _resolvedProps3 = resolveDefaultProps(_type2, _unresolvedProps3);
15612 {
15613 if (workInProgress.type !== workInProgress.elementType) {
15614 var outerPropTypes = _type2.propTypes;
15615 if (outerPropTypes) {
15616 checkPropTypes_1(outerPropTypes, _resolvedProps3, // Resolved for outer only
15617 'prop', getComponentName(_type2), getCurrentFiberStackInDev);
15618 }
15619 }
15620 }
15621 _resolvedProps3 = resolveDefaultProps(_type2.type, _resolvedProps3);
15622 return updateMemoComponent(current$$1, workInProgress, _type2, _resolvedProps3, updateExpirationTime, renderExpirationTime);
15623 }
15624 case SimpleMemoComponent:
15625 {
15626 return updateSimpleMemoComponent(current$$1, workInProgress, workInProgress.type, workInProgress.pendingProps, updateExpirationTime, renderExpirationTime);
15627 }
15628 case IncompleteClassComponent:
15629 {
15630 var _Component3 = workInProgress.type;
15631 var _unresolvedProps4 = workInProgress.pendingProps;
15632 var _resolvedProps4 = workInProgress.elementType === _Component3 ? _unresolvedProps4 : resolveDefaultProps(_Component3, _unresolvedProps4);
15633 return mountIncompleteClassComponent(current$$1, workInProgress, _Component3, _resolvedProps4, renderExpirationTime);
15634 }
15635 case DehydratedSuspenseComponent:
15636 {
15637 if (enableSuspenseServerRenderer) {
15638 return updateDehydratedSuspenseComponent(current$$1, workInProgress, renderExpirationTime);
15639 }
15640 break;
15641 }
15642 }
15643 invariant(false, 'Unknown unit of work tag. This error is likely caused by a bug in React. Please file an issue.');
15644}
15645
15646var valueCursor = createCursor(null);
15647
15648var rendererSigil = void 0;
15649{
15650 // Use this to detect multiple renderers using the same context
15651 rendererSigil = {};
15652}
15653
15654var currentlyRenderingFiber = null;
15655var lastContextDependency = null;
15656var lastContextWithAllBitsObserved = null;
15657
15658var isDisallowedContextReadInDEV = false;
15659
15660function resetContextDependences() {
15661 // This is called right before React yields execution, to ensure `readContext`
15662 // cannot be called outside the render phase.
15663 currentlyRenderingFiber = null;
15664 lastContextDependency = null;
15665 lastContextWithAllBitsObserved = null;
15666 {
15667 isDisallowedContextReadInDEV = false;
15668 }
15669}
15670
15671function enterDisallowedContextReadInDEV() {
15672 {
15673 isDisallowedContextReadInDEV = true;
15674 }
15675}
15676
15677function exitDisallowedContextReadInDEV() {
15678 {
15679 isDisallowedContextReadInDEV = false;
15680 }
15681}
15682
15683function pushProvider(providerFiber, nextValue) {
15684 var context = providerFiber.type._context;
15685
15686 if (isPrimaryRenderer) {
15687 push(valueCursor, context._currentValue, providerFiber);
15688
15689 context._currentValue = nextValue;
15690 {
15691 !(context._currentRenderer === undefined || context._currentRenderer === null || context._currentRenderer === rendererSigil) ? warningWithoutStack$1(false, 'Detected multiple renderers concurrently rendering the ' + 'same context provider. This is currently unsupported.') : void 0;
15692 context._currentRenderer = rendererSigil;
15693 }
15694 } else {
15695 push(valueCursor, context._currentValue2, providerFiber);
15696
15697 context._currentValue2 = nextValue;
15698 {
15699 !(context._currentRenderer2 === undefined || context._currentRenderer2 === null || context._currentRenderer2 === rendererSigil) ? warningWithoutStack$1(false, 'Detected multiple renderers concurrently rendering the ' + 'same context provider. This is currently unsupported.') : void 0;
15700 context._currentRenderer2 = rendererSigil;
15701 }
15702 }
15703}
15704
15705function popProvider(providerFiber) {
15706 var currentValue = valueCursor.current;
15707
15708 pop(valueCursor, providerFiber);
15709
15710 var context = providerFiber.type._context;
15711 if (isPrimaryRenderer) {
15712 context._currentValue = currentValue;
15713 } else {
15714 context._currentValue2 = currentValue;
15715 }
15716}
15717
15718function calculateChangedBits(context, newValue, oldValue) {
15719 if (is(oldValue, newValue)) {
15720 // No change
15721 return 0;
15722 } else {
15723 var changedBits = typeof context._calculateChangedBits === 'function' ? context._calculateChangedBits(oldValue, newValue) : maxSigned31BitInt;
15724
15725 {
15726 !((changedBits & maxSigned31BitInt) === changedBits) ? warning$1(false, 'calculateChangedBits: Expected the return value to be a ' + '31-bit integer. Instead received: %s', changedBits) : void 0;
15727 }
15728 return changedBits | 0;
15729 }
15730}
15731
15732function scheduleWorkOnParentPath(parent, renderExpirationTime) {
15733 // Update the child expiration time of all the ancestors, including
15734 // the alternates.
15735 var node = parent;
15736 while (node !== null) {
15737 var alternate = node.alternate;
15738 if (node.childExpirationTime < renderExpirationTime) {
15739 node.childExpirationTime = renderExpirationTime;
15740 if (alternate !== null && alternate.childExpirationTime < renderExpirationTime) {
15741 alternate.childExpirationTime = renderExpirationTime;
15742 }
15743 } else if (alternate !== null && alternate.childExpirationTime < renderExpirationTime) {
15744 alternate.childExpirationTime = renderExpirationTime;
15745 } else {
15746 // Neither alternate was updated, which means the rest of the
15747 // ancestor path already has sufficient priority.
15748 break;
15749 }
15750 node = node.return;
15751 }
15752}
15753
15754function propagateContextChange(workInProgress, context, changedBits, renderExpirationTime) {
15755 var fiber = workInProgress.child;
15756 if (fiber !== null) {
15757 // Set the return pointer of the child to the work-in-progress fiber.
15758 fiber.return = workInProgress;
15759 }
15760 while (fiber !== null) {
15761 var nextFiber = void 0;
15762
15763 // Visit this fiber.
15764 var list = fiber.contextDependencies;
15765 if (list !== null) {
15766 nextFiber = fiber.child;
15767
15768 var dependency = list.first;
15769 while (dependency !== null) {
15770 // Check if the context matches.
15771 if (dependency.context === context && (dependency.observedBits & changedBits) !== 0) {
15772 // Match! Schedule an update on this fiber.
15773
15774 if (fiber.tag === ClassComponent) {
15775 // Schedule a force update on the work-in-progress.
15776 var update = createUpdate(renderExpirationTime);
15777 update.tag = ForceUpdate;
15778 // TODO: Because we don't have a work-in-progress, this will add the
15779 // update to the current fiber, too, which means it will persist even if
15780 // this render is thrown away. Since it's a race condition, not sure it's
15781 // worth fixing.
15782 enqueueUpdate(fiber, update);
15783 }
15784
15785 if (fiber.expirationTime < renderExpirationTime) {
15786 fiber.expirationTime = renderExpirationTime;
15787 }
15788 var alternate = fiber.alternate;
15789 if (alternate !== null && alternate.expirationTime < renderExpirationTime) {
15790 alternate.expirationTime = renderExpirationTime;
15791 }
15792
15793 scheduleWorkOnParentPath(fiber.return, renderExpirationTime);
15794
15795 // Mark the expiration time on the list, too.
15796 if (list.expirationTime < renderExpirationTime) {
15797 list.expirationTime = renderExpirationTime;
15798 }
15799
15800 // Since we already found a match, we can stop traversing the
15801 // dependency list.
15802 break;
15803 }
15804 dependency = dependency.next;
15805 }
15806 } else if (fiber.tag === ContextProvider) {
15807 // Don't scan deeper if this is a matching provider
15808 nextFiber = fiber.type === workInProgress.type ? null : fiber.child;
15809 } else if (enableSuspenseServerRenderer && fiber.tag === DehydratedSuspenseComponent) {
15810 // If a dehydrated suspense component is in this subtree, we don't know
15811 // if it will have any context consumers in it. The best we can do is
15812 // mark it as having updates on its children.
15813 if (fiber.expirationTime < renderExpirationTime) {
15814 fiber.expirationTime = renderExpirationTime;
15815 }
15816 var _alternate = fiber.alternate;
15817 if (_alternate !== null && _alternate.expirationTime < renderExpirationTime) {
15818 _alternate.expirationTime = renderExpirationTime;
15819 }
15820 // This is intentionally passing this fiber as the parent
15821 // because we want to schedule this fiber as having work
15822 // on its children. We'll use the childExpirationTime on
15823 // this fiber to indicate that a context has changed.
15824 scheduleWorkOnParentPath(fiber, renderExpirationTime);
15825 nextFiber = fiber.sibling;
15826 } else {
15827 // Traverse down.
15828 nextFiber = fiber.child;
15829 }
15830
15831 if (nextFiber !== null) {
15832 // Set the return pointer of the child to the work-in-progress fiber.
15833 nextFiber.return = fiber;
15834 } else {
15835 // No child. Traverse to next sibling.
15836 nextFiber = fiber;
15837 while (nextFiber !== null) {
15838 if (nextFiber === workInProgress) {
15839 // We're back to the root of this subtree. Exit.
15840 nextFiber = null;
15841 break;
15842 }
15843 var sibling = nextFiber.sibling;
15844 if (sibling !== null) {
15845 // Set the return pointer of the sibling to the work-in-progress fiber.
15846 sibling.return = nextFiber.return;
15847 nextFiber = sibling;
15848 break;
15849 }
15850 // No more siblings. Traverse up.
15851 nextFiber = nextFiber.return;
15852 }
15853 }
15854 fiber = nextFiber;
15855 }
15856}
15857
15858function prepareToReadContext(workInProgress, renderExpirationTime) {
15859 currentlyRenderingFiber = workInProgress;
15860 lastContextDependency = null;
15861 lastContextWithAllBitsObserved = null;
15862
15863 var currentDependencies = workInProgress.contextDependencies;
15864 if (currentDependencies !== null && currentDependencies.expirationTime >= renderExpirationTime) {
15865 // Context list has a pending update. Mark that this fiber performed work.
15866 markWorkInProgressReceivedUpdate();
15867 }
15868
15869 // Reset the work-in-progress list
15870 workInProgress.contextDependencies = null;
15871}
15872
15873function readContext(context, observedBits) {
15874 {
15875 // This warning would fire if you read context inside a Hook like useMemo.
15876 // Unlike the class check below, it's not enforced in production for perf.
15877 !!isDisallowedContextReadInDEV ? warning$1(false, 'Context can only be read while React is rendering. ' + 'In classes, you can read it in the render method or getDerivedStateFromProps. ' + 'In function components, you can read it directly in the function body, but not ' + 'inside Hooks like useReducer() or useMemo().') : void 0;
15878 }
15879
15880 if (lastContextWithAllBitsObserved === context) {
15881 // Nothing to do. We already observe everything in this context.
15882 } else if (observedBits === false || observedBits === 0) {
15883 // Do not observe any updates.
15884 } else {
15885 var resolvedObservedBits = void 0; // Avoid deopting on observable arguments or heterogeneous types.
15886 if (typeof observedBits !== 'number' || observedBits === maxSigned31BitInt) {
15887 // Observe all updates.
15888 lastContextWithAllBitsObserved = context;
15889 resolvedObservedBits = maxSigned31BitInt;
15890 } else {
15891 resolvedObservedBits = observedBits;
15892 }
15893
15894 var contextItem = {
15895 context: context,
15896 observedBits: resolvedObservedBits,
15897 next: null
15898 };
15899
15900 if (lastContextDependency === null) {
15901 !(currentlyRenderingFiber !== null) ? invariant(false, 'Context can only be read while React is rendering. In classes, you can read it in the render method or getDerivedStateFromProps. In function components, you can read it directly in the function body, but not inside Hooks like useReducer() or useMemo().') : void 0;
15902
15903 // This is the first dependency for this component. Create a new list.
15904 lastContextDependency = contextItem;
15905 currentlyRenderingFiber.contextDependencies = {
15906 first: contextItem,
15907 expirationTime: NoWork
15908 };
15909 } else {
15910 // Append a new context item.
15911 lastContextDependency = lastContextDependency.next = contextItem;
15912 }
15913 }
15914 return isPrimaryRenderer ? context._currentValue : context._currentValue2;
15915}
15916
15917// UpdateQueue is a linked list of prioritized updates.
15918//
15919// Like fibers, update queues come in pairs: a current queue, which represents
15920// the visible state of the screen, and a work-in-progress queue, which can be
15921// mutated and processed asynchronously before it is committed — a form of
15922// double buffering. If a work-in-progress render is discarded before finishing,
15923// we create a new work-in-progress by cloning the current queue.
15924//
15925// Both queues share a persistent, singly-linked list structure. To schedule an
15926// update, we append it to the end of both queues. Each queue maintains a
15927// pointer to first update in the persistent list that hasn't been processed.
15928// The work-in-progress pointer always has a position equal to or greater than
15929// the current queue, since we always work on that one. The current queue's
15930// pointer is only updated during the commit phase, when we swap in the
15931// work-in-progress.
15932//
15933// For example:
15934//
15935// Current pointer: A - B - C - D - E - F
15936// Work-in-progress pointer: D - E - F
15937// ^
15938// The work-in-progress queue has
15939// processed more updates than current.
15940//
15941// The reason we append to both queues is because otherwise we might drop
15942// updates without ever processing them. For example, if we only add updates to
15943// the work-in-progress queue, some updates could be lost whenever a work-in
15944// -progress render restarts by cloning from current. Similarly, if we only add
15945// updates to the current queue, the updates will be lost whenever an already
15946// in-progress queue commits and swaps with the current queue. However, by
15947// adding to both queues, we guarantee that the update will be part of the next
15948// work-in-progress. (And because the work-in-progress queue becomes the
15949// current queue once it commits, there's no danger of applying the same
15950// update twice.)
15951//
15952// Prioritization
15953// --------------
15954//
15955// Updates are not sorted by priority, but by insertion; new updates are always
15956// appended to the end of the list.
15957//
15958// The priority is still important, though. When processing the update queue
15959// during the render phase, only the updates with sufficient priority are
15960// included in the result. If we skip an update because it has insufficient
15961// priority, it remains in the queue to be processed later, during a lower
15962// priority render. Crucially, all updates subsequent to a skipped update also
15963// remain in the queue *regardless of their priority*. That means high priority
15964// updates are sometimes processed twice, at two separate priorities. We also
15965// keep track of a base state, that represents the state before the first
15966// update in the queue is applied.
15967//
15968// For example:
15969//
15970// Given a base state of '', and the following queue of updates
15971//
15972// A1 - B2 - C1 - D2
15973//
15974// where the number indicates the priority, and the update is applied to the
15975// previous state by appending a letter, React will process these updates as
15976// two separate renders, one per distinct priority level:
15977//
15978// First render, at priority 1:
15979// Base state: ''
15980// Updates: [A1, C1]
15981// Result state: 'AC'
15982//
15983// Second render, at priority 2:
15984// Base state: 'A' <- The base state does not include C1,
15985// because B2 was skipped.
15986// Updates: [B2, C1, D2] <- C1 was rebased on top of B2
15987// Result state: 'ABCD'
15988//
15989// Because we process updates in insertion order, and rebase high priority
15990// updates when preceding updates are skipped, the final result is deterministic
15991// regardless of priority. Intermediate state may vary according to system
15992// resources, but the final state is always the same.
15993
15994var UpdateState = 0;
15995var ReplaceState = 1;
15996var ForceUpdate = 2;
15997var CaptureUpdate = 3;
15998
15999// Global state that is reset at the beginning of calling `processUpdateQueue`.
16000// It should only be read right after calling `processUpdateQueue`, via
16001// `checkHasForceUpdateAfterProcessing`.
16002var hasForceUpdate = false;
16003
16004var didWarnUpdateInsideUpdate = void 0;
16005var currentlyProcessingQueue = void 0;
16006var resetCurrentlyProcessingQueue = void 0;
16007{
16008 didWarnUpdateInsideUpdate = false;
16009 currentlyProcessingQueue = null;
16010 resetCurrentlyProcessingQueue = function () {
16011 currentlyProcessingQueue = null;
16012 };
16013}
16014
16015function createUpdateQueue(baseState) {
16016 var queue = {
16017 baseState: baseState,
16018 firstUpdate: null,
16019 lastUpdate: null,
16020 firstCapturedUpdate: null,
16021 lastCapturedUpdate: null,
16022 firstEffect: null,
16023 lastEffect: null,
16024 firstCapturedEffect: null,
16025 lastCapturedEffect: null
16026 };
16027 return queue;
16028}
16029
16030function cloneUpdateQueue(currentQueue) {
16031 var queue = {
16032 baseState: currentQueue.baseState,
16033 firstUpdate: currentQueue.firstUpdate,
16034 lastUpdate: currentQueue.lastUpdate,
16035
16036 // TODO: With resuming, if we bail out and resuse the child tree, we should
16037 // keep these effects.
16038 firstCapturedUpdate: null,
16039 lastCapturedUpdate: null,
16040
16041 firstEffect: null,
16042 lastEffect: null,
16043
16044 firstCapturedEffect: null,
16045 lastCapturedEffect: null
16046 };
16047 return queue;
16048}
16049
16050function createUpdate(expirationTime) {
16051 return {
16052 expirationTime: expirationTime,
16053
16054 tag: UpdateState,
16055 payload: null,
16056 callback: null,
16057
16058 next: null,
16059 nextEffect: null
16060 };
16061}
16062
16063function appendUpdateToQueue(queue, update) {
16064 // Append the update to the end of the list.
16065 if (queue.lastUpdate === null) {
16066 // Queue is empty
16067 queue.firstUpdate = queue.lastUpdate = update;
16068 } else {
16069 queue.lastUpdate.next = update;
16070 queue.lastUpdate = update;
16071 }
16072}
16073
16074function enqueueUpdate(fiber, update) {
16075 // Update queues are created lazily.
16076 var alternate = fiber.alternate;
16077 var queue1 = void 0;
16078 var queue2 = void 0;
16079 if (alternate === null) {
16080 // There's only one fiber.
16081 queue1 = fiber.updateQueue;
16082 queue2 = null;
16083 if (queue1 === null) {
16084 queue1 = fiber.updateQueue = createUpdateQueue(fiber.memoizedState);
16085 }
16086 } else {
16087 // There are two owners.
16088 queue1 = fiber.updateQueue;
16089 queue2 = alternate.updateQueue;
16090 if (queue1 === null) {
16091 if (queue2 === null) {
16092 // Neither fiber has an update queue. Create new ones.
16093 queue1 = fiber.updateQueue = createUpdateQueue(fiber.memoizedState);
16094 queue2 = alternate.updateQueue = createUpdateQueue(alternate.memoizedState);
16095 } else {
16096 // Only one fiber has an update queue. Clone to create a new one.
16097 queue1 = fiber.updateQueue = cloneUpdateQueue(queue2);
16098 }
16099 } else {
16100 if (queue2 === null) {
16101 // Only one fiber has an update queue. Clone to create a new one.
16102 queue2 = alternate.updateQueue = cloneUpdateQueue(queue1);
16103 } else {
16104 // Both owners have an update queue.
16105 }
16106 }
16107 }
16108 if (queue2 === null || queue1 === queue2) {
16109 // There's only a single queue.
16110 appendUpdateToQueue(queue1, update);
16111 } else {
16112 // There are two queues. We need to append the update to both queues,
16113 // while accounting for the persistent structure of the list — we don't
16114 // want the same update to be added multiple times.
16115 if (queue1.lastUpdate === null || queue2.lastUpdate === null) {
16116 // One of the queues is not empty. We must add the update to both queues.
16117 appendUpdateToQueue(queue1, update);
16118 appendUpdateToQueue(queue2, update);
16119 } else {
16120 // Both queues are non-empty. The last update is the same in both lists,
16121 // because of structural sharing. So, only append to one of the lists.
16122 appendUpdateToQueue(queue1, update);
16123 // But we still need to update the `lastUpdate` pointer of queue2.
16124 queue2.lastUpdate = update;
16125 }
16126 }
16127
16128 {
16129 if (fiber.tag === ClassComponent && (currentlyProcessingQueue === queue1 || queue2 !== null && currentlyProcessingQueue === queue2) && !didWarnUpdateInsideUpdate) {
16130 warningWithoutStack$1(false, 'An update (setState, replaceState, or forceUpdate) was scheduled ' + 'from inside an update function. Update functions should be pure, ' + 'with zero side-effects. Consider using componentDidUpdate or a ' + 'callback.');
16131 didWarnUpdateInsideUpdate = true;
16132 }
16133 }
16134}
16135
16136function enqueueCapturedUpdate(workInProgress, update) {
16137 // Captured updates go into a separate list, and only on the work-in-
16138 // progress queue.
16139 var workInProgressQueue = workInProgress.updateQueue;
16140 if (workInProgressQueue === null) {
16141 workInProgressQueue = workInProgress.updateQueue = createUpdateQueue(workInProgress.memoizedState);
16142 } else {
16143 // TODO: I put this here rather than createWorkInProgress so that we don't
16144 // clone the queue unnecessarily. There's probably a better way to
16145 // structure this.
16146 workInProgressQueue = ensureWorkInProgressQueueIsAClone(workInProgress, workInProgressQueue);
16147 }
16148
16149 // Append the update to the end of the list.
16150 if (workInProgressQueue.lastCapturedUpdate === null) {
16151 // This is the first render phase update
16152 workInProgressQueue.firstCapturedUpdate = workInProgressQueue.lastCapturedUpdate = update;
16153 } else {
16154 workInProgressQueue.lastCapturedUpdate.next = update;
16155 workInProgressQueue.lastCapturedUpdate = update;
16156 }
16157}
16158
16159function ensureWorkInProgressQueueIsAClone(workInProgress, queue) {
16160 var current = workInProgress.alternate;
16161 if (current !== null) {
16162 // If the work-in-progress queue is equal to the current queue,
16163 // we need to clone it first.
16164 if (queue === current.updateQueue) {
16165 queue = workInProgress.updateQueue = cloneUpdateQueue(queue);
16166 }
16167 }
16168 return queue;
16169}
16170
16171function getStateFromUpdate(workInProgress, queue, update, prevState, nextProps, instance) {
16172 switch (update.tag) {
16173 case ReplaceState:
16174 {
16175 var _payload = update.payload;
16176 if (typeof _payload === 'function') {
16177 // Updater function
16178 {
16179 enterDisallowedContextReadInDEV();
16180 if (debugRenderPhaseSideEffects || debugRenderPhaseSideEffectsForStrictMode && workInProgress.mode & StrictMode) {
16181 _payload.call(instance, prevState, nextProps);
16182 }
16183 }
16184 var nextState = _payload.call(instance, prevState, nextProps);
16185 {
16186 exitDisallowedContextReadInDEV();
16187 }
16188 return nextState;
16189 }
16190 // State object
16191 return _payload;
16192 }
16193 case CaptureUpdate:
16194 {
16195 workInProgress.effectTag = workInProgress.effectTag & ~ShouldCapture | DidCapture;
16196 }
16197 // Intentional fallthrough
16198 case UpdateState:
16199 {
16200 var _payload2 = update.payload;
16201 var partialState = void 0;
16202 if (typeof _payload2 === 'function') {
16203 // Updater function
16204 {
16205 enterDisallowedContextReadInDEV();
16206 if (debugRenderPhaseSideEffects || debugRenderPhaseSideEffectsForStrictMode && workInProgress.mode & StrictMode) {
16207 _payload2.call(instance, prevState, nextProps);
16208 }
16209 }
16210 partialState = _payload2.call(instance, prevState, nextProps);
16211 {
16212 exitDisallowedContextReadInDEV();
16213 }
16214 } else {
16215 // Partial state object
16216 partialState = _payload2;
16217 }
16218 if (partialState === null || partialState === undefined) {
16219 // Null and undefined are treated as no-ops.
16220 return prevState;
16221 }
16222 // Merge the partial state and the previous state.
16223 return _assign({}, prevState, partialState);
16224 }
16225 case ForceUpdate:
16226 {
16227 hasForceUpdate = true;
16228 return prevState;
16229 }
16230 }
16231 return prevState;
16232}
16233
16234function processUpdateQueue(workInProgress, queue, props, instance, renderExpirationTime) {
16235 hasForceUpdate = false;
16236
16237 queue = ensureWorkInProgressQueueIsAClone(workInProgress, queue);
16238
16239 {
16240 currentlyProcessingQueue = queue;
16241 }
16242
16243 // These values may change as we process the queue.
16244 var newBaseState = queue.baseState;
16245 var newFirstUpdate = null;
16246 var newExpirationTime = NoWork;
16247
16248 // Iterate through the list of updates to compute the result.
16249 var update = queue.firstUpdate;
16250 var resultState = newBaseState;
16251 while (update !== null) {
16252 var updateExpirationTime = update.expirationTime;
16253 if (updateExpirationTime < renderExpirationTime) {
16254 // This update does not have sufficient priority. Skip it.
16255 if (newFirstUpdate === null) {
16256 // This is the first skipped update. It will be the first update in
16257 // the new list.
16258 newFirstUpdate = update;
16259 // Since this is the first update that was skipped, the current result
16260 // is the new base state.
16261 newBaseState = resultState;
16262 }
16263 // Since this update will remain in the list, update the remaining
16264 // expiration time.
16265 if (newExpirationTime < updateExpirationTime) {
16266 newExpirationTime = updateExpirationTime;
16267 }
16268 } else {
16269 // This update does have sufficient priority. Process it and compute
16270 // a new result.
16271 resultState = getStateFromUpdate(workInProgress, queue, update, resultState, props, instance);
16272 var _callback = update.callback;
16273 if (_callback !== null) {
16274 workInProgress.effectTag |= Callback;
16275 // Set this to null, in case it was mutated during an aborted render.
16276 update.nextEffect = null;
16277 if (queue.lastEffect === null) {
16278 queue.firstEffect = queue.lastEffect = update;
16279 } else {
16280 queue.lastEffect.nextEffect = update;
16281 queue.lastEffect = update;
16282 }
16283 }
16284 }
16285 // Continue to the next update.
16286 update = update.next;
16287 }
16288
16289 // Separately, iterate though the list of captured updates.
16290 var newFirstCapturedUpdate = null;
16291 update = queue.firstCapturedUpdate;
16292 while (update !== null) {
16293 var _updateExpirationTime = update.expirationTime;
16294 if (_updateExpirationTime < renderExpirationTime) {
16295 // This update does not have sufficient priority. Skip it.
16296 if (newFirstCapturedUpdate === null) {
16297 // This is the first skipped captured update. It will be the first
16298 // update in the new list.
16299 newFirstCapturedUpdate = update;
16300 // If this is the first update that was skipped, the current result is
16301 // the new base state.
16302 if (newFirstUpdate === null) {
16303 newBaseState = resultState;
16304 }
16305 }
16306 // Since this update will remain in the list, update the remaining
16307 // expiration time.
16308 if (newExpirationTime < _updateExpirationTime) {
16309 newExpirationTime = _updateExpirationTime;
16310 }
16311 } else {
16312 // This update does have sufficient priority. Process it and compute
16313 // a new result.
16314 resultState = getStateFromUpdate(workInProgress, queue, update, resultState, props, instance);
16315 var _callback2 = update.callback;
16316 if (_callback2 !== null) {
16317 workInProgress.effectTag |= Callback;
16318 // Set this to null, in case it was mutated during an aborted render.
16319 update.nextEffect = null;
16320 if (queue.lastCapturedEffect === null) {
16321 queue.firstCapturedEffect = queue.lastCapturedEffect = update;
16322 } else {
16323 queue.lastCapturedEffect.nextEffect = update;
16324 queue.lastCapturedEffect = update;
16325 }
16326 }
16327 }
16328 update = update.next;
16329 }
16330
16331 if (newFirstUpdate === null) {
16332 queue.lastUpdate = null;
16333 }
16334 if (newFirstCapturedUpdate === null) {
16335 queue.lastCapturedUpdate = null;
16336 } else {
16337 workInProgress.effectTag |= Callback;
16338 }
16339 if (newFirstUpdate === null && newFirstCapturedUpdate === null) {
16340 // We processed every update, without skipping. That means the new base
16341 // state is the same as the result state.
16342 newBaseState = resultState;
16343 }
16344
16345 queue.baseState = newBaseState;
16346 queue.firstUpdate = newFirstUpdate;
16347 queue.firstCapturedUpdate = newFirstCapturedUpdate;
16348
16349 // Set the remaining expiration time to be whatever is remaining in the queue.
16350 // This should be fine because the only two other things that contribute to
16351 // expiration time are props and context. We're already in the middle of the
16352 // begin phase by the time we start processing the queue, so we've already
16353 // dealt with the props. Context in components that specify
16354 // shouldComponentUpdate is tricky; but we'll have to account for
16355 // that regardless.
16356 workInProgress.expirationTime = newExpirationTime;
16357 workInProgress.memoizedState = resultState;
16358
16359 {
16360 currentlyProcessingQueue = null;
16361 }
16362}
16363
16364function callCallback(callback, context) {
16365 !(typeof callback === 'function') ? invariant(false, 'Invalid argument passed as callback. Expected a function. Instead received: %s', callback) : void 0;
16366 callback.call(context);
16367}
16368
16369function resetHasForceUpdateBeforeProcessing() {
16370 hasForceUpdate = false;
16371}
16372
16373function checkHasForceUpdateAfterProcessing() {
16374 return hasForceUpdate;
16375}
16376
16377function commitUpdateQueue(finishedWork, finishedQueue, instance, renderExpirationTime) {
16378 // If the finished render included captured updates, and there are still
16379 // lower priority updates left over, we need to keep the captured updates
16380 // in the queue so that they are rebased and not dropped once we process the
16381 // queue again at the lower priority.
16382 if (finishedQueue.firstCapturedUpdate !== null) {
16383 // Join the captured update list to the end of the normal list.
16384 if (finishedQueue.lastUpdate !== null) {
16385 finishedQueue.lastUpdate.next = finishedQueue.firstCapturedUpdate;
16386 finishedQueue.lastUpdate = finishedQueue.lastCapturedUpdate;
16387 }
16388 // Clear the list of captured updates.
16389 finishedQueue.firstCapturedUpdate = finishedQueue.lastCapturedUpdate = null;
16390 }
16391
16392 // Commit the effects
16393 commitUpdateEffects(finishedQueue.firstEffect, instance);
16394 finishedQueue.firstEffect = finishedQueue.lastEffect = null;
16395
16396 commitUpdateEffects(finishedQueue.firstCapturedEffect, instance);
16397 finishedQueue.firstCapturedEffect = finishedQueue.lastCapturedEffect = null;
16398}
16399
16400function commitUpdateEffects(effect, instance) {
16401 while (effect !== null) {
16402 var _callback3 = effect.callback;
16403 if (_callback3 !== null) {
16404 effect.callback = null;
16405 callCallback(_callback3, instance);
16406 }
16407 effect = effect.nextEffect;
16408 }
16409}
16410
16411function createCapturedValue(value, source) {
16412 // If the value is an error, call this function immediately after it is thrown
16413 // so the stack is accurate.
16414 return {
16415 value: value,
16416 source: source,
16417 stack: getStackByFiberInDevAndProd(source)
16418 };
16419}
16420
16421function markUpdate(workInProgress) {
16422 // Tag the fiber with an update effect. This turns a Placement into
16423 // a PlacementAndUpdate.
16424 workInProgress.effectTag |= Update;
16425}
16426
16427function markRef$1(workInProgress) {
16428 workInProgress.effectTag |= Ref;
16429}
16430
16431var appendAllChildren = void 0;
16432var updateHostContainer = void 0;
16433var updateHostComponent$1 = void 0;
16434var updateHostText$1 = void 0;
16435if (supportsMutation) {
16436 // Mutation mode
16437
16438 appendAllChildren = function (parent, workInProgress, needsVisibilityToggle, isHidden) {
16439 // We only have the top Fiber that was created but we need recurse down its
16440 // children to find all the terminal nodes.
16441 var node = workInProgress.child;
16442 while (node !== null) {
16443 if (node.tag === HostComponent || node.tag === HostText) {
16444 appendInitialChild(parent, node.stateNode);
16445 } else if (node.tag === HostPortal) {
16446 // If we have a portal child, then we don't want to traverse
16447 // down its children. Instead, we'll get insertions from each child in
16448 // the portal directly.
16449 } else if (node.child !== null) {
16450 node.child.return = node;
16451 node = node.child;
16452 continue;
16453 }
16454 if (node === workInProgress) {
16455 return;
16456 }
16457 while (node.sibling === null) {
16458 if (node.return === null || node.return === workInProgress) {
16459 return;
16460 }
16461 node = node.return;
16462 }
16463 node.sibling.return = node.return;
16464 node = node.sibling;
16465 }
16466 };
16467
16468 updateHostContainer = function (workInProgress) {
16469 // Noop
16470 };
16471 updateHostComponent$1 = function (current, workInProgress, type, newProps, rootContainerInstance) {
16472 // If we have an alternate, that means this is an update and we need to
16473 // schedule a side-effect to do the updates.
16474 var oldProps = current.memoizedProps;
16475 if (oldProps === newProps) {
16476 // In mutation mode, this is sufficient for a bailout because
16477 // we won't touch this node even if children changed.
16478 return;
16479 }
16480
16481 // If we get updated because one of our children updated, we don't
16482 // have newProps so we'll have to reuse them.
16483 // TODO: Split the update API as separate for the props vs. children.
16484 // Even better would be if children weren't special cased at all tho.
16485 var instance = workInProgress.stateNode;
16486 var currentHostContext = getHostContext();
16487 // TODO: Experiencing an error where oldProps is null. Suggests a host
16488 // component is hitting the resume path. Figure out why. Possibly
16489 // related to `hidden`.
16490 var updatePayload = prepareUpdate(instance, type, oldProps, newProps, rootContainerInstance, currentHostContext);
16491 // TODO: Type this specific to this type of component.
16492 workInProgress.updateQueue = updatePayload;
16493 // If the update payload indicates that there is a change or if there
16494 // is a new ref we mark this as an update. All the work is done in commitWork.
16495 if (updatePayload) {
16496 markUpdate(workInProgress);
16497 }
16498 };
16499 updateHostText$1 = function (current, workInProgress, oldText, newText) {
16500 // If the text differs, mark it as an update. All the work in done in commitWork.
16501 if (oldText !== newText) {
16502 markUpdate(workInProgress);
16503 }
16504 };
16505} else if (supportsPersistence) {
16506 // Persistent host tree mode
16507
16508 appendAllChildren = function (parent, workInProgress, needsVisibilityToggle, isHidden) {
16509 // We only have the top Fiber that was created but we need recurse down its
16510 // children to find all the terminal nodes.
16511 var node = workInProgress.child;
16512 while (node !== null) {
16513 // eslint-disable-next-line no-labels
16514 branches: if (node.tag === HostComponent) {
16515 var instance = node.stateNode;
16516 if (needsVisibilityToggle) {
16517 var props = node.memoizedProps;
16518 var type = node.type;
16519 if (isHidden) {
16520 // This child is inside a timed out tree. Hide it.
16521 instance = cloneHiddenInstance(instance, type, props, node);
16522 } else {
16523 // This child was previously inside a timed out tree. If it was not
16524 // updated during this render, it may need to be unhidden. Clone
16525 // again to be sure.
16526 instance = cloneUnhiddenInstance(instance, type, props, node);
16527 }
16528 node.stateNode = instance;
16529 }
16530 appendInitialChild(parent, instance);
16531 } else if (node.tag === HostText) {
16532 var _instance = node.stateNode;
16533 if (needsVisibilityToggle) {
16534 var text = node.memoizedProps;
16535 var rootContainerInstance = getRootHostContainer();
16536 var currentHostContext = getHostContext();
16537 if (isHidden) {
16538 _instance = createHiddenTextInstance(text, rootContainerInstance, currentHostContext, workInProgress);
16539 } else {
16540 _instance = createTextInstance(text, rootContainerInstance, currentHostContext, workInProgress);
16541 }
16542 node.stateNode = _instance;
16543 }
16544 appendInitialChild(parent, _instance);
16545 } else if (node.tag === HostPortal) {
16546 // If we have a portal child, then we don't want to traverse
16547 // down its children. Instead, we'll get insertions from each child in
16548 // the portal directly.
16549 } else if (node.tag === SuspenseComponent) {
16550 var current = node.alternate;
16551 if (current !== null) {
16552 var oldState = current.memoizedState;
16553 var newState = node.memoizedState;
16554 var oldIsHidden = oldState !== null;
16555 var newIsHidden = newState !== null;
16556 if (oldIsHidden !== newIsHidden) {
16557 // The placeholder either just timed out or switched back to the normal
16558 // children after having previously timed out. Toggle the visibility of
16559 // the direct host children.
16560 var primaryChildParent = newIsHidden ? node.child : node;
16561 if (primaryChildParent !== null) {
16562 appendAllChildren(parent, primaryChildParent, true, newIsHidden);
16563 }
16564 // eslint-disable-next-line no-labels
16565 break branches;
16566 }
16567 }
16568 if (node.child !== null) {
16569 // Continue traversing like normal
16570 node.child.return = node;
16571 node = node.child;
16572 continue;
16573 }
16574 } else if (node.child !== null) {
16575 node.child.return = node;
16576 node = node.child;
16577 continue;
16578 }
16579 // $FlowFixMe This is correct but Flow is confused by the labeled break.
16580 node = node;
16581 if (node === workInProgress) {
16582 return;
16583 }
16584 while (node.sibling === null) {
16585 if (node.return === null || node.return === workInProgress) {
16586 return;
16587 }
16588 node = node.return;
16589 }
16590 node.sibling.return = node.return;
16591 node = node.sibling;
16592 }
16593 };
16594
16595 // An unfortunate fork of appendAllChildren because we have two different parent types.
16596 var appendAllChildrenToContainer = function (containerChildSet, workInProgress, needsVisibilityToggle, isHidden) {
16597 // We only have the top Fiber that was created but we need recurse down its
16598 // children to find all the terminal nodes.
16599 var node = workInProgress.child;
16600 while (node !== null) {
16601 // eslint-disable-next-line no-labels
16602 branches: if (node.tag === HostComponent) {
16603 var instance = node.stateNode;
16604 if (needsVisibilityToggle) {
16605 var props = node.memoizedProps;
16606 var type = node.type;
16607 if (isHidden) {
16608 // This child is inside a timed out tree. Hide it.
16609 instance = cloneHiddenInstance(instance, type, props, node);
16610 } else {
16611 // This child was previously inside a timed out tree. If it was not
16612 // updated during this render, it may need to be unhidden. Clone
16613 // again to be sure.
16614 instance = cloneUnhiddenInstance(instance, type, props, node);
16615 }
16616 node.stateNode = instance;
16617 }
16618 appendChildToContainerChildSet(containerChildSet, instance);
16619 } else if (node.tag === HostText) {
16620 var _instance2 = node.stateNode;
16621 if (needsVisibilityToggle) {
16622 var text = node.memoizedProps;
16623 var rootContainerInstance = getRootHostContainer();
16624 var currentHostContext = getHostContext();
16625 if (isHidden) {
16626 _instance2 = createHiddenTextInstance(text, rootContainerInstance, currentHostContext, workInProgress);
16627 } else {
16628 _instance2 = createTextInstance(text, rootContainerInstance, currentHostContext, workInProgress);
16629 }
16630 node.stateNode = _instance2;
16631 }
16632 appendChildToContainerChildSet(containerChildSet, _instance2);
16633 } else if (node.tag === HostPortal) {
16634 // If we have a portal child, then we don't want to traverse
16635 // down its children. Instead, we'll get insertions from each child in
16636 // the portal directly.
16637 } else if (node.tag === SuspenseComponent) {
16638 var current = node.alternate;
16639 if (current !== null) {
16640 var oldState = current.memoizedState;
16641 var newState = node.memoizedState;
16642 var oldIsHidden = oldState !== null;
16643 var newIsHidden = newState !== null;
16644 if (oldIsHidden !== newIsHidden) {
16645 // The placeholder either just timed out or switched back to the normal
16646 // children after having previously timed out. Toggle the visibility of
16647 // the direct host children.
16648 var primaryChildParent = newIsHidden ? node.child : node;
16649 if (primaryChildParent !== null) {
16650 appendAllChildrenToContainer(containerChildSet, primaryChildParent, true, newIsHidden);
16651 }
16652 // eslint-disable-next-line no-labels
16653 break branches;
16654 }
16655 }
16656 if (node.child !== null) {
16657 // Continue traversing like normal
16658 node.child.return = node;
16659 node = node.child;
16660 continue;
16661 }
16662 } else if (node.child !== null) {
16663 node.child.return = node;
16664 node = node.child;
16665 continue;
16666 }
16667 // $FlowFixMe This is correct but Flow is confused by the labeled break.
16668 node = node;
16669 if (node === workInProgress) {
16670 return;
16671 }
16672 while (node.sibling === null) {
16673 if (node.return === null || node.return === workInProgress) {
16674 return;
16675 }
16676 node = node.return;
16677 }
16678 node.sibling.return = node.return;
16679 node = node.sibling;
16680 }
16681 };
16682 updateHostContainer = function (workInProgress) {
16683 var portalOrRoot = workInProgress.stateNode;
16684 var childrenUnchanged = workInProgress.firstEffect === null;
16685 if (childrenUnchanged) {
16686 // No changes, just reuse the existing instance.
16687 } else {
16688 var container = portalOrRoot.containerInfo;
16689 var newChildSet = createContainerChildSet(container);
16690 // If children might have changed, we have to add them all to the set.
16691 appendAllChildrenToContainer(newChildSet, workInProgress, false, false);
16692 portalOrRoot.pendingChildren = newChildSet;
16693 // Schedule an update on the container to swap out the container.
16694 markUpdate(workInProgress);
16695 finalizeContainerChildren(container, newChildSet);
16696 }
16697 };
16698 updateHostComponent$1 = function (current, workInProgress, type, newProps, rootContainerInstance) {
16699 var currentInstance = current.stateNode;
16700 var oldProps = current.memoizedProps;
16701 // If there are no effects associated with this node, then none of our children had any updates.
16702 // This guarantees that we can reuse all of them.
16703 var childrenUnchanged = workInProgress.firstEffect === null;
16704 if (childrenUnchanged && oldProps === newProps) {
16705 // No changes, just reuse the existing instance.
16706 // Note that this might release a previous clone.
16707 workInProgress.stateNode = currentInstance;
16708 return;
16709 }
16710 var recyclableInstance = workInProgress.stateNode;
16711 var currentHostContext = getHostContext();
16712 var updatePayload = null;
16713 if (oldProps !== newProps) {
16714 updatePayload = prepareUpdate(recyclableInstance, type, oldProps, newProps, rootContainerInstance, currentHostContext);
16715 }
16716 if (childrenUnchanged && updatePayload === null) {
16717 // No changes, just reuse the existing instance.
16718 // Note that this might release a previous clone.
16719 workInProgress.stateNode = currentInstance;
16720 return;
16721 }
16722 var newInstance = cloneInstance(currentInstance, updatePayload, type, oldProps, newProps, workInProgress, childrenUnchanged, recyclableInstance);
16723 if (finalizeInitialChildren(newInstance, type, newProps, rootContainerInstance, currentHostContext)) {
16724 markUpdate(workInProgress);
16725 }
16726 workInProgress.stateNode = newInstance;
16727 if (childrenUnchanged) {
16728 // If there are no other effects in this tree, we need to flag this node as having one.
16729 // Even though we're not going to use it for anything.
16730 // Otherwise parents won't know that there are new children to propagate upwards.
16731 markUpdate(workInProgress);
16732 } else {
16733 // If children might have changed, we have to add them all to the set.
16734 appendAllChildren(newInstance, workInProgress, false, false);
16735 }
16736 };
16737 updateHostText$1 = function (current, workInProgress, oldText, newText) {
16738 if (oldText !== newText) {
16739 // If the text content differs, we'll create a new text instance for it.
16740 var rootContainerInstance = getRootHostContainer();
16741 var currentHostContext = getHostContext();
16742 workInProgress.stateNode = createTextInstance(newText, rootContainerInstance, currentHostContext, workInProgress);
16743 // We'll have to mark it as having an effect, even though we won't use the effect for anything.
16744 // This lets the parents know that at least one of their children has changed.
16745 markUpdate(workInProgress);
16746 }
16747 };
16748} else {
16749 // No host operations
16750 updateHostContainer = function (workInProgress) {
16751 // Noop
16752 };
16753 updateHostComponent$1 = function (current, workInProgress, type, newProps, rootContainerInstance) {
16754 // Noop
16755 };
16756 updateHostText$1 = function (current, workInProgress, oldText, newText) {
16757 // Noop
16758 };
16759}
16760
16761function completeWork(current, workInProgress, renderExpirationTime) {
16762 var newProps = workInProgress.pendingProps;
16763
16764 switch (workInProgress.tag) {
16765 case IndeterminateComponent:
16766 break;
16767 case LazyComponent:
16768 break;
16769 case SimpleMemoComponent:
16770 case FunctionComponent:
16771 break;
16772 case ClassComponent:
16773 {
16774 var Component = workInProgress.type;
16775 if (isContextProvider(Component)) {
16776 popContext(workInProgress);
16777 }
16778 break;
16779 }
16780 case HostRoot:
16781 {
16782 popHostContainer(workInProgress);
16783 popTopLevelContextObject(workInProgress);
16784 var fiberRoot = workInProgress.stateNode;
16785 if (fiberRoot.pendingContext) {
16786 fiberRoot.context = fiberRoot.pendingContext;
16787 fiberRoot.pendingContext = null;
16788 }
16789 if (current === null || current.child === null) {
16790 // If we hydrated, pop so that we can delete any remaining children
16791 // that weren't hydrated.
16792 popHydrationState(workInProgress);
16793 // This resets the hacky state to fix isMounted before committing.
16794 // TODO: Delete this when we delete isMounted and findDOMNode.
16795 workInProgress.effectTag &= ~Placement;
16796 }
16797 updateHostContainer(workInProgress);
16798 break;
16799 }
16800 case HostComponent:
16801 {
16802 popHostContext(workInProgress);
16803 var rootContainerInstance = getRootHostContainer();
16804 var type = workInProgress.type;
16805 if (current !== null && workInProgress.stateNode != null) {
16806 updateHostComponent$1(current, workInProgress, type, newProps, rootContainerInstance);
16807
16808 if (current.ref !== workInProgress.ref) {
16809 markRef$1(workInProgress);
16810 }
16811 } else {
16812 if (!newProps) {
16813 !(workInProgress.stateNode !== null) ? invariant(false, 'We must have new props for new mounts. This error is likely caused by a bug in React. Please file an issue.') : void 0;
16814 // This can happen when we abort work.
16815 break;
16816 }
16817
16818 var currentHostContext = getHostContext();
16819 // TODO: Move createInstance to beginWork and keep it on a context
16820 // "stack" as the parent. Then append children as we go in beginWork
16821 // or completeWork depending on we want to add then top->down or
16822 // bottom->up. Top->down is faster in IE11.
16823 var wasHydrated = popHydrationState(workInProgress);
16824 if (wasHydrated) {
16825 // TODO: Move this and createInstance step into the beginPhase
16826 // to consolidate.
16827 if (prepareToHydrateHostInstance(workInProgress, rootContainerInstance, currentHostContext)) {
16828 // If changes to the hydrated node needs to be applied at the
16829 // commit-phase we mark this as such.
16830 markUpdate(workInProgress);
16831 }
16832 } else {
16833 var instance = createInstance(type, newProps, rootContainerInstance, currentHostContext, workInProgress);
16834
16835 appendAllChildren(instance, workInProgress, false, false);
16836
16837 // Certain renderers require commit-time effects for initial mount.
16838 // (eg DOM renderer supports auto-focus for certain elements).
16839 // Make sure such renderers get scheduled for later work.
16840 if (finalizeInitialChildren(instance, type, newProps, rootContainerInstance, currentHostContext)) {
16841 markUpdate(workInProgress);
16842 }
16843 workInProgress.stateNode = instance;
16844 }
16845
16846 if (workInProgress.ref !== null) {
16847 // If there is a ref on a host node we need to schedule a callback
16848 markRef$1(workInProgress);
16849 }
16850 }
16851 break;
16852 }
16853 case HostText:
16854 {
16855 var newText = newProps;
16856 if (current && workInProgress.stateNode != null) {
16857 var oldText = current.memoizedProps;
16858 // If we have an alternate, that means this is an update and we need
16859 // to schedule a side-effect to do the updates.
16860 updateHostText$1(current, workInProgress, oldText, newText);
16861 } else {
16862 if (typeof newText !== 'string') {
16863 !(workInProgress.stateNode !== null) ? invariant(false, 'We must have new props for new mounts. This error is likely caused by a bug in React. Please file an issue.') : void 0;
16864 // This can happen when we abort work.
16865 }
16866 var _rootContainerInstance = getRootHostContainer();
16867 var _currentHostContext = getHostContext();
16868 var _wasHydrated = popHydrationState(workInProgress);
16869 if (_wasHydrated) {
16870 if (prepareToHydrateHostTextInstance(workInProgress)) {
16871 markUpdate(workInProgress);
16872 }
16873 } else {
16874 workInProgress.stateNode = createTextInstance(newText, _rootContainerInstance, _currentHostContext, workInProgress);
16875 }
16876 }
16877 break;
16878 }
16879 case ForwardRef:
16880 break;
16881 case SuspenseComponent:
16882 {
16883 var nextState = workInProgress.memoizedState;
16884 if ((workInProgress.effectTag & DidCapture) !== NoEffect) {
16885 // Something suspended. Re-render with the fallback children.
16886 workInProgress.expirationTime = renderExpirationTime;
16887 // Do not reset the effect list.
16888 return workInProgress;
16889 }
16890
16891 var nextDidTimeout = nextState !== null;
16892 var prevDidTimeout = current !== null && current.memoizedState !== null;
16893
16894 if (current !== null && !nextDidTimeout && prevDidTimeout) {
16895 // We just switched from the fallback to the normal children. Delete
16896 // the fallback.
16897 // TODO: Would it be better to store the fallback fragment on
16898 var currentFallbackChild = current.child.sibling;
16899 if (currentFallbackChild !== null) {
16900 // Deletions go at the beginning of the return fiber's effect list
16901 var first = workInProgress.firstEffect;
16902 if (first !== null) {
16903 workInProgress.firstEffect = currentFallbackChild;
16904 currentFallbackChild.nextEffect = first;
16905 } else {
16906 workInProgress.firstEffect = workInProgress.lastEffect = currentFallbackChild;
16907 currentFallbackChild.nextEffect = null;
16908 }
16909 currentFallbackChild.effectTag = Deletion;
16910 }
16911 }
16912
16913 if (nextDidTimeout || prevDidTimeout) {
16914 // If the children are hidden, or if they were previous hidden, schedule
16915 // an effect to toggle their visibility. This is also used to attach a
16916 // retry listener to the promise.
16917 workInProgress.effectTag |= Update;
16918 }
16919 break;
16920 }
16921 case Fragment:
16922 break;
16923 case Mode:
16924 break;
16925 case Profiler:
16926 break;
16927 case HostPortal:
16928 popHostContainer(workInProgress);
16929 updateHostContainer(workInProgress);
16930 break;
16931 case ContextProvider:
16932 // Pop provider fiber
16933 popProvider(workInProgress);
16934 break;
16935 case ContextConsumer:
16936 break;
16937 case MemoComponent:
16938 break;
16939 case IncompleteClassComponent:
16940 {
16941 // Same as class component case. I put it down here so that the tags are
16942 // sequential to ensure this switch is compiled to a jump table.
16943 var _Component = workInProgress.type;
16944 if (isContextProvider(_Component)) {
16945 popContext(workInProgress);
16946 }
16947 break;
16948 }
16949 case DehydratedSuspenseComponent:
16950 {
16951 if (enableSuspenseServerRenderer) {
16952 if (current === null) {
16953 var _wasHydrated2 = popHydrationState(workInProgress);
16954 !_wasHydrated2 ? invariant(false, 'A dehydrated suspense component was completed without a hydrated node. This is probably a bug in React.') : void 0;
16955 skipPastDehydratedSuspenseInstance(workInProgress);
16956 } else if ((workInProgress.effectTag & DidCapture) === NoEffect) {
16957 // This boundary did not suspend so it's now hydrated.
16958 // To handle any future suspense cases, we're going to now upgrade it
16959 // to a Suspense component. We detach it from the existing current fiber.
16960 current.alternate = null;
16961 workInProgress.alternate = null;
16962 workInProgress.tag = SuspenseComponent;
16963 workInProgress.memoizedState = null;
16964 workInProgress.stateNode = null;
16965 }
16966 }
16967 break;
16968 }
16969 default:
16970 invariant(false, 'Unknown unit of work tag. This error is likely caused by a bug in React. Please file an issue.');
16971 }
16972
16973 return null;
16974}
16975
16976function shouldCaptureSuspense(workInProgress) {
16977 // In order to capture, the Suspense component must have a fallback prop.
16978 if (workInProgress.memoizedProps.fallback === undefined) {
16979 return false;
16980 }
16981 // If it was the primary children that just suspended, capture and render the
16982 // fallback. Otherwise, don't capture and bubble to the next boundary.
16983 var nextState = workInProgress.memoizedState;
16984 return nextState === null;
16985}
16986
16987// This module is forked in different environments.
16988// By default, return `true` to log errors to the console.
16989// Forks can return `false` if this isn't desirable.
16990function showErrorDialog(capturedError) {
16991 return true;
16992}
16993
16994function logCapturedError(capturedError) {
16995 var logError = showErrorDialog(capturedError);
16996
16997 // Allow injected showErrorDialog() to prevent default console.error logging.
16998 // This enables renderers like ReactNative to better manage redbox behavior.
16999 if (logError === false) {
17000 return;
17001 }
17002
17003 var error = capturedError.error;
17004 {
17005 var componentName = capturedError.componentName,
17006 componentStack = capturedError.componentStack,
17007 errorBoundaryName = capturedError.errorBoundaryName,
17008 errorBoundaryFound = capturedError.errorBoundaryFound,
17009 willRetry = capturedError.willRetry;
17010
17011 // Browsers support silencing uncaught errors by calling
17012 // `preventDefault()` in window `error` handler.
17013 // We record this information as an expando on the error.
17014
17015 if (error != null && error._suppressLogging) {
17016 if (errorBoundaryFound && willRetry) {
17017 // The error is recoverable and was silenced.
17018 // Ignore it and don't print the stack addendum.
17019 // This is handy for testing error boundaries without noise.
17020 return;
17021 }
17022 // The error is fatal. Since the silencing might have
17023 // been accidental, we'll surface it anyway.
17024 // However, the browser would have silenced the original error
17025 // so we'll print it first, and then print the stack addendum.
17026 console.error(error);
17027 // For a more detailed description of this block, see:
17028 // https://github.com/facebook/react/pull/13384
17029 }
17030
17031 var componentNameMessage = componentName ? 'The above error occurred in the <' + componentName + '> component:' : 'The above error occurred in one of your React components:';
17032
17033 var errorBoundaryMessage = void 0;
17034 // errorBoundaryFound check is sufficient; errorBoundaryName check is to satisfy Flow.
17035 if (errorBoundaryFound && errorBoundaryName) {
17036 if (willRetry) {
17037 errorBoundaryMessage = 'React will try to recreate this component tree from scratch ' + ('using the error boundary you provided, ' + errorBoundaryName + '.');
17038 } else {
17039 errorBoundaryMessage = 'This error was initially handled by the error boundary ' + errorBoundaryName + '.\n' + 'Recreating the tree from scratch failed so React will unmount the tree.';
17040 }
17041 } else {
17042 errorBoundaryMessage = 'Consider adding an error boundary to your tree to customize error handling behavior.\n' + 'Visit https://fb.me/react-error-boundaries to learn more about error boundaries.';
17043 }
17044 var combinedMessage = '' + componentNameMessage + componentStack + '\n\n' + ('' + errorBoundaryMessage);
17045
17046 // In development, we provide our own message with just the component stack.
17047 // We don't include the original error message and JS stack because the browser
17048 // has already printed it. Even if the application swallows the error, it is still
17049 // displayed by the browser thanks to the DEV-only fake event trick in ReactErrorUtils.
17050 console.error(combinedMessage);
17051 }
17052}
17053
17054var didWarnAboutUndefinedSnapshotBeforeUpdate = null;
17055{
17056 didWarnAboutUndefinedSnapshotBeforeUpdate = new Set();
17057}
17058
17059var PossiblyWeakSet$1 = typeof WeakSet === 'function' ? WeakSet : Set;
17060
17061function logError(boundary, errorInfo) {
17062 var source = errorInfo.source;
17063 var stack = errorInfo.stack;
17064 if (stack === null && source !== null) {
17065 stack = getStackByFiberInDevAndProd(source);
17066 }
17067
17068 var capturedError = {
17069 componentName: source !== null ? getComponentName(source.type) : null,
17070 componentStack: stack !== null ? stack : '',
17071 error: errorInfo.value,
17072 errorBoundary: null,
17073 errorBoundaryName: null,
17074 errorBoundaryFound: false,
17075 willRetry: false
17076 };
17077
17078 if (boundary !== null && boundary.tag === ClassComponent) {
17079 capturedError.errorBoundary = boundary.stateNode;
17080 capturedError.errorBoundaryName = getComponentName(boundary.type);
17081 capturedError.errorBoundaryFound = true;
17082 capturedError.willRetry = true;
17083 }
17084
17085 try {
17086 logCapturedError(capturedError);
17087 } catch (e) {
17088 // This method must not throw, or React internal state will get messed up.
17089 // If console.error is overridden, or logCapturedError() shows a dialog that throws,
17090 // we want to report this error outside of the normal stack as a last resort.
17091 // https://github.com/facebook/react/issues/13188
17092 setTimeout(function () {
17093 throw e;
17094 });
17095 }
17096}
17097
17098var callComponentWillUnmountWithTimer = function (current$$1, instance) {
17099 startPhaseTimer(current$$1, 'componentWillUnmount');
17100 instance.props = current$$1.memoizedProps;
17101 instance.state = current$$1.memoizedState;
17102 instance.componentWillUnmount();
17103 stopPhaseTimer();
17104};
17105
17106// Capture errors so they don't interrupt unmounting.
17107function safelyCallComponentWillUnmount(current$$1, instance) {
17108 {
17109 invokeGuardedCallback(null, callComponentWillUnmountWithTimer, null, current$$1, instance);
17110 if (hasCaughtError()) {
17111 var unmountError = clearCaughtError();
17112 captureCommitPhaseError(current$$1, unmountError);
17113 }
17114 }
17115}
17116
17117function safelyDetachRef(current$$1) {
17118 var ref = current$$1.ref;
17119 if (ref !== null) {
17120 if (typeof ref === 'function') {
17121 {
17122 invokeGuardedCallback(null, ref, null, null);
17123 if (hasCaughtError()) {
17124 var refError = clearCaughtError();
17125 captureCommitPhaseError(current$$1, refError);
17126 }
17127 }
17128 } else {
17129 ref.current = null;
17130 }
17131 }
17132}
17133
17134function safelyCallDestroy(current$$1, destroy) {
17135 {
17136 invokeGuardedCallback(null, destroy, null);
17137 if (hasCaughtError()) {
17138 var error = clearCaughtError();
17139 captureCommitPhaseError(current$$1, error);
17140 }
17141 }
17142}
17143
17144function commitBeforeMutationLifeCycles(current$$1, finishedWork) {
17145 switch (finishedWork.tag) {
17146 case FunctionComponent:
17147 case ForwardRef:
17148 case SimpleMemoComponent:
17149 {
17150 commitHookEffectList(UnmountSnapshot, NoEffect$1, finishedWork);
17151 return;
17152 }
17153 case ClassComponent:
17154 {
17155 if (finishedWork.effectTag & Snapshot) {
17156 if (current$$1 !== null) {
17157 var prevProps = current$$1.memoizedProps;
17158 var prevState = current$$1.memoizedState;
17159 startPhaseTimer(finishedWork, 'getSnapshotBeforeUpdate');
17160 var instance = finishedWork.stateNode;
17161 // We could update instance props and state here,
17162 // but instead we rely on them being set during last render.
17163 // TODO: revisit this when we implement resuming.
17164 {
17165 if (finishedWork.type === finishedWork.elementType && !didWarnAboutReassigningProps) {
17166 !(instance.props === finishedWork.memoizedProps) ? warning$1(false, 'Expected %s props to match memoized props before ' + 'getSnapshotBeforeUpdate. ' + 'This might either be because of a bug in React, or because ' + 'a component reassigns its own `this.props`. ' + 'Please file an issue.', getComponentName(finishedWork.type) || 'instance') : void 0;
17167 !(instance.state === finishedWork.memoizedState) ? warning$1(false, 'Expected %s state to match memoized state before ' + 'getSnapshotBeforeUpdate. ' + 'This might either be because of a bug in React, or because ' + 'a component reassigns its own `this.props`. ' + 'Please file an issue.', getComponentName(finishedWork.type) || 'instance') : void 0;
17168 }
17169 }
17170 var snapshot = instance.getSnapshotBeforeUpdate(finishedWork.elementType === finishedWork.type ? prevProps : resolveDefaultProps(finishedWork.type, prevProps), prevState);
17171 {
17172 var didWarnSet = didWarnAboutUndefinedSnapshotBeforeUpdate;
17173 if (snapshot === undefined && !didWarnSet.has(finishedWork.type)) {
17174 didWarnSet.add(finishedWork.type);
17175 warningWithoutStack$1(false, '%s.getSnapshotBeforeUpdate(): A snapshot value (or null) ' + 'must be returned. You have returned undefined.', getComponentName(finishedWork.type));
17176 }
17177 }
17178 instance.__reactInternalSnapshotBeforeUpdate = snapshot;
17179 stopPhaseTimer();
17180 }
17181 }
17182 return;
17183 }
17184 case HostRoot:
17185 case HostComponent:
17186 case HostText:
17187 case HostPortal:
17188 case IncompleteClassComponent:
17189 // Nothing to do for these component types
17190 return;
17191 default:
17192 {
17193 invariant(false, 'This unit of work tag should not have side-effects. This error is likely caused by a bug in React. Please file an issue.');
17194 }
17195 }
17196}
17197
17198function commitHookEffectList(unmountTag, mountTag, finishedWork) {
17199 var updateQueue = finishedWork.updateQueue;
17200 var lastEffect = updateQueue !== null ? updateQueue.lastEffect : null;
17201 if (lastEffect !== null) {
17202 var firstEffect = lastEffect.next;
17203 var effect = firstEffect;
17204 do {
17205 if ((effect.tag & unmountTag) !== NoEffect$1) {
17206 // Unmount
17207 var destroy = effect.destroy;
17208 effect.destroy = undefined;
17209 if (destroy !== undefined) {
17210 destroy();
17211 }
17212 }
17213 if ((effect.tag & mountTag) !== NoEffect$1) {
17214 // Mount
17215 var create = effect.create;
17216 effect.destroy = create();
17217
17218 {
17219 var _destroy = effect.destroy;
17220 if (_destroy !== undefined && typeof _destroy !== 'function') {
17221 var addendum = void 0;
17222 if (_destroy === null) {
17223 addendum = ' You returned null. If your effect does not require clean ' + 'up, return undefined (or nothing).';
17224 } else if (typeof _destroy.then === 'function') {
17225 addendum = '\n\nIt looks like you wrote useEffect(async () => ...) or returned a Promise. ' + 'Instead, you may write an async function separately ' + 'and then call it from inside the effect:\n\n' + 'async function fetchComment(commentId) {\n' + ' // You can await here\n' + '}\n\n' + 'useEffect(() => {\n' + ' fetchComment(commentId);\n' + '}, [commentId]);\n\n' + 'In the future, React will provide a more idiomatic solution for data fetching ' + "that doesn't involve writing effects manually.";
17226 } else {
17227 addendum = ' You returned: ' + _destroy;
17228 }
17229 warningWithoutStack$1(false, 'An Effect function must not return anything besides a function, ' + 'which is used for clean-up.%s%s', addendum, getStackByFiberInDevAndProd(finishedWork));
17230 }
17231 }
17232 }
17233 effect = effect.next;
17234 } while (effect !== firstEffect);
17235 }
17236}
17237
17238function commitPassiveHookEffects(finishedWork) {
17239 commitHookEffectList(UnmountPassive, NoEffect$1, finishedWork);
17240 commitHookEffectList(NoEffect$1, MountPassive, finishedWork);
17241}
17242
17243function commitLifeCycles(finishedRoot, current$$1, finishedWork, committedExpirationTime) {
17244 switch (finishedWork.tag) {
17245 case FunctionComponent:
17246 case ForwardRef:
17247 case SimpleMemoComponent:
17248 {
17249 commitHookEffectList(UnmountLayout, MountLayout, finishedWork);
17250 break;
17251 }
17252 case ClassComponent:
17253 {
17254 var instance = finishedWork.stateNode;
17255 if (finishedWork.effectTag & Update) {
17256 if (current$$1 === null) {
17257 startPhaseTimer(finishedWork, 'componentDidMount');
17258 // We could update instance props and state here,
17259 // but instead we rely on them being set during last render.
17260 // TODO: revisit this when we implement resuming.
17261 {
17262 if (finishedWork.type === finishedWork.elementType && !didWarnAboutReassigningProps) {
17263 !(instance.props === finishedWork.memoizedProps) ? warning$1(false, 'Expected %s props to match memoized props before ' + 'componentDidMount. ' + 'This might either be because of a bug in React, or because ' + 'a component reassigns its own `this.props`. ' + 'Please file an issue.', getComponentName(finishedWork.type) || 'instance') : void 0;
17264 !(instance.state === finishedWork.memoizedState) ? warning$1(false, 'Expected %s state to match memoized state before ' + 'componentDidMount. ' + 'This might either be because of a bug in React, or because ' + 'a component reassigns its own `this.props`. ' + 'Please file an issue.', getComponentName(finishedWork.type) || 'instance') : void 0;
17265 }
17266 }
17267 instance.componentDidMount();
17268 stopPhaseTimer();
17269 } else {
17270 var prevProps = finishedWork.elementType === finishedWork.type ? current$$1.memoizedProps : resolveDefaultProps(finishedWork.type, current$$1.memoizedProps);
17271 var prevState = current$$1.memoizedState;
17272 startPhaseTimer(finishedWork, 'componentDidUpdate');
17273 // We could update instance props and state here,
17274 // but instead we rely on them being set during last render.
17275 // TODO: revisit this when we implement resuming.
17276 {
17277 if (finishedWork.type === finishedWork.elementType && !didWarnAboutReassigningProps) {
17278 !(instance.props === finishedWork.memoizedProps) ? warning$1(false, 'Expected %s props to match memoized props before ' + 'componentDidUpdate. ' + 'This might either be because of a bug in React, or because ' + 'a component reassigns its own `this.props`. ' + 'Please file an issue.', getComponentName(finishedWork.type) || 'instance') : void 0;
17279 !(instance.state === finishedWork.memoizedState) ? warning$1(false, 'Expected %s state to match memoized state before ' + 'componentDidUpdate. ' + 'This might either be because of a bug in React, or because ' + 'a component reassigns its own `this.props`. ' + 'Please file an issue.', getComponentName(finishedWork.type) || 'instance') : void 0;
17280 }
17281 }
17282 instance.componentDidUpdate(prevProps, prevState, instance.__reactInternalSnapshotBeforeUpdate);
17283 stopPhaseTimer();
17284 }
17285 }
17286 var updateQueue = finishedWork.updateQueue;
17287 if (updateQueue !== null) {
17288 {
17289 if (finishedWork.type === finishedWork.elementType && !didWarnAboutReassigningProps) {
17290 !(instance.props === finishedWork.memoizedProps) ? warning$1(false, 'Expected %s props to match memoized props before ' + 'processing the update queue. ' + 'This might either be because of a bug in React, or because ' + 'a component reassigns its own `this.props`. ' + 'Please file an issue.', getComponentName(finishedWork.type) || 'instance') : void 0;
17291 !(instance.state === finishedWork.memoizedState) ? warning$1(false, 'Expected %s state to match memoized state before ' + 'processing the update queue. ' + 'This might either be because of a bug in React, or because ' + 'a component reassigns its own `this.props`. ' + 'Please file an issue.', getComponentName(finishedWork.type) || 'instance') : void 0;
17292 }
17293 }
17294 // We could update instance props and state here,
17295 // but instead we rely on them being set during last render.
17296 // TODO: revisit this when we implement resuming.
17297 commitUpdateQueue(finishedWork, updateQueue, instance, committedExpirationTime);
17298 }
17299 return;
17300 }
17301 case HostRoot:
17302 {
17303 var _updateQueue = finishedWork.updateQueue;
17304 if (_updateQueue !== null) {
17305 var _instance = null;
17306 if (finishedWork.child !== null) {
17307 switch (finishedWork.child.tag) {
17308 case HostComponent:
17309 _instance = getPublicInstance(finishedWork.child.stateNode);
17310 break;
17311 case ClassComponent:
17312 _instance = finishedWork.child.stateNode;
17313 break;
17314 }
17315 }
17316 commitUpdateQueue(finishedWork, _updateQueue, _instance, committedExpirationTime);
17317 }
17318 return;
17319 }
17320 case HostComponent:
17321 {
17322 var _instance2 = finishedWork.stateNode;
17323
17324 // Renderers may schedule work to be done after host components are mounted
17325 // (eg DOM renderer may schedule auto-focus for inputs and form controls).
17326 // These effects should only be committed when components are first mounted,
17327 // aka when there is no current/alternate.
17328 if (current$$1 === null && finishedWork.effectTag & Update) {
17329 var type = finishedWork.type;
17330 var props = finishedWork.memoizedProps;
17331 commitMount(_instance2, type, props, finishedWork);
17332 }
17333
17334 return;
17335 }
17336 case HostText:
17337 {
17338 // We have no life-cycles associated with text.
17339 return;
17340 }
17341 case HostPortal:
17342 {
17343 // We have no life-cycles associated with portals.
17344 return;
17345 }
17346 case Profiler:
17347 {
17348 if (enableProfilerTimer) {
17349 var onRender = finishedWork.memoizedProps.onRender;
17350
17351 if (enableSchedulerTracing) {
17352 onRender(finishedWork.memoizedProps.id, current$$1 === null ? 'mount' : 'update', finishedWork.actualDuration, finishedWork.treeBaseDuration, finishedWork.actualStartTime, getCommitTime(), finishedRoot.memoizedInteractions);
17353 } else {
17354 onRender(finishedWork.memoizedProps.id, current$$1 === null ? 'mount' : 'update', finishedWork.actualDuration, finishedWork.treeBaseDuration, finishedWork.actualStartTime, getCommitTime());
17355 }
17356 }
17357 return;
17358 }
17359 case SuspenseComponent:
17360 break;
17361 case IncompleteClassComponent:
17362 break;
17363 default:
17364 {
17365 invariant(false, 'This unit of work tag should not have side-effects. This error is likely caused by a bug in React. Please file an issue.');
17366 }
17367 }
17368}
17369
17370function hideOrUnhideAllChildren(finishedWork, isHidden) {
17371 if (supportsMutation) {
17372 // We only have the top Fiber that was inserted but we need to recurse down its
17373 var node = finishedWork;
17374 while (true) {
17375 if (node.tag === HostComponent) {
17376 var instance = node.stateNode;
17377 if (isHidden) {
17378 hideInstance(instance);
17379 } else {
17380 unhideInstance(node.stateNode, node.memoizedProps);
17381 }
17382 } else if (node.tag === HostText) {
17383 var _instance3 = node.stateNode;
17384 if (isHidden) {
17385 hideTextInstance(_instance3);
17386 } else {
17387 unhideTextInstance(_instance3, node.memoizedProps);
17388 }
17389 } else if (node.tag === SuspenseComponent && node.memoizedState !== null) {
17390 // Found a nested Suspense component that timed out. Skip over the
17391 var fallbackChildFragment = node.child.sibling;
17392 fallbackChildFragment.return = node;
17393 node = fallbackChildFragment;
17394 continue;
17395 } else if (node.child !== null) {
17396 node.child.return = node;
17397 node = node.child;
17398 continue;
17399 }
17400 if (node === finishedWork) {
17401 return;
17402 }
17403 while (node.sibling === null) {
17404 if (node.return === null || node.return === finishedWork) {
17405 return;
17406 }
17407 node = node.return;
17408 }
17409 node.sibling.return = node.return;
17410 node = node.sibling;
17411 }
17412 }
17413}
17414
17415function commitAttachRef(finishedWork) {
17416 var ref = finishedWork.ref;
17417 if (ref !== null) {
17418 var instance = finishedWork.stateNode;
17419 var instanceToUse = void 0;
17420 switch (finishedWork.tag) {
17421 case HostComponent:
17422 instanceToUse = getPublicInstance(instance);
17423 break;
17424 default:
17425 instanceToUse = instance;
17426 }
17427 if (typeof ref === 'function') {
17428 ref(instanceToUse);
17429 } else {
17430 {
17431 if (!ref.hasOwnProperty('current')) {
17432 warningWithoutStack$1(false, 'Unexpected ref object provided for %s. ' + 'Use either a ref-setter function or React.createRef().%s', getComponentName(finishedWork.type), getStackByFiberInDevAndProd(finishedWork));
17433 }
17434 }
17435
17436 ref.current = instanceToUse;
17437 }
17438 }
17439}
17440
17441function commitDetachRef(current$$1) {
17442 var currentRef = current$$1.ref;
17443 if (currentRef !== null) {
17444 if (typeof currentRef === 'function') {
17445 currentRef(null);
17446 } else {
17447 currentRef.current = null;
17448 }
17449 }
17450}
17451
17452// User-originating errors (lifecycles and refs) should not interrupt
17453// deletion, so don't let them throw. Host-originating errors should
17454// interrupt deletion, so it's okay
17455function commitUnmount(current$$1) {
17456 onCommitUnmount(current$$1);
17457
17458 switch (current$$1.tag) {
17459 case FunctionComponent:
17460 case ForwardRef:
17461 case MemoComponent:
17462 case SimpleMemoComponent:
17463 {
17464 var updateQueue = current$$1.updateQueue;
17465 if (updateQueue !== null) {
17466 var lastEffect = updateQueue.lastEffect;
17467 if (lastEffect !== null) {
17468 var firstEffect = lastEffect.next;
17469 var effect = firstEffect;
17470 do {
17471 var destroy = effect.destroy;
17472 if (destroy !== undefined) {
17473 safelyCallDestroy(current$$1, destroy);
17474 }
17475 effect = effect.next;
17476 } while (effect !== firstEffect);
17477 }
17478 }
17479 break;
17480 }
17481 case ClassComponent:
17482 {
17483 safelyDetachRef(current$$1);
17484 var instance = current$$1.stateNode;
17485 if (typeof instance.componentWillUnmount === 'function') {
17486 safelyCallComponentWillUnmount(current$$1, instance);
17487 }
17488 return;
17489 }
17490 case HostComponent:
17491 {
17492 safelyDetachRef(current$$1);
17493 return;
17494 }
17495 case HostPortal:
17496 {
17497 // TODO: this is recursive.
17498 // We are also not using this parent because
17499 // the portal will get pushed immediately.
17500 if (supportsMutation) {
17501 unmountHostComponents(current$$1);
17502 } else if (supportsPersistence) {
17503 emptyPortalContainer(current$$1);
17504 }
17505 return;
17506 }
17507 }
17508}
17509
17510function commitNestedUnmounts(root) {
17511 // While we're inside a removed host node we don't want to call
17512 // removeChild on the inner nodes because they're removed by the top
17513 // call anyway. We also want to call componentWillUnmount on all
17514 // composites before this host node is removed from the tree. Therefore
17515 var node = root;
17516 while (true) {
17517 commitUnmount(node);
17518 // Visit children because they may contain more composite or host nodes.
17519 // Skip portals because commitUnmount() currently visits them recursively.
17520 if (node.child !== null && (
17521 // If we use mutation we drill down into portals using commitUnmount above.
17522 // If we don't use mutation we drill down into portals here instead.
17523 !supportsMutation || node.tag !== HostPortal)) {
17524 node.child.return = node;
17525 node = node.child;
17526 continue;
17527 }
17528 if (node === root) {
17529 return;
17530 }
17531 while (node.sibling === null) {
17532 if (node.return === null || node.return === root) {
17533 return;
17534 }
17535 node = node.return;
17536 }
17537 node.sibling.return = node.return;
17538 node = node.sibling;
17539 }
17540}
17541
17542function detachFiber(current$$1) {
17543 // Cut off the return pointers to disconnect it from the tree. Ideally, we
17544 // should clear the child pointer of the parent alternate to let this
17545 // get GC:ed but we don't know which for sure which parent is the current
17546 // one so we'll settle for GC:ing the subtree of this child. This child
17547 // itself will be GC:ed when the parent updates the next time.
17548 current$$1.return = null;
17549 current$$1.child = null;
17550 current$$1.memoizedState = null;
17551 current$$1.updateQueue = null;
17552 var alternate = current$$1.alternate;
17553 if (alternate !== null) {
17554 alternate.return = null;
17555 alternate.child = null;
17556 alternate.memoizedState = null;
17557 alternate.updateQueue = null;
17558 }
17559}
17560
17561function emptyPortalContainer(current$$1) {
17562 if (!supportsPersistence) {
17563 return;
17564 }
17565
17566 var portal = current$$1.stateNode;
17567 var containerInfo = portal.containerInfo;
17568
17569 var emptyChildSet = createContainerChildSet(containerInfo);
17570 replaceContainerChildren(containerInfo, emptyChildSet);
17571}
17572
17573function commitContainer(finishedWork) {
17574 if (!supportsPersistence) {
17575 return;
17576 }
17577
17578 switch (finishedWork.tag) {
17579 case ClassComponent:
17580 {
17581 return;
17582 }
17583 case HostComponent:
17584 {
17585 return;
17586 }
17587 case HostText:
17588 {
17589 return;
17590 }
17591 case HostRoot:
17592 case HostPortal:
17593 {
17594 var portalOrRoot = finishedWork.stateNode;
17595 var containerInfo = portalOrRoot.containerInfo,
17596 _pendingChildren = portalOrRoot.pendingChildren;
17597
17598 replaceContainerChildren(containerInfo, _pendingChildren);
17599 return;
17600 }
17601 default:
17602 {
17603 invariant(false, 'This unit of work tag should not have side-effects. This error is likely caused by a bug in React. Please file an issue.');
17604 }
17605 }
17606}
17607
17608function getHostParentFiber(fiber) {
17609 var parent = fiber.return;
17610 while (parent !== null) {
17611 if (isHostParent(parent)) {
17612 return parent;
17613 }
17614 parent = parent.return;
17615 }
17616 invariant(false, 'Expected to find a host parent. This error is likely caused by a bug in React. Please file an issue.');
17617}
17618
17619function isHostParent(fiber) {
17620 return fiber.tag === HostComponent || fiber.tag === HostRoot || fiber.tag === HostPortal;
17621}
17622
17623function getHostSibling(fiber) {
17624 // We're going to search forward into the tree until we find a sibling host
17625 // node. Unfortunately, if multiple insertions are done in a row we have to
17626 // search past them. This leads to exponential search for the next sibling.
17627 var node = fiber;
17628 siblings: while (true) {
17629 // If we didn't find anything, let's try the next sibling.
17630 while (node.sibling === null) {
17631 if (node.return === null || isHostParent(node.return)) {
17632 // If we pop out of the root or hit the parent the fiber we are the
17633 // last sibling.
17634 return null;
17635 }
17636 node = node.return;
17637 }
17638 node.sibling.return = node.return;
17639 node = node.sibling;
17640 while (node.tag !== HostComponent && node.tag !== HostText && node.tag !== DehydratedSuspenseComponent) {
17641 // If it is not host node and, we might have a host node inside it.
17642 // Try to search down until we find one.
17643 if (node.effectTag & Placement) {
17644 // If we don't have a child, try the siblings instead.
17645 continue siblings;
17646 }
17647 // If we don't have a child, try the siblings instead.
17648 // We also skip portals because they are not part of this host tree.
17649 if (node.child === null || node.tag === HostPortal) {
17650 continue siblings;
17651 } else {
17652 node.child.return = node;
17653 node = node.child;
17654 }
17655 }
17656 // Check if this host node is stable or about to be placed.
17657 if (!(node.effectTag & Placement)) {
17658 // Found it!
17659 return node.stateNode;
17660 }
17661 }
17662}
17663
17664function commitPlacement(finishedWork) {
17665 if (!supportsMutation) {
17666 return;
17667 }
17668
17669 // Recursively insert all host nodes into the parent.
17670 var parentFiber = getHostParentFiber(finishedWork);
17671
17672 // Note: these two variables *must* always be updated together.
17673 var parent = void 0;
17674 var isContainer = void 0;
17675
17676 switch (parentFiber.tag) {
17677 case HostComponent:
17678 parent = parentFiber.stateNode;
17679 isContainer = false;
17680 break;
17681 case HostRoot:
17682 parent = parentFiber.stateNode.containerInfo;
17683 isContainer = true;
17684 break;
17685 case HostPortal:
17686 parent = parentFiber.stateNode.containerInfo;
17687 isContainer = true;
17688 break;
17689 default:
17690 invariant(false, 'Invalid host parent fiber. This error is likely caused by a bug in React. Please file an issue.');
17691 }
17692 if (parentFiber.effectTag & ContentReset) {
17693 // Reset the text content of the parent before doing any insertions
17694 resetTextContent(parent);
17695 // Clear ContentReset from the effect tag
17696 parentFiber.effectTag &= ~ContentReset;
17697 }
17698
17699 var before = getHostSibling(finishedWork);
17700 // We only have the top Fiber that was inserted but we need to recurse down its
17701 // children to find all the terminal nodes.
17702 var node = finishedWork;
17703 while (true) {
17704 if (node.tag === HostComponent || node.tag === HostText) {
17705 if (before) {
17706 if (isContainer) {
17707 insertInContainerBefore(parent, node.stateNode, before);
17708 } else {
17709 insertBefore(parent, node.stateNode, before);
17710 }
17711 } else {
17712 if (isContainer) {
17713 appendChildToContainer(parent, node.stateNode);
17714 } else {
17715 appendChild(parent, node.stateNode);
17716 }
17717 }
17718 } else if (node.tag === HostPortal) {
17719 // If the insertion itself is a portal, then we don't want to traverse
17720 // down its children. Instead, we'll get insertions from each child in
17721 // the portal directly.
17722 } else if (node.child !== null) {
17723 node.child.return = node;
17724 node = node.child;
17725 continue;
17726 }
17727 if (node === finishedWork) {
17728 return;
17729 }
17730 while (node.sibling === null) {
17731 if (node.return === null || node.return === finishedWork) {
17732 return;
17733 }
17734 node = node.return;
17735 }
17736 node.sibling.return = node.return;
17737 node = node.sibling;
17738 }
17739}
17740
17741function unmountHostComponents(current$$1) {
17742 // We only have the top Fiber that was deleted but we need to recurse down its
17743 var node = current$$1;
17744
17745 // Each iteration, currentParent is populated with node's host parent if not
17746 // currentParentIsValid.
17747 var currentParentIsValid = false;
17748
17749 // Note: these two variables *must* always be updated together.
17750 var currentParent = void 0;
17751 var currentParentIsContainer = void 0;
17752
17753 while (true) {
17754 if (!currentParentIsValid) {
17755 var parent = node.return;
17756 findParent: while (true) {
17757 !(parent !== null) ? invariant(false, 'Expected to find a host parent. This error is likely caused by a bug in React. Please file an issue.') : void 0;
17758 switch (parent.tag) {
17759 case HostComponent:
17760 currentParent = parent.stateNode;
17761 currentParentIsContainer = false;
17762 break findParent;
17763 case HostRoot:
17764 currentParent = parent.stateNode.containerInfo;
17765 currentParentIsContainer = true;
17766 break findParent;
17767 case HostPortal:
17768 currentParent = parent.stateNode.containerInfo;
17769 currentParentIsContainer = true;
17770 break findParent;
17771 }
17772 parent = parent.return;
17773 }
17774 currentParentIsValid = true;
17775 }
17776
17777 if (node.tag === HostComponent || node.tag === HostText) {
17778 commitNestedUnmounts(node);
17779 // After all the children have unmounted, it is now safe to remove the
17780 // node from the tree.
17781 if (currentParentIsContainer) {
17782 removeChildFromContainer(currentParent, node.stateNode);
17783 } else {
17784 removeChild(currentParent, node.stateNode);
17785 }
17786 // Don't visit children because we already visited them.
17787 } else if (enableSuspenseServerRenderer && node.tag === DehydratedSuspenseComponent) {
17788 // Delete the dehydrated suspense boundary and all of its content.
17789 if (currentParentIsContainer) {
17790 clearSuspenseBoundaryFromContainer(currentParent, node.stateNode);
17791 } else {
17792 clearSuspenseBoundary(currentParent, node.stateNode);
17793 }
17794 } else if (node.tag === HostPortal) {
17795 if (node.child !== null) {
17796 // When we go into a portal, it becomes the parent to remove from.
17797 // We will reassign it back when we pop the portal on the way up.
17798 currentParent = node.stateNode.containerInfo;
17799 currentParentIsContainer = true;
17800 // Visit children because portals might contain host components.
17801 node.child.return = node;
17802 node = node.child;
17803 continue;
17804 }
17805 } else {
17806 commitUnmount(node);
17807 // Visit children because we may find more host components below.
17808 if (node.child !== null) {
17809 node.child.return = node;
17810 node = node.child;
17811 continue;
17812 }
17813 }
17814 if (node === current$$1) {
17815 return;
17816 }
17817 while (node.sibling === null) {
17818 if (node.return === null || node.return === current$$1) {
17819 return;
17820 }
17821 node = node.return;
17822 if (node.tag === HostPortal) {
17823 // When we go out of the portal, we need to restore the parent.
17824 // Since we don't keep a stack of them, we will search for it.
17825 currentParentIsValid = false;
17826 }
17827 }
17828 node.sibling.return = node.return;
17829 node = node.sibling;
17830 }
17831}
17832
17833function commitDeletion(current$$1) {
17834 if (supportsMutation) {
17835 // Recursively delete all host nodes from the parent.
17836 // Detach refs and call componentWillUnmount() on the whole subtree.
17837 unmountHostComponents(current$$1);
17838 } else {
17839 // Detach refs and call componentWillUnmount() on the whole subtree.
17840 commitNestedUnmounts(current$$1);
17841 }
17842 detachFiber(current$$1);
17843}
17844
17845function commitWork(current$$1, finishedWork) {
17846 if (!supportsMutation) {
17847 switch (finishedWork.tag) {
17848 case FunctionComponent:
17849 case ForwardRef:
17850 case MemoComponent:
17851 case SimpleMemoComponent:
17852 {
17853 // Note: We currently never use MountMutation, but useLayout uses
17854 // UnmountMutation.
17855 commitHookEffectList(UnmountMutation, MountMutation, finishedWork);
17856 return;
17857 }
17858 }
17859
17860 commitContainer(finishedWork);
17861 return;
17862 }
17863
17864 switch (finishedWork.tag) {
17865 case FunctionComponent:
17866 case ForwardRef:
17867 case MemoComponent:
17868 case SimpleMemoComponent:
17869 {
17870 // Note: We currently never use MountMutation, but useLayout uses
17871 // UnmountMutation.
17872 commitHookEffectList(UnmountMutation, MountMutation, finishedWork);
17873 return;
17874 }
17875 case ClassComponent:
17876 {
17877 return;
17878 }
17879 case HostComponent:
17880 {
17881 var instance = finishedWork.stateNode;
17882 if (instance != null) {
17883 // Commit the work prepared earlier.
17884 var newProps = finishedWork.memoizedProps;
17885 // For hydration we reuse the update path but we treat the oldProps
17886 // as the newProps. The updatePayload will contain the real change in
17887 // this case.
17888 var oldProps = current$$1 !== null ? current$$1.memoizedProps : newProps;
17889 var type = finishedWork.type;
17890 // TODO: Type the updateQueue to be specific to host components.
17891 var updatePayload = finishedWork.updateQueue;
17892 finishedWork.updateQueue = null;
17893 if (updatePayload !== null) {
17894 commitUpdate(instance, updatePayload, type, oldProps, newProps, finishedWork);
17895 }
17896 }
17897 return;
17898 }
17899 case HostText:
17900 {
17901 !(finishedWork.stateNode !== null) ? invariant(false, 'This should have a text node initialized. This error is likely caused by a bug in React. Please file an issue.') : void 0;
17902 var textInstance = finishedWork.stateNode;
17903 var newText = finishedWork.memoizedProps;
17904 // For hydration we reuse the update path but we treat the oldProps
17905 // as the newProps. The updatePayload will contain the real change in
17906 // this case.
17907 var oldText = current$$1 !== null ? current$$1.memoizedProps : newText;
17908 commitTextUpdate(textInstance, oldText, newText);
17909 return;
17910 }
17911 case HostRoot:
17912 {
17913 return;
17914 }
17915 case Profiler:
17916 {
17917 return;
17918 }
17919 case SuspenseComponent:
17920 {
17921 var newState = finishedWork.memoizedState;
17922
17923 var newDidTimeout = void 0;
17924 var primaryChildParent = finishedWork;
17925 if (newState === null) {
17926 newDidTimeout = false;
17927 } else {
17928 newDidTimeout = true;
17929 primaryChildParent = finishedWork.child;
17930 if (newState.timedOutAt === NoWork) {
17931 // If the children had not already timed out, record the time.
17932 // This is used to compute the elapsed time during subsequent
17933 // attempts to render the children.
17934 newState.timedOutAt = requestCurrentTime();
17935 }
17936 }
17937
17938 if (primaryChildParent !== null) {
17939 hideOrUnhideAllChildren(primaryChildParent, newDidTimeout);
17940 }
17941
17942 // If this boundary just timed out, then it will have a set of thenables.
17943 // For each thenable, attach a listener so that when it resolves, React
17944 // attempts to re-render the boundary in the primary (pre-timeout) state.
17945 var thenables = finishedWork.updateQueue;
17946 if (thenables !== null) {
17947 finishedWork.updateQueue = null;
17948 var retryCache = finishedWork.stateNode;
17949 if (retryCache === null) {
17950 retryCache = finishedWork.stateNode = new PossiblyWeakSet$1();
17951 }
17952 thenables.forEach(function (thenable) {
17953 // Memoize using the boundary fiber to prevent redundant listeners.
17954 var retry = retryTimedOutBoundary.bind(null, finishedWork, thenable);
17955 if (enableSchedulerTracing) {
17956 retry = unstable_wrap(retry);
17957 }
17958 if (!retryCache.has(thenable)) {
17959 retryCache.add(thenable);
17960 thenable.then(retry, retry);
17961 }
17962 });
17963 }
17964
17965 return;
17966 }
17967 case IncompleteClassComponent:
17968 {
17969 return;
17970 }
17971 default:
17972 {
17973 invariant(false, 'This unit of work tag should not have side-effects. This error is likely caused by a bug in React. Please file an issue.');
17974 }
17975 }
17976}
17977
17978function commitResetTextContent(current$$1) {
17979 if (!supportsMutation) {
17980 return;
17981 }
17982 resetTextContent(current$$1.stateNode);
17983}
17984
17985var PossiblyWeakSet = typeof WeakSet === 'function' ? WeakSet : Set;
17986var PossiblyWeakMap = typeof WeakMap === 'function' ? WeakMap : Map;
17987
17988function createRootErrorUpdate(fiber, errorInfo, expirationTime) {
17989 var update = createUpdate(expirationTime);
17990 // Unmount the root by rendering null.
17991 update.tag = CaptureUpdate;
17992 // Caution: React DevTools currently depends on this property
17993 // being called "element".
17994 update.payload = { element: null };
17995 var error = errorInfo.value;
17996 update.callback = function () {
17997 onUncaughtError(error);
17998 logError(fiber, errorInfo);
17999 };
18000 return update;
18001}
18002
18003function createClassErrorUpdate(fiber, errorInfo, expirationTime) {
18004 var update = createUpdate(expirationTime);
18005 update.tag = CaptureUpdate;
18006 var getDerivedStateFromError = fiber.type.getDerivedStateFromError;
18007 if (typeof getDerivedStateFromError === 'function') {
18008 var error = errorInfo.value;
18009 update.payload = function () {
18010 return getDerivedStateFromError(error);
18011 };
18012 }
18013
18014 var inst = fiber.stateNode;
18015 if (inst !== null && typeof inst.componentDidCatch === 'function') {
18016 update.callback = function callback() {
18017 if (typeof getDerivedStateFromError !== 'function') {
18018 // To preserve the preexisting retry behavior of error boundaries,
18019 // we keep track of which ones already failed during this batch.
18020 // This gets reset before we yield back to the browser.
18021 // TODO: Warn in strict mode if getDerivedStateFromError is
18022 // not defined.
18023 markLegacyErrorBoundaryAsFailed(this);
18024 }
18025 var error = errorInfo.value;
18026 var stack = errorInfo.stack;
18027 logError(fiber, errorInfo);
18028 this.componentDidCatch(error, {
18029 componentStack: stack !== null ? stack : ''
18030 });
18031 {
18032 if (typeof getDerivedStateFromError !== 'function') {
18033 // If componentDidCatch is the only error boundary method defined,
18034 // then it needs to call setState to recover from errors.
18035 // If no state update is scheduled then the boundary will swallow the error.
18036 !(fiber.expirationTime === Sync) ? warningWithoutStack$1(false, '%s: Error boundaries should implement getDerivedStateFromError(). ' + 'In that method, return a state update to display an error message or fallback UI.', getComponentName(fiber.type) || 'Unknown') : void 0;
18037 }
18038 }
18039 };
18040 }
18041 return update;
18042}
18043
18044function attachPingListener(root, renderExpirationTime, thenable) {
18045 // Attach a listener to the promise to "ping" the root and retry. But
18046 // only if one does not already exist for the current render expiration
18047 // time (which acts like a "thread ID" here).
18048 var pingCache = root.pingCache;
18049 var threadIDs = void 0;
18050 if (pingCache === null) {
18051 pingCache = root.pingCache = new PossiblyWeakMap();
18052 threadIDs = new Set();
18053 pingCache.set(thenable, threadIDs);
18054 } else {
18055 threadIDs = pingCache.get(thenable);
18056 if (threadIDs === undefined) {
18057 threadIDs = new Set();
18058 pingCache.set(thenable, threadIDs);
18059 }
18060 }
18061 if (!threadIDs.has(renderExpirationTime)) {
18062 // Memoize using the thread ID to prevent redundant listeners.
18063 threadIDs.add(renderExpirationTime);
18064 var ping = pingSuspendedRoot.bind(null, root, thenable, renderExpirationTime);
18065 if (enableSchedulerTracing) {
18066 ping = unstable_wrap(ping);
18067 }
18068 thenable.then(ping, ping);
18069 }
18070}
18071
18072function throwException(root, returnFiber, sourceFiber, value, renderExpirationTime) {
18073 // The source fiber did not complete.
18074 sourceFiber.effectTag |= Incomplete;
18075 // Its effect list is no longer valid.
18076 sourceFiber.firstEffect = sourceFiber.lastEffect = null;
18077
18078 if (value !== null && typeof value === 'object' && typeof value.then === 'function') {
18079 // This is a thenable.
18080 var thenable = value;
18081
18082 // Find the earliest timeout threshold of all the placeholders in the
18083 // ancestor path. We could avoid this traversal by storing the thresholds on
18084 // the stack, but we choose not to because we only hit this path if we're
18085 // IO-bound (i.e. if something suspends). Whereas the stack is used even in
18086 // the non-IO- bound case.
18087 var _workInProgress = returnFiber;
18088 var earliestTimeoutMs = -1;
18089 var startTimeMs = -1;
18090 do {
18091 if (_workInProgress.tag === SuspenseComponent) {
18092 var current$$1 = _workInProgress.alternate;
18093 if (current$$1 !== null) {
18094 var currentState = current$$1.memoizedState;
18095 if (currentState !== null) {
18096 // Reached a boundary that already timed out. Do not search
18097 // any further.
18098 var timedOutAt = currentState.timedOutAt;
18099 startTimeMs = expirationTimeToMs(timedOutAt);
18100 // Do not search any further.
18101 break;
18102 }
18103 }
18104 var timeoutPropMs = _workInProgress.pendingProps.maxDuration;
18105 if (typeof timeoutPropMs === 'number') {
18106 if (timeoutPropMs <= 0) {
18107 earliestTimeoutMs = 0;
18108 } else if (earliestTimeoutMs === -1 || timeoutPropMs < earliestTimeoutMs) {
18109 earliestTimeoutMs = timeoutPropMs;
18110 }
18111 }
18112 }
18113 // If there is a DehydratedSuspenseComponent we don't have to do anything because
18114 // if something suspends inside it, we will simply leave that as dehydrated. It
18115 // will never timeout.
18116 _workInProgress = _workInProgress.return;
18117 } while (_workInProgress !== null);
18118
18119 // Schedule the nearest Suspense to re-render the timed out view.
18120 _workInProgress = returnFiber;
18121 do {
18122 if (_workInProgress.tag === SuspenseComponent && shouldCaptureSuspense(_workInProgress)) {
18123 // Found the nearest boundary.
18124
18125 // Stash the promise on the boundary fiber. If the boundary times out, we'll
18126 var thenables = _workInProgress.updateQueue;
18127 if (thenables === null) {
18128 var updateQueue = new Set();
18129 updateQueue.add(thenable);
18130 _workInProgress.updateQueue = updateQueue;
18131 } else {
18132 thenables.add(thenable);
18133 }
18134
18135 // If the boundary is outside of concurrent mode, we should *not*
18136 // suspend the commit. Pretend as if the suspended component rendered
18137 // null and keep rendering. In the commit phase, we'll schedule a
18138 // subsequent synchronous update to re-render the Suspense.
18139 //
18140 // Note: It doesn't matter whether the component that suspended was
18141 // inside a concurrent mode tree. If the Suspense is outside of it, we
18142 // should *not* suspend the commit.
18143 if ((_workInProgress.mode & ConcurrentMode) === NoEffect) {
18144 _workInProgress.effectTag |= DidCapture;
18145
18146 // We're going to commit this fiber even though it didn't complete.
18147 // But we shouldn't call any lifecycle methods or callbacks. Remove
18148 // all lifecycle effect tags.
18149 sourceFiber.effectTag &= ~(LifecycleEffectMask | Incomplete);
18150
18151 if (sourceFiber.tag === ClassComponent) {
18152 var currentSourceFiber = sourceFiber.alternate;
18153 if (currentSourceFiber === null) {
18154 // This is a new mount. Change the tag so it's not mistaken for a
18155 // completed class component. For example, we should not call
18156 // componentWillUnmount if it is deleted.
18157 sourceFiber.tag = IncompleteClassComponent;
18158 } else {
18159 // When we try rendering again, we should not reuse the current fiber,
18160 // since it's known to be in an inconsistent state. Use a force updte to
18161 // prevent a bail out.
18162 var update = createUpdate(Sync);
18163 update.tag = ForceUpdate;
18164 enqueueUpdate(sourceFiber, update);
18165 }
18166 }
18167
18168 // The source fiber did not complete. Mark it with Sync priority to
18169 // indicate that it still has pending work.
18170 sourceFiber.expirationTime = Sync;
18171
18172 // Exit without suspending.
18173 return;
18174 }
18175
18176 // Confirmed that the boundary is in a concurrent mode tree. Continue
18177 // with the normal suspend path.
18178
18179 attachPingListener(root, renderExpirationTime, thenable);
18180
18181 var absoluteTimeoutMs = void 0;
18182 if (earliestTimeoutMs === -1) {
18183 // If no explicit threshold is given, default to an arbitrarily large
18184 // value. The actual size doesn't matter because the threshold for the
18185 // whole tree will be clamped to the expiration time.
18186 absoluteTimeoutMs = maxSigned31BitInt;
18187 } else {
18188 if (startTimeMs === -1) {
18189 // This suspend happened outside of any already timed-out
18190 // placeholders. We don't know exactly when the update was
18191 // scheduled, but we can infer an approximate start time from the
18192 // expiration time. First, find the earliest uncommitted expiration
18193 // time in the tree, including work that is suspended. Then subtract
18194 // the offset used to compute an async update's expiration time.
18195 // This will cause high priority (interactive) work to expire
18196 // earlier than necessary, but we can account for this by adjusting
18197 // for the Just Noticeable Difference.
18198 var earliestExpirationTime = findEarliestOutstandingPriorityLevel(root, renderExpirationTime);
18199 var earliestExpirationTimeMs = expirationTimeToMs(earliestExpirationTime);
18200 startTimeMs = earliestExpirationTimeMs - LOW_PRIORITY_EXPIRATION;
18201 }
18202 absoluteTimeoutMs = startTimeMs + earliestTimeoutMs;
18203 }
18204
18205 // Mark the earliest timeout in the suspended fiber's ancestor path.
18206 // After completing the root, we'll take the largest of all the
18207 // suspended fiber's timeouts and use it to compute a timeout for the
18208 // whole tree.
18209 renderDidSuspend(root, absoluteTimeoutMs, renderExpirationTime);
18210
18211 _workInProgress.effectTag |= ShouldCapture;
18212 _workInProgress.expirationTime = renderExpirationTime;
18213 return;
18214 } else if (enableSuspenseServerRenderer && _workInProgress.tag === DehydratedSuspenseComponent) {
18215 attachPingListener(root, renderExpirationTime, thenable);
18216
18217 // Since we already have a current fiber, we can eagerly add a retry listener.
18218 var retryCache = _workInProgress.memoizedState;
18219 if (retryCache === null) {
18220 retryCache = _workInProgress.memoizedState = new PossiblyWeakSet();
18221 var _current = _workInProgress.alternate;
18222 !_current ? invariant(false, 'A dehydrated suspense boundary must commit before trying to render. This is probably a bug in React.') : void 0;
18223 _current.memoizedState = retryCache;
18224 }
18225 // Memoize using the boundary fiber to prevent redundant listeners.
18226 if (!retryCache.has(thenable)) {
18227 retryCache.add(thenable);
18228 var retry = retryTimedOutBoundary.bind(null, _workInProgress, thenable);
18229 if (enableSchedulerTracing) {
18230 retry = unstable_wrap(retry);
18231 }
18232 thenable.then(retry, retry);
18233 }
18234 _workInProgress.effectTag |= ShouldCapture;
18235 _workInProgress.expirationTime = renderExpirationTime;
18236 return;
18237 }
18238 // This boundary already captured during this render. Continue to the next
18239 // boundary.
18240 _workInProgress = _workInProgress.return;
18241 } while (_workInProgress !== null);
18242 // No boundary was found. Fallthrough to error mode.
18243 // TODO: Use invariant so the message is stripped in prod?
18244 value = new Error((getComponentName(sourceFiber.type) || 'A React component') + ' suspended while rendering, but no fallback UI was specified.\n' + '\n' + 'Add a <Suspense fallback=...> component higher in the tree to ' + 'provide a loading indicator or placeholder to display.' + getStackByFiberInDevAndProd(sourceFiber));
18245 }
18246
18247 // We didn't find a boundary that could handle this type of exception. Start
18248 // over and traverse parent path again, this time treating the exception
18249 // as an error.
18250 renderDidError();
18251 value = createCapturedValue(value, sourceFiber);
18252 var workInProgress = returnFiber;
18253 do {
18254 switch (workInProgress.tag) {
18255 case HostRoot:
18256 {
18257 var _errorInfo = value;
18258 workInProgress.effectTag |= ShouldCapture;
18259 workInProgress.expirationTime = renderExpirationTime;
18260 var _update = createRootErrorUpdate(workInProgress, _errorInfo, renderExpirationTime);
18261 enqueueCapturedUpdate(workInProgress, _update);
18262 return;
18263 }
18264 case ClassComponent:
18265 // Capture and retry
18266 var errorInfo = value;
18267 var ctor = workInProgress.type;
18268 var instance = workInProgress.stateNode;
18269 if ((workInProgress.effectTag & DidCapture) === NoEffect && (typeof ctor.getDerivedStateFromError === 'function' || instance !== null && typeof instance.componentDidCatch === 'function' && !isAlreadyFailedLegacyErrorBoundary(instance))) {
18270 workInProgress.effectTag |= ShouldCapture;
18271 workInProgress.expirationTime = renderExpirationTime;
18272 // Schedule the error boundary to re-render using updated state
18273 var _update2 = createClassErrorUpdate(workInProgress, errorInfo, renderExpirationTime);
18274 enqueueCapturedUpdate(workInProgress, _update2);
18275 return;
18276 }
18277 break;
18278 default:
18279 break;
18280 }
18281 workInProgress = workInProgress.return;
18282 } while (workInProgress !== null);
18283}
18284
18285function unwindWork(workInProgress, renderExpirationTime) {
18286 switch (workInProgress.tag) {
18287 case ClassComponent:
18288 {
18289 var Component = workInProgress.type;
18290 if (isContextProvider(Component)) {
18291 popContext(workInProgress);
18292 }
18293 var effectTag = workInProgress.effectTag;
18294 if (effectTag & ShouldCapture) {
18295 workInProgress.effectTag = effectTag & ~ShouldCapture | DidCapture;
18296 return workInProgress;
18297 }
18298 return null;
18299 }
18300 case HostRoot:
18301 {
18302 popHostContainer(workInProgress);
18303 popTopLevelContextObject(workInProgress);
18304 var _effectTag = workInProgress.effectTag;
18305 !((_effectTag & DidCapture) === NoEffect) ? invariant(false, 'The root failed to unmount after an error. This is likely a bug in React. Please file an issue.') : void 0;
18306 workInProgress.effectTag = _effectTag & ~ShouldCapture | DidCapture;
18307 return workInProgress;
18308 }
18309 case HostComponent:
18310 {
18311 // TODO: popHydrationState
18312 popHostContext(workInProgress);
18313 return null;
18314 }
18315 case SuspenseComponent:
18316 {
18317 var _effectTag2 = workInProgress.effectTag;
18318 if (_effectTag2 & ShouldCapture) {
18319 workInProgress.effectTag = _effectTag2 & ~ShouldCapture | DidCapture;
18320 // Captured a suspense effect. Re-render the boundary.
18321 return workInProgress;
18322 }
18323 return null;
18324 }
18325 case DehydratedSuspenseComponent:
18326 {
18327 if (enableSuspenseServerRenderer) {
18328 // TODO: popHydrationState
18329 var _effectTag3 = workInProgress.effectTag;
18330 if (_effectTag3 & ShouldCapture) {
18331 workInProgress.effectTag = _effectTag3 & ~ShouldCapture | DidCapture;
18332 // Captured a suspense effect. Re-render the boundary.
18333 return workInProgress;
18334 }
18335 }
18336 return null;
18337 }
18338 case HostPortal:
18339 popHostContainer(workInProgress);
18340 return null;
18341 case ContextProvider:
18342 popProvider(workInProgress);
18343 return null;
18344 default:
18345 return null;
18346 }
18347}
18348
18349function unwindInterruptedWork(interruptedWork) {
18350 switch (interruptedWork.tag) {
18351 case ClassComponent:
18352 {
18353 var childContextTypes = interruptedWork.type.childContextTypes;
18354 if (childContextTypes !== null && childContextTypes !== undefined) {
18355 popContext(interruptedWork);
18356 }
18357 break;
18358 }
18359 case HostRoot:
18360 {
18361 popHostContainer(interruptedWork);
18362 popTopLevelContextObject(interruptedWork);
18363 break;
18364 }
18365 case HostComponent:
18366 {
18367 popHostContext(interruptedWork);
18368 break;
18369 }
18370 case HostPortal:
18371 popHostContainer(interruptedWork);
18372 break;
18373 case ContextProvider:
18374 popProvider(interruptedWork);
18375 break;
18376 default:
18377 break;
18378 }
18379}
18380
18381var ReactCurrentDispatcher = ReactSharedInternals.ReactCurrentDispatcher;
18382var ReactCurrentOwner$2 = ReactSharedInternals.ReactCurrentOwner;
18383
18384
18385var didWarnAboutStateTransition = void 0;
18386var didWarnSetStateChildContext = void 0;
18387var warnAboutUpdateOnUnmounted = void 0;
18388var warnAboutInvalidUpdates = void 0;
18389
18390if (enableSchedulerTracing) {
18391 // Provide explicit error message when production+profiling bundle of e.g. react-dom
18392 // is used with production (non-profiling) bundle of scheduler/tracing
18393 !(__interactionsRef != null && __interactionsRef.current != null) ? invariant(false, 'It is not supported to run the profiling version of a renderer (for example, `react-dom/profiling`) without also replacing the `scheduler/tracing` module with `scheduler/tracing-profiling`. Your bundler might have a setting for aliasing both modules. Learn more at http://fb.me/react-profiling') : void 0;
18394}
18395
18396{
18397 didWarnAboutStateTransition = false;
18398 didWarnSetStateChildContext = false;
18399 var didWarnStateUpdateForUnmountedComponent = {};
18400
18401 warnAboutUpdateOnUnmounted = function (fiber, isClass) {
18402 // We show the whole stack but dedupe on the top component's name because
18403 // the problematic code almost always lies inside that component.
18404 var componentName = getComponentName(fiber.type) || 'ReactComponent';
18405 if (didWarnStateUpdateForUnmountedComponent[componentName]) {
18406 return;
18407 }
18408 warningWithoutStack$1(false, "Can't perform a React state update on an unmounted component. This " + 'is a no-op, but it indicates a memory leak in your application. To ' + 'fix, cancel all subscriptions and asynchronous tasks in %s.%s', isClass ? 'the componentWillUnmount method' : 'a useEffect cleanup function', getStackByFiberInDevAndProd(fiber));
18409 didWarnStateUpdateForUnmountedComponent[componentName] = true;
18410 };
18411
18412 warnAboutInvalidUpdates = function (instance) {
18413 switch (phase) {
18414 case 'getChildContext':
18415 if (didWarnSetStateChildContext) {
18416 return;
18417 }
18418 warningWithoutStack$1(false, 'setState(...): Cannot call setState() inside getChildContext()');
18419 didWarnSetStateChildContext = true;
18420 break;
18421 case 'render':
18422 if (didWarnAboutStateTransition) {
18423 return;
18424 }
18425 warningWithoutStack$1(false, 'Cannot update during an existing state transition (such as within ' + '`render`). Render methods should be a pure function of props and state.');
18426 didWarnAboutStateTransition = true;
18427 break;
18428 }
18429 };
18430}
18431
18432// Used to ensure computeUniqueAsyncExpiration is monotonically decreasing.
18433var lastUniqueAsyncExpiration = Sync - 1;
18434
18435var isWorking = false;
18436
18437// The next work in progress fiber that we're currently working on.
18438var nextUnitOfWork = null;
18439var nextRoot = null;
18440// The time at which we're currently rendering work.
18441var nextRenderExpirationTime = NoWork;
18442var nextLatestAbsoluteTimeoutMs = -1;
18443var nextRenderDidError = false;
18444
18445// The next fiber with an effect that we're currently committing.
18446var nextEffect = null;
18447
18448var isCommitting$1 = false;
18449var rootWithPendingPassiveEffects = null;
18450var passiveEffectCallbackHandle = null;
18451var passiveEffectCallback = null;
18452
18453var legacyErrorBoundariesThatAlreadyFailed = null;
18454
18455// Used for performance tracking.
18456var interruptedBy = null;
18457
18458var stashedWorkInProgressProperties = void 0;
18459var replayUnitOfWork = void 0;
18460var mayReplayFailedUnitOfWork = void 0;
18461var isReplayingFailedUnitOfWork = void 0;
18462var originalReplayError = void 0;
18463var rethrowOriginalError = void 0;
18464if (true && replayFailedUnitOfWorkWithInvokeGuardedCallback) {
18465 stashedWorkInProgressProperties = null;
18466 mayReplayFailedUnitOfWork = true;
18467 isReplayingFailedUnitOfWork = false;
18468 originalReplayError = null;
18469 replayUnitOfWork = function (failedUnitOfWork, thrownValue, isYieldy) {
18470 if (thrownValue !== null && typeof thrownValue === 'object' && typeof thrownValue.then === 'function') {
18471 // Don't replay promises. Treat everything else like an error.
18472 // TODO: Need to figure out a different strategy if/when we add
18473 // support for catching other types.
18474 return;
18475 }
18476
18477 // Restore the original state of the work-in-progress
18478 if (stashedWorkInProgressProperties === null) {
18479 // This should never happen. Don't throw because this code is DEV-only.
18480 warningWithoutStack$1(false, 'Could not replay rendering after an error. This is likely a bug in React. ' + 'Please file an issue.');
18481 return;
18482 }
18483 assignFiberPropertiesInDEV(failedUnitOfWork, stashedWorkInProgressProperties);
18484
18485 switch (failedUnitOfWork.tag) {
18486 case HostRoot:
18487 popHostContainer(failedUnitOfWork);
18488 popTopLevelContextObject(failedUnitOfWork);
18489 break;
18490 case HostComponent:
18491 popHostContext(failedUnitOfWork);
18492 break;
18493 case ClassComponent:
18494 {
18495 var Component = failedUnitOfWork.type;
18496 if (isContextProvider(Component)) {
18497 popContext(failedUnitOfWork);
18498 }
18499 break;
18500 }
18501 case HostPortal:
18502 popHostContainer(failedUnitOfWork);
18503 break;
18504 case ContextProvider:
18505 popProvider(failedUnitOfWork);
18506 break;
18507 }
18508 // Replay the begin phase.
18509 isReplayingFailedUnitOfWork = true;
18510 originalReplayError = thrownValue;
18511 invokeGuardedCallback(null, workLoop, null, isYieldy);
18512 isReplayingFailedUnitOfWork = false;
18513 originalReplayError = null;
18514 if (hasCaughtError()) {
18515 var replayError = clearCaughtError();
18516 if (replayError != null && thrownValue != null) {
18517 try {
18518 // Reading the expando property is intentionally
18519 // inside `try` because it might be a getter or Proxy.
18520 if (replayError._suppressLogging) {
18521 // Also suppress logging for the original error.
18522 thrownValue._suppressLogging = true;
18523 }
18524 } catch (inner) {
18525 // Ignore.
18526 }
18527 }
18528 } else {
18529 // If the begin phase did not fail the second time, set this pointer
18530 // back to the original value.
18531 nextUnitOfWork = failedUnitOfWork;
18532 }
18533 };
18534 rethrowOriginalError = function () {
18535 throw originalReplayError;
18536 };
18537}
18538
18539function resetStack() {
18540 if (nextUnitOfWork !== null) {
18541 var interruptedWork = nextUnitOfWork.return;
18542 while (interruptedWork !== null) {
18543 unwindInterruptedWork(interruptedWork);
18544 interruptedWork = interruptedWork.return;
18545 }
18546 }
18547
18548 {
18549 ReactStrictModeWarnings.discardPendingWarnings();
18550 checkThatStackIsEmpty();
18551 }
18552
18553 nextRoot = null;
18554 nextRenderExpirationTime = NoWork;
18555 nextLatestAbsoluteTimeoutMs = -1;
18556 nextRenderDidError = false;
18557 nextUnitOfWork = null;
18558}
18559
18560function commitAllHostEffects() {
18561 while (nextEffect !== null) {
18562 {
18563 setCurrentFiber(nextEffect);
18564 }
18565 recordEffect();
18566
18567 var effectTag = nextEffect.effectTag;
18568
18569 if (effectTag & ContentReset) {
18570 commitResetTextContent(nextEffect);
18571 }
18572
18573 if (effectTag & Ref) {
18574 var current$$1 = nextEffect.alternate;
18575 if (current$$1 !== null) {
18576 commitDetachRef(current$$1);
18577 }
18578 }
18579
18580 // The following switch statement is only concerned about placement,
18581 // updates, and deletions. To avoid needing to add a case for every
18582 // possible bitmap value, we remove the secondary effects from the
18583 // effect tag and switch on that value.
18584 var primaryEffectTag = effectTag & (Placement | Update | Deletion);
18585 switch (primaryEffectTag) {
18586 case Placement:
18587 {
18588 commitPlacement(nextEffect);
18589 // Clear the "placement" from effect tag so that we know that this is inserted, before
18590 // any life-cycles like componentDidMount gets called.
18591 // TODO: findDOMNode doesn't rely on this any more but isMounted
18592 // does and isMounted is deprecated anyway so we should be able
18593 // to kill this.
18594 nextEffect.effectTag &= ~Placement;
18595 break;
18596 }
18597 case PlacementAndUpdate:
18598 {
18599 // Placement
18600 commitPlacement(nextEffect);
18601 // Clear the "placement" from effect tag so that we know that this is inserted, before
18602 // any life-cycles like componentDidMount gets called.
18603 nextEffect.effectTag &= ~Placement;
18604
18605 // Update
18606 var _current = nextEffect.alternate;
18607 commitWork(_current, nextEffect);
18608 break;
18609 }
18610 case Update:
18611 {
18612 var _current2 = nextEffect.alternate;
18613 commitWork(_current2, nextEffect);
18614 break;
18615 }
18616 case Deletion:
18617 {
18618 commitDeletion(nextEffect);
18619 break;
18620 }
18621 }
18622 nextEffect = nextEffect.nextEffect;
18623 }
18624
18625 {
18626 resetCurrentFiber();
18627 }
18628}
18629
18630function commitBeforeMutationLifecycles() {
18631 while (nextEffect !== null) {
18632 {
18633 setCurrentFiber(nextEffect);
18634 }
18635
18636 var effectTag = nextEffect.effectTag;
18637 if (effectTag & Snapshot) {
18638 recordEffect();
18639 var current$$1 = nextEffect.alternate;
18640 commitBeforeMutationLifeCycles(current$$1, nextEffect);
18641 }
18642
18643 nextEffect = nextEffect.nextEffect;
18644 }
18645
18646 {
18647 resetCurrentFiber();
18648 }
18649}
18650
18651function commitAllLifeCycles(finishedRoot, committedExpirationTime) {
18652 {
18653 ReactStrictModeWarnings.flushPendingUnsafeLifecycleWarnings();
18654 ReactStrictModeWarnings.flushLegacyContextWarning();
18655
18656 if (warnAboutDeprecatedLifecycles) {
18657 ReactStrictModeWarnings.flushPendingDeprecationWarnings();
18658 }
18659 }
18660 while (nextEffect !== null) {
18661 {
18662 setCurrentFiber(nextEffect);
18663 }
18664 var effectTag = nextEffect.effectTag;
18665
18666 if (effectTag & (Update | Callback)) {
18667 recordEffect();
18668 var current$$1 = nextEffect.alternate;
18669 commitLifeCycles(finishedRoot, current$$1, nextEffect, committedExpirationTime);
18670 }
18671
18672 if (effectTag & Ref) {
18673 recordEffect();
18674 commitAttachRef(nextEffect);
18675 }
18676
18677 if (effectTag & Passive) {
18678 rootWithPendingPassiveEffects = finishedRoot;
18679 }
18680
18681 nextEffect = nextEffect.nextEffect;
18682 }
18683 {
18684 resetCurrentFiber();
18685 }
18686}
18687
18688function commitPassiveEffects(root, firstEffect) {
18689 rootWithPendingPassiveEffects = null;
18690 passiveEffectCallbackHandle = null;
18691 passiveEffectCallback = null;
18692
18693 // Set this to true to prevent re-entrancy
18694 var previousIsRendering = isRendering;
18695 isRendering = true;
18696
18697 var effect = firstEffect;
18698 do {
18699 {
18700 setCurrentFiber(effect);
18701 }
18702
18703 if (effect.effectTag & Passive) {
18704 var didError = false;
18705 var error = void 0;
18706 {
18707 invokeGuardedCallback(null, commitPassiveHookEffects, null, effect);
18708 if (hasCaughtError()) {
18709 didError = true;
18710 error = clearCaughtError();
18711 }
18712 }
18713 if (didError) {
18714 captureCommitPhaseError(effect, error);
18715 }
18716 }
18717 effect = effect.nextEffect;
18718 } while (effect !== null);
18719 {
18720 resetCurrentFiber();
18721 }
18722
18723 isRendering = previousIsRendering;
18724
18725 // Check if work was scheduled by one of the effects
18726 var rootExpirationTime = root.expirationTime;
18727 if (rootExpirationTime !== NoWork) {
18728 requestWork(root, rootExpirationTime);
18729 }
18730 // Flush any sync work that was scheduled by effects
18731 if (!isBatchingUpdates && !isRendering) {
18732 performSyncWork();
18733 }
18734}
18735
18736function isAlreadyFailedLegacyErrorBoundary(instance) {
18737 return legacyErrorBoundariesThatAlreadyFailed !== null && legacyErrorBoundariesThatAlreadyFailed.has(instance);
18738}
18739
18740function markLegacyErrorBoundaryAsFailed(instance) {
18741 if (legacyErrorBoundariesThatAlreadyFailed === null) {
18742 legacyErrorBoundariesThatAlreadyFailed = new Set([instance]);
18743 } else {
18744 legacyErrorBoundariesThatAlreadyFailed.add(instance);
18745 }
18746}
18747
18748function flushPassiveEffects() {
18749 if (passiveEffectCallbackHandle !== null) {
18750 cancelPassiveEffects(passiveEffectCallbackHandle);
18751 }
18752 if (passiveEffectCallback !== null) {
18753 // We call the scheduled callback instead of commitPassiveEffects directly
18754 // to ensure tracing works correctly.
18755 passiveEffectCallback();
18756 }
18757}
18758
18759function commitRoot(root, finishedWork) {
18760 isWorking = true;
18761 isCommitting$1 = true;
18762 startCommitTimer();
18763
18764 !(root.current !== finishedWork) ? invariant(false, 'Cannot commit the same tree as before. This is probably a bug related to the return field. This error is likely caused by a bug in React. Please file an issue.') : void 0;
18765 var committedExpirationTime = root.pendingCommitExpirationTime;
18766 !(committedExpirationTime !== NoWork) ? invariant(false, 'Cannot commit an incomplete root. This error is likely caused by a bug in React. Please file an issue.') : void 0;
18767 root.pendingCommitExpirationTime = NoWork;
18768
18769 // Update the pending priority levels to account for the work that we are
18770 // about to commit. This needs to happen before calling the lifecycles, since
18771 // they may schedule additional updates.
18772 var updateExpirationTimeBeforeCommit = finishedWork.expirationTime;
18773 var childExpirationTimeBeforeCommit = finishedWork.childExpirationTime;
18774 var earliestRemainingTimeBeforeCommit = childExpirationTimeBeforeCommit > updateExpirationTimeBeforeCommit ? childExpirationTimeBeforeCommit : updateExpirationTimeBeforeCommit;
18775 markCommittedPriorityLevels(root, earliestRemainingTimeBeforeCommit);
18776
18777 var prevInteractions = null;
18778 if (enableSchedulerTracing) {
18779 // Restore any pending interactions at this point,
18780 // So that cascading work triggered during the render phase will be accounted for.
18781 prevInteractions = __interactionsRef.current;
18782 __interactionsRef.current = root.memoizedInteractions;
18783 }
18784
18785 // Reset this to null before calling lifecycles
18786 ReactCurrentOwner$2.current = null;
18787
18788 var firstEffect = void 0;
18789 if (finishedWork.effectTag > PerformedWork) {
18790 // A fiber's effect list consists only of its children, not itself. So if
18791 // the root has an effect, we need to add it to the end of the list. The
18792 // resulting list is the set that would belong to the root's parent, if
18793 // it had one; that is, all the effects in the tree including the root.
18794 if (finishedWork.lastEffect !== null) {
18795 finishedWork.lastEffect.nextEffect = finishedWork;
18796 firstEffect = finishedWork.firstEffect;
18797 } else {
18798 firstEffect = finishedWork;
18799 }
18800 } else {
18801 // There is no effect on the root.
18802 firstEffect = finishedWork.firstEffect;
18803 }
18804
18805 prepareForCommit(root.containerInfo);
18806
18807 // Invoke instances of getSnapshotBeforeUpdate before mutation.
18808 nextEffect = firstEffect;
18809 startCommitSnapshotEffectsTimer();
18810 while (nextEffect !== null) {
18811 var didError = false;
18812 var error = void 0;
18813 {
18814 invokeGuardedCallback(null, commitBeforeMutationLifecycles, null);
18815 if (hasCaughtError()) {
18816 didError = true;
18817 error = clearCaughtError();
18818 }
18819 }
18820 if (didError) {
18821 !(nextEffect !== null) ? invariant(false, 'Should have next effect. This error is likely caused by a bug in React. Please file an issue.') : void 0;
18822 captureCommitPhaseError(nextEffect, error);
18823 // Clean-up
18824 if (nextEffect !== null) {
18825 nextEffect = nextEffect.nextEffect;
18826 }
18827 }
18828 }
18829 stopCommitSnapshotEffectsTimer();
18830
18831 if (enableProfilerTimer) {
18832 // Mark the current commit time to be shared by all Profilers in this batch.
18833 // This enables them to be grouped later.
18834 recordCommitTime();
18835 }
18836
18837 // Commit all the side-effects within a tree. We'll do this in two passes.
18838 // The first pass performs all the host insertions, updates, deletions and
18839 // ref unmounts.
18840 nextEffect = firstEffect;
18841 startCommitHostEffectsTimer();
18842 while (nextEffect !== null) {
18843 var _didError = false;
18844 var _error = void 0;
18845 {
18846 invokeGuardedCallback(null, commitAllHostEffects, null);
18847 if (hasCaughtError()) {
18848 _didError = true;
18849 _error = clearCaughtError();
18850 }
18851 }
18852 if (_didError) {
18853 !(nextEffect !== null) ? invariant(false, 'Should have next effect. This error is likely caused by a bug in React. Please file an issue.') : void 0;
18854 captureCommitPhaseError(nextEffect, _error);
18855 // Clean-up
18856 if (nextEffect !== null) {
18857 nextEffect = nextEffect.nextEffect;
18858 }
18859 }
18860 }
18861 stopCommitHostEffectsTimer();
18862
18863 resetAfterCommit(root.containerInfo);
18864
18865 // The work-in-progress tree is now the current tree. This must come after
18866 // the first pass of the commit phase, so that the previous tree is still
18867 // current during componentWillUnmount, but before the second pass, so that
18868 // the finished work is current during componentDidMount/Update.
18869 root.current = finishedWork;
18870
18871 // In the second pass we'll perform all life-cycles and ref callbacks.
18872 // Life-cycles happen as a separate pass so that all placements, updates,
18873 // and deletions in the entire tree have already been invoked.
18874 // This pass also triggers any renderer-specific initial effects.
18875 nextEffect = firstEffect;
18876 startCommitLifeCyclesTimer();
18877 while (nextEffect !== null) {
18878 var _didError2 = false;
18879 var _error2 = void 0;
18880 {
18881 invokeGuardedCallback(null, commitAllLifeCycles, null, root, committedExpirationTime);
18882 if (hasCaughtError()) {
18883 _didError2 = true;
18884 _error2 = clearCaughtError();
18885 }
18886 }
18887 if (_didError2) {
18888 !(nextEffect !== null) ? invariant(false, 'Should have next effect. This error is likely caused by a bug in React. Please file an issue.') : void 0;
18889 captureCommitPhaseError(nextEffect, _error2);
18890 if (nextEffect !== null) {
18891 nextEffect = nextEffect.nextEffect;
18892 }
18893 }
18894 }
18895
18896 if (firstEffect !== null && rootWithPendingPassiveEffects !== null) {
18897 // This commit included a passive effect. These do not need to fire until
18898 // after the next paint. Schedule an callback to fire them in an async
18899 // event. To ensure serial execution, the callback will be flushed early if
18900 // we enter rootWithPendingPassiveEffects commit phase before then.
18901 var callback = commitPassiveEffects.bind(null, root, firstEffect);
18902 if (enableSchedulerTracing) {
18903 // TODO: Avoid this extra callback by mutating the tracing ref directly,
18904 // like we do at the beginning of commitRoot. I've opted not to do that
18905 // here because that code is still in flux.
18906 callback = unstable_wrap(callback);
18907 }
18908 passiveEffectCallbackHandle = unstable_runWithPriority(unstable_NormalPriority, function () {
18909 return schedulePassiveEffects(callback);
18910 });
18911 passiveEffectCallback = callback;
18912 }
18913
18914 isCommitting$1 = false;
18915 isWorking = false;
18916 stopCommitLifeCyclesTimer();
18917 stopCommitTimer();
18918 onCommitRoot(finishedWork.stateNode);
18919 if (true && ReactFiberInstrumentation_1.debugTool) {
18920 ReactFiberInstrumentation_1.debugTool.onCommitWork(finishedWork);
18921 }
18922
18923 var updateExpirationTimeAfterCommit = finishedWork.expirationTime;
18924 var childExpirationTimeAfterCommit = finishedWork.childExpirationTime;
18925 var earliestRemainingTimeAfterCommit = childExpirationTimeAfterCommit > updateExpirationTimeAfterCommit ? childExpirationTimeAfterCommit : updateExpirationTimeAfterCommit;
18926 if (earliestRemainingTimeAfterCommit === NoWork) {
18927 // If there's no remaining work, we can clear the set of already failed
18928 // error boundaries.
18929 legacyErrorBoundariesThatAlreadyFailed = null;
18930 }
18931 onCommit(root, earliestRemainingTimeAfterCommit);
18932
18933 if (enableSchedulerTracing) {
18934 __interactionsRef.current = prevInteractions;
18935
18936 var subscriber = void 0;
18937
18938 try {
18939 subscriber = __subscriberRef.current;
18940 if (subscriber !== null && root.memoizedInteractions.size > 0) {
18941 var threadID = computeThreadID(committedExpirationTime, root.interactionThreadID);
18942 subscriber.onWorkStopped(root.memoizedInteractions, threadID);
18943 }
18944 } catch (error) {
18945 // It's not safe for commitRoot() to throw.
18946 // Store the error for now and we'll re-throw in finishRendering().
18947 if (!hasUnhandledError) {
18948 hasUnhandledError = true;
18949 unhandledError = error;
18950 }
18951 } finally {
18952 // Clear completed interactions from the pending Map.
18953 // Unless the render was suspended or cascading work was scheduled,
18954 // In which case– leave pending interactions until the subsequent render.
18955 var pendingInteractionMap = root.pendingInteractionMap;
18956 pendingInteractionMap.forEach(function (scheduledInteractions, scheduledExpirationTime) {
18957 // Only decrement the pending interaction count if we're done.
18958 // If there's still work at the current priority,
18959 // That indicates that we are waiting for suspense data.
18960 if (scheduledExpirationTime > earliestRemainingTimeAfterCommit) {
18961 pendingInteractionMap.delete(scheduledExpirationTime);
18962
18963 scheduledInteractions.forEach(function (interaction) {
18964 interaction.__count--;
18965
18966 if (subscriber !== null && interaction.__count === 0) {
18967 try {
18968 subscriber.onInteractionScheduledWorkCompleted(interaction);
18969 } catch (error) {
18970 // It's not safe for commitRoot() to throw.
18971 // Store the error for now and we'll re-throw in finishRendering().
18972 if (!hasUnhandledError) {
18973 hasUnhandledError = true;
18974 unhandledError = error;
18975 }
18976 }
18977 }
18978 });
18979 }
18980 });
18981 }
18982 }
18983}
18984
18985function resetChildExpirationTime(workInProgress, renderTime) {
18986 if (renderTime !== Never && workInProgress.childExpirationTime === Never) {
18987 // The children of this component are hidden. Don't bubble their
18988 // expiration times.
18989 return;
18990 }
18991
18992 var newChildExpirationTime = NoWork;
18993
18994 // Bubble up the earliest expiration time.
18995 if (enableProfilerTimer && workInProgress.mode & ProfileMode) {
18996 // We're in profiling mode.
18997 // Let's use this same traversal to update the render durations.
18998 var actualDuration = workInProgress.actualDuration;
18999 var treeBaseDuration = workInProgress.selfBaseDuration;
19000
19001 // When a fiber is cloned, its actualDuration is reset to 0.
19002 // This value will only be updated if work is done on the fiber (i.e. it doesn't bailout).
19003 // When work is done, it should bubble to the parent's actualDuration.
19004 // If the fiber has not been cloned though, (meaning no work was done),
19005 // Then this value will reflect the amount of time spent working on a previous render.
19006 // In that case it should not bubble.
19007 // We determine whether it was cloned by comparing the child pointer.
19008 var shouldBubbleActualDurations = workInProgress.alternate === null || workInProgress.child !== workInProgress.alternate.child;
19009
19010 var child = workInProgress.child;
19011 while (child !== null) {
19012 var childUpdateExpirationTime = child.expirationTime;
19013 var childChildExpirationTime = child.childExpirationTime;
19014 if (childUpdateExpirationTime > newChildExpirationTime) {
19015 newChildExpirationTime = childUpdateExpirationTime;
19016 }
19017 if (childChildExpirationTime > newChildExpirationTime) {
19018 newChildExpirationTime = childChildExpirationTime;
19019 }
19020 if (shouldBubbleActualDurations) {
19021 actualDuration += child.actualDuration;
19022 }
19023 treeBaseDuration += child.treeBaseDuration;
19024 child = child.sibling;
19025 }
19026 workInProgress.actualDuration = actualDuration;
19027 workInProgress.treeBaseDuration = treeBaseDuration;
19028 } else {
19029 var _child = workInProgress.child;
19030 while (_child !== null) {
19031 var _childUpdateExpirationTime = _child.expirationTime;
19032 var _childChildExpirationTime = _child.childExpirationTime;
19033 if (_childUpdateExpirationTime > newChildExpirationTime) {
19034 newChildExpirationTime = _childUpdateExpirationTime;
19035 }
19036 if (_childChildExpirationTime > newChildExpirationTime) {
19037 newChildExpirationTime = _childChildExpirationTime;
19038 }
19039 _child = _child.sibling;
19040 }
19041 }
19042
19043 workInProgress.childExpirationTime = newChildExpirationTime;
19044}
19045
19046function completeUnitOfWork(workInProgress) {
19047 // Attempt to complete the current unit of work, then move to the
19048 // next sibling. If there are no more siblings, return to the
19049 // parent fiber.
19050 while (true) {
19051 // The current, flushed, state of this fiber is the alternate.
19052 // Ideally nothing should rely on this, but relying on it here
19053 // means that we don't need an additional field on the work in
19054 // progress.
19055 var current$$1 = workInProgress.alternate;
19056 {
19057 setCurrentFiber(workInProgress);
19058 }
19059
19060 var returnFiber = workInProgress.return;
19061 var siblingFiber = workInProgress.sibling;
19062
19063 if ((workInProgress.effectTag & Incomplete) === NoEffect) {
19064 if (true && replayFailedUnitOfWorkWithInvokeGuardedCallback) {
19065 // Don't replay if it fails during completion phase.
19066 mayReplayFailedUnitOfWork = false;
19067 }
19068 // This fiber completed.
19069 // Remember we're completing this unit so we can find a boundary if it fails.
19070 nextUnitOfWork = workInProgress;
19071 if (enableProfilerTimer) {
19072 if (workInProgress.mode & ProfileMode) {
19073 startProfilerTimer(workInProgress);
19074 }
19075 nextUnitOfWork = completeWork(current$$1, workInProgress, nextRenderExpirationTime);
19076 if (workInProgress.mode & ProfileMode) {
19077 // Update render duration assuming we didn't error.
19078 stopProfilerTimerIfRunningAndRecordDelta(workInProgress, false);
19079 }
19080 } else {
19081 nextUnitOfWork = completeWork(current$$1, workInProgress, nextRenderExpirationTime);
19082 }
19083 if (true && replayFailedUnitOfWorkWithInvokeGuardedCallback) {
19084 // We're out of completion phase so replaying is fine now.
19085 mayReplayFailedUnitOfWork = true;
19086 }
19087 stopWorkTimer(workInProgress);
19088 resetChildExpirationTime(workInProgress, nextRenderExpirationTime);
19089 {
19090 resetCurrentFiber();
19091 }
19092
19093 if (nextUnitOfWork !== null) {
19094 // Completing this fiber spawned new work. Work on that next.
19095 return nextUnitOfWork;
19096 }
19097
19098 if (returnFiber !== null &&
19099 // Do not append effects to parents if a sibling failed to complete
19100 (returnFiber.effectTag & Incomplete) === NoEffect) {
19101 // Append all the effects of the subtree and this fiber onto the effect
19102 // list of the parent. The completion order of the children affects the
19103 // side-effect order.
19104 if (returnFiber.firstEffect === null) {
19105 returnFiber.firstEffect = workInProgress.firstEffect;
19106 }
19107 if (workInProgress.lastEffect !== null) {
19108 if (returnFiber.lastEffect !== null) {
19109 returnFiber.lastEffect.nextEffect = workInProgress.firstEffect;
19110 }
19111 returnFiber.lastEffect = workInProgress.lastEffect;
19112 }
19113
19114 // If this fiber had side-effects, we append it AFTER the children's
19115 // side-effects. We can perform certain side-effects earlier if
19116 // needed, by doing multiple passes over the effect list. We don't want
19117 // to schedule our own side-effect on our own list because if end up
19118 // reusing children we'll schedule this effect onto itself since we're
19119 // at the end.
19120 var effectTag = workInProgress.effectTag;
19121 // Skip both NoWork and PerformedWork tags when creating the effect list.
19122 // PerformedWork effect is read by React DevTools but shouldn't be committed.
19123 if (effectTag > PerformedWork) {
19124 if (returnFiber.lastEffect !== null) {
19125 returnFiber.lastEffect.nextEffect = workInProgress;
19126 } else {
19127 returnFiber.firstEffect = workInProgress;
19128 }
19129 returnFiber.lastEffect = workInProgress;
19130 }
19131 }
19132
19133 if (true && ReactFiberInstrumentation_1.debugTool) {
19134 ReactFiberInstrumentation_1.debugTool.onCompleteWork(workInProgress);
19135 }
19136
19137 if (siblingFiber !== null) {
19138 // If there is more work to do in this returnFiber, do that next.
19139 return siblingFiber;
19140 } else if (returnFiber !== null) {
19141 // If there's no more work in this returnFiber. Complete the returnFiber.
19142 workInProgress = returnFiber;
19143 continue;
19144 } else {
19145 // We've reached the root.
19146 return null;
19147 }
19148 } else {
19149 if (enableProfilerTimer && workInProgress.mode & ProfileMode) {
19150 // Record the render duration for the fiber that errored.
19151 stopProfilerTimerIfRunningAndRecordDelta(workInProgress, false);
19152
19153 // Include the time spent working on failed children before continuing.
19154 var actualDuration = workInProgress.actualDuration;
19155 var child = workInProgress.child;
19156 while (child !== null) {
19157 actualDuration += child.actualDuration;
19158 child = child.sibling;
19159 }
19160 workInProgress.actualDuration = actualDuration;
19161 }
19162
19163 // This fiber did not complete because something threw. Pop values off
19164 // the stack without entering the complete phase. If this is a boundary,
19165 // capture values if possible.
19166 var next = unwindWork(workInProgress, nextRenderExpirationTime);
19167 // Because this fiber did not complete, don't reset its expiration time.
19168 if (workInProgress.effectTag & DidCapture) {
19169 // Restarting an error boundary
19170 stopFailedWorkTimer(workInProgress);
19171 } else {
19172 stopWorkTimer(workInProgress);
19173 }
19174
19175 {
19176 resetCurrentFiber();
19177 }
19178
19179 if (next !== null) {
19180 stopWorkTimer(workInProgress);
19181 if (true && ReactFiberInstrumentation_1.debugTool) {
19182 ReactFiberInstrumentation_1.debugTool.onCompleteWork(workInProgress);
19183 }
19184
19185 // If completing this work spawned new work, do that next. We'll come
19186 // back here again.
19187 // Since we're restarting, remove anything that is not a host effect
19188 // from the effect tag.
19189 next.effectTag &= HostEffectMask;
19190 return next;
19191 }
19192
19193 if (returnFiber !== null) {
19194 // Mark the parent fiber as incomplete and clear its effect list.
19195 returnFiber.firstEffect = returnFiber.lastEffect = null;
19196 returnFiber.effectTag |= Incomplete;
19197 }
19198
19199 if (true && ReactFiberInstrumentation_1.debugTool) {
19200 ReactFiberInstrumentation_1.debugTool.onCompleteWork(workInProgress);
19201 }
19202
19203 if (siblingFiber !== null) {
19204 // If there is more work to do in this returnFiber, do that next.
19205 return siblingFiber;
19206 } else if (returnFiber !== null) {
19207 // If there's no more work in this returnFiber. Complete the returnFiber.
19208 workInProgress = returnFiber;
19209 continue;
19210 } else {
19211 return null;
19212 }
19213 }
19214 }
19215
19216 // Without this explicit null return Flow complains of invalid return type
19217 // TODO Remove the above while(true) loop
19218 // eslint-disable-next-line no-unreachable
19219 return null;
19220}
19221
19222function performUnitOfWork(workInProgress) {
19223 // The current, flushed, state of this fiber is the alternate.
19224 // Ideally nothing should rely on this, but relying on it here
19225 // means that we don't need an additional field on the work in
19226 // progress.
19227 var current$$1 = workInProgress.alternate;
19228
19229 // See if beginning this work spawns more work.
19230 startWorkTimer(workInProgress);
19231 {
19232 setCurrentFiber(workInProgress);
19233 }
19234
19235 if (true && replayFailedUnitOfWorkWithInvokeGuardedCallback) {
19236 stashedWorkInProgressProperties = assignFiberPropertiesInDEV(stashedWorkInProgressProperties, workInProgress);
19237 }
19238
19239 var next = void 0;
19240 if (enableProfilerTimer) {
19241 if (workInProgress.mode & ProfileMode) {
19242 startProfilerTimer(workInProgress);
19243 }
19244
19245 next = beginWork(current$$1, workInProgress, nextRenderExpirationTime);
19246 workInProgress.memoizedProps = workInProgress.pendingProps;
19247
19248 if (workInProgress.mode & ProfileMode) {
19249 // Record the render duration assuming we didn't bailout (or error).
19250 stopProfilerTimerIfRunningAndRecordDelta(workInProgress, true);
19251 }
19252 } else {
19253 next = beginWork(current$$1, workInProgress, nextRenderExpirationTime);
19254 workInProgress.memoizedProps = workInProgress.pendingProps;
19255 }
19256
19257 {
19258 resetCurrentFiber();
19259 if (isReplayingFailedUnitOfWork) {
19260 // Currently replaying a failed unit of work. This should be unreachable,
19261 // because the render phase is meant to be idempotent, and it should
19262 // have thrown again. Since it didn't, rethrow the original error, so
19263 // React's internal stack is not misaligned.
19264 rethrowOriginalError();
19265 }
19266 }
19267 if (true && ReactFiberInstrumentation_1.debugTool) {
19268 ReactFiberInstrumentation_1.debugTool.onBeginWork(workInProgress);
19269 }
19270
19271 if (next === null) {
19272 // If this doesn't spawn new work, complete the current work.
19273 next = completeUnitOfWork(workInProgress);
19274 }
19275
19276 ReactCurrentOwner$2.current = null;
19277
19278 return next;
19279}
19280
19281function workLoop(isYieldy) {
19282 if (!isYieldy) {
19283 // Flush work without yielding
19284 while (nextUnitOfWork !== null) {
19285 nextUnitOfWork = performUnitOfWork(nextUnitOfWork);
19286 }
19287 } else {
19288 // Flush asynchronous work until there's a higher priority event
19289 while (nextUnitOfWork !== null && !shouldYieldToRenderer()) {
19290 nextUnitOfWork = performUnitOfWork(nextUnitOfWork);
19291 }
19292 }
19293}
19294
19295function renderRoot(root, isYieldy) {
19296 !!isWorking ? invariant(false, 'renderRoot was called recursively. This error is likely caused by a bug in React. Please file an issue.') : void 0;
19297
19298 flushPassiveEffects();
19299
19300 isWorking = true;
19301 var previousDispatcher = ReactCurrentDispatcher.current;
19302 ReactCurrentDispatcher.current = ContextOnlyDispatcher;
19303
19304 var expirationTime = root.nextExpirationTimeToWorkOn;
19305
19306 // Check if we're starting from a fresh stack, or if we're resuming from
19307 // previously yielded work.
19308 if (expirationTime !== nextRenderExpirationTime || root !== nextRoot || nextUnitOfWork === null) {
19309 // Reset the stack and start working from the root.
19310 resetStack();
19311 nextRoot = root;
19312 nextRenderExpirationTime = expirationTime;
19313 nextUnitOfWork = createWorkInProgress(nextRoot.current, null, nextRenderExpirationTime);
19314 root.pendingCommitExpirationTime = NoWork;
19315
19316 if (enableSchedulerTracing) {
19317 // Determine which interactions this batch of work currently includes,
19318 // So that we can accurately attribute time spent working on it,
19319 var interactions = new Set();
19320 root.pendingInteractionMap.forEach(function (scheduledInteractions, scheduledExpirationTime) {
19321 if (scheduledExpirationTime >= expirationTime) {
19322 scheduledInteractions.forEach(function (interaction) {
19323 return interactions.add(interaction);
19324 });
19325 }
19326 });
19327
19328 // Store the current set of interactions on the FiberRoot for a few reasons:
19329 // We can re-use it in hot functions like renderRoot() without having to recalculate it.
19330 // We will also use it in commitWork() to pass to any Profiler onRender() hooks.
19331 // This also provides DevTools with a way to access it when the onCommitRoot() hook is called.
19332 root.memoizedInteractions = interactions;
19333
19334 if (interactions.size > 0) {
19335 var subscriber = __subscriberRef.current;
19336 if (subscriber !== null) {
19337 var threadID = computeThreadID(expirationTime, root.interactionThreadID);
19338 try {
19339 subscriber.onWorkStarted(interactions, threadID);
19340 } catch (error) {
19341 // Work thrown by an interaction tracing subscriber should be rethrown,
19342 // But only once it's safe (to avoid leaving the scheduler in an invalid state).
19343 // Store the error for now and we'll re-throw in finishRendering().
19344 if (!hasUnhandledError) {
19345 hasUnhandledError = true;
19346 unhandledError = error;
19347 }
19348 }
19349 }
19350 }
19351 }
19352 }
19353
19354 var prevInteractions = null;
19355 if (enableSchedulerTracing) {
19356 // We're about to start new traced work.
19357 // Restore pending interactions so cascading work triggered during the render phase will be accounted for.
19358 prevInteractions = __interactionsRef.current;
19359 __interactionsRef.current = root.memoizedInteractions;
19360 }
19361
19362 var didFatal = false;
19363
19364 startWorkLoopTimer(nextUnitOfWork);
19365
19366 do {
19367 try {
19368 workLoop(isYieldy);
19369 } catch (thrownValue) {
19370 resetContextDependences();
19371 resetHooks();
19372
19373 // Reset in case completion throws.
19374 // This is only used in DEV and when replaying is on.
19375 var mayReplay = void 0;
19376 if (true && replayFailedUnitOfWorkWithInvokeGuardedCallback) {
19377 mayReplay = mayReplayFailedUnitOfWork;
19378 mayReplayFailedUnitOfWork = true;
19379 }
19380
19381 if (nextUnitOfWork === null) {
19382 // This is a fatal error.
19383 didFatal = true;
19384 onUncaughtError(thrownValue);
19385 } else {
19386 if (enableProfilerTimer && nextUnitOfWork.mode & ProfileMode) {
19387 // Record the time spent rendering before an error was thrown.
19388 // This avoids inaccurate Profiler durations in the case of a suspended render.
19389 stopProfilerTimerIfRunningAndRecordDelta(nextUnitOfWork, true);
19390 }
19391
19392 {
19393 // Reset global debug state
19394 // We assume this is defined in DEV
19395 resetCurrentlyProcessingQueue();
19396 }
19397
19398 if (true && replayFailedUnitOfWorkWithInvokeGuardedCallback) {
19399 if (mayReplay) {
19400 var failedUnitOfWork = nextUnitOfWork;
19401 replayUnitOfWork(failedUnitOfWork, thrownValue, isYieldy);
19402 }
19403 }
19404
19405 // TODO: we already know this isn't true in some cases.
19406 // At least this shows a nicer error message until we figure out the cause.
19407 // https://github.com/facebook/react/issues/12449#issuecomment-386727431
19408 !(nextUnitOfWork !== null) ? invariant(false, 'Failed to replay rendering after an error. This is likely caused by a bug in React. Please file an issue with a reproducing case to help us find it.') : void 0;
19409
19410 var sourceFiber = nextUnitOfWork;
19411 var returnFiber = sourceFiber.return;
19412 if (returnFiber === null) {
19413 // This is the root. The root could capture its own errors. However,
19414 // we don't know if it errors before or after we pushed the host
19415 // context. This information is needed to avoid a stack mismatch.
19416 // Because we're not sure, treat this as a fatal error. We could track
19417 // which phase it fails in, but doesn't seem worth it. At least
19418 // for now.
19419 didFatal = true;
19420 onUncaughtError(thrownValue);
19421 } else {
19422 throwException(root, returnFiber, sourceFiber, thrownValue, nextRenderExpirationTime);
19423 nextUnitOfWork = completeUnitOfWork(sourceFiber);
19424 continue;
19425 }
19426 }
19427 }
19428 break;
19429 } while (true);
19430
19431 if (enableSchedulerTracing) {
19432 // Traced work is done for now; restore the previous interactions.
19433 __interactionsRef.current = prevInteractions;
19434 }
19435
19436 // We're done performing work. Time to clean up.
19437 isWorking = false;
19438 ReactCurrentDispatcher.current = previousDispatcher;
19439 resetContextDependences();
19440 resetHooks();
19441
19442 // Yield back to main thread.
19443 if (didFatal) {
19444 var _didCompleteRoot = false;
19445 stopWorkLoopTimer(interruptedBy, _didCompleteRoot);
19446 interruptedBy = null;
19447 // There was a fatal error.
19448 {
19449 resetStackAfterFatalErrorInDev();
19450 }
19451 // `nextRoot` points to the in-progress root. A non-null value indicates
19452 // that we're in the middle of an async render. Set it to null to indicate
19453 // there's no more work to be done in the current batch.
19454 nextRoot = null;
19455 onFatal(root);
19456 return;
19457 }
19458
19459 if (nextUnitOfWork !== null) {
19460 // There's still remaining async work in this tree, but we ran out of time
19461 // in the current frame. Yield back to the renderer. Unless we're
19462 // interrupted by a higher priority update, we'll continue later from where
19463 // we left off.
19464 var _didCompleteRoot2 = false;
19465 stopWorkLoopTimer(interruptedBy, _didCompleteRoot2);
19466 interruptedBy = null;
19467 onYield(root);
19468 return;
19469 }
19470
19471 // We completed the whole tree.
19472 var didCompleteRoot = true;
19473 stopWorkLoopTimer(interruptedBy, didCompleteRoot);
19474 var rootWorkInProgress = root.current.alternate;
19475 !(rootWorkInProgress !== null) ? invariant(false, 'Finished root should have a work-in-progress. This error is likely caused by a bug in React. Please file an issue.') : void 0;
19476
19477 // `nextRoot` points to the in-progress root. A non-null value indicates
19478 // that we're in the middle of an async render. Set it to null to indicate
19479 // there's no more work to be done in the current batch.
19480 nextRoot = null;
19481 interruptedBy = null;
19482
19483 if (nextRenderDidError) {
19484 // There was an error
19485 if (hasLowerPriorityWork(root, expirationTime)) {
19486 // There's lower priority work. If so, it may have the effect of fixing
19487 // the exception that was just thrown. Exit without committing. This is
19488 // similar to a suspend, but without a timeout because we're not waiting
19489 // for a promise to resolve. React will restart at the lower
19490 // priority level.
19491 markSuspendedPriorityLevel(root, expirationTime);
19492 var suspendedExpirationTime = expirationTime;
19493 var rootExpirationTime = root.expirationTime;
19494 onSuspend(root, rootWorkInProgress, suspendedExpirationTime, rootExpirationTime, -1 // Indicates no timeout
19495 );
19496 return;
19497 } else if (
19498 // There's no lower priority work, but we're rendering asynchronously.
19499 // Synchronously attempt to render the same level one more time. This is
19500 // similar to a suspend, but without a timeout because we're not waiting
19501 // for a promise to resolve.
19502 !root.didError && isYieldy) {
19503 root.didError = true;
19504 var _suspendedExpirationTime = root.nextExpirationTimeToWorkOn = expirationTime;
19505 var _rootExpirationTime = root.expirationTime = Sync;
19506 onSuspend(root, rootWorkInProgress, _suspendedExpirationTime, _rootExpirationTime, -1 // Indicates no timeout
19507 );
19508 return;
19509 }
19510 }
19511
19512 if (isYieldy && nextLatestAbsoluteTimeoutMs !== -1) {
19513 // The tree was suspended.
19514 var _suspendedExpirationTime2 = expirationTime;
19515 markSuspendedPriorityLevel(root, _suspendedExpirationTime2);
19516
19517 // Find the earliest uncommitted expiration time in the tree, including
19518 // work that is suspended. The timeout threshold cannot be longer than
19519 // the overall expiration.
19520 var earliestExpirationTime = findEarliestOutstandingPriorityLevel(root, expirationTime);
19521 var earliestExpirationTimeMs = expirationTimeToMs(earliestExpirationTime);
19522 if (earliestExpirationTimeMs < nextLatestAbsoluteTimeoutMs) {
19523 nextLatestAbsoluteTimeoutMs = earliestExpirationTimeMs;
19524 }
19525
19526 // Subtract the current time from the absolute timeout to get the number
19527 // of milliseconds until the timeout. In other words, convert an absolute
19528 // timestamp to a relative time. This is the value that is passed
19529 // to `setTimeout`.
19530 var currentTimeMs = expirationTimeToMs(requestCurrentTime());
19531 var msUntilTimeout = nextLatestAbsoluteTimeoutMs - currentTimeMs;
19532 msUntilTimeout = msUntilTimeout < 0 ? 0 : msUntilTimeout;
19533
19534 // TODO: Account for the Just Noticeable Difference
19535
19536 var _rootExpirationTime2 = root.expirationTime;
19537 onSuspend(root, rootWorkInProgress, _suspendedExpirationTime2, _rootExpirationTime2, msUntilTimeout);
19538 return;
19539 }
19540
19541 // Ready to commit.
19542 onComplete(root, rootWorkInProgress, expirationTime);
19543}
19544
19545function captureCommitPhaseError(sourceFiber, value) {
19546 var expirationTime = Sync;
19547 var fiber = sourceFiber.return;
19548 while (fiber !== null) {
19549 switch (fiber.tag) {
19550 case ClassComponent:
19551 var ctor = fiber.type;
19552 var instance = fiber.stateNode;
19553 if (typeof ctor.getDerivedStateFromError === 'function' || typeof instance.componentDidCatch === 'function' && !isAlreadyFailedLegacyErrorBoundary(instance)) {
19554 var errorInfo = createCapturedValue(value, sourceFiber);
19555 var update = createClassErrorUpdate(fiber, errorInfo, expirationTime);
19556 enqueueUpdate(fiber, update);
19557 scheduleWork(fiber, expirationTime);
19558 return;
19559 }
19560 break;
19561 case HostRoot:
19562 {
19563 var _errorInfo = createCapturedValue(value, sourceFiber);
19564 var _update = createRootErrorUpdate(fiber, _errorInfo, expirationTime);
19565 enqueueUpdate(fiber, _update);
19566 scheduleWork(fiber, expirationTime);
19567 return;
19568 }
19569 }
19570 fiber = fiber.return;
19571 }
19572
19573 if (sourceFiber.tag === HostRoot) {
19574 // Error was thrown at the root. There is no parent, so the root
19575 // itself should capture it.
19576 var rootFiber = sourceFiber;
19577 var _errorInfo2 = createCapturedValue(value, rootFiber);
19578 var _update2 = createRootErrorUpdate(rootFiber, _errorInfo2, expirationTime);
19579 enqueueUpdate(rootFiber, _update2);
19580 scheduleWork(rootFiber, expirationTime);
19581 }
19582}
19583
19584function computeThreadID(expirationTime, interactionThreadID) {
19585 // Interaction threads are unique per root and expiration time.
19586 return expirationTime * 1000 + interactionThreadID;
19587}
19588
19589// Creates a unique async expiration time.
19590function computeUniqueAsyncExpiration() {
19591 var currentTime = requestCurrentTime();
19592 var result = computeAsyncExpiration(currentTime);
19593 if (result >= lastUniqueAsyncExpiration) {
19594 // Since we assume the current time monotonically increases, we only hit
19595 // this branch when computeUniqueAsyncExpiration is fired multiple times
19596 // within a 200ms window (or whatever the async bucket size is).
19597 result = lastUniqueAsyncExpiration - 1;
19598 }
19599 lastUniqueAsyncExpiration = result;
19600 return lastUniqueAsyncExpiration;
19601}
19602
19603function computeExpirationForFiber(currentTime, fiber) {
19604 var priorityLevel = unstable_getCurrentPriorityLevel();
19605
19606 var expirationTime = void 0;
19607 if ((fiber.mode & ConcurrentMode) === NoContext) {
19608 // Outside of concurrent mode, updates are always synchronous.
19609 expirationTime = Sync;
19610 } else if (isWorking && !isCommitting$1) {
19611 // During render phase, updates expire during as the current render.
19612 expirationTime = nextRenderExpirationTime;
19613 } else {
19614 switch (priorityLevel) {
19615 case unstable_ImmediatePriority:
19616 expirationTime = Sync;
19617 break;
19618 case unstable_UserBlockingPriority:
19619 expirationTime = computeInteractiveExpiration(currentTime);
19620 break;
19621 case unstable_NormalPriority:
19622 // This is a normal, concurrent update
19623 expirationTime = computeAsyncExpiration(currentTime);
19624 break;
19625 case unstable_LowPriority:
19626 case unstable_IdlePriority:
19627 expirationTime = Never;
19628 break;
19629 default:
19630 invariant(false, 'Unknown priority level. This error is likely caused by a bug in React. Please file an issue.');
19631 }
19632
19633 // If we're in the middle of rendering a tree, do not update at the same
19634 // expiration time that is already rendering.
19635 if (nextRoot !== null && expirationTime === nextRenderExpirationTime) {
19636 expirationTime -= 1;
19637 }
19638 }
19639
19640 // Keep track of the lowest pending interactive expiration time. This
19641 // allows us to synchronously flush all interactive updates
19642 // when needed.
19643 // TODO: Move this to renderer?
19644 if (priorityLevel === unstable_UserBlockingPriority && (lowestPriorityPendingInteractiveExpirationTime === NoWork || expirationTime < lowestPriorityPendingInteractiveExpirationTime)) {
19645 lowestPriorityPendingInteractiveExpirationTime = expirationTime;
19646 }
19647
19648 return expirationTime;
19649}
19650
19651function renderDidSuspend(root, absoluteTimeoutMs, suspendedTime) {
19652 // Schedule the timeout.
19653 if (absoluteTimeoutMs >= 0 && nextLatestAbsoluteTimeoutMs < absoluteTimeoutMs) {
19654 nextLatestAbsoluteTimeoutMs = absoluteTimeoutMs;
19655 }
19656}
19657
19658function renderDidError() {
19659 nextRenderDidError = true;
19660}
19661
19662function pingSuspendedRoot(root, thenable, pingTime) {
19663 // A promise that previously suspended React from committing has resolved.
19664 // If React is still suspended, try again at the previous level (pingTime).
19665
19666 var pingCache = root.pingCache;
19667 if (pingCache !== null) {
19668 // The thenable resolved, so we no longer need to memoize, because it will
19669 // never be thrown again.
19670 pingCache.delete(thenable);
19671 }
19672
19673 if (nextRoot !== null && nextRenderExpirationTime === pingTime) {
19674 // Received a ping at the same priority level at which we're currently
19675 // rendering. Restart from the root.
19676 nextRoot = null;
19677 } else {
19678 // Confirm that the root is still suspended at this level. Otherwise exit.
19679 if (isPriorityLevelSuspended(root, pingTime)) {
19680 // Ping at the original level
19681 markPingedPriorityLevel(root, pingTime);
19682 var rootExpirationTime = root.expirationTime;
19683 if (rootExpirationTime !== NoWork) {
19684 requestWork(root, rootExpirationTime);
19685 }
19686 }
19687 }
19688}
19689
19690function retryTimedOutBoundary(boundaryFiber, thenable) {
19691 // The boundary fiber (a Suspense component) previously timed out and was
19692 // rendered in its fallback state. One of the promises that suspended it has
19693 // resolved, which means at least part of the tree was likely unblocked. Try
19694 var retryCache = void 0;
19695 if (enableSuspenseServerRenderer) {
19696 switch (boundaryFiber.tag) {
19697 case SuspenseComponent:
19698 retryCache = boundaryFiber.stateNode;
19699 break;
19700 case DehydratedSuspenseComponent:
19701 retryCache = boundaryFiber.memoizedState;
19702 break;
19703 default:
19704 invariant(false, 'Pinged unknown suspense boundary type. This is probably a bug in React.');
19705 }
19706 } else {
19707 retryCache = boundaryFiber.stateNode;
19708 }
19709 if (retryCache !== null) {
19710 // The thenable resolved, so we no longer need to memoize, because it will
19711 // never be thrown again.
19712 retryCache.delete(thenable);
19713 }
19714
19715 var currentTime = requestCurrentTime();
19716 var retryTime = computeExpirationForFiber(currentTime, boundaryFiber);
19717 var root = scheduleWorkToRoot(boundaryFiber, retryTime);
19718 if (root !== null) {
19719 markPendingPriorityLevel(root, retryTime);
19720 var rootExpirationTime = root.expirationTime;
19721 if (rootExpirationTime !== NoWork) {
19722 requestWork(root, rootExpirationTime);
19723 }
19724 }
19725}
19726
19727function scheduleWorkToRoot(fiber, expirationTime) {
19728 recordScheduleUpdate();
19729
19730 {
19731 if (fiber.tag === ClassComponent) {
19732 var instance = fiber.stateNode;
19733 warnAboutInvalidUpdates(instance);
19734 }
19735 }
19736
19737 // Update the source fiber's expiration time
19738 if (fiber.expirationTime < expirationTime) {
19739 fiber.expirationTime = expirationTime;
19740 }
19741 var alternate = fiber.alternate;
19742 if (alternate !== null && alternate.expirationTime < expirationTime) {
19743 alternate.expirationTime = expirationTime;
19744 }
19745 // Walk the parent path to the root and update the child expiration time.
19746 var node = fiber.return;
19747 var root = null;
19748 if (node === null && fiber.tag === HostRoot) {
19749 root = fiber.stateNode;
19750 } else {
19751 while (node !== null) {
19752 alternate = node.alternate;
19753 if (node.childExpirationTime < expirationTime) {
19754 node.childExpirationTime = expirationTime;
19755 if (alternate !== null && alternate.childExpirationTime < expirationTime) {
19756 alternate.childExpirationTime = expirationTime;
19757 }
19758 } else if (alternate !== null && alternate.childExpirationTime < expirationTime) {
19759 alternate.childExpirationTime = expirationTime;
19760 }
19761 if (node.return === null && node.tag === HostRoot) {
19762 root = node.stateNode;
19763 break;
19764 }
19765 node = node.return;
19766 }
19767 }
19768
19769 if (enableSchedulerTracing) {
19770 if (root !== null) {
19771 var interactions = __interactionsRef.current;
19772 if (interactions.size > 0) {
19773 var pendingInteractionMap = root.pendingInteractionMap;
19774 var pendingInteractions = pendingInteractionMap.get(expirationTime);
19775 if (pendingInteractions != null) {
19776 interactions.forEach(function (interaction) {
19777 if (!pendingInteractions.has(interaction)) {
19778 // Update the pending async work count for previously unscheduled interaction.
19779 interaction.__count++;
19780 }
19781
19782 pendingInteractions.add(interaction);
19783 });
19784 } else {
19785 pendingInteractionMap.set(expirationTime, new Set(interactions));
19786
19787 // Update the pending async work count for the current interactions.
19788 interactions.forEach(function (interaction) {
19789 interaction.__count++;
19790 });
19791 }
19792
19793 var subscriber = __subscriberRef.current;
19794 if (subscriber !== null) {
19795 var threadID = computeThreadID(expirationTime, root.interactionThreadID);
19796 subscriber.onWorkScheduled(interactions, threadID);
19797 }
19798 }
19799 }
19800 }
19801 return root;
19802}
19803
19804function warnIfNotCurrentlyBatchingInDev(fiber) {
19805 {
19806 if (isRendering === false && isBatchingUpdates === false) {
19807 warningWithoutStack$1(false, 'An update to %s inside a test was not wrapped in act(...).\n\n' + 'When testing, code that causes React state updates should be wrapped into act(...):\n\n' + 'act(() => {\n' + ' /* fire events that update state */\n' + '});\n' + '/* assert on the output */\n\n' + "This ensures that you're testing the behavior the user would see in the browser." + ' Learn more at https://fb.me/react-wrap-tests-with-act' + '%s', getComponentName(fiber.type), getStackByFiberInDevAndProd(fiber));
19808 }
19809 }
19810}
19811
19812function scheduleWork(fiber, expirationTime) {
19813 var root = scheduleWorkToRoot(fiber, expirationTime);
19814 if (root === null) {
19815 {
19816 switch (fiber.tag) {
19817 case ClassComponent:
19818 warnAboutUpdateOnUnmounted(fiber, true);
19819 break;
19820 case FunctionComponent:
19821 case ForwardRef:
19822 case MemoComponent:
19823 case SimpleMemoComponent:
19824 warnAboutUpdateOnUnmounted(fiber, false);
19825 break;
19826 }
19827 }
19828 return;
19829 }
19830
19831 if (!isWorking && nextRenderExpirationTime !== NoWork && expirationTime > nextRenderExpirationTime) {
19832 // This is an interruption. (Used for performance tracking.)
19833 interruptedBy = fiber;
19834 resetStack();
19835 }
19836 markPendingPriorityLevel(root, expirationTime);
19837 if (
19838 // If we're in the render phase, we don't need to schedule this root
19839 // for an update, because we'll do it before we exit...
19840 !isWorking || isCommitting$1 ||
19841 // ...unless this is a different root than the one we're rendering.
19842 nextRoot !== root) {
19843 var rootExpirationTime = root.expirationTime;
19844 requestWork(root, rootExpirationTime);
19845 }
19846 if (nestedUpdateCount > NESTED_UPDATE_LIMIT) {
19847 // Reset this back to zero so subsequent updates don't throw.
19848 nestedUpdateCount = 0;
19849 invariant(false, 'Maximum update depth exceeded. This can happen when a component repeatedly calls setState inside componentWillUpdate or componentDidUpdate. React limits the number of nested updates to prevent infinite loops.');
19850 }
19851}
19852
19853function syncUpdates(fn, a, b, c, d) {
19854 return unstable_runWithPriority(unstable_ImmediatePriority, function () {
19855 return fn(a, b, c, d);
19856 });
19857}
19858
19859// TODO: Everything below this is written as if it has been lifted to the
19860// renderers. I'll do this in a follow-up.
19861
19862// Linked-list of roots
19863var firstScheduledRoot = null;
19864var lastScheduledRoot = null;
19865
19866var callbackExpirationTime = NoWork;
19867var callbackID = void 0;
19868var isRendering = false;
19869var nextFlushedRoot = null;
19870var nextFlushedExpirationTime = NoWork;
19871var lowestPriorityPendingInteractiveExpirationTime = NoWork;
19872var hasUnhandledError = false;
19873var unhandledError = null;
19874
19875var isBatchingUpdates = false;
19876var isUnbatchingUpdates = false;
19877
19878var completedBatches = null;
19879
19880var originalStartTimeMs = unstable_now();
19881var currentRendererTime = msToExpirationTime(originalStartTimeMs);
19882var currentSchedulerTime = currentRendererTime;
19883
19884// Use these to prevent an infinite loop of nested updates
19885var NESTED_UPDATE_LIMIT = 50;
19886var nestedUpdateCount = 0;
19887var lastCommittedRootDuringThisBatch = null;
19888
19889function recomputeCurrentRendererTime() {
19890 var currentTimeMs = unstable_now() - originalStartTimeMs;
19891 currentRendererTime = msToExpirationTime(currentTimeMs);
19892}
19893
19894function scheduleCallbackWithExpirationTime(root, expirationTime) {
19895 if (callbackExpirationTime !== NoWork) {
19896 // A callback is already scheduled. Check its expiration time (timeout).
19897 if (expirationTime < callbackExpirationTime) {
19898 // Existing callback has sufficient timeout. Exit.
19899 return;
19900 } else {
19901 if (callbackID !== null) {
19902 // Existing callback has insufficient timeout. Cancel and schedule a
19903 // new one.
19904 unstable_cancelCallback(callbackID);
19905 }
19906 }
19907 // The request callback timer is already running. Don't start a new one.
19908 } else {
19909 startRequestCallbackTimer();
19910 }
19911
19912 callbackExpirationTime = expirationTime;
19913 var currentMs = unstable_now() - originalStartTimeMs;
19914 var expirationTimeMs = expirationTimeToMs(expirationTime);
19915 var timeout = expirationTimeMs - currentMs;
19916 callbackID = unstable_scheduleCallback(performAsyncWork, { timeout: timeout });
19917}
19918
19919// For every call to renderRoot, one of onFatal, onComplete, onSuspend, and
19920// onYield is called upon exiting. We use these in lieu of returning a tuple.
19921// I've also chosen not to inline them into renderRoot because these will
19922// eventually be lifted into the renderer.
19923function onFatal(root) {
19924 root.finishedWork = null;
19925}
19926
19927function onComplete(root, finishedWork, expirationTime) {
19928 root.pendingCommitExpirationTime = expirationTime;
19929 root.finishedWork = finishedWork;
19930}
19931
19932function onSuspend(root, finishedWork, suspendedExpirationTime, rootExpirationTime, msUntilTimeout) {
19933 root.expirationTime = rootExpirationTime;
19934 if (msUntilTimeout === 0 && !shouldYieldToRenderer()) {
19935 // Don't wait an additional tick. Commit the tree immediately.
19936 root.pendingCommitExpirationTime = suspendedExpirationTime;
19937 root.finishedWork = finishedWork;
19938 } else if (msUntilTimeout > 0) {
19939 // Wait `msUntilTimeout` milliseconds before committing.
19940 root.timeoutHandle = scheduleTimeout(onTimeout.bind(null, root, finishedWork, suspendedExpirationTime), msUntilTimeout);
19941 }
19942}
19943
19944function onYield(root) {
19945 root.finishedWork = null;
19946}
19947
19948function onTimeout(root, finishedWork, suspendedExpirationTime) {
19949 // The root timed out. Commit it.
19950 root.pendingCommitExpirationTime = suspendedExpirationTime;
19951 root.finishedWork = finishedWork;
19952 // Read the current time before entering the commit phase. We can be
19953 // certain this won't cause tearing related to batching of event updates
19954 // because we're at the top of a timer event.
19955 recomputeCurrentRendererTime();
19956 currentSchedulerTime = currentRendererTime;
19957 flushRoot(root, suspendedExpirationTime);
19958}
19959
19960function onCommit(root, expirationTime) {
19961 root.expirationTime = expirationTime;
19962 root.finishedWork = null;
19963}
19964
19965function requestCurrentTime() {
19966 // requestCurrentTime is called by the scheduler to compute an expiration
19967 // time.
19968 //
19969 // Expiration times are computed by adding to the current time (the start
19970 // time). However, if two updates are scheduled within the same event, we
19971 // should treat their start times as simultaneous, even if the actual clock
19972 // time has advanced between the first and second call.
19973
19974 // In other words, because expiration times determine how updates are batched,
19975 // we want all updates of like priority that occur within the same event to
19976 // receive the same expiration time. Otherwise we get tearing.
19977 //
19978 // We keep track of two separate times: the current "renderer" time and the
19979 // current "scheduler" time. The renderer time can be updated whenever; it
19980 // only exists to minimize the calls performance.now.
19981 //
19982 // But the scheduler time can only be updated if there's no pending work, or
19983 // if we know for certain that we're not in the middle of an event.
19984
19985 if (isRendering) {
19986 // We're already rendering. Return the most recently read time.
19987 return currentSchedulerTime;
19988 }
19989 // Check if there's pending work.
19990 findHighestPriorityRoot();
19991 if (nextFlushedExpirationTime === NoWork || nextFlushedExpirationTime === Never) {
19992 // If there's no pending work, or if the pending work is offscreen, we can
19993 // read the current time without risk of tearing.
19994 recomputeCurrentRendererTime();
19995 currentSchedulerTime = currentRendererTime;
19996 return currentSchedulerTime;
19997 }
19998 // There's already pending work. We might be in the middle of a browser
19999 // event. If we were to read the current time, it could cause multiple updates
20000 // within the same event to receive different expiration times, leading to
20001 // tearing. Return the last read time. During the next idle callback, the
20002 // time will be updated.
20003 return currentSchedulerTime;
20004}
20005
20006// requestWork is called by the scheduler whenever a root receives an update.
20007// It's up to the renderer to call renderRoot at some point in the future.
20008function requestWork(root, expirationTime) {
20009 addRootToSchedule(root, expirationTime);
20010 if (isRendering) {
20011 // Prevent reentrancy. Remaining work will be scheduled at the end of
20012 // the currently rendering batch.
20013 return;
20014 }
20015
20016 if (isBatchingUpdates) {
20017 // Flush work at the end of the batch.
20018 if (isUnbatchingUpdates) {
20019 // ...unless we're inside unbatchedUpdates, in which case we should
20020 // flush it now.
20021 nextFlushedRoot = root;
20022 nextFlushedExpirationTime = Sync;
20023 performWorkOnRoot(root, Sync, false);
20024 }
20025 return;
20026 }
20027
20028 // TODO: Get rid of Sync and use current time?
20029 if (expirationTime === Sync) {
20030 performSyncWork();
20031 } else {
20032 scheduleCallbackWithExpirationTime(root, expirationTime);
20033 }
20034}
20035
20036function addRootToSchedule(root, expirationTime) {
20037 // Add the root to the schedule.
20038 // Check if this root is already part of the schedule.
20039 if (root.nextScheduledRoot === null) {
20040 // This root is not already scheduled. Add it.
20041 root.expirationTime = expirationTime;
20042 if (lastScheduledRoot === null) {
20043 firstScheduledRoot = lastScheduledRoot = root;
20044 root.nextScheduledRoot = root;
20045 } else {
20046 lastScheduledRoot.nextScheduledRoot = root;
20047 lastScheduledRoot = root;
20048 lastScheduledRoot.nextScheduledRoot = firstScheduledRoot;
20049 }
20050 } else {
20051 // This root is already scheduled, but its priority may have increased.
20052 var remainingExpirationTime = root.expirationTime;
20053 if (expirationTime > remainingExpirationTime) {
20054 // Update the priority.
20055 root.expirationTime = expirationTime;
20056 }
20057 }
20058}
20059
20060function findHighestPriorityRoot() {
20061 var highestPriorityWork = NoWork;
20062 var highestPriorityRoot = null;
20063 if (lastScheduledRoot !== null) {
20064 var previousScheduledRoot = lastScheduledRoot;
20065 var root = firstScheduledRoot;
20066 while (root !== null) {
20067 var remainingExpirationTime = root.expirationTime;
20068 if (remainingExpirationTime === NoWork) {
20069 // This root no longer has work. Remove it from the scheduler.
20070
20071 // TODO: This check is redudant, but Flow is confused by the branch
20072 // below where we set lastScheduledRoot to null, even though we break
20073 // from the loop right after.
20074 !(previousScheduledRoot !== null && lastScheduledRoot !== null) ? invariant(false, 'Should have a previous and last root. This error is likely caused by a bug in React. Please file an issue.') : void 0;
20075 if (root === root.nextScheduledRoot) {
20076 // This is the only root in the list.
20077 root.nextScheduledRoot = null;
20078 firstScheduledRoot = lastScheduledRoot = null;
20079 break;
20080 } else if (root === firstScheduledRoot) {
20081 // This is the first root in the list.
20082 var next = root.nextScheduledRoot;
20083 firstScheduledRoot = next;
20084 lastScheduledRoot.nextScheduledRoot = next;
20085 root.nextScheduledRoot = null;
20086 } else if (root === lastScheduledRoot) {
20087 // This is the last root in the list.
20088 lastScheduledRoot = previousScheduledRoot;
20089 lastScheduledRoot.nextScheduledRoot = firstScheduledRoot;
20090 root.nextScheduledRoot = null;
20091 break;
20092 } else {
20093 previousScheduledRoot.nextScheduledRoot = root.nextScheduledRoot;
20094 root.nextScheduledRoot = null;
20095 }
20096 root = previousScheduledRoot.nextScheduledRoot;
20097 } else {
20098 if (remainingExpirationTime > highestPriorityWork) {
20099 // Update the priority, if it's higher
20100 highestPriorityWork = remainingExpirationTime;
20101 highestPriorityRoot = root;
20102 }
20103 if (root === lastScheduledRoot) {
20104 break;
20105 }
20106 if (highestPriorityWork === Sync) {
20107 // Sync is highest priority by definition so
20108 // we can stop searching.
20109 break;
20110 }
20111 previousScheduledRoot = root;
20112 root = root.nextScheduledRoot;
20113 }
20114 }
20115 }
20116
20117 nextFlushedRoot = highestPriorityRoot;
20118 nextFlushedExpirationTime = highestPriorityWork;
20119}
20120
20121// TODO: This wrapper exists because many of the older tests (the ones that use
20122// flushDeferredPri) rely on the number of times `shouldYield` is called. We
20123// should get rid of it.
20124var didYield = false;
20125function shouldYieldToRenderer() {
20126 if (didYield) {
20127 return true;
20128 }
20129 if (unstable_shouldYield()) {
20130 didYield = true;
20131 return true;
20132 }
20133 return false;
20134}
20135
20136function performAsyncWork() {
20137 try {
20138 if (!shouldYieldToRenderer()) {
20139 // The callback timed out. That means at least one update has expired.
20140 // Iterate through the root schedule. If they contain expired work, set
20141 // the next render expiration time to the current time. This has the effect
20142 // of flushing all expired work in a single batch, instead of flushing each
20143 // level one at a time.
20144 if (firstScheduledRoot !== null) {
20145 recomputeCurrentRendererTime();
20146 var root = firstScheduledRoot;
20147 do {
20148 didExpireAtExpirationTime(root, currentRendererTime);
20149 // The root schedule is circular, so this is never null.
20150 root = root.nextScheduledRoot;
20151 } while (root !== firstScheduledRoot);
20152 }
20153 }
20154 performWork(NoWork, true);
20155 } finally {
20156 didYield = false;
20157 }
20158}
20159
20160function performSyncWork() {
20161 performWork(Sync, false);
20162}
20163
20164function performWork(minExpirationTime, isYieldy) {
20165 // Keep working on roots until there's no more work, or until there's a higher
20166 // priority event.
20167 findHighestPriorityRoot();
20168
20169 if (isYieldy) {
20170 recomputeCurrentRendererTime();
20171 currentSchedulerTime = currentRendererTime;
20172
20173 if (enableUserTimingAPI) {
20174 var didExpire = nextFlushedExpirationTime > currentRendererTime;
20175 var timeout = expirationTimeToMs(nextFlushedExpirationTime);
20176 stopRequestCallbackTimer(didExpire, timeout);
20177 }
20178
20179 while (nextFlushedRoot !== null && nextFlushedExpirationTime !== NoWork && minExpirationTime <= nextFlushedExpirationTime && !(didYield && currentRendererTime > nextFlushedExpirationTime)) {
20180 performWorkOnRoot(nextFlushedRoot, nextFlushedExpirationTime, currentRendererTime > nextFlushedExpirationTime);
20181 findHighestPriorityRoot();
20182 recomputeCurrentRendererTime();
20183 currentSchedulerTime = currentRendererTime;
20184 }
20185 } else {
20186 while (nextFlushedRoot !== null && nextFlushedExpirationTime !== NoWork && minExpirationTime <= nextFlushedExpirationTime) {
20187 performWorkOnRoot(nextFlushedRoot, nextFlushedExpirationTime, false);
20188 findHighestPriorityRoot();
20189 }
20190 }
20191
20192 // We're done flushing work. Either we ran out of time in this callback,
20193 // or there's no more work left with sufficient priority.
20194
20195 // If we're inside a callback, set this to false since we just completed it.
20196 if (isYieldy) {
20197 callbackExpirationTime = NoWork;
20198 callbackID = null;
20199 }
20200 // If there's work left over, schedule a new callback.
20201 if (nextFlushedExpirationTime !== NoWork) {
20202 scheduleCallbackWithExpirationTime(nextFlushedRoot, nextFlushedExpirationTime);
20203 }
20204
20205 // Clean-up.
20206 finishRendering();
20207}
20208
20209function flushRoot(root, expirationTime) {
20210 !!isRendering ? invariant(false, 'work.commit(): Cannot commit while already rendering. This likely means you attempted to commit from inside a lifecycle method.') : void 0;
20211 // Perform work on root as if the given expiration time is the current time.
20212 // This has the effect of synchronously flushing all work up to and
20213 // including the given time.
20214 nextFlushedRoot = root;
20215 nextFlushedExpirationTime = expirationTime;
20216 performWorkOnRoot(root, expirationTime, false);
20217 // Flush any sync work that was scheduled by lifecycles
20218 performSyncWork();
20219}
20220
20221function finishRendering() {
20222 nestedUpdateCount = 0;
20223 lastCommittedRootDuringThisBatch = null;
20224
20225 if (completedBatches !== null) {
20226 var batches = completedBatches;
20227 completedBatches = null;
20228 for (var i = 0; i < batches.length; i++) {
20229 var batch = batches[i];
20230 try {
20231 batch._onComplete();
20232 } catch (error) {
20233 if (!hasUnhandledError) {
20234 hasUnhandledError = true;
20235 unhandledError = error;
20236 }
20237 }
20238 }
20239 }
20240
20241 if (hasUnhandledError) {
20242 var error = unhandledError;
20243 unhandledError = null;
20244 hasUnhandledError = false;
20245 throw error;
20246 }
20247}
20248
20249function performWorkOnRoot(root, expirationTime, isYieldy) {
20250 !!isRendering ? invariant(false, 'performWorkOnRoot was called recursively. This error is likely caused by a bug in React. Please file an issue.') : void 0;
20251
20252 isRendering = true;
20253
20254 // Check if this is async work or sync/expired work.
20255 if (!isYieldy) {
20256 // Flush work without yielding.
20257 // TODO: Non-yieldy work does not necessarily imply expired work. A renderer
20258 // may want to perform some work without yielding, but also without
20259 // requiring the root to complete (by triggering placeholders).
20260
20261 var finishedWork = root.finishedWork;
20262 if (finishedWork !== null) {
20263 // This root is already complete. We can commit it.
20264 completeRoot(root, finishedWork, expirationTime);
20265 } else {
20266 root.finishedWork = null;
20267 // If this root previously suspended, clear its existing timeout, since
20268 // we're about to try rendering again.
20269 var timeoutHandle = root.timeoutHandle;
20270 if (timeoutHandle !== noTimeout) {
20271 root.timeoutHandle = noTimeout;
20272 // $FlowFixMe Complains noTimeout is not a TimeoutID, despite the check above
20273 cancelTimeout(timeoutHandle);
20274 }
20275 renderRoot(root, isYieldy);
20276 finishedWork = root.finishedWork;
20277 if (finishedWork !== null) {
20278 // We've completed the root. Commit it.
20279 completeRoot(root, finishedWork, expirationTime);
20280 }
20281 }
20282 } else {
20283 // Flush async work.
20284 var _finishedWork = root.finishedWork;
20285 if (_finishedWork !== null) {
20286 // This root is already complete. We can commit it.
20287 completeRoot(root, _finishedWork, expirationTime);
20288 } else {
20289 root.finishedWork = null;
20290 // If this root previously suspended, clear its existing timeout, since
20291 // we're about to try rendering again.
20292 var _timeoutHandle = root.timeoutHandle;
20293 if (_timeoutHandle !== noTimeout) {
20294 root.timeoutHandle = noTimeout;
20295 // $FlowFixMe Complains noTimeout is not a TimeoutID, despite the check above
20296 cancelTimeout(_timeoutHandle);
20297 }
20298 renderRoot(root, isYieldy);
20299 _finishedWork = root.finishedWork;
20300 if (_finishedWork !== null) {
20301 // We've completed the root. Check the if we should yield one more time
20302 // before committing.
20303 if (!shouldYieldToRenderer()) {
20304 // Still time left. Commit the root.
20305 completeRoot(root, _finishedWork, expirationTime);
20306 } else {
20307 // There's no time left. Mark this root as complete. We'll come
20308 // back and commit it later.
20309 root.finishedWork = _finishedWork;
20310 }
20311 }
20312 }
20313 }
20314
20315 isRendering = false;
20316}
20317
20318function completeRoot(root, finishedWork, expirationTime) {
20319 // Check if there's a batch that matches this expiration time.
20320 var firstBatch = root.firstBatch;
20321 if (firstBatch !== null && firstBatch._expirationTime >= expirationTime) {
20322 if (completedBatches === null) {
20323 completedBatches = [firstBatch];
20324 } else {
20325 completedBatches.push(firstBatch);
20326 }
20327 if (firstBatch._defer) {
20328 // This root is blocked from committing by a batch. Unschedule it until
20329 // we receive another update.
20330 root.finishedWork = finishedWork;
20331 root.expirationTime = NoWork;
20332 return;
20333 }
20334 }
20335
20336 // Commit the root.
20337 root.finishedWork = null;
20338
20339 // Check if this is a nested update (a sync update scheduled during the
20340 // commit phase).
20341 if (root === lastCommittedRootDuringThisBatch) {
20342 // If the next root is the same as the previous root, this is a nested
20343 // update. To prevent an infinite loop, increment the nested update count.
20344 nestedUpdateCount++;
20345 } else {
20346 // Reset whenever we switch roots.
20347 lastCommittedRootDuringThisBatch = root;
20348 nestedUpdateCount = 0;
20349 }
20350 unstable_runWithPriority(unstable_ImmediatePriority, function () {
20351 commitRoot(root, finishedWork);
20352 });
20353}
20354
20355function onUncaughtError(error) {
20356 !(nextFlushedRoot !== null) ? invariant(false, 'Should be working on a root. This error is likely caused by a bug in React. Please file an issue.') : void 0;
20357 // Unschedule this root so we don't work on it again until there's
20358 // another update.
20359 nextFlushedRoot.expirationTime = NoWork;
20360 if (!hasUnhandledError) {
20361 hasUnhandledError = true;
20362 unhandledError = error;
20363 }
20364}
20365
20366// TODO: Batching should be implemented at the renderer level, not inside
20367// the reconciler.
20368function batchedUpdates$1(fn, a) {
20369 var previousIsBatchingUpdates = isBatchingUpdates;
20370 isBatchingUpdates = true;
20371 try {
20372 return fn(a);
20373 } finally {
20374 isBatchingUpdates = previousIsBatchingUpdates;
20375 if (!isBatchingUpdates && !isRendering) {
20376 performSyncWork();
20377 }
20378 }
20379}
20380
20381// TODO: Batching should be implemented at the renderer level, not inside
20382// the reconciler.
20383function unbatchedUpdates(fn, a) {
20384 if (isBatchingUpdates && !isUnbatchingUpdates) {
20385 isUnbatchingUpdates = true;
20386 try {
20387 return fn(a);
20388 } finally {
20389 isUnbatchingUpdates = false;
20390 }
20391 }
20392 return fn(a);
20393}
20394
20395// TODO: Batching should be implemented at the renderer level, not within
20396// the reconciler.
20397function flushSync(fn, a) {
20398 !!isRendering ? invariant(false, 'flushSync was called from inside a lifecycle method. It cannot be called when React is already rendering.') : void 0;
20399 var previousIsBatchingUpdates = isBatchingUpdates;
20400 isBatchingUpdates = true;
20401 try {
20402 return syncUpdates(fn, a);
20403 } finally {
20404 isBatchingUpdates = previousIsBatchingUpdates;
20405 performSyncWork();
20406 }
20407}
20408
20409function interactiveUpdates$1(fn, a, b) {
20410 // If there are any pending interactive updates, synchronously flush them.
20411 // This needs to happen before we read any handlers, because the effect of
20412 // the previous event may influence which handlers are called during
20413 // this event.
20414 if (!isBatchingUpdates && !isRendering && lowestPriorityPendingInteractiveExpirationTime !== NoWork) {
20415 // Synchronously flush pending interactive updates.
20416 performWork(lowestPriorityPendingInteractiveExpirationTime, false);
20417 lowestPriorityPendingInteractiveExpirationTime = NoWork;
20418 }
20419 var previousIsBatchingUpdates = isBatchingUpdates;
20420 isBatchingUpdates = true;
20421 try {
20422 return unstable_runWithPriority(unstable_UserBlockingPriority, function () {
20423 return fn(a, b);
20424 });
20425 } finally {
20426 isBatchingUpdates = previousIsBatchingUpdates;
20427 if (!isBatchingUpdates && !isRendering) {
20428 performSyncWork();
20429 }
20430 }
20431}
20432
20433function flushInteractiveUpdates$1() {
20434 if (!isRendering && lowestPriorityPendingInteractiveExpirationTime !== NoWork) {
20435 // Synchronously flush pending interactive updates.
20436 performWork(lowestPriorityPendingInteractiveExpirationTime, false);
20437 lowestPriorityPendingInteractiveExpirationTime = NoWork;
20438 }
20439}
20440
20441function flushControlled(fn) {
20442 var previousIsBatchingUpdates = isBatchingUpdates;
20443 isBatchingUpdates = true;
20444 try {
20445 syncUpdates(fn);
20446 } finally {
20447 isBatchingUpdates = previousIsBatchingUpdates;
20448 if (!isBatchingUpdates && !isRendering) {
20449 performSyncWork();
20450 }
20451 }
20452}
20453
20454// 0 is PROD, 1 is DEV.
20455// Might add PROFILE later.
20456
20457
20458var didWarnAboutNestedUpdates = void 0;
20459var didWarnAboutFindNodeInStrictMode = void 0;
20460
20461{
20462 didWarnAboutNestedUpdates = false;
20463 didWarnAboutFindNodeInStrictMode = {};
20464}
20465
20466function getContextForSubtree(parentComponent) {
20467 if (!parentComponent) {
20468 return emptyContextObject;
20469 }
20470
20471 var fiber = get(parentComponent);
20472 var parentContext = findCurrentUnmaskedContext(fiber);
20473
20474 if (fiber.tag === ClassComponent) {
20475 var Component = fiber.type;
20476 if (isContextProvider(Component)) {
20477 return processChildContext(fiber, Component, parentContext);
20478 }
20479 }
20480
20481 return parentContext;
20482}
20483
20484function scheduleRootUpdate(current$$1, element, expirationTime, callback) {
20485 {
20486 if (phase === 'render' && current !== null && !didWarnAboutNestedUpdates) {
20487 didWarnAboutNestedUpdates = true;
20488 warningWithoutStack$1(false, 'Render methods should be a pure function of props and state; ' + 'triggering nested component updates from render is not allowed. ' + 'If necessary, trigger nested updates in componentDidUpdate.\n\n' + 'Check the render method of %s.', getComponentName(current.type) || 'Unknown');
20489 }
20490 }
20491
20492 var update = createUpdate(expirationTime);
20493 // Caution: React DevTools currently depends on this property
20494 // being called "element".
20495 update.payload = { element: element };
20496
20497 callback = callback === undefined ? null : callback;
20498 if (callback !== null) {
20499 !(typeof callback === 'function') ? warningWithoutStack$1(false, 'render(...): Expected the last optional `callback` argument to be a ' + 'function. Instead received: %s.', callback) : void 0;
20500 update.callback = callback;
20501 }
20502
20503 flushPassiveEffects();
20504 enqueueUpdate(current$$1, update);
20505 scheduleWork(current$$1, expirationTime);
20506
20507 return expirationTime;
20508}
20509
20510function updateContainerAtExpirationTime(element, container, parentComponent, expirationTime, callback) {
20511 // TODO: If this is a nested container, this won't be the root.
20512 var current$$1 = container.current;
20513
20514 {
20515 if (ReactFiberInstrumentation_1.debugTool) {
20516 if (current$$1.alternate === null) {
20517 ReactFiberInstrumentation_1.debugTool.onMountContainer(container);
20518 } else if (element === null) {
20519 ReactFiberInstrumentation_1.debugTool.onUnmountContainer(container);
20520 } else {
20521 ReactFiberInstrumentation_1.debugTool.onUpdateContainer(container);
20522 }
20523 }
20524 }
20525
20526 var context = getContextForSubtree(parentComponent);
20527 if (container.context === null) {
20528 container.context = context;
20529 } else {
20530 container.pendingContext = context;
20531 }
20532
20533 return scheduleRootUpdate(current$$1, element, expirationTime, callback);
20534}
20535
20536function findHostInstance(component) {
20537 var fiber = get(component);
20538 if (fiber === undefined) {
20539 if (typeof component.render === 'function') {
20540 invariant(false, 'Unable to find node on an unmounted component.');
20541 } else {
20542 invariant(false, 'Argument appears to not be a ReactComponent. Keys: %s', Object.keys(component));
20543 }
20544 }
20545 var hostFiber = findCurrentHostFiber(fiber);
20546 if (hostFiber === null) {
20547 return null;
20548 }
20549 return hostFiber.stateNode;
20550}
20551
20552function findHostInstanceWithWarning(component, methodName) {
20553 {
20554 var fiber = get(component);
20555 if (fiber === undefined) {
20556 if (typeof component.render === 'function') {
20557 invariant(false, 'Unable to find node on an unmounted component.');
20558 } else {
20559 invariant(false, 'Argument appears to not be a ReactComponent. Keys: %s', Object.keys(component));
20560 }
20561 }
20562 var hostFiber = findCurrentHostFiber(fiber);
20563 if (hostFiber === null) {
20564 return null;
20565 }
20566 if (hostFiber.mode & StrictMode) {
20567 var componentName = getComponentName(fiber.type) || 'Component';
20568 if (!didWarnAboutFindNodeInStrictMode[componentName]) {
20569 didWarnAboutFindNodeInStrictMode[componentName] = true;
20570 if (fiber.mode & StrictMode) {
20571 warningWithoutStack$1(false, '%s is deprecated in StrictMode. ' + '%s was passed an instance of %s which is inside StrictMode. ' + 'Instead, add a ref directly to the element you want to reference.' + '\n%s' + '\n\nLearn more about using refs safely here:' + '\nhttps://fb.me/react-strict-mode-find-node', methodName, methodName, componentName, getStackByFiberInDevAndProd(hostFiber));
20572 } else {
20573 warningWithoutStack$1(false, '%s is deprecated in StrictMode. ' + '%s was passed an instance of %s which renders StrictMode children. ' + 'Instead, add a ref directly to the element you want to reference.' + '\n%s' + '\n\nLearn more about using refs safely here:' + '\nhttps://fb.me/react-strict-mode-find-node', methodName, methodName, componentName, getStackByFiberInDevAndProd(hostFiber));
20574 }
20575 }
20576 }
20577 return hostFiber.stateNode;
20578 }
20579 return findHostInstance(component);
20580}
20581
20582function createContainer(containerInfo, isConcurrent, hydrate) {
20583 return createFiberRoot(containerInfo, isConcurrent, hydrate);
20584}
20585
20586function updateContainer(element, container, parentComponent, callback) {
20587 var current$$1 = container.current;
20588 var currentTime = requestCurrentTime();
20589 var expirationTime = computeExpirationForFiber(currentTime, current$$1);
20590 return updateContainerAtExpirationTime(element, container, parentComponent, expirationTime, callback);
20591}
20592
20593function getPublicRootInstance(container) {
20594 var containerFiber = container.current;
20595 if (!containerFiber.child) {
20596 return null;
20597 }
20598 switch (containerFiber.child.tag) {
20599 case HostComponent:
20600 return getPublicInstance(containerFiber.child.stateNode);
20601 default:
20602 return containerFiber.child.stateNode;
20603 }
20604}
20605
20606function findHostInstanceWithNoPortals(fiber) {
20607 var hostFiber = findCurrentHostFiberWithNoPortals(fiber);
20608 if (hostFiber === null) {
20609 return null;
20610 }
20611 return hostFiber.stateNode;
20612}
20613
20614var overrideProps = null;
20615
20616{
20617 var copyWithSetImpl = function (obj, path, idx, value) {
20618 if (idx >= path.length) {
20619 return value;
20620 }
20621 var key = path[idx];
20622 var updated = Array.isArray(obj) ? obj.slice() : _assign({}, obj);
20623 // $FlowFixMe number or string is fine here
20624 updated[key] = copyWithSetImpl(obj[key], path, idx + 1, value);
20625 return updated;
20626 };
20627
20628 var copyWithSet = function (obj, path, value) {
20629 return copyWithSetImpl(obj, path, 0, value);
20630 };
20631
20632 // Support DevTools props for function components, forwardRef, memo, host components, etc.
20633 overrideProps = function (fiber, path, value) {
20634 flushPassiveEffects();
20635 fiber.pendingProps = copyWithSet(fiber.memoizedProps, path, value);
20636 if (fiber.alternate) {
20637 fiber.alternate.pendingProps = fiber.pendingProps;
20638 }
20639 scheduleWork(fiber, Sync);
20640 };
20641}
20642
20643function injectIntoDevTools(devToolsConfig) {
20644 var findFiberByHostInstance = devToolsConfig.findFiberByHostInstance;
20645 var ReactCurrentDispatcher = ReactSharedInternals.ReactCurrentDispatcher;
20646
20647
20648 return injectInternals(_assign({}, devToolsConfig, {
20649 overrideProps: overrideProps,
20650 currentDispatcherRef: ReactCurrentDispatcher,
20651 findHostInstanceByFiber: function (fiber) {
20652 var hostFiber = findCurrentHostFiber(fiber);
20653 if (hostFiber === null) {
20654 return null;
20655 }
20656 return hostFiber.stateNode;
20657 },
20658 findFiberByHostInstance: function (instance) {
20659 if (!findFiberByHostInstance) {
20660 // Might not be implemented by the renderer.
20661 return null;
20662 }
20663 return findFiberByHostInstance(instance);
20664 }
20665 }));
20666}
20667
20668// This file intentionally does *not* have the Flow annotation.
20669// Don't add it. See `./inline-typed.js` for an explanation.
20670
20671function createPortal$1(children, containerInfo,
20672// TODO: figure out the API for cross-renderer implementation.
20673implementation) {
20674 var key = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : null;
20675
20676 return {
20677 // This tag allow us to uniquely identify this as a React Portal
20678 $$typeof: REACT_PORTAL_TYPE,
20679 key: key == null ? null : '' + key,
20680 children: children,
20681 containerInfo: containerInfo,
20682 implementation: implementation
20683 };
20684}
20685
20686// TODO: this is special because it gets imported during build.
20687
20688var ReactVersion = '16.8.2';
20689
20690// This file is copy paste from ReactDOM with adjusted paths
20691// and a different host config import (react-reconciler/inline.fire).
20692// TODO: real implementation.
20693// console.log('Hello from Fire entry point.');
20694
20695// TODO: This type is shared between the reconciler and ReactDOM, but will
20696// eventually be lifted out to the renderer.
20697
20698var ReactCurrentOwner = ReactSharedInternals.ReactCurrentOwner;
20699
20700var topLevelUpdateWarnings = void 0;
20701var warnOnInvalidCallback = void 0;
20702var didWarnAboutUnstableCreatePortal = false;
20703
20704{
20705 if (typeof Map !== 'function' ||
20706 // $FlowIssue Flow incorrectly thinks Map has no prototype
20707 Map.prototype == null || typeof Map.prototype.forEach !== 'function' || typeof Set !== 'function' ||
20708 // $FlowIssue Flow incorrectly thinks Set has no prototype
20709 Set.prototype == null || typeof Set.prototype.clear !== 'function' || typeof Set.prototype.forEach !== 'function') {
20710 warningWithoutStack$1(false, 'React depends on Map and Set built-in types. Make sure that you load a ' + 'polyfill in older browsers. https://fb.me/react-polyfills');
20711 }
20712
20713 topLevelUpdateWarnings = function (container) {
20714 if (container._reactRootContainer && container.nodeType !== COMMENT_NODE) {
20715 var hostInstance = findHostInstanceWithNoPortals(container._reactRootContainer._internalRoot.current);
20716 if (hostInstance) {
20717 !(hostInstance.parentNode === container) ? warningWithoutStack$1(false, 'render(...): It looks like the React-rendered content of this ' + 'container was removed without using React. This is not ' + 'supported and will cause errors. Instead, call ' + 'ReactDOM.unmountComponentAtNode to empty a container.') : void 0;
20718 }
20719 }
20720
20721 var isRootRenderedBySomeReact = !!container._reactRootContainer;
20722 var rootEl = getReactRootElementInContainer(container);
20723 var hasNonRootReactChild = !!(rootEl && getInstanceFromNode$1(rootEl));
20724
20725 !(!hasNonRootReactChild || isRootRenderedBySomeReact) ? warningWithoutStack$1(false, 'render(...): Replacing React-rendered children with a new root ' + 'component. If you intended to update the children of this node, ' + 'you should instead have the existing children update their state ' + 'and render the new components instead of calling ReactDOM.render.') : void 0;
20726
20727 !(container.nodeType !== ELEMENT_NODE || !container.tagName || container.tagName.toUpperCase() !== 'BODY') ? warningWithoutStack$1(false, 'render(): Rendering components directly into document.body is ' + 'discouraged, since its children are often manipulated by third-party ' + 'scripts and browser extensions. This may lead to subtle ' + 'reconciliation issues. Try rendering into a container element created ' + 'for your app.') : void 0;
20728 };
20729
20730 warnOnInvalidCallback = function (callback, callerName) {
20731 !(callback === null || typeof callback === 'function') ? warningWithoutStack$1(false, '%s(...): Expected the last optional `callback` argument to be a ' + 'function. Instead received: %s.', callerName, callback) : void 0;
20732 };
20733}
20734
20735setRestoreImplementation(restoreControlledState$1);
20736
20737function ReactBatch(root) {
20738 var expirationTime = computeUniqueAsyncExpiration();
20739 this._expirationTime = expirationTime;
20740 this._root = root;
20741 this._next = null;
20742 this._callbacks = null;
20743 this._didComplete = false;
20744 this._hasChildren = false;
20745 this._children = null;
20746 this._defer = true;
20747}
20748ReactBatch.prototype.render = function (children) {
20749 !this._defer ? invariant(false, 'batch.render: Cannot render a batch that already committed.') : void 0;
20750 this._hasChildren = true;
20751 this._children = children;
20752 var internalRoot = this._root._internalRoot;
20753 var expirationTime = this._expirationTime;
20754 var work = new ReactWork();
20755 updateContainerAtExpirationTime(children, internalRoot, null, expirationTime, work._onCommit);
20756 return work;
20757};
20758ReactBatch.prototype.then = function (onComplete) {
20759 if (this._didComplete) {
20760 onComplete();
20761 return;
20762 }
20763 var callbacks = this._callbacks;
20764 if (callbacks === null) {
20765 callbacks = this._callbacks = [];
20766 }
20767 callbacks.push(onComplete);
20768};
20769ReactBatch.prototype.commit = function () {
20770 var internalRoot = this._root._internalRoot;
20771 var firstBatch = internalRoot.firstBatch;
20772 !(this._defer && firstBatch !== null) ? invariant(false, 'batch.commit: Cannot commit a batch multiple times.') : void 0;
20773
20774 if (!this._hasChildren) {
20775 // This batch is empty. Return.
20776 this._next = null;
20777 this._defer = false;
20778 return;
20779 }
20780
20781 var expirationTime = this._expirationTime;
20782
20783 // Ensure this is the first batch in the list.
20784 if (firstBatch !== this) {
20785 // This batch is not the earliest batch. We need to move it to the front.
20786 // Update its expiration time to be the expiration time of the earliest
20787 // batch, so that we can flush it without flushing the other batches.
20788 if (this._hasChildren) {
20789 expirationTime = this._expirationTime = firstBatch._expirationTime;
20790 // Rendering this batch again ensures its children will be the final state
20791 // when we flush (updates are processed in insertion order: last
20792 // update wins).
20793 // TODO: This forces a restart. Should we print a warning?
20794 this.render(this._children);
20795 }
20796
20797 // Remove the batch from the list.
20798 var previous = null;
20799 var batch = firstBatch;
20800 while (batch !== this) {
20801 previous = batch;
20802 batch = batch._next;
20803 }
20804 !(previous !== null) ? invariant(false, 'batch.commit: Cannot commit a batch multiple times.') : void 0;
20805 previous._next = batch._next;
20806
20807 // Add it to the front.
20808 this._next = firstBatch;
20809 firstBatch = internalRoot.firstBatch = this;
20810 }
20811
20812 // Synchronously flush all the work up to this batch's expiration time.
20813 this._defer = false;
20814 flushRoot(internalRoot, expirationTime);
20815
20816 // Pop the batch from the list.
20817 var next = this._next;
20818 this._next = null;
20819 firstBatch = internalRoot.firstBatch = next;
20820
20821 // Append the next earliest batch's children to the update queue.
20822 if (firstBatch !== null && firstBatch._hasChildren) {
20823 firstBatch.render(firstBatch._children);
20824 }
20825};
20826ReactBatch.prototype._onComplete = function () {
20827 if (this._didComplete) {
20828 return;
20829 }
20830 this._didComplete = true;
20831 var callbacks = this._callbacks;
20832 if (callbacks === null) {
20833 return;
20834 }
20835 // TODO: Error handling.
20836 for (var i = 0; i < callbacks.length; i++) {
20837 var _callback = callbacks[i];
20838 _callback();
20839 }
20840};
20841
20842function ReactWork() {
20843 this._callbacks = null;
20844 this._didCommit = false;
20845 // TODO: Avoid need to bind by replacing callbacks in the update queue with
20846 // list of Work objects.
20847 this._onCommit = this._onCommit.bind(this);
20848}
20849ReactWork.prototype.then = function (onCommit) {
20850 if (this._didCommit) {
20851 onCommit();
20852 return;
20853 }
20854 var callbacks = this._callbacks;
20855 if (callbacks === null) {
20856 callbacks = this._callbacks = [];
20857 }
20858 callbacks.push(onCommit);
20859};
20860ReactWork.prototype._onCommit = function () {
20861 if (this._didCommit) {
20862 return;
20863 }
20864 this._didCommit = true;
20865 var callbacks = this._callbacks;
20866 if (callbacks === null) {
20867 return;
20868 }
20869 // TODO: Error handling.
20870 for (var i = 0; i < callbacks.length; i++) {
20871 var _callback2 = callbacks[i];
20872 !(typeof _callback2 === 'function') ? invariant(false, 'Invalid argument passed as callback. Expected a function. Instead received: %s', _callback2) : void 0;
20873 _callback2();
20874 }
20875};
20876
20877function ReactRoot(container, isConcurrent, hydrate) {
20878 var root = createContainer(container, isConcurrent, hydrate);
20879 this._internalRoot = root;
20880}
20881ReactRoot.prototype.render = function (children, callback) {
20882 var root = this._internalRoot;
20883 var work = new ReactWork();
20884 callback = callback === undefined ? null : callback;
20885 {
20886 warnOnInvalidCallback(callback, 'render');
20887 }
20888 if (callback !== null) {
20889 work.then(callback);
20890 }
20891 updateContainer(children, root, null, work._onCommit);
20892 return work;
20893};
20894ReactRoot.prototype.unmount = function (callback) {
20895 var root = this._internalRoot;
20896 var work = new ReactWork();
20897 callback = callback === undefined ? null : callback;
20898 {
20899 warnOnInvalidCallback(callback, 'render');
20900 }
20901 if (callback !== null) {
20902 work.then(callback);
20903 }
20904 updateContainer(null, root, null, work._onCommit);
20905 return work;
20906};
20907ReactRoot.prototype.legacy_renderSubtreeIntoContainer = function (parentComponent, children, callback) {
20908 var root = this._internalRoot;
20909 var work = new ReactWork();
20910 callback = callback === undefined ? null : callback;
20911 {
20912 warnOnInvalidCallback(callback, 'render');
20913 }
20914 if (callback !== null) {
20915 work.then(callback);
20916 }
20917 updateContainer(children, root, parentComponent, work._onCommit);
20918 return work;
20919};
20920ReactRoot.prototype.createBatch = function () {
20921 var batch = new ReactBatch(this);
20922 var expirationTime = batch._expirationTime;
20923
20924 var internalRoot = this._internalRoot;
20925 var firstBatch = internalRoot.firstBatch;
20926 if (firstBatch === null) {
20927 internalRoot.firstBatch = batch;
20928 batch._next = null;
20929 } else {
20930 // Insert sorted by expiration time then insertion order
20931 var insertAfter = null;
20932 var insertBefore = firstBatch;
20933 while (insertBefore !== null && insertBefore._expirationTime >= expirationTime) {
20934 insertAfter = insertBefore;
20935 insertBefore = insertBefore._next;
20936 }
20937 batch._next = insertBefore;
20938 if (insertAfter !== null) {
20939 insertAfter._next = batch;
20940 }
20941 }
20942
20943 return batch;
20944};
20945
20946/**
20947 * True if the supplied DOM node is a valid node element.
20948 *
20949 * @param {?DOMElement} node The candidate DOM node.
20950 * @return {boolean} True if the DOM is a valid DOM node.
20951 * @internal
20952 */
20953function isValidContainer(node) {
20954 return !!(node && (node.nodeType === ELEMENT_NODE || node.nodeType === DOCUMENT_NODE || node.nodeType === DOCUMENT_FRAGMENT_NODE || node.nodeType === COMMENT_NODE && node.nodeValue === ' react-mount-point-unstable '));
20955}
20956
20957function getReactRootElementInContainer(container) {
20958 if (!container) {
20959 return null;
20960 }
20961
20962 if (container.nodeType === DOCUMENT_NODE) {
20963 return container.documentElement;
20964 } else {
20965 return container.firstChild;
20966 }
20967}
20968
20969function shouldHydrateDueToLegacyHeuristic(container) {
20970 var rootElement = getReactRootElementInContainer(container);
20971 return !!(rootElement && rootElement.nodeType === ELEMENT_NODE && rootElement.hasAttribute(ROOT_ATTRIBUTE_NAME));
20972}
20973
20974setBatchingImplementation(batchedUpdates$1, interactiveUpdates$1, flushInteractiveUpdates$1);
20975
20976var warnedAboutHydrateAPI = false;
20977
20978function legacyCreateRootFromDOMContainer(container, forceHydrate) {
20979 var shouldHydrate = forceHydrate || shouldHydrateDueToLegacyHeuristic(container);
20980 // First clear any existing content.
20981 if (!shouldHydrate) {
20982 var warned = false;
20983 var rootSibling = void 0;
20984 while (rootSibling = container.lastChild) {
20985 {
20986 if (!warned && rootSibling.nodeType === ELEMENT_NODE && rootSibling.hasAttribute(ROOT_ATTRIBUTE_NAME)) {
20987 warned = true;
20988 warningWithoutStack$1(false, 'render(): Target node has markup rendered by React, but there ' + 'are unrelated nodes as well. This is most commonly caused by ' + 'white-space inserted around server-rendered markup.');
20989 }
20990 }
20991 container.removeChild(rootSibling);
20992 }
20993 }
20994 {
20995 if (shouldHydrate && !forceHydrate && !warnedAboutHydrateAPI) {
20996 warnedAboutHydrateAPI = true;
20997 lowPriorityWarning$1(false, 'render(): Calling ReactDOM.render() to hydrate server-rendered markup ' + 'will stop working in React v17. Replace the ReactDOM.render() call ' + 'with ReactDOM.hydrate() if you want React to attach to the server HTML.');
20998 }
20999 }
21000 // Legacy roots are not async by default.
21001 var isConcurrent = false;
21002 return new ReactRoot(container, isConcurrent, shouldHydrate);
21003}
21004
21005function legacyRenderSubtreeIntoContainer(parentComponent, children, container, forceHydrate, callback) {
21006 {
21007 topLevelUpdateWarnings(container);
21008 }
21009
21010 // TODO: Without `any` type, Flow says "Property cannot be accessed on any
21011 // member of intersection type." Whyyyyyy.
21012 var root = container._reactRootContainer;
21013 if (!root) {
21014 // Initial mount
21015 root = container._reactRootContainer = legacyCreateRootFromDOMContainer(container, forceHydrate);
21016 if (typeof callback === 'function') {
21017 var originalCallback = callback;
21018 callback = function () {
21019 var instance = getPublicRootInstance(root._internalRoot);
21020 originalCallback.call(instance);
21021 };
21022 }
21023 // Initial mount should not be batched.
21024 unbatchedUpdates(function () {
21025 if (parentComponent != null) {
21026 root.legacy_renderSubtreeIntoContainer(parentComponent, children, callback);
21027 } else {
21028 root.render(children, callback);
21029 }
21030 });
21031 } else {
21032 if (typeof callback === 'function') {
21033 var _originalCallback = callback;
21034 callback = function () {
21035 var instance = getPublicRootInstance(root._internalRoot);
21036 _originalCallback.call(instance);
21037 };
21038 }
21039 // Update
21040 if (parentComponent != null) {
21041 root.legacy_renderSubtreeIntoContainer(parentComponent, children, callback);
21042 } else {
21043 root.render(children, callback);
21044 }
21045 }
21046 return getPublicRootInstance(root._internalRoot);
21047}
21048
21049function createPortal$$1(children, container) {
21050 var key = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : null;
21051
21052 !isValidContainer(container) ? invariant(false, 'Target container is not a DOM element.') : void 0;
21053 // TODO: pass ReactDOM portal implementation as third argument
21054 return createPortal$1(children, container, null, key);
21055}
21056
21057var ReactDOM = {
21058 createPortal: createPortal$$1,
21059
21060 findDOMNode: function (componentOrElement) {
21061 {
21062 var owner = ReactCurrentOwner.current;
21063 if (owner !== null && owner.stateNode !== null) {
21064 var warnedAboutRefsInRender = owner.stateNode._warnedAboutRefsInRender;
21065 !warnedAboutRefsInRender ? warningWithoutStack$1(false, '%s is accessing findDOMNode inside its render(). ' + 'render() should be a pure function of props and state. It should ' + 'never access something that requires stale data from the previous ' + 'render, such as refs. Move this logic to componentDidMount and ' + 'componentDidUpdate instead.', getComponentName(owner.type) || 'A component') : void 0;
21066 owner.stateNode._warnedAboutRefsInRender = true;
21067 }
21068 }
21069 if (componentOrElement == null) {
21070 return null;
21071 }
21072 if (componentOrElement.nodeType === ELEMENT_NODE) {
21073 return componentOrElement;
21074 }
21075 {
21076 return findHostInstanceWithWarning(componentOrElement, 'findDOMNode');
21077 }
21078 return findHostInstance(componentOrElement);
21079 },
21080 hydrate: function (element, container, callback) {
21081 !isValidContainer(container) ? invariant(false, 'Target container is not a DOM element.') : void 0;
21082 {
21083 !!container._reactHasBeenPassedToCreateRootDEV ? warningWithoutStack$1(false, 'You are calling ReactDOM.hydrate() on a container that was previously ' + 'passed to ReactDOM.%s(). This is not supported. ' + 'Did you mean to call createRoot(container, {hydrate: true}).render(element)?', enableStableConcurrentModeAPIs ? 'createRoot' : 'unstable_createRoot') : void 0;
21084 }
21085 // TODO: throw or warn if we couldn't hydrate?
21086 return legacyRenderSubtreeIntoContainer(null, element, container, true, callback);
21087 },
21088 render: function (element, container, callback) {
21089 !isValidContainer(container) ? invariant(false, 'Target container is not a DOM element.') : void 0;
21090 {
21091 !!container._reactHasBeenPassedToCreateRootDEV ? warningWithoutStack$1(false, 'You are calling ReactDOM.render() on a container that was previously ' + 'passed to ReactDOM.%s(). This is not supported. ' + 'Did you mean to call root.render(element)?', enableStableConcurrentModeAPIs ? 'createRoot' : 'unstable_createRoot') : void 0;
21092 }
21093 return legacyRenderSubtreeIntoContainer(null, element, container, false, callback);
21094 },
21095 unstable_renderSubtreeIntoContainer: function (parentComponent, element, containerNode, callback) {
21096 !isValidContainer(containerNode) ? invariant(false, 'Target container is not a DOM element.') : void 0;
21097 !(parentComponent != null && has(parentComponent)) ? invariant(false, 'parentComponent must be a valid React Component') : void 0;
21098 return legacyRenderSubtreeIntoContainer(parentComponent, element, containerNode, false, callback);
21099 },
21100 unmountComponentAtNode: function (container) {
21101 !isValidContainer(container) ? invariant(false, 'unmountComponentAtNode(...): Target container is not a DOM element.') : void 0;
21102
21103 {
21104 !!container._reactHasBeenPassedToCreateRootDEV ? warningWithoutStack$1(false, 'You are calling ReactDOM.unmountComponentAtNode() on a container that was previously ' + 'passed to ReactDOM.%s(). This is not supported. Did you mean to call root.unmount()?', enableStableConcurrentModeAPIs ? 'createRoot' : 'unstable_createRoot') : void 0;
21105 }
21106
21107 if (container._reactRootContainer) {
21108 {
21109 var rootEl = getReactRootElementInContainer(container);
21110 var renderedByDifferentReact = rootEl && !getInstanceFromNode$1(rootEl);
21111 !!renderedByDifferentReact ? warningWithoutStack$1(false, "unmountComponentAtNode(): The node you're attempting to unmount " + 'was rendered by another copy of React.') : void 0;
21112 }
21113
21114 // Unmount should not be batched.
21115 unbatchedUpdates(function () {
21116 legacyRenderSubtreeIntoContainer(null, null, container, false, function () {
21117 container._reactRootContainer = null;
21118 });
21119 });
21120 // If you call unmountComponentAtNode twice in quick succession, you'll
21121 // get `true` twice. That's probably fine?
21122 return true;
21123 } else {
21124 {
21125 var _rootEl = getReactRootElementInContainer(container);
21126 var hasNonRootReactChild = !!(_rootEl && getInstanceFromNode$1(_rootEl));
21127
21128 // Check if the container itself is a React root node.
21129 var isContainerReactRoot = container.nodeType === ELEMENT_NODE && isValidContainer(container.parentNode) && !!container.parentNode._reactRootContainer;
21130
21131 !!hasNonRootReactChild ? warningWithoutStack$1(false, "unmountComponentAtNode(): The node you're attempting to unmount " + 'was rendered by React and is not a top-level container. %s', isContainerReactRoot ? 'You may have accidentally passed in a React root node instead ' + 'of its container.' : 'Instead, have the parent component update its state and ' + 'rerender in order to remove this component.') : void 0;
21132 }
21133
21134 return false;
21135 }
21136 },
21137
21138
21139 // Temporary alias since we already shipped React 16 RC with it.
21140 // TODO: remove in React 17.
21141 unstable_createPortal: function () {
21142 if (!didWarnAboutUnstableCreatePortal) {
21143 didWarnAboutUnstableCreatePortal = true;
21144 lowPriorityWarning$1(false, 'The ReactDOM.unstable_createPortal() alias has been deprecated, ' + 'and will be removed in React 17+. Update your code to use ' + 'ReactDOM.createPortal() instead. It has the exact same API, ' + 'but without the "unstable_" prefix.');
21145 }
21146 return createPortal$$1.apply(undefined, arguments);
21147 },
21148
21149
21150 unstable_batchedUpdates: batchedUpdates$1,
21151
21152 unstable_interactiveUpdates: interactiveUpdates$1,
21153
21154 flushSync: flushSync,
21155
21156 unstable_createRoot: createRoot,
21157 unstable_flushControlled: flushControlled,
21158
21159 __SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED: {
21160 // Keep in sync with ReactDOMUnstableNativeDependencies.js
21161 // and ReactTestUtils.js. This is an array for better minification.
21162 Events: [getInstanceFromNode$1, getNodeFromInstance$1, getFiberCurrentPropsFromNode$1, injection.injectEventPluginsByName, eventNameDispatchConfigs, accumulateTwoPhaseDispatches, accumulateDirectDispatches, enqueueStateRestore, restoreStateIfNeeded, dispatchEvent, runEventsInBatch]
21163 }
21164};
21165
21166function createRoot(container, options) {
21167 var functionName = enableStableConcurrentModeAPIs ? 'createRoot' : 'unstable_createRoot';
21168 !isValidContainer(container) ? invariant(false, '%s(...): Target container is not a DOM element.', functionName) : void 0;
21169 {
21170 !!container._reactRootContainer ? warningWithoutStack$1(false, 'You are calling ReactDOM.%s() on a container that was previously ' + 'passed to ReactDOM.render(). This is not supported.', enableStableConcurrentModeAPIs ? 'createRoot' : 'unstable_createRoot') : void 0;
21171 container._reactHasBeenPassedToCreateRootDEV = true;
21172 }
21173 var hydrate = options != null && options.hydrate === true;
21174 return new ReactRoot(container, true, hydrate);
21175}
21176
21177if (enableStableConcurrentModeAPIs) {
21178 ReactDOM.createRoot = createRoot;
21179 ReactDOM.unstable_createRoot = undefined;
21180}
21181
21182var foundDevTools = injectIntoDevTools({
21183 findFiberByHostInstance: getClosestInstanceFromNode,
21184 bundleType: 1,
21185 version: ReactVersion,
21186 rendererPackageName: 'react-dom'
21187});
21188
21189{
21190 if (!foundDevTools && canUseDOM && window.top === window.self) {
21191 // If we're in Chrome or Firefox, provide a download link if not installed.
21192 if (navigator.userAgent.indexOf('Chrome') > -1 && navigator.userAgent.indexOf('Edge') === -1 || navigator.userAgent.indexOf('Firefox') > -1) {
21193 var protocol = window.location.protocol;
21194 // Don't warn in exotic cases like chrome-extension://.
21195 if (/^(https?|file):$/.test(protocol)) {
21196 console.info('%cDownload the React DevTools ' + 'for a better development experience: ' + 'https://fb.me/react-devtools' + (protocol === 'file:' ? '\nYou might need to use a local HTTP server (instead of file://): ' + 'https://fb.me/react-devtools-faq' : ''), 'font-weight:bold');
21197 }
21198 }
21199 }
21200}
21201
21202
21203
21204var ReactFire = Object.freeze({
21205 default: ReactDOM
21206});
21207
21208var ReactFire$1 = ( ReactFire && ReactDOM ) || ReactFire;
21209
21210// TODO: decide on the top-level export form.
21211// This is hacky but makes it work with both Rollup and Jest.
21212var unstableFire = ReactFire$1.default || ReactFire$1;
21213
21214return unstableFire;
21215
21216})));