UNPKG

790 kBJavaScriptView Raw
1/** @license React v16.8.5
2 * react-dom.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.ReactDOM = 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` and `size`
7737 // attributes on `select`s needs to be added before `option`s are inserted.
7738 // This prevents:
7739 // - a bug where the `select` does not scroll to the correct option because singular
7740 // `select` elements automatically pick the first item #13222
7741 // - a bug where the `select` set the first item as selected despite the `size` attribute #14239
7742 // See https://github.com/facebook/react/issues/13222
7743 // and https://github.com/facebook/react/issues/14239
7744 if (type === 'select') {
7745 var node = domElement;
7746 if (props.multiple) {
7747 node.multiple = true;
7748 } else if (props.size) {
7749 // Setting a size greater than 1 causes a select to behave like `multiple=true`, where
7750 // it is possible that no option is selected.
7751 //
7752 // This is only necessary when a select in "single selection mode".
7753 node.size = props.size;
7754 }
7755 }
7756 }
7757 } else {
7758 domElement = ownerDocument.createElementNS(namespaceURI, type);
7759 }
7760
7761 {
7762 if (namespaceURI === HTML_NAMESPACE) {
7763 if (!isCustomComponentTag && Object.prototype.toString.call(domElement) === '[object HTMLUnknownElement]' && !Object.prototype.hasOwnProperty.call(warnedUnknownTags, type)) {
7764 warnedUnknownTags[type] = true;
7765 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);
7766 }
7767 }
7768 }
7769
7770 return domElement;
7771}
7772
7773function createTextNode(text, rootContainerElement) {
7774 return getOwnerDocumentFromRootContainer(rootContainerElement).createTextNode(text);
7775}
7776
7777function setInitialProperties(domElement, tag, rawProps, rootContainerElement) {
7778 var isCustomComponentTag = isCustomComponent(tag, rawProps);
7779 {
7780 validatePropertiesInDevelopment(tag, rawProps);
7781 if (isCustomComponentTag && !didWarnShadyDOM && domElement.shadyRoot) {
7782 warning$1(false, '%s is using shady DOM. Using shady DOM with React can ' + 'cause things to break subtly.', getCurrentFiberOwnerNameInDevOrNull() || 'A component');
7783 didWarnShadyDOM = true;
7784 }
7785 }
7786
7787 // TODO: Make sure that we check isMounted before firing any of these events.
7788 var props = void 0;
7789 switch (tag) {
7790 case 'iframe':
7791 case 'object':
7792 trapBubbledEvent(TOP_LOAD, domElement);
7793 props = rawProps;
7794 break;
7795 case 'video':
7796 case 'audio':
7797 // Create listener for each media event
7798 for (var i = 0; i < mediaEventTypes.length; i++) {
7799 trapBubbledEvent(mediaEventTypes[i], domElement);
7800 }
7801 props = rawProps;
7802 break;
7803 case 'source':
7804 trapBubbledEvent(TOP_ERROR, domElement);
7805 props = rawProps;
7806 break;
7807 case 'img':
7808 case 'image':
7809 case 'link':
7810 trapBubbledEvent(TOP_ERROR, domElement);
7811 trapBubbledEvent(TOP_LOAD, domElement);
7812 props = rawProps;
7813 break;
7814 case 'form':
7815 trapBubbledEvent(TOP_RESET, domElement);
7816 trapBubbledEvent(TOP_SUBMIT, domElement);
7817 props = rawProps;
7818 break;
7819 case 'details':
7820 trapBubbledEvent(TOP_TOGGLE, domElement);
7821 props = rawProps;
7822 break;
7823 case 'input':
7824 initWrapperState(domElement, rawProps);
7825 props = getHostProps(domElement, rawProps);
7826 trapBubbledEvent(TOP_INVALID, domElement);
7827 // For controlled components we always need to ensure we're listening
7828 // to onChange. Even if there is no listener.
7829 ensureListeningTo(rootContainerElement, 'onChange');
7830 break;
7831 case 'option':
7832 validateProps(domElement, rawProps);
7833 props = getHostProps$1(domElement, rawProps);
7834 break;
7835 case 'select':
7836 initWrapperState$1(domElement, rawProps);
7837 props = getHostProps$2(domElement, rawProps);
7838 trapBubbledEvent(TOP_INVALID, domElement);
7839 // For controlled components we always need to ensure we're listening
7840 // to onChange. Even if there is no listener.
7841 ensureListeningTo(rootContainerElement, 'onChange');
7842 break;
7843 case 'textarea':
7844 initWrapperState$2(domElement, rawProps);
7845 props = getHostProps$3(domElement, rawProps);
7846 trapBubbledEvent(TOP_INVALID, domElement);
7847 // For controlled components we always need to ensure we're listening
7848 // to onChange. Even if there is no listener.
7849 ensureListeningTo(rootContainerElement, 'onChange');
7850 break;
7851 default:
7852 props = rawProps;
7853 }
7854
7855 assertValidProps(tag, props);
7856
7857 setInitialDOMProperties(tag, domElement, rootContainerElement, props, isCustomComponentTag);
7858
7859 switch (tag) {
7860 case 'input':
7861 // TODO: Make sure we check if this is still unmounted or do any clean
7862 // up necessary since we never stop tracking anymore.
7863 track(domElement);
7864 postMountWrapper(domElement, rawProps, false);
7865 break;
7866 case 'textarea':
7867 // TODO: Make sure we check if this is still unmounted or do any clean
7868 // up necessary since we never stop tracking anymore.
7869 track(domElement);
7870 postMountWrapper$3(domElement, rawProps);
7871 break;
7872 case 'option':
7873 postMountWrapper$1(domElement, rawProps);
7874 break;
7875 case 'select':
7876 postMountWrapper$2(domElement, rawProps);
7877 break;
7878 default:
7879 if (typeof props.onClick === 'function') {
7880 // TODO: This cast may not be sound for SVG, MathML or custom elements.
7881 trapClickOnNonInteractiveElement(domElement);
7882 }
7883 break;
7884 }
7885}
7886
7887// Calculate the diff between the two objects.
7888function diffProperties(domElement, tag, lastRawProps, nextRawProps, rootContainerElement) {
7889 {
7890 validatePropertiesInDevelopment(tag, nextRawProps);
7891 }
7892
7893 var updatePayload = null;
7894
7895 var lastProps = void 0;
7896 var nextProps = void 0;
7897 switch (tag) {
7898 case 'input':
7899 lastProps = getHostProps(domElement, lastRawProps);
7900 nextProps = getHostProps(domElement, nextRawProps);
7901 updatePayload = [];
7902 break;
7903 case 'option':
7904 lastProps = getHostProps$1(domElement, lastRawProps);
7905 nextProps = getHostProps$1(domElement, nextRawProps);
7906 updatePayload = [];
7907 break;
7908 case 'select':
7909 lastProps = getHostProps$2(domElement, lastRawProps);
7910 nextProps = getHostProps$2(domElement, nextRawProps);
7911 updatePayload = [];
7912 break;
7913 case 'textarea':
7914 lastProps = getHostProps$3(domElement, lastRawProps);
7915 nextProps = getHostProps$3(domElement, nextRawProps);
7916 updatePayload = [];
7917 break;
7918 default:
7919 lastProps = lastRawProps;
7920 nextProps = nextRawProps;
7921 if (typeof lastProps.onClick !== 'function' && typeof nextProps.onClick === 'function') {
7922 // TODO: This cast may not be sound for SVG, MathML or custom elements.
7923 trapClickOnNonInteractiveElement(domElement);
7924 }
7925 break;
7926 }
7927
7928 assertValidProps(tag, nextProps);
7929
7930 var propKey = void 0;
7931 var styleName = void 0;
7932 var styleUpdates = null;
7933 for (propKey in lastProps) {
7934 if (nextProps.hasOwnProperty(propKey) || !lastProps.hasOwnProperty(propKey) || lastProps[propKey] == null) {
7935 continue;
7936 }
7937 if (propKey === STYLE$1) {
7938 var lastStyle = lastProps[propKey];
7939 for (styleName in lastStyle) {
7940 if (lastStyle.hasOwnProperty(styleName)) {
7941 if (!styleUpdates) {
7942 styleUpdates = {};
7943 }
7944 styleUpdates[styleName] = '';
7945 }
7946 }
7947 } else if (propKey === DANGEROUSLY_SET_INNER_HTML || propKey === CHILDREN) {
7948 // Noop. This is handled by the clear text mechanism.
7949 } else if (propKey === SUPPRESS_CONTENT_EDITABLE_WARNING || propKey === SUPPRESS_HYDRATION_WARNING$1) {
7950 // Noop
7951 } else if (propKey === AUTOFOCUS) {
7952 // Noop. It doesn't work on updates anyway.
7953 } else if (registrationNameModules.hasOwnProperty(propKey)) {
7954 // This is a special case. If any listener updates we need to ensure
7955 // that the "current" fiber pointer gets updated so we need a commit
7956 // to update this element.
7957 if (!updatePayload) {
7958 updatePayload = [];
7959 }
7960 } else {
7961 // For all other deleted properties we add it to the queue. We use
7962 // the whitelist in the commit phase instead.
7963 (updatePayload = updatePayload || []).push(propKey, null);
7964 }
7965 }
7966 for (propKey in nextProps) {
7967 var nextProp = nextProps[propKey];
7968 var lastProp = lastProps != null ? lastProps[propKey] : undefined;
7969 if (!nextProps.hasOwnProperty(propKey) || nextProp === lastProp || nextProp == null && lastProp == null) {
7970 continue;
7971 }
7972 if (propKey === STYLE$1) {
7973 {
7974 if (nextProp) {
7975 // Freeze the next style object so that we can assume it won't be
7976 // mutated. We have already warned for this in the past.
7977 Object.freeze(nextProp);
7978 }
7979 }
7980 if (lastProp) {
7981 // Unset styles on `lastProp` but not on `nextProp`.
7982 for (styleName in lastProp) {
7983 if (lastProp.hasOwnProperty(styleName) && (!nextProp || !nextProp.hasOwnProperty(styleName))) {
7984 if (!styleUpdates) {
7985 styleUpdates = {};
7986 }
7987 styleUpdates[styleName] = '';
7988 }
7989 }
7990 // Update styles that changed since `lastProp`.
7991 for (styleName in nextProp) {
7992 if (nextProp.hasOwnProperty(styleName) && lastProp[styleName] !== nextProp[styleName]) {
7993 if (!styleUpdates) {
7994 styleUpdates = {};
7995 }
7996 styleUpdates[styleName] = nextProp[styleName];
7997 }
7998 }
7999 } else {
8000 // Relies on `updateStylesByID` not mutating `styleUpdates`.
8001 if (!styleUpdates) {
8002 if (!updatePayload) {
8003 updatePayload = [];
8004 }
8005 updatePayload.push(propKey, styleUpdates);
8006 }
8007 styleUpdates = nextProp;
8008 }
8009 } else if (propKey === DANGEROUSLY_SET_INNER_HTML) {
8010 var nextHtml = nextProp ? nextProp[HTML] : undefined;
8011 var lastHtml = lastProp ? lastProp[HTML] : undefined;
8012 if (nextHtml != null) {
8013 if (lastHtml !== nextHtml) {
8014 (updatePayload = updatePayload || []).push(propKey, '' + nextHtml);
8015 }
8016 } else {
8017 // TODO: It might be too late to clear this if we have children
8018 // inserted already.
8019 }
8020 } else if (propKey === CHILDREN) {
8021 if (lastProp !== nextProp && (typeof nextProp === 'string' || typeof nextProp === 'number')) {
8022 (updatePayload = updatePayload || []).push(propKey, '' + nextProp);
8023 }
8024 } else if (propKey === SUPPRESS_CONTENT_EDITABLE_WARNING || propKey === SUPPRESS_HYDRATION_WARNING$1) {
8025 // Noop
8026 } else if (registrationNameModules.hasOwnProperty(propKey)) {
8027 if (nextProp != null) {
8028 // We eagerly listen to this even though we haven't committed yet.
8029 if (true && typeof nextProp !== 'function') {
8030 warnForInvalidEventListener(propKey, nextProp);
8031 }
8032 ensureListeningTo(rootContainerElement, propKey);
8033 }
8034 if (!updatePayload && lastProp !== nextProp) {
8035 // This is a special case. If any listener updates we need to ensure
8036 // that the "current" props pointer gets updated so we need a commit
8037 // to update this element.
8038 updatePayload = [];
8039 }
8040 } else {
8041 // For any other property we always add it to the queue and then we
8042 // filter it out using the whitelist during the commit.
8043 (updatePayload = updatePayload || []).push(propKey, nextProp);
8044 }
8045 }
8046 if (styleUpdates) {
8047 {
8048 validateShorthandPropertyCollisionInDev(styleUpdates, nextProps[STYLE$1]);
8049 }
8050 (updatePayload = updatePayload || []).push(STYLE$1, styleUpdates);
8051 }
8052 return updatePayload;
8053}
8054
8055// Apply the diff.
8056function updateProperties(domElement, updatePayload, tag, lastRawProps, nextRawProps) {
8057 // Update checked *before* name.
8058 // In the middle of an update, it is possible to have multiple checked.
8059 // When a checked radio tries to change name, browser makes another radio's checked false.
8060 if (tag === 'input' && nextRawProps.type === 'radio' && nextRawProps.name != null) {
8061 updateChecked(domElement, nextRawProps);
8062 }
8063
8064 var wasCustomComponentTag = isCustomComponent(tag, lastRawProps);
8065 var isCustomComponentTag = isCustomComponent(tag, nextRawProps);
8066 // Apply the diff.
8067 updateDOMProperties(domElement, updatePayload, wasCustomComponentTag, isCustomComponentTag);
8068
8069 // TODO: Ensure that an update gets scheduled if any of the special props
8070 // changed.
8071 switch (tag) {
8072 case 'input':
8073 // Update the wrapper around inputs *after* updating props. This has to
8074 // happen after `updateDOMProperties`. Otherwise HTML5 input validations
8075 // raise warnings and prevent the new value from being assigned.
8076 updateWrapper(domElement, nextRawProps);
8077 break;
8078 case 'textarea':
8079 updateWrapper$1(domElement, nextRawProps);
8080 break;
8081 case 'select':
8082 // <select> value update needs to occur after <option> children
8083 // reconciliation
8084 postUpdateWrapper(domElement, nextRawProps);
8085 break;
8086 }
8087}
8088
8089function getPossibleStandardName(propName) {
8090 {
8091 var lowerCasedName = propName.toLowerCase();
8092 if (!possibleStandardNames.hasOwnProperty(lowerCasedName)) {
8093 return null;
8094 }
8095 return possibleStandardNames[lowerCasedName] || null;
8096 }
8097 return null;
8098}
8099
8100function diffHydratedProperties(domElement, tag, rawProps, parentNamespace, rootContainerElement) {
8101 var isCustomComponentTag = void 0;
8102 var extraAttributeNames = void 0;
8103
8104 {
8105 suppressHydrationWarning = rawProps[SUPPRESS_HYDRATION_WARNING$1] === true;
8106 isCustomComponentTag = isCustomComponent(tag, rawProps);
8107 validatePropertiesInDevelopment(tag, rawProps);
8108 if (isCustomComponentTag && !didWarnShadyDOM && domElement.shadyRoot) {
8109 warning$1(false, '%s is using shady DOM. Using shady DOM with React can ' + 'cause things to break subtly.', getCurrentFiberOwnerNameInDevOrNull() || 'A component');
8110 didWarnShadyDOM = true;
8111 }
8112 }
8113
8114 // TODO: Make sure that we check isMounted before firing any of these events.
8115 switch (tag) {
8116 case 'iframe':
8117 case 'object':
8118 trapBubbledEvent(TOP_LOAD, domElement);
8119 break;
8120 case 'video':
8121 case 'audio':
8122 // Create listener for each media event
8123 for (var i = 0; i < mediaEventTypes.length; i++) {
8124 trapBubbledEvent(mediaEventTypes[i], domElement);
8125 }
8126 break;
8127 case 'source':
8128 trapBubbledEvent(TOP_ERROR, domElement);
8129 break;
8130 case 'img':
8131 case 'image':
8132 case 'link':
8133 trapBubbledEvent(TOP_ERROR, domElement);
8134 trapBubbledEvent(TOP_LOAD, domElement);
8135 break;
8136 case 'form':
8137 trapBubbledEvent(TOP_RESET, domElement);
8138 trapBubbledEvent(TOP_SUBMIT, domElement);
8139 break;
8140 case 'details':
8141 trapBubbledEvent(TOP_TOGGLE, domElement);
8142 break;
8143 case 'input':
8144 initWrapperState(domElement, rawProps);
8145 trapBubbledEvent(TOP_INVALID, domElement);
8146 // For controlled components we always need to ensure we're listening
8147 // to onChange. Even if there is no listener.
8148 ensureListeningTo(rootContainerElement, 'onChange');
8149 break;
8150 case 'option':
8151 validateProps(domElement, rawProps);
8152 break;
8153 case 'select':
8154 initWrapperState$1(domElement, rawProps);
8155 trapBubbledEvent(TOP_INVALID, domElement);
8156 // For controlled components we always need to ensure we're listening
8157 // to onChange. Even if there is no listener.
8158 ensureListeningTo(rootContainerElement, 'onChange');
8159 break;
8160 case 'textarea':
8161 initWrapperState$2(domElement, rawProps);
8162 trapBubbledEvent(TOP_INVALID, domElement);
8163 // For controlled components we always need to ensure we're listening
8164 // to onChange. Even if there is no listener.
8165 ensureListeningTo(rootContainerElement, 'onChange');
8166 break;
8167 }
8168
8169 assertValidProps(tag, rawProps);
8170
8171 {
8172 extraAttributeNames = new Set();
8173 var attributes = domElement.attributes;
8174 for (var _i = 0; _i < attributes.length; _i++) {
8175 var name = attributes[_i].name.toLowerCase();
8176 switch (name) {
8177 // Built-in SSR attribute is whitelisted
8178 case 'data-reactroot':
8179 break;
8180 // Controlled attributes are not validated
8181 // TODO: Only ignore them on controlled tags.
8182 case 'value':
8183 break;
8184 case 'checked':
8185 break;
8186 case 'selected':
8187 break;
8188 default:
8189 // Intentionally use the original name.
8190 // See discussion in https://github.com/facebook/react/pull/10676.
8191 extraAttributeNames.add(attributes[_i].name);
8192 }
8193 }
8194 }
8195
8196 var updatePayload = null;
8197 for (var propKey in rawProps) {
8198 if (!rawProps.hasOwnProperty(propKey)) {
8199 continue;
8200 }
8201 var nextProp = rawProps[propKey];
8202 if (propKey === CHILDREN) {
8203 // For text content children we compare against textContent. This
8204 // might match additional HTML that is hidden when we read it using
8205 // textContent. E.g. "foo" will match "f<span>oo</span>" but that still
8206 // satisfies our requirement. Our requirement is not to produce perfect
8207 // HTML and attributes. Ideally we should preserve structure but it's
8208 // ok not to if the visible content is still enough to indicate what
8209 // even listeners these nodes might be wired up to.
8210 // TODO: Warn if there is more than a single textNode as a child.
8211 // TODO: Should we use domElement.firstChild.nodeValue to compare?
8212 if (typeof nextProp === 'string') {
8213 if (domElement.textContent !== nextProp) {
8214 if (true && !suppressHydrationWarning) {
8215 warnForTextDifference(domElement.textContent, nextProp);
8216 }
8217 updatePayload = [CHILDREN, nextProp];
8218 }
8219 } else if (typeof nextProp === 'number') {
8220 if (domElement.textContent !== '' + nextProp) {
8221 if (true && !suppressHydrationWarning) {
8222 warnForTextDifference(domElement.textContent, nextProp);
8223 }
8224 updatePayload = [CHILDREN, '' + nextProp];
8225 }
8226 }
8227 } else if (registrationNameModules.hasOwnProperty(propKey)) {
8228 if (nextProp != null) {
8229 if (true && typeof nextProp !== 'function') {
8230 warnForInvalidEventListener(propKey, nextProp);
8231 }
8232 ensureListeningTo(rootContainerElement, propKey);
8233 }
8234 } else if (true &&
8235 // Convince Flow we've calculated it (it's DEV-only in this method.)
8236 typeof isCustomComponentTag === 'boolean') {
8237 // Validate that the properties correspond to their expected values.
8238 var serverValue = void 0;
8239 var propertyInfo = getPropertyInfo(propKey);
8240 if (suppressHydrationWarning) {
8241 // Don't bother comparing. We're ignoring all these warnings.
8242 } else if (propKey === SUPPRESS_CONTENT_EDITABLE_WARNING || propKey === SUPPRESS_HYDRATION_WARNING$1 ||
8243 // Controlled attributes are not validated
8244 // TODO: Only ignore them on controlled tags.
8245 propKey === 'value' || propKey === 'checked' || propKey === 'selected') {
8246 // Noop
8247 } else if (propKey === DANGEROUSLY_SET_INNER_HTML) {
8248 var serverHTML = domElement.innerHTML;
8249 var nextHtml = nextProp ? nextProp[HTML] : undefined;
8250 var expectedHTML = normalizeHTML(domElement, nextHtml != null ? nextHtml : '');
8251 if (expectedHTML !== serverHTML) {
8252 warnForPropDifference(propKey, serverHTML, expectedHTML);
8253 }
8254 } else if (propKey === STYLE$1) {
8255 // $FlowFixMe - Should be inferred as not undefined.
8256 extraAttributeNames.delete(propKey);
8257
8258 if (canDiffStyleForHydrationWarning) {
8259 var expectedStyle = createDangerousStringForStyles(nextProp);
8260 serverValue = domElement.getAttribute('style');
8261 if (expectedStyle !== serverValue) {
8262 warnForPropDifference(propKey, serverValue, expectedStyle);
8263 }
8264 }
8265 } else if (isCustomComponentTag) {
8266 // $FlowFixMe - Should be inferred as not undefined.
8267 extraAttributeNames.delete(propKey.toLowerCase());
8268 serverValue = getValueForAttribute(domElement, propKey, nextProp);
8269
8270 if (nextProp !== serverValue) {
8271 warnForPropDifference(propKey, serverValue, nextProp);
8272 }
8273 } else if (!shouldIgnoreAttribute(propKey, propertyInfo, isCustomComponentTag) && !shouldRemoveAttribute(propKey, nextProp, propertyInfo, isCustomComponentTag)) {
8274 var isMismatchDueToBadCasing = false;
8275 if (propertyInfo !== null) {
8276 // $FlowFixMe - Should be inferred as not undefined.
8277 extraAttributeNames.delete(propertyInfo.attributeName);
8278 serverValue = getValueForProperty(domElement, propKey, nextProp, propertyInfo);
8279 } else {
8280 var ownNamespace = parentNamespace;
8281 if (ownNamespace === HTML_NAMESPACE) {
8282 ownNamespace = getIntrinsicNamespace(tag);
8283 }
8284 if (ownNamespace === HTML_NAMESPACE) {
8285 // $FlowFixMe - Should be inferred as not undefined.
8286 extraAttributeNames.delete(propKey.toLowerCase());
8287 } else {
8288 var standardName = getPossibleStandardName(propKey);
8289 if (standardName !== null && standardName !== propKey) {
8290 // If an SVG prop is supplied with bad casing, it will
8291 // be successfully parsed from HTML, but will produce a mismatch
8292 // (and would be incorrectly rendered on the client).
8293 // However, we already warn about bad casing elsewhere.
8294 // So we'll skip the misleading extra mismatch warning in this case.
8295 isMismatchDueToBadCasing = true;
8296 // $FlowFixMe - Should be inferred as not undefined.
8297 extraAttributeNames.delete(standardName);
8298 }
8299 // $FlowFixMe - Should be inferred as not undefined.
8300 extraAttributeNames.delete(propKey);
8301 }
8302 serverValue = getValueForAttribute(domElement, propKey, nextProp);
8303 }
8304
8305 if (nextProp !== serverValue && !isMismatchDueToBadCasing) {
8306 warnForPropDifference(propKey, serverValue, nextProp);
8307 }
8308 }
8309 }
8310 }
8311
8312 {
8313 // $FlowFixMe - Should be inferred as not undefined.
8314 if (extraAttributeNames.size > 0 && !suppressHydrationWarning) {
8315 // $FlowFixMe - Should be inferred as not undefined.
8316 warnForExtraAttributes(extraAttributeNames);
8317 }
8318 }
8319
8320 switch (tag) {
8321 case 'input':
8322 // TODO: Make sure we check if this is still unmounted or do any clean
8323 // up necessary since we never stop tracking anymore.
8324 track(domElement);
8325 postMountWrapper(domElement, rawProps, true);
8326 break;
8327 case 'textarea':
8328 // TODO: Make sure we check if this is still unmounted or do any clean
8329 // up necessary since we never stop tracking anymore.
8330 track(domElement);
8331 postMountWrapper$3(domElement, rawProps);
8332 break;
8333 case 'select':
8334 case 'option':
8335 // For input and textarea we current always set the value property at
8336 // post mount to force it to diverge from attributes. However, for
8337 // option and select we don't quite do the same thing and select
8338 // is not resilient to the DOM state changing so we don't do that here.
8339 // TODO: Consider not doing this for input and textarea.
8340 break;
8341 default:
8342 if (typeof rawProps.onClick === 'function') {
8343 // TODO: This cast may not be sound for SVG, MathML or custom elements.
8344 trapClickOnNonInteractiveElement(domElement);
8345 }
8346 break;
8347 }
8348
8349 return updatePayload;
8350}
8351
8352function diffHydratedText(textNode, text) {
8353 var isDifferent = textNode.nodeValue !== text;
8354 return isDifferent;
8355}
8356
8357function warnForUnmatchedText(textNode, text) {
8358 {
8359 warnForTextDifference(textNode.nodeValue, text);
8360 }
8361}
8362
8363function warnForDeletedHydratableElement(parentNode, child) {
8364 {
8365 if (didWarnInvalidHydration) {
8366 return;
8367 }
8368 didWarnInvalidHydration = true;
8369 warningWithoutStack$1(false, 'Did not expect server HTML to contain a <%s> in <%s>.', child.nodeName.toLowerCase(), parentNode.nodeName.toLowerCase());
8370 }
8371}
8372
8373function warnForDeletedHydratableText(parentNode, child) {
8374 {
8375 if (didWarnInvalidHydration) {
8376 return;
8377 }
8378 didWarnInvalidHydration = true;
8379 warningWithoutStack$1(false, 'Did not expect server HTML to contain the text node "%s" in <%s>.', child.nodeValue, parentNode.nodeName.toLowerCase());
8380 }
8381}
8382
8383function warnForInsertedHydratedElement(parentNode, tag, props) {
8384 {
8385 if (didWarnInvalidHydration) {
8386 return;
8387 }
8388 didWarnInvalidHydration = true;
8389 warningWithoutStack$1(false, 'Expected server HTML to contain a matching <%s> in <%s>.', tag, parentNode.nodeName.toLowerCase());
8390 }
8391}
8392
8393function warnForInsertedHydratedText(parentNode, text) {
8394 {
8395 if (text === '') {
8396 // We expect to insert empty text nodes since they're not represented in
8397 // the HTML.
8398 // TODO: Remove this special case if we can just avoid inserting empty
8399 // text nodes.
8400 return;
8401 }
8402 if (didWarnInvalidHydration) {
8403 return;
8404 }
8405 didWarnInvalidHydration = true;
8406 warningWithoutStack$1(false, 'Expected server HTML to contain a matching text node for "%s" in <%s>.', text, parentNode.nodeName.toLowerCase());
8407 }
8408}
8409
8410function restoreControlledState$1(domElement, tag, props) {
8411 switch (tag) {
8412 case 'input':
8413 restoreControlledState(domElement, props);
8414 return;
8415 case 'textarea':
8416 restoreControlledState$3(domElement, props);
8417 return;
8418 case 'select':
8419 restoreControlledState$2(domElement, props);
8420 return;
8421 }
8422}
8423
8424// TODO: direct imports like some-package/src/* are bad. Fix me.
8425var validateDOMNesting = function () {};
8426var updatedAncestorInfo = function () {};
8427
8428{
8429 // This validation code was written based on the HTML5 parsing spec:
8430 // https://html.spec.whatwg.org/multipage/syntax.html#has-an-element-in-scope
8431 //
8432 // Note: this does not catch all invalid nesting, nor does it try to (as it's
8433 // not clear what practical benefit doing so provides); instead, we warn only
8434 // for cases where the parser will give a parse tree differing from what React
8435 // intended. For example, <b><div></div></b> is invalid but we don't warn
8436 // because it still parses correctly; we do warn for other cases like nested
8437 // <p> tags where the beginning of the second element implicitly closes the
8438 // first, causing a confusing mess.
8439
8440 // https://html.spec.whatwg.org/multipage/syntax.html#special
8441 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'];
8442
8443 // https://html.spec.whatwg.org/multipage/syntax.html#has-an-element-in-scope
8444 var inScopeTags = ['applet', 'caption', 'html', 'table', 'td', 'th', 'marquee', 'object', 'template',
8445
8446 // https://html.spec.whatwg.org/multipage/syntax.html#html-integration-point
8447 // TODO: Distinguish by namespace here -- for <title>, including it here
8448 // errs on the side of fewer warnings
8449 'foreignObject', 'desc', 'title'];
8450
8451 // https://html.spec.whatwg.org/multipage/syntax.html#has-an-element-in-button-scope
8452 var buttonScopeTags = inScopeTags.concat(['button']);
8453
8454 // https://html.spec.whatwg.org/multipage/syntax.html#generate-implied-end-tags
8455 var impliedEndTags = ['dd', 'dt', 'li', 'option', 'optgroup', 'p', 'rp', 'rt'];
8456
8457 var emptyAncestorInfo = {
8458 current: null,
8459
8460 formTag: null,
8461 aTagInScope: null,
8462 buttonTagInScope: null,
8463 nobrTagInScope: null,
8464 pTagInButtonScope: null,
8465
8466 listItemTagAutoclosing: null,
8467 dlItemTagAutoclosing: null
8468 };
8469
8470 updatedAncestorInfo = function (oldInfo, tag) {
8471 var ancestorInfo = _assign({}, oldInfo || emptyAncestorInfo);
8472 var info = { tag: tag };
8473
8474 if (inScopeTags.indexOf(tag) !== -1) {
8475 ancestorInfo.aTagInScope = null;
8476 ancestorInfo.buttonTagInScope = null;
8477 ancestorInfo.nobrTagInScope = null;
8478 }
8479 if (buttonScopeTags.indexOf(tag) !== -1) {
8480 ancestorInfo.pTagInButtonScope = null;
8481 }
8482
8483 // See rules for 'li', 'dd', 'dt' start tags in
8484 // https://html.spec.whatwg.org/multipage/syntax.html#parsing-main-inbody
8485 if (specialTags.indexOf(tag) !== -1 && tag !== 'address' && tag !== 'div' && tag !== 'p') {
8486 ancestorInfo.listItemTagAutoclosing = null;
8487 ancestorInfo.dlItemTagAutoclosing = null;
8488 }
8489
8490 ancestorInfo.current = info;
8491
8492 if (tag === 'form') {
8493 ancestorInfo.formTag = info;
8494 }
8495 if (tag === 'a') {
8496 ancestorInfo.aTagInScope = info;
8497 }
8498 if (tag === 'button') {
8499 ancestorInfo.buttonTagInScope = info;
8500 }
8501 if (tag === 'nobr') {
8502 ancestorInfo.nobrTagInScope = info;
8503 }
8504 if (tag === 'p') {
8505 ancestorInfo.pTagInButtonScope = info;
8506 }
8507 if (tag === 'li') {
8508 ancestorInfo.listItemTagAutoclosing = info;
8509 }
8510 if (tag === 'dd' || tag === 'dt') {
8511 ancestorInfo.dlItemTagAutoclosing = info;
8512 }
8513
8514 return ancestorInfo;
8515 };
8516
8517 /**
8518 * Returns whether
8519 */
8520 var isTagValidWithParent = function (tag, parentTag) {
8521 // First, let's check if we're in an unusual parsing mode...
8522 switch (parentTag) {
8523 // https://html.spec.whatwg.org/multipage/syntax.html#parsing-main-inselect
8524 case 'select':
8525 return tag === 'option' || tag === 'optgroup' || tag === '#text';
8526 case 'optgroup':
8527 return tag === 'option' || tag === '#text';
8528 // Strictly speaking, seeing an <option> doesn't mean we're in a <select>
8529 // but
8530 case 'option':
8531 return tag === '#text';
8532 // https://html.spec.whatwg.org/multipage/syntax.html#parsing-main-intd
8533 // https://html.spec.whatwg.org/multipage/syntax.html#parsing-main-incaption
8534 // No special behavior since these rules fall back to "in body" mode for
8535 // all except special table nodes which cause bad parsing behavior anyway.
8536
8537 // https://html.spec.whatwg.org/multipage/syntax.html#parsing-main-intr
8538 case 'tr':
8539 return tag === 'th' || tag === 'td' || tag === 'style' || tag === 'script' || tag === 'template';
8540 // https://html.spec.whatwg.org/multipage/syntax.html#parsing-main-intbody
8541 case 'tbody':
8542 case 'thead':
8543 case 'tfoot':
8544 return tag === 'tr' || tag === 'style' || tag === 'script' || tag === 'template';
8545 // https://html.spec.whatwg.org/multipage/syntax.html#parsing-main-incolgroup
8546 case 'colgroup':
8547 return tag === 'col' || tag === 'template';
8548 // https://html.spec.whatwg.org/multipage/syntax.html#parsing-main-intable
8549 case 'table':
8550 return tag === 'caption' || tag === 'colgroup' || tag === 'tbody' || tag === 'tfoot' || tag === 'thead' || tag === 'style' || tag === 'script' || tag === 'template';
8551 // https://html.spec.whatwg.org/multipage/syntax.html#parsing-main-inhead
8552 case 'head':
8553 return tag === 'base' || tag === 'basefont' || tag === 'bgsound' || tag === 'link' || tag === 'meta' || tag === 'title' || tag === 'noscript' || tag === 'noframes' || tag === 'style' || tag === 'script' || tag === 'template';
8554 // https://html.spec.whatwg.org/multipage/semantics.html#the-html-element
8555 case 'html':
8556 return tag === 'head' || tag === 'body';
8557 case '#document':
8558 return tag === 'html';
8559 }
8560
8561 // Probably in the "in body" parsing mode, so we outlaw only tag combos
8562 // where the parsing rules cause implicit opens or closes to be added.
8563 // https://html.spec.whatwg.org/multipage/syntax.html#parsing-main-inbody
8564 switch (tag) {
8565 case 'h1':
8566 case 'h2':
8567 case 'h3':
8568 case 'h4':
8569 case 'h5':
8570 case 'h6':
8571 return parentTag !== 'h1' && parentTag !== 'h2' && parentTag !== 'h3' && parentTag !== 'h4' && parentTag !== 'h5' && parentTag !== 'h6';
8572
8573 case 'rp':
8574 case 'rt':
8575 return impliedEndTags.indexOf(parentTag) === -1;
8576
8577 case 'body':
8578 case 'caption':
8579 case 'col':
8580 case 'colgroup':
8581 case 'frame':
8582 case 'head':
8583 case 'html':
8584 case 'tbody':
8585 case 'td':
8586 case 'tfoot':
8587 case 'th':
8588 case 'thead':
8589 case 'tr':
8590 // These tags are only valid with a few parents that have special child
8591 // parsing rules -- if we're down here, then none of those matched and
8592 // so we allow it only if we don't know what the parent is, as all other
8593 // cases are invalid.
8594 return parentTag == null;
8595 }
8596
8597 return true;
8598 };
8599
8600 /**
8601 * Returns whether
8602 */
8603 var findInvalidAncestorForTag = function (tag, ancestorInfo) {
8604 switch (tag) {
8605 case 'address':
8606 case 'article':
8607 case 'aside':
8608 case 'blockquote':
8609 case 'center':
8610 case 'details':
8611 case 'dialog':
8612 case 'dir':
8613 case 'div':
8614 case 'dl':
8615 case 'fieldset':
8616 case 'figcaption':
8617 case 'figure':
8618 case 'footer':
8619 case 'header':
8620 case 'hgroup':
8621 case 'main':
8622 case 'menu':
8623 case 'nav':
8624 case 'ol':
8625 case 'p':
8626 case 'section':
8627 case 'summary':
8628 case 'ul':
8629 case 'pre':
8630 case 'listing':
8631 case 'table':
8632 case 'hr':
8633 case 'xmp':
8634 case 'h1':
8635 case 'h2':
8636 case 'h3':
8637 case 'h4':
8638 case 'h5':
8639 case 'h6':
8640 return ancestorInfo.pTagInButtonScope;
8641
8642 case 'form':
8643 return ancestorInfo.formTag || ancestorInfo.pTagInButtonScope;
8644
8645 case 'li':
8646 return ancestorInfo.listItemTagAutoclosing;
8647
8648 case 'dd':
8649 case 'dt':
8650 return ancestorInfo.dlItemTagAutoclosing;
8651
8652 case 'button':
8653 return ancestorInfo.buttonTagInScope;
8654
8655 case 'a':
8656 // Spec says something about storing a list of markers, but it sounds
8657 // equivalent to this check.
8658 return ancestorInfo.aTagInScope;
8659
8660 case 'nobr':
8661 return ancestorInfo.nobrTagInScope;
8662 }
8663
8664 return null;
8665 };
8666
8667 var didWarn = {};
8668
8669 validateDOMNesting = function (childTag, childText, ancestorInfo) {
8670 ancestorInfo = ancestorInfo || emptyAncestorInfo;
8671 var parentInfo = ancestorInfo.current;
8672 var parentTag = parentInfo && parentInfo.tag;
8673
8674 if (childText != null) {
8675 !(childTag == null) ? warningWithoutStack$1(false, 'validateDOMNesting: when childText is passed, childTag should be null') : void 0;
8676 childTag = '#text';
8677 }
8678
8679 var invalidParent = isTagValidWithParent(childTag, parentTag) ? null : parentInfo;
8680 var invalidAncestor = invalidParent ? null : findInvalidAncestorForTag(childTag, ancestorInfo);
8681 var invalidParentOrAncestor = invalidParent || invalidAncestor;
8682 if (!invalidParentOrAncestor) {
8683 return;
8684 }
8685
8686 var ancestorTag = invalidParentOrAncestor.tag;
8687 var addendum = getCurrentFiberStackInDev();
8688
8689 var warnKey = !!invalidParent + '|' + childTag + '|' + ancestorTag + '|' + addendum;
8690 if (didWarn[warnKey]) {
8691 return;
8692 }
8693 didWarn[warnKey] = true;
8694
8695 var tagDisplayName = childTag;
8696 var whitespaceInfo = '';
8697 if (childTag === '#text') {
8698 if (/\S/.test(childText)) {
8699 tagDisplayName = 'Text nodes';
8700 } else {
8701 tagDisplayName = 'Whitespace text nodes';
8702 whitespaceInfo = " Make sure you don't have any extra whitespace between tags on " + 'each line of your source code.';
8703 }
8704 } else {
8705 tagDisplayName = '<' + childTag + '>';
8706 }
8707
8708 if (invalidParent) {
8709 var info = '';
8710 if (ancestorTag === 'table' && childTag === 'tr') {
8711 info += ' Add a <tbody> to your code to match the DOM tree generated by ' + 'the browser.';
8712 }
8713 warningWithoutStack$1(false, 'validateDOMNesting(...): %s cannot appear as a child of <%s>.%s%s%s', tagDisplayName, ancestorTag, whitespaceInfo, info, addendum);
8714 } else {
8715 warningWithoutStack$1(false, 'validateDOMNesting(...): %s cannot appear as a descendant of ' + '<%s>.%s', tagDisplayName, ancestorTag, addendum);
8716 }
8717 };
8718}
8719
8720var ReactInternals$1 = React.__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED;
8721
8722var _ReactInternals$Sched = ReactInternals$1.Scheduler;
8723var unstable_cancelCallback = _ReactInternals$Sched.unstable_cancelCallback;
8724var unstable_now = _ReactInternals$Sched.unstable_now;
8725var unstable_scheduleCallback = _ReactInternals$Sched.unstable_scheduleCallback;
8726var unstable_shouldYield = _ReactInternals$Sched.unstable_shouldYield;
8727var unstable_getFirstCallbackNode = _ReactInternals$Sched.unstable_getFirstCallbackNode;
8728var unstable_runWithPriority = _ReactInternals$Sched.unstable_runWithPriority;
8729var unstable_next = _ReactInternals$Sched.unstable_next;
8730var unstable_continueExecution = _ReactInternals$Sched.unstable_continueExecution;
8731var unstable_pauseExecution = _ReactInternals$Sched.unstable_pauseExecution;
8732var unstable_getCurrentPriorityLevel = _ReactInternals$Sched.unstable_getCurrentPriorityLevel;
8733var unstable_ImmediatePriority = _ReactInternals$Sched.unstable_ImmediatePriority;
8734var unstable_UserBlockingPriority = _ReactInternals$Sched.unstable_UserBlockingPriority;
8735var unstable_NormalPriority = _ReactInternals$Sched.unstable_NormalPriority;
8736var unstable_LowPriority = _ReactInternals$Sched.unstable_LowPriority;
8737var unstable_IdlePriority = _ReactInternals$Sched.unstable_IdlePriority;
8738
8739// Renderers that don't support persistence
8740// can re-export everything from this module.
8741
8742function shim() {
8743 invariant(false, 'The current renderer does not support persistence. This error is likely caused by a bug in React. Please file an issue.');
8744}
8745
8746// Persistence (when unsupported)
8747var supportsPersistence = false;
8748var cloneInstance = shim;
8749var createContainerChildSet = shim;
8750var appendChildToContainerChildSet = shim;
8751var finalizeContainerChildren = shim;
8752var replaceContainerChildren = shim;
8753var cloneHiddenInstance = shim;
8754var cloneUnhiddenInstance = shim;
8755var createHiddenTextInstance = shim;
8756
8757var SUPPRESS_HYDRATION_WARNING = void 0;
8758{
8759 SUPPRESS_HYDRATION_WARNING = 'suppressHydrationWarning';
8760}
8761
8762var SUSPENSE_START_DATA = '$';
8763var SUSPENSE_END_DATA = '/$';
8764
8765var STYLE = 'style';
8766
8767var eventsEnabled = null;
8768var selectionInformation = null;
8769
8770function shouldAutoFocusHostComponent(type, props) {
8771 switch (type) {
8772 case 'button':
8773 case 'input':
8774 case 'select':
8775 case 'textarea':
8776 return !!props.autoFocus;
8777 }
8778 return false;
8779}
8780
8781function getRootHostContext(rootContainerInstance) {
8782 var type = void 0;
8783 var namespace = void 0;
8784 var nodeType = rootContainerInstance.nodeType;
8785 switch (nodeType) {
8786 case DOCUMENT_NODE:
8787 case DOCUMENT_FRAGMENT_NODE:
8788 {
8789 type = nodeType === DOCUMENT_NODE ? '#document' : '#fragment';
8790 var root = rootContainerInstance.documentElement;
8791 namespace = root ? root.namespaceURI : getChildNamespace(null, '');
8792 break;
8793 }
8794 default:
8795 {
8796 var container = nodeType === COMMENT_NODE ? rootContainerInstance.parentNode : rootContainerInstance;
8797 var ownNamespace = container.namespaceURI || null;
8798 type = container.tagName;
8799 namespace = getChildNamespace(ownNamespace, type);
8800 break;
8801 }
8802 }
8803 {
8804 var validatedTag = type.toLowerCase();
8805 var _ancestorInfo = updatedAncestorInfo(null, validatedTag);
8806 return { namespace: namespace, ancestorInfo: _ancestorInfo };
8807 }
8808 return namespace;
8809}
8810
8811function getChildHostContext(parentHostContext, type, rootContainerInstance) {
8812 {
8813 var parentHostContextDev = parentHostContext;
8814 var _namespace = getChildNamespace(parentHostContextDev.namespace, type);
8815 var _ancestorInfo2 = updatedAncestorInfo(parentHostContextDev.ancestorInfo, type);
8816 return { namespace: _namespace, ancestorInfo: _ancestorInfo2 };
8817 }
8818 var parentNamespace = parentHostContext;
8819 return getChildNamespace(parentNamespace, type);
8820}
8821
8822function getPublicInstance(instance) {
8823 return instance;
8824}
8825
8826function prepareForCommit(containerInfo) {
8827 eventsEnabled = isEnabled();
8828 selectionInformation = getSelectionInformation();
8829 setEnabled(false);
8830}
8831
8832function resetAfterCommit(containerInfo) {
8833 restoreSelection(selectionInformation);
8834 selectionInformation = null;
8835 setEnabled(eventsEnabled);
8836 eventsEnabled = null;
8837}
8838
8839function createInstance(type, props, rootContainerInstance, hostContext, internalInstanceHandle) {
8840 var parentNamespace = void 0;
8841 {
8842 // TODO: take namespace into account when validating.
8843 var hostContextDev = hostContext;
8844 validateDOMNesting(type, null, hostContextDev.ancestorInfo);
8845 if (typeof props.children === 'string' || typeof props.children === 'number') {
8846 var string = '' + props.children;
8847 var ownAncestorInfo = updatedAncestorInfo(hostContextDev.ancestorInfo, type);
8848 validateDOMNesting(null, string, ownAncestorInfo);
8849 }
8850 parentNamespace = hostContextDev.namespace;
8851 }
8852 var domElement = createElement(type, props, rootContainerInstance, parentNamespace);
8853 precacheFiberNode(internalInstanceHandle, domElement);
8854 updateFiberProps(domElement, props);
8855 return domElement;
8856}
8857
8858function appendInitialChild(parentInstance, child) {
8859 parentInstance.appendChild(child);
8860}
8861
8862function finalizeInitialChildren(domElement, type, props, rootContainerInstance, hostContext) {
8863 setInitialProperties(domElement, type, props, rootContainerInstance);
8864 return shouldAutoFocusHostComponent(type, props);
8865}
8866
8867function prepareUpdate(domElement, type, oldProps, newProps, rootContainerInstance, hostContext) {
8868 {
8869 var hostContextDev = hostContext;
8870 if (typeof newProps.children !== typeof oldProps.children && (typeof newProps.children === 'string' || typeof newProps.children === 'number')) {
8871 var string = '' + newProps.children;
8872 var ownAncestorInfo = updatedAncestorInfo(hostContextDev.ancestorInfo, type);
8873 validateDOMNesting(null, string, ownAncestorInfo);
8874 }
8875 }
8876 return diffProperties(domElement, type, oldProps, newProps, rootContainerInstance);
8877}
8878
8879function shouldSetTextContent(type, props) {
8880 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;
8881}
8882
8883function shouldDeprioritizeSubtree(type, props) {
8884 return !!props.hidden;
8885}
8886
8887function createTextInstance(text, rootContainerInstance, hostContext, internalInstanceHandle) {
8888 {
8889 var hostContextDev = hostContext;
8890 validateDOMNesting(null, text, hostContextDev.ancestorInfo);
8891 }
8892 var textNode = createTextNode(text, rootContainerInstance);
8893 precacheFiberNode(internalInstanceHandle, textNode);
8894 return textNode;
8895}
8896
8897var isPrimaryRenderer = true;
8898// This initialization code may run even on server environments
8899// if a component just imports ReactDOM (e.g. for findDOMNode).
8900// Some environments might not have setTimeout or clearTimeout.
8901var scheduleTimeout = typeof setTimeout === 'function' ? setTimeout : undefined;
8902var cancelTimeout = typeof clearTimeout === 'function' ? clearTimeout : undefined;
8903var noTimeout = -1;
8904var schedulePassiveEffects = unstable_scheduleCallback;
8905var cancelPassiveEffects = unstable_cancelCallback;
8906
8907// -------------------
8908// Mutation
8909// -------------------
8910
8911var supportsMutation = true;
8912
8913function commitMount(domElement, type, newProps, internalInstanceHandle) {
8914 // Despite the naming that might imply otherwise, this method only
8915 // fires if there is an `Update` effect scheduled during mounting.
8916 // This happens if `finalizeInitialChildren` returns `true` (which it
8917 // does to implement the `autoFocus` attribute on the client). But
8918 // there are also other cases when this might happen (such as patching
8919 // up text content during hydration mismatch). So we'll check this again.
8920 if (shouldAutoFocusHostComponent(type, newProps)) {
8921 domElement.focus();
8922 }
8923}
8924
8925function commitUpdate(domElement, updatePayload, type, oldProps, newProps, internalInstanceHandle) {
8926 // Update the props handle so that we know which props are the ones with
8927 // with current event handlers.
8928 updateFiberProps(domElement, newProps);
8929 // Apply the diff to the DOM node.
8930 updateProperties(domElement, updatePayload, type, oldProps, newProps);
8931}
8932
8933function resetTextContent(domElement) {
8934 setTextContent(domElement, '');
8935}
8936
8937function commitTextUpdate(textInstance, oldText, newText) {
8938 textInstance.nodeValue = newText;
8939}
8940
8941function appendChild(parentInstance, child) {
8942 parentInstance.appendChild(child);
8943}
8944
8945function appendChildToContainer(container, child) {
8946 var parentNode = void 0;
8947 if (container.nodeType === COMMENT_NODE) {
8948 parentNode = container.parentNode;
8949 parentNode.insertBefore(child, container);
8950 } else {
8951 parentNode = container;
8952 parentNode.appendChild(child);
8953 }
8954 // This container might be used for a portal.
8955 // If something inside a portal is clicked, that click should bubble
8956 // through the React tree. However, on Mobile Safari the click would
8957 // never bubble through the *DOM* tree unless an ancestor with onclick
8958 // event exists. So we wouldn't see it and dispatch it.
8959 // This is why we ensure that non React root containers have inline onclick
8960 // defined.
8961 // https://github.com/facebook/react/issues/11918
8962 var reactRootContainer = container._reactRootContainer;
8963 if ((reactRootContainer === null || reactRootContainer === undefined) && parentNode.onclick === null) {
8964 // TODO: This cast may not be sound for SVG, MathML or custom elements.
8965 trapClickOnNonInteractiveElement(parentNode);
8966 }
8967}
8968
8969function insertBefore(parentInstance, child, beforeChild) {
8970 parentInstance.insertBefore(child, beforeChild);
8971}
8972
8973function insertInContainerBefore(container, child, beforeChild) {
8974 if (container.nodeType === COMMENT_NODE) {
8975 container.parentNode.insertBefore(child, beforeChild);
8976 } else {
8977 container.insertBefore(child, beforeChild);
8978 }
8979}
8980
8981function removeChild(parentInstance, child) {
8982 parentInstance.removeChild(child);
8983}
8984
8985function removeChildFromContainer(container, child) {
8986 if (container.nodeType === COMMENT_NODE) {
8987 container.parentNode.removeChild(child);
8988 } else {
8989 container.removeChild(child);
8990 }
8991}
8992
8993function clearSuspenseBoundary(parentInstance, suspenseInstance) {
8994 var node = suspenseInstance;
8995 // Delete all nodes within this suspense boundary.
8996 // There might be nested nodes so we need to keep track of how
8997 // deep we are and only break out when we're back on top.
8998 var depth = 0;
8999 do {
9000 var nextNode = node.nextSibling;
9001 parentInstance.removeChild(node);
9002 if (nextNode && nextNode.nodeType === COMMENT_NODE) {
9003 var data = nextNode.data;
9004 if (data === SUSPENSE_END_DATA) {
9005 if (depth === 0) {
9006 parentInstance.removeChild(nextNode);
9007 return;
9008 } else {
9009 depth--;
9010 }
9011 } else if (data === SUSPENSE_START_DATA) {
9012 depth++;
9013 }
9014 }
9015 node = nextNode;
9016 } while (node);
9017 // TODO: Warn, we didn't find the end comment boundary.
9018}
9019
9020function clearSuspenseBoundaryFromContainer(container, suspenseInstance) {
9021 if (container.nodeType === COMMENT_NODE) {
9022 clearSuspenseBoundary(container.parentNode, suspenseInstance);
9023 } else if (container.nodeType === ELEMENT_NODE) {
9024 clearSuspenseBoundary(container, suspenseInstance);
9025 } else {
9026 // Document nodes should never contain suspense boundaries.
9027 }
9028}
9029
9030function hideInstance(instance) {
9031 // TODO: Does this work for all element types? What about MathML? Should we
9032 // pass host context to this method?
9033 instance = instance;
9034 instance.style.display = 'none';
9035}
9036
9037function hideTextInstance(textInstance) {
9038 textInstance.nodeValue = '';
9039}
9040
9041function unhideInstance(instance, props) {
9042 instance = instance;
9043 var styleProp = props[STYLE];
9044 var display = styleProp !== undefined && styleProp !== null && styleProp.hasOwnProperty('display') ? styleProp.display : null;
9045 instance.style.display = dangerousStyleValue('display', display);
9046}
9047
9048function unhideTextInstance(textInstance, text) {
9049 textInstance.nodeValue = text;
9050}
9051
9052// -------------------
9053// Hydration
9054// -------------------
9055
9056var supportsHydration = true;
9057
9058function canHydrateInstance(instance, type, props) {
9059 if (instance.nodeType !== ELEMENT_NODE || type.toLowerCase() !== instance.nodeName.toLowerCase()) {
9060 return null;
9061 }
9062 // This has now been refined to an element node.
9063 return instance;
9064}
9065
9066function canHydrateTextInstance(instance, text) {
9067 if (text === '' || instance.nodeType !== TEXT_NODE) {
9068 // Empty strings are not parsed by HTML so there won't be a correct match here.
9069 return null;
9070 }
9071 // This has now been refined to a text node.
9072 return instance;
9073}
9074
9075function canHydrateSuspenseInstance(instance) {
9076 if (instance.nodeType !== COMMENT_NODE) {
9077 // Empty strings are not parsed by HTML so there won't be a correct match here.
9078 return null;
9079 }
9080 // This has now been refined to a suspense node.
9081 return instance;
9082}
9083
9084function getNextHydratableSibling(instance) {
9085 var node = instance.nextSibling;
9086 // Skip non-hydratable nodes.
9087 while (node && node.nodeType !== ELEMENT_NODE && node.nodeType !== TEXT_NODE && (!enableSuspenseServerRenderer || node.nodeType !== COMMENT_NODE || node.data !== SUSPENSE_START_DATA)) {
9088 node = node.nextSibling;
9089 }
9090 return node;
9091}
9092
9093function getFirstHydratableChild(parentInstance) {
9094 var next = parentInstance.firstChild;
9095 // Skip non-hydratable nodes.
9096 while (next && next.nodeType !== ELEMENT_NODE && next.nodeType !== TEXT_NODE && (!enableSuspenseServerRenderer || next.nodeType !== COMMENT_NODE || next.data !== SUSPENSE_START_DATA)) {
9097 next = next.nextSibling;
9098 }
9099 return next;
9100}
9101
9102function hydrateInstance(instance, type, props, rootContainerInstance, hostContext, internalInstanceHandle) {
9103 precacheFiberNode(internalInstanceHandle, instance);
9104 // TODO: Possibly defer this until the commit phase where all the events
9105 // get attached.
9106 updateFiberProps(instance, props);
9107 var parentNamespace = void 0;
9108 {
9109 var hostContextDev = hostContext;
9110 parentNamespace = hostContextDev.namespace;
9111 }
9112 return diffHydratedProperties(instance, type, props, parentNamespace, rootContainerInstance);
9113}
9114
9115function hydrateTextInstance(textInstance, text, internalInstanceHandle) {
9116 precacheFiberNode(internalInstanceHandle, textInstance);
9117 return diffHydratedText(textInstance, text);
9118}
9119
9120function getNextHydratableInstanceAfterSuspenseInstance(suspenseInstance) {
9121 var node = suspenseInstance.nextSibling;
9122 // Skip past all nodes within this suspense boundary.
9123 // There might be nested nodes so we need to keep track of how
9124 // deep we are and only break out when we're back on top.
9125 var depth = 0;
9126 while (node) {
9127 if (node.nodeType === COMMENT_NODE) {
9128 var data = node.data;
9129 if (data === SUSPENSE_END_DATA) {
9130 if (depth === 0) {
9131 return getNextHydratableSibling(node);
9132 } else {
9133 depth--;
9134 }
9135 } else if (data === SUSPENSE_START_DATA) {
9136 depth++;
9137 }
9138 }
9139 node = node.nextSibling;
9140 }
9141 // TODO: Warn, we didn't find the end comment boundary.
9142 return null;
9143}
9144
9145function didNotMatchHydratedContainerTextInstance(parentContainer, textInstance, text) {
9146 {
9147 warnForUnmatchedText(textInstance, text);
9148 }
9149}
9150
9151function didNotMatchHydratedTextInstance(parentType, parentProps, parentInstance, textInstance, text) {
9152 if (true && parentProps[SUPPRESS_HYDRATION_WARNING] !== true) {
9153 warnForUnmatchedText(textInstance, text);
9154 }
9155}
9156
9157function didNotHydrateContainerInstance(parentContainer, instance) {
9158 {
9159 if (instance.nodeType === ELEMENT_NODE) {
9160 warnForDeletedHydratableElement(parentContainer, instance);
9161 } else if (instance.nodeType === COMMENT_NODE) {
9162 // TODO: warnForDeletedHydratableSuspenseBoundary
9163 } else {
9164 warnForDeletedHydratableText(parentContainer, instance);
9165 }
9166 }
9167}
9168
9169function didNotHydrateInstance(parentType, parentProps, parentInstance, instance) {
9170 if (true && parentProps[SUPPRESS_HYDRATION_WARNING] !== true) {
9171 if (instance.nodeType === ELEMENT_NODE) {
9172 warnForDeletedHydratableElement(parentInstance, instance);
9173 } else if (instance.nodeType === COMMENT_NODE) {
9174 // TODO: warnForDeletedHydratableSuspenseBoundary
9175 } else {
9176 warnForDeletedHydratableText(parentInstance, instance);
9177 }
9178 }
9179}
9180
9181function didNotFindHydratableContainerInstance(parentContainer, type, props) {
9182 {
9183 warnForInsertedHydratedElement(parentContainer, type, props);
9184 }
9185}
9186
9187function didNotFindHydratableContainerTextInstance(parentContainer, text) {
9188 {
9189 warnForInsertedHydratedText(parentContainer, text);
9190 }
9191}
9192
9193
9194
9195function didNotFindHydratableInstance(parentType, parentProps, parentInstance, type, props) {
9196 if (true && parentProps[SUPPRESS_HYDRATION_WARNING] !== true) {
9197 warnForInsertedHydratedElement(parentInstance, type, props);
9198 }
9199}
9200
9201function didNotFindHydratableTextInstance(parentType, parentProps, parentInstance, text) {
9202 if (true && parentProps[SUPPRESS_HYDRATION_WARNING] !== true) {
9203 warnForInsertedHydratedText(parentInstance, text);
9204 }
9205}
9206
9207function didNotFindHydratableSuspenseInstance(parentType, parentProps, parentInstance) {
9208 if (true && parentProps[SUPPRESS_HYDRATION_WARNING] !== true) {
9209 // TODO: warnForInsertedHydratedSuspense(parentInstance);
9210 }
9211}
9212
9213// Prefix measurements so that it's possible to filter them.
9214// Longer prefixes are hard to read in DevTools.
9215var reactEmoji = '\u269B';
9216var warningEmoji = '\u26D4';
9217var supportsUserTiming = typeof performance !== 'undefined' && typeof performance.mark === 'function' && typeof performance.clearMarks === 'function' && typeof performance.measure === 'function' && typeof performance.clearMeasures === 'function';
9218
9219// Keep track of current fiber so that we know the path to unwind on pause.
9220// TODO: this looks the same as nextUnitOfWork in scheduler. Can we unify them?
9221var currentFiber = null;
9222// If we're in the middle of user code, which fiber and method is it?
9223// Reusing `currentFiber` would be confusing for this because user code fiber
9224// can change during commit phase too, but we don't need to unwind it (since
9225// lifecycles in the commit phase don't resemble a tree).
9226var currentPhase = null;
9227var currentPhaseFiber = null;
9228// Did lifecycle hook schedule an update? This is often a performance problem,
9229// so we will keep track of it, and include it in the report.
9230// Track commits caused by cascading updates.
9231var isCommitting = false;
9232var hasScheduledUpdateInCurrentCommit = false;
9233var hasScheduledUpdateInCurrentPhase = false;
9234var commitCountInCurrentWorkLoop = 0;
9235var effectCountInCurrentCommit = 0;
9236var isWaitingForCallback = false;
9237// During commits, we only show a measurement once per method name
9238// to avoid stretch the commit phase with measurement overhead.
9239var labelsInCurrentCommit = new Set();
9240
9241var formatMarkName = function (markName) {
9242 return reactEmoji + ' ' + markName;
9243};
9244
9245var formatLabel = function (label, warning) {
9246 var prefix = warning ? warningEmoji + ' ' : reactEmoji + ' ';
9247 var suffix = warning ? ' Warning: ' + warning : '';
9248 return '' + prefix + label + suffix;
9249};
9250
9251var beginMark = function (markName) {
9252 performance.mark(formatMarkName(markName));
9253};
9254
9255var clearMark = function (markName) {
9256 performance.clearMarks(formatMarkName(markName));
9257};
9258
9259var endMark = function (label, markName, warning) {
9260 var formattedMarkName = formatMarkName(markName);
9261 var formattedLabel = formatLabel(label, warning);
9262 try {
9263 performance.measure(formattedLabel, formattedMarkName);
9264 } catch (err) {}
9265 // If previous mark was missing for some reason, this will throw.
9266 // This could only happen if React crashed in an unexpected place earlier.
9267 // Don't pile on with more errors.
9268
9269 // Clear marks immediately to avoid growing buffer.
9270 performance.clearMarks(formattedMarkName);
9271 performance.clearMeasures(formattedLabel);
9272};
9273
9274var getFiberMarkName = function (label, debugID) {
9275 return label + ' (#' + debugID + ')';
9276};
9277
9278var getFiberLabel = function (componentName, isMounted, phase) {
9279 if (phase === null) {
9280 // These are composite component total time measurements.
9281 return componentName + ' [' + (isMounted ? 'update' : 'mount') + ']';
9282 } else {
9283 // Composite component methods.
9284 return componentName + '.' + phase;
9285 }
9286};
9287
9288var beginFiberMark = function (fiber, phase) {
9289 var componentName = getComponentName(fiber.type) || 'Unknown';
9290 var debugID = fiber._debugID;
9291 var isMounted = fiber.alternate !== null;
9292 var label = getFiberLabel(componentName, isMounted, phase);
9293
9294 if (isCommitting && labelsInCurrentCommit.has(label)) {
9295 // During the commit phase, we don't show duplicate labels because
9296 // there is a fixed overhead for every measurement, and we don't
9297 // want to stretch the commit phase beyond necessary.
9298 return false;
9299 }
9300 labelsInCurrentCommit.add(label);
9301
9302 var markName = getFiberMarkName(label, debugID);
9303 beginMark(markName);
9304 return true;
9305};
9306
9307var clearFiberMark = function (fiber, phase) {
9308 var componentName = getComponentName(fiber.type) || 'Unknown';
9309 var debugID = fiber._debugID;
9310 var isMounted = fiber.alternate !== null;
9311 var label = getFiberLabel(componentName, isMounted, phase);
9312 var markName = getFiberMarkName(label, debugID);
9313 clearMark(markName);
9314};
9315
9316var endFiberMark = function (fiber, phase, warning) {
9317 var componentName = getComponentName(fiber.type) || 'Unknown';
9318 var debugID = fiber._debugID;
9319 var isMounted = fiber.alternate !== null;
9320 var label = getFiberLabel(componentName, isMounted, phase);
9321 var markName = getFiberMarkName(label, debugID);
9322 endMark(label, markName, warning);
9323};
9324
9325var shouldIgnoreFiber = function (fiber) {
9326 // Host components should be skipped in the timeline.
9327 // We could check typeof fiber.type, but does this work with RN?
9328 switch (fiber.tag) {
9329 case HostRoot:
9330 case HostComponent:
9331 case HostText:
9332 case HostPortal:
9333 case Fragment:
9334 case ContextProvider:
9335 case ContextConsumer:
9336 case Mode:
9337 return true;
9338 default:
9339 return false;
9340 }
9341};
9342
9343var clearPendingPhaseMeasurement = function () {
9344 if (currentPhase !== null && currentPhaseFiber !== null) {
9345 clearFiberMark(currentPhaseFiber, currentPhase);
9346 }
9347 currentPhaseFiber = null;
9348 currentPhase = null;
9349 hasScheduledUpdateInCurrentPhase = false;
9350};
9351
9352var pauseTimers = function () {
9353 // Stops all currently active measurements so that they can be resumed
9354 // if we continue in a later deferred loop from the same unit of work.
9355 var fiber = currentFiber;
9356 while (fiber) {
9357 if (fiber._debugIsCurrentlyTiming) {
9358 endFiberMark(fiber, null, null);
9359 }
9360 fiber = fiber.return;
9361 }
9362};
9363
9364var resumeTimersRecursively = function (fiber) {
9365 if (fiber.return !== null) {
9366 resumeTimersRecursively(fiber.return);
9367 }
9368 if (fiber._debugIsCurrentlyTiming) {
9369 beginFiberMark(fiber, null);
9370 }
9371};
9372
9373var resumeTimers = function () {
9374 // Resumes all measurements that were active during the last deferred loop.
9375 if (currentFiber !== null) {
9376 resumeTimersRecursively(currentFiber);
9377 }
9378};
9379
9380function recordEffect() {
9381 if (enableUserTimingAPI) {
9382 effectCountInCurrentCommit++;
9383 }
9384}
9385
9386function recordScheduleUpdate() {
9387 if (enableUserTimingAPI) {
9388 if (isCommitting) {
9389 hasScheduledUpdateInCurrentCommit = true;
9390 }
9391 if (currentPhase !== null && currentPhase !== 'componentWillMount' && currentPhase !== 'componentWillReceiveProps') {
9392 hasScheduledUpdateInCurrentPhase = true;
9393 }
9394 }
9395}
9396
9397function startRequestCallbackTimer() {
9398 if (enableUserTimingAPI) {
9399 if (supportsUserTiming && !isWaitingForCallback) {
9400 isWaitingForCallback = true;
9401 beginMark('(Waiting for async callback...)');
9402 }
9403 }
9404}
9405
9406function stopRequestCallbackTimer(didExpire, expirationTime) {
9407 if (enableUserTimingAPI) {
9408 if (supportsUserTiming) {
9409 isWaitingForCallback = false;
9410 var warning = didExpire ? 'React was blocked by main thread' : null;
9411 endMark('(Waiting for async callback... will force flush in ' + expirationTime + ' ms)', '(Waiting for async callback...)', warning);
9412 }
9413 }
9414}
9415
9416function startWorkTimer(fiber) {
9417 if (enableUserTimingAPI) {
9418 if (!supportsUserTiming || shouldIgnoreFiber(fiber)) {
9419 return;
9420 }
9421 // If we pause, this is the fiber to unwind from.
9422 currentFiber = fiber;
9423 if (!beginFiberMark(fiber, null)) {
9424 return;
9425 }
9426 fiber._debugIsCurrentlyTiming = true;
9427 }
9428}
9429
9430function cancelWorkTimer(fiber) {
9431 if (enableUserTimingAPI) {
9432 if (!supportsUserTiming || shouldIgnoreFiber(fiber)) {
9433 return;
9434 }
9435 // Remember we shouldn't complete measurement for this fiber.
9436 // Otherwise flamechart will be deep even for small updates.
9437 fiber._debugIsCurrentlyTiming = false;
9438 clearFiberMark(fiber, null);
9439 }
9440}
9441
9442function stopWorkTimer(fiber) {
9443 if (enableUserTimingAPI) {
9444 if (!supportsUserTiming || shouldIgnoreFiber(fiber)) {
9445 return;
9446 }
9447 // If we pause, its parent is the fiber to unwind from.
9448 currentFiber = fiber.return;
9449 if (!fiber._debugIsCurrentlyTiming) {
9450 return;
9451 }
9452 fiber._debugIsCurrentlyTiming = false;
9453 endFiberMark(fiber, null, null);
9454 }
9455}
9456
9457function stopFailedWorkTimer(fiber) {
9458 if (enableUserTimingAPI) {
9459 if (!supportsUserTiming || shouldIgnoreFiber(fiber)) {
9460 return;
9461 }
9462 // If we pause, its parent is the fiber to unwind from.
9463 currentFiber = fiber.return;
9464 if (!fiber._debugIsCurrentlyTiming) {
9465 return;
9466 }
9467 fiber._debugIsCurrentlyTiming = false;
9468 var warning = fiber.tag === SuspenseComponent || fiber.tag === DehydratedSuspenseComponent ? 'Rendering was suspended' : 'An error was thrown inside this error boundary';
9469 endFiberMark(fiber, null, warning);
9470 }
9471}
9472
9473function startPhaseTimer(fiber, phase) {
9474 if (enableUserTimingAPI) {
9475 if (!supportsUserTiming) {
9476 return;
9477 }
9478 clearPendingPhaseMeasurement();
9479 if (!beginFiberMark(fiber, phase)) {
9480 return;
9481 }
9482 currentPhaseFiber = fiber;
9483 currentPhase = phase;
9484 }
9485}
9486
9487function stopPhaseTimer() {
9488 if (enableUserTimingAPI) {
9489 if (!supportsUserTiming) {
9490 return;
9491 }
9492 if (currentPhase !== null && currentPhaseFiber !== null) {
9493 var warning = hasScheduledUpdateInCurrentPhase ? 'Scheduled a cascading update' : null;
9494 endFiberMark(currentPhaseFiber, currentPhase, warning);
9495 }
9496 currentPhase = null;
9497 currentPhaseFiber = null;
9498 }
9499}
9500
9501function startWorkLoopTimer(nextUnitOfWork) {
9502 if (enableUserTimingAPI) {
9503 currentFiber = nextUnitOfWork;
9504 if (!supportsUserTiming) {
9505 return;
9506 }
9507 commitCountInCurrentWorkLoop = 0;
9508 // This is top level call.
9509 // Any other measurements are performed within.
9510 beginMark('(React Tree Reconciliation)');
9511 // Resume any measurements that were in progress during the last loop.
9512 resumeTimers();
9513 }
9514}
9515
9516function stopWorkLoopTimer(interruptedBy, didCompleteRoot) {
9517 if (enableUserTimingAPI) {
9518 if (!supportsUserTiming) {
9519 return;
9520 }
9521 var warning = null;
9522 if (interruptedBy !== null) {
9523 if (interruptedBy.tag === HostRoot) {
9524 warning = 'A top-level update interrupted the previous render';
9525 } else {
9526 var componentName = getComponentName(interruptedBy.type) || 'Unknown';
9527 warning = 'An update to ' + componentName + ' interrupted the previous render';
9528 }
9529 } else if (commitCountInCurrentWorkLoop > 1) {
9530 warning = 'There were cascading updates';
9531 }
9532 commitCountInCurrentWorkLoop = 0;
9533 var label = didCompleteRoot ? '(React Tree Reconciliation: Completed Root)' : '(React Tree Reconciliation: Yielded)';
9534 // Pause any measurements until the next loop.
9535 pauseTimers();
9536 endMark(label, '(React Tree Reconciliation)', warning);
9537 }
9538}
9539
9540function startCommitTimer() {
9541 if (enableUserTimingAPI) {
9542 if (!supportsUserTiming) {
9543 return;
9544 }
9545 isCommitting = true;
9546 hasScheduledUpdateInCurrentCommit = false;
9547 labelsInCurrentCommit.clear();
9548 beginMark('(Committing Changes)');
9549 }
9550}
9551
9552function stopCommitTimer() {
9553 if (enableUserTimingAPI) {
9554 if (!supportsUserTiming) {
9555 return;
9556 }
9557
9558 var warning = null;
9559 if (hasScheduledUpdateInCurrentCommit) {
9560 warning = 'Lifecycle hook scheduled a cascading update';
9561 } else if (commitCountInCurrentWorkLoop > 0) {
9562 warning = 'Caused by a cascading update in earlier commit';
9563 }
9564 hasScheduledUpdateInCurrentCommit = false;
9565 commitCountInCurrentWorkLoop++;
9566 isCommitting = false;
9567 labelsInCurrentCommit.clear();
9568
9569 endMark('(Committing Changes)', '(Committing Changes)', warning);
9570 }
9571}
9572
9573function startCommitSnapshotEffectsTimer() {
9574 if (enableUserTimingAPI) {
9575 if (!supportsUserTiming) {
9576 return;
9577 }
9578 effectCountInCurrentCommit = 0;
9579 beginMark('(Committing Snapshot Effects)');
9580 }
9581}
9582
9583function stopCommitSnapshotEffectsTimer() {
9584 if (enableUserTimingAPI) {
9585 if (!supportsUserTiming) {
9586 return;
9587 }
9588 var count = effectCountInCurrentCommit;
9589 effectCountInCurrentCommit = 0;
9590 endMark('(Committing Snapshot Effects: ' + count + ' Total)', '(Committing Snapshot Effects)', null);
9591 }
9592}
9593
9594function startCommitHostEffectsTimer() {
9595 if (enableUserTimingAPI) {
9596 if (!supportsUserTiming) {
9597 return;
9598 }
9599 effectCountInCurrentCommit = 0;
9600 beginMark('(Committing Host Effects)');
9601 }
9602}
9603
9604function stopCommitHostEffectsTimer() {
9605 if (enableUserTimingAPI) {
9606 if (!supportsUserTiming) {
9607 return;
9608 }
9609 var count = effectCountInCurrentCommit;
9610 effectCountInCurrentCommit = 0;
9611 endMark('(Committing Host Effects: ' + count + ' Total)', '(Committing Host Effects)', null);
9612 }
9613}
9614
9615function startCommitLifeCyclesTimer() {
9616 if (enableUserTimingAPI) {
9617 if (!supportsUserTiming) {
9618 return;
9619 }
9620 effectCountInCurrentCommit = 0;
9621 beginMark('(Calling Lifecycle Methods)');
9622 }
9623}
9624
9625function stopCommitLifeCyclesTimer() {
9626 if (enableUserTimingAPI) {
9627 if (!supportsUserTiming) {
9628 return;
9629 }
9630 var count = effectCountInCurrentCommit;
9631 effectCountInCurrentCommit = 0;
9632 endMark('(Calling Lifecycle Methods: ' + count + ' Total)', '(Calling Lifecycle Methods)', null);
9633 }
9634}
9635
9636var valueStack = [];
9637
9638var fiberStack = void 0;
9639
9640{
9641 fiberStack = [];
9642}
9643
9644var index = -1;
9645
9646function createCursor(defaultValue) {
9647 return {
9648 current: defaultValue
9649 };
9650}
9651
9652function pop(cursor, fiber) {
9653 if (index < 0) {
9654 {
9655 warningWithoutStack$1(false, 'Unexpected pop.');
9656 }
9657 return;
9658 }
9659
9660 {
9661 if (fiber !== fiberStack[index]) {
9662 warningWithoutStack$1(false, 'Unexpected Fiber popped.');
9663 }
9664 }
9665
9666 cursor.current = valueStack[index];
9667
9668 valueStack[index] = null;
9669
9670 {
9671 fiberStack[index] = null;
9672 }
9673
9674 index--;
9675}
9676
9677function push(cursor, value, fiber) {
9678 index++;
9679
9680 valueStack[index] = cursor.current;
9681
9682 {
9683 fiberStack[index] = fiber;
9684 }
9685
9686 cursor.current = value;
9687}
9688
9689function checkThatStackIsEmpty() {
9690 {
9691 if (index !== -1) {
9692 warningWithoutStack$1(false, 'Expected an empty stack. Something was not reset properly.');
9693 }
9694 }
9695}
9696
9697function resetStackAfterFatalErrorInDev() {
9698 {
9699 index = -1;
9700 valueStack.length = 0;
9701 fiberStack.length = 0;
9702 }
9703}
9704
9705var warnedAboutMissingGetChildContext = void 0;
9706
9707{
9708 warnedAboutMissingGetChildContext = {};
9709}
9710
9711var emptyContextObject = {};
9712{
9713 Object.freeze(emptyContextObject);
9714}
9715
9716// A cursor to the current merged context object on the stack.
9717var contextStackCursor = createCursor(emptyContextObject);
9718// A cursor to a boolean indicating whether the context has changed.
9719var didPerformWorkStackCursor = createCursor(false);
9720// Keep track of the previous context object that was on the stack.
9721// We use this to get access to the parent context after we have already
9722// pushed the next context provider, and now need to merge their contexts.
9723var previousContext = emptyContextObject;
9724
9725function getUnmaskedContext(workInProgress, Component, didPushOwnContextIfProvider) {
9726 if (didPushOwnContextIfProvider && isContextProvider(Component)) {
9727 // If the fiber is a context provider itself, when we read its context
9728 // we may have already pushed its own child context on the stack. A context
9729 // provider should not "see" its own child context. Therefore we read the
9730 // previous (parent) context instead for a context provider.
9731 return previousContext;
9732 }
9733 return contextStackCursor.current;
9734}
9735
9736function cacheContext(workInProgress, unmaskedContext, maskedContext) {
9737 var instance = workInProgress.stateNode;
9738 instance.__reactInternalMemoizedUnmaskedChildContext = unmaskedContext;
9739 instance.__reactInternalMemoizedMaskedChildContext = maskedContext;
9740}
9741
9742function getMaskedContext(workInProgress, unmaskedContext) {
9743 var type = workInProgress.type;
9744 var contextTypes = type.contextTypes;
9745 if (!contextTypes) {
9746 return emptyContextObject;
9747 }
9748
9749 // Avoid recreating masked context unless unmasked context has changed.
9750 // Failing to do this will result in unnecessary calls to componentWillReceiveProps.
9751 // This may trigger infinite loops if componentWillReceiveProps calls setState.
9752 var instance = workInProgress.stateNode;
9753 if (instance && instance.__reactInternalMemoizedUnmaskedChildContext === unmaskedContext) {
9754 return instance.__reactInternalMemoizedMaskedChildContext;
9755 }
9756
9757 var context = {};
9758 for (var key in contextTypes) {
9759 context[key] = unmaskedContext[key];
9760 }
9761
9762 {
9763 var name = getComponentName(type) || 'Unknown';
9764 checkPropTypes_1(contextTypes, context, 'context', name, getCurrentFiberStackInDev);
9765 }
9766
9767 // Cache unmasked context so we can avoid recreating masked context unless necessary.
9768 // Context is created before the class component is instantiated so check for instance.
9769 if (instance) {
9770 cacheContext(workInProgress, unmaskedContext, context);
9771 }
9772
9773 return context;
9774}
9775
9776function hasContextChanged() {
9777 return didPerformWorkStackCursor.current;
9778}
9779
9780function isContextProvider(type) {
9781 var childContextTypes = type.childContextTypes;
9782 return childContextTypes !== null && childContextTypes !== undefined;
9783}
9784
9785function popContext(fiber) {
9786 pop(didPerformWorkStackCursor, fiber);
9787 pop(contextStackCursor, fiber);
9788}
9789
9790function popTopLevelContextObject(fiber) {
9791 pop(didPerformWorkStackCursor, fiber);
9792 pop(contextStackCursor, fiber);
9793}
9794
9795function pushTopLevelContextObject(fiber, context, didChange) {
9796 !(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;
9797
9798 push(contextStackCursor, context, fiber);
9799 push(didPerformWorkStackCursor, didChange, fiber);
9800}
9801
9802function processChildContext(fiber, type, parentContext) {
9803 var instance = fiber.stateNode;
9804 var childContextTypes = type.childContextTypes;
9805
9806 // TODO (bvaughn) Replace this behavior with an invariant() in the future.
9807 // It has only been added in Fiber to match the (unintentional) behavior in Stack.
9808 if (typeof instance.getChildContext !== 'function') {
9809 {
9810 var componentName = getComponentName(type) || 'Unknown';
9811
9812 if (!warnedAboutMissingGetChildContext[componentName]) {
9813 warnedAboutMissingGetChildContext[componentName] = true;
9814 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);
9815 }
9816 }
9817 return parentContext;
9818 }
9819
9820 var childContext = void 0;
9821 {
9822 setCurrentPhase('getChildContext');
9823 }
9824 startPhaseTimer(fiber, 'getChildContext');
9825 childContext = instance.getChildContext();
9826 stopPhaseTimer();
9827 {
9828 setCurrentPhase(null);
9829 }
9830 for (var contextKey in childContext) {
9831 !(contextKey in childContextTypes) ? invariant(false, '%s.getChildContext(): key "%s" is not defined in childContextTypes.', getComponentName(type) || 'Unknown', contextKey) : void 0;
9832 }
9833 {
9834 var name = getComponentName(type) || 'Unknown';
9835 checkPropTypes_1(childContextTypes, childContext, 'child context', name,
9836 // In practice, there is one case in which we won't get a stack. It's when
9837 // somebody calls unstable_renderSubtreeIntoContainer() and we process
9838 // context from the parent component instance. The stack will be missing
9839 // because it's outside of the reconciliation, and so the pointer has not
9840 // been set. This is rare and doesn't matter. We'll also remove that API.
9841 getCurrentFiberStackInDev);
9842 }
9843
9844 return _assign({}, parentContext, childContext);
9845}
9846
9847function pushContextProvider(workInProgress) {
9848 var instance = workInProgress.stateNode;
9849 // We push the context as early as possible to ensure stack integrity.
9850 // If the instance does not exist yet, we will push null at first,
9851 // and replace it on the stack later when invalidating the context.
9852 var memoizedMergedChildContext = instance && instance.__reactInternalMemoizedMergedChildContext || emptyContextObject;
9853
9854 // Remember the parent context so we can merge with it later.
9855 // Inherit the parent's did-perform-work value to avoid inadvertently blocking updates.
9856 previousContext = contextStackCursor.current;
9857 push(contextStackCursor, memoizedMergedChildContext, workInProgress);
9858 push(didPerformWorkStackCursor, didPerformWorkStackCursor.current, workInProgress);
9859
9860 return true;
9861}
9862
9863function invalidateContextProvider(workInProgress, type, didChange) {
9864 var instance = workInProgress.stateNode;
9865 !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;
9866
9867 if (didChange) {
9868 // Merge parent and own context.
9869 // Skip this if we're not updating due to sCU.
9870 // This avoids unnecessarily recomputing memoized values.
9871 var mergedContext = processChildContext(workInProgress, type, previousContext);
9872 instance.__reactInternalMemoizedMergedChildContext = mergedContext;
9873
9874 // Replace the old (or empty) context with the new one.
9875 // It is important to unwind the context in the reverse order.
9876 pop(didPerformWorkStackCursor, workInProgress);
9877 pop(contextStackCursor, workInProgress);
9878 // Now push the new context and mark that it has changed.
9879 push(contextStackCursor, mergedContext, workInProgress);
9880 push(didPerformWorkStackCursor, didChange, workInProgress);
9881 } else {
9882 pop(didPerformWorkStackCursor, workInProgress);
9883 push(didPerformWorkStackCursor, didChange, workInProgress);
9884 }
9885}
9886
9887function findCurrentUnmaskedContext(fiber) {
9888 // Currently this is only used with renderSubtreeIntoContainer; not sure if it
9889 // makes sense elsewhere
9890 !(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;
9891
9892 var node = fiber;
9893 do {
9894 switch (node.tag) {
9895 case HostRoot:
9896 return node.stateNode.context;
9897 case ClassComponent:
9898 {
9899 var Component = node.type;
9900 if (isContextProvider(Component)) {
9901 return node.stateNode.__reactInternalMemoizedMergedChildContext;
9902 }
9903 break;
9904 }
9905 }
9906 node = node.return;
9907 } while (node !== null);
9908 invariant(false, 'Found unexpected detached subtree parent. This error is likely caused by a bug in React. Please file an issue.');
9909}
9910
9911var onCommitFiberRoot = null;
9912var onCommitFiberUnmount = null;
9913var hasLoggedError = false;
9914
9915function catchErrors(fn) {
9916 return function (arg) {
9917 try {
9918 return fn(arg);
9919 } catch (err) {
9920 if (true && !hasLoggedError) {
9921 hasLoggedError = true;
9922 warningWithoutStack$1(false, 'React DevTools encountered an error: %s', err);
9923 }
9924 }
9925 };
9926}
9927
9928var isDevToolsPresent = typeof __REACT_DEVTOOLS_GLOBAL_HOOK__ !== 'undefined';
9929
9930function injectInternals(internals) {
9931 if (typeof __REACT_DEVTOOLS_GLOBAL_HOOK__ === 'undefined') {
9932 // No DevTools
9933 return false;
9934 }
9935 var hook = __REACT_DEVTOOLS_GLOBAL_HOOK__;
9936 if (hook.isDisabled) {
9937 // This isn't a real property on the hook, but it can be set to opt out
9938 // of DevTools integration and associated warnings and logs.
9939 // https://github.com/facebook/react/issues/3877
9940 return true;
9941 }
9942 if (!hook.supportsFiber) {
9943 {
9944 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');
9945 }
9946 // DevTools exists, even though it doesn't support Fiber.
9947 return true;
9948 }
9949 try {
9950 var rendererID = hook.inject(internals);
9951 // We have successfully injected, so now it is safe to set up hooks.
9952 onCommitFiberRoot = catchErrors(function (root) {
9953 return hook.onCommitFiberRoot(rendererID, root);
9954 });
9955 onCommitFiberUnmount = catchErrors(function (fiber) {
9956 return hook.onCommitFiberUnmount(rendererID, fiber);
9957 });
9958 } catch (err) {
9959 // Catch all errors because it is unsafe to throw during initialization.
9960 {
9961 warningWithoutStack$1(false, 'React DevTools encountered an error: %s.', err);
9962 }
9963 }
9964 // DevTools exists
9965 return true;
9966}
9967
9968function onCommitRoot(root) {
9969 if (typeof onCommitFiberRoot === 'function') {
9970 onCommitFiberRoot(root);
9971 }
9972}
9973
9974function onCommitUnmount(fiber) {
9975 if (typeof onCommitFiberUnmount === 'function') {
9976 onCommitFiberUnmount(fiber);
9977 }
9978}
9979
9980// Max 31 bit integer. The max integer size in V8 for 32-bit systems.
9981// Math.pow(2, 30) - 1
9982// 0b111111111111111111111111111111
9983var maxSigned31BitInt = 1073741823;
9984
9985var NoWork = 0;
9986var Never = 1;
9987var Sync = maxSigned31BitInt;
9988
9989var UNIT_SIZE = 10;
9990var MAGIC_NUMBER_OFFSET = maxSigned31BitInt - 1;
9991
9992// 1 unit of expiration time represents 10ms.
9993function msToExpirationTime(ms) {
9994 // Always add an offset so that we don't clash with the magic number for NoWork.
9995 return MAGIC_NUMBER_OFFSET - (ms / UNIT_SIZE | 0);
9996}
9997
9998function expirationTimeToMs(expirationTime) {
9999 return (MAGIC_NUMBER_OFFSET - expirationTime) * UNIT_SIZE;
10000}
10001
10002function ceiling(num, precision) {
10003 return ((num / precision | 0) + 1) * precision;
10004}
10005
10006function computeExpirationBucket(currentTime, expirationInMs, bucketSizeMs) {
10007 return MAGIC_NUMBER_OFFSET - ceiling(MAGIC_NUMBER_OFFSET - currentTime + expirationInMs / UNIT_SIZE, bucketSizeMs / UNIT_SIZE);
10008}
10009
10010var LOW_PRIORITY_EXPIRATION = 5000;
10011var LOW_PRIORITY_BATCH_SIZE = 250;
10012
10013function computeAsyncExpiration(currentTime) {
10014 return computeExpirationBucket(currentTime, LOW_PRIORITY_EXPIRATION, LOW_PRIORITY_BATCH_SIZE);
10015}
10016
10017// We intentionally set a higher expiration time for interactive updates in
10018// dev than in production.
10019//
10020// If the main thread is being blocked so long that you hit the expiration,
10021// it's a problem that could be solved with better scheduling.
10022//
10023// People will be more likely to notice this and fix it with the long
10024// expiration time in development.
10025//
10026// In production we opt for better UX at the risk of masking scheduling
10027// problems, by expiring fast.
10028var HIGH_PRIORITY_EXPIRATION = 500;
10029var HIGH_PRIORITY_BATCH_SIZE = 100;
10030
10031function computeInteractiveExpiration(currentTime) {
10032 return computeExpirationBucket(currentTime, HIGH_PRIORITY_EXPIRATION, HIGH_PRIORITY_BATCH_SIZE);
10033}
10034
10035var NoContext = 0;
10036var ConcurrentMode = 1;
10037var StrictMode = 2;
10038var ProfileMode = 4;
10039
10040var hasBadMapPolyfill = void 0;
10041
10042{
10043 hasBadMapPolyfill = false;
10044 try {
10045 var nonExtensibleObject = Object.preventExtensions({});
10046 var testMap = new Map([[nonExtensibleObject, null]]);
10047 var testSet = new Set([nonExtensibleObject]);
10048 // This is necessary for Rollup to not consider these unused.
10049 // https://github.com/rollup/rollup/issues/1771
10050 // TODO: we can remove these if Rollup fixes the bug.
10051 testMap.set(0, 0);
10052 testSet.add(0);
10053 } catch (e) {
10054 // TODO: Consider warning about bad polyfills
10055 hasBadMapPolyfill = true;
10056 }
10057}
10058
10059// A Fiber is work on a Component that needs to be done or was done. There can
10060// be more than one per component.
10061
10062
10063var debugCounter = void 0;
10064
10065{
10066 debugCounter = 1;
10067}
10068
10069function FiberNode(tag, pendingProps, key, mode) {
10070 // Instance
10071 this.tag = tag;
10072 this.key = key;
10073 this.elementType = null;
10074 this.type = null;
10075 this.stateNode = null;
10076
10077 // Fiber
10078 this.return = null;
10079 this.child = null;
10080 this.sibling = null;
10081 this.index = 0;
10082
10083 this.ref = null;
10084
10085 this.pendingProps = pendingProps;
10086 this.memoizedProps = null;
10087 this.updateQueue = null;
10088 this.memoizedState = null;
10089 this.contextDependencies = null;
10090
10091 this.mode = mode;
10092
10093 // Effects
10094 this.effectTag = NoEffect;
10095 this.nextEffect = null;
10096
10097 this.firstEffect = null;
10098 this.lastEffect = null;
10099
10100 this.expirationTime = NoWork;
10101 this.childExpirationTime = NoWork;
10102
10103 this.alternate = null;
10104
10105 if (enableProfilerTimer) {
10106 // Note: The following is done to avoid a v8 performance cliff.
10107 //
10108 // Initializing the fields below to smis and later updating them with
10109 // double values will cause Fibers to end up having separate shapes.
10110 // This behavior/bug has something to do with Object.preventExtension().
10111 // Fortunately this only impacts DEV builds.
10112 // Unfortunately it makes React unusably slow for some applications.
10113 // To work around this, initialize the fields below with doubles.
10114 //
10115 // Learn more about this here:
10116 // https://github.com/facebook/react/issues/14365
10117 // https://bugs.chromium.org/p/v8/issues/detail?id=8538
10118 this.actualDuration = Number.NaN;
10119 this.actualStartTime = Number.NaN;
10120 this.selfBaseDuration = Number.NaN;
10121 this.treeBaseDuration = Number.NaN;
10122
10123 // It's okay to replace the initial doubles with smis after initialization.
10124 // This won't trigger the performance cliff mentioned above,
10125 // and it simplifies other profiler code (including DevTools).
10126 this.actualDuration = 0;
10127 this.actualStartTime = -1;
10128 this.selfBaseDuration = 0;
10129 this.treeBaseDuration = 0;
10130 }
10131
10132 {
10133 this._debugID = debugCounter++;
10134 this._debugSource = null;
10135 this._debugOwner = null;
10136 this._debugIsCurrentlyTiming = false;
10137 this._debugHookTypes = null;
10138 if (!hasBadMapPolyfill && typeof Object.preventExtensions === 'function') {
10139 Object.preventExtensions(this);
10140 }
10141 }
10142}
10143
10144// This is a constructor function, rather than a POJO constructor, still
10145// please ensure we do the following:
10146// 1) Nobody should add any instance methods on this. Instance methods can be
10147// more difficult to predict when they get optimized and they are almost
10148// never inlined properly in static compilers.
10149// 2) Nobody should rely on `instanceof Fiber` for type testing. We should
10150// always know when it is a fiber.
10151// 3) We might want to experiment with using numeric keys since they are easier
10152// to optimize in a non-JIT environment.
10153// 4) We can easily go from a constructor to a createFiber object literal if that
10154// is faster.
10155// 5) It should be easy to port this to a C struct and keep a C implementation
10156// compatible.
10157var createFiber = function (tag, pendingProps, key, mode) {
10158 // $FlowFixMe: the shapes are exact here but Flow doesn't like constructors
10159 return new FiberNode(tag, pendingProps, key, mode);
10160};
10161
10162function shouldConstruct(Component) {
10163 var prototype = Component.prototype;
10164 return !!(prototype && prototype.isReactComponent);
10165}
10166
10167function isSimpleFunctionComponent(type) {
10168 return typeof type === 'function' && !shouldConstruct(type) && type.defaultProps === undefined;
10169}
10170
10171function resolveLazyComponentTag(Component) {
10172 if (typeof Component === 'function') {
10173 return shouldConstruct(Component) ? ClassComponent : FunctionComponent;
10174 } else if (Component !== undefined && Component !== null) {
10175 var $$typeof = Component.$$typeof;
10176 if ($$typeof === REACT_FORWARD_REF_TYPE) {
10177 return ForwardRef;
10178 }
10179 if ($$typeof === REACT_MEMO_TYPE) {
10180 return MemoComponent;
10181 }
10182 }
10183 return IndeterminateComponent;
10184}
10185
10186// This is used to create an alternate fiber to do work on.
10187function createWorkInProgress(current, pendingProps, expirationTime) {
10188 var workInProgress = current.alternate;
10189 if (workInProgress === null) {
10190 // We use a double buffering pooling technique because we know that we'll
10191 // only ever need at most two versions of a tree. We pool the "other" unused
10192 // node that we're free to reuse. This is lazily created to avoid allocating
10193 // extra objects for things that are never updated. It also allow us to
10194 // reclaim the extra memory if needed.
10195 workInProgress = createFiber(current.tag, pendingProps, current.key, current.mode);
10196 workInProgress.elementType = current.elementType;
10197 workInProgress.type = current.type;
10198 workInProgress.stateNode = current.stateNode;
10199
10200 {
10201 // DEV-only fields
10202 workInProgress._debugID = current._debugID;
10203 workInProgress._debugSource = current._debugSource;
10204 workInProgress._debugOwner = current._debugOwner;
10205 workInProgress._debugHookTypes = current._debugHookTypes;
10206 }
10207
10208 workInProgress.alternate = current;
10209 current.alternate = workInProgress;
10210 } else {
10211 workInProgress.pendingProps = pendingProps;
10212
10213 // We already have an alternate.
10214 // Reset the effect tag.
10215 workInProgress.effectTag = NoEffect;
10216
10217 // The effect list is no longer valid.
10218 workInProgress.nextEffect = null;
10219 workInProgress.firstEffect = null;
10220 workInProgress.lastEffect = null;
10221
10222 if (enableProfilerTimer) {
10223 // We intentionally reset, rather than copy, actualDuration & actualStartTime.
10224 // This prevents time from endlessly accumulating in new commits.
10225 // This has the downside of resetting values for different priority renders,
10226 // But works for yielding (the common case) and should support resuming.
10227 workInProgress.actualDuration = 0;
10228 workInProgress.actualStartTime = -1;
10229 }
10230 }
10231
10232 workInProgress.childExpirationTime = current.childExpirationTime;
10233 workInProgress.expirationTime = current.expirationTime;
10234
10235 workInProgress.child = current.child;
10236 workInProgress.memoizedProps = current.memoizedProps;
10237 workInProgress.memoizedState = current.memoizedState;
10238 workInProgress.updateQueue = current.updateQueue;
10239 workInProgress.contextDependencies = current.contextDependencies;
10240
10241 // These will be overridden during the parent's reconciliation
10242 workInProgress.sibling = current.sibling;
10243 workInProgress.index = current.index;
10244 workInProgress.ref = current.ref;
10245
10246 if (enableProfilerTimer) {
10247 workInProgress.selfBaseDuration = current.selfBaseDuration;
10248 workInProgress.treeBaseDuration = current.treeBaseDuration;
10249 }
10250
10251 return workInProgress;
10252}
10253
10254function createHostRootFiber(isConcurrent) {
10255 var mode = isConcurrent ? ConcurrentMode | StrictMode : NoContext;
10256
10257 if (enableProfilerTimer && isDevToolsPresent) {
10258 // Always collect profile timings when DevTools are present.
10259 // This enables DevTools to start capturing timing at any point–
10260 // Without some nodes in the tree having empty base times.
10261 mode |= ProfileMode;
10262 }
10263
10264 return createFiber(HostRoot, null, null, mode);
10265}
10266
10267function createFiberFromTypeAndProps(type, // React$ElementType
10268key, pendingProps, owner, mode, expirationTime) {
10269 var fiber = void 0;
10270
10271 var fiberTag = IndeterminateComponent;
10272 // The resolved type is set if we know what the final type will be. I.e. it's not lazy.
10273 var resolvedType = type;
10274 if (typeof type === 'function') {
10275 if (shouldConstruct(type)) {
10276 fiberTag = ClassComponent;
10277 }
10278 } else if (typeof type === 'string') {
10279 fiberTag = HostComponent;
10280 } else {
10281 getTag: switch (type) {
10282 case REACT_FRAGMENT_TYPE:
10283 return createFiberFromFragment(pendingProps.children, mode, expirationTime, key);
10284 case REACT_CONCURRENT_MODE_TYPE:
10285 return createFiberFromMode(pendingProps, mode | ConcurrentMode | StrictMode, expirationTime, key);
10286 case REACT_STRICT_MODE_TYPE:
10287 return createFiberFromMode(pendingProps, mode | StrictMode, expirationTime, key);
10288 case REACT_PROFILER_TYPE:
10289 return createFiberFromProfiler(pendingProps, mode, expirationTime, key);
10290 case REACT_SUSPENSE_TYPE:
10291 return createFiberFromSuspense(pendingProps, mode, expirationTime, key);
10292 default:
10293 {
10294 if (typeof type === 'object' && type !== null) {
10295 switch (type.$$typeof) {
10296 case REACT_PROVIDER_TYPE:
10297 fiberTag = ContextProvider;
10298 break getTag;
10299 case REACT_CONTEXT_TYPE:
10300 // This is a consumer
10301 fiberTag = ContextConsumer;
10302 break getTag;
10303 case REACT_FORWARD_REF_TYPE:
10304 fiberTag = ForwardRef;
10305 break getTag;
10306 case REACT_MEMO_TYPE:
10307 fiberTag = MemoComponent;
10308 break getTag;
10309 case REACT_LAZY_TYPE:
10310 fiberTag = LazyComponent;
10311 resolvedType = null;
10312 break getTag;
10313 }
10314 }
10315 var info = '';
10316 {
10317 if (type === undefined || typeof type === 'object' && type !== null && Object.keys(type).length === 0) {
10318 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.';
10319 }
10320 var ownerName = owner ? getComponentName(owner.type) : null;
10321 if (ownerName) {
10322 info += '\n\nCheck the render method of `' + ownerName + '`.';
10323 }
10324 }
10325 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);
10326 }
10327 }
10328 }
10329
10330 fiber = createFiber(fiberTag, pendingProps, key, mode);
10331 fiber.elementType = type;
10332 fiber.type = resolvedType;
10333 fiber.expirationTime = expirationTime;
10334
10335 return fiber;
10336}
10337
10338function createFiberFromElement(element, mode, expirationTime) {
10339 var owner = null;
10340 {
10341 owner = element._owner;
10342 }
10343 var type = element.type;
10344 var key = element.key;
10345 var pendingProps = element.props;
10346 var fiber = createFiberFromTypeAndProps(type, key, pendingProps, owner, mode, expirationTime);
10347 {
10348 fiber._debugSource = element._source;
10349 fiber._debugOwner = element._owner;
10350 }
10351 return fiber;
10352}
10353
10354function createFiberFromFragment(elements, mode, expirationTime, key) {
10355 var fiber = createFiber(Fragment, elements, key, mode);
10356 fiber.expirationTime = expirationTime;
10357 return fiber;
10358}
10359
10360function createFiberFromProfiler(pendingProps, mode, expirationTime, key) {
10361 {
10362 if (typeof pendingProps.id !== 'string' || typeof pendingProps.onRender !== 'function') {
10363 warningWithoutStack$1(false, 'Profiler must specify an "id" string and "onRender" function as props');
10364 }
10365 }
10366
10367 var fiber = createFiber(Profiler, pendingProps, key, mode | ProfileMode);
10368 // TODO: The Profiler fiber shouldn't have a type. It has a tag.
10369 fiber.elementType = REACT_PROFILER_TYPE;
10370 fiber.type = REACT_PROFILER_TYPE;
10371 fiber.expirationTime = expirationTime;
10372
10373 return fiber;
10374}
10375
10376function createFiberFromMode(pendingProps, mode, expirationTime, key) {
10377 var fiber = createFiber(Mode, pendingProps, key, mode);
10378
10379 // TODO: The Mode fiber shouldn't have a type. It has a tag.
10380 var type = (mode & ConcurrentMode) === NoContext ? REACT_STRICT_MODE_TYPE : REACT_CONCURRENT_MODE_TYPE;
10381 fiber.elementType = type;
10382 fiber.type = type;
10383
10384 fiber.expirationTime = expirationTime;
10385 return fiber;
10386}
10387
10388function createFiberFromSuspense(pendingProps, mode, expirationTime, key) {
10389 var fiber = createFiber(SuspenseComponent, pendingProps, key, mode);
10390
10391 // TODO: The SuspenseComponent fiber shouldn't have a type. It has a tag.
10392 var type = REACT_SUSPENSE_TYPE;
10393 fiber.elementType = type;
10394 fiber.type = type;
10395
10396 fiber.expirationTime = expirationTime;
10397 return fiber;
10398}
10399
10400function createFiberFromText(content, mode, expirationTime) {
10401 var fiber = createFiber(HostText, content, null, mode);
10402 fiber.expirationTime = expirationTime;
10403 return fiber;
10404}
10405
10406function createFiberFromHostInstanceForDeletion() {
10407 var fiber = createFiber(HostComponent, null, null, NoContext);
10408 // TODO: These should not need a type.
10409 fiber.elementType = 'DELETED';
10410 fiber.type = 'DELETED';
10411 return fiber;
10412}
10413
10414function createFiberFromPortal(portal, mode, expirationTime) {
10415 var pendingProps = portal.children !== null ? portal.children : [];
10416 var fiber = createFiber(HostPortal, pendingProps, portal.key, mode);
10417 fiber.expirationTime = expirationTime;
10418 fiber.stateNode = {
10419 containerInfo: portal.containerInfo,
10420 pendingChildren: null, // Used by persistent updates
10421 implementation: portal.implementation
10422 };
10423 return fiber;
10424}
10425
10426// Used for stashing WIP properties to replay failed work in DEV.
10427function assignFiberPropertiesInDEV(target, source) {
10428 if (target === null) {
10429 // This Fiber's initial properties will always be overwritten.
10430 // We only use a Fiber to ensure the same hidden class so DEV isn't slow.
10431 target = createFiber(IndeterminateComponent, null, null, NoContext);
10432 }
10433
10434 // This is intentionally written as a list of all properties.
10435 // We tried to use Object.assign() instead but this is called in
10436 // the hottest path, and Object.assign() was too slow:
10437 // https://github.com/facebook/react/issues/12502
10438 // This code is DEV-only so size is not a concern.
10439
10440 target.tag = source.tag;
10441 target.key = source.key;
10442 target.elementType = source.elementType;
10443 target.type = source.type;
10444 target.stateNode = source.stateNode;
10445 target.return = source.return;
10446 target.child = source.child;
10447 target.sibling = source.sibling;
10448 target.index = source.index;
10449 target.ref = source.ref;
10450 target.pendingProps = source.pendingProps;
10451 target.memoizedProps = source.memoizedProps;
10452 target.updateQueue = source.updateQueue;
10453 target.memoizedState = source.memoizedState;
10454 target.contextDependencies = source.contextDependencies;
10455 target.mode = source.mode;
10456 target.effectTag = source.effectTag;
10457 target.nextEffect = source.nextEffect;
10458 target.firstEffect = source.firstEffect;
10459 target.lastEffect = source.lastEffect;
10460 target.expirationTime = source.expirationTime;
10461 target.childExpirationTime = source.childExpirationTime;
10462 target.alternate = source.alternate;
10463 if (enableProfilerTimer) {
10464 target.actualDuration = source.actualDuration;
10465 target.actualStartTime = source.actualStartTime;
10466 target.selfBaseDuration = source.selfBaseDuration;
10467 target.treeBaseDuration = source.treeBaseDuration;
10468 }
10469 target._debugID = source._debugID;
10470 target._debugSource = source._debugSource;
10471 target._debugOwner = source._debugOwner;
10472 target._debugIsCurrentlyTiming = source._debugIsCurrentlyTiming;
10473 target._debugHookTypes = source._debugHookTypes;
10474 return target;
10475}
10476
10477var ReactInternals$2 = React.__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED;
10478
10479var _ReactInternals$Sched$1 = ReactInternals$2.SchedulerTracing;
10480var __interactionsRef = _ReactInternals$Sched$1.__interactionsRef;
10481var __subscriberRef = _ReactInternals$Sched$1.__subscriberRef;
10482var unstable_clear = _ReactInternals$Sched$1.unstable_clear;
10483var unstable_getCurrent = _ReactInternals$Sched$1.unstable_getCurrent;
10484var unstable_getThreadID = _ReactInternals$Sched$1.unstable_getThreadID;
10485var unstable_subscribe = _ReactInternals$Sched$1.unstable_subscribe;
10486var unstable_trace = _ReactInternals$Sched$1.unstable_trace;
10487var unstable_unsubscribe = _ReactInternals$Sched$1.unstable_unsubscribe;
10488var unstable_wrap = _ReactInternals$Sched$1.unstable_wrap;
10489
10490// TODO: This should be lifted into the renderer.
10491
10492
10493// The following attributes are only used by interaction tracing builds.
10494// They enable interactions to be associated with their async work,
10495// And expose interaction metadata to the React DevTools Profiler plugin.
10496// Note that these attributes are only defined when the enableSchedulerTracing flag is enabled.
10497
10498
10499// Exported FiberRoot type includes all properties,
10500// To avoid requiring potentially error-prone :any casts throughout the project.
10501// Profiling properties are only safe to access in profiling builds (when enableSchedulerTracing is true).
10502// The types are defined separately within this file to ensure they stay in sync.
10503// (We don't have to use an inline :any cast when enableSchedulerTracing is disabled.)
10504
10505
10506function createFiberRoot(containerInfo, isConcurrent, hydrate) {
10507 // Cyclic construction. This cheats the type system right now because
10508 // stateNode is any.
10509 var uninitializedFiber = createHostRootFiber(isConcurrent);
10510
10511 var root = void 0;
10512 if (enableSchedulerTracing) {
10513 root = {
10514 current: uninitializedFiber,
10515 containerInfo: containerInfo,
10516 pendingChildren: null,
10517
10518 earliestPendingTime: NoWork,
10519 latestPendingTime: NoWork,
10520 earliestSuspendedTime: NoWork,
10521 latestSuspendedTime: NoWork,
10522 latestPingedTime: NoWork,
10523
10524 pingCache: null,
10525
10526 didError: false,
10527
10528 pendingCommitExpirationTime: NoWork,
10529 finishedWork: null,
10530 timeoutHandle: noTimeout,
10531 context: null,
10532 pendingContext: null,
10533 hydrate: hydrate,
10534 nextExpirationTimeToWorkOn: NoWork,
10535 expirationTime: NoWork,
10536 firstBatch: null,
10537 nextScheduledRoot: null,
10538
10539 interactionThreadID: unstable_getThreadID(),
10540 memoizedInteractions: new Set(),
10541 pendingInteractionMap: new Map()
10542 };
10543 } else {
10544 root = {
10545 current: uninitializedFiber,
10546 containerInfo: containerInfo,
10547 pendingChildren: null,
10548
10549 pingCache: null,
10550
10551 earliestPendingTime: NoWork,
10552 latestPendingTime: NoWork,
10553 earliestSuspendedTime: NoWork,
10554 latestSuspendedTime: NoWork,
10555 latestPingedTime: NoWork,
10556
10557 didError: false,
10558
10559 pendingCommitExpirationTime: NoWork,
10560 finishedWork: null,
10561 timeoutHandle: noTimeout,
10562 context: null,
10563 pendingContext: null,
10564 hydrate: hydrate,
10565 nextExpirationTimeToWorkOn: NoWork,
10566 expirationTime: NoWork,
10567 firstBatch: null,
10568 nextScheduledRoot: null
10569 };
10570 }
10571
10572 uninitializedFiber.stateNode = root;
10573
10574 // The reason for the way the Flow types are structured in this file,
10575 // Is to avoid needing :any casts everywhere interaction tracing fields are used.
10576 // Unfortunately that requires an :any cast for non-interaction tracing capable builds.
10577 // $FlowFixMe Remove this :any cast and replace it with something better.
10578 return root;
10579}
10580
10581/**
10582 * Forked from fbjs/warning:
10583 * https://github.com/facebook/fbjs/blob/e66ba20ad5be433eb54423f2b097d829324d9de6/packages/fbjs/src/__forks__/warning.js
10584 *
10585 * Only change is we use console.warn instead of console.error,
10586 * and do nothing when 'console' is not supported.
10587 * This really simplifies the code.
10588 * ---
10589 * Similar to invariant but only logs a warning if the condition is not met.
10590 * This can be used to log issues in development environments in critical
10591 * paths. Removing the logging code for production environments will keep the
10592 * same logic and follow the same code paths.
10593 */
10594
10595var lowPriorityWarning = function () {};
10596
10597{
10598 var printWarning$1 = function (format) {
10599 for (var _len = arguments.length, args = Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) {
10600 args[_key - 1] = arguments[_key];
10601 }
10602
10603 var argIndex = 0;
10604 var message = 'Warning: ' + format.replace(/%s/g, function () {
10605 return args[argIndex++];
10606 });
10607 if (typeof console !== 'undefined') {
10608 console.warn(message);
10609 }
10610 try {
10611 // --- Welcome to debugging React ---
10612 // This error was thrown as a convenience so that you can use this stack
10613 // to find the callsite that caused this warning to fire.
10614 throw new Error(message);
10615 } catch (x) {}
10616 };
10617
10618 lowPriorityWarning = function (condition, format) {
10619 if (format === undefined) {
10620 throw new Error('`lowPriorityWarning(condition, format, ...args)` requires a warning ' + 'message argument');
10621 }
10622 if (!condition) {
10623 for (var _len2 = arguments.length, args = Array(_len2 > 2 ? _len2 - 2 : 0), _key2 = 2; _key2 < _len2; _key2++) {
10624 args[_key2 - 2] = arguments[_key2];
10625 }
10626
10627 printWarning$1.apply(undefined, [format].concat(args));
10628 }
10629 };
10630}
10631
10632var lowPriorityWarning$1 = lowPriorityWarning;
10633
10634var ReactStrictModeWarnings = {
10635 discardPendingWarnings: function () {},
10636 flushPendingDeprecationWarnings: function () {},
10637 flushPendingUnsafeLifecycleWarnings: function () {},
10638 recordDeprecationWarnings: function (fiber, instance) {},
10639 recordUnsafeLifecycleWarnings: function (fiber, instance) {},
10640 recordLegacyContextWarning: function (fiber, instance) {},
10641 flushLegacyContextWarning: function () {}
10642};
10643
10644{
10645 var LIFECYCLE_SUGGESTIONS = {
10646 UNSAFE_componentWillMount: 'componentDidMount',
10647 UNSAFE_componentWillReceiveProps: 'static getDerivedStateFromProps',
10648 UNSAFE_componentWillUpdate: 'componentDidUpdate'
10649 };
10650
10651 var pendingComponentWillMountWarnings = [];
10652 var pendingComponentWillReceivePropsWarnings = [];
10653 var pendingComponentWillUpdateWarnings = [];
10654 var pendingUnsafeLifecycleWarnings = new Map();
10655 var pendingLegacyContextWarning = new Map();
10656
10657 // Tracks components we have already warned about.
10658 var didWarnAboutDeprecatedLifecycles = new Set();
10659 var didWarnAboutUnsafeLifecycles = new Set();
10660 var didWarnAboutLegacyContext = new Set();
10661
10662 var setToSortedString = function (set) {
10663 var array = [];
10664 set.forEach(function (value) {
10665 array.push(value);
10666 });
10667 return array.sort().join(', ');
10668 };
10669
10670 ReactStrictModeWarnings.discardPendingWarnings = function () {
10671 pendingComponentWillMountWarnings = [];
10672 pendingComponentWillReceivePropsWarnings = [];
10673 pendingComponentWillUpdateWarnings = [];
10674 pendingUnsafeLifecycleWarnings = new Map();
10675 pendingLegacyContextWarning = new Map();
10676 };
10677
10678 ReactStrictModeWarnings.flushPendingUnsafeLifecycleWarnings = function () {
10679 pendingUnsafeLifecycleWarnings.forEach(function (lifecycleWarningsMap, strictRoot) {
10680 var lifecyclesWarningMessages = [];
10681
10682 Object.keys(lifecycleWarningsMap).forEach(function (lifecycle) {
10683 var lifecycleWarnings = lifecycleWarningsMap[lifecycle];
10684 if (lifecycleWarnings.length > 0) {
10685 var componentNames = new Set();
10686 lifecycleWarnings.forEach(function (fiber) {
10687 componentNames.add(getComponentName(fiber.type) || 'Component');
10688 didWarnAboutUnsafeLifecycles.add(fiber.type);
10689 });
10690
10691 var formatted = lifecycle.replace('UNSAFE_', '');
10692 var suggestion = LIFECYCLE_SUGGESTIONS[lifecycle];
10693 var sortedComponentNames = setToSortedString(componentNames);
10694
10695 lifecyclesWarningMessages.push(formatted + ': Please update the following components to use ' + (suggestion + ' instead: ' + sortedComponentNames));
10696 }
10697 });
10698
10699 if (lifecyclesWarningMessages.length > 0) {
10700 var strictRootComponentStack = getStackByFiberInDevAndProd(strictRoot);
10701
10702 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'));
10703 }
10704 });
10705
10706 pendingUnsafeLifecycleWarnings = new Map();
10707 };
10708
10709 var findStrictRoot = function (fiber) {
10710 var maybeStrictRoot = null;
10711
10712 var node = fiber;
10713 while (node !== null) {
10714 if (node.mode & StrictMode) {
10715 maybeStrictRoot = node;
10716 }
10717 node = node.return;
10718 }
10719
10720 return maybeStrictRoot;
10721 };
10722
10723 ReactStrictModeWarnings.flushPendingDeprecationWarnings = function () {
10724 if (pendingComponentWillMountWarnings.length > 0) {
10725 var uniqueNames = new Set();
10726 pendingComponentWillMountWarnings.forEach(function (fiber) {
10727 uniqueNames.add(getComponentName(fiber.type) || 'Component');
10728 didWarnAboutDeprecatedLifecycles.add(fiber.type);
10729 });
10730
10731 var sortedNames = setToSortedString(uniqueNames);
10732
10733 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);
10734
10735 pendingComponentWillMountWarnings = [];
10736 }
10737
10738 if (pendingComponentWillReceivePropsWarnings.length > 0) {
10739 var _uniqueNames = new Set();
10740 pendingComponentWillReceivePropsWarnings.forEach(function (fiber) {
10741 _uniqueNames.add(getComponentName(fiber.type) || 'Component');
10742 didWarnAboutDeprecatedLifecycles.add(fiber.type);
10743 });
10744
10745 var _sortedNames = setToSortedString(_uniqueNames);
10746
10747 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);
10748
10749 pendingComponentWillReceivePropsWarnings = [];
10750 }
10751
10752 if (pendingComponentWillUpdateWarnings.length > 0) {
10753 var _uniqueNames2 = new Set();
10754 pendingComponentWillUpdateWarnings.forEach(function (fiber) {
10755 _uniqueNames2.add(getComponentName(fiber.type) || 'Component');
10756 didWarnAboutDeprecatedLifecycles.add(fiber.type);
10757 });
10758
10759 var _sortedNames2 = setToSortedString(_uniqueNames2);
10760
10761 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);
10762
10763 pendingComponentWillUpdateWarnings = [];
10764 }
10765 };
10766
10767 ReactStrictModeWarnings.recordDeprecationWarnings = function (fiber, instance) {
10768 // Dedup strategy: Warn once per component.
10769 if (didWarnAboutDeprecatedLifecycles.has(fiber.type)) {
10770 return;
10771 }
10772
10773 // Don't warn about react-lifecycles-compat polyfilled components.
10774 if (typeof instance.componentWillMount === 'function' && instance.componentWillMount.__suppressDeprecationWarning !== true) {
10775 pendingComponentWillMountWarnings.push(fiber);
10776 }
10777 if (typeof instance.componentWillReceiveProps === 'function' && instance.componentWillReceiveProps.__suppressDeprecationWarning !== true) {
10778 pendingComponentWillReceivePropsWarnings.push(fiber);
10779 }
10780 if (typeof instance.componentWillUpdate === 'function' && instance.componentWillUpdate.__suppressDeprecationWarning !== true) {
10781 pendingComponentWillUpdateWarnings.push(fiber);
10782 }
10783 };
10784
10785 ReactStrictModeWarnings.recordUnsafeLifecycleWarnings = function (fiber, instance) {
10786 var strictRoot = findStrictRoot(fiber);
10787 if (strictRoot === null) {
10788 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.');
10789 return;
10790 }
10791
10792 // Dedup strategy: Warn once per component.
10793 // This is difficult to track any other way since component names
10794 // are often vague and are likely to collide between 3rd party libraries.
10795 // An expand property is probably okay to use here since it's DEV-only,
10796 // and will only be set in the event of serious warnings.
10797 if (didWarnAboutUnsafeLifecycles.has(fiber.type)) {
10798 return;
10799 }
10800
10801 var warningsForRoot = void 0;
10802 if (!pendingUnsafeLifecycleWarnings.has(strictRoot)) {
10803 warningsForRoot = {
10804 UNSAFE_componentWillMount: [],
10805 UNSAFE_componentWillReceiveProps: [],
10806 UNSAFE_componentWillUpdate: []
10807 };
10808
10809 pendingUnsafeLifecycleWarnings.set(strictRoot, warningsForRoot);
10810 } else {
10811 warningsForRoot = pendingUnsafeLifecycleWarnings.get(strictRoot);
10812 }
10813
10814 var unsafeLifecycles = [];
10815 if (typeof instance.componentWillMount === 'function' && instance.componentWillMount.__suppressDeprecationWarning !== true || typeof instance.UNSAFE_componentWillMount === 'function') {
10816 unsafeLifecycles.push('UNSAFE_componentWillMount');
10817 }
10818 if (typeof instance.componentWillReceiveProps === 'function' && instance.componentWillReceiveProps.__suppressDeprecationWarning !== true || typeof instance.UNSAFE_componentWillReceiveProps === 'function') {
10819 unsafeLifecycles.push('UNSAFE_componentWillReceiveProps');
10820 }
10821 if (typeof instance.componentWillUpdate === 'function' && instance.componentWillUpdate.__suppressDeprecationWarning !== true || typeof instance.UNSAFE_componentWillUpdate === 'function') {
10822 unsafeLifecycles.push('UNSAFE_componentWillUpdate');
10823 }
10824
10825 if (unsafeLifecycles.length > 0) {
10826 unsafeLifecycles.forEach(function (lifecycle) {
10827 warningsForRoot[lifecycle].push(fiber);
10828 });
10829 }
10830 };
10831
10832 ReactStrictModeWarnings.recordLegacyContextWarning = function (fiber, instance) {
10833 var strictRoot = findStrictRoot(fiber);
10834 if (strictRoot === null) {
10835 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.');
10836 return;
10837 }
10838
10839 // Dedup strategy: Warn once per component.
10840 if (didWarnAboutLegacyContext.has(fiber.type)) {
10841 return;
10842 }
10843
10844 var warningsForRoot = pendingLegacyContextWarning.get(strictRoot);
10845
10846 if (fiber.type.contextTypes != null || fiber.type.childContextTypes != null || instance !== null && typeof instance.getChildContext === 'function') {
10847 if (warningsForRoot === undefined) {
10848 warningsForRoot = [];
10849 pendingLegacyContextWarning.set(strictRoot, warningsForRoot);
10850 }
10851 warningsForRoot.push(fiber);
10852 }
10853 };
10854
10855 ReactStrictModeWarnings.flushLegacyContextWarning = function () {
10856 pendingLegacyContextWarning.forEach(function (fiberArray, strictRoot) {
10857 var uniqueNames = new Set();
10858 fiberArray.forEach(function (fiber) {
10859 uniqueNames.add(getComponentName(fiber.type) || 'Component');
10860 didWarnAboutLegacyContext.add(fiber.type);
10861 });
10862
10863 var sortedNames = setToSortedString(uniqueNames);
10864 var strictRootComponentStack = getStackByFiberInDevAndProd(strictRoot);
10865
10866 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);
10867 });
10868 };
10869}
10870
10871// This lets us hook into Fiber to debug what it's doing.
10872// See https://github.com/facebook/react/pull/8033.
10873// This is not part of the public API, not even for React DevTools.
10874// You may only inject a debugTool if you work on React Fiber itself.
10875var ReactFiberInstrumentation = {
10876 debugTool: null
10877};
10878
10879var ReactFiberInstrumentation_1 = ReactFiberInstrumentation;
10880
10881// TODO: Offscreen updates should never suspend. However, a promise that
10882// suspended inside an offscreen subtree should be able to ping at the priority
10883// of the outer render.
10884
10885function markPendingPriorityLevel(root, expirationTime) {
10886 // If there's a gap between completing a failed root and retrying it,
10887 // additional updates may be scheduled. Clear `didError`, in case the update
10888 // is sufficient to fix the error.
10889 root.didError = false;
10890
10891 // Update the latest and earliest pending times
10892 var earliestPendingTime = root.earliestPendingTime;
10893 if (earliestPendingTime === NoWork) {
10894 // No other pending updates.
10895 root.earliestPendingTime = root.latestPendingTime = expirationTime;
10896 } else {
10897 if (earliestPendingTime < expirationTime) {
10898 // This is the earliest pending update.
10899 root.earliestPendingTime = expirationTime;
10900 } else {
10901 var latestPendingTime = root.latestPendingTime;
10902 if (latestPendingTime > expirationTime) {
10903 // This is the latest pending update
10904 root.latestPendingTime = expirationTime;
10905 }
10906 }
10907 }
10908 findNextExpirationTimeToWorkOn(expirationTime, root);
10909}
10910
10911function markCommittedPriorityLevels(root, earliestRemainingTime) {
10912 root.didError = false;
10913
10914 if (earliestRemainingTime === NoWork) {
10915 // Fast path. There's no remaining work. Clear everything.
10916 root.earliestPendingTime = NoWork;
10917 root.latestPendingTime = NoWork;
10918 root.earliestSuspendedTime = NoWork;
10919 root.latestSuspendedTime = NoWork;
10920 root.latestPingedTime = NoWork;
10921 findNextExpirationTimeToWorkOn(NoWork, root);
10922 return;
10923 }
10924
10925 if (earliestRemainingTime < root.latestPingedTime) {
10926 root.latestPingedTime = NoWork;
10927 }
10928
10929 // Let's see if the previous latest known pending level was just flushed.
10930 var latestPendingTime = root.latestPendingTime;
10931 if (latestPendingTime !== NoWork) {
10932 if (latestPendingTime > earliestRemainingTime) {
10933 // We've flushed all the known pending levels.
10934 root.earliestPendingTime = root.latestPendingTime = NoWork;
10935 } else {
10936 var earliestPendingTime = root.earliestPendingTime;
10937 if (earliestPendingTime > earliestRemainingTime) {
10938 // We've flushed the earliest known pending level. Set this to the
10939 // latest pending time.
10940 root.earliestPendingTime = root.latestPendingTime;
10941 }
10942 }
10943 }
10944
10945 // Now let's handle the earliest remaining level in the whole tree. We need to
10946 // decide whether to treat it as a pending level or as suspended. Check
10947 // it falls within the range of known suspended levels.
10948
10949 var earliestSuspendedTime = root.earliestSuspendedTime;
10950 if (earliestSuspendedTime === NoWork) {
10951 // There's no suspended work. Treat the earliest remaining level as a
10952 // pending level.
10953 markPendingPriorityLevel(root, earliestRemainingTime);
10954 findNextExpirationTimeToWorkOn(NoWork, root);
10955 return;
10956 }
10957
10958 var latestSuspendedTime = root.latestSuspendedTime;
10959 if (earliestRemainingTime < latestSuspendedTime) {
10960 // The earliest remaining level is later than all the suspended work. That
10961 // means we've flushed all the suspended work.
10962 root.earliestSuspendedTime = NoWork;
10963 root.latestSuspendedTime = NoWork;
10964 root.latestPingedTime = NoWork;
10965
10966 // There's no suspended work. Treat the earliest remaining level as a
10967 // pending level.
10968 markPendingPriorityLevel(root, earliestRemainingTime);
10969 findNextExpirationTimeToWorkOn(NoWork, root);
10970 return;
10971 }
10972
10973 if (earliestRemainingTime > earliestSuspendedTime) {
10974 // The earliest remaining time is earlier than all the suspended work.
10975 // Treat it as a pending update.
10976 markPendingPriorityLevel(root, earliestRemainingTime);
10977 findNextExpirationTimeToWorkOn(NoWork, root);
10978 return;
10979 }
10980
10981 // The earliest remaining time falls within the range of known suspended
10982 // levels. We should treat this as suspended work.
10983 findNextExpirationTimeToWorkOn(NoWork, root);
10984}
10985
10986function hasLowerPriorityWork(root, erroredExpirationTime) {
10987 var latestPendingTime = root.latestPendingTime;
10988 var latestSuspendedTime = root.latestSuspendedTime;
10989 var latestPingedTime = root.latestPingedTime;
10990 return latestPendingTime !== NoWork && latestPendingTime < erroredExpirationTime || latestSuspendedTime !== NoWork && latestSuspendedTime < erroredExpirationTime || latestPingedTime !== NoWork && latestPingedTime < erroredExpirationTime;
10991}
10992
10993function isPriorityLevelSuspended(root, expirationTime) {
10994 var earliestSuspendedTime = root.earliestSuspendedTime;
10995 var latestSuspendedTime = root.latestSuspendedTime;
10996 return earliestSuspendedTime !== NoWork && expirationTime <= earliestSuspendedTime && expirationTime >= latestSuspendedTime;
10997}
10998
10999function markSuspendedPriorityLevel(root, suspendedTime) {
11000 root.didError = false;
11001 clearPing(root, suspendedTime);
11002
11003 // First, check the known pending levels and update them if needed.
11004 var earliestPendingTime = root.earliestPendingTime;
11005 var latestPendingTime = root.latestPendingTime;
11006 if (earliestPendingTime === suspendedTime) {
11007 if (latestPendingTime === suspendedTime) {
11008 // Both known pending levels were suspended. Clear them.
11009 root.earliestPendingTime = root.latestPendingTime = NoWork;
11010 } else {
11011 // The earliest pending level was suspended. Clear by setting it to the
11012 // latest pending level.
11013 root.earliestPendingTime = latestPendingTime;
11014 }
11015 } else if (latestPendingTime === suspendedTime) {
11016 // The latest pending level was suspended. Clear by setting it to the
11017 // latest pending level.
11018 root.latestPendingTime = earliestPendingTime;
11019 }
11020
11021 // Finally, update the known suspended levels.
11022 var earliestSuspendedTime = root.earliestSuspendedTime;
11023 var latestSuspendedTime = root.latestSuspendedTime;
11024 if (earliestSuspendedTime === NoWork) {
11025 // No other suspended levels.
11026 root.earliestSuspendedTime = root.latestSuspendedTime = suspendedTime;
11027 } else {
11028 if (earliestSuspendedTime < suspendedTime) {
11029 // This is the earliest suspended level.
11030 root.earliestSuspendedTime = suspendedTime;
11031 } else if (latestSuspendedTime > suspendedTime) {
11032 // This is the latest suspended level
11033 root.latestSuspendedTime = suspendedTime;
11034 }
11035 }
11036
11037 findNextExpirationTimeToWorkOn(suspendedTime, root);
11038}
11039
11040function markPingedPriorityLevel(root, pingedTime) {
11041 root.didError = false;
11042
11043 // TODO: When we add back resuming, we need to ensure the progressed work
11044 // is thrown out and not reused during the restarted render. One way to
11045 // invalidate the progressed work is to restart at expirationTime + 1.
11046 var latestPingedTime = root.latestPingedTime;
11047 if (latestPingedTime === NoWork || latestPingedTime > pingedTime) {
11048 root.latestPingedTime = pingedTime;
11049 }
11050 findNextExpirationTimeToWorkOn(pingedTime, root);
11051}
11052
11053function clearPing(root, completedTime) {
11054 var latestPingedTime = root.latestPingedTime;
11055 if (latestPingedTime >= completedTime) {
11056 root.latestPingedTime = NoWork;
11057 }
11058}
11059
11060function findEarliestOutstandingPriorityLevel(root, renderExpirationTime) {
11061 var earliestExpirationTime = renderExpirationTime;
11062
11063 var earliestPendingTime = root.earliestPendingTime;
11064 var earliestSuspendedTime = root.earliestSuspendedTime;
11065 if (earliestPendingTime > earliestExpirationTime) {
11066 earliestExpirationTime = earliestPendingTime;
11067 }
11068 if (earliestSuspendedTime > earliestExpirationTime) {
11069 earliestExpirationTime = earliestSuspendedTime;
11070 }
11071 return earliestExpirationTime;
11072}
11073
11074function didExpireAtExpirationTime(root, currentTime) {
11075 var expirationTime = root.expirationTime;
11076 if (expirationTime !== NoWork && currentTime <= expirationTime) {
11077 // The root has expired. Flush all work up to the current time.
11078 root.nextExpirationTimeToWorkOn = currentTime;
11079 }
11080}
11081
11082function findNextExpirationTimeToWorkOn(completedExpirationTime, root) {
11083 var earliestSuspendedTime = root.earliestSuspendedTime;
11084 var latestSuspendedTime = root.latestSuspendedTime;
11085 var earliestPendingTime = root.earliestPendingTime;
11086 var latestPingedTime = root.latestPingedTime;
11087
11088 // Work on the earliest pending time. Failing that, work on the latest
11089 // pinged time.
11090 var nextExpirationTimeToWorkOn = earliestPendingTime !== NoWork ? earliestPendingTime : latestPingedTime;
11091
11092 // If there is no pending or pinged work, check if there's suspended work
11093 // that's lower priority than what we just completed.
11094 if (nextExpirationTimeToWorkOn === NoWork && (completedExpirationTime === NoWork || latestSuspendedTime < completedExpirationTime)) {
11095 // The lowest priority suspended work is the work most likely to be
11096 // committed next. Let's start rendering it again, so that if it times out,
11097 // it's ready to commit.
11098 nextExpirationTimeToWorkOn = latestSuspendedTime;
11099 }
11100
11101 var expirationTime = nextExpirationTimeToWorkOn;
11102 if (expirationTime !== NoWork && earliestSuspendedTime > expirationTime) {
11103 // Expire using the earliest known expiration time.
11104 expirationTime = earliestSuspendedTime;
11105 }
11106
11107 root.nextExpirationTimeToWorkOn = nextExpirationTimeToWorkOn;
11108 root.expirationTime = expirationTime;
11109}
11110
11111function resolveDefaultProps(Component, baseProps) {
11112 if (Component && Component.defaultProps) {
11113 // Resolve default props. Taken from ReactElement
11114 var props = _assign({}, baseProps);
11115 var defaultProps = Component.defaultProps;
11116 for (var propName in defaultProps) {
11117 if (props[propName] === undefined) {
11118 props[propName] = defaultProps[propName];
11119 }
11120 }
11121 return props;
11122 }
11123 return baseProps;
11124}
11125
11126function readLazyComponentType(lazyComponent) {
11127 var status = lazyComponent._status;
11128 var result = lazyComponent._result;
11129 switch (status) {
11130 case Resolved:
11131 {
11132 var Component = result;
11133 return Component;
11134 }
11135 case Rejected:
11136 {
11137 var error = result;
11138 throw error;
11139 }
11140 case Pending:
11141 {
11142 var thenable = result;
11143 throw thenable;
11144 }
11145 default:
11146 {
11147 lazyComponent._status = Pending;
11148 var ctor = lazyComponent._ctor;
11149 var _thenable = ctor();
11150 _thenable.then(function (moduleObject) {
11151 if (lazyComponent._status === Pending) {
11152 var defaultExport = moduleObject.default;
11153 {
11154 if (defaultExport === undefined) {
11155 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);
11156 }
11157 }
11158 lazyComponent._status = Resolved;
11159 lazyComponent._result = defaultExport;
11160 }
11161 }, function (error) {
11162 if (lazyComponent._status === Pending) {
11163 lazyComponent._status = Rejected;
11164 lazyComponent._result = error;
11165 }
11166 });
11167 // Handle synchronous thenables.
11168 switch (lazyComponent._status) {
11169 case Resolved:
11170 return lazyComponent._result;
11171 case Rejected:
11172 throw lazyComponent._result;
11173 }
11174 lazyComponent._result = _thenable;
11175 throw _thenable;
11176 }
11177 }
11178}
11179
11180var fakeInternalInstance = {};
11181var isArray$1 = Array.isArray;
11182
11183// React.Component uses a shared frozen object by default.
11184// We'll use it to determine whether we need to initialize legacy refs.
11185var emptyRefsObject = new React.Component().refs;
11186
11187var didWarnAboutStateAssignmentForComponent = void 0;
11188var didWarnAboutUninitializedState = void 0;
11189var didWarnAboutGetSnapshotBeforeUpdateWithoutDidUpdate = void 0;
11190var didWarnAboutLegacyLifecyclesAndDerivedState = void 0;
11191var didWarnAboutUndefinedDerivedState = void 0;
11192var warnOnUndefinedDerivedState = void 0;
11193var warnOnInvalidCallback$1 = void 0;
11194var didWarnAboutDirectlyAssigningPropsToState = void 0;
11195var didWarnAboutContextTypeAndContextTypes = void 0;
11196var didWarnAboutInvalidateContextType = void 0;
11197
11198{
11199 didWarnAboutStateAssignmentForComponent = new Set();
11200 didWarnAboutUninitializedState = new Set();
11201 didWarnAboutGetSnapshotBeforeUpdateWithoutDidUpdate = new Set();
11202 didWarnAboutLegacyLifecyclesAndDerivedState = new Set();
11203 didWarnAboutDirectlyAssigningPropsToState = new Set();
11204 didWarnAboutUndefinedDerivedState = new Set();
11205 didWarnAboutContextTypeAndContextTypes = new Set();
11206 didWarnAboutInvalidateContextType = new Set();
11207
11208 var didWarnOnInvalidCallback = new Set();
11209
11210 warnOnInvalidCallback$1 = function (callback, callerName) {
11211 if (callback === null || typeof callback === 'function') {
11212 return;
11213 }
11214 var key = callerName + '_' + callback;
11215 if (!didWarnOnInvalidCallback.has(key)) {
11216 didWarnOnInvalidCallback.add(key);
11217 warningWithoutStack$1(false, '%s(...): Expected the last optional `callback` argument to be a ' + 'function. Instead received: %s.', callerName, callback);
11218 }
11219 };
11220
11221 warnOnUndefinedDerivedState = function (type, partialState) {
11222 if (partialState === undefined) {
11223 var componentName = getComponentName(type) || 'Component';
11224 if (!didWarnAboutUndefinedDerivedState.has(componentName)) {
11225 didWarnAboutUndefinedDerivedState.add(componentName);
11226 warningWithoutStack$1(false, '%s.getDerivedStateFromProps(): A valid state object (or null) must be returned. ' + 'You have returned undefined.', componentName);
11227 }
11228 }
11229 };
11230
11231 // This is so gross but it's at least non-critical and can be removed if
11232 // it causes problems. This is meant to give a nicer error message for
11233 // ReactDOM15.unstable_renderSubtreeIntoContainer(reactDOM16Component,
11234 // ...)) which otherwise throws a "_processChildContext is not a function"
11235 // exception.
11236 Object.defineProperty(fakeInternalInstance, '_processChildContext', {
11237 enumerable: false,
11238 value: function () {
11239 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).');
11240 }
11241 });
11242 Object.freeze(fakeInternalInstance);
11243}
11244
11245function applyDerivedStateFromProps(workInProgress, ctor, getDerivedStateFromProps, nextProps) {
11246 var prevState = workInProgress.memoizedState;
11247
11248 {
11249 if (debugRenderPhaseSideEffects || debugRenderPhaseSideEffectsForStrictMode && workInProgress.mode & StrictMode) {
11250 // Invoke the function an extra time to help detect side-effects.
11251 getDerivedStateFromProps(nextProps, prevState);
11252 }
11253 }
11254
11255 var partialState = getDerivedStateFromProps(nextProps, prevState);
11256
11257 {
11258 warnOnUndefinedDerivedState(ctor, partialState);
11259 }
11260 // Merge the partial state and the previous state.
11261 var memoizedState = partialState === null || partialState === undefined ? prevState : _assign({}, prevState, partialState);
11262 workInProgress.memoizedState = memoizedState;
11263
11264 // Once the update queue is empty, persist the derived state onto the
11265 // base state.
11266 var updateQueue = workInProgress.updateQueue;
11267 if (updateQueue !== null && workInProgress.expirationTime === NoWork) {
11268 updateQueue.baseState = memoizedState;
11269 }
11270}
11271
11272var classComponentUpdater = {
11273 isMounted: isMounted,
11274 enqueueSetState: function (inst, payload, callback) {
11275 var fiber = get(inst);
11276 var currentTime = requestCurrentTime();
11277 var expirationTime = computeExpirationForFiber(currentTime, fiber);
11278
11279 var update = createUpdate(expirationTime);
11280 update.payload = payload;
11281 if (callback !== undefined && callback !== null) {
11282 {
11283 warnOnInvalidCallback$1(callback, 'setState');
11284 }
11285 update.callback = callback;
11286 }
11287
11288 flushPassiveEffects();
11289 enqueueUpdate(fiber, update);
11290 scheduleWork(fiber, expirationTime);
11291 },
11292 enqueueReplaceState: function (inst, payload, callback) {
11293 var fiber = get(inst);
11294 var currentTime = requestCurrentTime();
11295 var expirationTime = computeExpirationForFiber(currentTime, fiber);
11296
11297 var update = createUpdate(expirationTime);
11298 update.tag = ReplaceState;
11299 update.payload = payload;
11300
11301 if (callback !== undefined && callback !== null) {
11302 {
11303 warnOnInvalidCallback$1(callback, 'replaceState');
11304 }
11305 update.callback = callback;
11306 }
11307
11308 flushPassiveEffects();
11309 enqueueUpdate(fiber, update);
11310 scheduleWork(fiber, expirationTime);
11311 },
11312 enqueueForceUpdate: function (inst, callback) {
11313 var fiber = get(inst);
11314 var currentTime = requestCurrentTime();
11315 var expirationTime = computeExpirationForFiber(currentTime, fiber);
11316
11317 var update = createUpdate(expirationTime);
11318 update.tag = ForceUpdate;
11319
11320 if (callback !== undefined && callback !== null) {
11321 {
11322 warnOnInvalidCallback$1(callback, 'forceUpdate');
11323 }
11324 update.callback = callback;
11325 }
11326
11327 flushPassiveEffects();
11328 enqueueUpdate(fiber, update);
11329 scheduleWork(fiber, expirationTime);
11330 }
11331};
11332
11333function checkShouldComponentUpdate(workInProgress, ctor, oldProps, newProps, oldState, newState, nextContext) {
11334 var instance = workInProgress.stateNode;
11335 if (typeof instance.shouldComponentUpdate === 'function') {
11336 startPhaseTimer(workInProgress, 'shouldComponentUpdate');
11337 var shouldUpdate = instance.shouldComponentUpdate(newProps, newState, nextContext);
11338 stopPhaseTimer();
11339
11340 {
11341 !(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;
11342 }
11343
11344 return shouldUpdate;
11345 }
11346
11347 if (ctor.prototype && ctor.prototype.isPureReactComponent) {
11348 return !shallowEqual(oldProps, newProps) || !shallowEqual(oldState, newState);
11349 }
11350
11351 return true;
11352}
11353
11354function checkClassInstance(workInProgress, ctor, newProps) {
11355 var instance = workInProgress.stateNode;
11356 {
11357 var name = getComponentName(ctor) || 'Component';
11358 var renderPresent = instance.render;
11359
11360 if (!renderPresent) {
11361 if (ctor.prototype && typeof ctor.prototype.render === 'function') {
11362 warningWithoutStack$1(false, '%s(...): No `render` method found on the returned component ' + 'instance: did you accidentally return an object from the constructor?', name);
11363 } else {
11364 warningWithoutStack$1(false, '%s(...): No `render` method found on the returned component ' + 'instance: you may have forgotten to define `render`.', name);
11365 }
11366 }
11367
11368 var noGetInitialStateOnES6 = !instance.getInitialState || instance.getInitialState.isReactClassApproved || instance.state;
11369 !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;
11370 var noGetDefaultPropsOnES6 = !instance.getDefaultProps || instance.getDefaultProps.isReactClassApproved;
11371 !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;
11372 var noInstancePropTypes = !instance.propTypes;
11373 !noInstancePropTypes ? warningWithoutStack$1(false, 'propTypes was defined as an instance property on %s. Use a static ' + 'property to define propTypes instead.', name) : void 0;
11374 var noInstanceContextType = !instance.contextType;
11375 !noInstanceContextType ? warningWithoutStack$1(false, 'contextType was defined as an instance property on %s. Use a static ' + 'property to define contextType instead.', name) : void 0;
11376 var noInstanceContextTypes = !instance.contextTypes;
11377 !noInstanceContextTypes ? warningWithoutStack$1(false, 'contextTypes was defined as an instance property on %s. Use a static ' + 'property to define contextTypes instead.', name) : void 0;
11378
11379 if (ctor.contextType && ctor.contextTypes && !didWarnAboutContextTypeAndContextTypes.has(ctor)) {
11380 didWarnAboutContextTypeAndContextTypes.add(ctor);
11381 warningWithoutStack$1(false, '%s declares both contextTypes and contextType static properties. ' + 'The legacy contextTypes property will be ignored.', name);
11382 }
11383
11384 var noComponentShouldUpdate = typeof instance.componentShouldUpdate !== 'function';
11385 !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;
11386 if (ctor.prototype && ctor.prototype.isPureReactComponent && typeof instance.shouldComponentUpdate !== 'undefined') {
11387 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');
11388 }
11389 var noComponentDidUnmount = typeof instance.componentDidUnmount !== 'function';
11390 !noComponentDidUnmount ? warningWithoutStack$1(false, '%s has a method called ' + 'componentDidUnmount(). But there is no such lifecycle method. ' + 'Did you mean componentWillUnmount()?', name) : void 0;
11391 var noComponentDidReceiveProps = typeof instance.componentDidReceiveProps !== 'function';
11392 !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;
11393 var noComponentWillRecieveProps = typeof instance.componentWillRecieveProps !== 'function';
11394 !noComponentWillRecieveProps ? warningWithoutStack$1(false, '%s has a method called ' + 'componentWillRecieveProps(). Did you mean componentWillReceiveProps()?', name) : void 0;
11395 var noUnsafeComponentWillRecieveProps = typeof instance.UNSAFE_componentWillRecieveProps !== 'function';
11396 !noUnsafeComponentWillRecieveProps ? warningWithoutStack$1(false, '%s has a method called ' + 'UNSAFE_componentWillRecieveProps(). Did you mean UNSAFE_componentWillReceiveProps()?', name) : void 0;
11397 var hasMutatedProps = instance.props !== newProps;
11398 !(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;
11399 var noInstanceDefaultProps = !instance.defaultProps;
11400 !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;
11401
11402 if (typeof instance.getSnapshotBeforeUpdate === 'function' && typeof instance.componentDidUpdate !== 'function' && !didWarnAboutGetSnapshotBeforeUpdateWithoutDidUpdate.has(ctor)) {
11403 didWarnAboutGetSnapshotBeforeUpdateWithoutDidUpdate.add(ctor);
11404 warningWithoutStack$1(false, '%s: getSnapshotBeforeUpdate() should be used with componentDidUpdate(). ' + 'This component defines getSnapshotBeforeUpdate() only.', getComponentName(ctor));
11405 }
11406
11407 var noInstanceGetDerivedStateFromProps = typeof instance.getDerivedStateFromProps !== 'function';
11408 !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;
11409 var noInstanceGetDerivedStateFromCatch = typeof instance.getDerivedStateFromError !== 'function';
11410 !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;
11411 var noStaticGetSnapshotBeforeUpdate = typeof ctor.getSnapshotBeforeUpdate !== 'function';
11412 !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;
11413 var _state = instance.state;
11414 if (_state && (typeof _state !== 'object' || isArray$1(_state))) {
11415 warningWithoutStack$1(false, '%s.state: must be set to an object or null', name);
11416 }
11417 if (typeof instance.getChildContext === 'function') {
11418 !(typeof ctor.childContextTypes === 'object') ? warningWithoutStack$1(false, '%s.getChildContext(): childContextTypes must be defined in order to ' + 'use getChildContext().', name) : void 0;
11419 }
11420 }
11421}
11422
11423function adoptClassInstance(workInProgress, instance) {
11424 instance.updater = classComponentUpdater;
11425 workInProgress.stateNode = instance;
11426 // The instance needs access to the fiber so that it can schedule updates
11427 set(instance, workInProgress);
11428 {
11429 instance._reactInternalInstance = fakeInternalInstance;
11430 }
11431}
11432
11433function constructClassInstance(workInProgress, ctor, props, renderExpirationTime) {
11434 var isLegacyContextConsumer = false;
11435 var unmaskedContext = emptyContextObject;
11436 var context = null;
11437 var contextType = ctor.contextType;
11438 if (typeof contextType === 'object' && contextType !== null) {
11439 {
11440 if (contextType.$$typeof !== REACT_CONTEXT_TYPE && !didWarnAboutInvalidateContextType.has(ctor)) {
11441 didWarnAboutInvalidateContextType.add(ctor);
11442 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');
11443 }
11444 }
11445
11446 context = readContext(contextType);
11447 } else {
11448 unmaskedContext = getUnmaskedContext(workInProgress, ctor, true);
11449 var contextTypes = ctor.contextTypes;
11450 isLegacyContextConsumer = contextTypes !== null && contextTypes !== undefined;
11451 context = isLegacyContextConsumer ? getMaskedContext(workInProgress, unmaskedContext) : emptyContextObject;
11452 }
11453
11454 // Instantiate twice to help detect side-effects.
11455 {
11456 if (debugRenderPhaseSideEffects || debugRenderPhaseSideEffectsForStrictMode && workInProgress.mode & StrictMode) {
11457 new ctor(props, context); // eslint-disable-line no-new
11458 }
11459 }
11460
11461 var instance = new ctor(props, context);
11462 var state = workInProgress.memoizedState = instance.state !== null && instance.state !== undefined ? instance.state : null;
11463 adoptClassInstance(workInProgress, instance);
11464
11465 {
11466 if (typeof ctor.getDerivedStateFromProps === 'function' && state === null) {
11467 var componentName = getComponentName(ctor) || 'Component';
11468 if (!didWarnAboutUninitializedState.has(componentName)) {
11469 didWarnAboutUninitializedState.add(componentName);
11470 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);
11471 }
11472 }
11473
11474 // If new component APIs are defined, "unsafe" lifecycles won't be called.
11475 // Warn about these lifecycles if they are present.
11476 // Don't warn about react-lifecycles-compat polyfilled methods though.
11477 if (typeof ctor.getDerivedStateFromProps === 'function' || typeof instance.getSnapshotBeforeUpdate === 'function') {
11478 var foundWillMountName = null;
11479 var foundWillReceivePropsName = null;
11480 var foundWillUpdateName = null;
11481 if (typeof instance.componentWillMount === 'function' && instance.componentWillMount.__suppressDeprecationWarning !== true) {
11482 foundWillMountName = 'componentWillMount';
11483 } else if (typeof instance.UNSAFE_componentWillMount === 'function') {
11484 foundWillMountName = 'UNSAFE_componentWillMount';
11485 }
11486 if (typeof instance.componentWillReceiveProps === 'function' && instance.componentWillReceiveProps.__suppressDeprecationWarning !== true) {
11487 foundWillReceivePropsName = 'componentWillReceiveProps';
11488 } else if (typeof instance.UNSAFE_componentWillReceiveProps === 'function') {
11489 foundWillReceivePropsName = 'UNSAFE_componentWillReceiveProps';
11490 }
11491 if (typeof instance.componentWillUpdate === 'function' && instance.componentWillUpdate.__suppressDeprecationWarning !== true) {
11492 foundWillUpdateName = 'componentWillUpdate';
11493 } else if (typeof instance.UNSAFE_componentWillUpdate === 'function') {
11494 foundWillUpdateName = 'UNSAFE_componentWillUpdate';
11495 }
11496 if (foundWillMountName !== null || foundWillReceivePropsName !== null || foundWillUpdateName !== null) {
11497 var _componentName = getComponentName(ctor) || 'Component';
11498 var newApiName = typeof ctor.getDerivedStateFromProps === 'function' ? 'getDerivedStateFromProps()' : 'getSnapshotBeforeUpdate()';
11499 if (!didWarnAboutLegacyLifecyclesAndDerivedState.has(_componentName)) {
11500 didWarnAboutLegacyLifecyclesAndDerivedState.add(_componentName);
11501 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 : '');
11502 }
11503 }
11504 }
11505 }
11506
11507 // Cache unmasked context so we can avoid recreating masked context unless necessary.
11508 // ReactFiberContext usually updates this cache but can't for newly-created instances.
11509 if (isLegacyContextConsumer) {
11510 cacheContext(workInProgress, unmaskedContext, context);
11511 }
11512
11513 return instance;
11514}
11515
11516function callComponentWillMount(workInProgress, instance) {
11517 startPhaseTimer(workInProgress, 'componentWillMount');
11518 var oldState = instance.state;
11519
11520 if (typeof instance.componentWillMount === 'function') {
11521 instance.componentWillMount();
11522 }
11523 if (typeof instance.UNSAFE_componentWillMount === 'function') {
11524 instance.UNSAFE_componentWillMount();
11525 }
11526
11527 stopPhaseTimer();
11528
11529 if (oldState !== instance.state) {
11530 {
11531 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');
11532 }
11533 classComponentUpdater.enqueueReplaceState(instance, instance.state, null);
11534 }
11535}
11536
11537function callComponentWillReceiveProps(workInProgress, instance, newProps, nextContext) {
11538 var oldState = instance.state;
11539 startPhaseTimer(workInProgress, 'componentWillReceiveProps');
11540 if (typeof instance.componentWillReceiveProps === 'function') {
11541 instance.componentWillReceiveProps(newProps, nextContext);
11542 }
11543 if (typeof instance.UNSAFE_componentWillReceiveProps === 'function') {
11544 instance.UNSAFE_componentWillReceiveProps(newProps, nextContext);
11545 }
11546 stopPhaseTimer();
11547
11548 if (instance.state !== oldState) {
11549 {
11550 var componentName = getComponentName(workInProgress.type) || 'Component';
11551 if (!didWarnAboutStateAssignmentForComponent.has(componentName)) {
11552 didWarnAboutStateAssignmentForComponent.add(componentName);
11553 warningWithoutStack$1(false, '%s.componentWillReceiveProps(): Assigning directly to ' + "this.state is deprecated (except inside a component's " + 'constructor). Use setState instead.', componentName);
11554 }
11555 }
11556 classComponentUpdater.enqueueReplaceState(instance, instance.state, null);
11557 }
11558}
11559
11560// Invokes the mount life-cycles on a previously never rendered instance.
11561function mountClassInstance(workInProgress, ctor, newProps, renderExpirationTime) {
11562 {
11563 checkClassInstance(workInProgress, ctor, newProps);
11564 }
11565
11566 var instance = workInProgress.stateNode;
11567 instance.props = newProps;
11568 instance.state = workInProgress.memoizedState;
11569 instance.refs = emptyRefsObject;
11570
11571 var contextType = ctor.contextType;
11572 if (typeof contextType === 'object' && contextType !== null) {
11573 instance.context = readContext(contextType);
11574 } else {
11575 var unmaskedContext = getUnmaskedContext(workInProgress, ctor, true);
11576 instance.context = getMaskedContext(workInProgress, unmaskedContext);
11577 }
11578
11579 {
11580 if (instance.state === newProps) {
11581 var componentName = getComponentName(ctor) || 'Component';
11582 if (!didWarnAboutDirectlyAssigningPropsToState.has(componentName)) {
11583 didWarnAboutDirectlyAssigningPropsToState.add(componentName);
11584 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);
11585 }
11586 }
11587
11588 if (workInProgress.mode & StrictMode) {
11589 ReactStrictModeWarnings.recordUnsafeLifecycleWarnings(workInProgress, instance);
11590
11591 ReactStrictModeWarnings.recordLegacyContextWarning(workInProgress, instance);
11592 }
11593
11594 if (warnAboutDeprecatedLifecycles) {
11595 ReactStrictModeWarnings.recordDeprecationWarnings(workInProgress, instance);
11596 }
11597 }
11598
11599 var updateQueue = workInProgress.updateQueue;
11600 if (updateQueue !== null) {
11601 processUpdateQueue(workInProgress, updateQueue, newProps, instance, renderExpirationTime);
11602 instance.state = workInProgress.memoizedState;
11603 }
11604
11605 var getDerivedStateFromProps = ctor.getDerivedStateFromProps;
11606 if (typeof getDerivedStateFromProps === 'function') {
11607 applyDerivedStateFromProps(workInProgress, ctor, getDerivedStateFromProps, newProps);
11608 instance.state = workInProgress.memoizedState;
11609 }
11610
11611 // In order to support react-lifecycles-compat polyfilled components,
11612 // Unsafe lifecycles should not be invoked for components using the new APIs.
11613 if (typeof ctor.getDerivedStateFromProps !== 'function' && typeof instance.getSnapshotBeforeUpdate !== 'function' && (typeof instance.UNSAFE_componentWillMount === 'function' || typeof instance.componentWillMount === 'function')) {
11614 callComponentWillMount(workInProgress, instance);
11615 // If we had additional state updates during this life-cycle, let's
11616 // process them now.
11617 updateQueue = workInProgress.updateQueue;
11618 if (updateQueue !== null) {
11619 processUpdateQueue(workInProgress, updateQueue, newProps, instance, renderExpirationTime);
11620 instance.state = workInProgress.memoizedState;
11621 }
11622 }
11623
11624 if (typeof instance.componentDidMount === 'function') {
11625 workInProgress.effectTag |= Update;
11626 }
11627}
11628
11629function resumeMountClassInstance(workInProgress, ctor, newProps, renderExpirationTime) {
11630 var instance = workInProgress.stateNode;
11631
11632 var oldProps = workInProgress.memoizedProps;
11633 instance.props = oldProps;
11634
11635 var oldContext = instance.context;
11636 var contextType = ctor.contextType;
11637 var nextContext = void 0;
11638 if (typeof contextType === 'object' && contextType !== null) {
11639 nextContext = readContext(contextType);
11640 } else {
11641 var nextLegacyUnmaskedContext = getUnmaskedContext(workInProgress, ctor, true);
11642 nextContext = getMaskedContext(workInProgress, nextLegacyUnmaskedContext);
11643 }
11644
11645 var getDerivedStateFromProps = ctor.getDerivedStateFromProps;
11646 var hasNewLifecycles = typeof getDerivedStateFromProps === 'function' || typeof instance.getSnapshotBeforeUpdate === 'function';
11647
11648 // Note: During these life-cycles, instance.props/instance.state are what
11649 // ever the previously attempted to render - not the "current". However,
11650 // during componentDidUpdate we pass the "current" props.
11651
11652 // In order to support react-lifecycles-compat polyfilled components,
11653 // Unsafe lifecycles should not be invoked for components using the new APIs.
11654 if (!hasNewLifecycles && (typeof instance.UNSAFE_componentWillReceiveProps === 'function' || typeof instance.componentWillReceiveProps === 'function')) {
11655 if (oldProps !== newProps || oldContext !== nextContext) {
11656 callComponentWillReceiveProps(workInProgress, instance, newProps, nextContext);
11657 }
11658 }
11659
11660 resetHasForceUpdateBeforeProcessing();
11661
11662 var oldState = workInProgress.memoizedState;
11663 var newState = instance.state = oldState;
11664 var updateQueue = workInProgress.updateQueue;
11665 if (updateQueue !== null) {
11666 processUpdateQueue(workInProgress, updateQueue, newProps, instance, renderExpirationTime);
11667 newState = workInProgress.memoizedState;
11668 }
11669 if (oldProps === newProps && oldState === newState && !hasContextChanged() && !checkHasForceUpdateAfterProcessing()) {
11670 // If an update was already in progress, we should schedule an Update
11671 // effect even though we're bailing out, so that cWU/cDU are called.
11672 if (typeof instance.componentDidMount === 'function') {
11673 workInProgress.effectTag |= Update;
11674 }
11675 return false;
11676 }
11677
11678 if (typeof getDerivedStateFromProps === 'function') {
11679 applyDerivedStateFromProps(workInProgress, ctor, getDerivedStateFromProps, newProps);
11680 newState = workInProgress.memoizedState;
11681 }
11682
11683 var shouldUpdate = checkHasForceUpdateAfterProcessing() || checkShouldComponentUpdate(workInProgress, ctor, oldProps, newProps, oldState, newState, nextContext);
11684
11685 if (shouldUpdate) {
11686 // In order to support react-lifecycles-compat polyfilled components,
11687 // Unsafe lifecycles should not be invoked for components using the new APIs.
11688 if (!hasNewLifecycles && (typeof instance.UNSAFE_componentWillMount === 'function' || typeof instance.componentWillMount === 'function')) {
11689 startPhaseTimer(workInProgress, 'componentWillMount');
11690 if (typeof instance.componentWillMount === 'function') {
11691 instance.componentWillMount();
11692 }
11693 if (typeof instance.UNSAFE_componentWillMount === 'function') {
11694 instance.UNSAFE_componentWillMount();
11695 }
11696 stopPhaseTimer();
11697 }
11698 if (typeof instance.componentDidMount === 'function') {
11699 workInProgress.effectTag |= Update;
11700 }
11701 } else {
11702 // If an update was already in progress, we should schedule an Update
11703 // effect even though we're bailing out, so that cWU/cDU are called.
11704 if (typeof instance.componentDidMount === 'function') {
11705 workInProgress.effectTag |= Update;
11706 }
11707
11708 // If shouldComponentUpdate returned false, we should still update the
11709 // memoized state to indicate that this work can be reused.
11710 workInProgress.memoizedProps = newProps;
11711 workInProgress.memoizedState = newState;
11712 }
11713
11714 // Update the existing instance's state, props, and context pointers even
11715 // if shouldComponentUpdate returns false.
11716 instance.props = newProps;
11717 instance.state = newState;
11718 instance.context = nextContext;
11719
11720 return shouldUpdate;
11721}
11722
11723// Invokes the update life-cycles and returns false if it shouldn't rerender.
11724function updateClassInstance(current, workInProgress, ctor, newProps, renderExpirationTime) {
11725 var instance = workInProgress.stateNode;
11726
11727 var oldProps = workInProgress.memoizedProps;
11728 instance.props = workInProgress.type === workInProgress.elementType ? oldProps : resolveDefaultProps(workInProgress.type, oldProps);
11729
11730 var oldContext = instance.context;
11731 var contextType = ctor.contextType;
11732 var nextContext = void 0;
11733 if (typeof contextType === 'object' && contextType !== null) {
11734 nextContext = readContext(contextType);
11735 } else {
11736 var nextUnmaskedContext = getUnmaskedContext(workInProgress, ctor, true);
11737 nextContext = getMaskedContext(workInProgress, nextUnmaskedContext);
11738 }
11739
11740 var getDerivedStateFromProps = ctor.getDerivedStateFromProps;
11741 var hasNewLifecycles = typeof getDerivedStateFromProps === 'function' || typeof instance.getSnapshotBeforeUpdate === 'function';
11742
11743 // Note: During these life-cycles, instance.props/instance.state are what
11744 // ever the previously attempted to render - not the "current". However,
11745 // during componentDidUpdate we pass the "current" props.
11746
11747 // In order to support react-lifecycles-compat polyfilled components,
11748 // Unsafe lifecycles should not be invoked for components using the new APIs.
11749 if (!hasNewLifecycles && (typeof instance.UNSAFE_componentWillReceiveProps === 'function' || typeof instance.componentWillReceiveProps === 'function')) {
11750 if (oldProps !== newProps || oldContext !== nextContext) {
11751 callComponentWillReceiveProps(workInProgress, instance, newProps, nextContext);
11752 }
11753 }
11754
11755 resetHasForceUpdateBeforeProcessing();
11756
11757 var oldState = workInProgress.memoizedState;
11758 var newState = instance.state = oldState;
11759 var updateQueue = workInProgress.updateQueue;
11760 if (updateQueue !== null) {
11761 processUpdateQueue(workInProgress, updateQueue, newProps, instance, renderExpirationTime);
11762 newState = workInProgress.memoizedState;
11763 }
11764
11765 if (oldProps === newProps && oldState === newState && !hasContextChanged() && !checkHasForceUpdateAfterProcessing()) {
11766 // If an update was already in progress, we should schedule an Update
11767 // effect even though we're bailing out, so that cWU/cDU are called.
11768 if (typeof instance.componentDidUpdate === 'function') {
11769 if (oldProps !== current.memoizedProps || oldState !== current.memoizedState) {
11770 workInProgress.effectTag |= Update;
11771 }
11772 }
11773 if (typeof instance.getSnapshotBeforeUpdate === 'function') {
11774 if (oldProps !== current.memoizedProps || oldState !== current.memoizedState) {
11775 workInProgress.effectTag |= Snapshot;
11776 }
11777 }
11778 return false;
11779 }
11780
11781 if (typeof getDerivedStateFromProps === 'function') {
11782 applyDerivedStateFromProps(workInProgress, ctor, getDerivedStateFromProps, newProps);
11783 newState = workInProgress.memoizedState;
11784 }
11785
11786 var shouldUpdate = checkHasForceUpdateAfterProcessing() || checkShouldComponentUpdate(workInProgress, ctor, oldProps, newProps, oldState, newState, nextContext);
11787
11788 if (shouldUpdate) {
11789 // In order to support react-lifecycles-compat polyfilled components,
11790 // Unsafe lifecycles should not be invoked for components using the new APIs.
11791 if (!hasNewLifecycles && (typeof instance.UNSAFE_componentWillUpdate === 'function' || typeof instance.componentWillUpdate === 'function')) {
11792 startPhaseTimer(workInProgress, 'componentWillUpdate');
11793 if (typeof instance.componentWillUpdate === 'function') {
11794 instance.componentWillUpdate(newProps, newState, nextContext);
11795 }
11796 if (typeof instance.UNSAFE_componentWillUpdate === 'function') {
11797 instance.UNSAFE_componentWillUpdate(newProps, newState, nextContext);
11798 }
11799 stopPhaseTimer();
11800 }
11801 if (typeof instance.componentDidUpdate === 'function') {
11802 workInProgress.effectTag |= Update;
11803 }
11804 if (typeof instance.getSnapshotBeforeUpdate === 'function') {
11805 workInProgress.effectTag |= Snapshot;
11806 }
11807 } else {
11808 // If an update was already in progress, we should schedule an Update
11809 // effect even though we're bailing out, so that cWU/cDU are called.
11810 if (typeof instance.componentDidUpdate === 'function') {
11811 if (oldProps !== current.memoizedProps || oldState !== current.memoizedState) {
11812 workInProgress.effectTag |= Update;
11813 }
11814 }
11815 if (typeof instance.getSnapshotBeforeUpdate === 'function') {
11816 if (oldProps !== current.memoizedProps || oldState !== current.memoizedState) {
11817 workInProgress.effectTag |= Snapshot;
11818 }
11819 }
11820
11821 // If shouldComponentUpdate returned false, we should still update the
11822 // memoized props/state to indicate that this work can be reused.
11823 workInProgress.memoizedProps = newProps;
11824 workInProgress.memoizedState = newState;
11825 }
11826
11827 // Update the existing instance's state, props, and context pointers even
11828 // if shouldComponentUpdate returns false.
11829 instance.props = newProps;
11830 instance.state = newState;
11831 instance.context = nextContext;
11832
11833 return shouldUpdate;
11834}
11835
11836var didWarnAboutMaps = void 0;
11837var didWarnAboutGenerators = void 0;
11838var didWarnAboutStringRefInStrictMode = void 0;
11839var ownerHasKeyUseWarning = void 0;
11840var ownerHasFunctionTypeWarning = void 0;
11841var warnForMissingKey = function (child) {};
11842
11843{
11844 didWarnAboutMaps = false;
11845 didWarnAboutGenerators = false;
11846 didWarnAboutStringRefInStrictMode = {};
11847
11848 /**
11849 * Warn if there's no key explicitly set on dynamic arrays of children or
11850 * object keys are not valid. This allows us to keep track of children between
11851 * updates.
11852 */
11853 ownerHasKeyUseWarning = {};
11854 ownerHasFunctionTypeWarning = {};
11855
11856 warnForMissingKey = function (child) {
11857 if (child === null || typeof child !== 'object') {
11858 return;
11859 }
11860 if (!child._store || child._store.validated || child.key != null) {
11861 return;
11862 }
11863 !(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;
11864 child._store.validated = true;
11865
11866 var currentComponentErrorInfo = 'Each child in a list should have a unique ' + '"key" prop. See https://fb.me/react-warning-keys for ' + 'more information.' + getCurrentFiberStackInDev();
11867 if (ownerHasKeyUseWarning[currentComponentErrorInfo]) {
11868 return;
11869 }
11870 ownerHasKeyUseWarning[currentComponentErrorInfo] = true;
11871
11872 warning$1(false, 'Each child in a list should have a unique ' + '"key" prop. See https://fb.me/react-warning-keys for ' + 'more information.');
11873 };
11874}
11875
11876var isArray = Array.isArray;
11877
11878function coerceRef(returnFiber, current$$1, element) {
11879 var mixedRef = element.ref;
11880 if (mixedRef !== null && typeof mixedRef !== 'function' && typeof mixedRef !== 'object') {
11881 {
11882 if (returnFiber.mode & StrictMode) {
11883 var componentName = getComponentName(returnFiber.type) || 'Component';
11884 if (!didWarnAboutStringRefInStrictMode[componentName]) {
11885 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));
11886 didWarnAboutStringRefInStrictMode[componentName] = true;
11887 }
11888 }
11889 }
11890
11891 if (element._owner) {
11892 var owner = element._owner;
11893 var inst = void 0;
11894 if (owner) {
11895 var ownerFiber = owner;
11896 !(ownerFiber.tag === ClassComponent) ? invariant(false, 'Function components cannot have refs. Did you mean to use React.forwardRef()?') : void 0;
11897 inst = ownerFiber.stateNode;
11898 }
11899 !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;
11900 var stringRef = '' + mixedRef;
11901 // Check if previous string ref matches new string ref
11902 if (current$$1 !== null && current$$1.ref !== null && typeof current$$1.ref === 'function' && current$$1.ref._stringRef === stringRef) {
11903 return current$$1.ref;
11904 }
11905 var ref = function (value) {
11906 var refs = inst.refs;
11907 if (refs === emptyRefsObject) {
11908 // This is a lazy pooled frozen object, so we need to initialize.
11909 refs = inst.refs = {};
11910 }
11911 if (value === null) {
11912 delete refs[stringRef];
11913 } else {
11914 refs[stringRef] = value;
11915 }
11916 };
11917 ref._stringRef = stringRef;
11918 return ref;
11919 } else {
11920 !(typeof mixedRef === 'string') ? invariant(false, 'Expected ref to be a function, a string, an object returned by React.createRef(), or null.') : void 0;
11921 !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;
11922 }
11923 }
11924 return mixedRef;
11925}
11926
11927function throwOnInvalidObjectType(returnFiber, newChild) {
11928 if (returnFiber.type !== 'textarea') {
11929 var addendum = '';
11930 {
11931 addendum = ' If you meant to render a collection of children, use an array ' + 'instead.' + getCurrentFiberStackInDev();
11932 }
11933 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);
11934 }
11935}
11936
11937function warnOnFunctionType() {
11938 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();
11939
11940 if (ownerHasFunctionTypeWarning[currentComponentErrorInfo]) {
11941 return;
11942 }
11943 ownerHasFunctionTypeWarning[currentComponentErrorInfo] = true;
11944
11945 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.');
11946}
11947
11948// This wrapper function exists because I expect to clone the code in each path
11949// to be able to optimize each path individually by branching early. This needs
11950// a compiler or we can do it manually. Helpers that don't need this branching
11951// live outside of this function.
11952function ChildReconciler(shouldTrackSideEffects) {
11953 function deleteChild(returnFiber, childToDelete) {
11954 if (!shouldTrackSideEffects) {
11955 // Noop.
11956 return;
11957 }
11958 // Deletions are added in reversed order so we add it to the front.
11959 // At this point, the return fiber's effect list is empty except for
11960 // deletions, so we can just append the deletion to the list. The remaining
11961 // effects aren't added until the complete phase. Once we implement
11962 // resuming, this may not be true.
11963 var last = returnFiber.lastEffect;
11964 if (last !== null) {
11965 last.nextEffect = childToDelete;
11966 returnFiber.lastEffect = childToDelete;
11967 } else {
11968 returnFiber.firstEffect = returnFiber.lastEffect = childToDelete;
11969 }
11970 childToDelete.nextEffect = null;
11971 childToDelete.effectTag = Deletion;
11972 }
11973
11974 function deleteRemainingChildren(returnFiber, currentFirstChild) {
11975 if (!shouldTrackSideEffects) {
11976 // Noop.
11977 return null;
11978 }
11979
11980 // TODO: For the shouldClone case, this could be micro-optimized a bit by
11981 // assuming that after the first child we've already added everything.
11982 var childToDelete = currentFirstChild;
11983 while (childToDelete !== null) {
11984 deleteChild(returnFiber, childToDelete);
11985 childToDelete = childToDelete.sibling;
11986 }
11987 return null;
11988 }
11989
11990 function mapRemainingChildren(returnFiber, currentFirstChild) {
11991 // Add the remaining children to a temporary map so that we can find them by
11992 // keys quickly. Implicit (null) keys get added to this set with their index
11993 var existingChildren = new Map();
11994
11995 var existingChild = currentFirstChild;
11996 while (existingChild !== null) {
11997 if (existingChild.key !== null) {
11998 existingChildren.set(existingChild.key, existingChild);
11999 } else {
12000 existingChildren.set(existingChild.index, existingChild);
12001 }
12002 existingChild = existingChild.sibling;
12003 }
12004 return existingChildren;
12005 }
12006
12007 function useFiber(fiber, pendingProps, expirationTime) {
12008 // We currently set sibling to null and index to 0 here because it is easy
12009 // to forget to do before returning it. E.g. for the single child case.
12010 var clone = createWorkInProgress(fiber, pendingProps, expirationTime);
12011 clone.index = 0;
12012 clone.sibling = null;
12013 return clone;
12014 }
12015
12016 function placeChild(newFiber, lastPlacedIndex, newIndex) {
12017 newFiber.index = newIndex;
12018 if (!shouldTrackSideEffects) {
12019 // Noop.
12020 return lastPlacedIndex;
12021 }
12022 var current$$1 = newFiber.alternate;
12023 if (current$$1 !== null) {
12024 var oldIndex = current$$1.index;
12025 if (oldIndex < lastPlacedIndex) {
12026 // This is a move.
12027 newFiber.effectTag = Placement;
12028 return lastPlacedIndex;
12029 } else {
12030 // This item can stay in place.
12031 return oldIndex;
12032 }
12033 } else {
12034 // This is an insertion.
12035 newFiber.effectTag = Placement;
12036 return lastPlacedIndex;
12037 }
12038 }
12039
12040 function placeSingleChild(newFiber) {
12041 // This is simpler for the single child case. We only need to do a
12042 // placement for inserting new children.
12043 if (shouldTrackSideEffects && newFiber.alternate === null) {
12044 newFiber.effectTag = Placement;
12045 }
12046 return newFiber;
12047 }
12048
12049 function updateTextNode(returnFiber, current$$1, textContent, expirationTime) {
12050 if (current$$1 === null || current$$1.tag !== HostText) {
12051 // Insert
12052 var created = createFiberFromText(textContent, returnFiber.mode, expirationTime);
12053 created.return = returnFiber;
12054 return created;
12055 } else {
12056 // Update
12057 var existing = useFiber(current$$1, textContent, expirationTime);
12058 existing.return = returnFiber;
12059 return existing;
12060 }
12061 }
12062
12063 function updateElement(returnFiber, current$$1, element, expirationTime) {
12064 if (current$$1 !== null && current$$1.elementType === element.type) {
12065 // Move based on index
12066 var existing = useFiber(current$$1, element.props, expirationTime);
12067 existing.ref = coerceRef(returnFiber, current$$1, element);
12068 existing.return = returnFiber;
12069 {
12070 existing._debugSource = element._source;
12071 existing._debugOwner = element._owner;
12072 }
12073 return existing;
12074 } else {
12075 // Insert
12076 var created = createFiberFromElement(element, returnFiber.mode, expirationTime);
12077 created.ref = coerceRef(returnFiber, current$$1, element);
12078 created.return = returnFiber;
12079 return created;
12080 }
12081 }
12082
12083 function updatePortal(returnFiber, current$$1, portal, expirationTime) {
12084 if (current$$1 === null || current$$1.tag !== HostPortal || current$$1.stateNode.containerInfo !== portal.containerInfo || current$$1.stateNode.implementation !== portal.implementation) {
12085 // Insert
12086 var created = createFiberFromPortal(portal, returnFiber.mode, expirationTime);
12087 created.return = returnFiber;
12088 return created;
12089 } else {
12090 // Update
12091 var existing = useFiber(current$$1, portal.children || [], expirationTime);
12092 existing.return = returnFiber;
12093 return existing;
12094 }
12095 }
12096
12097 function updateFragment(returnFiber, current$$1, fragment, expirationTime, key) {
12098 if (current$$1 === null || current$$1.tag !== Fragment) {
12099 // Insert
12100 var created = createFiberFromFragment(fragment, returnFiber.mode, expirationTime, key);
12101 created.return = returnFiber;
12102 return created;
12103 } else {
12104 // Update
12105 var existing = useFiber(current$$1, fragment, expirationTime);
12106 existing.return = returnFiber;
12107 return existing;
12108 }
12109 }
12110
12111 function createChild(returnFiber, newChild, expirationTime) {
12112 if (typeof newChild === 'string' || typeof newChild === 'number') {
12113 // Text nodes don't have keys. If the previous node is implicitly keyed
12114 // we can continue to replace it without aborting even if it is not a text
12115 // node.
12116 var created = createFiberFromText('' + newChild, returnFiber.mode, expirationTime);
12117 created.return = returnFiber;
12118 return created;
12119 }
12120
12121 if (typeof newChild === 'object' && newChild !== null) {
12122 switch (newChild.$$typeof) {
12123 case REACT_ELEMENT_TYPE:
12124 {
12125 var _created = createFiberFromElement(newChild, returnFiber.mode, expirationTime);
12126 _created.ref = coerceRef(returnFiber, null, newChild);
12127 _created.return = returnFiber;
12128 return _created;
12129 }
12130 case REACT_PORTAL_TYPE:
12131 {
12132 var _created2 = createFiberFromPortal(newChild, returnFiber.mode, expirationTime);
12133 _created2.return = returnFiber;
12134 return _created2;
12135 }
12136 }
12137
12138 if (isArray(newChild) || getIteratorFn(newChild)) {
12139 var _created3 = createFiberFromFragment(newChild, returnFiber.mode, expirationTime, null);
12140 _created3.return = returnFiber;
12141 return _created3;
12142 }
12143
12144 throwOnInvalidObjectType(returnFiber, newChild);
12145 }
12146
12147 {
12148 if (typeof newChild === 'function') {
12149 warnOnFunctionType();
12150 }
12151 }
12152
12153 return null;
12154 }
12155
12156 function updateSlot(returnFiber, oldFiber, newChild, expirationTime) {
12157 // Update the fiber if the keys match, otherwise return null.
12158
12159 var key = oldFiber !== null ? oldFiber.key : null;
12160
12161 if (typeof newChild === 'string' || typeof newChild === 'number') {
12162 // Text nodes don't have keys. If the previous node is implicitly keyed
12163 // we can continue to replace it without aborting even if it is not a text
12164 // node.
12165 if (key !== null) {
12166 return null;
12167 }
12168 return updateTextNode(returnFiber, oldFiber, '' + newChild, expirationTime);
12169 }
12170
12171 if (typeof newChild === 'object' && newChild !== null) {
12172 switch (newChild.$$typeof) {
12173 case REACT_ELEMENT_TYPE:
12174 {
12175 if (newChild.key === key) {
12176 if (newChild.type === REACT_FRAGMENT_TYPE) {
12177 return updateFragment(returnFiber, oldFiber, newChild.props.children, expirationTime, key);
12178 }
12179 return updateElement(returnFiber, oldFiber, newChild, expirationTime);
12180 } else {
12181 return null;
12182 }
12183 }
12184 case REACT_PORTAL_TYPE:
12185 {
12186 if (newChild.key === key) {
12187 return updatePortal(returnFiber, oldFiber, newChild, expirationTime);
12188 } else {
12189 return null;
12190 }
12191 }
12192 }
12193
12194 if (isArray(newChild) || getIteratorFn(newChild)) {
12195 if (key !== null) {
12196 return null;
12197 }
12198
12199 return updateFragment(returnFiber, oldFiber, newChild, expirationTime, null);
12200 }
12201
12202 throwOnInvalidObjectType(returnFiber, newChild);
12203 }
12204
12205 {
12206 if (typeof newChild === 'function') {
12207 warnOnFunctionType();
12208 }
12209 }
12210
12211 return null;
12212 }
12213
12214 function updateFromMap(existingChildren, returnFiber, newIdx, newChild, expirationTime) {
12215 if (typeof newChild === 'string' || typeof newChild === 'number') {
12216 // Text nodes don't have keys, so we neither have to check the old nor
12217 // new node for the key. If both are text nodes, they match.
12218 var matchedFiber = existingChildren.get(newIdx) || null;
12219 return updateTextNode(returnFiber, matchedFiber, '' + newChild, expirationTime);
12220 }
12221
12222 if (typeof newChild === 'object' && newChild !== null) {
12223 switch (newChild.$$typeof) {
12224 case REACT_ELEMENT_TYPE:
12225 {
12226 var _matchedFiber = existingChildren.get(newChild.key === null ? newIdx : newChild.key) || null;
12227 if (newChild.type === REACT_FRAGMENT_TYPE) {
12228 return updateFragment(returnFiber, _matchedFiber, newChild.props.children, expirationTime, newChild.key);
12229 }
12230 return updateElement(returnFiber, _matchedFiber, newChild, expirationTime);
12231 }
12232 case REACT_PORTAL_TYPE:
12233 {
12234 var _matchedFiber2 = existingChildren.get(newChild.key === null ? newIdx : newChild.key) || null;
12235 return updatePortal(returnFiber, _matchedFiber2, newChild, expirationTime);
12236 }
12237 }
12238
12239 if (isArray(newChild) || getIteratorFn(newChild)) {
12240 var _matchedFiber3 = existingChildren.get(newIdx) || null;
12241 return updateFragment(returnFiber, _matchedFiber3, newChild, expirationTime, null);
12242 }
12243
12244 throwOnInvalidObjectType(returnFiber, newChild);
12245 }
12246
12247 {
12248 if (typeof newChild === 'function') {
12249 warnOnFunctionType();
12250 }
12251 }
12252
12253 return null;
12254 }
12255
12256 /**
12257 * Warns if there is a duplicate or missing key
12258 */
12259 function warnOnInvalidKey(child, knownKeys) {
12260 {
12261 if (typeof child !== 'object' || child === null) {
12262 return knownKeys;
12263 }
12264 switch (child.$$typeof) {
12265 case REACT_ELEMENT_TYPE:
12266 case REACT_PORTAL_TYPE:
12267 warnForMissingKey(child);
12268 var key = child.key;
12269 if (typeof key !== 'string') {
12270 break;
12271 }
12272 if (knownKeys === null) {
12273 knownKeys = new Set();
12274 knownKeys.add(key);
12275 break;
12276 }
12277 if (!knownKeys.has(key)) {
12278 knownKeys.add(key);
12279 break;
12280 }
12281 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);
12282 break;
12283 default:
12284 break;
12285 }
12286 }
12287 return knownKeys;
12288 }
12289
12290 function reconcileChildrenArray(returnFiber, currentFirstChild, newChildren, expirationTime) {
12291 // This algorithm can't optimize by searching from both ends since we
12292 // don't have backpointers on fibers. I'm trying to see how far we can get
12293 // with that model. If it ends up not being worth the tradeoffs, we can
12294 // add it later.
12295
12296 // Even with a two ended optimization, we'd want to optimize for the case
12297 // where there are few changes and brute force the comparison instead of
12298 // going for the Map. It'd like to explore hitting that path first in
12299 // forward-only mode and only go for the Map once we notice that we need
12300 // lots of look ahead. This doesn't handle reversal as well as two ended
12301 // search but that's unusual. Besides, for the two ended optimization to
12302 // work on Iterables, we'd need to copy the whole set.
12303
12304 // In this first iteration, we'll just live with hitting the bad case
12305 // (adding everything to a Map) in for every insert/move.
12306
12307 // If you change this code, also update reconcileChildrenIterator() which
12308 // uses the same algorithm.
12309
12310 {
12311 // First, validate keys.
12312 var knownKeys = null;
12313 for (var i = 0; i < newChildren.length; i++) {
12314 var child = newChildren[i];
12315 knownKeys = warnOnInvalidKey(child, knownKeys);
12316 }
12317 }
12318
12319 var resultingFirstChild = null;
12320 var previousNewFiber = null;
12321
12322 var oldFiber = currentFirstChild;
12323 var lastPlacedIndex = 0;
12324 var newIdx = 0;
12325 var nextOldFiber = null;
12326 for (; oldFiber !== null && newIdx < newChildren.length; newIdx++) {
12327 if (oldFiber.index > newIdx) {
12328 nextOldFiber = oldFiber;
12329 oldFiber = null;
12330 } else {
12331 nextOldFiber = oldFiber.sibling;
12332 }
12333 var newFiber = updateSlot(returnFiber, oldFiber, newChildren[newIdx], expirationTime);
12334 if (newFiber === null) {
12335 // TODO: This breaks on empty slots like null children. That's
12336 // unfortunate because it triggers the slow path all the time. We need
12337 // a better way to communicate whether this was a miss or null,
12338 // boolean, undefined, etc.
12339 if (oldFiber === null) {
12340 oldFiber = nextOldFiber;
12341 }
12342 break;
12343 }
12344 if (shouldTrackSideEffects) {
12345 if (oldFiber && newFiber.alternate === null) {
12346 // We matched the slot, but we didn't reuse the existing fiber, so we
12347 // need to delete the existing child.
12348 deleteChild(returnFiber, oldFiber);
12349 }
12350 }
12351 lastPlacedIndex = placeChild(newFiber, lastPlacedIndex, newIdx);
12352 if (previousNewFiber === null) {
12353 // TODO: Move out of the loop. This only happens for the first run.
12354 resultingFirstChild = newFiber;
12355 } else {
12356 // TODO: Defer siblings if we're not at the right index for this slot.
12357 // I.e. if we had null values before, then we want to defer this
12358 // for each null value. However, we also don't want to call updateSlot
12359 // with the previous one.
12360 previousNewFiber.sibling = newFiber;
12361 }
12362 previousNewFiber = newFiber;
12363 oldFiber = nextOldFiber;
12364 }
12365
12366 if (newIdx === newChildren.length) {
12367 // We've reached the end of the new children. We can delete the rest.
12368 deleteRemainingChildren(returnFiber, oldFiber);
12369 return resultingFirstChild;
12370 }
12371
12372 if (oldFiber === null) {
12373 // If we don't have any more existing children we can choose a fast path
12374 // since the rest will all be insertions.
12375 for (; newIdx < newChildren.length; newIdx++) {
12376 var _newFiber = createChild(returnFiber, newChildren[newIdx], expirationTime);
12377 if (!_newFiber) {
12378 continue;
12379 }
12380 lastPlacedIndex = placeChild(_newFiber, lastPlacedIndex, newIdx);
12381 if (previousNewFiber === null) {
12382 // TODO: Move out of the loop. This only happens for the first run.
12383 resultingFirstChild = _newFiber;
12384 } else {
12385 previousNewFiber.sibling = _newFiber;
12386 }
12387 previousNewFiber = _newFiber;
12388 }
12389 return resultingFirstChild;
12390 }
12391
12392 // Add all children to a key map for quick lookups.
12393 var existingChildren = mapRemainingChildren(returnFiber, oldFiber);
12394
12395 // Keep scanning and use the map to restore deleted items as moves.
12396 for (; newIdx < newChildren.length; newIdx++) {
12397 var _newFiber2 = updateFromMap(existingChildren, returnFiber, newIdx, newChildren[newIdx], expirationTime);
12398 if (_newFiber2) {
12399 if (shouldTrackSideEffects) {
12400 if (_newFiber2.alternate !== null) {
12401 // The new fiber is a work in progress, but if there exists a
12402 // current, that means that we reused the fiber. We need to delete
12403 // it from the child list so that we don't add it to the deletion
12404 // list.
12405 existingChildren.delete(_newFiber2.key === null ? newIdx : _newFiber2.key);
12406 }
12407 }
12408 lastPlacedIndex = placeChild(_newFiber2, lastPlacedIndex, newIdx);
12409 if (previousNewFiber === null) {
12410 resultingFirstChild = _newFiber2;
12411 } else {
12412 previousNewFiber.sibling = _newFiber2;
12413 }
12414 previousNewFiber = _newFiber2;
12415 }
12416 }
12417
12418 if (shouldTrackSideEffects) {
12419 // Any existing children that weren't consumed above were deleted. We need
12420 // to add them to the deletion list.
12421 existingChildren.forEach(function (child) {
12422 return deleteChild(returnFiber, child);
12423 });
12424 }
12425
12426 return resultingFirstChild;
12427 }
12428
12429 function reconcileChildrenIterator(returnFiber, currentFirstChild, newChildrenIterable, expirationTime) {
12430 // This is the same implementation as reconcileChildrenArray(),
12431 // but using the iterator instead.
12432
12433 var iteratorFn = getIteratorFn(newChildrenIterable);
12434 !(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;
12435
12436 {
12437 // We don't support rendering Generators because it's a mutation.
12438 // See https://github.com/facebook/react/issues/12995
12439 if (typeof Symbol === 'function' &&
12440 // $FlowFixMe Flow doesn't know about toStringTag
12441 newChildrenIterable[Symbol.toStringTag] === 'Generator') {
12442 !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;
12443 didWarnAboutGenerators = true;
12444 }
12445
12446 // Warn about using Maps as children
12447 if (newChildrenIterable.entries === iteratorFn) {
12448 !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;
12449 didWarnAboutMaps = true;
12450 }
12451
12452 // First, validate keys.
12453 // We'll get a different iterator later for the main pass.
12454 var _newChildren = iteratorFn.call(newChildrenIterable);
12455 if (_newChildren) {
12456 var knownKeys = null;
12457 var _step = _newChildren.next();
12458 for (; !_step.done; _step = _newChildren.next()) {
12459 var child = _step.value;
12460 knownKeys = warnOnInvalidKey(child, knownKeys);
12461 }
12462 }
12463 }
12464
12465 var newChildren = iteratorFn.call(newChildrenIterable);
12466 !(newChildren != null) ? invariant(false, 'An iterable object provided no iterator.') : void 0;
12467
12468 var resultingFirstChild = null;
12469 var previousNewFiber = null;
12470
12471 var oldFiber = currentFirstChild;
12472 var lastPlacedIndex = 0;
12473 var newIdx = 0;
12474 var nextOldFiber = null;
12475
12476 var step = newChildren.next();
12477 for (; oldFiber !== null && !step.done; newIdx++, step = newChildren.next()) {
12478 if (oldFiber.index > newIdx) {
12479 nextOldFiber = oldFiber;
12480 oldFiber = null;
12481 } else {
12482 nextOldFiber = oldFiber.sibling;
12483 }
12484 var newFiber = updateSlot(returnFiber, oldFiber, step.value, expirationTime);
12485 if (newFiber === null) {
12486 // TODO: This breaks on empty slots like null children. That's
12487 // unfortunate because it triggers the slow path all the time. We need
12488 // a better way to communicate whether this was a miss or null,
12489 // boolean, undefined, etc.
12490 if (!oldFiber) {
12491 oldFiber = nextOldFiber;
12492 }
12493 break;
12494 }
12495 if (shouldTrackSideEffects) {
12496 if (oldFiber && newFiber.alternate === null) {
12497 // We matched the slot, but we didn't reuse the existing fiber, so we
12498 // need to delete the existing child.
12499 deleteChild(returnFiber, oldFiber);
12500 }
12501 }
12502 lastPlacedIndex = placeChild(newFiber, lastPlacedIndex, newIdx);
12503 if (previousNewFiber === null) {
12504 // TODO: Move out of the loop. This only happens for the first run.
12505 resultingFirstChild = newFiber;
12506 } else {
12507 // TODO: Defer siblings if we're not at the right index for this slot.
12508 // I.e. if we had null values before, then we want to defer this
12509 // for each null value. However, we also don't want to call updateSlot
12510 // with the previous one.
12511 previousNewFiber.sibling = newFiber;
12512 }
12513 previousNewFiber = newFiber;
12514 oldFiber = nextOldFiber;
12515 }
12516
12517 if (step.done) {
12518 // We've reached the end of the new children. We can delete the rest.
12519 deleteRemainingChildren(returnFiber, oldFiber);
12520 return resultingFirstChild;
12521 }
12522
12523 if (oldFiber === null) {
12524 // If we don't have any more existing children we can choose a fast path
12525 // since the rest will all be insertions.
12526 for (; !step.done; newIdx++, step = newChildren.next()) {
12527 var _newFiber3 = createChild(returnFiber, step.value, expirationTime);
12528 if (_newFiber3 === null) {
12529 continue;
12530 }
12531 lastPlacedIndex = placeChild(_newFiber3, lastPlacedIndex, newIdx);
12532 if (previousNewFiber === null) {
12533 // TODO: Move out of the loop. This only happens for the first run.
12534 resultingFirstChild = _newFiber3;
12535 } else {
12536 previousNewFiber.sibling = _newFiber3;
12537 }
12538 previousNewFiber = _newFiber3;
12539 }
12540 return resultingFirstChild;
12541 }
12542
12543 // Add all children to a key map for quick lookups.
12544 var existingChildren = mapRemainingChildren(returnFiber, oldFiber);
12545
12546 // Keep scanning and use the map to restore deleted items as moves.
12547 for (; !step.done; newIdx++, step = newChildren.next()) {
12548 var _newFiber4 = updateFromMap(existingChildren, returnFiber, newIdx, step.value, expirationTime);
12549 if (_newFiber4 !== null) {
12550 if (shouldTrackSideEffects) {
12551 if (_newFiber4.alternate !== null) {
12552 // The new fiber is a work in progress, but if there exists a
12553 // current, that means that we reused the fiber. We need to delete
12554 // it from the child list so that we don't add it to the deletion
12555 // list.
12556 existingChildren.delete(_newFiber4.key === null ? newIdx : _newFiber4.key);
12557 }
12558 }
12559 lastPlacedIndex = placeChild(_newFiber4, lastPlacedIndex, newIdx);
12560 if (previousNewFiber === null) {
12561 resultingFirstChild = _newFiber4;
12562 } else {
12563 previousNewFiber.sibling = _newFiber4;
12564 }
12565 previousNewFiber = _newFiber4;
12566 }
12567 }
12568
12569 if (shouldTrackSideEffects) {
12570 // Any existing children that weren't consumed above were deleted. We need
12571 // to add them to the deletion list.
12572 existingChildren.forEach(function (child) {
12573 return deleteChild(returnFiber, child);
12574 });
12575 }
12576
12577 return resultingFirstChild;
12578 }
12579
12580 function reconcileSingleTextNode(returnFiber, currentFirstChild, textContent, expirationTime) {
12581 // There's no need to check for keys on text nodes since we don't have a
12582 // way to define them.
12583 if (currentFirstChild !== null && currentFirstChild.tag === HostText) {
12584 // We already have an existing node so let's just update it and delete
12585 // the rest.
12586 deleteRemainingChildren(returnFiber, currentFirstChild.sibling);
12587 var existing = useFiber(currentFirstChild, textContent, expirationTime);
12588 existing.return = returnFiber;
12589 return existing;
12590 }
12591 // The existing first child is not a text node so we need to create one
12592 // and delete the existing ones.
12593 deleteRemainingChildren(returnFiber, currentFirstChild);
12594 var created = createFiberFromText(textContent, returnFiber.mode, expirationTime);
12595 created.return = returnFiber;
12596 return created;
12597 }
12598
12599 function reconcileSingleElement(returnFiber, currentFirstChild, element, expirationTime) {
12600 var key = element.key;
12601 var child = currentFirstChild;
12602 while (child !== null) {
12603 // TODO: If key === null and child.key === null, then this only applies to
12604 // the first item in the list.
12605 if (child.key === key) {
12606 if (child.tag === Fragment ? element.type === REACT_FRAGMENT_TYPE : child.elementType === element.type) {
12607 deleteRemainingChildren(returnFiber, child.sibling);
12608 var existing = useFiber(child, element.type === REACT_FRAGMENT_TYPE ? element.props.children : element.props, expirationTime);
12609 existing.ref = coerceRef(returnFiber, child, element);
12610 existing.return = returnFiber;
12611 {
12612 existing._debugSource = element._source;
12613 existing._debugOwner = element._owner;
12614 }
12615 return existing;
12616 } else {
12617 deleteRemainingChildren(returnFiber, child);
12618 break;
12619 }
12620 } else {
12621 deleteChild(returnFiber, child);
12622 }
12623 child = child.sibling;
12624 }
12625
12626 if (element.type === REACT_FRAGMENT_TYPE) {
12627 var created = createFiberFromFragment(element.props.children, returnFiber.mode, expirationTime, element.key);
12628 created.return = returnFiber;
12629 return created;
12630 } else {
12631 var _created4 = createFiberFromElement(element, returnFiber.mode, expirationTime);
12632 _created4.ref = coerceRef(returnFiber, currentFirstChild, element);
12633 _created4.return = returnFiber;
12634 return _created4;
12635 }
12636 }
12637
12638 function reconcileSinglePortal(returnFiber, currentFirstChild, portal, expirationTime) {
12639 var key = portal.key;
12640 var child = currentFirstChild;
12641 while (child !== null) {
12642 // TODO: If key === null and child.key === null, then this only applies to
12643 // the first item in the list.
12644 if (child.key === key) {
12645 if (child.tag === HostPortal && child.stateNode.containerInfo === portal.containerInfo && child.stateNode.implementation === portal.implementation) {
12646 deleteRemainingChildren(returnFiber, child.sibling);
12647 var existing = useFiber(child, portal.children || [], expirationTime);
12648 existing.return = returnFiber;
12649 return existing;
12650 } else {
12651 deleteRemainingChildren(returnFiber, child);
12652 break;
12653 }
12654 } else {
12655 deleteChild(returnFiber, child);
12656 }
12657 child = child.sibling;
12658 }
12659
12660 var created = createFiberFromPortal(portal, returnFiber.mode, expirationTime);
12661 created.return = returnFiber;
12662 return created;
12663 }
12664
12665 // This API will tag the children with the side-effect of the reconciliation
12666 // itself. They will be added to the side-effect list as we pass through the
12667 // children and the parent.
12668 function reconcileChildFibers(returnFiber, currentFirstChild, newChild, expirationTime) {
12669 // This function is not recursive.
12670 // If the top level item is an array, we treat it as a set of children,
12671 // not as a fragment. Nested arrays on the other hand will be treated as
12672 // fragment nodes. Recursion happens at the normal flow.
12673
12674 // Handle top level unkeyed fragments as if they were arrays.
12675 // This leads to an ambiguity between <>{[...]}</> and <>...</>.
12676 // We treat the ambiguous cases above the same.
12677 var isUnkeyedTopLevelFragment = typeof newChild === 'object' && newChild !== null && newChild.type === REACT_FRAGMENT_TYPE && newChild.key === null;
12678 if (isUnkeyedTopLevelFragment) {
12679 newChild = newChild.props.children;
12680 }
12681
12682 // Handle object types
12683 var isObject = typeof newChild === 'object' && newChild !== null;
12684
12685 if (isObject) {
12686 switch (newChild.$$typeof) {
12687 case REACT_ELEMENT_TYPE:
12688 return placeSingleChild(reconcileSingleElement(returnFiber, currentFirstChild, newChild, expirationTime));
12689 case REACT_PORTAL_TYPE:
12690 return placeSingleChild(reconcileSinglePortal(returnFiber, currentFirstChild, newChild, expirationTime));
12691 }
12692 }
12693
12694 if (typeof newChild === 'string' || typeof newChild === 'number') {
12695 return placeSingleChild(reconcileSingleTextNode(returnFiber, currentFirstChild, '' + newChild, expirationTime));
12696 }
12697
12698 if (isArray(newChild)) {
12699 return reconcileChildrenArray(returnFiber, currentFirstChild, newChild, expirationTime);
12700 }
12701
12702 if (getIteratorFn(newChild)) {
12703 return reconcileChildrenIterator(returnFiber, currentFirstChild, newChild, expirationTime);
12704 }
12705
12706 if (isObject) {
12707 throwOnInvalidObjectType(returnFiber, newChild);
12708 }
12709
12710 {
12711 if (typeof newChild === 'function') {
12712 warnOnFunctionType();
12713 }
12714 }
12715 if (typeof newChild === 'undefined' && !isUnkeyedTopLevelFragment) {
12716 // If the new child is undefined, and the return fiber is a composite
12717 // component, throw an error. If Fiber return types are disabled,
12718 // we already threw above.
12719 switch (returnFiber.tag) {
12720 case ClassComponent:
12721 {
12722 {
12723 var instance = returnFiber.stateNode;
12724 if (instance.render._isMockFunction) {
12725 // We allow auto-mocks to proceed as if they're returning null.
12726 break;
12727 }
12728 }
12729 }
12730 // Intentionally fall through to the next case, which handles both
12731 // functions and classes
12732 // eslint-disable-next-lined no-fallthrough
12733 case FunctionComponent:
12734 {
12735 var Component = returnFiber.type;
12736 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');
12737 }
12738 }
12739 }
12740
12741 // Remaining cases are all treated as empty.
12742 return deleteRemainingChildren(returnFiber, currentFirstChild);
12743 }
12744
12745 return reconcileChildFibers;
12746}
12747
12748var reconcileChildFibers = ChildReconciler(true);
12749var mountChildFibers = ChildReconciler(false);
12750
12751function cloneChildFibers(current$$1, workInProgress) {
12752 !(current$$1 === null || workInProgress.child === current$$1.child) ? invariant(false, 'Resuming work not yet implemented.') : void 0;
12753
12754 if (workInProgress.child === null) {
12755 return;
12756 }
12757
12758 var currentChild = workInProgress.child;
12759 var newChild = createWorkInProgress(currentChild, currentChild.pendingProps, currentChild.expirationTime);
12760 workInProgress.child = newChild;
12761
12762 newChild.return = workInProgress;
12763 while (currentChild.sibling !== null) {
12764 currentChild = currentChild.sibling;
12765 newChild = newChild.sibling = createWorkInProgress(currentChild, currentChild.pendingProps, currentChild.expirationTime);
12766 newChild.return = workInProgress;
12767 }
12768 newChild.sibling = null;
12769}
12770
12771var NO_CONTEXT = {};
12772
12773var contextStackCursor$1 = createCursor(NO_CONTEXT);
12774var contextFiberStackCursor = createCursor(NO_CONTEXT);
12775var rootInstanceStackCursor = createCursor(NO_CONTEXT);
12776
12777function requiredContext(c) {
12778 !(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;
12779 return c;
12780}
12781
12782function getRootHostContainer() {
12783 var rootInstance = requiredContext(rootInstanceStackCursor.current);
12784 return rootInstance;
12785}
12786
12787function pushHostContainer(fiber, nextRootInstance) {
12788 // Push current root instance onto the stack;
12789 // This allows us to reset root when portals are popped.
12790 push(rootInstanceStackCursor, nextRootInstance, fiber);
12791 // Track the context and the Fiber that provided it.
12792 // This enables us to pop only Fibers that provide unique contexts.
12793 push(contextFiberStackCursor, fiber, fiber);
12794
12795 // Finally, we need to push the host context to the stack.
12796 // However, we can't just call getRootHostContext() and push it because
12797 // we'd have a different number of entries on the stack depending on
12798 // whether getRootHostContext() throws somewhere in renderer code or not.
12799 // So we push an empty value first. This lets us safely unwind on errors.
12800 push(contextStackCursor$1, NO_CONTEXT, fiber);
12801 var nextRootContext = getRootHostContext(nextRootInstance);
12802 // Now that we know this function doesn't throw, replace it.
12803 pop(contextStackCursor$1, fiber);
12804 push(contextStackCursor$1, nextRootContext, fiber);
12805}
12806
12807function popHostContainer(fiber) {
12808 pop(contextStackCursor$1, fiber);
12809 pop(contextFiberStackCursor, fiber);
12810 pop(rootInstanceStackCursor, fiber);
12811}
12812
12813function getHostContext() {
12814 var context = requiredContext(contextStackCursor$1.current);
12815 return context;
12816}
12817
12818function pushHostContext(fiber) {
12819 var rootInstance = requiredContext(rootInstanceStackCursor.current);
12820 var context = requiredContext(contextStackCursor$1.current);
12821 var nextContext = getChildHostContext(context, fiber.type, rootInstance);
12822
12823 // Don't push this Fiber's context unless it's unique.
12824 if (context === nextContext) {
12825 return;
12826 }
12827
12828 // Track the context and the Fiber that provided it.
12829 // This enables us to pop only Fibers that provide unique contexts.
12830 push(contextFiberStackCursor, fiber, fiber);
12831 push(contextStackCursor$1, nextContext, fiber);
12832}
12833
12834function popHostContext(fiber) {
12835 // Do not pop unless this Fiber provided the current context.
12836 // pushHostContext() only pushes Fibers that provide unique contexts.
12837 if (contextFiberStackCursor.current !== fiber) {
12838 return;
12839 }
12840
12841 pop(contextStackCursor$1, fiber);
12842 pop(contextFiberStackCursor, fiber);
12843}
12844
12845var NoEffect$1 = /* */0;
12846var UnmountSnapshot = /* */2;
12847var UnmountMutation = /* */4;
12848var MountMutation = /* */8;
12849var UnmountLayout = /* */16;
12850var MountLayout = /* */32;
12851var MountPassive = /* */64;
12852var UnmountPassive = /* */128;
12853
12854var ReactCurrentDispatcher$1 = ReactSharedInternals.ReactCurrentDispatcher;
12855
12856
12857var didWarnAboutMismatchedHooksForComponent = void 0;
12858{
12859 didWarnAboutMismatchedHooksForComponent = new Set();
12860}
12861
12862// These are set right before calling the component.
12863var renderExpirationTime = NoWork;
12864// The work-in-progress fiber. I've named it differently to distinguish it from
12865// the work-in-progress hook.
12866var currentlyRenderingFiber$1 = null;
12867
12868// Hooks are stored as a linked list on the fiber's memoizedState field. The
12869// current hook list is the list that belongs to the current fiber. The
12870// work-in-progress hook list is a new list that will be added to the
12871// work-in-progress fiber.
12872var currentHook = null;
12873var nextCurrentHook = null;
12874var firstWorkInProgressHook = null;
12875var workInProgressHook = null;
12876var nextWorkInProgressHook = null;
12877
12878var remainingExpirationTime = NoWork;
12879var componentUpdateQueue = null;
12880var sideEffectTag = 0;
12881
12882// Updates scheduled during render will trigger an immediate re-render at the
12883// end of the current pass. We can't store these updates on the normal queue,
12884// because if the work is aborted, they should be discarded. Because this is
12885// a relatively rare case, we also don't want to add an additional field to
12886// either the hook or queue object types. So we store them in a lazily create
12887// map of queue -> render-phase updates, which are discarded once the component
12888// completes without re-rendering.
12889
12890// Whether an update was scheduled during the currently executing render pass.
12891var didScheduleRenderPhaseUpdate = false;
12892// Lazily created map of render-phase updates
12893var renderPhaseUpdates = null;
12894// Counter to prevent infinite loops.
12895var numberOfReRenders = 0;
12896var RE_RENDER_LIMIT = 25;
12897
12898// In DEV, this is the name of the currently executing primitive hook
12899var currentHookNameInDev = null;
12900
12901// In DEV, this list ensures that hooks are called in the same order between renders.
12902// The list stores the order of hooks used during the initial render (mount).
12903// Subsequent renders (updates) reference this list.
12904var hookTypesDev = null;
12905var hookTypesUpdateIndexDev = -1;
12906
12907function mountHookTypesDev() {
12908 {
12909 var hookName = currentHookNameInDev;
12910
12911 if (hookTypesDev === null) {
12912 hookTypesDev = [hookName];
12913 } else {
12914 hookTypesDev.push(hookName);
12915 }
12916 }
12917}
12918
12919function updateHookTypesDev() {
12920 {
12921 var hookName = currentHookNameInDev;
12922
12923 if (hookTypesDev !== null) {
12924 hookTypesUpdateIndexDev++;
12925 if (hookTypesDev[hookTypesUpdateIndexDev] !== hookName) {
12926 warnOnHookMismatchInDev(hookName);
12927 }
12928 }
12929 }
12930}
12931
12932function warnOnHookMismatchInDev(currentHookName) {
12933 {
12934 var componentName = getComponentName(currentlyRenderingFiber$1.type);
12935 if (!didWarnAboutMismatchedHooksForComponent.has(componentName)) {
12936 didWarnAboutMismatchedHooksForComponent.add(componentName);
12937
12938 if (hookTypesDev !== null) {
12939 var table = '';
12940
12941 var secondColumnStart = 30;
12942
12943 for (var i = 0; i <= hookTypesUpdateIndexDev; i++) {
12944 var oldHookName = hookTypesDev[i];
12945 var newHookName = i === hookTypesUpdateIndexDev ? currentHookName : oldHookName;
12946
12947 var row = i + 1 + '. ' + oldHookName;
12948
12949 // Extra space so second column lines up
12950 // lol @ IE not supporting String#repeat
12951 while (row.length < secondColumnStart) {
12952 row += ' ';
12953 }
12954
12955 row += newHookName + '\n';
12956
12957 table += row;
12958 }
12959
12960 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);
12961 }
12962 }
12963 }
12964}
12965
12966function throwInvalidHookError() {
12967 invariant(false, 'Invalid hook call. Hooks can only be called inside of the body of a function component. This could happen for one of the following reasons:\n1. You might have mismatching versions of React and the renderer (such as React DOM)\n2. You might be breaking the Rules of Hooks\n3. You might have more than one copy of React in the same app\nSee https://fb.me/react-invalid-hook-call for tips about how to debug and fix this problem.');
12968}
12969
12970function areHookInputsEqual(nextDeps, prevDeps) {
12971 if (prevDeps === null) {
12972 {
12973 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);
12974 }
12975 return false;
12976 }
12977
12978 {
12979 // Don't bother comparing lengths in prod because these arrays should be
12980 // passed inline.
12981 if (nextDeps.length !== prevDeps.length) {
12982 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(', ') + ']');
12983 }
12984 }
12985 for (var i = 0; i < prevDeps.length && i < nextDeps.length; i++) {
12986 if (is(nextDeps[i], prevDeps[i])) {
12987 continue;
12988 }
12989 return false;
12990 }
12991 return true;
12992}
12993
12994function renderWithHooks(current, workInProgress, Component, props, refOrContext, nextRenderExpirationTime) {
12995 renderExpirationTime = nextRenderExpirationTime;
12996 currentlyRenderingFiber$1 = workInProgress;
12997 nextCurrentHook = current !== null ? current.memoizedState : null;
12998
12999 {
13000 hookTypesDev = current !== null ? current._debugHookTypes : null;
13001 hookTypesUpdateIndexDev = -1;
13002 }
13003
13004 // The following should have already been reset
13005 // currentHook = null;
13006 // workInProgressHook = null;
13007
13008 // remainingExpirationTime = NoWork;
13009 // componentUpdateQueue = null;
13010
13011 // didScheduleRenderPhaseUpdate = false;
13012 // renderPhaseUpdates = null;
13013 // numberOfReRenders = 0;
13014 // sideEffectTag = 0;
13015
13016 // TODO Warn if no hooks are used at all during mount, then some are used during update.
13017 // Currently we will identify the update render as a mount because nextCurrentHook === null.
13018 // This is tricky because it's valid for certain types of components (e.g. React.lazy)
13019
13020 // Using nextCurrentHook to differentiate between mount/update only works if at least one stateful hook is used.
13021 // Non-stateful hooks (e.g. context) don't get added to memoizedState,
13022 // so nextCurrentHook would be null during updates and mounts.
13023 {
13024 if (nextCurrentHook !== null) {
13025 ReactCurrentDispatcher$1.current = HooksDispatcherOnUpdateInDEV;
13026 } else if (hookTypesDev !== null) {
13027 // This dispatcher handles an edge case where a component is updating,
13028 // but no stateful hooks have been used.
13029 // We want to match the production code behavior (which will use HooksDispatcherOnMount),
13030 // but with the extra DEV validation to ensure hooks ordering hasn't changed.
13031 // This dispatcher does that.
13032 ReactCurrentDispatcher$1.current = HooksDispatcherOnMountWithHookTypesInDEV;
13033 } else {
13034 ReactCurrentDispatcher$1.current = HooksDispatcherOnMountInDEV;
13035 }
13036 }
13037
13038 var children = Component(props, refOrContext);
13039
13040 if (didScheduleRenderPhaseUpdate) {
13041 do {
13042 didScheduleRenderPhaseUpdate = false;
13043 numberOfReRenders += 1;
13044
13045 // Start over from the beginning of the list
13046 nextCurrentHook = current !== null ? current.memoizedState : null;
13047 nextWorkInProgressHook = firstWorkInProgressHook;
13048
13049 currentHook = null;
13050 workInProgressHook = null;
13051 componentUpdateQueue = null;
13052
13053 {
13054 // Also validate hook order for cascading updates.
13055 hookTypesUpdateIndexDev = -1;
13056 }
13057
13058 ReactCurrentDispatcher$1.current = HooksDispatcherOnUpdateInDEV;
13059
13060 children = Component(props, refOrContext);
13061 } while (didScheduleRenderPhaseUpdate);
13062
13063 renderPhaseUpdates = null;
13064 numberOfReRenders = 0;
13065 }
13066
13067 // We can assume the previous dispatcher is always this one, since we set it
13068 // at the beginning of the render phase and there's no re-entrancy.
13069 ReactCurrentDispatcher$1.current = ContextOnlyDispatcher;
13070
13071 var renderedWork = currentlyRenderingFiber$1;
13072
13073 renderedWork.memoizedState = firstWorkInProgressHook;
13074 renderedWork.expirationTime = remainingExpirationTime;
13075 renderedWork.updateQueue = componentUpdateQueue;
13076 renderedWork.effectTag |= sideEffectTag;
13077
13078 {
13079 renderedWork._debugHookTypes = hookTypesDev;
13080 }
13081
13082 // This check uses currentHook so that it works the same in DEV and prod bundles.
13083 // hookTypesDev could catch more cases (e.g. context) but only in DEV bundles.
13084 var didRenderTooFewHooks = currentHook !== null && currentHook.next !== null;
13085
13086 renderExpirationTime = NoWork;
13087 currentlyRenderingFiber$1 = null;
13088
13089 currentHook = null;
13090 nextCurrentHook = null;
13091 firstWorkInProgressHook = null;
13092 workInProgressHook = null;
13093 nextWorkInProgressHook = null;
13094
13095 {
13096 currentHookNameInDev = null;
13097 hookTypesDev = null;
13098 hookTypesUpdateIndexDev = -1;
13099 }
13100
13101 remainingExpirationTime = NoWork;
13102 componentUpdateQueue = null;
13103 sideEffectTag = 0;
13104
13105 // These were reset above
13106 // didScheduleRenderPhaseUpdate = false;
13107 // renderPhaseUpdates = null;
13108 // numberOfReRenders = 0;
13109
13110 !!didRenderTooFewHooks ? invariant(false, 'Rendered fewer hooks than expected. This may be caused by an accidental early return statement.') : void 0;
13111
13112 return children;
13113}
13114
13115function bailoutHooks(current, workInProgress, expirationTime) {
13116 workInProgress.updateQueue = current.updateQueue;
13117 workInProgress.effectTag &= ~(Passive | Update);
13118 if (current.expirationTime <= expirationTime) {
13119 current.expirationTime = NoWork;
13120 }
13121}
13122
13123function resetHooks() {
13124 // We can assume the previous dispatcher is always this one, since we set it
13125 // at the beginning of the render phase and there's no re-entrancy.
13126 ReactCurrentDispatcher$1.current = ContextOnlyDispatcher;
13127
13128 // This is used to reset the state of this module when a component throws.
13129 // It's also called inside mountIndeterminateComponent if we determine the
13130 // component is a module-style component.
13131 renderExpirationTime = NoWork;
13132 currentlyRenderingFiber$1 = null;
13133
13134 currentHook = null;
13135 nextCurrentHook = null;
13136 firstWorkInProgressHook = null;
13137 workInProgressHook = null;
13138 nextWorkInProgressHook = null;
13139
13140 {
13141 hookTypesDev = null;
13142 hookTypesUpdateIndexDev = -1;
13143
13144 currentHookNameInDev = null;
13145 }
13146
13147 remainingExpirationTime = NoWork;
13148 componentUpdateQueue = null;
13149 sideEffectTag = 0;
13150
13151 didScheduleRenderPhaseUpdate = false;
13152 renderPhaseUpdates = null;
13153 numberOfReRenders = 0;
13154}
13155
13156function mountWorkInProgressHook() {
13157 var hook = {
13158 memoizedState: null,
13159
13160 baseState: null,
13161 queue: null,
13162 baseUpdate: null,
13163
13164 next: null
13165 };
13166
13167 if (workInProgressHook === null) {
13168 // This is the first hook in the list
13169 firstWorkInProgressHook = workInProgressHook = hook;
13170 } else {
13171 // Append to the end of the list
13172 workInProgressHook = workInProgressHook.next = hook;
13173 }
13174 return workInProgressHook;
13175}
13176
13177function updateWorkInProgressHook() {
13178 // This function is used both for updates and for re-renders triggered by a
13179 // render phase update. It assumes there is either a current hook we can
13180 // clone, or a work-in-progress hook from a previous render pass that we can
13181 // use as a base. When we reach the end of the base list, we must switch to
13182 // the dispatcher used for mounts.
13183 if (nextWorkInProgressHook !== null) {
13184 // There's already a work-in-progress. Reuse it.
13185 workInProgressHook = nextWorkInProgressHook;
13186 nextWorkInProgressHook = workInProgressHook.next;
13187
13188 currentHook = nextCurrentHook;
13189 nextCurrentHook = currentHook !== null ? currentHook.next : null;
13190 } else {
13191 // Clone from the current hook.
13192 !(nextCurrentHook !== null) ? invariant(false, 'Rendered more hooks than during the previous render.') : void 0;
13193 currentHook = nextCurrentHook;
13194
13195 var newHook = {
13196 memoizedState: currentHook.memoizedState,
13197
13198 baseState: currentHook.baseState,
13199 queue: currentHook.queue,
13200 baseUpdate: currentHook.baseUpdate,
13201
13202 next: null
13203 };
13204
13205 if (workInProgressHook === null) {
13206 // This is the first hook in the list.
13207 workInProgressHook = firstWorkInProgressHook = newHook;
13208 } else {
13209 // Append to the end of the list.
13210 workInProgressHook = workInProgressHook.next = newHook;
13211 }
13212 nextCurrentHook = currentHook.next;
13213 }
13214 return workInProgressHook;
13215}
13216
13217function createFunctionComponentUpdateQueue() {
13218 return {
13219 lastEffect: null
13220 };
13221}
13222
13223function basicStateReducer(state, action) {
13224 return typeof action === 'function' ? action(state) : action;
13225}
13226
13227function mountReducer(reducer, initialArg, init) {
13228 var hook = mountWorkInProgressHook();
13229 var initialState = void 0;
13230 if (init !== undefined) {
13231 initialState = init(initialArg);
13232 } else {
13233 initialState = initialArg;
13234 }
13235 hook.memoizedState = hook.baseState = initialState;
13236 var queue = hook.queue = {
13237 last: null,
13238 dispatch: null,
13239 eagerReducer: reducer,
13240 eagerState: initialState
13241 };
13242 var dispatch = queue.dispatch = dispatchAction.bind(null,
13243 // Flow doesn't know this is non-null, but we do.
13244 currentlyRenderingFiber$1, queue);
13245 return [hook.memoizedState, dispatch];
13246}
13247
13248function updateReducer(reducer, initialArg, init) {
13249 var hook = updateWorkInProgressHook();
13250 var queue = hook.queue;
13251 !(queue !== null) ? invariant(false, 'Should have a queue. This is likely a bug in React. Please file an issue.') : void 0;
13252
13253 if (numberOfReRenders > 0) {
13254 // This is a re-render. Apply the new render phase updates to the previous
13255 var _dispatch = queue.dispatch;
13256 if (renderPhaseUpdates !== null) {
13257 // Render phase updates are stored in a map of queue -> linked list
13258 var firstRenderPhaseUpdate = renderPhaseUpdates.get(queue);
13259 if (firstRenderPhaseUpdate !== undefined) {
13260 renderPhaseUpdates.delete(queue);
13261 var newState = hook.memoizedState;
13262 var update = firstRenderPhaseUpdate;
13263 do {
13264 // Process this render phase update. We don't have to check the
13265 // priority because it will always be the same as the current
13266 // render's.
13267 var _action = update.action;
13268 newState = reducer(newState, _action);
13269 update = update.next;
13270 } while (update !== null);
13271
13272 // Mark that the fiber performed work, but only if the new state is
13273 // different from the current state.
13274 if (!is(newState, hook.memoizedState)) {
13275 markWorkInProgressReceivedUpdate();
13276 }
13277
13278 hook.memoizedState = newState;
13279 // Don't persist the state accumlated from the render phase updates to
13280 // the base state unless the queue is empty.
13281 // TODO: Not sure if this is the desired semantics, but it's what we
13282 // do for gDSFP. I can't remember why.
13283 if (hook.baseUpdate === queue.last) {
13284 hook.baseState = newState;
13285 }
13286
13287 queue.eagerReducer = reducer;
13288 queue.eagerState = newState;
13289
13290 return [newState, _dispatch];
13291 }
13292 }
13293 return [hook.memoizedState, _dispatch];
13294 }
13295
13296 // The last update in the entire queue
13297 var last = queue.last;
13298 // The last update that is part of the base state.
13299 var baseUpdate = hook.baseUpdate;
13300 var baseState = hook.baseState;
13301
13302 // Find the first unprocessed update.
13303 var first = void 0;
13304 if (baseUpdate !== null) {
13305 if (last !== null) {
13306 // For the first update, the queue is a circular linked list where
13307 // `queue.last.next = queue.first`. Once the first update commits, and
13308 // the `baseUpdate` is no longer empty, we can unravel the list.
13309 last.next = null;
13310 }
13311 first = baseUpdate.next;
13312 } else {
13313 first = last !== null ? last.next : null;
13314 }
13315 if (first !== null) {
13316 var _newState = baseState;
13317 var newBaseState = null;
13318 var newBaseUpdate = null;
13319 var prevUpdate = baseUpdate;
13320 var _update = first;
13321 var didSkip = false;
13322 do {
13323 var updateExpirationTime = _update.expirationTime;
13324 if (updateExpirationTime < renderExpirationTime) {
13325 // Priority is insufficient. Skip this update. If this is the first
13326 // skipped update, the previous update/state is the new base
13327 // update/state.
13328 if (!didSkip) {
13329 didSkip = true;
13330 newBaseUpdate = prevUpdate;
13331 newBaseState = _newState;
13332 }
13333 // Update the remaining priority in the queue.
13334 if (updateExpirationTime > remainingExpirationTime) {
13335 remainingExpirationTime = updateExpirationTime;
13336 }
13337 } else {
13338 // Process this update.
13339 if (_update.eagerReducer === reducer) {
13340 // If this update was processed eagerly, and its reducer matches the
13341 // current reducer, we can use the eagerly computed state.
13342 _newState = _update.eagerState;
13343 } else {
13344 var _action2 = _update.action;
13345 _newState = reducer(_newState, _action2);
13346 }
13347 }
13348 prevUpdate = _update;
13349 _update = _update.next;
13350 } while (_update !== null && _update !== first);
13351
13352 if (!didSkip) {
13353 newBaseUpdate = prevUpdate;
13354 newBaseState = _newState;
13355 }
13356
13357 // Mark that the fiber performed work, but only if the new state is
13358 // different from the current state.
13359 if (!is(_newState, hook.memoizedState)) {
13360 markWorkInProgressReceivedUpdate();
13361 }
13362
13363 hook.memoizedState = _newState;
13364 hook.baseUpdate = newBaseUpdate;
13365 hook.baseState = newBaseState;
13366
13367 queue.eagerReducer = reducer;
13368 queue.eagerState = _newState;
13369 }
13370
13371 var dispatch = queue.dispatch;
13372 return [hook.memoizedState, dispatch];
13373}
13374
13375function mountState(initialState) {
13376 var hook = mountWorkInProgressHook();
13377 if (typeof initialState === 'function') {
13378 initialState = initialState();
13379 }
13380 hook.memoizedState = hook.baseState = initialState;
13381 var queue = hook.queue = {
13382 last: null,
13383 dispatch: null,
13384 eagerReducer: basicStateReducer,
13385 eagerState: initialState
13386 };
13387 var dispatch = queue.dispatch = dispatchAction.bind(null,
13388 // Flow doesn't know this is non-null, but we do.
13389 currentlyRenderingFiber$1, queue);
13390 return [hook.memoizedState, dispatch];
13391}
13392
13393function updateState(initialState) {
13394 return updateReducer(basicStateReducer, initialState);
13395}
13396
13397function pushEffect(tag, create, destroy, deps) {
13398 var effect = {
13399 tag: tag,
13400 create: create,
13401 destroy: destroy,
13402 deps: deps,
13403 // Circular
13404 next: null
13405 };
13406 if (componentUpdateQueue === null) {
13407 componentUpdateQueue = createFunctionComponentUpdateQueue();
13408 componentUpdateQueue.lastEffect = effect.next = effect;
13409 } else {
13410 var _lastEffect = componentUpdateQueue.lastEffect;
13411 if (_lastEffect === null) {
13412 componentUpdateQueue.lastEffect = effect.next = effect;
13413 } else {
13414 var firstEffect = _lastEffect.next;
13415 _lastEffect.next = effect;
13416 effect.next = firstEffect;
13417 componentUpdateQueue.lastEffect = effect;
13418 }
13419 }
13420 return effect;
13421}
13422
13423function mountRef(initialValue) {
13424 var hook = mountWorkInProgressHook();
13425 var ref = { current: initialValue };
13426 {
13427 Object.seal(ref);
13428 }
13429 hook.memoizedState = ref;
13430 return ref;
13431}
13432
13433function updateRef(initialValue) {
13434 var hook = updateWorkInProgressHook();
13435 return hook.memoizedState;
13436}
13437
13438function mountEffectImpl(fiberEffectTag, hookEffectTag, create, deps) {
13439 var hook = mountWorkInProgressHook();
13440 var nextDeps = deps === undefined ? null : deps;
13441 sideEffectTag |= fiberEffectTag;
13442 hook.memoizedState = pushEffect(hookEffectTag, create, undefined, nextDeps);
13443}
13444
13445function updateEffectImpl(fiberEffectTag, hookEffectTag, create, deps) {
13446 var hook = updateWorkInProgressHook();
13447 var nextDeps = deps === undefined ? null : deps;
13448 var destroy = undefined;
13449
13450 if (currentHook !== null) {
13451 var prevEffect = currentHook.memoizedState;
13452 destroy = prevEffect.destroy;
13453 if (nextDeps !== null) {
13454 var prevDeps = prevEffect.deps;
13455 if (areHookInputsEqual(nextDeps, prevDeps)) {
13456 pushEffect(NoEffect$1, create, destroy, nextDeps);
13457 return;
13458 }
13459 }
13460 }
13461
13462 sideEffectTag |= fiberEffectTag;
13463 hook.memoizedState = pushEffect(hookEffectTag, create, destroy, nextDeps);
13464}
13465
13466function mountEffect(create, deps) {
13467 return mountEffectImpl(Update | Passive, UnmountPassive | MountPassive, create, deps);
13468}
13469
13470function updateEffect(create, deps) {
13471 return updateEffectImpl(Update | Passive, UnmountPassive | MountPassive, create, deps);
13472}
13473
13474function mountLayoutEffect(create, deps) {
13475 return mountEffectImpl(Update, UnmountMutation | MountLayout, create, deps);
13476}
13477
13478function updateLayoutEffect(create, deps) {
13479 return updateEffectImpl(Update, UnmountMutation | MountLayout, create, deps);
13480}
13481
13482function imperativeHandleEffect(create, ref) {
13483 if (typeof ref === 'function') {
13484 var refCallback = ref;
13485 var _inst = create();
13486 refCallback(_inst);
13487 return function () {
13488 refCallback(null);
13489 };
13490 } else if (ref !== null && ref !== undefined) {
13491 var refObject = ref;
13492 {
13493 !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;
13494 }
13495 var _inst2 = create();
13496 refObject.current = _inst2;
13497 return function () {
13498 refObject.current = null;
13499 };
13500 }
13501}
13502
13503function mountImperativeHandle(ref, create, deps) {
13504 {
13505 !(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;
13506 }
13507
13508 // TODO: If deps are provided, should we skip comparing the ref itself?
13509 var effectDeps = deps !== null && deps !== undefined ? deps.concat([ref]) : null;
13510
13511 return mountEffectImpl(Update, UnmountMutation | MountLayout, imperativeHandleEffect.bind(null, create, ref), effectDeps);
13512}
13513
13514function updateImperativeHandle(ref, create, deps) {
13515 {
13516 !(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;
13517 }
13518
13519 // TODO: If deps are provided, should we skip comparing the ref itself?
13520 var effectDeps = deps !== null && deps !== undefined ? deps.concat([ref]) : null;
13521
13522 return updateEffectImpl(Update, UnmountMutation | MountLayout, imperativeHandleEffect.bind(null, create, ref), effectDeps);
13523}
13524
13525function mountDebugValue(value, formatterFn) {
13526 // This hook is normally a no-op.
13527 // The react-debug-hooks package injects its own implementation
13528 // so that e.g. DevTools can display custom hook values.
13529}
13530
13531var updateDebugValue = mountDebugValue;
13532
13533function mountCallback(callback, deps) {
13534 var hook = mountWorkInProgressHook();
13535 var nextDeps = deps === undefined ? null : deps;
13536 hook.memoizedState = [callback, nextDeps];
13537 return callback;
13538}
13539
13540function updateCallback(callback, deps) {
13541 var hook = updateWorkInProgressHook();
13542 var nextDeps = deps === undefined ? null : deps;
13543 var prevState = hook.memoizedState;
13544 if (prevState !== null) {
13545 if (nextDeps !== null) {
13546 var prevDeps = prevState[1];
13547 if (areHookInputsEqual(nextDeps, prevDeps)) {
13548 return prevState[0];
13549 }
13550 }
13551 }
13552 hook.memoizedState = [callback, nextDeps];
13553 return callback;
13554}
13555
13556function mountMemo(nextCreate, deps) {
13557 var hook = mountWorkInProgressHook();
13558 var nextDeps = deps === undefined ? null : deps;
13559 var nextValue = nextCreate();
13560 hook.memoizedState = [nextValue, nextDeps];
13561 return nextValue;
13562}
13563
13564function updateMemo(nextCreate, deps) {
13565 var hook = updateWorkInProgressHook();
13566 var nextDeps = deps === undefined ? null : deps;
13567 var prevState = hook.memoizedState;
13568 if (prevState !== null) {
13569 // Assume these are defined. If they're not, areHookInputsEqual will warn.
13570 if (nextDeps !== null) {
13571 var prevDeps = prevState[1];
13572 if (areHookInputsEqual(nextDeps, prevDeps)) {
13573 return prevState[0];
13574 }
13575 }
13576 }
13577 var nextValue = nextCreate();
13578 hook.memoizedState = [nextValue, nextDeps];
13579 return nextValue;
13580}
13581
13582// in a test-like environment, we want to warn if dispatchAction()
13583// is called outside of a batchedUpdates/TestUtils.act(...) call.
13584var shouldWarnForUnbatchedSetState = false;
13585
13586{
13587 // jest isn't a 'global', it's just exposed to tests via a wrapped function
13588 // further, this isn't a test file, so flow doesn't recognize the symbol. So...
13589 // $FlowExpectedError - because requirements don't give a damn about your type sigs.
13590 if ('undefined' !== typeof jest) {
13591 shouldWarnForUnbatchedSetState = true;
13592 }
13593}
13594
13595function dispatchAction(fiber, queue, action) {
13596 !(numberOfReRenders < RE_RENDER_LIMIT) ? invariant(false, 'Too many re-renders. React limits the number of renders to prevent an infinite loop.') : void 0;
13597
13598 {
13599 !(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;
13600 }
13601
13602 var alternate = fiber.alternate;
13603 if (fiber === currentlyRenderingFiber$1 || alternate !== null && alternate === currentlyRenderingFiber$1) {
13604 // This is a render phase update. Stash it in a lazily-created map of
13605 // queue -> linked list of updates. After this render pass, we'll restart
13606 // and apply the stashed updates on top of the work-in-progress hook.
13607 didScheduleRenderPhaseUpdate = true;
13608 var update = {
13609 expirationTime: renderExpirationTime,
13610 action: action,
13611 eagerReducer: null,
13612 eagerState: null,
13613 next: null
13614 };
13615 if (renderPhaseUpdates === null) {
13616 renderPhaseUpdates = new Map();
13617 }
13618 var firstRenderPhaseUpdate = renderPhaseUpdates.get(queue);
13619 if (firstRenderPhaseUpdate === undefined) {
13620 renderPhaseUpdates.set(queue, update);
13621 } else {
13622 // Append the update to the end of the list.
13623 var lastRenderPhaseUpdate = firstRenderPhaseUpdate;
13624 while (lastRenderPhaseUpdate.next !== null) {
13625 lastRenderPhaseUpdate = lastRenderPhaseUpdate.next;
13626 }
13627 lastRenderPhaseUpdate.next = update;
13628 }
13629 } else {
13630 flushPassiveEffects();
13631
13632 var currentTime = requestCurrentTime();
13633 var _expirationTime = computeExpirationForFiber(currentTime, fiber);
13634
13635 var _update2 = {
13636 expirationTime: _expirationTime,
13637 action: action,
13638 eagerReducer: null,
13639 eagerState: null,
13640 next: null
13641 };
13642
13643 // Append the update to the end of the list.
13644 var _last = queue.last;
13645 if (_last === null) {
13646 // This is the first update. Create a circular list.
13647 _update2.next = _update2;
13648 } else {
13649 var first = _last.next;
13650 if (first !== null) {
13651 // Still circular.
13652 _update2.next = first;
13653 }
13654 _last.next = _update2;
13655 }
13656 queue.last = _update2;
13657
13658 if (fiber.expirationTime === NoWork && (alternate === null || alternate.expirationTime === NoWork)) {
13659 // The queue is currently empty, which means we can eagerly compute the
13660 // next state before entering the render phase. If the new state is the
13661 // same as the current state, we may be able to bail out entirely.
13662 var _eagerReducer = queue.eagerReducer;
13663 if (_eagerReducer !== null) {
13664 var prevDispatcher = void 0;
13665 {
13666 prevDispatcher = ReactCurrentDispatcher$1.current;
13667 ReactCurrentDispatcher$1.current = InvalidNestedHooksDispatcherOnUpdateInDEV;
13668 }
13669 try {
13670 var currentState = queue.eagerState;
13671 var _eagerState = _eagerReducer(currentState, action);
13672 // Stash the eagerly computed state, and the reducer used to compute
13673 // it, on the update object. If the reducer hasn't changed by the
13674 // time we enter the render phase, then the eager state can be used
13675 // without calling the reducer again.
13676 _update2.eagerReducer = _eagerReducer;
13677 _update2.eagerState = _eagerState;
13678 if (is(_eagerState, currentState)) {
13679 // Fast path. We can bail out without scheduling React to re-render.
13680 // It's still possible that we'll need to rebase this update later,
13681 // if the component re-renders for a different reason and by that
13682 // time the reducer has changed.
13683 return;
13684 }
13685 } catch (error) {
13686 // Suppress the error. It will throw again in the render phase.
13687 } finally {
13688 {
13689 ReactCurrentDispatcher$1.current = prevDispatcher;
13690 }
13691 }
13692 }
13693 }
13694 {
13695 if (shouldWarnForUnbatchedSetState === true) {
13696 warnIfNotCurrentlyBatchingInDev(fiber);
13697 }
13698 }
13699 scheduleWork(fiber, _expirationTime);
13700 }
13701}
13702
13703var ContextOnlyDispatcher = {
13704 readContext: readContext,
13705
13706 useCallback: throwInvalidHookError,
13707 useContext: throwInvalidHookError,
13708 useEffect: throwInvalidHookError,
13709 useImperativeHandle: throwInvalidHookError,
13710 useLayoutEffect: throwInvalidHookError,
13711 useMemo: throwInvalidHookError,
13712 useReducer: throwInvalidHookError,
13713 useRef: throwInvalidHookError,
13714 useState: throwInvalidHookError,
13715 useDebugValue: throwInvalidHookError
13716};
13717
13718var HooksDispatcherOnMountInDEV = null;
13719var HooksDispatcherOnMountWithHookTypesInDEV = null;
13720var HooksDispatcherOnUpdateInDEV = null;
13721var InvalidNestedHooksDispatcherOnMountInDEV = null;
13722var InvalidNestedHooksDispatcherOnUpdateInDEV = null;
13723
13724{
13725 var warnInvalidContextAccess = function () {
13726 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().');
13727 };
13728
13729 var warnInvalidHookAccess = function () {
13730 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');
13731 };
13732
13733 HooksDispatcherOnMountInDEV = {
13734 readContext: function (context, observedBits) {
13735 return readContext(context, observedBits);
13736 },
13737 useCallback: function (callback, deps) {
13738 currentHookNameInDev = 'useCallback';
13739 mountHookTypesDev();
13740 return mountCallback(callback, deps);
13741 },
13742 useContext: function (context, observedBits) {
13743 currentHookNameInDev = 'useContext';
13744 mountHookTypesDev();
13745 return readContext(context, observedBits);
13746 },
13747 useEffect: function (create, deps) {
13748 currentHookNameInDev = 'useEffect';
13749 mountHookTypesDev();
13750 return mountEffect(create, deps);
13751 },
13752 useImperativeHandle: function (ref, create, deps) {
13753 currentHookNameInDev = 'useImperativeHandle';
13754 mountHookTypesDev();
13755 return mountImperativeHandle(ref, create, deps);
13756 },
13757 useLayoutEffect: function (create, deps) {
13758 currentHookNameInDev = 'useLayoutEffect';
13759 mountHookTypesDev();
13760 return mountLayoutEffect(create, deps);
13761 },
13762 useMemo: function (create, deps) {
13763 currentHookNameInDev = 'useMemo';
13764 mountHookTypesDev();
13765 var prevDispatcher = ReactCurrentDispatcher$1.current;
13766 ReactCurrentDispatcher$1.current = InvalidNestedHooksDispatcherOnMountInDEV;
13767 try {
13768 return mountMemo(create, deps);
13769 } finally {
13770 ReactCurrentDispatcher$1.current = prevDispatcher;
13771 }
13772 },
13773 useReducer: function (reducer, initialArg, init) {
13774 currentHookNameInDev = 'useReducer';
13775 mountHookTypesDev();
13776 var prevDispatcher = ReactCurrentDispatcher$1.current;
13777 ReactCurrentDispatcher$1.current = InvalidNestedHooksDispatcherOnMountInDEV;
13778 try {
13779 return mountReducer(reducer, initialArg, init);
13780 } finally {
13781 ReactCurrentDispatcher$1.current = prevDispatcher;
13782 }
13783 },
13784 useRef: function (initialValue) {
13785 currentHookNameInDev = 'useRef';
13786 mountHookTypesDev();
13787 return mountRef(initialValue);
13788 },
13789 useState: function (initialState) {
13790 currentHookNameInDev = 'useState';
13791 mountHookTypesDev();
13792 var prevDispatcher = ReactCurrentDispatcher$1.current;
13793 ReactCurrentDispatcher$1.current = InvalidNestedHooksDispatcherOnMountInDEV;
13794 try {
13795 return mountState(initialState);
13796 } finally {
13797 ReactCurrentDispatcher$1.current = prevDispatcher;
13798 }
13799 },
13800 useDebugValue: function (value, formatterFn) {
13801 currentHookNameInDev = 'useDebugValue';
13802 mountHookTypesDev();
13803 return mountDebugValue(value, formatterFn);
13804 }
13805 };
13806
13807 HooksDispatcherOnMountWithHookTypesInDEV = {
13808 readContext: function (context, observedBits) {
13809 return readContext(context, observedBits);
13810 },
13811 useCallback: function (callback, deps) {
13812 currentHookNameInDev = 'useCallback';
13813 updateHookTypesDev();
13814 return mountCallback(callback, deps);
13815 },
13816 useContext: function (context, observedBits) {
13817 currentHookNameInDev = 'useContext';
13818 updateHookTypesDev();
13819 return readContext(context, observedBits);
13820 },
13821 useEffect: function (create, deps) {
13822 currentHookNameInDev = 'useEffect';
13823 updateHookTypesDev();
13824 return mountEffect(create, deps);
13825 },
13826 useImperativeHandle: function (ref, create, deps) {
13827 currentHookNameInDev = 'useImperativeHandle';
13828 updateHookTypesDev();
13829 return mountImperativeHandle(ref, create, deps);
13830 },
13831 useLayoutEffect: function (create, deps) {
13832 currentHookNameInDev = 'useLayoutEffect';
13833 updateHookTypesDev();
13834 return mountLayoutEffect(create, deps);
13835 },
13836 useMemo: function (create, deps) {
13837 currentHookNameInDev = 'useMemo';
13838 updateHookTypesDev();
13839 var prevDispatcher = ReactCurrentDispatcher$1.current;
13840 ReactCurrentDispatcher$1.current = InvalidNestedHooksDispatcherOnMountInDEV;
13841 try {
13842 return mountMemo(create, deps);
13843 } finally {
13844 ReactCurrentDispatcher$1.current = prevDispatcher;
13845 }
13846 },
13847 useReducer: function (reducer, initialArg, init) {
13848 currentHookNameInDev = 'useReducer';
13849 updateHookTypesDev();
13850 var prevDispatcher = ReactCurrentDispatcher$1.current;
13851 ReactCurrentDispatcher$1.current = InvalidNestedHooksDispatcherOnMountInDEV;
13852 try {
13853 return mountReducer(reducer, initialArg, init);
13854 } finally {
13855 ReactCurrentDispatcher$1.current = prevDispatcher;
13856 }
13857 },
13858 useRef: function (initialValue) {
13859 currentHookNameInDev = 'useRef';
13860 updateHookTypesDev();
13861 return mountRef(initialValue);
13862 },
13863 useState: function (initialState) {
13864 currentHookNameInDev = 'useState';
13865 updateHookTypesDev();
13866 var prevDispatcher = ReactCurrentDispatcher$1.current;
13867 ReactCurrentDispatcher$1.current = InvalidNestedHooksDispatcherOnMountInDEV;
13868 try {
13869 return mountState(initialState);
13870 } finally {
13871 ReactCurrentDispatcher$1.current = prevDispatcher;
13872 }
13873 },
13874 useDebugValue: function (value, formatterFn) {
13875 currentHookNameInDev = 'useDebugValue';
13876 updateHookTypesDev();
13877 return mountDebugValue(value, formatterFn);
13878 }
13879 };
13880
13881 HooksDispatcherOnUpdateInDEV = {
13882 readContext: function (context, observedBits) {
13883 return readContext(context, observedBits);
13884 },
13885 useCallback: function (callback, deps) {
13886 currentHookNameInDev = 'useCallback';
13887 updateHookTypesDev();
13888 return updateCallback(callback, deps);
13889 },
13890 useContext: function (context, observedBits) {
13891 currentHookNameInDev = 'useContext';
13892 updateHookTypesDev();
13893 return readContext(context, observedBits);
13894 },
13895 useEffect: function (create, deps) {
13896 currentHookNameInDev = 'useEffect';
13897 updateHookTypesDev();
13898 return updateEffect(create, deps);
13899 },
13900 useImperativeHandle: function (ref, create, deps) {
13901 currentHookNameInDev = 'useImperativeHandle';
13902 updateHookTypesDev();
13903 return updateImperativeHandle(ref, create, deps);
13904 },
13905 useLayoutEffect: function (create, deps) {
13906 currentHookNameInDev = 'useLayoutEffect';
13907 updateHookTypesDev();
13908 return updateLayoutEffect(create, deps);
13909 },
13910 useMemo: function (create, deps) {
13911 currentHookNameInDev = 'useMemo';
13912 updateHookTypesDev();
13913 var prevDispatcher = ReactCurrentDispatcher$1.current;
13914 ReactCurrentDispatcher$1.current = InvalidNestedHooksDispatcherOnUpdateInDEV;
13915 try {
13916 return updateMemo(create, deps);
13917 } finally {
13918 ReactCurrentDispatcher$1.current = prevDispatcher;
13919 }
13920 },
13921 useReducer: function (reducer, initialArg, init) {
13922 currentHookNameInDev = 'useReducer';
13923 updateHookTypesDev();
13924 var prevDispatcher = ReactCurrentDispatcher$1.current;
13925 ReactCurrentDispatcher$1.current = InvalidNestedHooksDispatcherOnUpdateInDEV;
13926 try {
13927 return updateReducer(reducer, initialArg, init);
13928 } finally {
13929 ReactCurrentDispatcher$1.current = prevDispatcher;
13930 }
13931 },
13932 useRef: function (initialValue) {
13933 currentHookNameInDev = 'useRef';
13934 updateHookTypesDev();
13935 return updateRef(initialValue);
13936 },
13937 useState: function (initialState) {
13938 currentHookNameInDev = 'useState';
13939 updateHookTypesDev();
13940 var prevDispatcher = ReactCurrentDispatcher$1.current;
13941 ReactCurrentDispatcher$1.current = InvalidNestedHooksDispatcherOnUpdateInDEV;
13942 try {
13943 return updateState(initialState);
13944 } finally {
13945 ReactCurrentDispatcher$1.current = prevDispatcher;
13946 }
13947 },
13948 useDebugValue: function (value, formatterFn) {
13949 currentHookNameInDev = 'useDebugValue';
13950 updateHookTypesDev();
13951 return updateDebugValue(value, formatterFn);
13952 }
13953 };
13954
13955 InvalidNestedHooksDispatcherOnMountInDEV = {
13956 readContext: function (context, observedBits) {
13957 warnInvalidContextAccess();
13958 return readContext(context, observedBits);
13959 },
13960 useCallback: function (callback, deps) {
13961 currentHookNameInDev = 'useCallback';
13962 warnInvalidHookAccess();
13963 mountHookTypesDev();
13964 return mountCallback(callback, deps);
13965 },
13966 useContext: function (context, observedBits) {
13967 currentHookNameInDev = 'useContext';
13968 warnInvalidHookAccess();
13969 mountHookTypesDev();
13970 return readContext(context, observedBits);
13971 },
13972 useEffect: function (create, deps) {
13973 currentHookNameInDev = 'useEffect';
13974 warnInvalidHookAccess();
13975 mountHookTypesDev();
13976 return mountEffect(create, deps);
13977 },
13978 useImperativeHandle: function (ref, create, deps) {
13979 currentHookNameInDev = 'useImperativeHandle';
13980 warnInvalidHookAccess();
13981 mountHookTypesDev();
13982 return mountImperativeHandle(ref, create, deps);
13983 },
13984 useLayoutEffect: function (create, deps) {
13985 currentHookNameInDev = 'useLayoutEffect';
13986 warnInvalidHookAccess();
13987 mountHookTypesDev();
13988 return mountLayoutEffect(create, deps);
13989 },
13990 useMemo: function (create, deps) {
13991 currentHookNameInDev = 'useMemo';
13992 warnInvalidHookAccess();
13993 mountHookTypesDev();
13994 var prevDispatcher = ReactCurrentDispatcher$1.current;
13995 ReactCurrentDispatcher$1.current = InvalidNestedHooksDispatcherOnMountInDEV;
13996 try {
13997 return mountMemo(create, deps);
13998 } finally {
13999 ReactCurrentDispatcher$1.current = prevDispatcher;
14000 }
14001 },
14002 useReducer: function (reducer, initialArg, init) {
14003 currentHookNameInDev = 'useReducer';
14004 warnInvalidHookAccess();
14005 mountHookTypesDev();
14006 var prevDispatcher = ReactCurrentDispatcher$1.current;
14007 ReactCurrentDispatcher$1.current = InvalidNestedHooksDispatcherOnMountInDEV;
14008 try {
14009 return mountReducer(reducer, initialArg, init);
14010 } finally {
14011 ReactCurrentDispatcher$1.current = prevDispatcher;
14012 }
14013 },
14014 useRef: function (initialValue) {
14015 currentHookNameInDev = 'useRef';
14016 warnInvalidHookAccess();
14017 mountHookTypesDev();
14018 return mountRef(initialValue);
14019 },
14020 useState: function (initialState) {
14021 currentHookNameInDev = 'useState';
14022 warnInvalidHookAccess();
14023 mountHookTypesDev();
14024 var prevDispatcher = ReactCurrentDispatcher$1.current;
14025 ReactCurrentDispatcher$1.current = InvalidNestedHooksDispatcherOnMountInDEV;
14026 try {
14027 return mountState(initialState);
14028 } finally {
14029 ReactCurrentDispatcher$1.current = prevDispatcher;
14030 }
14031 },
14032 useDebugValue: function (value, formatterFn) {
14033 currentHookNameInDev = 'useDebugValue';
14034 warnInvalidHookAccess();
14035 mountHookTypesDev();
14036 return mountDebugValue(value, formatterFn);
14037 }
14038 };
14039
14040 InvalidNestedHooksDispatcherOnUpdateInDEV = {
14041 readContext: function (context, observedBits) {
14042 warnInvalidContextAccess();
14043 return readContext(context, observedBits);
14044 },
14045 useCallback: function (callback, deps) {
14046 currentHookNameInDev = 'useCallback';
14047 warnInvalidHookAccess();
14048 updateHookTypesDev();
14049 return updateCallback(callback, deps);
14050 },
14051 useContext: function (context, observedBits) {
14052 currentHookNameInDev = 'useContext';
14053 warnInvalidHookAccess();
14054 updateHookTypesDev();
14055 return readContext(context, observedBits);
14056 },
14057 useEffect: function (create, deps) {
14058 currentHookNameInDev = 'useEffect';
14059 warnInvalidHookAccess();
14060 updateHookTypesDev();
14061 return updateEffect(create, deps);
14062 },
14063 useImperativeHandle: function (ref, create, deps) {
14064 currentHookNameInDev = 'useImperativeHandle';
14065 warnInvalidHookAccess();
14066 updateHookTypesDev();
14067 return updateImperativeHandle(ref, create, deps);
14068 },
14069 useLayoutEffect: function (create, deps) {
14070 currentHookNameInDev = 'useLayoutEffect';
14071 warnInvalidHookAccess();
14072 updateHookTypesDev();
14073 return updateLayoutEffect(create, deps);
14074 },
14075 useMemo: function (create, deps) {
14076 currentHookNameInDev = 'useMemo';
14077 warnInvalidHookAccess();
14078 updateHookTypesDev();
14079 var prevDispatcher = ReactCurrentDispatcher$1.current;
14080 ReactCurrentDispatcher$1.current = InvalidNestedHooksDispatcherOnUpdateInDEV;
14081 try {
14082 return updateMemo(create, deps);
14083 } finally {
14084 ReactCurrentDispatcher$1.current = prevDispatcher;
14085 }
14086 },
14087 useReducer: function (reducer, initialArg, init) {
14088 currentHookNameInDev = 'useReducer';
14089 warnInvalidHookAccess();
14090 updateHookTypesDev();
14091 var prevDispatcher = ReactCurrentDispatcher$1.current;
14092 ReactCurrentDispatcher$1.current = InvalidNestedHooksDispatcherOnUpdateInDEV;
14093 try {
14094 return updateReducer(reducer, initialArg, init);
14095 } finally {
14096 ReactCurrentDispatcher$1.current = prevDispatcher;
14097 }
14098 },
14099 useRef: function (initialValue) {
14100 currentHookNameInDev = 'useRef';
14101 warnInvalidHookAccess();
14102 updateHookTypesDev();
14103 return updateRef(initialValue);
14104 },
14105 useState: function (initialState) {
14106 currentHookNameInDev = 'useState';
14107 warnInvalidHookAccess();
14108 updateHookTypesDev();
14109 var prevDispatcher = ReactCurrentDispatcher$1.current;
14110 ReactCurrentDispatcher$1.current = InvalidNestedHooksDispatcherOnUpdateInDEV;
14111 try {
14112 return updateState(initialState);
14113 } finally {
14114 ReactCurrentDispatcher$1.current = prevDispatcher;
14115 }
14116 },
14117 useDebugValue: function (value, formatterFn) {
14118 currentHookNameInDev = 'useDebugValue';
14119 warnInvalidHookAccess();
14120 updateHookTypesDev();
14121 return updateDebugValue(value, formatterFn);
14122 }
14123 };
14124}
14125
14126var commitTime = 0;
14127var profilerStartTime = -1;
14128
14129function getCommitTime() {
14130 return commitTime;
14131}
14132
14133function recordCommitTime() {
14134 if (!enableProfilerTimer) {
14135 return;
14136 }
14137 commitTime = unstable_now();
14138}
14139
14140function startProfilerTimer(fiber) {
14141 if (!enableProfilerTimer) {
14142 return;
14143 }
14144
14145 profilerStartTime = unstable_now();
14146
14147 if (fiber.actualStartTime < 0) {
14148 fiber.actualStartTime = unstable_now();
14149 }
14150}
14151
14152function stopProfilerTimerIfRunning(fiber) {
14153 if (!enableProfilerTimer) {
14154 return;
14155 }
14156 profilerStartTime = -1;
14157}
14158
14159function stopProfilerTimerIfRunningAndRecordDelta(fiber, overrideBaseTime) {
14160 if (!enableProfilerTimer) {
14161 return;
14162 }
14163
14164 if (profilerStartTime >= 0) {
14165 var elapsedTime = unstable_now() - profilerStartTime;
14166 fiber.actualDuration += elapsedTime;
14167 if (overrideBaseTime) {
14168 fiber.selfBaseDuration = elapsedTime;
14169 }
14170 profilerStartTime = -1;
14171 }
14172}
14173
14174// The deepest Fiber on the stack involved in a hydration context.
14175// This may have been an insertion or a hydration.
14176var hydrationParentFiber = null;
14177var nextHydratableInstance = null;
14178var isHydrating = false;
14179
14180function enterHydrationState(fiber) {
14181 if (!supportsHydration) {
14182 return false;
14183 }
14184
14185 var parentInstance = fiber.stateNode.containerInfo;
14186 nextHydratableInstance = getFirstHydratableChild(parentInstance);
14187 hydrationParentFiber = fiber;
14188 isHydrating = true;
14189 return true;
14190}
14191
14192function reenterHydrationStateFromDehydratedSuspenseInstance(fiber) {
14193 if (!supportsHydration) {
14194 return false;
14195 }
14196
14197 var suspenseInstance = fiber.stateNode;
14198 nextHydratableInstance = getNextHydratableSibling(suspenseInstance);
14199 popToNextHostParent(fiber);
14200 isHydrating = true;
14201 return true;
14202}
14203
14204function deleteHydratableInstance(returnFiber, instance) {
14205 {
14206 switch (returnFiber.tag) {
14207 case HostRoot:
14208 didNotHydrateContainerInstance(returnFiber.stateNode.containerInfo, instance);
14209 break;
14210 case HostComponent:
14211 didNotHydrateInstance(returnFiber.type, returnFiber.memoizedProps, returnFiber.stateNode, instance);
14212 break;
14213 }
14214 }
14215
14216 var childToDelete = createFiberFromHostInstanceForDeletion();
14217 childToDelete.stateNode = instance;
14218 childToDelete.return = returnFiber;
14219 childToDelete.effectTag = Deletion;
14220
14221 // This might seem like it belongs on progressedFirstDeletion. However,
14222 // these children are not part of the reconciliation list of children.
14223 // Even if we abort and rereconcile the children, that will try to hydrate
14224 // again and the nodes are still in the host tree so these will be
14225 // recreated.
14226 if (returnFiber.lastEffect !== null) {
14227 returnFiber.lastEffect.nextEffect = childToDelete;
14228 returnFiber.lastEffect = childToDelete;
14229 } else {
14230 returnFiber.firstEffect = returnFiber.lastEffect = childToDelete;
14231 }
14232}
14233
14234function insertNonHydratedInstance(returnFiber, fiber) {
14235 fiber.effectTag |= Placement;
14236 {
14237 switch (returnFiber.tag) {
14238 case HostRoot:
14239 {
14240 var parentContainer = returnFiber.stateNode.containerInfo;
14241 switch (fiber.tag) {
14242 case HostComponent:
14243 var type = fiber.type;
14244 var props = fiber.pendingProps;
14245 didNotFindHydratableContainerInstance(parentContainer, type, props);
14246 break;
14247 case HostText:
14248 var text = fiber.pendingProps;
14249 didNotFindHydratableContainerTextInstance(parentContainer, text);
14250 break;
14251 case SuspenseComponent:
14252
14253 break;
14254 }
14255 break;
14256 }
14257 case HostComponent:
14258 {
14259 var parentType = returnFiber.type;
14260 var parentProps = returnFiber.memoizedProps;
14261 var parentInstance = returnFiber.stateNode;
14262 switch (fiber.tag) {
14263 case HostComponent:
14264 var _type = fiber.type;
14265 var _props = fiber.pendingProps;
14266 didNotFindHydratableInstance(parentType, parentProps, parentInstance, _type, _props);
14267 break;
14268 case HostText:
14269 var _text = fiber.pendingProps;
14270 didNotFindHydratableTextInstance(parentType, parentProps, parentInstance, _text);
14271 break;
14272 case SuspenseComponent:
14273 didNotFindHydratableSuspenseInstance(parentType, parentProps, parentInstance);
14274 break;
14275 }
14276 break;
14277 }
14278 default:
14279 return;
14280 }
14281 }
14282}
14283
14284function tryHydrate(fiber, nextInstance) {
14285 switch (fiber.tag) {
14286 case HostComponent:
14287 {
14288 var type = fiber.type;
14289 var props = fiber.pendingProps;
14290 var instance = canHydrateInstance(nextInstance, type, props);
14291 if (instance !== null) {
14292 fiber.stateNode = instance;
14293 return true;
14294 }
14295 return false;
14296 }
14297 case HostText:
14298 {
14299 var text = fiber.pendingProps;
14300 var textInstance = canHydrateTextInstance(nextInstance, text);
14301 if (textInstance !== null) {
14302 fiber.stateNode = textInstance;
14303 return true;
14304 }
14305 return false;
14306 }
14307 case SuspenseComponent:
14308 {
14309 if (enableSuspenseServerRenderer) {
14310 var suspenseInstance = canHydrateSuspenseInstance(nextInstance);
14311 if (suspenseInstance !== null) {
14312 // Downgrade the tag to a dehydrated component until we've hydrated it.
14313 fiber.tag = DehydratedSuspenseComponent;
14314 fiber.stateNode = suspenseInstance;
14315 return true;
14316 }
14317 }
14318 return false;
14319 }
14320 default:
14321 return false;
14322 }
14323}
14324
14325function tryToClaimNextHydratableInstance(fiber) {
14326 if (!isHydrating) {
14327 return;
14328 }
14329 var nextInstance = nextHydratableInstance;
14330 if (!nextInstance) {
14331 // Nothing to hydrate. Make it an insertion.
14332 insertNonHydratedInstance(hydrationParentFiber, fiber);
14333 isHydrating = false;
14334 hydrationParentFiber = fiber;
14335 return;
14336 }
14337 var firstAttemptedInstance = nextInstance;
14338 if (!tryHydrate(fiber, nextInstance)) {
14339 // If we can't hydrate this instance let's try the next one.
14340 // We use this as a heuristic. It's based on intuition and not data so it
14341 // might be flawed or unnecessary.
14342 nextInstance = getNextHydratableSibling(firstAttemptedInstance);
14343 if (!nextInstance || !tryHydrate(fiber, nextInstance)) {
14344 // Nothing to hydrate. Make it an insertion.
14345 insertNonHydratedInstance(hydrationParentFiber, fiber);
14346 isHydrating = false;
14347 hydrationParentFiber = fiber;
14348 return;
14349 }
14350 // We matched the next one, we'll now assume that the first one was
14351 // superfluous and we'll delete it. Since we can't eagerly delete it
14352 // we'll have to schedule a deletion. To do that, this node needs a dummy
14353 // fiber associated with it.
14354 deleteHydratableInstance(hydrationParentFiber, firstAttemptedInstance);
14355 }
14356 hydrationParentFiber = fiber;
14357 nextHydratableInstance = getFirstHydratableChild(nextInstance);
14358}
14359
14360function prepareToHydrateHostInstance(fiber, rootContainerInstance, hostContext) {
14361 if (!supportsHydration) {
14362 invariant(false, 'Expected prepareToHydrateHostInstance() to never be called. This error is likely caused by a bug in React. Please file an issue.');
14363 }
14364
14365 var instance = fiber.stateNode;
14366 var updatePayload = hydrateInstance(instance, fiber.type, fiber.memoizedProps, rootContainerInstance, hostContext, fiber);
14367 // TODO: Type this specific to this type of component.
14368 fiber.updateQueue = updatePayload;
14369 // If the update payload indicates that there is a change or if there
14370 // is a new ref we mark this as an update.
14371 if (updatePayload !== null) {
14372 return true;
14373 }
14374 return false;
14375}
14376
14377function prepareToHydrateHostTextInstance(fiber) {
14378 if (!supportsHydration) {
14379 invariant(false, 'Expected prepareToHydrateHostTextInstance() to never be called. This error is likely caused by a bug in React. Please file an issue.');
14380 }
14381
14382 var textInstance = fiber.stateNode;
14383 var textContent = fiber.memoizedProps;
14384 var shouldUpdate = hydrateTextInstance(textInstance, textContent, fiber);
14385 {
14386 if (shouldUpdate) {
14387 // We assume that prepareToHydrateHostTextInstance is called in a context where the
14388 // hydration parent is the parent host component of this host text.
14389 var returnFiber = hydrationParentFiber;
14390 if (returnFiber !== null) {
14391 switch (returnFiber.tag) {
14392 case HostRoot:
14393 {
14394 var parentContainer = returnFiber.stateNode.containerInfo;
14395 didNotMatchHydratedContainerTextInstance(parentContainer, textInstance, textContent);
14396 break;
14397 }
14398 case HostComponent:
14399 {
14400 var parentType = returnFiber.type;
14401 var parentProps = returnFiber.memoizedProps;
14402 var parentInstance = returnFiber.stateNode;
14403 didNotMatchHydratedTextInstance(parentType, parentProps, parentInstance, textInstance, textContent);
14404 break;
14405 }
14406 }
14407 }
14408 }
14409 }
14410 return shouldUpdate;
14411}
14412
14413function skipPastDehydratedSuspenseInstance(fiber) {
14414 if (!supportsHydration) {
14415 invariant(false, 'Expected skipPastDehydratedSuspenseInstance() to never be called. This error is likely caused by a bug in React. Please file an issue.');
14416 }
14417 var suspenseInstance = fiber.stateNode;
14418 !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;
14419 nextHydratableInstance = getNextHydratableInstanceAfterSuspenseInstance(suspenseInstance);
14420}
14421
14422function popToNextHostParent(fiber) {
14423 var parent = fiber.return;
14424 while (parent !== null && parent.tag !== HostComponent && parent.tag !== HostRoot && parent.tag !== DehydratedSuspenseComponent) {
14425 parent = parent.return;
14426 }
14427 hydrationParentFiber = parent;
14428}
14429
14430function popHydrationState(fiber) {
14431 if (!supportsHydration) {
14432 return false;
14433 }
14434 if (fiber !== hydrationParentFiber) {
14435 // We're deeper than the current hydration context, inside an inserted
14436 // tree.
14437 return false;
14438 }
14439 if (!isHydrating) {
14440 // If we're not currently hydrating but we're in a hydration context, then
14441 // we were an insertion and now need to pop up reenter hydration of our
14442 // siblings.
14443 popToNextHostParent(fiber);
14444 isHydrating = true;
14445 return false;
14446 }
14447
14448 var type = fiber.type;
14449
14450 // If we have any remaining hydratable nodes, we need to delete them now.
14451 // We only do this deeper than head and body since they tend to have random
14452 // other nodes in them. We also ignore components with pure text content in
14453 // side of them.
14454 // TODO: Better heuristic.
14455 if (fiber.tag !== HostComponent || type !== 'head' && type !== 'body' && !shouldSetTextContent(type, fiber.memoizedProps)) {
14456 var nextInstance = nextHydratableInstance;
14457 while (nextInstance) {
14458 deleteHydratableInstance(fiber, nextInstance);
14459 nextInstance = getNextHydratableSibling(nextInstance);
14460 }
14461 }
14462
14463 popToNextHostParent(fiber);
14464 nextHydratableInstance = hydrationParentFiber ? getNextHydratableSibling(fiber.stateNode) : null;
14465 return true;
14466}
14467
14468function resetHydrationState() {
14469 if (!supportsHydration) {
14470 return;
14471 }
14472
14473 hydrationParentFiber = null;
14474 nextHydratableInstance = null;
14475 isHydrating = false;
14476}
14477
14478var ReactCurrentOwner$3 = ReactSharedInternals.ReactCurrentOwner;
14479
14480var didReceiveUpdate = false;
14481
14482var didWarnAboutBadClass = void 0;
14483var didWarnAboutContextTypeOnFunctionComponent = void 0;
14484var didWarnAboutGetDerivedStateOnFunctionComponent = void 0;
14485var didWarnAboutFunctionRefs = void 0;
14486var didWarnAboutReassigningProps = void 0;
14487
14488{
14489 didWarnAboutBadClass = {};
14490 didWarnAboutContextTypeOnFunctionComponent = {};
14491 didWarnAboutGetDerivedStateOnFunctionComponent = {};
14492 didWarnAboutFunctionRefs = {};
14493 didWarnAboutReassigningProps = false;
14494}
14495
14496function reconcileChildren(current$$1, workInProgress, nextChildren, renderExpirationTime) {
14497 if (current$$1 === null) {
14498 // If this is a fresh new component that hasn't been rendered yet, we
14499 // won't update its child set by applying minimal side-effects. Instead,
14500 // we will add them all to the child before it gets rendered. That means
14501 // we can optimize this reconciliation pass by not tracking side-effects.
14502 workInProgress.child = mountChildFibers(workInProgress, null, nextChildren, renderExpirationTime);
14503 } else {
14504 // If the current child is the same as the work in progress, it means that
14505 // we haven't yet started any work on these children. Therefore, we use
14506 // the clone algorithm to create a copy of all the current children.
14507
14508 // If we had any progressed work already, that is invalid at this point so
14509 // let's throw it out.
14510 workInProgress.child = reconcileChildFibers(workInProgress, current$$1.child, nextChildren, renderExpirationTime);
14511 }
14512}
14513
14514function forceUnmountCurrentAndReconcile(current$$1, workInProgress, nextChildren, renderExpirationTime) {
14515 // This function is fork of reconcileChildren. It's used in cases where we
14516 // want to reconcile without matching against the existing set. This has the
14517 // effect of all current children being unmounted; even if the type and key
14518 // are the same, the old child is unmounted and a new child is created.
14519 //
14520 // To do this, we're going to go through the reconcile algorithm twice. In
14521 // the first pass, we schedule a deletion for all the current children by
14522 // passing null.
14523 workInProgress.child = reconcileChildFibers(workInProgress, current$$1.child, null, renderExpirationTime);
14524 // In the second pass, we mount the new children. The trick here is that we
14525 // pass null in place of where we usually pass the current child set. This has
14526 // the effect of remounting all children regardless of whether their their
14527 // identity matches.
14528 workInProgress.child = reconcileChildFibers(workInProgress, null, nextChildren, renderExpirationTime);
14529}
14530
14531function updateForwardRef(current$$1, workInProgress, Component, nextProps, renderExpirationTime) {
14532 // TODO: current can be non-null here even if the component
14533 // hasn't yet mounted. This happens after the first render suspends.
14534 // We'll need to figure out if this is fine or can cause issues.
14535
14536 {
14537 if (workInProgress.type !== workInProgress.elementType) {
14538 // Lazy component props can't be validated in createElement
14539 // because they're only guaranteed to be resolved here.
14540 var innerPropTypes = Component.propTypes;
14541 if (innerPropTypes) {
14542 checkPropTypes_1(innerPropTypes, nextProps, // Resolved props
14543 'prop', getComponentName(Component), getCurrentFiberStackInDev);
14544 }
14545 }
14546 }
14547
14548 var render = Component.render;
14549 var ref = workInProgress.ref;
14550
14551 // The rest is a fork of updateFunctionComponent
14552 var nextChildren = void 0;
14553 prepareToReadContext(workInProgress, renderExpirationTime);
14554 {
14555 ReactCurrentOwner$3.current = workInProgress;
14556 setCurrentPhase('render');
14557 nextChildren = renderWithHooks(current$$1, workInProgress, render, nextProps, ref, renderExpirationTime);
14558 if (debugRenderPhaseSideEffects || debugRenderPhaseSideEffectsForStrictMode && workInProgress.mode & StrictMode) {
14559 // Only double-render components with Hooks
14560 if (workInProgress.memoizedState !== null) {
14561 nextChildren = renderWithHooks(current$$1, workInProgress, render, nextProps, ref, renderExpirationTime);
14562 }
14563 }
14564 setCurrentPhase(null);
14565 }
14566
14567 if (current$$1 !== null && !didReceiveUpdate) {
14568 bailoutHooks(current$$1, workInProgress, renderExpirationTime);
14569 return bailoutOnAlreadyFinishedWork(current$$1, workInProgress, renderExpirationTime);
14570 }
14571
14572 // React DevTools reads this flag.
14573 workInProgress.effectTag |= PerformedWork;
14574 reconcileChildren(current$$1, workInProgress, nextChildren, renderExpirationTime);
14575 return workInProgress.child;
14576}
14577
14578function updateMemoComponent(current$$1, workInProgress, Component, nextProps, updateExpirationTime, renderExpirationTime) {
14579 if (current$$1 === null) {
14580 var type = Component.type;
14581 if (isSimpleFunctionComponent(type) && Component.compare === null &&
14582 // SimpleMemoComponent codepath doesn't resolve outer props either.
14583 Component.defaultProps === undefined) {
14584 // If this is a plain function component without default props,
14585 // and with only the default shallow comparison, we upgrade it
14586 // to a SimpleMemoComponent to allow fast path updates.
14587 workInProgress.tag = SimpleMemoComponent;
14588 workInProgress.type = type;
14589 {
14590 validateFunctionComponentInDev(workInProgress, type);
14591 }
14592 return updateSimpleMemoComponent(current$$1, workInProgress, type, nextProps, updateExpirationTime, renderExpirationTime);
14593 }
14594 {
14595 var innerPropTypes = type.propTypes;
14596 if (innerPropTypes) {
14597 // Inner memo component props aren't currently validated in createElement.
14598 // We could move it there, but we'd still need this for lazy code path.
14599 checkPropTypes_1(innerPropTypes, nextProps, // Resolved props
14600 'prop', getComponentName(type), getCurrentFiberStackInDev);
14601 }
14602 }
14603 var child = createFiberFromTypeAndProps(Component.type, null, nextProps, null, workInProgress.mode, renderExpirationTime);
14604 child.ref = workInProgress.ref;
14605 child.return = workInProgress;
14606 workInProgress.child = child;
14607 return child;
14608 }
14609 {
14610 var _type = Component.type;
14611 var _innerPropTypes = _type.propTypes;
14612 if (_innerPropTypes) {
14613 // Inner memo component props aren't currently validated in createElement.
14614 // We could move it there, but we'd still need this for lazy code path.
14615 checkPropTypes_1(_innerPropTypes, nextProps, // Resolved props
14616 'prop', getComponentName(_type), getCurrentFiberStackInDev);
14617 }
14618 }
14619 var currentChild = current$$1.child; // This is always exactly one child
14620 if (updateExpirationTime < renderExpirationTime) {
14621 // This will be the props with resolved defaultProps,
14622 // unlike current.memoizedProps which will be the unresolved ones.
14623 var prevProps = currentChild.memoizedProps;
14624 // Default to shallow comparison
14625 var compare = Component.compare;
14626 compare = compare !== null ? compare : shallowEqual;
14627 if (compare(prevProps, nextProps) && current$$1.ref === workInProgress.ref) {
14628 return bailoutOnAlreadyFinishedWork(current$$1, workInProgress, renderExpirationTime);
14629 }
14630 }
14631 // React DevTools reads this flag.
14632 workInProgress.effectTag |= PerformedWork;
14633 var newChild = createWorkInProgress(currentChild, nextProps, renderExpirationTime);
14634 newChild.ref = workInProgress.ref;
14635 newChild.return = workInProgress;
14636 workInProgress.child = newChild;
14637 return newChild;
14638}
14639
14640function updateSimpleMemoComponent(current$$1, workInProgress, Component, nextProps, updateExpirationTime, renderExpirationTime) {
14641 // TODO: current can be non-null here even if the component
14642 // hasn't yet mounted. This happens when the inner render suspends.
14643 // We'll need to figure out if this is fine or can cause issues.
14644
14645 {
14646 if (workInProgress.type !== workInProgress.elementType) {
14647 // Lazy component props can't be validated in createElement
14648 // because they're only guaranteed to be resolved here.
14649 var outerMemoType = workInProgress.elementType;
14650 if (outerMemoType.$$typeof === REACT_LAZY_TYPE) {
14651 // We warn when you define propTypes on lazy()
14652 // so let's just skip over it to find memo() outer wrapper.
14653 // Inner props for memo are validated later.
14654 outerMemoType = refineResolvedLazyComponent(outerMemoType);
14655 }
14656 var outerPropTypes = outerMemoType && outerMemoType.propTypes;
14657 if (outerPropTypes) {
14658 checkPropTypes_1(outerPropTypes, nextProps, // Resolved (SimpleMemoComponent has no defaultProps)
14659 'prop', getComponentName(outerMemoType), getCurrentFiberStackInDev);
14660 }
14661 // Inner propTypes will be validated in the function component path.
14662 }
14663 }
14664 if (current$$1 !== null) {
14665 var prevProps = current$$1.memoizedProps;
14666 if (shallowEqual(prevProps, nextProps) && current$$1.ref === workInProgress.ref) {
14667 didReceiveUpdate = false;
14668 if (updateExpirationTime < renderExpirationTime) {
14669 return bailoutOnAlreadyFinishedWork(current$$1, workInProgress, renderExpirationTime);
14670 }
14671 }
14672 }
14673 return updateFunctionComponent(current$$1, workInProgress, Component, nextProps, renderExpirationTime);
14674}
14675
14676function updateFragment(current$$1, workInProgress, renderExpirationTime) {
14677 var nextChildren = workInProgress.pendingProps;
14678 reconcileChildren(current$$1, workInProgress, nextChildren, renderExpirationTime);
14679 return workInProgress.child;
14680}
14681
14682function updateMode(current$$1, workInProgress, renderExpirationTime) {
14683 var nextChildren = workInProgress.pendingProps.children;
14684 reconcileChildren(current$$1, workInProgress, nextChildren, renderExpirationTime);
14685 return workInProgress.child;
14686}
14687
14688function updateProfiler(current$$1, workInProgress, renderExpirationTime) {
14689 if (enableProfilerTimer) {
14690 workInProgress.effectTag |= Update;
14691 }
14692 var nextProps = workInProgress.pendingProps;
14693 var nextChildren = nextProps.children;
14694 reconcileChildren(current$$1, workInProgress, nextChildren, renderExpirationTime);
14695 return workInProgress.child;
14696}
14697
14698function markRef(current$$1, workInProgress) {
14699 var ref = workInProgress.ref;
14700 if (current$$1 === null && ref !== null || current$$1 !== null && current$$1.ref !== ref) {
14701 // Schedule a Ref effect
14702 workInProgress.effectTag |= Ref;
14703 }
14704}
14705
14706function updateFunctionComponent(current$$1, workInProgress, Component, nextProps, renderExpirationTime) {
14707 {
14708 if (workInProgress.type !== workInProgress.elementType) {
14709 // Lazy component props can't be validated in createElement
14710 // because they're only guaranteed to be resolved here.
14711 var innerPropTypes = Component.propTypes;
14712 if (innerPropTypes) {
14713 checkPropTypes_1(innerPropTypes, nextProps, // Resolved props
14714 'prop', getComponentName(Component), getCurrentFiberStackInDev);
14715 }
14716 }
14717 }
14718
14719 var unmaskedContext = getUnmaskedContext(workInProgress, Component, true);
14720 var context = getMaskedContext(workInProgress, unmaskedContext);
14721
14722 var nextChildren = void 0;
14723 prepareToReadContext(workInProgress, renderExpirationTime);
14724 {
14725 ReactCurrentOwner$3.current = workInProgress;
14726 setCurrentPhase('render');
14727 nextChildren = renderWithHooks(current$$1, workInProgress, Component, nextProps, context, renderExpirationTime);
14728 if (debugRenderPhaseSideEffects || debugRenderPhaseSideEffectsForStrictMode && workInProgress.mode & StrictMode) {
14729 // Only double-render components with Hooks
14730 if (workInProgress.memoizedState !== null) {
14731 nextChildren = renderWithHooks(current$$1, workInProgress, Component, nextProps, context, renderExpirationTime);
14732 }
14733 }
14734 setCurrentPhase(null);
14735 }
14736
14737 if (current$$1 !== null && !didReceiveUpdate) {
14738 bailoutHooks(current$$1, workInProgress, renderExpirationTime);
14739 return bailoutOnAlreadyFinishedWork(current$$1, workInProgress, renderExpirationTime);
14740 }
14741
14742 // React DevTools reads this flag.
14743 workInProgress.effectTag |= PerformedWork;
14744 reconcileChildren(current$$1, workInProgress, nextChildren, renderExpirationTime);
14745 return workInProgress.child;
14746}
14747
14748function updateClassComponent(current$$1, workInProgress, Component, nextProps, renderExpirationTime) {
14749 {
14750 if (workInProgress.type !== workInProgress.elementType) {
14751 // Lazy component props can't be validated in createElement
14752 // because they're only guaranteed to be resolved here.
14753 var innerPropTypes = Component.propTypes;
14754 if (innerPropTypes) {
14755 checkPropTypes_1(innerPropTypes, nextProps, // Resolved props
14756 'prop', getComponentName(Component), getCurrentFiberStackInDev);
14757 }
14758 }
14759 }
14760
14761 // Push context providers early to prevent context stack mismatches.
14762 // During mounting we don't know the child context yet as the instance doesn't exist.
14763 // We will invalidate the child context in finishClassComponent() right after rendering.
14764 var hasContext = void 0;
14765 if (isContextProvider(Component)) {
14766 hasContext = true;
14767 pushContextProvider(workInProgress);
14768 } else {
14769 hasContext = false;
14770 }
14771 prepareToReadContext(workInProgress, renderExpirationTime);
14772
14773 var instance = workInProgress.stateNode;
14774 var shouldUpdate = void 0;
14775 if (instance === null) {
14776 if (current$$1 !== null) {
14777 // An class component without an instance only mounts if it suspended
14778 // inside a non- concurrent tree, in an inconsistent state. We want to
14779 // tree it like a new mount, even though an empty version of it already
14780 // committed. Disconnect the alternate pointers.
14781 current$$1.alternate = null;
14782 workInProgress.alternate = null;
14783 // Since this is conceptually a new fiber, schedule a Placement effect
14784 workInProgress.effectTag |= Placement;
14785 }
14786 // In the initial pass we might need to construct the instance.
14787 constructClassInstance(workInProgress, Component, nextProps, renderExpirationTime);
14788 mountClassInstance(workInProgress, Component, nextProps, renderExpirationTime);
14789 shouldUpdate = true;
14790 } else if (current$$1 === null) {
14791 // In a resume, we'll already have an instance we can reuse.
14792 shouldUpdate = resumeMountClassInstance(workInProgress, Component, nextProps, renderExpirationTime);
14793 } else {
14794 shouldUpdate = updateClassInstance(current$$1, workInProgress, Component, nextProps, renderExpirationTime);
14795 }
14796 var nextUnitOfWork = finishClassComponent(current$$1, workInProgress, Component, shouldUpdate, hasContext, renderExpirationTime);
14797 {
14798 var inst = workInProgress.stateNode;
14799 if (inst.props !== nextProps) {
14800 !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;
14801 didWarnAboutReassigningProps = true;
14802 }
14803 }
14804 return nextUnitOfWork;
14805}
14806
14807function finishClassComponent(current$$1, workInProgress, Component, shouldUpdate, hasContext, renderExpirationTime) {
14808 // Refs should update even if shouldComponentUpdate returns false
14809 markRef(current$$1, workInProgress);
14810
14811 var didCaptureError = (workInProgress.effectTag & DidCapture) !== NoEffect;
14812
14813 if (!shouldUpdate && !didCaptureError) {
14814 // Context providers should defer to sCU for rendering
14815 if (hasContext) {
14816 invalidateContextProvider(workInProgress, Component, false);
14817 }
14818
14819 return bailoutOnAlreadyFinishedWork(current$$1, workInProgress, renderExpirationTime);
14820 }
14821
14822 var instance = workInProgress.stateNode;
14823
14824 // Rerender
14825 ReactCurrentOwner$3.current = workInProgress;
14826 var nextChildren = void 0;
14827 if (didCaptureError && typeof Component.getDerivedStateFromError !== 'function') {
14828 // If we captured an error, but getDerivedStateFrom catch is not defined,
14829 // unmount all the children. componentDidCatch will schedule an update to
14830 // re-render a fallback. This is temporary until we migrate everyone to
14831 // the new API.
14832 // TODO: Warn in a future release.
14833 nextChildren = null;
14834
14835 if (enableProfilerTimer) {
14836 stopProfilerTimerIfRunning(workInProgress);
14837 }
14838 } else {
14839 {
14840 setCurrentPhase('render');
14841 nextChildren = instance.render();
14842 if (debugRenderPhaseSideEffects || debugRenderPhaseSideEffectsForStrictMode && workInProgress.mode & StrictMode) {
14843 instance.render();
14844 }
14845 setCurrentPhase(null);
14846 }
14847 }
14848
14849 // React DevTools reads this flag.
14850 workInProgress.effectTag |= PerformedWork;
14851 if (current$$1 !== null && didCaptureError) {
14852 // If we're recovering from an error, reconcile without reusing any of
14853 // the existing children. Conceptually, the normal children and the children
14854 // that are shown on error are two different sets, so we shouldn't reuse
14855 // normal children even if their identities match.
14856 forceUnmountCurrentAndReconcile(current$$1, workInProgress, nextChildren, renderExpirationTime);
14857 } else {
14858 reconcileChildren(current$$1, workInProgress, nextChildren, renderExpirationTime);
14859 }
14860
14861 // Memoize state using the values we just used to render.
14862 // TODO: Restructure so we never read values from the instance.
14863 workInProgress.memoizedState = instance.state;
14864
14865 // The context might have changed so we need to recalculate it.
14866 if (hasContext) {
14867 invalidateContextProvider(workInProgress, Component, true);
14868 }
14869
14870 return workInProgress.child;
14871}
14872
14873function pushHostRootContext(workInProgress) {
14874 var root = workInProgress.stateNode;
14875 if (root.pendingContext) {
14876 pushTopLevelContextObject(workInProgress, root.pendingContext, root.pendingContext !== root.context);
14877 } else if (root.context) {
14878 // Should always be set
14879 pushTopLevelContextObject(workInProgress, root.context, false);
14880 }
14881 pushHostContainer(workInProgress, root.containerInfo);
14882}
14883
14884function updateHostRoot(current$$1, workInProgress, renderExpirationTime) {
14885 pushHostRootContext(workInProgress);
14886 var updateQueue = workInProgress.updateQueue;
14887 !(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;
14888 var nextProps = workInProgress.pendingProps;
14889 var prevState = workInProgress.memoizedState;
14890 var prevChildren = prevState !== null ? prevState.element : null;
14891 processUpdateQueue(workInProgress, updateQueue, nextProps, null, renderExpirationTime);
14892 var nextState = workInProgress.memoizedState;
14893 // Caution: React DevTools currently depends on this property
14894 // being called "element".
14895 var nextChildren = nextState.element;
14896 if (nextChildren === prevChildren) {
14897 // If the state is the same as before, that's a bailout because we had
14898 // no work that expires at this time.
14899 resetHydrationState();
14900 return bailoutOnAlreadyFinishedWork(current$$1, workInProgress, renderExpirationTime);
14901 }
14902 var root = workInProgress.stateNode;
14903 if ((current$$1 === null || current$$1.child === null) && root.hydrate && enterHydrationState(workInProgress)) {
14904 // If we don't have any current children this might be the first pass.
14905 // We always try to hydrate. If this isn't a hydration pass there won't
14906 // be any children to hydrate which is effectively the same thing as
14907 // not hydrating.
14908
14909 // This is a bit of a hack. We track the host root as a placement to
14910 // know that we're currently in a mounting state. That way isMounted
14911 // works as expected. We must reset this before committing.
14912 // TODO: Delete this when we delete isMounted and findDOMNode.
14913 workInProgress.effectTag |= Placement;
14914
14915 // Ensure that children mount into this root without tracking
14916 // side-effects. This ensures that we don't store Placement effects on
14917 // nodes that will be hydrated.
14918 workInProgress.child = mountChildFibers(workInProgress, null, nextChildren, renderExpirationTime);
14919 } else {
14920 // Otherwise reset hydration state in case we aborted and resumed another
14921 // root.
14922 reconcileChildren(current$$1, workInProgress, nextChildren, renderExpirationTime);
14923 resetHydrationState();
14924 }
14925 return workInProgress.child;
14926}
14927
14928function updateHostComponent(current$$1, workInProgress, renderExpirationTime) {
14929 pushHostContext(workInProgress);
14930
14931 if (current$$1 === null) {
14932 tryToClaimNextHydratableInstance(workInProgress);
14933 }
14934
14935 var type = workInProgress.type;
14936 var nextProps = workInProgress.pendingProps;
14937 var prevProps = current$$1 !== null ? current$$1.memoizedProps : null;
14938
14939 var nextChildren = nextProps.children;
14940 var isDirectTextChild = shouldSetTextContent(type, nextProps);
14941
14942 if (isDirectTextChild) {
14943 // We special case a direct text child of a host node. This is a common
14944 // case. We won't handle it as a reified child. We will instead handle
14945 // this in the host environment that also have access to this prop. That
14946 // avoids allocating another HostText fiber and traversing it.
14947 nextChildren = null;
14948 } else if (prevProps !== null && shouldSetTextContent(type, prevProps)) {
14949 // If we're switching from a direct text child to a normal child, or to
14950 // empty, we need to schedule the text content to be reset.
14951 workInProgress.effectTag |= ContentReset;
14952 }
14953
14954 markRef(current$$1, workInProgress);
14955
14956 // Check the host config to see if the children are offscreen/hidden.
14957 if (renderExpirationTime !== Never && workInProgress.mode & ConcurrentMode && shouldDeprioritizeSubtree(type, nextProps)) {
14958 // Schedule this fiber to re-render at offscreen priority. Then bailout.
14959 workInProgress.expirationTime = workInProgress.childExpirationTime = Never;
14960 return null;
14961 }
14962
14963 reconcileChildren(current$$1, workInProgress, nextChildren, renderExpirationTime);
14964 return workInProgress.child;
14965}
14966
14967function updateHostText(current$$1, workInProgress) {
14968 if (current$$1 === null) {
14969 tryToClaimNextHydratableInstance(workInProgress);
14970 }
14971 // Nothing to do here. This is terminal. We'll do the completion step
14972 // immediately after.
14973 return null;
14974}
14975
14976function mountLazyComponent(_current, workInProgress, elementType, updateExpirationTime, renderExpirationTime) {
14977 if (_current !== null) {
14978 // An lazy component only mounts if it suspended inside a non-
14979 // concurrent tree, in an inconsistent state. We want to treat it like
14980 // a new mount, even though an empty version of it already committed.
14981 // Disconnect the alternate pointers.
14982 _current.alternate = null;
14983 workInProgress.alternate = null;
14984 // Since this is conceptually a new fiber, schedule a Placement effect
14985 workInProgress.effectTag |= Placement;
14986 }
14987
14988 var props = workInProgress.pendingProps;
14989 // We can't start a User Timing measurement with correct label yet.
14990 // Cancel and resume right after we know the tag.
14991 cancelWorkTimer(workInProgress);
14992 var Component = readLazyComponentType(elementType);
14993 // Store the unwrapped component in the type.
14994 workInProgress.type = Component;
14995 var resolvedTag = workInProgress.tag = resolveLazyComponentTag(Component);
14996 startWorkTimer(workInProgress);
14997 var resolvedProps = resolveDefaultProps(Component, props);
14998 var child = void 0;
14999 switch (resolvedTag) {
15000 case FunctionComponent:
15001 {
15002 {
15003 validateFunctionComponentInDev(workInProgress, Component);
15004 }
15005 child = updateFunctionComponent(null, workInProgress, Component, resolvedProps, renderExpirationTime);
15006 break;
15007 }
15008 case ClassComponent:
15009 {
15010 child = updateClassComponent(null, workInProgress, Component, resolvedProps, renderExpirationTime);
15011 break;
15012 }
15013 case ForwardRef:
15014 {
15015 child = updateForwardRef(null, workInProgress, Component, resolvedProps, renderExpirationTime);
15016 break;
15017 }
15018 case MemoComponent:
15019 {
15020 {
15021 if (workInProgress.type !== workInProgress.elementType) {
15022 var outerPropTypes = Component.propTypes;
15023 if (outerPropTypes) {
15024 checkPropTypes_1(outerPropTypes, resolvedProps, // Resolved for outer only
15025 'prop', getComponentName(Component), getCurrentFiberStackInDev);
15026 }
15027 }
15028 }
15029 child = updateMemoComponent(null, workInProgress, Component, resolveDefaultProps(Component.type, resolvedProps), // The inner type can have defaults too
15030 updateExpirationTime, renderExpirationTime);
15031 break;
15032 }
15033 default:
15034 {
15035 var hint = '';
15036 {
15037 if (Component !== null && typeof Component === 'object' && Component.$$typeof === REACT_LAZY_TYPE) {
15038 hint = ' Did you wrap a component in React.lazy() more than once?';
15039 }
15040 }
15041 // This message intentionally doesn't mention ForwardRef or MemoComponent
15042 // because the fact that it's a separate type of work is an
15043 // implementation detail.
15044 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);
15045 }
15046 }
15047 return child;
15048}
15049
15050function mountIncompleteClassComponent(_current, workInProgress, Component, nextProps, renderExpirationTime) {
15051 if (_current !== null) {
15052 // An incomplete component only mounts if it suspended inside a non-
15053 // concurrent tree, in an inconsistent state. We want to treat it like
15054 // a new mount, even though an empty version of it already committed.
15055 // Disconnect the alternate pointers.
15056 _current.alternate = null;
15057 workInProgress.alternate = null;
15058 // Since this is conceptually a new fiber, schedule a Placement effect
15059 workInProgress.effectTag |= Placement;
15060 }
15061
15062 // Promote the fiber to a class and try rendering again.
15063 workInProgress.tag = ClassComponent;
15064
15065 // The rest of this function is a fork of `updateClassComponent`
15066
15067 // Push context providers early to prevent context stack mismatches.
15068 // During mounting we don't know the child context yet as the instance doesn't exist.
15069 // We will invalidate the child context in finishClassComponent() right after rendering.
15070 var hasContext = void 0;
15071 if (isContextProvider(Component)) {
15072 hasContext = true;
15073 pushContextProvider(workInProgress);
15074 } else {
15075 hasContext = false;
15076 }
15077 prepareToReadContext(workInProgress, renderExpirationTime);
15078
15079 constructClassInstance(workInProgress, Component, nextProps, renderExpirationTime);
15080 mountClassInstance(workInProgress, Component, nextProps, renderExpirationTime);
15081
15082 return finishClassComponent(null, workInProgress, Component, true, hasContext, renderExpirationTime);
15083}
15084
15085function mountIndeterminateComponent(_current, workInProgress, Component, renderExpirationTime) {
15086 if (_current !== null) {
15087 // An indeterminate component only mounts if it suspended inside a non-
15088 // concurrent tree, in an inconsistent state. We want to treat it like
15089 // a new mount, even though an empty version of it already committed.
15090 // Disconnect the alternate pointers.
15091 _current.alternate = null;
15092 workInProgress.alternate = null;
15093 // Since this is conceptually a new fiber, schedule a Placement effect
15094 workInProgress.effectTag |= Placement;
15095 }
15096
15097 var props = workInProgress.pendingProps;
15098 var unmaskedContext = getUnmaskedContext(workInProgress, Component, false);
15099 var context = getMaskedContext(workInProgress, unmaskedContext);
15100
15101 prepareToReadContext(workInProgress, renderExpirationTime);
15102
15103 var value = void 0;
15104
15105 {
15106 if (Component.prototype && typeof Component.prototype.render === 'function') {
15107 var componentName = getComponentName(Component) || 'Unknown';
15108
15109 if (!didWarnAboutBadClass[componentName]) {
15110 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);
15111 didWarnAboutBadClass[componentName] = true;
15112 }
15113 }
15114
15115 if (workInProgress.mode & StrictMode) {
15116 ReactStrictModeWarnings.recordLegacyContextWarning(workInProgress, null);
15117 }
15118
15119 ReactCurrentOwner$3.current = workInProgress;
15120 value = renderWithHooks(null, workInProgress, Component, props, context, renderExpirationTime);
15121 }
15122 // React DevTools reads this flag.
15123 workInProgress.effectTag |= PerformedWork;
15124
15125 if (typeof value === 'object' && value !== null && typeof value.render === 'function' && value.$$typeof === undefined) {
15126 // Proceed under the assumption that this is a class instance
15127 workInProgress.tag = ClassComponent;
15128
15129 // Throw out any hooks that were used.
15130 resetHooks();
15131
15132 // Push context providers early to prevent context stack mismatches.
15133 // During mounting we don't know the child context yet as the instance doesn't exist.
15134 // We will invalidate the child context in finishClassComponent() right after rendering.
15135 var hasContext = false;
15136 if (isContextProvider(Component)) {
15137 hasContext = true;
15138 pushContextProvider(workInProgress);
15139 } else {
15140 hasContext = false;
15141 }
15142
15143 workInProgress.memoizedState = value.state !== null && value.state !== undefined ? value.state : null;
15144
15145 var getDerivedStateFromProps = Component.getDerivedStateFromProps;
15146 if (typeof getDerivedStateFromProps === 'function') {
15147 applyDerivedStateFromProps(workInProgress, Component, getDerivedStateFromProps, props);
15148 }
15149
15150 adoptClassInstance(workInProgress, value);
15151 mountClassInstance(workInProgress, Component, props, renderExpirationTime);
15152 return finishClassComponent(null, workInProgress, Component, true, hasContext, renderExpirationTime);
15153 } else {
15154 // Proceed under the assumption that this is a function component
15155 workInProgress.tag = FunctionComponent;
15156 {
15157 if (debugRenderPhaseSideEffects || debugRenderPhaseSideEffectsForStrictMode && workInProgress.mode & StrictMode) {
15158 // Only double-render components with Hooks
15159 if (workInProgress.memoizedState !== null) {
15160 value = renderWithHooks(null, workInProgress, Component, props, context, renderExpirationTime);
15161 }
15162 }
15163 }
15164 reconcileChildren(null, workInProgress, value, renderExpirationTime);
15165 {
15166 validateFunctionComponentInDev(workInProgress, Component);
15167 }
15168 return workInProgress.child;
15169 }
15170}
15171
15172function validateFunctionComponentInDev(workInProgress, Component) {
15173 if (Component) {
15174 !!Component.childContextTypes ? warningWithoutStack$1(false, '%s(...): childContextTypes cannot be defined on a function component.', Component.displayName || Component.name || 'Component') : void 0;
15175 }
15176 if (workInProgress.ref !== null) {
15177 var info = '';
15178 var ownerName = getCurrentFiberOwnerNameInDevOrNull();
15179 if (ownerName) {
15180 info += '\n\nCheck the render method of `' + ownerName + '`.';
15181 }
15182
15183 var warningKey = ownerName || workInProgress._debugID || '';
15184 var debugSource = workInProgress._debugSource;
15185 if (debugSource) {
15186 warningKey = debugSource.fileName + ':' + debugSource.lineNumber;
15187 }
15188 if (!didWarnAboutFunctionRefs[warningKey]) {
15189 didWarnAboutFunctionRefs[warningKey] = true;
15190 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);
15191 }
15192 }
15193
15194 if (typeof Component.getDerivedStateFromProps === 'function') {
15195 var componentName = getComponentName(Component) || 'Unknown';
15196
15197 if (!didWarnAboutGetDerivedStateOnFunctionComponent[componentName]) {
15198 warningWithoutStack$1(false, '%s: Function components do not support getDerivedStateFromProps.', componentName);
15199 didWarnAboutGetDerivedStateOnFunctionComponent[componentName] = true;
15200 }
15201 }
15202
15203 if (typeof Component.contextType === 'object' && Component.contextType !== null) {
15204 var _componentName = getComponentName(Component) || 'Unknown';
15205
15206 if (!didWarnAboutContextTypeOnFunctionComponent[_componentName]) {
15207 warningWithoutStack$1(false, '%s: Function components do not support contextType.', _componentName);
15208 didWarnAboutContextTypeOnFunctionComponent[_componentName] = true;
15209 }
15210 }
15211}
15212
15213function updateSuspenseComponent(current$$1, workInProgress, renderExpirationTime) {
15214 var mode = workInProgress.mode;
15215 var nextProps = workInProgress.pendingProps;
15216
15217 // We should attempt to render the primary children unless this boundary
15218 // already suspended during this render (`alreadyCaptured` is true).
15219 var nextState = workInProgress.memoizedState;
15220
15221 var nextDidTimeout = void 0;
15222 if ((workInProgress.effectTag & DidCapture) === NoEffect) {
15223 // This is the first attempt.
15224 nextState = null;
15225 nextDidTimeout = false;
15226 } else {
15227 // Something in this boundary's subtree already suspended. Switch to
15228 // rendering the fallback children.
15229 nextState = {
15230 timedOutAt: nextState !== null ? nextState.timedOutAt : NoWork
15231 };
15232 nextDidTimeout = true;
15233 workInProgress.effectTag &= ~DidCapture;
15234 }
15235
15236 // This next part is a bit confusing. If the children timeout, we switch to
15237 // showing the fallback children in place of the "primary" children.
15238 // However, we don't want to delete the primary children because then their
15239 // state will be lost (both the React state and the host state, e.g.
15240 // uncontrolled form inputs). Instead we keep them mounted and hide them.
15241 // Both the fallback children AND the primary children are rendered at the
15242 // same time. Once the primary children are un-suspended, we can delete
15243 // the fallback children — don't need to preserve their state.
15244 //
15245 // The two sets of children are siblings in the host environment, but
15246 // semantically, for purposes of reconciliation, they are two separate sets.
15247 // So we store them using two fragment fibers.
15248 //
15249 // However, we want to avoid allocating extra fibers for every placeholder.
15250 // They're only necessary when the children time out, because that's the
15251 // only time when both sets are mounted.
15252 //
15253 // So, the extra fragment fibers are only used if the children time out.
15254 // Otherwise, we render the primary children directly. This requires some
15255 // custom reconciliation logic to preserve the state of the primary
15256 // children. It's essentially a very basic form of re-parenting.
15257
15258 // `child` points to the child fiber. In the normal case, this is the first
15259 // fiber of the primary children set. In the timed-out case, it's a
15260 // a fragment fiber containing the primary children.
15261 var child = void 0;
15262 // `next` points to the next fiber React should render. In the normal case,
15263 // it's the same as `child`: the first fiber of the primary children set.
15264 // In the timed-out case, it's a fragment fiber containing the *fallback*
15265 // children -- we skip over the primary children entirely.
15266 var next = void 0;
15267 if (current$$1 === null) {
15268 if (enableSuspenseServerRenderer) {
15269 // If we're currently hydrating, try to hydrate this boundary.
15270 // But only if this has a fallback.
15271 if (nextProps.fallback !== undefined) {
15272 tryToClaimNextHydratableInstance(workInProgress);
15273 // This could've changed the tag if this was a dehydrated suspense component.
15274 if (workInProgress.tag === DehydratedSuspenseComponent) {
15275 return updateDehydratedSuspenseComponent(null, workInProgress, renderExpirationTime);
15276 }
15277 }
15278 }
15279
15280 // This is the initial mount. This branch is pretty simple because there's
15281 // no previous state that needs to be preserved.
15282 if (nextDidTimeout) {
15283 // Mount separate fragments for primary and fallback children.
15284 var nextFallbackChildren = nextProps.fallback;
15285 var primaryChildFragment = createFiberFromFragment(null, mode, NoWork, null);
15286
15287 if ((workInProgress.mode & ConcurrentMode) === NoContext) {
15288 // Outside of concurrent mode, we commit the effects from the
15289 var progressedState = workInProgress.memoizedState;
15290 var progressedPrimaryChild = progressedState !== null ? workInProgress.child.child : workInProgress.child;
15291 primaryChildFragment.child = progressedPrimaryChild;
15292 }
15293
15294 var fallbackChildFragment = createFiberFromFragment(nextFallbackChildren, mode, renderExpirationTime, null);
15295 primaryChildFragment.sibling = fallbackChildFragment;
15296 child = primaryChildFragment;
15297 // Skip the primary children, and continue working on the
15298 // fallback children.
15299 next = fallbackChildFragment;
15300 child.return = next.return = workInProgress;
15301 } else {
15302 // Mount the primary children without an intermediate fragment fiber.
15303 var nextPrimaryChildren = nextProps.children;
15304 child = next = mountChildFibers(workInProgress, null, nextPrimaryChildren, renderExpirationTime);
15305 }
15306 } else {
15307 // This is an update. This branch is more complicated because we need to
15308 // ensure the state of the primary children is preserved.
15309 var prevState = current$$1.memoizedState;
15310 var prevDidTimeout = prevState !== null;
15311 if (prevDidTimeout) {
15312 // The current tree already timed out. That means each child set is
15313 var currentPrimaryChildFragment = current$$1.child;
15314 var currentFallbackChildFragment = currentPrimaryChildFragment.sibling;
15315 if (nextDidTimeout) {
15316 // Still timed out. Reuse the current primary children by cloning
15317 // its fragment. We're going to skip over these entirely.
15318 var _nextFallbackChildren = nextProps.fallback;
15319 var _primaryChildFragment = createWorkInProgress(currentPrimaryChildFragment, currentPrimaryChildFragment.pendingProps, NoWork);
15320
15321 if ((workInProgress.mode & ConcurrentMode) === NoContext) {
15322 // Outside of concurrent mode, we commit the effects from the
15323 var _progressedState = workInProgress.memoizedState;
15324 var _progressedPrimaryChild = _progressedState !== null ? workInProgress.child.child : workInProgress.child;
15325 if (_progressedPrimaryChild !== currentPrimaryChildFragment.child) {
15326 _primaryChildFragment.child = _progressedPrimaryChild;
15327 }
15328 }
15329
15330 // Because primaryChildFragment is a new fiber that we're inserting as the
15331 // parent of a new tree, we need to set its treeBaseDuration.
15332 if (enableProfilerTimer && workInProgress.mode & ProfileMode) {
15333 // treeBaseDuration is the sum of all the child tree base durations.
15334 var treeBaseDuration = 0;
15335 var hiddenChild = _primaryChildFragment.child;
15336 while (hiddenChild !== null) {
15337 treeBaseDuration += hiddenChild.treeBaseDuration;
15338 hiddenChild = hiddenChild.sibling;
15339 }
15340 _primaryChildFragment.treeBaseDuration = treeBaseDuration;
15341 }
15342
15343 // Clone the fallback child fragment, too. These we'll continue
15344 // working on.
15345 var _fallbackChildFragment = _primaryChildFragment.sibling = createWorkInProgress(currentFallbackChildFragment, _nextFallbackChildren, currentFallbackChildFragment.expirationTime);
15346 child = _primaryChildFragment;
15347 _primaryChildFragment.childExpirationTime = NoWork;
15348 // Skip the primary children, and continue working on the
15349 // fallback children.
15350 next = _fallbackChildFragment;
15351 child.return = next.return = workInProgress;
15352 } else {
15353 // No longer suspended. Switch back to showing the primary children,
15354 // and remove the intermediate fragment fiber.
15355 var _nextPrimaryChildren = nextProps.children;
15356 var currentPrimaryChild = currentPrimaryChildFragment.child;
15357 var primaryChild = reconcileChildFibers(workInProgress, currentPrimaryChild, _nextPrimaryChildren, renderExpirationTime);
15358
15359 // If this render doesn't suspend, we need to delete the fallback
15360 // children. Wait until the complete phase, after we've confirmed the
15361 // fallback is no longer needed.
15362 // TODO: Would it be better to store the fallback fragment on
15363 // the stateNode?
15364
15365 // Continue rendering the children, like we normally do.
15366 child = next = primaryChild;
15367 }
15368 } else {
15369 // The current tree has not already timed out. That means the primary
15370 // children are not wrapped in a fragment fiber.
15371 var _currentPrimaryChild = current$$1.child;
15372 if (nextDidTimeout) {
15373 // Timed out. Wrap the children in a fragment fiber to keep them
15374 // separate from the fallback children.
15375 var _nextFallbackChildren2 = nextProps.fallback;
15376 var _primaryChildFragment2 = createFiberFromFragment(
15377 // It shouldn't matter what the pending props are because we aren't
15378 // going to render this fragment.
15379 null, mode, NoWork, null);
15380 _primaryChildFragment2.child = _currentPrimaryChild;
15381
15382 // Even though we're creating a new fiber, there are no new children,
15383 // because we're reusing an already mounted tree. So we don't need to
15384 // schedule a placement.
15385 // primaryChildFragment.effectTag |= Placement;
15386
15387 if ((workInProgress.mode & ConcurrentMode) === NoContext) {
15388 // Outside of concurrent mode, we commit the effects from the
15389 var _progressedState2 = workInProgress.memoizedState;
15390 var _progressedPrimaryChild2 = _progressedState2 !== null ? workInProgress.child.child : workInProgress.child;
15391 _primaryChildFragment2.child = _progressedPrimaryChild2;
15392 }
15393
15394 // Because primaryChildFragment is a new fiber that we're inserting as the
15395 // parent of a new tree, we need to set its treeBaseDuration.
15396 if (enableProfilerTimer && workInProgress.mode & ProfileMode) {
15397 // treeBaseDuration is the sum of all the child tree base durations.
15398 var _treeBaseDuration = 0;
15399 var _hiddenChild = _primaryChildFragment2.child;
15400 while (_hiddenChild !== null) {
15401 _treeBaseDuration += _hiddenChild.treeBaseDuration;
15402 _hiddenChild = _hiddenChild.sibling;
15403 }
15404 _primaryChildFragment2.treeBaseDuration = _treeBaseDuration;
15405 }
15406
15407 // Create a fragment from the fallback children, too.
15408 var _fallbackChildFragment2 = _primaryChildFragment2.sibling = createFiberFromFragment(_nextFallbackChildren2, mode, renderExpirationTime, null);
15409 _fallbackChildFragment2.effectTag |= Placement;
15410 child = _primaryChildFragment2;
15411 _primaryChildFragment2.childExpirationTime = NoWork;
15412 // Skip the primary children, and continue working on the
15413 // fallback children.
15414 next = _fallbackChildFragment2;
15415 child.return = next.return = workInProgress;
15416 } else {
15417 // Still haven't timed out. Continue rendering the children, like we
15418 // normally do.
15419 var _nextPrimaryChildren2 = nextProps.children;
15420 next = child = reconcileChildFibers(workInProgress, _currentPrimaryChild, _nextPrimaryChildren2, renderExpirationTime);
15421 }
15422 }
15423 workInProgress.stateNode = current$$1.stateNode;
15424 }
15425
15426 workInProgress.memoizedState = nextState;
15427 workInProgress.child = child;
15428 return next;
15429}
15430
15431function updateDehydratedSuspenseComponent(current$$1, workInProgress, renderExpirationTime) {
15432 if (current$$1 === null) {
15433 // During the first pass, we'll bail out and not drill into the children.
15434 // Instead, we'll leave the content in place and try to hydrate it later.
15435 workInProgress.expirationTime = Never;
15436 return null;
15437 }
15438 // We use childExpirationTime to indicate that a child might depend on context, so if
15439 // any context has changed, we need to treat is as if the input might have changed.
15440 var hasContextChanged$$1 = current$$1.childExpirationTime >= renderExpirationTime;
15441 if (didReceiveUpdate || hasContextChanged$$1) {
15442 // This boundary has changed since the first render. This means that we are now unable to
15443 // hydrate it. We might still be able to hydrate it using an earlier expiration time but
15444 // during this render we can't. Instead, we're going to delete the whole subtree and
15445 // instead inject a new real Suspense boundary to take its place, which may render content
15446 // or fallback. The real Suspense boundary will suspend for a while so we have some time
15447 // to ensure it can produce real content, but all state and pending events will be lost.
15448
15449 // Detach from the current dehydrated boundary.
15450 current$$1.alternate = null;
15451 workInProgress.alternate = null;
15452
15453 // Insert a deletion in the effect list.
15454 var returnFiber = workInProgress.return;
15455 !(returnFiber !== null) ? invariant(false, 'Suspense boundaries are never on the root. This is probably a bug in React.') : void 0;
15456 var last = returnFiber.lastEffect;
15457 if (last !== null) {
15458 last.nextEffect = current$$1;
15459 returnFiber.lastEffect = current$$1;
15460 } else {
15461 returnFiber.firstEffect = returnFiber.lastEffect = current$$1;
15462 }
15463 current$$1.nextEffect = null;
15464 current$$1.effectTag = Deletion;
15465
15466 // Upgrade this work in progress to a real Suspense component.
15467 workInProgress.tag = SuspenseComponent;
15468 workInProgress.stateNode = null;
15469 workInProgress.memoizedState = null;
15470 // This is now an insertion.
15471 workInProgress.effectTag |= Placement;
15472 // Retry as a real Suspense component.
15473 return updateSuspenseComponent(null, workInProgress, renderExpirationTime);
15474 }
15475 if ((workInProgress.effectTag & DidCapture) === NoEffect) {
15476 // This is the first attempt.
15477 reenterHydrationStateFromDehydratedSuspenseInstance(workInProgress);
15478 var nextProps = workInProgress.pendingProps;
15479 var nextChildren = nextProps.children;
15480 workInProgress.child = mountChildFibers(workInProgress, null, nextChildren, renderExpirationTime);
15481 return workInProgress.child;
15482 } else {
15483 // Something suspended. Leave the existing children in place.
15484 // TODO: In non-concurrent mode, should we commit the nodes we have hydrated so far?
15485 workInProgress.child = null;
15486 return null;
15487 }
15488}
15489
15490function updatePortalComponent(current$$1, workInProgress, renderExpirationTime) {
15491 pushHostContainer(workInProgress, workInProgress.stateNode.containerInfo);
15492 var nextChildren = workInProgress.pendingProps;
15493 if (current$$1 === null) {
15494 // Portals are special because we don't append the children during mount
15495 // but at commit. Therefore we need to track insertions which the normal
15496 // flow doesn't do during mount. This doesn't happen at the root because
15497 // the root always starts with a "current" with a null child.
15498 // TODO: Consider unifying this with how the root works.
15499 workInProgress.child = reconcileChildFibers(workInProgress, null, nextChildren, renderExpirationTime);
15500 } else {
15501 reconcileChildren(current$$1, workInProgress, nextChildren, renderExpirationTime);
15502 }
15503 return workInProgress.child;
15504}
15505
15506function updateContextProvider(current$$1, workInProgress, renderExpirationTime) {
15507 var providerType = workInProgress.type;
15508 var context = providerType._context;
15509
15510 var newProps = workInProgress.pendingProps;
15511 var oldProps = workInProgress.memoizedProps;
15512
15513 var newValue = newProps.value;
15514
15515 {
15516 var providerPropTypes = workInProgress.type.propTypes;
15517
15518 if (providerPropTypes) {
15519 checkPropTypes_1(providerPropTypes, newProps, 'prop', 'Context.Provider', getCurrentFiberStackInDev);
15520 }
15521 }
15522
15523 pushProvider(workInProgress, newValue);
15524
15525 if (oldProps !== null) {
15526 var oldValue = oldProps.value;
15527 var changedBits = calculateChangedBits(context, newValue, oldValue);
15528 if (changedBits === 0) {
15529 // No change. Bailout early if children are the same.
15530 if (oldProps.children === newProps.children && !hasContextChanged()) {
15531 return bailoutOnAlreadyFinishedWork(current$$1, workInProgress, renderExpirationTime);
15532 }
15533 } else {
15534 // The context value changed. Search for matching consumers and schedule
15535 // them to update.
15536 propagateContextChange(workInProgress, context, changedBits, renderExpirationTime);
15537 }
15538 }
15539
15540 var newChildren = newProps.children;
15541 reconcileChildren(current$$1, workInProgress, newChildren, renderExpirationTime);
15542 return workInProgress.child;
15543}
15544
15545var hasWarnedAboutUsingContextAsConsumer = false;
15546
15547function updateContextConsumer(current$$1, workInProgress, renderExpirationTime) {
15548 var context = workInProgress.type;
15549 // The logic below for Context differs depending on PROD or DEV mode. In
15550 // DEV mode, we create a separate object for Context.Consumer that acts
15551 // like a proxy to Context. This proxy object adds unnecessary code in PROD
15552 // so we use the old behaviour (Context.Consumer references Context) to
15553 // reduce size and overhead. The separate object references context via
15554 // a property called "_context", which also gives us the ability to check
15555 // in DEV mode if this property exists or not and warn if it does not.
15556 {
15557 if (context._context === undefined) {
15558 // This may be because it's a Context (rather than a Consumer).
15559 // Or it may be because it's older React where they're the same thing.
15560 // We only want to warn if we're sure it's a new React.
15561 if (context !== context.Consumer) {
15562 if (!hasWarnedAboutUsingContextAsConsumer) {
15563 hasWarnedAboutUsingContextAsConsumer = true;
15564 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?');
15565 }
15566 }
15567 } else {
15568 context = context._context;
15569 }
15570 }
15571 var newProps = workInProgress.pendingProps;
15572 var render = newProps.children;
15573
15574 {
15575 !(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;
15576 }
15577
15578 prepareToReadContext(workInProgress, renderExpirationTime);
15579 var newValue = readContext(context, newProps.unstable_observedBits);
15580 var newChildren = void 0;
15581 {
15582 ReactCurrentOwner$3.current = workInProgress;
15583 setCurrentPhase('render');
15584 newChildren = render(newValue);
15585 setCurrentPhase(null);
15586 }
15587
15588 // React DevTools reads this flag.
15589 workInProgress.effectTag |= PerformedWork;
15590 reconcileChildren(current$$1, workInProgress, newChildren, renderExpirationTime);
15591 return workInProgress.child;
15592}
15593
15594function markWorkInProgressReceivedUpdate() {
15595 didReceiveUpdate = true;
15596}
15597
15598function bailoutOnAlreadyFinishedWork(current$$1, workInProgress, renderExpirationTime) {
15599 cancelWorkTimer(workInProgress);
15600
15601 if (current$$1 !== null) {
15602 // Reuse previous context list
15603 workInProgress.contextDependencies = current$$1.contextDependencies;
15604 }
15605
15606 if (enableProfilerTimer) {
15607 // Don't update "base" render times for bailouts.
15608 stopProfilerTimerIfRunning(workInProgress);
15609 }
15610
15611 // Check if the children have any pending work.
15612 var childExpirationTime = workInProgress.childExpirationTime;
15613 if (childExpirationTime < renderExpirationTime) {
15614 // The children don't have any work either. We can skip them.
15615 // TODO: Once we add back resuming, we should check if the children are
15616 // a work-in-progress set. If so, we need to transfer their effects.
15617 return null;
15618 } else {
15619 // This fiber doesn't have work, but its subtree does. Clone the child
15620 // fibers and continue.
15621 cloneChildFibers(current$$1, workInProgress);
15622 return workInProgress.child;
15623 }
15624}
15625
15626function beginWork(current$$1, workInProgress, renderExpirationTime) {
15627 var updateExpirationTime = workInProgress.expirationTime;
15628
15629 if (current$$1 !== null) {
15630 var oldProps = current$$1.memoizedProps;
15631 var newProps = workInProgress.pendingProps;
15632
15633 if (oldProps !== newProps || hasContextChanged()) {
15634 // If props or context changed, mark the fiber as having performed work.
15635 // This may be unset if the props are determined to be equal later (memo).
15636 didReceiveUpdate = true;
15637 } else if (updateExpirationTime < renderExpirationTime) {
15638 didReceiveUpdate = false;
15639 // This fiber does not have any pending work. Bailout without entering
15640 // the begin phase. There's still some bookkeeping we that needs to be done
15641 // in this optimized path, mostly pushing stuff onto the stack.
15642 switch (workInProgress.tag) {
15643 case HostRoot:
15644 pushHostRootContext(workInProgress);
15645 resetHydrationState();
15646 break;
15647 case HostComponent:
15648 pushHostContext(workInProgress);
15649 break;
15650 case ClassComponent:
15651 {
15652 var Component = workInProgress.type;
15653 if (isContextProvider(Component)) {
15654 pushContextProvider(workInProgress);
15655 }
15656 break;
15657 }
15658 case HostPortal:
15659 pushHostContainer(workInProgress, workInProgress.stateNode.containerInfo);
15660 break;
15661 case ContextProvider:
15662 {
15663 var newValue = workInProgress.memoizedProps.value;
15664 pushProvider(workInProgress, newValue);
15665 break;
15666 }
15667 case Profiler:
15668 if (enableProfilerTimer) {
15669 workInProgress.effectTag |= Update;
15670 }
15671 break;
15672 case SuspenseComponent:
15673 {
15674 var state = workInProgress.memoizedState;
15675 var didTimeout = state !== null;
15676 if (didTimeout) {
15677 // If this boundary is currently timed out, we need to decide
15678 // whether to retry the primary children, or to skip over it and
15679 // go straight to the fallback. Check the priority of the primary
15680 var primaryChildFragment = workInProgress.child;
15681 var primaryChildExpirationTime = primaryChildFragment.childExpirationTime;
15682 if (primaryChildExpirationTime !== NoWork && primaryChildExpirationTime >= renderExpirationTime) {
15683 // The primary children have pending work. Use the normal path
15684 // to attempt to render the primary children again.
15685 return updateSuspenseComponent(current$$1, workInProgress, renderExpirationTime);
15686 } else {
15687 // The primary children do not have pending work with sufficient
15688 // priority. Bailout.
15689 var child = bailoutOnAlreadyFinishedWork(current$$1, workInProgress, renderExpirationTime);
15690 if (child !== null) {
15691 // The fallback children have pending work. Skip over the
15692 // primary children and work on the fallback.
15693 return child.sibling;
15694 } else {
15695 return null;
15696 }
15697 }
15698 }
15699 break;
15700 }
15701 case DehydratedSuspenseComponent:
15702 {
15703 if (enableSuspenseServerRenderer) {
15704 // We know that this component will suspend again because if it has
15705 // been unsuspended it has committed as a regular Suspense component.
15706 // If it needs to be retried, it should have work scheduled on it.
15707 workInProgress.effectTag |= DidCapture;
15708 break;
15709 }
15710 }
15711 }
15712 return bailoutOnAlreadyFinishedWork(current$$1, workInProgress, renderExpirationTime);
15713 }
15714 } else {
15715 didReceiveUpdate = false;
15716 }
15717
15718 // Before entering the begin phase, clear the expiration time.
15719 workInProgress.expirationTime = NoWork;
15720
15721 switch (workInProgress.tag) {
15722 case IndeterminateComponent:
15723 {
15724 var elementType = workInProgress.elementType;
15725 return mountIndeterminateComponent(current$$1, workInProgress, elementType, renderExpirationTime);
15726 }
15727 case LazyComponent:
15728 {
15729 var _elementType = workInProgress.elementType;
15730 return mountLazyComponent(current$$1, workInProgress, _elementType, updateExpirationTime, renderExpirationTime);
15731 }
15732 case FunctionComponent:
15733 {
15734 var _Component = workInProgress.type;
15735 var unresolvedProps = workInProgress.pendingProps;
15736 var resolvedProps = workInProgress.elementType === _Component ? unresolvedProps : resolveDefaultProps(_Component, unresolvedProps);
15737 return updateFunctionComponent(current$$1, workInProgress, _Component, resolvedProps, renderExpirationTime);
15738 }
15739 case ClassComponent:
15740 {
15741 var _Component2 = workInProgress.type;
15742 var _unresolvedProps = workInProgress.pendingProps;
15743 var _resolvedProps = workInProgress.elementType === _Component2 ? _unresolvedProps : resolveDefaultProps(_Component2, _unresolvedProps);
15744 return updateClassComponent(current$$1, workInProgress, _Component2, _resolvedProps, renderExpirationTime);
15745 }
15746 case HostRoot:
15747 return updateHostRoot(current$$1, workInProgress, renderExpirationTime);
15748 case HostComponent:
15749 return updateHostComponent(current$$1, workInProgress, renderExpirationTime);
15750 case HostText:
15751 return updateHostText(current$$1, workInProgress);
15752 case SuspenseComponent:
15753 return updateSuspenseComponent(current$$1, workInProgress, renderExpirationTime);
15754 case HostPortal:
15755 return updatePortalComponent(current$$1, workInProgress, renderExpirationTime);
15756 case ForwardRef:
15757 {
15758 var type = workInProgress.type;
15759 var _unresolvedProps2 = workInProgress.pendingProps;
15760 var _resolvedProps2 = workInProgress.elementType === type ? _unresolvedProps2 : resolveDefaultProps(type, _unresolvedProps2);
15761 return updateForwardRef(current$$1, workInProgress, type, _resolvedProps2, renderExpirationTime);
15762 }
15763 case Fragment:
15764 return updateFragment(current$$1, workInProgress, renderExpirationTime);
15765 case Mode:
15766 return updateMode(current$$1, workInProgress, renderExpirationTime);
15767 case Profiler:
15768 return updateProfiler(current$$1, workInProgress, renderExpirationTime);
15769 case ContextProvider:
15770 return updateContextProvider(current$$1, workInProgress, renderExpirationTime);
15771 case ContextConsumer:
15772 return updateContextConsumer(current$$1, workInProgress, renderExpirationTime);
15773 case MemoComponent:
15774 {
15775 var _type2 = workInProgress.type;
15776 var _unresolvedProps3 = workInProgress.pendingProps;
15777 // Resolve outer props first, then resolve inner props.
15778 var _resolvedProps3 = resolveDefaultProps(_type2, _unresolvedProps3);
15779 {
15780 if (workInProgress.type !== workInProgress.elementType) {
15781 var outerPropTypes = _type2.propTypes;
15782 if (outerPropTypes) {
15783 checkPropTypes_1(outerPropTypes, _resolvedProps3, // Resolved for outer only
15784 'prop', getComponentName(_type2), getCurrentFiberStackInDev);
15785 }
15786 }
15787 }
15788 _resolvedProps3 = resolveDefaultProps(_type2.type, _resolvedProps3);
15789 return updateMemoComponent(current$$1, workInProgress, _type2, _resolvedProps3, updateExpirationTime, renderExpirationTime);
15790 }
15791 case SimpleMemoComponent:
15792 {
15793 return updateSimpleMemoComponent(current$$1, workInProgress, workInProgress.type, workInProgress.pendingProps, updateExpirationTime, renderExpirationTime);
15794 }
15795 case IncompleteClassComponent:
15796 {
15797 var _Component3 = workInProgress.type;
15798 var _unresolvedProps4 = workInProgress.pendingProps;
15799 var _resolvedProps4 = workInProgress.elementType === _Component3 ? _unresolvedProps4 : resolveDefaultProps(_Component3, _unresolvedProps4);
15800 return mountIncompleteClassComponent(current$$1, workInProgress, _Component3, _resolvedProps4, renderExpirationTime);
15801 }
15802 case DehydratedSuspenseComponent:
15803 {
15804 if (enableSuspenseServerRenderer) {
15805 return updateDehydratedSuspenseComponent(current$$1, workInProgress, renderExpirationTime);
15806 }
15807 break;
15808 }
15809 }
15810 invariant(false, 'Unknown unit of work tag. This error is likely caused by a bug in React. Please file an issue.');
15811}
15812
15813var valueCursor = createCursor(null);
15814
15815var rendererSigil = void 0;
15816{
15817 // Use this to detect multiple renderers using the same context
15818 rendererSigil = {};
15819}
15820
15821var currentlyRenderingFiber = null;
15822var lastContextDependency = null;
15823var lastContextWithAllBitsObserved = null;
15824
15825var isDisallowedContextReadInDEV = false;
15826
15827function resetContextDependences() {
15828 // This is called right before React yields execution, to ensure `readContext`
15829 // cannot be called outside the render phase.
15830 currentlyRenderingFiber = null;
15831 lastContextDependency = null;
15832 lastContextWithAllBitsObserved = null;
15833 {
15834 isDisallowedContextReadInDEV = false;
15835 }
15836}
15837
15838function enterDisallowedContextReadInDEV() {
15839 {
15840 isDisallowedContextReadInDEV = true;
15841 }
15842}
15843
15844function exitDisallowedContextReadInDEV() {
15845 {
15846 isDisallowedContextReadInDEV = false;
15847 }
15848}
15849
15850function pushProvider(providerFiber, nextValue) {
15851 var context = providerFiber.type._context;
15852
15853 if (isPrimaryRenderer) {
15854 push(valueCursor, context._currentValue, providerFiber);
15855
15856 context._currentValue = nextValue;
15857 {
15858 !(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;
15859 context._currentRenderer = rendererSigil;
15860 }
15861 } else {
15862 push(valueCursor, context._currentValue2, providerFiber);
15863
15864 context._currentValue2 = nextValue;
15865 {
15866 !(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;
15867 context._currentRenderer2 = rendererSigil;
15868 }
15869 }
15870}
15871
15872function popProvider(providerFiber) {
15873 var currentValue = valueCursor.current;
15874
15875 pop(valueCursor, providerFiber);
15876
15877 var context = providerFiber.type._context;
15878 if (isPrimaryRenderer) {
15879 context._currentValue = currentValue;
15880 } else {
15881 context._currentValue2 = currentValue;
15882 }
15883}
15884
15885function calculateChangedBits(context, newValue, oldValue) {
15886 if (is(oldValue, newValue)) {
15887 // No change
15888 return 0;
15889 } else {
15890 var changedBits = typeof context._calculateChangedBits === 'function' ? context._calculateChangedBits(oldValue, newValue) : maxSigned31BitInt;
15891
15892 {
15893 !((changedBits & maxSigned31BitInt) === changedBits) ? warning$1(false, 'calculateChangedBits: Expected the return value to be a ' + '31-bit integer. Instead received: %s', changedBits) : void 0;
15894 }
15895 return changedBits | 0;
15896 }
15897}
15898
15899function scheduleWorkOnParentPath(parent, renderExpirationTime) {
15900 // Update the child expiration time of all the ancestors, including
15901 // the alternates.
15902 var node = parent;
15903 while (node !== null) {
15904 var alternate = node.alternate;
15905 if (node.childExpirationTime < renderExpirationTime) {
15906 node.childExpirationTime = renderExpirationTime;
15907 if (alternate !== null && alternate.childExpirationTime < renderExpirationTime) {
15908 alternate.childExpirationTime = renderExpirationTime;
15909 }
15910 } else if (alternate !== null && alternate.childExpirationTime < renderExpirationTime) {
15911 alternate.childExpirationTime = renderExpirationTime;
15912 } else {
15913 // Neither alternate was updated, which means the rest of the
15914 // ancestor path already has sufficient priority.
15915 break;
15916 }
15917 node = node.return;
15918 }
15919}
15920
15921function propagateContextChange(workInProgress, context, changedBits, renderExpirationTime) {
15922 var fiber = workInProgress.child;
15923 if (fiber !== null) {
15924 // Set the return pointer of the child to the work-in-progress fiber.
15925 fiber.return = workInProgress;
15926 }
15927 while (fiber !== null) {
15928 var nextFiber = void 0;
15929
15930 // Visit this fiber.
15931 var list = fiber.contextDependencies;
15932 if (list !== null) {
15933 nextFiber = fiber.child;
15934
15935 var dependency = list.first;
15936 while (dependency !== null) {
15937 // Check if the context matches.
15938 if (dependency.context === context && (dependency.observedBits & changedBits) !== 0) {
15939 // Match! Schedule an update on this fiber.
15940
15941 if (fiber.tag === ClassComponent) {
15942 // Schedule a force update on the work-in-progress.
15943 var update = createUpdate(renderExpirationTime);
15944 update.tag = ForceUpdate;
15945 // TODO: Because we don't have a work-in-progress, this will add the
15946 // update to the current fiber, too, which means it will persist even if
15947 // this render is thrown away. Since it's a race condition, not sure it's
15948 // worth fixing.
15949 enqueueUpdate(fiber, update);
15950 }
15951
15952 if (fiber.expirationTime < renderExpirationTime) {
15953 fiber.expirationTime = renderExpirationTime;
15954 }
15955 var alternate = fiber.alternate;
15956 if (alternate !== null && alternate.expirationTime < renderExpirationTime) {
15957 alternate.expirationTime = renderExpirationTime;
15958 }
15959
15960 scheduleWorkOnParentPath(fiber.return, renderExpirationTime);
15961
15962 // Mark the expiration time on the list, too.
15963 if (list.expirationTime < renderExpirationTime) {
15964 list.expirationTime = renderExpirationTime;
15965 }
15966
15967 // Since we already found a match, we can stop traversing the
15968 // dependency list.
15969 break;
15970 }
15971 dependency = dependency.next;
15972 }
15973 } else if (fiber.tag === ContextProvider) {
15974 // Don't scan deeper if this is a matching provider
15975 nextFiber = fiber.type === workInProgress.type ? null : fiber.child;
15976 } else if (enableSuspenseServerRenderer && fiber.tag === DehydratedSuspenseComponent) {
15977 // If a dehydrated suspense component is in this subtree, we don't know
15978 // if it will have any context consumers in it. The best we can do is
15979 // mark it as having updates on its children.
15980 if (fiber.expirationTime < renderExpirationTime) {
15981 fiber.expirationTime = renderExpirationTime;
15982 }
15983 var _alternate = fiber.alternate;
15984 if (_alternate !== null && _alternate.expirationTime < renderExpirationTime) {
15985 _alternate.expirationTime = renderExpirationTime;
15986 }
15987 // This is intentionally passing this fiber as the parent
15988 // because we want to schedule this fiber as having work
15989 // on its children. We'll use the childExpirationTime on
15990 // this fiber to indicate that a context has changed.
15991 scheduleWorkOnParentPath(fiber, renderExpirationTime);
15992 nextFiber = fiber.sibling;
15993 } else {
15994 // Traverse down.
15995 nextFiber = fiber.child;
15996 }
15997
15998 if (nextFiber !== null) {
15999 // Set the return pointer of the child to the work-in-progress fiber.
16000 nextFiber.return = fiber;
16001 } else {
16002 // No child. Traverse to next sibling.
16003 nextFiber = fiber;
16004 while (nextFiber !== null) {
16005 if (nextFiber === workInProgress) {
16006 // We're back to the root of this subtree. Exit.
16007 nextFiber = null;
16008 break;
16009 }
16010 var sibling = nextFiber.sibling;
16011 if (sibling !== null) {
16012 // Set the return pointer of the sibling to the work-in-progress fiber.
16013 sibling.return = nextFiber.return;
16014 nextFiber = sibling;
16015 break;
16016 }
16017 // No more siblings. Traverse up.
16018 nextFiber = nextFiber.return;
16019 }
16020 }
16021 fiber = nextFiber;
16022 }
16023}
16024
16025function prepareToReadContext(workInProgress, renderExpirationTime) {
16026 currentlyRenderingFiber = workInProgress;
16027 lastContextDependency = null;
16028 lastContextWithAllBitsObserved = null;
16029
16030 var currentDependencies = workInProgress.contextDependencies;
16031 if (currentDependencies !== null && currentDependencies.expirationTime >= renderExpirationTime) {
16032 // Context list has a pending update. Mark that this fiber performed work.
16033 markWorkInProgressReceivedUpdate();
16034 }
16035
16036 // Reset the work-in-progress list
16037 workInProgress.contextDependencies = null;
16038}
16039
16040function readContext(context, observedBits) {
16041 {
16042 // This warning would fire if you read context inside a Hook like useMemo.
16043 // Unlike the class check below, it's not enforced in production for perf.
16044 !!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;
16045 }
16046
16047 if (lastContextWithAllBitsObserved === context) {
16048 // Nothing to do. We already observe everything in this context.
16049 } else if (observedBits === false || observedBits === 0) {
16050 // Do not observe any updates.
16051 } else {
16052 var resolvedObservedBits = void 0; // Avoid deopting on observable arguments or heterogeneous types.
16053 if (typeof observedBits !== 'number' || observedBits === maxSigned31BitInt) {
16054 // Observe all updates.
16055 lastContextWithAllBitsObserved = context;
16056 resolvedObservedBits = maxSigned31BitInt;
16057 } else {
16058 resolvedObservedBits = observedBits;
16059 }
16060
16061 var contextItem = {
16062 context: context,
16063 observedBits: resolvedObservedBits,
16064 next: null
16065 };
16066
16067 if (lastContextDependency === null) {
16068 !(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;
16069
16070 // This is the first dependency for this component. Create a new list.
16071 lastContextDependency = contextItem;
16072 currentlyRenderingFiber.contextDependencies = {
16073 first: contextItem,
16074 expirationTime: NoWork
16075 };
16076 } else {
16077 // Append a new context item.
16078 lastContextDependency = lastContextDependency.next = contextItem;
16079 }
16080 }
16081 return isPrimaryRenderer ? context._currentValue : context._currentValue2;
16082}
16083
16084// UpdateQueue is a linked list of prioritized updates.
16085//
16086// Like fibers, update queues come in pairs: a current queue, which represents
16087// the visible state of the screen, and a work-in-progress queue, which can be
16088// mutated and processed asynchronously before it is committed — a form of
16089// double buffering. If a work-in-progress render is discarded before finishing,
16090// we create a new work-in-progress by cloning the current queue.
16091//
16092// Both queues share a persistent, singly-linked list structure. To schedule an
16093// update, we append it to the end of both queues. Each queue maintains a
16094// pointer to first update in the persistent list that hasn't been processed.
16095// The work-in-progress pointer always has a position equal to or greater than
16096// the current queue, since we always work on that one. The current queue's
16097// pointer is only updated during the commit phase, when we swap in the
16098// work-in-progress.
16099//
16100// For example:
16101//
16102// Current pointer: A - B - C - D - E - F
16103// Work-in-progress pointer: D - E - F
16104// ^
16105// The work-in-progress queue has
16106// processed more updates than current.
16107//
16108// The reason we append to both queues is because otherwise we might drop
16109// updates without ever processing them. For example, if we only add updates to
16110// the work-in-progress queue, some updates could be lost whenever a work-in
16111// -progress render restarts by cloning from current. Similarly, if we only add
16112// updates to the current queue, the updates will be lost whenever an already
16113// in-progress queue commits and swaps with the current queue. However, by
16114// adding to both queues, we guarantee that the update will be part of the next
16115// work-in-progress. (And because the work-in-progress queue becomes the
16116// current queue once it commits, there's no danger of applying the same
16117// update twice.)
16118//
16119// Prioritization
16120// --------------
16121//
16122// Updates are not sorted by priority, but by insertion; new updates are always
16123// appended to the end of the list.
16124//
16125// The priority is still important, though. When processing the update queue
16126// during the render phase, only the updates with sufficient priority are
16127// included in the result. If we skip an update because it has insufficient
16128// priority, it remains in the queue to be processed later, during a lower
16129// priority render. Crucially, all updates subsequent to a skipped update also
16130// remain in the queue *regardless of their priority*. That means high priority
16131// updates are sometimes processed twice, at two separate priorities. We also
16132// keep track of a base state, that represents the state before the first
16133// update in the queue is applied.
16134//
16135// For example:
16136//
16137// Given a base state of '', and the following queue of updates
16138//
16139// A1 - B2 - C1 - D2
16140//
16141// where the number indicates the priority, and the update is applied to the
16142// previous state by appending a letter, React will process these updates as
16143// two separate renders, one per distinct priority level:
16144//
16145// First render, at priority 1:
16146// Base state: ''
16147// Updates: [A1, C1]
16148// Result state: 'AC'
16149//
16150// Second render, at priority 2:
16151// Base state: 'A' <- The base state does not include C1,
16152// because B2 was skipped.
16153// Updates: [B2, C1, D2] <- C1 was rebased on top of B2
16154// Result state: 'ABCD'
16155//
16156// Because we process updates in insertion order, and rebase high priority
16157// updates when preceding updates are skipped, the final result is deterministic
16158// regardless of priority. Intermediate state may vary according to system
16159// resources, but the final state is always the same.
16160
16161var UpdateState = 0;
16162var ReplaceState = 1;
16163var ForceUpdate = 2;
16164var CaptureUpdate = 3;
16165
16166// Global state that is reset at the beginning of calling `processUpdateQueue`.
16167// It should only be read right after calling `processUpdateQueue`, via
16168// `checkHasForceUpdateAfterProcessing`.
16169var hasForceUpdate = false;
16170
16171var didWarnUpdateInsideUpdate = void 0;
16172var currentlyProcessingQueue = void 0;
16173var resetCurrentlyProcessingQueue = void 0;
16174{
16175 didWarnUpdateInsideUpdate = false;
16176 currentlyProcessingQueue = null;
16177 resetCurrentlyProcessingQueue = function () {
16178 currentlyProcessingQueue = null;
16179 };
16180}
16181
16182function createUpdateQueue(baseState) {
16183 var queue = {
16184 baseState: baseState,
16185 firstUpdate: null,
16186 lastUpdate: null,
16187 firstCapturedUpdate: null,
16188 lastCapturedUpdate: null,
16189 firstEffect: null,
16190 lastEffect: null,
16191 firstCapturedEffect: null,
16192 lastCapturedEffect: null
16193 };
16194 return queue;
16195}
16196
16197function cloneUpdateQueue(currentQueue) {
16198 var queue = {
16199 baseState: currentQueue.baseState,
16200 firstUpdate: currentQueue.firstUpdate,
16201 lastUpdate: currentQueue.lastUpdate,
16202
16203 // TODO: With resuming, if we bail out and resuse the child tree, we should
16204 // keep these effects.
16205 firstCapturedUpdate: null,
16206 lastCapturedUpdate: null,
16207
16208 firstEffect: null,
16209 lastEffect: null,
16210
16211 firstCapturedEffect: null,
16212 lastCapturedEffect: null
16213 };
16214 return queue;
16215}
16216
16217function createUpdate(expirationTime) {
16218 return {
16219 expirationTime: expirationTime,
16220
16221 tag: UpdateState,
16222 payload: null,
16223 callback: null,
16224
16225 next: null,
16226 nextEffect: null
16227 };
16228}
16229
16230function appendUpdateToQueue(queue, update) {
16231 // Append the update to the end of the list.
16232 if (queue.lastUpdate === null) {
16233 // Queue is empty
16234 queue.firstUpdate = queue.lastUpdate = update;
16235 } else {
16236 queue.lastUpdate.next = update;
16237 queue.lastUpdate = update;
16238 }
16239}
16240
16241function enqueueUpdate(fiber, update) {
16242 // Update queues are created lazily.
16243 var alternate = fiber.alternate;
16244 var queue1 = void 0;
16245 var queue2 = void 0;
16246 if (alternate === null) {
16247 // There's only one fiber.
16248 queue1 = fiber.updateQueue;
16249 queue2 = null;
16250 if (queue1 === null) {
16251 queue1 = fiber.updateQueue = createUpdateQueue(fiber.memoizedState);
16252 }
16253 } else {
16254 // There are two owners.
16255 queue1 = fiber.updateQueue;
16256 queue2 = alternate.updateQueue;
16257 if (queue1 === null) {
16258 if (queue2 === null) {
16259 // Neither fiber has an update queue. Create new ones.
16260 queue1 = fiber.updateQueue = createUpdateQueue(fiber.memoizedState);
16261 queue2 = alternate.updateQueue = createUpdateQueue(alternate.memoizedState);
16262 } else {
16263 // Only one fiber has an update queue. Clone to create a new one.
16264 queue1 = fiber.updateQueue = cloneUpdateQueue(queue2);
16265 }
16266 } else {
16267 if (queue2 === null) {
16268 // Only one fiber has an update queue. Clone to create a new one.
16269 queue2 = alternate.updateQueue = cloneUpdateQueue(queue1);
16270 } else {
16271 // Both owners have an update queue.
16272 }
16273 }
16274 }
16275 if (queue2 === null || queue1 === queue2) {
16276 // There's only a single queue.
16277 appendUpdateToQueue(queue1, update);
16278 } else {
16279 // There are two queues. We need to append the update to both queues,
16280 // while accounting for the persistent structure of the list — we don't
16281 // want the same update to be added multiple times.
16282 if (queue1.lastUpdate === null || queue2.lastUpdate === null) {
16283 // One of the queues is not empty. We must add the update to both queues.
16284 appendUpdateToQueue(queue1, update);
16285 appendUpdateToQueue(queue2, update);
16286 } else {
16287 // Both queues are non-empty. The last update is the same in both lists,
16288 // because of structural sharing. So, only append to one of the lists.
16289 appendUpdateToQueue(queue1, update);
16290 // But we still need to update the `lastUpdate` pointer of queue2.
16291 queue2.lastUpdate = update;
16292 }
16293 }
16294
16295 {
16296 if (fiber.tag === ClassComponent && (currentlyProcessingQueue === queue1 || queue2 !== null && currentlyProcessingQueue === queue2) && !didWarnUpdateInsideUpdate) {
16297 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.');
16298 didWarnUpdateInsideUpdate = true;
16299 }
16300 }
16301}
16302
16303function enqueueCapturedUpdate(workInProgress, update) {
16304 // Captured updates go into a separate list, and only on the work-in-
16305 // progress queue.
16306 var workInProgressQueue = workInProgress.updateQueue;
16307 if (workInProgressQueue === null) {
16308 workInProgressQueue = workInProgress.updateQueue = createUpdateQueue(workInProgress.memoizedState);
16309 } else {
16310 // TODO: I put this here rather than createWorkInProgress so that we don't
16311 // clone the queue unnecessarily. There's probably a better way to
16312 // structure this.
16313 workInProgressQueue = ensureWorkInProgressQueueIsAClone(workInProgress, workInProgressQueue);
16314 }
16315
16316 // Append the update to the end of the list.
16317 if (workInProgressQueue.lastCapturedUpdate === null) {
16318 // This is the first render phase update
16319 workInProgressQueue.firstCapturedUpdate = workInProgressQueue.lastCapturedUpdate = update;
16320 } else {
16321 workInProgressQueue.lastCapturedUpdate.next = update;
16322 workInProgressQueue.lastCapturedUpdate = update;
16323 }
16324}
16325
16326function ensureWorkInProgressQueueIsAClone(workInProgress, queue) {
16327 var current = workInProgress.alternate;
16328 if (current !== null) {
16329 // If the work-in-progress queue is equal to the current queue,
16330 // we need to clone it first.
16331 if (queue === current.updateQueue) {
16332 queue = workInProgress.updateQueue = cloneUpdateQueue(queue);
16333 }
16334 }
16335 return queue;
16336}
16337
16338function getStateFromUpdate(workInProgress, queue, update, prevState, nextProps, instance) {
16339 switch (update.tag) {
16340 case ReplaceState:
16341 {
16342 var _payload = update.payload;
16343 if (typeof _payload === 'function') {
16344 // Updater function
16345 {
16346 enterDisallowedContextReadInDEV();
16347 if (debugRenderPhaseSideEffects || debugRenderPhaseSideEffectsForStrictMode && workInProgress.mode & StrictMode) {
16348 _payload.call(instance, prevState, nextProps);
16349 }
16350 }
16351 var nextState = _payload.call(instance, prevState, nextProps);
16352 {
16353 exitDisallowedContextReadInDEV();
16354 }
16355 return nextState;
16356 }
16357 // State object
16358 return _payload;
16359 }
16360 case CaptureUpdate:
16361 {
16362 workInProgress.effectTag = workInProgress.effectTag & ~ShouldCapture | DidCapture;
16363 }
16364 // Intentional fallthrough
16365 case UpdateState:
16366 {
16367 var _payload2 = update.payload;
16368 var partialState = void 0;
16369 if (typeof _payload2 === 'function') {
16370 // Updater function
16371 {
16372 enterDisallowedContextReadInDEV();
16373 if (debugRenderPhaseSideEffects || debugRenderPhaseSideEffectsForStrictMode && workInProgress.mode & StrictMode) {
16374 _payload2.call(instance, prevState, nextProps);
16375 }
16376 }
16377 partialState = _payload2.call(instance, prevState, nextProps);
16378 {
16379 exitDisallowedContextReadInDEV();
16380 }
16381 } else {
16382 // Partial state object
16383 partialState = _payload2;
16384 }
16385 if (partialState === null || partialState === undefined) {
16386 // Null and undefined are treated as no-ops.
16387 return prevState;
16388 }
16389 // Merge the partial state and the previous state.
16390 return _assign({}, prevState, partialState);
16391 }
16392 case ForceUpdate:
16393 {
16394 hasForceUpdate = true;
16395 return prevState;
16396 }
16397 }
16398 return prevState;
16399}
16400
16401function processUpdateQueue(workInProgress, queue, props, instance, renderExpirationTime) {
16402 hasForceUpdate = false;
16403
16404 queue = ensureWorkInProgressQueueIsAClone(workInProgress, queue);
16405
16406 {
16407 currentlyProcessingQueue = queue;
16408 }
16409
16410 // These values may change as we process the queue.
16411 var newBaseState = queue.baseState;
16412 var newFirstUpdate = null;
16413 var newExpirationTime = NoWork;
16414
16415 // Iterate through the list of updates to compute the result.
16416 var update = queue.firstUpdate;
16417 var resultState = newBaseState;
16418 while (update !== null) {
16419 var updateExpirationTime = update.expirationTime;
16420 if (updateExpirationTime < renderExpirationTime) {
16421 // This update does not have sufficient priority. Skip it.
16422 if (newFirstUpdate === null) {
16423 // This is the first skipped update. It will be the first update in
16424 // the new list.
16425 newFirstUpdate = update;
16426 // Since this is the first update that was skipped, the current result
16427 // is the new base state.
16428 newBaseState = resultState;
16429 }
16430 // Since this update will remain in the list, update the remaining
16431 // expiration time.
16432 if (newExpirationTime < updateExpirationTime) {
16433 newExpirationTime = updateExpirationTime;
16434 }
16435 } else {
16436 // This update does have sufficient priority. Process it and compute
16437 // a new result.
16438 resultState = getStateFromUpdate(workInProgress, queue, update, resultState, props, instance);
16439 var _callback = update.callback;
16440 if (_callback !== null) {
16441 workInProgress.effectTag |= Callback;
16442 // Set this to null, in case it was mutated during an aborted render.
16443 update.nextEffect = null;
16444 if (queue.lastEffect === null) {
16445 queue.firstEffect = queue.lastEffect = update;
16446 } else {
16447 queue.lastEffect.nextEffect = update;
16448 queue.lastEffect = update;
16449 }
16450 }
16451 }
16452 // Continue to the next update.
16453 update = update.next;
16454 }
16455
16456 // Separately, iterate though the list of captured updates.
16457 var newFirstCapturedUpdate = null;
16458 update = queue.firstCapturedUpdate;
16459 while (update !== null) {
16460 var _updateExpirationTime = update.expirationTime;
16461 if (_updateExpirationTime < renderExpirationTime) {
16462 // This update does not have sufficient priority. Skip it.
16463 if (newFirstCapturedUpdate === null) {
16464 // This is the first skipped captured update. It will be the first
16465 // update in the new list.
16466 newFirstCapturedUpdate = update;
16467 // If this is the first update that was skipped, the current result is
16468 // the new base state.
16469 if (newFirstUpdate === null) {
16470 newBaseState = resultState;
16471 }
16472 }
16473 // Since this update will remain in the list, update the remaining
16474 // expiration time.
16475 if (newExpirationTime < _updateExpirationTime) {
16476 newExpirationTime = _updateExpirationTime;
16477 }
16478 } else {
16479 // This update does have sufficient priority. Process it and compute
16480 // a new result.
16481 resultState = getStateFromUpdate(workInProgress, queue, update, resultState, props, instance);
16482 var _callback2 = update.callback;
16483 if (_callback2 !== null) {
16484 workInProgress.effectTag |= Callback;
16485 // Set this to null, in case it was mutated during an aborted render.
16486 update.nextEffect = null;
16487 if (queue.lastCapturedEffect === null) {
16488 queue.firstCapturedEffect = queue.lastCapturedEffect = update;
16489 } else {
16490 queue.lastCapturedEffect.nextEffect = update;
16491 queue.lastCapturedEffect = update;
16492 }
16493 }
16494 }
16495 update = update.next;
16496 }
16497
16498 if (newFirstUpdate === null) {
16499 queue.lastUpdate = null;
16500 }
16501 if (newFirstCapturedUpdate === null) {
16502 queue.lastCapturedUpdate = null;
16503 } else {
16504 workInProgress.effectTag |= Callback;
16505 }
16506 if (newFirstUpdate === null && newFirstCapturedUpdate === null) {
16507 // We processed every update, without skipping. That means the new base
16508 // state is the same as the result state.
16509 newBaseState = resultState;
16510 }
16511
16512 queue.baseState = newBaseState;
16513 queue.firstUpdate = newFirstUpdate;
16514 queue.firstCapturedUpdate = newFirstCapturedUpdate;
16515
16516 // Set the remaining expiration time to be whatever is remaining in the queue.
16517 // This should be fine because the only two other things that contribute to
16518 // expiration time are props and context. We're already in the middle of the
16519 // begin phase by the time we start processing the queue, so we've already
16520 // dealt with the props. Context in components that specify
16521 // shouldComponentUpdate is tricky; but we'll have to account for
16522 // that regardless.
16523 workInProgress.expirationTime = newExpirationTime;
16524 workInProgress.memoizedState = resultState;
16525
16526 {
16527 currentlyProcessingQueue = null;
16528 }
16529}
16530
16531function callCallback(callback, context) {
16532 !(typeof callback === 'function') ? invariant(false, 'Invalid argument passed as callback. Expected a function. Instead received: %s', callback) : void 0;
16533 callback.call(context);
16534}
16535
16536function resetHasForceUpdateBeforeProcessing() {
16537 hasForceUpdate = false;
16538}
16539
16540function checkHasForceUpdateAfterProcessing() {
16541 return hasForceUpdate;
16542}
16543
16544function commitUpdateQueue(finishedWork, finishedQueue, instance, renderExpirationTime) {
16545 // If the finished render included captured updates, and there are still
16546 // lower priority updates left over, we need to keep the captured updates
16547 // in the queue so that they are rebased and not dropped once we process the
16548 // queue again at the lower priority.
16549 if (finishedQueue.firstCapturedUpdate !== null) {
16550 // Join the captured update list to the end of the normal list.
16551 if (finishedQueue.lastUpdate !== null) {
16552 finishedQueue.lastUpdate.next = finishedQueue.firstCapturedUpdate;
16553 finishedQueue.lastUpdate = finishedQueue.lastCapturedUpdate;
16554 }
16555 // Clear the list of captured updates.
16556 finishedQueue.firstCapturedUpdate = finishedQueue.lastCapturedUpdate = null;
16557 }
16558
16559 // Commit the effects
16560 commitUpdateEffects(finishedQueue.firstEffect, instance);
16561 finishedQueue.firstEffect = finishedQueue.lastEffect = null;
16562
16563 commitUpdateEffects(finishedQueue.firstCapturedEffect, instance);
16564 finishedQueue.firstCapturedEffect = finishedQueue.lastCapturedEffect = null;
16565}
16566
16567function commitUpdateEffects(effect, instance) {
16568 while (effect !== null) {
16569 var _callback3 = effect.callback;
16570 if (_callback3 !== null) {
16571 effect.callback = null;
16572 callCallback(_callback3, instance);
16573 }
16574 effect = effect.nextEffect;
16575 }
16576}
16577
16578function createCapturedValue(value, source) {
16579 // If the value is an error, call this function immediately after it is thrown
16580 // so the stack is accurate.
16581 return {
16582 value: value,
16583 source: source,
16584 stack: getStackByFiberInDevAndProd(source)
16585 };
16586}
16587
16588function markUpdate(workInProgress) {
16589 // Tag the fiber with an update effect. This turns a Placement into
16590 // a PlacementAndUpdate.
16591 workInProgress.effectTag |= Update;
16592}
16593
16594function markRef$1(workInProgress) {
16595 workInProgress.effectTag |= Ref;
16596}
16597
16598var appendAllChildren = void 0;
16599var updateHostContainer = void 0;
16600var updateHostComponent$1 = void 0;
16601var updateHostText$1 = void 0;
16602if (supportsMutation) {
16603 // Mutation mode
16604
16605 appendAllChildren = function (parent, workInProgress, needsVisibilityToggle, isHidden) {
16606 // We only have the top Fiber that was created but we need recurse down its
16607 // children to find all the terminal nodes.
16608 var node = workInProgress.child;
16609 while (node !== null) {
16610 if (node.tag === HostComponent || node.tag === HostText) {
16611 appendInitialChild(parent, node.stateNode);
16612 } else if (node.tag === HostPortal) {
16613 // If we have a portal child, then we don't want to traverse
16614 // down its children. Instead, we'll get insertions from each child in
16615 // the portal directly.
16616 } else if (node.child !== null) {
16617 node.child.return = node;
16618 node = node.child;
16619 continue;
16620 }
16621 if (node === workInProgress) {
16622 return;
16623 }
16624 while (node.sibling === null) {
16625 if (node.return === null || node.return === workInProgress) {
16626 return;
16627 }
16628 node = node.return;
16629 }
16630 node.sibling.return = node.return;
16631 node = node.sibling;
16632 }
16633 };
16634
16635 updateHostContainer = function (workInProgress) {
16636 // Noop
16637 };
16638 updateHostComponent$1 = function (current, workInProgress, type, newProps, rootContainerInstance) {
16639 // If we have an alternate, that means this is an update and we need to
16640 // schedule a side-effect to do the updates.
16641 var oldProps = current.memoizedProps;
16642 if (oldProps === newProps) {
16643 // In mutation mode, this is sufficient for a bailout because
16644 // we won't touch this node even if children changed.
16645 return;
16646 }
16647
16648 // If we get updated because one of our children updated, we don't
16649 // have newProps so we'll have to reuse them.
16650 // TODO: Split the update API as separate for the props vs. children.
16651 // Even better would be if children weren't special cased at all tho.
16652 var instance = workInProgress.stateNode;
16653 var currentHostContext = getHostContext();
16654 // TODO: Experiencing an error where oldProps is null. Suggests a host
16655 // component is hitting the resume path. Figure out why. Possibly
16656 // related to `hidden`.
16657 var updatePayload = prepareUpdate(instance, type, oldProps, newProps, rootContainerInstance, currentHostContext);
16658 // TODO: Type this specific to this type of component.
16659 workInProgress.updateQueue = updatePayload;
16660 // If the update payload indicates that there is a change or if there
16661 // is a new ref we mark this as an update. All the work is done in commitWork.
16662 if (updatePayload) {
16663 markUpdate(workInProgress);
16664 }
16665 };
16666 updateHostText$1 = function (current, workInProgress, oldText, newText) {
16667 // If the text differs, mark it as an update. All the work in done in commitWork.
16668 if (oldText !== newText) {
16669 markUpdate(workInProgress);
16670 }
16671 };
16672} else if (supportsPersistence) {
16673 // Persistent host tree mode
16674
16675 appendAllChildren = function (parent, workInProgress, needsVisibilityToggle, isHidden) {
16676 // We only have the top Fiber that was created but we need recurse down its
16677 // children to find all the terminal nodes.
16678 var node = workInProgress.child;
16679 while (node !== null) {
16680 // eslint-disable-next-line no-labels
16681 branches: if (node.tag === HostComponent) {
16682 var instance = node.stateNode;
16683 if (needsVisibilityToggle) {
16684 var props = node.memoizedProps;
16685 var type = node.type;
16686 if (isHidden) {
16687 // This child is inside a timed out tree. Hide it.
16688 instance = cloneHiddenInstance(instance, type, props, node);
16689 } else {
16690 // This child was previously inside a timed out tree. If it was not
16691 // updated during this render, it may need to be unhidden. Clone
16692 // again to be sure.
16693 instance = cloneUnhiddenInstance(instance, type, props, node);
16694 }
16695 node.stateNode = instance;
16696 }
16697 appendInitialChild(parent, instance);
16698 } else if (node.tag === HostText) {
16699 var _instance = node.stateNode;
16700 if (needsVisibilityToggle) {
16701 var text = node.memoizedProps;
16702 var rootContainerInstance = getRootHostContainer();
16703 var currentHostContext = getHostContext();
16704 if (isHidden) {
16705 _instance = createHiddenTextInstance(text, rootContainerInstance, currentHostContext, workInProgress);
16706 } else {
16707 _instance = createTextInstance(text, rootContainerInstance, currentHostContext, workInProgress);
16708 }
16709 node.stateNode = _instance;
16710 }
16711 appendInitialChild(parent, _instance);
16712 } else if (node.tag === HostPortal) {
16713 // If we have a portal child, then we don't want to traverse
16714 // down its children. Instead, we'll get insertions from each child in
16715 // the portal directly.
16716 } else if (node.tag === SuspenseComponent) {
16717 var current = node.alternate;
16718 if (current !== null) {
16719 var oldState = current.memoizedState;
16720 var newState = node.memoizedState;
16721 var oldIsHidden = oldState !== null;
16722 var newIsHidden = newState !== null;
16723 if (oldIsHidden !== newIsHidden) {
16724 // The placeholder either just timed out or switched back to the normal
16725 // children after having previously timed out. Toggle the visibility of
16726 // the direct host children.
16727 var primaryChildParent = newIsHidden ? node.child : node;
16728 if (primaryChildParent !== null) {
16729 appendAllChildren(parent, primaryChildParent, true, newIsHidden);
16730 }
16731 // eslint-disable-next-line no-labels
16732 break branches;
16733 }
16734 }
16735 if (node.child !== null) {
16736 // Continue traversing like normal
16737 node.child.return = node;
16738 node = node.child;
16739 continue;
16740 }
16741 } else if (node.child !== null) {
16742 node.child.return = node;
16743 node = node.child;
16744 continue;
16745 }
16746 // $FlowFixMe This is correct but Flow is confused by the labeled break.
16747 node = node;
16748 if (node === workInProgress) {
16749 return;
16750 }
16751 while (node.sibling === null) {
16752 if (node.return === null || node.return === workInProgress) {
16753 return;
16754 }
16755 node = node.return;
16756 }
16757 node.sibling.return = node.return;
16758 node = node.sibling;
16759 }
16760 };
16761
16762 // An unfortunate fork of appendAllChildren because we have two different parent types.
16763 var appendAllChildrenToContainer = function (containerChildSet, workInProgress, needsVisibilityToggle, isHidden) {
16764 // We only have the top Fiber that was created but we need recurse down its
16765 // children to find all the terminal nodes.
16766 var node = workInProgress.child;
16767 while (node !== null) {
16768 // eslint-disable-next-line no-labels
16769 branches: if (node.tag === HostComponent) {
16770 var instance = node.stateNode;
16771 if (needsVisibilityToggle) {
16772 var props = node.memoizedProps;
16773 var type = node.type;
16774 if (isHidden) {
16775 // This child is inside a timed out tree. Hide it.
16776 instance = cloneHiddenInstance(instance, type, props, node);
16777 } else {
16778 // This child was previously inside a timed out tree. If it was not
16779 // updated during this render, it may need to be unhidden. Clone
16780 // again to be sure.
16781 instance = cloneUnhiddenInstance(instance, type, props, node);
16782 }
16783 node.stateNode = instance;
16784 }
16785 appendChildToContainerChildSet(containerChildSet, instance);
16786 } else if (node.tag === HostText) {
16787 var _instance2 = node.stateNode;
16788 if (needsVisibilityToggle) {
16789 var text = node.memoizedProps;
16790 var rootContainerInstance = getRootHostContainer();
16791 var currentHostContext = getHostContext();
16792 if (isHidden) {
16793 _instance2 = createHiddenTextInstance(text, rootContainerInstance, currentHostContext, workInProgress);
16794 } else {
16795 _instance2 = createTextInstance(text, rootContainerInstance, currentHostContext, workInProgress);
16796 }
16797 node.stateNode = _instance2;
16798 }
16799 appendChildToContainerChildSet(containerChildSet, _instance2);
16800 } else if (node.tag === HostPortal) {
16801 // If we have a portal child, then we don't want to traverse
16802 // down its children. Instead, we'll get insertions from each child in
16803 // the portal directly.
16804 } else if (node.tag === SuspenseComponent) {
16805 var current = node.alternate;
16806 if (current !== null) {
16807 var oldState = current.memoizedState;
16808 var newState = node.memoizedState;
16809 var oldIsHidden = oldState !== null;
16810 var newIsHidden = newState !== null;
16811 if (oldIsHidden !== newIsHidden) {
16812 // The placeholder either just timed out or switched back to the normal
16813 // children after having previously timed out. Toggle the visibility of
16814 // the direct host children.
16815 var primaryChildParent = newIsHidden ? node.child : node;
16816 if (primaryChildParent !== null) {
16817 appendAllChildrenToContainer(containerChildSet, primaryChildParent, true, newIsHidden);
16818 }
16819 // eslint-disable-next-line no-labels
16820 break branches;
16821 }
16822 }
16823 if (node.child !== null) {
16824 // Continue traversing like normal
16825 node.child.return = node;
16826 node = node.child;
16827 continue;
16828 }
16829 } else if (node.child !== null) {
16830 node.child.return = node;
16831 node = node.child;
16832 continue;
16833 }
16834 // $FlowFixMe This is correct but Flow is confused by the labeled break.
16835 node = node;
16836 if (node === workInProgress) {
16837 return;
16838 }
16839 while (node.sibling === null) {
16840 if (node.return === null || node.return === workInProgress) {
16841 return;
16842 }
16843 node = node.return;
16844 }
16845 node.sibling.return = node.return;
16846 node = node.sibling;
16847 }
16848 };
16849 updateHostContainer = function (workInProgress) {
16850 var portalOrRoot = workInProgress.stateNode;
16851 var childrenUnchanged = workInProgress.firstEffect === null;
16852 if (childrenUnchanged) {
16853 // No changes, just reuse the existing instance.
16854 } else {
16855 var container = portalOrRoot.containerInfo;
16856 var newChildSet = createContainerChildSet(container);
16857 // If children might have changed, we have to add them all to the set.
16858 appendAllChildrenToContainer(newChildSet, workInProgress, false, false);
16859 portalOrRoot.pendingChildren = newChildSet;
16860 // Schedule an update on the container to swap out the container.
16861 markUpdate(workInProgress);
16862 finalizeContainerChildren(container, newChildSet);
16863 }
16864 };
16865 updateHostComponent$1 = function (current, workInProgress, type, newProps, rootContainerInstance) {
16866 var currentInstance = current.stateNode;
16867 var oldProps = current.memoizedProps;
16868 // If there are no effects associated with this node, then none of our children had any updates.
16869 // This guarantees that we can reuse all of them.
16870 var childrenUnchanged = workInProgress.firstEffect === null;
16871 if (childrenUnchanged && oldProps === newProps) {
16872 // No changes, just reuse the existing instance.
16873 // Note that this might release a previous clone.
16874 workInProgress.stateNode = currentInstance;
16875 return;
16876 }
16877 var recyclableInstance = workInProgress.stateNode;
16878 var currentHostContext = getHostContext();
16879 var updatePayload = null;
16880 if (oldProps !== newProps) {
16881 updatePayload = prepareUpdate(recyclableInstance, type, oldProps, newProps, rootContainerInstance, currentHostContext);
16882 }
16883 if (childrenUnchanged && updatePayload === null) {
16884 // No changes, just reuse the existing instance.
16885 // Note that this might release a previous clone.
16886 workInProgress.stateNode = currentInstance;
16887 return;
16888 }
16889 var newInstance = cloneInstance(currentInstance, updatePayload, type, oldProps, newProps, workInProgress, childrenUnchanged, recyclableInstance);
16890 if (finalizeInitialChildren(newInstance, type, newProps, rootContainerInstance, currentHostContext)) {
16891 markUpdate(workInProgress);
16892 }
16893 workInProgress.stateNode = newInstance;
16894 if (childrenUnchanged) {
16895 // If there are no other effects in this tree, we need to flag this node as having one.
16896 // Even though we're not going to use it for anything.
16897 // Otherwise parents won't know that there are new children to propagate upwards.
16898 markUpdate(workInProgress);
16899 } else {
16900 // If children might have changed, we have to add them all to the set.
16901 appendAllChildren(newInstance, workInProgress, false, false);
16902 }
16903 };
16904 updateHostText$1 = function (current, workInProgress, oldText, newText) {
16905 if (oldText !== newText) {
16906 // If the text content differs, we'll create a new text instance for it.
16907 var rootContainerInstance = getRootHostContainer();
16908 var currentHostContext = getHostContext();
16909 workInProgress.stateNode = createTextInstance(newText, rootContainerInstance, currentHostContext, workInProgress);
16910 // We'll have to mark it as having an effect, even though we won't use the effect for anything.
16911 // This lets the parents know that at least one of their children has changed.
16912 markUpdate(workInProgress);
16913 }
16914 };
16915} else {
16916 // No host operations
16917 updateHostContainer = function (workInProgress) {
16918 // Noop
16919 };
16920 updateHostComponent$1 = function (current, workInProgress, type, newProps, rootContainerInstance) {
16921 // Noop
16922 };
16923 updateHostText$1 = function (current, workInProgress, oldText, newText) {
16924 // Noop
16925 };
16926}
16927
16928function completeWork(current, workInProgress, renderExpirationTime) {
16929 var newProps = workInProgress.pendingProps;
16930
16931 switch (workInProgress.tag) {
16932 case IndeterminateComponent:
16933 break;
16934 case LazyComponent:
16935 break;
16936 case SimpleMemoComponent:
16937 case FunctionComponent:
16938 break;
16939 case ClassComponent:
16940 {
16941 var Component = workInProgress.type;
16942 if (isContextProvider(Component)) {
16943 popContext(workInProgress);
16944 }
16945 break;
16946 }
16947 case HostRoot:
16948 {
16949 popHostContainer(workInProgress);
16950 popTopLevelContextObject(workInProgress);
16951 var fiberRoot = workInProgress.stateNode;
16952 if (fiberRoot.pendingContext) {
16953 fiberRoot.context = fiberRoot.pendingContext;
16954 fiberRoot.pendingContext = null;
16955 }
16956 if (current === null || current.child === null) {
16957 // If we hydrated, pop so that we can delete any remaining children
16958 // that weren't hydrated.
16959 popHydrationState(workInProgress);
16960 // This resets the hacky state to fix isMounted before committing.
16961 // TODO: Delete this when we delete isMounted and findDOMNode.
16962 workInProgress.effectTag &= ~Placement;
16963 }
16964 updateHostContainer(workInProgress);
16965 break;
16966 }
16967 case HostComponent:
16968 {
16969 popHostContext(workInProgress);
16970 var rootContainerInstance = getRootHostContainer();
16971 var type = workInProgress.type;
16972 if (current !== null && workInProgress.stateNode != null) {
16973 updateHostComponent$1(current, workInProgress, type, newProps, rootContainerInstance);
16974
16975 if (current.ref !== workInProgress.ref) {
16976 markRef$1(workInProgress);
16977 }
16978 } else {
16979 if (!newProps) {
16980 !(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;
16981 // This can happen when we abort work.
16982 break;
16983 }
16984
16985 var currentHostContext = getHostContext();
16986 // TODO: Move createInstance to beginWork and keep it on a context
16987 // "stack" as the parent. Then append children as we go in beginWork
16988 // or completeWork depending on we want to add then top->down or
16989 // bottom->up. Top->down is faster in IE11.
16990 var wasHydrated = popHydrationState(workInProgress);
16991 if (wasHydrated) {
16992 // TODO: Move this and createInstance step into the beginPhase
16993 // to consolidate.
16994 if (prepareToHydrateHostInstance(workInProgress, rootContainerInstance, currentHostContext)) {
16995 // If changes to the hydrated node needs to be applied at the
16996 // commit-phase we mark this as such.
16997 markUpdate(workInProgress);
16998 }
16999 } else {
17000 var instance = createInstance(type, newProps, rootContainerInstance, currentHostContext, workInProgress);
17001
17002 appendAllChildren(instance, workInProgress, false, false);
17003
17004 // Certain renderers require commit-time effects for initial mount.
17005 // (eg DOM renderer supports auto-focus for certain elements).
17006 // Make sure such renderers get scheduled for later work.
17007 if (finalizeInitialChildren(instance, type, newProps, rootContainerInstance, currentHostContext)) {
17008 markUpdate(workInProgress);
17009 }
17010 workInProgress.stateNode = instance;
17011 }
17012
17013 if (workInProgress.ref !== null) {
17014 // If there is a ref on a host node we need to schedule a callback
17015 markRef$1(workInProgress);
17016 }
17017 }
17018 break;
17019 }
17020 case HostText:
17021 {
17022 var newText = newProps;
17023 if (current && workInProgress.stateNode != null) {
17024 var oldText = current.memoizedProps;
17025 // If we have an alternate, that means this is an update and we need
17026 // to schedule a side-effect to do the updates.
17027 updateHostText$1(current, workInProgress, oldText, newText);
17028 } else {
17029 if (typeof newText !== 'string') {
17030 !(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;
17031 // This can happen when we abort work.
17032 }
17033 var _rootContainerInstance = getRootHostContainer();
17034 var _currentHostContext = getHostContext();
17035 var _wasHydrated = popHydrationState(workInProgress);
17036 if (_wasHydrated) {
17037 if (prepareToHydrateHostTextInstance(workInProgress)) {
17038 markUpdate(workInProgress);
17039 }
17040 } else {
17041 workInProgress.stateNode = createTextInstance(newText, _rootContainerInstance, _currentHostContext, workInProgress);
17042 }
17043 }
17044 break;
17045 }
17046 case ForwardRef:
17047 break;
17048 case SuspenseComponent:
17049 {
17050 var nextState = workInProgress.memoizedState;
17051 if ((workInProgress.effectTag & DidCapture) !== NoEffect) {
17052 // Something suspended. Re-render with the fallback children.
17053 workInProgress.expirationTime = renderExpirationTime;
17054 // Do not reset the effect list.
17055 return workInProgress;
17056 }
17057
17058 var nextDidTimeout = nextState !== null;
17059 var prevDidTimeout = current !== null && current.memoizedState !== null;
17060
17061 if (current !== null && !nextDidTimeout && prevDidTimeout) {
17062 // We just switched from the fallback to the normal children. Delete
17063 // the fallback.
17064 // TODO: Would it be better to store the fallback fragment on
17065 var currentFallbackChild = current.child.sibling;
17066 if (currentFallbackChild !== null) {
17067 // Deletions go at the beginning of the return fiber's effect list
17068 var first = workInProgress.firstEffect;
17069 if (first !== null) {
17070 workInProgress.firstEffect = currentFallbackChild;
17071 currentFallbackChild.nextEffect = first;
17072 } else {
17073 workInProgress.firstEffect = workInProgress.lastEffect = currentFallbackChild;
17074 currentFallbackChild.nextEffect = null;
17075 }
17076 currentFallbackChild.effectTag = Deletion;
17077 }
17078 }
17079
17080 if (nextDidTimeout || prevDidTimeout) {
17081 // If the children are hidden, or if they were previous hidden, schedule
17082 // an effect to toggle their visibility. This is also used to attach a
17083 // retry listener to the promise.
17084 workInProgress.effectTag |= Update;
17085 }
17086 break;
17087 }
17088 case Fragment:
17089 break;
17090 case Mode:
17091 break;
17092 case Profiler:
17093 break;
17094 case HostPortal:
17095 popHostContainer(workInProgress);
17096 updateHostContainer(workInProgress);
17097 break;
17098 case ContextProvider:
17099 // Pop provider fiber
17100 popProvider(workInProgress);
17101 break;
17102 case ContextConsumer:
17103 break;
17104 case MemoComponent:
17105 break;
17106 case IncompleteClassComponent:
17107 {
17108 // Same as class component case. I put it down here so that the tags are
17109 // sequential to ensure this switch is compiled to a jump table.
17110 var _Component = workInProgress.type;
17111 if (isContextProvider(_Component)) {
17112 popContext(workInProgress);
17113 }
17114 break;
17115 }
17116 case DehydratedSuspenseComponent:
17117 {
17118 if (enableSuspenseServerRenderer) {
17119 if (current === null) {
17120 var _wasHydrated2 = popHydrationState(workInProgress);
17121 !_wasHydrated2 ? invariant(false, 'A dehydrated suspense component was completed without a hydrated node. This is probably a bug in React.') : void 0;
17122 skipPastDehydratedSuspenseInstance(workInProgress);
17123 } else if ((workInProgress.effectTag & DidCapture) === NoEffect) {
17124 // This boundary did not suspend so it's now hydrated.
17125 // To handle any future suspense cases, we're going to now upgrade it
17126 // to a Suspense component. We detach it from the existing current fiber.
17127 current.alternate = null;
17128 workInProgress.alternate = null;
17129 workInProgress.tag = SuspenseComponent;
17130 workInProgress.memoizedState = null;
17131 workInProgress.stateNode = null;
17132 }
17133 }
17134 break;
17135 }
17136 default:
17137 invariant(false, 'Unknown unit of work tag. This error is likely caused by a bug in React. Please file an issue.');
17138 }
17139
17140 return null;
17141}
17142
17143function shouldCaptureSuspense(workInProgress) {
17144 // In order to capture, the Suspense component must have a fallback prop.
17145 if (workInProgress.memoizedProps.fallback === undefined) {
17146 return false;
17147 }
17148 // If it was the primary children that just suspended, capture and render the
17149 // fallback. Otherwise, don't capture and bubble to the next boundary.
17150 var nextState = workInProgress.memoizedState;
17151 return nextState === null;
17152}
17153
17154// This module is forked in different environments.
17155// By default, return `true` to log errors to the console.
17156// Forks can return `false` if this isn't desirable.
17157function showErrorDialog(capturedError) {
17158 return true;
17159}
17160
17161function logCapturedError(capturedError) {
17162 var logError = showErrorDialog(capturedError);
17163
17164 // Allow injected showErrorDialog() to prevent default console.error logging.
17165 // This enables renderers like ReactNative to better manage redbox behavior.
17166 if (logError === false) {
17167 return;
17168 }
17169
17170 var error = capturedError.error;
17171 {
17172 var componentName = capturedError.componentName,
17173 componentStack = capturedError.componentStack,
17174 errorBoundaryName = capturedError.errorBoundaryName,
17175 errorBoundaryFound = capturedError.errorBoundaryFound,
17176 willRetry = capturedError.willRetry;
17177
17178 // Browsers support silencing uncaught errors by calling
17179 // `preventDefault()` in window `error` handler.
17180 // We record this information as an expando on the error.
17181
17182 if (error != null && error._suppressLogging) {
17183 if (errorBoundaryFound && willRetry) {
17184 // The error is recoverable and was silenced.
17185 // Ignore it and don't print the stack addendum.
17186 // This is handy for testing error boundaries without noise.
17187 return;
17188 }
17189 // The error is fatal. Since the silencing might have
17190 // been accidental, we'll surface it anyway.
17191 // However, the browser would have silenced the original error
17192 // so we'll print it first, and then print the stack addendum.
17193 console.error(error);
17194 // For a more detailed description of this block, see:
17195 // https://github.com/facebook/react/pull/13384
17196 }
17197
17198 var componentNameMessage = componentName ? 'The above error occurred in the <' + componentName + '> component:' : 'The above error occurred in one of your React components:';
17199
17200 var errorBoundaryMessage = void 0;
17201 // errorBoundaryFound check is sufficient; errorBoundaryName check is to satisfy Flow.
17202 if (errorBoundaryFound && errorBoundaryName) {
17203 if (willRetry) {
17204 errorBoundaryMessage = 'React will try to recreate this component tree from scratch ' + ('using the error boundary you provided, ' + errorBoundaryName + '.');
17205 } else {
17206 errorBoundaryMessage = 'This error was initially handled by the error boundary ' + errorBoundaryName + '.\n' + 'Recreating the tree from scratch failed so React will unmount the tree.';
17207 }
17208 } else {
17209 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.';
17210 }
17211 var combinedMessage = '' + componentNameMessage + componentStack + '\n\n' + ('' + errorBoundaryMessage);
17212
17213 // In development, we provide our own message with just the component stack.
17214 // We don't include the original error message and JS stack because the browser
17215 // has already printed it. Even if the application swallows the error, it is still
17216 // displayed by the browser thanks to the DEV-only fake event trick in ReactErrorUtils.
17217 console.error(combinedMessage);
17218 }
17219}
17220
17221var didWarnAboutUndefinedSnapshotBeforeUpdate = null;
17222{
17223 didWarnAboutUndefinedSnapshotBeforeUpdate = new Set();
17224}
17225
17226var PossiblyWeakSet$1 = typeof WeakSet === 'function' ? WeakSet : Set;
17227
17228function logError(boundary, errorInfo) {
17229 var source = errorInfo.source;
17230 var stack = errorInfo.stack;
17231 if (stack === null && source !== null) {
17232 stack = getStackByFiberInDevAndProd(source);
17233 }
17234
17235 var capturedError = {
17236 componentName: source !== null ? getComponentName(source.type) : null,
17237 componentStack: stack !== null ? stack : '',
17238 error: errorInfo.value,
17239 errorBoundary: null,
17240 errorBoundaryName: null,
17241 errorBoundaryFound: false,
17242 willRetry: false
17243 };
17244
17245 if (boundary !== null && boundary.tag === ClassComponent) {
17246 capturedError.errorBoundary = boundary.stateNode;
17247 capturedError.errorBoundaryName = getComponentName(boundary.type);
17248 capturedError.errorBoundaryFound = true;
17249 capturedError.willRetry = true;
17250 }
17251
17252 try {
17253 logCapturedError(capturedError);
17254 } catch (e) {
17255 // This method must not throw, or React internal state will get messed up.
17256 // If console.error is overridden, or logCapturedError() shows a dialog that throws,
17257 // we want to report this error outside of the normal stack as a last resort.
17258 // https://github.com/facebook/react/issues/13188
17259 setTimeout(function () {
17260 throw e;
17261 });
17262 }
17263}
17264
17265var callComponentWillUnmountWithTimer = function (current$$1, instance) {
17266 startPhaseTimer(current$$1, 'componentWillUnmount');
17267 instance.props = current$$1.memoizedProps;
17268 instance.state = current$$1.memoizedState;
17269 instance.componentWillUnmount();
17270 stopPhaseTimer();
17271};
17272
17273// Capture errors so they don't interrupt unmounting.
17274function safelyCallComponentWillUnmount(current$$1, instance) {
17275 {
17276 invokeGuardedCallback(null, callComponentWillUnmountWithTimer, null, current$$1, instance);
17277 if (hasCaughtError()) {
17278 var unmountError = clearCaughtError();
17279 captureCommitPhaseError(current$$1, unmountError);
17280 }
17281 }
17282}
17283
17284function safelyDetachRef(current$$1) {
17285 var ref = current$$1.ref;
17286 if (ref !== null) {
17287 if (typeof ref === 'function') {
17288 {
17289 invokeGuardedCallback(null, ref, null, null);
17290 if (hasCaughtError()) {
17291 var refError = clearCaughtError();
17292 captureCommitPhaseError(current$$1, refError);
17293 }
17294 }
17295 } else {
17296 ref.current = null;
17297 }
17298 }
17299}
17300
17301function safelyCallDestroy(current$$1, destroy) {
17302 {
17303 invokeGuardedCallback(null, destroy, null);
17304 if (hasCaughtError()) {
17305 var error = clearCaughtError();
17306 captureCommitPhaseError(current$$1, error);
17307 }
17308 }
17309}
17310
17311function commitBeforeMutationLifeCycles(current$$1, finishedWork) {
17312 switch (finishedWork.tag) {
17313 case FunctionComponent:
17314 case ForwardRef:
17315 case SimpleMemoComponent:
17316 {
17317 commitHookEffectList(UnmountSnapshot, NoEffect$1, finishedWork);
17318 return;
17319 }
17320 case ClassComponent:
17321 {
17322 if (finishedWork.effectTag & Snapshot) {
17323 if (current$$1 !== null) {
17324 var prevProps = current$$1.memoizedProps;
17325 var prevState = current$$1.memoizedState;
17326 startPhaseTimer(finishedWork, 'getSnapshotBeforeUpdate');
17327 var instance = finishedWork.stateNode;
17328 // We could update instance props and state here,
17329 // but instead we rely on them being set during last render.
17330 // TODO: revisit this when we implement resuming.
17331 {
17332 if (finishedWork.type === finishedWork.elementType && !didWarnAboutReassigningProps) {
17333 !(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;
17334 !(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;
17335 }
17336 }
17337 var snapshot = instance.getSnapshotBeforeUpdate(finishedWork.elementType === finishedWork.type ? prevProps : resolveDefaultProps(finishedWork.type, prevProps), prevState);
17338 {
17339 var didWarnSet = didWarnAboutUndefinedSnapshotBeforeUpdate;
17340 if (snapshot === undefined && !didWarnSet.has(finishedWork.type)) {
17341 didWarnSet.add(finishedWork.type);
17342 warningWithoutStack$1(false, '%s.getSnapshotBeforeUpdate(): A snapshot value (or null) ' + 'must be returned. You have returned undefined.', getComponentName(finishedWork.type));
17343 }
17344 }
17345 instance.__reactInternalSnapshotBeforeUpdate = snapshot;
17346 stopPhaseTimer();
17347 }
17348 }
17349 return;
17350 }
17351 case HostRoot:
17352 case HostComponent:
17353 case HostText:
17354 case HostPortal:
17355 case IncompleteClassComponent:
17356 // Nothing to do for these component types
17357 return;
17358 default:
17359 {
17360 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.');
17361 }
17362 }
17363}
17364
17365function commitHookEffectList(unmountTag, mountTag, finishedWork) {
17366 var updateQueue = finishedWork.updateQueue;
17367 var lastEffect = updateQueue !== null ? updateQueue.lastEffect : null;
17368 if (lastEffect !== null) {
17369 var firstEffect = lastEffect.next;
17370 var effect = firstEffect;
17371 do {
17372 if ((effect.tag & unmountTag) !== NoEffect$1) {
17373 // Unmount
17374 var destroy = effect.destroy;
17375 effect.destroy = undefined;
17376 if (destroy !== undefined) {
17377 destroy();
17378 }
17379 }
17380 if ((effect.tag & mountTag) !== NoEffect$1) {
17381 // Mount
17382 var create = effect.create;
17383 effect.destroy = create();
17384
17385 {
17386 var _destroy = effect.destroy;
17387 if (_destroy !== undefined && typeof _destroy !== 'function') {
17388 var addendum = void 0;
17389 if (_destroy === null) {
17390 addendum = ' You returned null. If your effect does not require clean ' + 'up, return undefined (or nothing).';
17391 } else if (typeof _destroy.then === 'function') {
17392 addendum = '\n\nIt looks like you wrote useEffect(async () => ...) or returned a Promise. ' + 'Instead, write the async function inside your effect ' + 'and call it immediately:\n\n' + 'useEffect(() => {\n' + ' async function fetchData() {\n' + ' // You can await here\n' + ' const response = await MyAPI.getData(someId);\n' + ' // ...\n' + ' }\n' + ' fetchData();\n' + '}, [someId]); // Or [] if effect doesn\'t need props or state\n\n' + 'Learn more about data fetching with Hooks: https://fb.me/react-hooks-data-fetching';
17393 } else {
17394 addendum = ' You returned: ' + _destroy;
17395 }
17396 warningWithoutStack$1(false, 'An effect function must not return anything besides a function, ' + 'which is used for clean-up.%s%s', addendum, getStackByFiberInDevAndProd(finishedWork));
17397 }
17398 }
17399 }
17400 effect = effect.next;
17401 } while (effect !== firstEffect);
17402 }
17403}
17404
17405function commitPassiveHookEffects(finishedWork) {
17406 commitHookEffectList(UnmountPassive, NoEffect$1, finishedWork);
17407 commitHookEffectList(NoEffect$1, MountPassive, finishedWork);
17408}
17409
17410function commitLifeCycles(finishedRoot, current$$1, finishedWork, committedExpirationTime) {
17411 switch (finishedWork.tag) {
17412 case FunctionComponent:
17413 case ForwardRef:
17414 case SimpleMemoComponent:
17415 {
17416 commitHookEffectList(UnmountLayout, MountLayout, finishedWork);
17417 break;
17418 }
17419 case ClassComponent:
17420 {
17421 var instance = finishedWork.stateNode;
17422 if (finishedWork.effectTag & Update) {
17423 if (current$$1 === null) {
17424 startPhaseTimer(finishedWork, 'componentDidMount');
17425 // We could update instance props and state here,
17426 // but instead we rely on them being set during last render.
17427 // TODO: revisit this when we implement resuming.
17428 {
17429 if (finishedWork.type === finishedWork.elementType && !didWarnAboutReassigningProps) {
17430 !(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;
17431 !(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;
17432 }
17433 }
17434 instance.componentDidMount();
17435 stopPhaseTimer();
17436 } else {
17437 var prevProps = finishedWork.elementType === finishedWork.type ? current$$1.memoizedProps : resolveDefaultProps(finishedWork.type, current$$1.memoizedProps);
17438 var prevState = current$$1.memoizedState;
17439 startPhaseTimer(finishedWork, 'componentDidUpdate');
17440 // We could update instance props and state here,
17441 // but instead we rely on them being set during last render.
17442 // TODO: revisit this when we implement resuming.
17443 {
17444 if (finishedWork.type === finishedWork.elementType && !didWarnAboutReassigningProps) {
17445 !(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;
17446 !(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;
17447 }
17448 }
17449 instance.componentDidUpdate(prevProps, prevState, instance.__reactInternalSnapshotBeforeUpdate);
17450 stopPhaseTimer();
17451 }
17452 }
17453 var updateQueue = finishedWork.updateQueue;
17454 if (updateQueue !== null) {
17455 {
17456 if (finishedWork.type === finishedWork.elementType && !didWarnAboutReassigningProps) {
17457 !(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;
17458 !(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;
17459 }
17460 }
17461 // We could update instance props and state here,
17462 // but instead we rely on them being set during last render.
17463 // TODO: revisit this when we implement resuming.
17464 commitUpdateQueue(finishedWork, updateQueue, instance, committedExpirationTime);
17465 }
17466 return;
17467 }
17468 case HostRoot:
17469 {
17470 var _updateQueue = finishedWork.updateQueue;
17471 if (_updateQueue !== null) {
17472 var _instance = null;
17473 if (finishedWork.child !== null) {
17474 switch (finishedWork.child.tag) {
17475 case HostComponent:
17476 _instance = getPublicInstance(finishedWork.child.stateNode);
17477 break;
17478 case ClassComponent:
17479 _instance = finishedWork.child.stateNode;
17480 break;
17481 }
17482 }
17483 commitUpdateQueue(finishedWork, _updateQueue, _instance, committedExpirationTime);
17484 }
17485 return;
17486 }
17487 case HostComponent:
17488 {
17489 var _instance2 = finishedWork.stateNode;
17490
17491 // Renderers may schedule work to be done after host components are mounted
17492 // (eg DOM renderer may schedule auto-focus for inputs and form controls).
17493 // These effects should only be committed when components are first mounted,
17494 // aka when there is no current/alternate.
17495 if (current$$1 === null && finishedWork.effectTag & Update) {
17496 var type = finishedWork.type;
17497 var props = finishedWork.memoizedProps;
17498 commitMount(_instance2, type, props, finishedWork);
17499 }
17500
17501 return;
17502 }
17503 case HostText:
17504 {
17505 // We have no life-cycles associated with text.
17506 return;
17507 }
17508 case HostPortal:
17509 {
17510 // We have no life-cycles associated with portals.
17511 return;
17512 }
17513 case Profiler:
17514 {
17515 if (enableProfilerTimer) {
17516 var onRender = finishedWork.memoizedProps.onRender;
17517
17518 if (enableSchedulerTracing) {
17519 onRender(finishedWork.memoizedProps.id, current$$1 === null ? 'mount' : 'update', finishedWork.actualDuration, finishedWork.treeBaseDuration, finishedWork.actualStartTime, getCommitTime(), finishedRoot.memoizedInteractions);
17520 } else {
17521 onRender(finishedWork.memoizedProps.id, current$$1 === null ? 'mount' : 'update', finishedWork.actualDuration, finishedWork.treeBaseDuration, finishedWork.actualStartTime, getCommitTime());
17522 }
17523 }
17524 return;
17525 }
17526 case SuspenseComponent:
17527 break;
17528 case IncompleteClassComponent:
17529 break;
17530 default:
17531 {
17532 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.');
17533 }
17534 }
17535}
17536
17537function hideOrUnhideAllChildren(finishedWork, isHidden) {
17538 if (supportsMutation) {
17539 // We only have the top Fiber that was inserted but we need to recurse down its
17540 var node = finishedWork;
17541 while (true) {
17542 if (node.tag === HostComponent) {
17543 var instance = node.stateNode;
17544 if (isHidden) {
17545 hideInstance(instance);
17546 } else {
17547 unhideInstance(node.stateNode, node.memoizedProps);
17548 }
17549 } else if (node.tag === HostText) {
17550 var _instance3 = node.stateNode;
17551 if (isHidden) {
17552 hideTextInstance(_instance3);
17553 } else {
17554 unhideTextInstance(_instance3, node.memoizedProps);
17555 }
17556 } else if (node.tag === SuspenseComponent && node.memoizedState !== null) {
17557 // Found a nested Suspense component that timed out. Skip over the
17558 var fallbackChildFragment = node.child.sibling;
17559 fallbackChildFragment.return = node;
17560 node = fallbackChildFragment;
17561 continue;
17562 } else if (node.child !== null) {
17563 node.child.return = node;
17564 node = node.child;
17565 continue;
17566 }
17567 if (node === finishedWork) {
17568 return;
17569 }
17570 while (node.sibling === null) {
17571 if (node.return === null || node.return === finishedWork) {
17572 return;
17573 }
17574 node = node.return;
17575 }
17576 node.sibling.return = node.return;
17577 node = node.sibling;
17578 }
17579 }
17580}
17581
17582function commitAttachRef(finishedWork) {
17583 var ref = finishedWork.ref;
17584 if (ref !== null) {
17585 var instance = finishedWork.stateNode;
17586 var instanceToUse = void 0;
17587 switch (finishedWork.tag) {
17588 case HostComponent:
17589 instanceToUse = getPublicInstance(instance);
17590 break;
17591 default:
17592 instanceToUse = instance;
17593 }
17594 if (typeof ref === 'function') {
17595 ref(instanceToUse);
17596 } else {
17597 {
17598 if (!ref.hasOwnProperty('current')) {
17599 warningWithoutStack$1(false, 'Unexpected ref object provided for %s. ' + 'Use either a ref-setter function or React.createRef().%s', getComponentName(finishedWork.type), getStackByFiberInDevAndProd(finishedWork));
17600 }
17601 }
17602
17603 ref.current = instanceToUse;
17604 }
17605 }
17606}
17607
17608function commitDetachRef(current$$1) {
17609 var currentRef = current$$1.ref;
17610 if (currentRef !== null) {
17611 if (typeof currentRef === 'function') {
17612 currentRef(null);
17613 } else {
17614 currentRef.current = null;
17615 }
17616 }
17617}
17618
17619// User-originating errors (lifecycles and refs) should not interrupt
17620// deletion, so don't let them throw. Host-originating errors should
17621// interrupt deletion, so it's okay
17622function commitUnmount(current$$1) {
17623 onCommitUnmount(current$$1);
17624
17625 switch (current$$1.tag) {
17626 case FunctionComponent:
17627 case ForwardRef:
17628 case MemoComponent:
17629 case SimpleMemoComponent:
17630 {
17631 var updateQueue = current$$1.updateQueue;
17632 if (updateQueue !== null) {
17633 var lastEffect = updateQueue.lastEffect;
17634 if (lastEffect !== null) {
17635 var firstEffect = lastEffect.next;
17636 var effect = firstEffect;
17637 do {
17638 var destroy = effect.destroy;
17639 if (destroy !== undefined) {
17640 safelyCallDestroy(current$$1, destroy);
17641 }
17642 effect = effect.next;
17643 } while (effect !== firstEffect);
17644 }
17645 }
17646 break;
17647 }
17648 case ClassComponent:
17649 {
17650 safelyDetachRef(current$$1);
17651 var instance = current$$1.stateNode;
17652 if (typeof instance.componentWillUnmount === 'function') {
17653 safelyCallComponentWillUnmount(current$$1, instance);
17654 }
17655 return;
17656 }
17657 case HostComponent:
17658 {
17659 safelyDetachRef(current$$1);
17660 return;
17661 }
17662 case HostPortal:
17663 {
17664 // TODO: this is recursive.
17665 // We are also not using this parent because
17666 // the portal will get pushed immediately.
17667 if (supportsMutation) {
17668 unmountHostComponents(current$$1);
17669 } else if (supportsPersistence) {
17670 emptyPortalContainer(current$$1);
17671 }
17672 return;
17673 }
17674 }
17675}
17676
17677function commitNestedUnmounts(root) {
17678 // While we're inside a removed host node we don't want to call
17679 // removeChild on the inner nodes because they're removed by the top
17680 // call anyway. We also want to call componentWillUnmount on all
17681 // composites before this host node is removed from the tree. Therefore
17682 var node = root;
17683 while (true) {
17684 commitUnmount(node);
17685 // Visit children because they may contain more composite or host nodes.
17686 // Skip portals because commitUnmount() currently visits them recursively.
17687 if (node.child !== null && (
17688 // If we use mutation we drill down into portals using commitUnmount above.
17689 // If we don't use mutation we drill down into portals here instead.
17690 !supportsMutation || node.tag !== HostPortal)) {
17691 node.child.return = node;
17692 node = node.child;
17693 continue;
17694 }
17695 if (node === root) {
17696 return;
17697 }
17698 while (node.sibling === null) {
17699 if (node.return === null || node.return === root) {
17700 return;
17701 }
17702 node = node.return;
17703 }
17704 node.sibling.return = node.return;
17705 node = node.sibling;
17706 }
17707}
17708
17709function detachFiber(current$$1) {
17710 // Cut off the return pointers to disconnect it from the tree. Ideally, we
17711 // should clear the child pointer of the parent alternate to let this
17712 // get GC:ed but we don't know which for sure which parent is the current
17713 // one so we'll settle for GC:ing the subtree of this child. This child
17714 // itself will be GC:ed when the parent updates the next time.
17715 current$$1.return = null;
17716 current$$1.child = null;
17717 current$$1.memoizedState = null;
17718 current$$1.updateQueue = null;
17719 var alternate = current$$1.alternate;
17720 if (alternate !== null) {
17721 alternate.return = null;
17722 alternate.child = null;
17723 alternate.memoizedState = null;
17724 alternate.updateQueue = null;
17725 }
17726}
17727
17728function emptyPortalContainer(current$$1) {
17729 if (!supportsPersistence) {
17730 return;
17731 }
17732
17733 var portal = current$$1.stateNode;
17734 var containerInfo = portal.containerInfo;
17735
17736 var emptyChildSet = createContainerChildSet(containerInfo);
17737 replaceContainerChildren(containerInfo, emptyChildSet);
17738}
17739
17740function commitContainer(finishedWork) {
17741 if (!supportsPersistence) {
17742 return;
17743 }
17744
17745 switch (finishedWork.tag) {
17746 case ClassComponent:
17747 {
17748 return;
17749 }
17750 case HostComponent:
17751 {
17752 return;
17753 }
17754 case HostText:
17755 {
17756 return;
17757 }
17758 case HostRoot:
17759 case HostPortal:
17760 {
17761 var portalOrRoot = finishedWork.stateNode;
17762 var containerInfo = portalOrRoot.containerInfo,
17763 _pendingChildren = portalOrRoot.pendingChildren;
17764
17765 replaceContainerChildren(containerInfo, _pendingChildren);
17766 return;
17767 }
17768 default:
17769 {
17770 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.');
17771 }
17772 }
17773}
17774
17775function getHostParentFiber(fiber) {
17776 var parent = fiber.return;
17777 while (parent !== null) {
17778 if (isHostParent(parent)) {
17779 return parent;
17780 }
17781 parent = parent.return;
17782 }
17783 invariant(false, 'Expected to find a host parent. This error is likely caused by a bug in React. Please file an issue.');
17784}
17785
17786function isHostParent(fiber) {
17787 return fiber.tag === HostComponent || fiber.tag === HostRoot || fiber.tag === HostPortal;
17788}
17789
17790function getHostSibling(fiber) {
17791 // We're going to search forward into the tree until we find a sibling host
17792 // node. Unfortunately, if multiple insertions are done in a row we have to
17793 // search past them. This leads to exponential search for the next sibling.
17794 var node = fiber;
17795 siblings: while (true) {
17796 // If we didn't find anything, let's try the next sibling.
17797 while (node.sibling === null) {
17798 if (node.return === null || isHostParent(node.return)) {
17799 // If we pop out of the root or hit the parent the fiber we are the
17800 // last sibling.
17801 return null;
17802 }
17803 node = node.return;
17804 }
17805 node.sibling.return = node.return;
17806 node = node.sibling;
17807 while (node.tag !== HostComponent && node.tag !== HostText && node.tag !== DehydratedSuspenseComponent) {
17808 // If it is not host node and, we might have a host node inside it.
17809 // Try to search down until we find one.
17810 if (node.effectTag & Placement) {
17811 // If we don't have a child, try the siblings instead.
17812 continue siblings;
17813 }
17814 // If we don't have a child, try the siblings instead.
17815 // We also skip portals because they are not part of this host tree.
17816 if (node.child === null || node.tag === HostPortal) {
17817 continue siblings;
17818 } else {
17819 node.child.return = node;
17820 node = node.child;
17821 }
17822 }
17823 // Check if this host node is stable or about to be placed.
17824 if (!(node.effectTag & Placement)) {
17825 // Found it!
17826 return node.stateNode;
17827 }
17828 }
17829}
17830
17831function commitPlacement(finishedWork) {
17832 if (!supportsMutation) {
17833 return;
17834 }
17835
17836 // Recursively insert all host nodes into the parent.
17837 var parentFiber = getHostParentFiber(finishedWork);
17838
17839 // Note: these two variables *must* always be updated together.
17840 var parent = void 0;
17841 var isContainer = void 0;
17842
17843 switch (parentFiber.tag) {
17844 case HostComponent:
17845 parent = parentFiber.stateNode;
17846 isContainer = false;
17847 break;
17848 case HostRoot:
17849 parent = parentFiber.stateNode.containerInfo;
17850 isContainer = true;
17851 break;
17852 case HostPortal:
17853 parent = parentFiber.stateNode.containerInfo;
17854 isContainer = true;
17855 break;
17856 default:
17857 invariant(false, 'Invalid host parent fiber. This error is likely caused by a bug in React. Please file an issue.');
17858 }
17859 if (parentFiber.effectTag & ContentReset) {
17860 // Reset the text content of the parent before doing any insertions
17861 resetTextContent(parent);
17862 // Clear ContentReset from the effect tag
17863 parentFiber.effectTag &= ~ContentReset;
17864 }
17865
17866 var before = getHostSibling(finishedWork);
17867 // We only have the top Fiber that was inserted but we need to recurse down its
17868 // children to find all the terminal nodes.
17869 var node = finishedWork;
17870 while (true) {
17871 if (node.tag === HostComponent || node.tag === HostText) {
17872 if (before) {
17873 if (isContainer) {
17874 insertInContainerBefore(parent, node.stateNode, before);
17875 } else {
17876 insertBefore(parent, node.stateNode, before);
17877 }
17878 } else {
17879 if (isContainer) {
17880 appendChildToContainer(parent, node.stateNode);
17881 } else {
17882 appendChild(parent, node.stateNode);
17883 }
17884 }
17885 } else if (node.tag === HostPortal) {
17886 // If the insertion itself is a portal, then we don't want to traverse
17887 // down its children. Instead, we'll get insertions from each child in
17888 // the portal directly.
17889 } else if (node.child !== null) {
17890 node.child.return = node;
17891 node = node.child;
17892 continue;
17893 }
17894 if (node === finishedWork) {
17895 return;
17896 }
17897 while (node.sibling === null) {
17898 if (node.return === null || node.return === finishedWork) {
17899 return;
17900 }
17901 node = node.return;
17902 }
17903 node.sibling.return = node.return;
17904 node = node.sibling;
17905 }
17906}
17907
17908function unmountHostComponents(current$$1) {
17909 // We only have the top Fiber that was deleted but we need to recurse down its
17910 var node = current$$1;
17911
17912 // Each iteration, currentParent is populated with node's host parent if not
17913 // currentParentIsValid.
17914 var currentParentIsValid = false;
17915
17916 // Note: these two variables *must* always be updated together.
17917 var currentParent = void 0;
17918 var currentParentIsContainer = void 0;
17919
17920 while (true) {
17921 if (!currentParentIsValid) {
17922 var parent = node.return;
17923 findParent: while (true) {
17924 !(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;
17925 switch (parent.tag) {
17926 case HostComponent:
17927 currentParent = parent.stateNode;
17928 currentParentIsContainer = false;
17929 break findParent;
17930 case HostRoot:
17931 currentParent = parent.stateNode.containerInfo;
17932 currentParentIsContainer = true;
17933 break findParent;
17934 case HostPortal:
17935 currentParent = parent.stateNode.containerInfo;
17936 currentParentIsContainer = true;
17937 break findParent;
17938 }
17939 parent = parent.return;
17940 }
17941 currentParentIsValid = true;
17942 }
17943
17944 if (node.tag === HostComponent || node.tag === HostText) {
17945 commitNestedUnmounts(node);
17946 // After all the children have unmounted, it is now safe to remove the
17947 // node from the tree.
17948 if (currentParentIsContainer) {
17949 removeChildFromContainer(currentParent, node.stateNode);
17950 } else {
17951 removeChild(currentParent, node.stateNode);
17952 }
17953 // Don't visit children because we already visited them.
17954 } else if (enableSuspenseServerRenderer && node.tag === DehydratedSuspenseComponent) {
17955 // Delete the dehydrated suspense boundary and all of its content.
17956 if (currentParentIsContainer) {
17957 clearSuspenseBoundaryFromContainer(currentParent, node.stateNode);
17958 } else {
17959 clearSuspenseBoundary(currentParent, node.stateNode);
17960 }
17961 } else if (node.tag === HostPortal) {
17962 if (node.child !== null) {
17963 // When we go into a portal, it becomes the parent to remove from.
17964 // We will reassign it back when we pop the portal on the way up.
17965 currentParent = node.stateNode.containerInfo;
17966 currentParentIsContainer = true;
17967 // Visit children because portals might contain host components.
17968 node.child.return = node;
17969 node = node.child;
17970 continue;
17971 }
17972 } else {
17973 commitUnmount(node);
17974 // Visit children because we may find more host components below.
17975 if (node.child !== null) {
17976 node.child.return = node;
17977 node = node.child;
17978 continue;
17979 }
17980 }
17981 if (node === current$$1) {
17982 return;
17983 }
17984 while (node.sibling === null) {
17985 if (node.return === null || node.return === current$$1) {
17986 return;
17987 }
17988 node = node.return;
17989 if (node.tag === HostPortal) {
17990 // When we go out of the portal, we need to restore the parent.
17991 // Since we don't keep a stack of them, we will search for it.
17992 currentParentIsValid = false;
17993 }
17994 }
17995 node.sibling.return = node.return;
17996 node = node.sibling;
17997 }
17998}
17999
18000function commitDeletion(current$$1) {
18001 if (supportsMutation) {
18002 // Recursively delete all host nodes from the parent.
18003 // Detach refs and call componentWillUnmount() on the whole subtree.
18004 unmountHostComponents(current$$1);
18005 } else {
18006 // Detach refs and call componentWillUnmount() on the whole subtree.
18007 commitNestedUnmounts(current$$1);
18008 }
18009 detachFiber(current$$1);
18010}
18011
18012function commitWork(current$$1, finishedWork) {
18013 if (!supportsMutation) {
18014 switch (finishedWork.tag) {
18015 case FunctionComponent:
18016 case ForwardRef:
18017 case MemoComponent:
18018 case SimpleMemoComponent:
18019 {
18020 // Note: We currently never use MountMutation, but useLayout uses
18021 // UnmountMutation.
18022 commitHookEffectList(UnmountMutation, MountMutation, finishedWork);
18023 return;
18024 }
18025 }
18026
18027 commitContainer(finishedWork);
18028 return;
18029 }
18030
18031 switch (finishedWork.tag) {
18032 case FunctionComponent:
18033 case ForwardRef:
18034 case MemoComponent:
18035 case SimpleMemoComponent:
18036 {
18037 // Note: We currently never use MountMutation, but useLayout uses
18038 // UnmountMutation.
18039 commitHookEffectList(UnmountMutation, MountMutation, finishedWork);
18040 return;
18041 }
18042 case ClassComponent:
18043 {
18044 return;
18045 }
18046 case HostComponent:
18047 {
18048 var instance = finishedWork.stateNode;
18049 if (instance != null) {
18050 // Commit the work prepared earlier.
18051 var newProps = finishedWork.memoizedProps;
18052 // For hydration we reuse the update path but we treat the oldProps
18053 // as the newProps. The updatePayload will contain the real change in
18054 // this case.
18055 var oldProps = current$$1 !== null ? current$$1.memoizedProps : newProps;
18056 var type = finishedWork.type;
18057 // TODO: Type the updateQueue to be specific to host components.
18058 var updatePayload = finishedWork.updateQueue;
18059 finishedWork.updateQueue = null;
18060 if (updatePayload !== null) {
18061 commitUpdate(instance, updatePayload, type, oldProps, newProps, finishedWork);
18062 }
18063 }
18064 return;
18065 }
18066 case HostText:
18067 {
18068 !(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;
18069 var textInstance = finishedWork.stateNode;
18070 var newText = finishedWork.memoizedProps;
18071 // For hydration we reuse the update path but we treat the oldProps
18072 // as the newProps. The updatePayload will contain the real change in
18073 // this case.
18074 var oldText = current$$1 !== null ? current$$1.memoizedProps : newText;
18075 commitTextUpdate(textInstance, oldText, newText);
18076 return;
18077 }
18078 case HostRoot:
18079 {
18080 return;
18081 }
18082 case Profiler:
18083 {
18084 return;
18085 }
18086 case SuspenseComponent:
18087 {
18088 var newState = finishedWork.memoizedState;
18089
18090 var newDidTimeout = void 0;
18091 var primaryChildParent = finishedWork;
18092 if (newState === null) {
18093 newDidTimeout = false;
18094 } else {
18095 newDidTimeout = true;
18096 primaryChildParent = finishedWork.child;
18097 if (newState.timedOutAt === NoWork) {
18098 // If the children had not already timed out, record the time.
18099 // This is used to compute the elapsed time during subsequent
18100 // attempts to render the children.
18101 newState.timedOutAt = requestCurrentTime();
18102 }
18103 }
18104
18105 if (primaryChildParent !== null) {
18106 hideOrUnhideAllChildren(primaryChildParent, newDidTimeout);
18107 }
18108
18109 // If this boundary just timed out, then it will have a set of thenables.
18110 // For each thenable, attach a listener so that when it resolves, React
18111 // attempts to re-render the boundary in the primary (pre-timeout) state.
18112 var thenables = finishedWork.updateQueue;
18113 if (thenables !== null) {
18114 finishedWork.updateQueue = null;
18115 var retryCache = finishedWork.stateNode;
18116 if (retryCache === null) {
18117 retryCache = finishedWork.stateNode = new PossiblyWeakSet$1();
18118 }
18119 thenables.forEach(function (thenable) {
18120 // Memoize using the boundary fiber to prevent redundant listeners.
18121 var retry = retryTimedOutBoundary.bind(null, finishedWork, thenable);
18122 if (enableSchedulerTracing) {
18123 retry = unstable_wrap(retry);
18124 }
18125 if (!retryCache.has(thenable)) {
18126 retryCache.add(thenable);
18127 thenable.then(retry, retry);
18128 }
18129 });
18130 }
18131
18132 return;
18133 }
18134 case IncompleteClassComponent:
18135 {
18136 return;
18137 }
18138 default:
18139 {
18140 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.');
18141 }
18142 }
18143}
18144
18145function commitResetTextContent(current$$1) {
18146 if (!supportsMutation) {
18147 return;
18148 }
18149 resetTextContent(current$$1.stateNode);
18150}
18151
18152var PossiblyWeakSet = typeof WeakSet === 'function' ? WeakSet : Set;
18153var PossiblyWeakMap = typeof WeakMap === 'function' ? WeakMap : Map;
18154
18155function createRootErrorUpdate(fiber, errorInfo, expirationTime) {
18156 var update = createUpdate(expirationTime);
18157 // Unmount the root by rendering null.
18158 update.tag = CaptureUpdate;
18159 // Caution: React DevTools currently depends on this property
18160 // being called "element".
18161 update.payload = { element: null };
18162 var error = errorInfo.value;
18163 update.callback = function () {
18164 onUncaughtError(error);
18165 logError(fiber, errorInfo);
18166 };
18167 return update;
18168}
18169
18170function createClassErrorUpdate(fiber, errorInfo, expirationTime) {
18171 var update = createUpdate(expirationTime);
18172 update.tag = CaptureUpdate;
18173 var getDerivedStateFromError = fiber.type.getDerivedStateFromError;
18174 if (typeof getDerivedStateFromError === 'function') {
18175 var error = errorInfo.value;
18176 update.payload = function () {
18177 return getDerivedStateFromError(error);
18178 };
18179 }
18180
18181 var inst = fiber.stateNode;
18182 if (inst !== null && typeof inst.componentDidCatch === 'function') {
18183 update.callback = function callback() {
18184 if (typeof getDerivedStateFromError !== 'function') {
18185 // To preserve the preexisting retry behavior of error boundaries,
18186 // we keep track of which ones already failed during this batch.
18187 // This gets reset before we yield back to the browser.
18188 // TODO: Warn in strict mode if getDerivedStateFromError is
18189 // not defined.
18190 markLegacyErrorBoundaryAsFailed(this);
18191 }
18192 var error = errorInfo.value;
18193 var stack = errorInfo.stack;
18194 logError(fiber, errorInfo);
18195 this.componentDidCatch(error, {
18196 componentStack: stack !== null ? stack : ''
18197 });
18198 {
18199 if (typeof getDerivedStateFromError !== 'function') {
18200 // If componentDidCatch is the only error boundary method defined,
18201 // then it needs to call setState to recover from errors.
18202 // If no state update is scheduled then the boundary will swallow the error.
18203 !(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;
18204 }
18205 }
18206 };
18207 }
18208 return update;
18209}
18210
18211function attachPingListener(root, renderExpirationTime, thenable) {
18212 // Attach a listener to the promise to "ping" the root and retry. But
18213 // only if one does not already exist for the current render expiration
18214 // time (which acts like a "thread ID" here).
18215 var pingCache = root.pingCache;
18216 var threadIDs = void 0;
18217 if (pingCache === null) {
18218 pingCache = root.pingCache = new PossiblyWeakMap();
18219 threadIDs = new Set();
18220 pingCache.set(thenable, threadIDs);
18221 } else {
18222 threadIDs = pingCache.get(thenable);
18223 if (threadIDs === undefined) {
18224 threadIDs = new Set();
18225 pingCache.set(thenable, threadIDs);
18226 }
18227 }
18228 if (!threadIDs.has(renderExpirationTime)) {
18229 // Memoize using the thread ID to prevent redundant listeners.
18230 threadIDs.add(renderExpirationTime);
18231 var ping = pingSuspendedRoot.bind(null, root, thenable, renderExpirationTime);
18232 if (enableSchedulerTracing) {
18233 ping = unstable_wrap(ping);
18234 }
18235 thenable.then(ping, ping);
18236 }
18237}
18238
18239function throwException(root, returnFiber, sourceFiber, value, renderExpirationTime) {
18240 // The source fiber did not complete.
18241 sourceFiber.effectTag |= Incomplete;
18242 // Its effect list is no longer valid.
18243 sourceFiber.firstEffect = sourceFiber.lastEffect = null;
18244
18245 if (value !== null && typeof value === 'object' && typeof value.then === 'function') {
18246 // This is a thenable.
18247 var thenable = value;
18248
18249 // Find the earliest timeout threshold of all the placeholders in the
18250 // ancestor path. We could avoid this traversal by storing the thresholds on
18251 // the stack, but we choose not to because we only hit this path if we're
18252 // IO-bound (i.e. if something suspends). Whereas the stack is used even in
18253 // the non-IO- bound case.
18254 var _workInProgress = returnFiber;
18255 var earliestTimeoutMs = -1;
18256 var startTimeMs = -1;
18257 do {
18258 if (_workInProgress.tag === SuspenseComponent) {
18259 var current$$1 = _workInProgress.alternate;
18260 if (current$$1 !== null) {
18261 var currentState = current$$1.memoizedState;
18262 if (currentState !== null) {
18263 // Reached a boundary that already timed out. Do not search
18264 // any further.
18265 var timedOutAt = currentState.timedOutAt;
18266 startTimeMs = expirationTimeToMs(timedOutAt);
18267 // Do not search any further.
18268 break;
18269 }
18270 }
18271 var timeoutPropMs = _workInProgress.pendingProps.maxDuration;
18272 if (typeof timeoutPropMs === 'number') {
18273 if (timeoutPropMs <= 0) {
18274 earliestTimeoutMs = 0;
18275 } else if (earliestTimeoutMs === -1 || timeoutPropMs < earliestTimeoutMs) {
18276 earliestTimeoutMs = timeoutPropMs;
18277 }
18278 }
18279 }
18280 // If there is a DehydratedSuspenseComponent we don't have to do anything because
18281 // if something suspends inside it, we will simply leave that as dehydrated. It
18282 // will never timeout.
18283 _workInProgress = _workInProgress.return;
18284 } while (_workInProgress !== null);
18285
18286 // Schedule the nearest Suspense to re-render the timed out view.
18287 _workInProgress = returnFiber;
18288 do {
18289 if (_workInProgress.tag === SuspenseComponent && shouldCaptureSuspense(_workInProgress)) {
18290 // Found the nearest boundary.
18291
18292 // Stash the promise on the boundary fiber. If the boundary times out, we'll
18293 var thenables = _workInProgress.updateQueue;
18294 if (thenables === null) {
18295 var updateQueue = new Set();
18296 updateQueue.add(thenable);
18297 _workInProgress.updateQueue = updateQueue;
18298 } else {
18299 thenables.add(thenable);
18300 }
18301
18302 // If the boundary is outside of concurrent mode, we should *not*
18303 // suspend the commit. Pretend as if the suspended component rendered
18304 // null and keep rendering. In the commit phase, we'll schedule a
18305 // subsequent synchronous update to re-render the Suspense.
18306 //
18307 // Note: It doesn't matter whether the component that suspended was
18308 // inside a concurrent mode tree. If the Suspense is outside of it, we
18309 // should *not* suspend the commit.
18310 if ((_workInProgress.mode & ConcurrentMode) === NoEffect) {
18311 _workInProgress.effectTag |= DidCapture;
18312
18313 // We're going to commit this fiber even though it didn't complete.
18314 // But we shouldn't call any lifecycle methods or callbacks. Remove
18315 // all lifecycle effect tags.
18316 sourceFiber.effectTag &= ~(LifecycleEffectMask | Incomplete);
18317
18318 if (sourceFiber.tag === ClassComponent) {
18319 var currentSourceFiber = sourceFiber.alternate;
18320 if (currentSourceFiber === null) {
18321 // This is a new mount. Change the tag so it's not mistaken for a
18322 // completed class component. For example, we should not call
18323 // componentWillUnmount if it is deleted.
18324 sourceFiber.tag = IncompleteClassComponent;
18325 } else {
18326 // When we try rendering again, we should not reuse the current fiber,
18327 // since it's known to be in an inconsistent state. Use a force updte to
18328 // prevent a bail out.
18329 var update = createUpdate(Sync);
18330 update.tag = ForceUpdate;
18331 enqueueUpdate(sourceFiber, update);
18332 }
18333 }
18334
18335 // The source fiber did not complete. Mark it with Sync priority to
18336 // indicate that it still has pending work.
18337 sourceFiber.expirationTime = Sync;
18338
18339 // Exit without suspending.
18340 return;
18341 }
18342
18343 // Confirmed that the boundary is in a concurrent mode tree. Continue
18344 // with the normal suspend path.
18345
18346 attachPingListener(root, renderExpirationTime, thenable);
18347
18348 var absoluteTimeoutMs = void 0;
18349 if (earliestTimeoutMs === -1) {
18350 // If no explicit threshold is given, default to an arbitrarily large
18351 // value. The actual size doesn't matter because the threshold for the
18352 // whole tree will be clamped to the expiration time.
18353 absoluteTimeoutMs = maxSigned31BitInt;
18354 } else {
18355 if (startTimeMs === -1) {
18356 // This suspend happened outside of any already timed-out
18357 // placeholders. We don't know exactly when the update was
18358 // scheduled, but we can infer an approximate start time from the
18359 // expiration time. First, find the earliest uncommitted expiration
18360 // time in the tree, including work that is suspended. Then subtract
18361 // the offset used to compute an async update's expiration time.
18362 // This will cause high priority (interactive) work to expire
18363 // earlier than necessary, but we can account for this by adjusting
18364 // for the Just Noticeable Difference.
18365 var earliestExpirationTime = findEarliestOutstandingPriorityLevel(root, renderExpirationTime);
18366 var earliestExpirationTimeMs = expirationTimeToMs(earliestExpirationTime);
18367 startTimeMs = earliestExpirationTimeMs - LOW_PRIORITY_EXPIRATION;
18368 }
18369 absoluteTimeoutMs = startTimeMs + earliestTimeoutMs;
18370 }
18371
18372 // Mark the earliest timeout in the suspended fiber's ancestor path.
18373 // After completing the root, we'll take the largest of all the
18374 // suspended fiber's timeouts and use it to compute a timeout for the
18375 // whole tree.
18376 renderDidSuspend(root, absoluteTimeoutMs, renderExpirationTime);
18377
18378 _workInProgress.effectTag |= ShouldCapture;
18379 _workInProgress.expirationTime = renderExpirationTime;
18380 return;
18381 } else if (enableSuspenseServerRenderer && _workInProgress.tag === DehydratedSuspenseComponent) {
18382 attachPingListener(root, renderExpirationTime, thenable);
18383
18384 // Since we already have a current fiber, we can eagerly add a retry listener.
18385 var retryCache = _workInProgress.memoizedState;
18386 if (retryCache === null) {
18387 retryCache = _workInProgress.memoizedState = new PossiblyWeakSet();
18388 var _current = _workInProgress.alternate;
18389 !_current ? invariant(false, 'A dehydrated suspense boundary must commit before trying to render. This is probably a bug in React.') : void 0;
18390 _current.memoizedState = retryCache;
18391 }
18392 // Memoize using the boundary fiber to prevent redundant listeners.
18393 if (!retryCache.has(thenable)) {
18394 retryCache.add(thenable);
18395 var retry = retryTimedOutBoundary.bind(null, _workInProgress, thenable);
18396 if (enableSchedulerTracing) {
18397 retry = unstable_wrap(retry);
18398 }
18399 thenable.then(retry, retry);
18400 }
18401 _workInProgress.effectTag |= ShouldCapture;
18402 _workInProgress.expirationTime = renderExpirationTime;
18403 return;
18404 }
18405 // This boundary already captured during this render. Continue to the next
18406 // boundary.
18407 _workInProgress = _workInProgress.return;
18408 } while (_workInProgress !== null);
18409 // No boundary was found. Fallthrough to error mode.
18410 // TODO: Use invariant so the message is stripped in prod?
18411 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));
18412 }
18413
18414 // We didn't find a boundary that could handle this type of exception. Start
18415 // over and traverse parent path again, this time treating the exception
18416 // as an error.
18417 renderDidError();
18418 value = createCapturedValue(value, sourceFiber);
18419 var workInProgress = returnFiber;
18420 do {
18421 switch (workInProgress.tag) {
18422 case HostRoot:
18423 {
18424 var _errorInfo = value;
18425 workInProgress.effectTag |= ShouldCapture;
18426 workInProgress.expirationTime = renderExpirationTime;
18427 var _update = createRootErrorUpdate(workInProgress, _errorInfo, renderExpirationTime);
18428 enqueueCapturedUpdate(workInProgress, _update);
18429 return;
18430 }
18431 case ClassComponent:
18432 // Capture and retry
18433 var errorInfo = value;
18434 var ctor = workInProgress.type;
18435 var instance = workInProgress.stateNode;
18436 if ((workInProgress.effectTag & DidCapture) === NoEffect && (typeof ctor.getDerivedStateFromError === 'function' || instance !== null && typeof instance.componentDidCatch === 'function' && !isAlreadyFailedLegacyErrorBoundary(instance))) {
18437 workInProgress.effectTag |= ShouldCapture;
18438 workInProgress.expirationTime = renderExpirationTime;
18439 // Schedule the error boundary to re-render using updated state
18440 var _update2 = createClassErrorUpdate(workInProgress, errorInfo, renderExpirationTime);
18441 enqueueCapturedUpdate(workInProgress, _update2);
18442 return;
18443 }
18444 break;
18445 default:
18446 break;
18447 }
18448 workInProgress = workInProgress.return;
18449 } while (workInProgress !== null);
18450}
18451
18452function unwindWork(workInProgress, renderExpirationTime) {
18453 switch (workInProgress.tag) {
18454 case ClassComponent:
18455 {
18456 var Component = workInProgress.type;
18457 if (isContextProvider(Component)) {
18458 popContext(workInProgress);
18459 }
18460 var effectTag = workInProgress.effectTag;
18461 if (effectTag & ShouldCapture) {
18462 workInProgress.effectTag = effectTag & ~ShouldCapture | DidCapture;
18463 return workInProgress;
18464 }
18465 return null;
18466 }
18467 case HostRoot:
18468 {
18469 popHostContainer(workInProgress);
18470 popTopLevelContextObject(workInProgress);
18471 var _effectTag = workInProgress.effectTag;
18472 !((_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;
18473 workInProgress.effectTag = _effectTag & ~ShouldCapture | DidCapture;
18474 return workInProgress;
18475 }
18476 case HostComponent:
18477 {
18478 // TODO: popHydrationState
18479 popHostContext(workInProgress);
18480 return null;
18481 }
18482 case SuspenseComponent:
18483 {
18484 var _effectTag2 = workInProgress.effectTag;
18485 if (_effectTag2 & ShouldCapture) {
18486 workInProgress.effectTag = _effectTag2 & ~ShouldCapture | DidCapture;
18487 // Captured a suspense effect. Re-render the boundary.
18488 return workInProgress;
18489 }
18490 return null;
18491 }
18492 case DehydratedSuspenseComponent:
18493 {
18494 if (enableSuspenseServerRenderer) {
18495 // TODO: popHydrationState
18496 var _effectTag3 = workInProgress.effectTag;
18497 if (_effectTag3 & ShouldCapture) {
18498 workInProgress.effectTag = _effectTag3 & ~ShouldCapture | DidCapture;
18499 // Captured a suspense effect. Re-render the boundary.
18500 return workInProgress;
18501 }
18502 }
18503 return null;
18504 }
18505 case HostPortal:
18506 popHostContainer(workInProgress);
18507 return null;
18508 case ContextProvider:
18509 popProvider(workInProgress);
18510 return null;
18511 default:
18512 return null;
18513 }
18514}
18515
18516function unwindInterruptedWork(interruptedWork) {
18517 switch (interruptedWork.tag) {
18518 case ClassComponent:
18519 {
18520 var childContextTypes = interruptedWork.type.childContextTypes;
18521 if (childContextTypes !== null && childContextTypes !== undefined) {
18522 popContext(interruptedWork);
18523 }
18524 break;
18525 }
18526 case HostRoot:
18527 {
18528 popHostContainer(interruptedWork);
18529 popTopLevelContextObject(interruptedWork);
18530 break;
18531 }
18532 case HostComponent:
18533 {
18534 popHostContext(interruptedWork);
18535 break;
18536 }
18537 case HostPortal:
18538 popHostContainer(interruptedWork);
18539 break;
18540 case ContextProvider:
18541 popProvider(interruptedWork);
18542 break;
18543 default:
18544 break;
18545 }
18546}
18547
18548var ReactCurrentDispatcher = ReactSharedInternals.ReactCurrentDispatcher;
18549var ReactCurrentOwner$2 = ReactSharedInternals.ReactCurrentOwner;
18550
18551
18552var didWarnAboutStateTransition = void 0;
18553var didWarnSetStateChildContext = void 0;
18554var warnAboutUpdateOnUnmounted = void 0;
18555var warnAboutInvalidUpdates = void 0;
18556
18557if (enableSchedulerTracing) {
18558 // Provide explicit error message when production+profiling bundle of e.g. react-dom
18559 // is used with production (non-profiling) bundle of scheduler/tracing
18560 !(__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;
18561}
18562
18563{
18564 didWarnAboutStateTransition = false;
18565 didWarnSetStateChildContext = false;
18566 var didWarnStateUpdateForUnmountedComponent = {};
18567
18568 warnAboutUpdateOnUnmounted = function (fiber, isClass) {
18569 // We show the whole stack but dedupe on the top component's name because
18570 // the problematic code almost always lies inside that component.
18571 var componentName = getComponentName(fiber.type) || 'ReactComponent';
18572 if (didWarnStateUpdateForUnmountedComponent[componentName]) {
18573 return;
18574 }
18575 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));
18576 didWarnStateUpdateForUnmountedComponent[componentName] = true;
18577 };
18578
18579 warnAboutInvalidUpdates = function (instance) {
18580 switch (phase) {
18581 case 'getChildContext':
18582 if (didWarnSetStateChildContext) {
18583 return;
18584 }
18585 warningWithoutStack$1(false, 'setState(...): Cannot call setState() inside getChildContext()');
18586 didWarnSetStateChildContext = true;
18587 break;
18588 case 'render':
18589 if (didWarnAboutStateTransition) {
18590 return;
18591 }
18592 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.');
18593 didWarnAboutStateTransition = true;
18594 break;
18595 }
18596 };
18597}
18598
18599// Used to ensure computeUniqueAsyncExpiration is monotonically decreasing.
18600var lastUniqueAsyncExpiration = Sync - 1;
18601
18602var isWorking = false;
18603
18604// The next work in progress fiber that we're currently working on.
18605var nextUnitOfWork = null;
18606var nextRoot = null;
18607// The time at which we're currently rendering work.
18608var nextRenderExpirationTime = NoWork;
18609var nextLatestAbsoluteTimeoutMs = -1;
18610var nextRenderDidError = false;
18611
18612// The next fiber with an effect that we're currently committing.
18613var nextEffect = null;
18614
18615var isCommitting$1 = false;
18616var rootWithPendingPassiveEffects = null;
18617var passiveEffectCallbackHandle = null;
18618var passiveEffectCallback = null;
18619
18620var legacyErrorBoundariesThatAlreadyFailed = null;
18621
18622// Used for performance tracking.
18623var interruptedBy = null;
18624
18625var stashedWorkInProgressProperties = void 0;
18626var replayUnitOfWork = void 0;
18627var mayReplayFailedUnitOfWork = void 0;
18628var isReplayingFailedUnitOfWork = void 0;
18629var originalReplayError = void 0;
18630var rethrowOriginalError = void 0;
18631if (true && replayFailedUnitOfWorkWithInvokeGuardedCallback) {
18632 stashedWorkInProgressProperties = null;
18633 mayReplayFailedUnitOfWork = true;
18634 isReplayingFailedUnitOfWork = false;
18635 originalReplayError = null;
18636 replayUnitOfWork = function (failedUnitOfWork, thrownValue, isYieldy) {
18637 if (thrownValue !== null && typeof thrownValue === 'object' && typeof thrownValue.then === 'function') {
18638 // Don't replay promises. Treat everything else like an error.
18639 // TODO: Need to figure out a different strategy if/when we add
18640 // support for catching other types.
18641 return;
18642 }
18643
18644 // Restore the original state of the work-in-progress
18645 if (stashedWorkInProgressProperties === null) {
18646 // This should never happen. Don't throw because this code is DEV-only.
18647 warningWithoutStack$1(false, 'Could not replay rendering after an error. This is likely a bug in React. ' + 'Please file an issue.');
18648 return;
18649 }
18650 assignFiberPropertiesInDEV(failedUnitOfWork, stashedWorkInProgressProperties);
18651
18652 switch (failedUnitOfWork.tag) {
18653 case HostRoot:
18654 popHostContainer(failedUnitOfWork);
18655 popTopLevelContextObject(failedUnitOfWork);
18656 break;
18657 case HostComponent:
18658 popHostContext(failedUnitOfWork);
18659 break;
18660 case ClassComponent:
18661 {
18662 var Component = failedUnitOfWork.type;
18663 if (isContextProvider(Component)) {
18664 popContext(failedUnitOfWork);
18665 }
18666 break;
18667 }
18668 case HostPortal:
18669 popHostContainer(failedUnitOfWork);
18670 break;
18671 case ContextProvider:
18672 popProvider(failedUnitOfWork);
18673 break;
18674 }
18675 // Replay the begin phase.
18676 isReplayingFailedUnitOfWork = true;
18677 originalReplayError = thrownValue;
18678 invokeGuardedCallback(null, workLoop, null, isYieldy);
18679 isReplayingFailedUnitOfWork = false;
18680 originalReplayError = null;
18681 if (hasCaughtError()) {
18682 var replayError = clearCaughtError();
18683 if (replayError != null && thrownValue != null) {
18684 try {
18685 // Reading the expando property is intentionally
18686 // inside `try` because it might be a getter or Proxy.
18687 if (replayError._suppressLogging) {
18688 // Also suppress logging for the original error.
18689 thrownValue._suppressLogging = true;
18690 }
18691 } catch (inner) {
18692 // Ignore.
18693 }
18694 }
18695 } else {
18696 // If the begin phase did not fail the second time, set this pointer
18697 // back to the original value.
18698 nextUnitOfWork = failedUnitOfWork;
18699 }
18700 };
18701 rethrowOriginalError = function () {
18702 throw originalReplayError;
18703 };
18704}
18705
18706function resetStack() {
18707 if (nextUnitOfWork !== null) {
18708 var interruptedWork = nextUnitOfWork.return;
18709 while (interruptedWork !== null) {
18710 unwindInterruptedWork(interruptedWork);
18711 interruptedWork = interruptedWork.return;
18712 }
18713 }
18714
18715 {
18716 ReactStrictModeWarnings.discardPendingWarnings();
18717 checkThatStackIsEmpty();
18718 }
18719
18720 nextRoot = null;
18721 nextRenderExpirationTime = NoWork;
18722 nextLatestAbsoluteTimeoutMs = -1;
18723 nextRenderDidError = false;
18724 nextUnitOfWork = null;
18725}
18726
18727function commitAllHostEffects() {
18728 while (nextEffect !== null) {
18729 {
18730 setCurrentFiber(nextEffect);
18731 }
18732 recordEffect();
18733
18734 var effectTag = nextEffect.effectTag;
18735
18736 if (effectTag & ContentReset) {
18737 commitResetTextContent(nextEffect);
18738 }
18739
18740 if (effectTag & Ref) {
18741 var current$$1 = nextEffect.alternate;
18742 if (current$$1 !== null) {
18743 commitDetachRef(current$$1);
18744 }
18745 }
18746
18747 // The following switch statement is only concerned about placement,
18748 // updates, and deletions. To avoid needing to add a case for every
18749 // possible bitmap value, we remove the secondary effects from the
18750 // effect tag and switch on that value.
18751 var primaryEffectTag = effectTag & (Placement | Update | Deletion);
18752 switch (primaryEffectTag) {
18753 case Placement:
18754 {
18755 commitPlacement(nextEffect);
18756 // Clear the "placement" from effect tag so that we know that this is inserted, before
18757 // any life-cycles like componentDidMount gets called.
18758 // TODO: findDOMNode doesn't rely on this any more but isMounted
18759 // does and isMounted is deprecated anyway so we should be able
18760 // to kill this.
18761 nextEffect.effectTag &= ~Placement;
18762 break;
18763 }
18764 case PlacementAndUpdate:
18765 {
18766 // Placement
18767 commitPlacement(nextEffect);
18768 // Clear the "placement" from effect tag so that we know that this is inserted, before
18769 // any life-cycles like componentDidMount gets called.
18770 nextEffect.effectTag &= ~Placement;
18771
18772 // Update
18773 var _current = nextEffect.alternate;
18774 commitWork(_current, nextEffect);
18775 break;
18776 }
18777 case Update:
18778 {
18779 var _current2 = nextEffect.alternate;
18780 commitWork(_current2, nextEffect);
18781 break;
18782 }
18783 case Deletion:
18784 {
18785 commitDeletion(nextEffect);
18786 break;
18787 }
18788 }
18789 nextEffect = nextEffect.nextEffect;
18790 }
18791
18792 {
18793 resetCurrentFiber();
18794 }
18795}
18796
18797function commitBeforeMutationLifecycles() {
18798 while (nextEffect !== null) {
18799 {
18800 setCurrentFiber(nextEffect);
18801 }
18802
18803 var effectTag = nextEffect.effectTag;
18804 if (effectTag & Snapshot) {
18805 recordEffect();
18806 var current$$1 = nextEffect.alternate;
18807 commitBeforeMutationLifeCycles(current$$1, nextEffect);
18808 }
18809
18810 nextEffect = nextEffect.nextEffect;
18811 }
18812
18813 {
18814 resetCurrentFiber();
18815 }
18816}
18817
18818function commitAllLifeCycles(finishedRoot, committedExpirationTime) {
18819 {
18820 ReactStrictModeWarnings.flushPendingUnsafeLifecycleWarnings();
18821 ReactStrictModeWarnings.flushLegacyContextWarning();
18822
18823 if (warnAboutDeprecatedLifecycles) {
18824 ReactStrictModeWarnings.flushPendingDeprecationWarnings();
18825 }
18826 }
18827 while (nextEffect !== null) {
18828 {
18829 setCurrentFiber(nextEffect);
18830 }
18831 var effectTag = nextEffect.effectTag;
18832
18833 if (effectTag & (Update | Callback)) {
18834 recordEffect();
18835 var current$$1 = nextEffect.alternate;
18836 commitLifeCycles(finishedRoot, current$$1, nextEffect, committedExpirationTime);
18837 }
18838
18839 if (effectTag & Ref) {
18840 recordEffect();
18841 commitAttachRef(nextEffect);
18842 }
18843
18844 if (effectTag & Passive) {
18845 rootWithPendingPassiveEffects = finishedRoot;
18846 }
18847
18848 nextEffect = nextEffect.nextEffect;
18849 }
18850 {
18851 resetCurrentFiber();
18852 }
18853}
18854
18855function commitPassiveEffects(root, firstEffect) {
18856 rootWithPendingPassiveEffects = null;
18857 passiveEffectCallbackHandle = null;
18858 passiveEffectCallback = null;
18859
18860 // Set this to true to prevent re-entrancy
18861 var previousIsRendering = isRendering;
18862 isRendering = true;
18863
18864 var effect = firstEffect;
18865 do {
18866 {
18867 setCurrentFiber(effect);
18868 }
18869
18870 if (effect.effectTag & Passive) {
18871 var didError = false;
18872 var error = void 0;
18873 {
18874 invokeGuardedCallback(null, commitPassiveHookEffects, null, effect);
18875 if (hasCaughtError()) {
18876 didError = true;
18877 error = clearCaughtError();
18878 }
18879 }
18880 if (didError) {
18881 captureCommitPhaseError(effect, error);
18882 }
18883 }
18884 effect = effect.nextEffect;
18885 } while (effect !== null);
18886 {
18887 resetCurrentFiber();
18888 }
18889
18890 isRendering = previousIsRendering;
18891
18892 // Check if work was scheduled by one of the effects
18893 var rootExpirationTime = root.expirationTime;
18894 if (rootExpirationTime !== NoWork) {
18895 requestWork(root, rootExpirationTime);
18896 }
18897 // Flush any sync work that was scheduled by effects
18898 if (!isBatchingUpdates && !isRendering) {
18899 performSyncWork();
18900 }
18901}
18902
18903function isAlreadyFailedLegacyErrorBoundary(instance) {
18904 return legacyErrorBoundariesThatAlreadyFailed !== null && legacyErrorBoundariesThatAlreadyFailed.has(instance);
18905}
18906
18907function markLegacyErrorBoundaryAsFailed(instance) {
18908 if (legacyErrorBoundariesThatAlreadyFailed === null) {
18909 legacyErrorBoundariesThatAlreadyFailed = new Set([instance]);
18910 } else {
18911 legacyErrorBoundariesThatAlreadyFailed.add(instance);
18912 }
18913}
18914
18915function flushPassiveEffects() {
18916 if (passiveEffectCallbackHandle !== null) {
18917 cancelPassiveEffects(passiveEffectCallbackHandle);
18918 }
18919 if (passiveEffectCallback !== null) {
18920 // We call the scheduled callback instead of commitPassiveEffects directly
18921 // to ensure tracing works correctly.
18922 passiveEffectCallback();
18923 }
18924}
18925
18926function commitRoot(root, finishedWork) {
18927 isWorking = true;
18928 isCommitting$1 = true;
18929 startCommitTimer();
18930
18931 !(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;
18932 var committedExpirationTime = root.pendingCommitExpirationTime;
18933 !(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;
18934 root.pendingCommitExpirationTime = NoWork;
18935
18936 // Update the pending priority levels to account for the work that we are
18937 // about to commit. This needs to happen before calling the lifecycles, since
18938 // they may schedule additional updates.
18939 var updateExpirationTimeBeforeCommit = finishedWork.expirationTime;
18940 var childExpirationTimeBeforeCommit = finishedWork.childExpirationTime;
18941 var earliestRemainingTimeBeforeCommit = childExpirationTimeBeforeCommit > updateExpirationTimeBeforeCommit ? childExpirationTimeBeforeCommit : updateExpirationTimeBeforeCommit;
18942 markCommittedPriorityLevels(root, earliestRemainingTimeBeforeCommit);
18943
18944 var prevInteractions = null;
18945 if (enableSchedulerTracing) {
18946 // Restore any pending interactions at this point,
18947 // So that cascading work triggered during the render phase will be accounted for.
18948 prevInteractions = __interactionsRef.current;
18949 __interactionsRef.current = root.memoizedInteractions;
18950 }
18951
18952 // Reset this to null before calling lifecycles
18953 ReactCurrentOwner$2.current = null;
18954
18955 var firstEffect = void 0;
18956 if (finishedWork.effectTag > PerformedWork) {
18957 // A fiber's effect list consists only of its children, not itself. So if
18958 // the root has an effect, we need to add it to the end of the list. The
18959 // resulting list is the set that would belong to the root's parent, if
18960 // it had one; that is, all the effects in the tree including the root.
18961 if (finishedWork.lastEffect !== null) {
18962 finishedWork.lastEffect.nextEffect = finishedWork;
18963 firstEffect = finishedWork.firstEffect;
18964 } else {
18965 firstEffect = finishedWork;
18966 }
18967 } else {
18968 // There is no effect on the root.
18969 firstEffect = finishedWork.firstEffect;
18970 }
18971
18972 prepareForCommit(root.containerInfo);
18973
18974 // Invoke instances of getSnapshotBeforeUpdate before mutation.
18975 nextEffect = firstEffect;
18976 startCommitSnapshotEffectsTimer();
18977 while (nextEffect !== null) {
18978 var didError = false;
18979 var error = void 0;
18980 {
18981 invokeGuardedCallback(null, commitBeforeMutationLifecycles, null);
18982 if (hasCaughtError()) {
18983 didError = true;
18984 error = clearCaughtError();
18985 }
18986 }
18987 if (didError) {
18988 !(nextEffect !== null) ? invariant(false, 'Should have next effect. This error is likely caused by a bug in React. Please file an issue.') : void 0;
18989 captureCommitPhaseError(nextEffect, error);
18990 // Clean-up
18991 if (nextEffect !== null) {
18992 nextEffect = nextEffect.nextEffect;
18993 }
18994 }
18995 }
18996 stopCommitSnapshotEffectsTimer();
18997
18998 if (enableProfilerTimer) {
18999 // Mark the current commit time to be shared by all Profilers in this batch.
19000 // This enables them to be grouped later.
19001 recordCommitTime();
19002 }
19003
19004 // Commit all the side-effects within a tree. We'll do this in two passes.
19005 // The first pass performs all the host insertions, updates, deletions and
19006 // ref unmounts.
19007 nextEffect = firstEffect;
19008 startCommitHostEffectsTimer();
19009 while (nextEffect !== null) {
19010 var _didError = false;
19011 var _error = void 0;
19012 {
19013 invokeGuardedCallback(null, commitAllHostEffects, null);
19014 if (hasCaughtError()) {
19015 _didError = true;
19016 _error = clearCaughtError();
19017 }
19018 }
19019 if (_didError) {
19020 !(nextEffect !== null) ? invariant(false, 'Should have next effect. This error is likely caused by a bug in React. Please file an issue.') : void 0;
19021 captureCommitPhaseError(nextEffect, _error);
19022 // Clean-up
19023 if (nextEffect !== null) {
19024 nextEffect = nextEffect.nextEffect;
19025 }
19026 }
19027 }
19028 stopCommitHostEffectsTimer();
19029
19030 resetAfterCommit(root.containerInfo);
19031
19032 // The work-in-progress tree is now the current tree. This must come after
19033 // the first pass of the commit phase, so that the previous tree is still
19034 // current during componentWillUnmount, but before the second pass, so that
19035 // the finished work is current during componentDidMount/Update.
19036 root.current = finishedWork;
19037
19038 // In the second pass we'll perform all life-cycles and ref callbacks.
19039 // Life-cycles happen as a separate pass so that all placements, updates,
19040 // and deletions in the entire tree have already been invoked.
19041 // This pass also triggers any renderer-specific initial effects.
19042 nextEffect = firstEffect;
19043 startCommitLifeCyclesTimer();
19044 while (nextEffect !== null) {
19045 var _didError2 = false;
19046 var _error2 = void 0;
19047 {
19048 invokeGuardedCallback(null, commitAllLifeCycles, null, root, committedExpirationTime);
19049 if (hasCaughtError()) {
19050 _didError2 = true;
19051 _error2 = clearCaughtError();
19052 }
19053 }
19054 if (_didError2) {
19055 !(nextEffect !== null) ? invariant(false, 'Should have next effect. This error is likely caused by a bug in React. Please file an issue.') : void 0;
19056 captureCommitPhaseError(nextEffect, _error2);
19057 if (nextEffect !== null) {
19058 nextEffect = nextEffect.nextEffect;
19059 }
19060 }
19061 }
19062
19063 if (firstEffect !== null && rootWithPendingPassiveEffects !== null) {
19064 // This commit included a passive effect. These do not need to fire until
19065 // after the next paint. Schedule an callback to fire them in an async
19066 // event. To ensure serial execution, the callback will be flushed early if
19067 // we enter rootWithPendingPassiveEffects commit phase before then.
19068 var callback = commitPassiveEffects.bind(null, root, firstEffect);
19069 if (enableSchedulerTracing) {
19070 // TODO: Avoid this extra callback by mutating the tracing ref directly,
19071 // like we do at the beginning of commitRoot. I've opted not to do that
19072 // here because that code is still in flux.
19073 callback = unstable_wrap(callback);
19074 }
19075 passiveEffectCallbackHandle = unstable_runWithPriority(unstable_NormalPriority, function () {
19076 return schedulePassiveEffects(callback);
19077 });
19078 passiveEffectCallback = callback;
19079 }
19080
19081 isCommitting$1 = false;
19082 isWorking = false;
19083 stopCommitLifeCyclesTimer();
19084 stopCommitTimer();
19085 onCommitRoot(finishedWork.stateNode);
19086 if (true && ReactFiberInstrumentation_1.debugTool) {
19087 ReactFiberInstrumentation_1.debugTool.onCommitWork(finishedWork);
19088 }
19089
19090 var updateExpirationTimeAfterCommit = finishedWork.expirationTime;
19091 var childExpirationTimeAfterCommit = finishedWork.childExpirationTime;
19092 var earliestRemainingTimeAfterCommit = childExpirationTimeAfterCommit > updateExpirationTimeAfterCommit ? childExpirationTimeAfterCommit : updateExpirationTimeAfterCommit;
19093 if (earliestRemainingTimeAfterCommit === NoWork) {
19094 // If there's no remaining work, we can clear the set of already failed
19095 // error boundaries.
19096 legacyErrorBoundariesThatAlreadyFailed = null;
19097 }
19098 onCommit(root, earliestRemainingTimeAfterCommit);
19099
19100 if (enableSchedulerTracing) {
19101 __interactionsRef.current = prevInteractions;
19102
19103 var subscriber = void 0;
19104
19105 try {
19106 subscriber = __subscriberRef.current;
19107 if (subscriber !== null && root.memoizedInteractions.size > 0) {
19108 var threadID = computeThreadID(committedExpirationTime, root.interactionThreadID);
19109 subscriber.onWorkStopped(root.memoizedInteractions, threadID);
19110 }
19111 } catch (error) {
19112 // It's not safe for commitRoot() to throw.
19113 // Store the error for now and we'll re-throw in finishRendering().
19114 if (!hasUnhandledError) {
19115 hasUnhandledError = true;
19116 unhandledError = error;
19117 }
19118 } finally {
19119 // Clear completed interactions from the pending Map.
19120 // Unless the render was suspended or cascading work was scheduled,
19121 // In which case– leave pending interactions until the subsequent render.
19122 var pendingInteractionMap = root.pendingInteractionMap;
19123 pendingInteractionMap.forEach(function (scheduledInteractions, scheduledExpirationTime) {
19124 // Only decrement the pending interaction count if we're done.
19125 // If there's still work at the current priority,
19126 // That indicates that we are waiting for suspense data.
19127 if (scheduledExpirationTime > earliestRemainingTimeAfterCommit) {
19128 pendingInteractionMap.delete(scheduledExpirationTime);
19129
19130 scheduledInteractions.forEach(function (interaction) {
19131 interaction.__count--;
19132
19133 if (subscriber !== null && interaction.__count === 0) {
19134 try {
19135 subscriber.onInteractionScheduledWorkCompleted(interaction);
19136 } catch (error) {
19137 // It's not safe for commitRoot() to throw.
19138 // Store the error for now and we'll re-throw in finishRendering().
19139 if (!hasUnhandledError) {
19140 hasUnhandledError = true;
19141 unhandledError = error;
19142 }
19143 }
19144 }
19145 });
19146 }
19147 });
19148 }
19149 }
19150}
19151
19152function resetChildExpirationTime(workInProgress, renderTime) {
19153 if (renderTime !== Never && workInProgress.childExpirationTime === Never) {
19154 // The children of this component are hidden. Don't bubble their
19155 // expiration times.
19156 return;
19157 }
19158
19159 var newChildExpirationTime = NoWork;
19160
19161 // Bubble up the earliest expiration time.
19162 if (enableProfilerTimer && workInProgress.mode & ProfileMode) {
19163 // We're in profiling mode.
19164 // Let's use this same traversal to update the render durations.
19165 var actualDuration = workInProgress.actualDuration;
19166 var treeBaseDuration = workInProgress.selfBaseDuration;
19167
19168 // When a fiber is cloned, its actualDuration is reset to 0.
19169 // This value will only be updated if work is done on the fiber (i.e. it doesn't bailout).
19170 // When work is done, it should bubble to the parent's actualDuration.
19171 // If the fiber has not been cloned though, (meaning no work was done),
19172 // Then this value will reflect the amount of time spent working on a previous render.
19173 // In that case it should not bubble.
19174 // We determine whether it was cloned by comparing the child pointer.
19175 var shouldBubbleActualDurations = workInProgress.alternate === null || workInProgress.child !== workInProgress.alternate.child;
19176
19177 var child = workInProgress.child;
19178 while (child !== null) {
19179 var childUpdateExpirationTime = child.expirationTime;
19180 var childChildExpirationTime = child.childExpirationTime;
19181 if (childUpdateExpirationTime > newChildExpirationTime) {
19182 newChildExpirationTime = childUpdateExpirationTime;
19183 }
19184 if (childChildExpirationTime > newChildExpirationTime) {
19185 newChildExpirationTime = childChildExpirationTime;
19186 }
19187 if (shouldBubbleActualDurations) {
19188 actualDuration += child.actualDuration;
19189 }
19190 treeBaseDuration += child.treeBaseDuration;
19191 child = child.sibling;
19192 }
19193 workInProgress.actualDuration = actualDuration;
19194 workInProgress.treeBaseDuration = treeBaseDuration;
19195 } else {
19196 var _child = workInProgress.child;
19197 while (_child !== null) {
19198 var _childUpdateExpirationTime = _child.expirationTime;
19199 var _childChildExpirationTime = _child.childExpirationTime;
19200 if (_childUpdateExpirationTime > newChildExpirationTime) {
19201 newChildExpirationTime = _childUpdateExpirationTime;
19202 }
19203 if (_childChildExpirationTime > newChildExpirationTime) {
19204 newChildExpirationTime = _childChildExpirationTime;
19205 }
19206 _child = _child.sibling;
19207 }
19208 }
19209
19210 workInProgress.childExpirationTime = newChildExpirationTime;
19211}
19212
19213function completeUnitOfWork(workInProgress) {
19214 // Attempt to complete the current unit of work, then move to the
19215 // next sibling. If there are no more siblings, return to the
19216 // parent fiber.
19217 while (true) {
19218 // The current, flushed, state of this fiber is the alternate.
19219 // Ideally nothing should rely on this, but relying on it here
19220 // means that we don't need an additional field on the work in
19221 // progress.
19222 var current$$1 = workInProgress.alternate;
19223 {
19224 setCurrentFiber(workInProgress);
19225 }
19226
19227 var returnFiber = workInProgress.return;
19228 var siblingFiber = workInProgress.sibling;
19229
19230 if ((workInProgress.effectTag & Incomplete) === NoEffect) {
19231 if (true && replayFailedUnitOfWorkWithInvokeGuardedCallback) {
19232 // Don't replay if it fails during completion phase.
19233 mayReplayFailedUnitOfWork = false;
19234 }
19235 // This fiber completed.
19236 // Remember we're completing this unit so we can find a boundary if it fails.
19237 nextUnitOfWork = workInProgress;
19238 if (enableProfilerTimer) {
19239 if (workInProgress.mode & ProfileMode) {
19240 startProfilerTimer(workInProgress);
19241 }
19242 nextUnitOfWork = completeWork(current$$1, workInProgress, nextRenderExpirationTime);
19243 if (workInProgress.mode & ProfileMode) {
19244 // Update render duration assuming we didn't error.
19245 stopProfilerTimerIfRunningAndRecordDelta(workInProgress, false);
19246 }
19247 } else {
19248 nextUnitOfWork = completeWork(current$$1, workInProgress, nextRenderExpirationTime);
19249 }
19250 if (true && replayFailedUnitOfWorkWithInvokeGuardedCallback) {
19251 // We're out of completion phase so replaying is fine now.
19252 mayReplayFailedUnitOfWork = true;
19253 }
19254 stopWorkTimer(workInProgress);
19255 resetChildExpirationTime(workInProgress, nextRenderExpirationTime);
19256 {
19257 resetCurrentFiber();
19258 }
19259
19260 if (nextUnitOfWork !== null) {
19261 // Completing this fiber spawned new work. Work on that next.
19262 return nextUnitOfWork;
19263 }
19264
19265 if (returnFiber !== null &&
19266 // Do not append effects to parents if a sibling failed to complete
19267 (returnFiber.effectTag & Incomplete) === NoEffect) {
19268 // Append all the effects of the subtree and this fiber onto the effect
19269 // list of the parent. The completion order of the children affects the
19270 // side-effect order.
19271 if (returnFiber.firstEffect === null) {
19272 returnFiber.firstEffect = workInProgress.firstEffect;
19273 }
19274 if (workInProgress.lastEffect !== null) {
19275 if (returnFiber.lastEffect !== null) {
19276 returnFiber.lastEffect.nextEffect = workInProgress.firstEffect;
19277 }
19278 returnFiber.lastEffect = workInProgress.lastEffect;
19279 }
19280
19281 // If this fiber had side-effects, we append it AFTER the children's
19282 // side-effects. We can perform certain side-effects earlier if
19283 // needed, by doing multiple passes over the effect list. We don't want
19284 // to schedule our own side-effect on our own list because if end up
19285 // reusing children we'll schedule this effect onto itself since we're
19286 // at the end.
19287 var effectTag = workInProgress.effectTag;
19288 // Skip both NoWork and PerformedWork tags when creating the effect list.
19289 // PerformedWork effect is read by React DevTools but shouldn't be committed.
19290 if (effectTag > PerformedWork) {
19291 if (returnFiber.lastEffect !== null) {
19292 returnFiber.lastEffect.nextEffect = workInProgress;
19293 } else {
19294 returnFiber.firstEffect = workInProgress;
19295 }
19296 returnFiber.lastEffect = workInProgress;
19297 }
19298 }
19299
19300 if (true && ReactFiberInstrumentation_1.debugTool) {
19301 ReactFiberInstrumentation_1.debugTool.onCompleteWork(workInProgress);
19302 }
19303
19304 if (siblingFiber !== null) {
19305 // If there is more work to do in this returnFiber, do that next.
19306 return siblingFiber;
19307 } else if (returnFiber !== null) {
19308 // If there's no more work in this returnFiber. Complete the returnFiber.
19309 workInProgress = returnFiber;
19310 continue;
19311 } else {
19312 // We've reached the root.
19313 return null;
19314 }
19315 } else {
19316 if (enableProfilerTimer && workInProgress.mode & ProfileMode) {
19317 // Record the render duration for the fiber that errored.
19318 stopProfilerTimerIfRunningAndRecordDelta(workInProgress, false);
19319
19320 // Include the time spent working on failed children before continuing.
19321 var actualDuration = workInProgress.actualDuration;
19322 var child = workInProgress.child;
19323 while (child !== null) {
19324 actualDuration += child.actualDuration;
19325 child = child.sibling;
19326 }
19327 workInProgress.actualDuration = actualDuration;
19328 }
19329
19330 // This fiber did not complete because something threw. Pop values off
19331 // the stack without entering the complete phase. If this is a boundary,
19332 // capture values if possible.
19333 var next = unwindWork(workInProgress, nextRenderExpirationTime);
19334 // Because this fiber did not complete, don't reset its expiration time.
19335 if (workInProgress.effectTag & DidCapture) {
19336 // Restarting an error boundary
19337 stopFailedWorkTimer(workInProgress);
19338 } else {
19339 stopWorkTimer(workInProgress);
19340 }
19341
19342 {
19343 resetCurrentFiber();
19344 }
19345
19346 if (next !== null) {
19347 stopWorkTimer(workInProgress);
19348 if (true && ReactFiberInstrumentation_1.debugTool) {
19349 ReactFiberInstrumentation_1.debugTool.onCompleteWork(workInProgress);
19350 }
19351
19352 // If completing this work spawned new work, do that next. We'll come
19353 // back here again.
19354 // Since we're restarting, remove anything that is not a host effect
19355 // from the effect tag.
19356 next.effectTag &= HostEffectMask;
19357 return next;
19358 }
19359
19360 if (returnFiber !== null) {
19361 // Mark the parent fiber as incomplete and clear its effect list.
19362 returnFiber.firstEffect = returnFiber.lastEffect = null;
19363 returnFiber.effectTag |= Incomplete;
19364 }
19365
19366 if (true && ReactFiberInstrumentation_1.debugTool) {
19367 ReactFiberInstrumentation_1.debugTool.onCompleteWork(workInProgress);
19368 }
19369
19370 if (siblingFiber !== null) {
19371 // If there is more work to do in this returnFiber, do that next.
19372 return siblingFiber;
19373 } else if (returnFiber !== null) {
19374 // If there's no more work in this returnFiber. Complete the returnFiber.
19375 workInProgress = returnFiber;
19376 continue;
19377 } else {
19378 return null;
19379 }
19380 }
19381 }
19382
19383 // Without this explicit null return Flow complains of invalid return type
19384 // TODO Remove the above while(true) loop
19385 // eslint-disable-next-line no-unreachable
19386 return null;
19387}
19388
19389function performUnitOfWork(workInProgress) {
19390 // The current, flushed, state of this fiber is the alternate.
19391 // Ideally nothing should rely on this, but relying on it here
19392 // means that we don't need an additional field on the work in
19393 // progress.
19394 var current$$1 = workInProgress.alternate;
19395
19396 // See if beginning this work spawns more work.
19397 startWorkTimer(workInProgress);
19398 {
19399 setCurrentFiber(workInProgress);
19400 }
19401
19402 if (true && replayFailedUnitOfWorkWithInvokeGuardedCallback) {
19403 stashedWorkInProgressProperties = assignFiberPropertiesInDEV(stashedWorkInProgressProperties, workInProgress);
19404 }
19405
19406 var next = void 0;
19407 if (enableProfilerTimer) {
19408 if (workInProgress.mode & ProfileMode) {
19409 startProfilerTimer(workInProgress);
19410 }
19411
19412 next = beginWork(current$$1, workInProgress, nextRenderExpirationTime);
19413 workInProgress.memoizedProps = workInProgress.pendingProps;
19414
19415 if (workInProgress.mode & ProfileMode) {
19416 // Record the render duration assuming we didn't bailout (or error).
19417 stopProfilerTimerIfRunningAndRecordDelta(workInProgress, true);
19418 }
19419 } else {
19420 next = beginWork(current$$1, workInProgress, nextRenderExpirationTime);
19421 workInProgress.memoizedProps = workInProgress.pendingProps;
19422 }
19423
19424 {
19425 resetCurrentFiber();
19426 if (isReplayingFailedUnitOfWork) {
19427 // Currently replaying a failed unit of work. This should be unreachable,
19428 // because the render phase is meant to be idempotent, and it should
19429 // have thrown again. Since it didn't, rethrow the original error, so
19430 // React's internal stack is not misaligned.
19431 rethrowOriginalError();
19432 }
19433 }
19434 if (true && ReactFiberInstrumentation_1.debugTool) {
19435 ReactFiberInstrumentation_1.debugTool.onBeginWork(workInProgress);
19436 }
19437
19438 if (next === null) {
19439 // If this doesn't spawn new work, complete the current work.
19440 next = completeUnitOfWork(workInProgress);
19441 }
19442
19443 ReactCurrentOwner$2.current = null;
19444
19445 return next;
19446}
19447
19448function workLoop(isYieldy) {
19449 if (!isYieldy) {
19450 // Flush work without yielding
19451 while (nextUnitOfWork !== null) {
19452 nextUnitOfWork = performUnitOfWork(nextUnitOfWork);
19453 }
19454 } else {
19455 // Flush asynchronous work until there's a higher priority event
19456 while (nextUnitOfWork !== null && !shouldYieldToRenderer()) {
19457 nextUnitOfWork = performUnitOfWork(nextUnitOfWork);
19458 }
19459 }
19460}
19461
19462function renderRoot(root, isYieldy) {
19463 !!isWorking ? invariant(false, 'renderRoot was called recursively. This error is likely caused by a bug in React. Please file an issue.') : void 0;
19464
19465 flushPassiveEffects();
19466
19467 isWorking = true;
19468 var previousDispatcher = ReactCurrentDispatcher.current;
19469 ReactCurrentDispatcher.current = ContextOnlyDispatcher;
19470
19471 var expirationTime = root.nextExpirationTimeToWorkOn;
19472
19473 // Check if we're starting from a fresh stack, or if we're resuming from
19474 // previously yielded work.
19475 if (expirationTime !== nextRenderExpirationTime || root !== nextRoot || nextUnitOfWork === null) {
19476 // Reset the stack and start working from the root.
19477 resetStack();
19478 nextRoot = root;
19479 nextRenderExpirationTime = expirationTime;
19480 nextUnitOfWork = createWorkInProgress(nextRoot.current, null, nextRenderExpirationTime);
19481 root.pendingCommitExpirationTime = NoWork;
19482
19483 if (enableSchedulerTracing) {
19484 // Determine which interactions this batch of work currently includes,
19485 // So that we can accurately attribute time spent working on it,
19486 var interactions = new Set();
19487 root.pendingInteractionMap.forEach(function (scheduledInteractions, scheduledExpirationTime) {
19488 if (scheduledExpirationTime >= expirationTime) {
19489 scheduledInteractions.forEach(function (interaction) {
19490 return interactions.add(interaction);
19491 });
19492 }
19493 });
19494
19495 // Store the current set of interactions on the FiberRoot for a few reasons:
19496 // We can re-use it in hot functions like renderRoot() without having to recalculate it.
19497 // We will also use it in commitWork() to pass to any Profiler onRender() hooks.
19498 // This also provides DevTools with a way to access it when the onCommitRoot() hook is called.
19499 root.memoizedInteractions = interactions;
19500
19501 if (interactions.size > 0) {
19502 var subscriber = __subscriberRef.current;
19503 if (subscriber !== null) {
19504 var threadID = computeThreadID(expirationTime, root.interactionThreadID);
19505 try {
19506 subscriber.onWorkStarted(interactions, threadID);
19507 } catch (error) {
19508 // Work thrown by an interaction tracing subscriber should be rethrown,
19509 // But only once it's safe (to avoid leaving the scheduler in an invalid state).
19510 // Store the error for now and we'll re-throw in finishRendering().
19511 if (!hasUnhandledError) {
19512 hasUnhandledError = true;
19513 unhandledError = error;
19514 }
19515 }
19516 }
19517 }
19518 }
19519 }
19520
19521 var prevInteractions = null;
19522 if (enableSchedulerTracing) {
19523 // We're about to start new traced work.
19524 // Restore pending interactions so cascading work triggered during the render phase will be accounted for.
19525 prevInteractions = __interactionsRef.current;
19526 __interactionsRef.current = root.memoizedInteractions;
19527 }
19528
19529 var didFatal = false;
19530
19531 startWorkLoopTimer(nextUnitOfWork);
19532
19533 do {
19534 try {
19535 workLoop(isYieldy);
19536 } catch (thrownValue) {
19537 resetContextDependences();
19538 resetHooks();
19539
19540 // Reset in case completion throws.
19541 // This is only used in DEV and when replaying is on.
19542 var mayReplay = void 0;
19543 if (true && replayFailedUnitOfWorkWithInvokeGuardedCallback) {
19544 mayReplay = mayReplayFailedUnitOfWork;
19545 mayReplayFailedUnitOfWork = true;
19546 }
19547
19548 if (nextUnitOfWork === null) {
19549 // This is a fatal error.
19550 didFatal = true;
19551 onUncaughtError(thrownValue);
19552 } else {
19553 if (enableProfilerTimer && nextUnitOfWork.mode & ProfileMode) {
19554 // Record the time spent rendering before an error was thrown.
19555 // This avoids inaccurate Profiler durations in the case of a suspended render.
19556 stopProfilerTimerIfRunningAndRecordDelta(nextUnitOfWork, true);
19557 }
19558
19559 {
19560 // Reset global debug state
19561 // We assume this is defined in DEV
19562 resetCurrentlyProcessingQueue();
19563 }
19564
19565 if (true && replayFailedUnitOfWorkWithInvokeGuardedCallback) {
19566 if (mayReplay) {
19567 var failedUnitOfWork = nextUnitOfWork;
19568 replayUnitOfWork(failedUnitOfWork, thrownValue, isYieldy);
19569 }
19570 }
19571
19572 // TODO: we already know this isn't true in some cases.
19573 // At least this shows a nicer error message until we figure out the cause.
19574 // https://github.com/facebook/react/issues/12449#issuecomment-386727431
19575 !(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;
19576
19577 var sourceFiber = nextUnitOfWork;
19578 var returnFiber = sourceFiber.return;
19579 if (returnFiber === null) {
19580 // This is the root. The root could capture its own errors. However,
19581 // we don't know if it errors before or after we pushed the host
19582 // context. This information is needed to avoid a stack mismatch.
19583 // Because we're not sure, treat this as a fatal error. We could track
19584 // which phase it fails in, but doesn't seem worth it. At least
19585 // for now.
19586 didFatal = true;
19587 onUncaughtError(thrownValue);
19588 } else {
19589 throwException(root, returnFiber, sourceFiber, thrownValue, nextRenderExpirationTime);
19590 nextUnitOfWork = completeUnitOfWork(sourceFiber);
19591 continue;
19592 }
19593 }
19594 }
19595 break;
19596 } while (true);
19597
19598 if (enableSchedulerTracing) {
19599 // Traced work is done for now; restore the previous interactions.
19600 __interactionsRef.current = prevInteractions;
19601 }
19602
19603 // We're done performing work. Time to clean up.
19604 isWorking = false;
19605 ReactCurrentDispatcher.current = previousDispatcher;
19606 resetContextDependences();
19607 resetHooks();
19608
19609 // Yield back to main thread.
19610 if (didFatal) {
19611 var _didCompleteRoot = false;
19612 stopWorkLoopTimer(interruptedBy, _didCompleteRoot);
19613 interruptedBy = null;
19614 // There was a fatal error.
19615 {
19616 resetStackAfterFatalErrorInDev();
19617 }
19618 // `nextRoot` points to the in-progress root. A non-null value indicates
19619 // that we're in the middle of an async render. Set it to null to indicate
19620 // there's no more work to be done in the current batch.
19621 nextRoot = null;
19622 onFatal(root);
19623 return;
19624 }
19625
19626 if (nextUnitOfWork !== null) {
19627 // There's still remaining async work in this tree, but we ran out of time
19628 // in the current frame. Yield back to the renderer. Unless we're
19629 // interrupted by a higher priority update, we'll continue later from where
19630 // we left off.
19631 var _didCompleteRoot2 = false;
19632 stopWorkLoopTimer(interruptedBy, _didCompleteRoot2);
19633 interruptedBy = null;
19634 onYield(root);
19635 return;
19636 }
19637
19638 // We completed the whole tree.
19639 var didCompleteRoot = true;
19640 stopWorkLoopTimer(interruptedBy, didCompleteRoot);
19641 var rootWorkInProgress = root.current.alternate;
19642 !(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;
19643
19644 // `nextRoot` points to the in-progress root. A non-null value indicates
19645 // that we're in the middle of an async render. Set it to null to indicate
19646 // there's no more work to be done in the current batch.
19647 nextRoot = null;
19648 interruptedBy = null;
19649
19650 if (nextRenderDidError) {
19651 // There was an error
19652 if (hasLowerPriorityWork(root, expirationTime)) {
19653 // There's lower priority work. If so, it may have the effect of fixing
19654 // the exception that was just thrown. Exit without committing. This is
19655 // similar to a suspend, but without a timeout because we're not waiting
19656 // for a promise to resolve. React will restart at the lower
19657 // priority level.
19658 markSuspendedPriorityLevel(root, expirationTime);
19659 var suspendedExpirationTime = expirationTime;
19660 var rootExpirationTime = root.expirationTime;
19661 onSuspend(root, rootWorkInProgress, suspendedExpirationTime, rootExpirationTime, -1 // Indicates no timeout
19662 );
19663 return;
19664 } else if (
19665 // There's no lower priority work, but we're rendering asynchronously.
19666 // Synchronously attempt to render the same level one more time. This is
19667 // similar to a suspend, but without a timeout because we're not waiting
19668 // for a promise to resolve.
19669 !root.didError && isYieldy) {
19670 root.didError = true;
19671 var _suspendedExpirationTime = root.nextExpirationTimeToWorkOn = expirationTime;
19672 var _rootExpirationTime = root.expirationTime = Sync;
19673 onSuspend(root, rootWorkInProgress, _suspendedExpirationTime, _rootExpirationTime, -1 // Indicates no timeout
19674 );
19675 return;
19676 }
19677 }
19678
19679 if (isYieldy && nextLatestAbsoluteTimeoutMs !== -1) {
19680 // The tree was suspended.
19681 var _suspendedExpirationTime2 = expirationTime;
19682 markSuspendedPriorityLevel(root, _suspendedExpirationTime2);
19683
19684 // Find the earliest uncommitted expiration time in the tree, including
19685 // work that is suspended. The timeout threshold cannot be longer than
19686 // the overall expiration.
19687 var earliestExpirationTime = findEarliestOutstandingPriorityLevel(root, expirationTime);
19688 var earliestExpirationTimeMs = expirationTimeToMs(earliestExpirationTime);
19689 if (earliestExpirationTimeMs < nextLatestAbsoluteTimeoutMs) {
19690 nextLatestAbsoluteTimeoutMs = earliestExpirationTimeMs;
19691 }
19692
19693 // Subtract the current time from the absolute timeout to get the number
19694 // of milliseconds until the timeout. In other words, convert an absolute
19695 // timestamp to a relative time. This is the value that is passed
19696 // to `setTimeout`.
19697 var currentTimeMs = expirationTimeToMs(requestCurrentTime());
19698 var msUntilTimeout = nextLatestAbsoluteTimeoutMs - currentTimeMs;
19699 msUntilTimeout = msUntilTimeout < 0 ? 0 : msUntilTimeout;
19700
19701 // TODO: Account for the Just Noticeable Difference
19702
19703 var _rootExpirationTime2 = root.expirationTime;
19704 onSuspend(root, rootWorkInProgress, _suspendedExpirationTime2, _rootExpirationTime2, msUntilTimeout);
19705 return;
19706 }
19707
19708 // Ready to commit.
19709 onComplete(root, rootWorkInProgress, expirationTime);
19710}
19711
19712function captureCommitPhaseError(sourceFiber, value) {
19713 var expirationTime = Sync;
19714 var fiber = sourceFiber.return;
19715 while (fiber !== null) {
19716 switch (fiber.tag) {
19717 case ClassComponent:
19718 var ctor = fiber.type;
19719 var instance = fiber.stateNode;
19720 if (typeof ctor.getDerivedStateFromError === 'function' || typeof instance.componentDidCatch === 'function' && !isAlreadyFailedLegacyErrorBoundary(instance)) {
19721 var errorInfo = createCapturedValue(value, sourceFiber);
19722 var update = createClassErrorUpdate(fiber, errorInfo, expirationTime);
19723 enqueueUpdate(fiber, update);
19724 scheduleWork(fiber, expirationTime);
19725 return;
19726 }
19727 break;
19728 case HostRoot:
19729 {
19730 var _errorInfo = createCapturedValue(value, sourceFiber);
19731 var _update = createRootErrorUpdate(fiber, _errorInfo, expirationTime);
19732 enqueueUpdate(fiber, _update);
19733 scheduleWork(fiber, expirationTime);
19734 return;
19735 }
19736 }
19737 fiber = fiber.return;
19738 }
19739
19740 if (sourceFiber.tag === HostRoot) {
19741 // Error was thrown at the root. There is no parent, so the root
19742 // itself should capture it.
19743 var rootFiber = sourceFiber;
19744 var _errorInfo2 = createCapturedValue(value, rootFiber);
19745 var _update2 = createRootErrorUpdate(rootFiber, _errorInfo2, expirationTime);
19746 enqueueUpdate(rootFiber, _update2);
19747 scheduleWork(rootFiber, expirationTime);
19748 }
19749}
19750
19751function computeThreadID(expirationTime, interactionThreadID) {
19752 // Interaction threads are unique per root and expiration time.
19753 return expirationTime * 1000 + interactionThreadID;
19754}
19755
19756// Creates a unique async expiration time.
19757function computeUniqueAsyncExpiration() {
19758 var currentTime = requestCurrentTime();
19759 var result = computeAsyncExpiration(currentTime);
19760 if (result >= lastUniqueAsyncExpiration) {
19761 // Since we assume the current time monotonically increases, we only hit
19762 // this branch when computeUniqueAsyncExpiration is fired multiple times
19763 // within a 200ms window (or whatever the async bucket size is).
19764 result = lastUniqueAsyncExpiration - 1;
19765 }
19766 lastUniqueAsyncExpiration = result;
19767 return lastUniqueAsyncExpiration;
19768}
19769
19770function computeExpirationForFiber(currentTime, fiber) {
19771 var priorityLevel = unstable_getCurrentPriorityLevel();
19772
19773 var expirationTime = void 0;
19774 if ((fiber.mode & ConcurrentMode) === NoContext) {
19775 // Outside of concurrent mode, updates are always synchronous.
19776 expirationTime = Sync;
19777 } else if (isWorking && !isCommitting$1) {
19778 // During render phase, updates expire during as the current render.
19779 expirationTime = nextRenderExpirationTime;
19780 } else {
19781 switch (priorityLevel) {
19782 case unstable_ImmediatePriority:
19783 expirationTime = Sync;
19784 break;
19785 case unstable_UserBlockingPriority:
19786 expirationTime = computeInteractiveExpiration(currentTime);
19787 break;
19788 case unstable_NormalPriority:
19789 // This is a normal, concurrent update
19790 expirationTime = computeAsyncExpiration(currentTime);
19791 break;
19792 case unstable_LowPriority:
19793 case unstable_IdlePriority:
19794 expirationTime = Never;
19795 break;
19796 default:
19797 invariant(false, 'Unknown priority level. This error is likely caused by a bug in React. Please file an issue.');
19798 }
19799
19800 // If we're in the middle of rendering a tree, do not update at the same
19801 // expiration time that is already rendering.
19802 if (nextRoot !== null && expirationTime === nextRenderExpirationTime) {
19803 expirationTime -= 1;
19804 }
19805 }
19806
19807 // Keep track of the lowest pending interactive expiration time. This
19808 // allows us to synchronously flush all interactive updates
19809 // when needed.
19810 // TODO: Move this to renderer?
19811 if (priorityLevel === unstable_UserBlockingPriority && (lowestPriorityPendingInteractiveExpirationTime === NoWork || expirationTime < lowestPriorityPendingInteractiveExpirationTime)) {
19812 lowestPriorityPendingInteractiveExpirationTime = expirationTime;
19813 }
19814
19815 return expirationTime;
19816}
19817
19818function renderDidSuspend(root, absoluteTimeoutMs, suspendedTime) {
19819 // Schedule the timeout.
19820 if (absoluteTimeoutMs >= 0 && nextLatestAbsoluteTimeoutMs < absoluteTimeoutMs) {
19821 nextLatestAbsoluteTimeoutMs = absoluteTimeoutMs;
19822 }
19823}
19824
19825function renderDidError() {
19826 nextRenderDidError = true;
19827}
19828
19829function pingSuspendedRoot(root, thenable, pingTime) {
19830 // A promise that previously suspended React from committing has resolved.
19831 // If React is still suspended, try again at the previous level (pingTime).
19832
19833 var pingCache = root.pingCache;
19834 if (pingCache !== null) {
19835 // The thenable resolved, so we no longer need to memoize, because it will
19836 // never be thrown again.
19837 pingCache.delete(thenable);
19838 }
19839
19840 if (nextRoot !== null && nextRenderExpirationTime === pingTime) {
19841 // Received a ping at the same priority level at which we're currently
19842 // rendering. Restart from the root.
19843 nextRoot = null;
19844 } else {
19845 // Confirm that the root is still suspended at this level. Otherwise exit.
19846 if (isPriorityLevelSuspended(root, pingTime)) {
19847 // Ping at the original level
19848 markPingedPriorityLevel(root, pingTime);
19849 var rootExpirationTime = root.expirationTime;
19850 if (rootExpirationTime !== NoWork) {
19851 requestWork(root, rootExpirationTime);
19852 }
19853 }
19854 }
19855}
19856
19857function retryTimedOutBoundary(boundaryFiber, thenable) {
19858 // The boundary fiber (a Suspense component) previously timed out and was
19859 // rendered in its fallback state. One of the promises that suspended it has
19860 // resolved, which means at least part of the tree was likely unblocked. Try
19861 var retryCache = void 0;
19862 if (enableSuspenseServerRenderer) {
19863 switch (boundaryFiber.tag) {
19864 case SuspenseComponent:
19865 retryCache = boundaryFiber.stateNode;
19866 break;
19867 case DehydratedSuspenseComponent:
19868 retryCache = boundaryFiber.memoizedState;
19869 break;
19870 default:
19871 invariant(false, 'Pinged unknown suspense boundary type. This is probably a bug in React.');
19872 }
19873 } else {
19874 retryCache = boundaryFiber.stateNode;
19875 }
19876 if (retryCache !== null) {
19877 // The thenable resolved, so we no longer need to memoize, because it will
19878 // never be thrown again.
19879 retryCache.delete(thenable);
19880 }
19881
19882 var currentTime = requestCurrentTime();
19883 var retryTime = computeExpirationForFiber(currentTime, boundaryFiber);
19884 var root = scheduleWorkToRoot(boundaryFiber, retryTime);
19885 if (root !== null) {
19886 markPendingPriorityLevel(root, retryTime);
19887 var rootExpirationTime = root.expirationTime;
19888 if (rootExpirationTime !== NoWork) {
19889 requestWork(root, rootExpirationTime);
19890 }
19891 }
19892}
19893
19894function scheduleWorkToRoot(fiber, expirationTime) {
19895 recordScheduleUpdate();
19896
19897 {
19898 if (fiber.tag === ClassComponent) {
19899 var instance = fiber.stateNode;
19900 warnAboutInvalidUpdates(instance);
19901 }
19902 }
19903
19904 // Update the source fiber's expiration time
19905 if (fiber.expirationTime < expirationTime) {
19906 fiber.expirationTime = expirationTime;
19907 }
19908 var alternate = fiber.alternate;
19909 if (alternate !== null && alternate.expirationTime < expirationTime) {
19910 alternate.expirationTime = expirationTime;
19911 }
19912 // Walk the parent path to the root and update the child expiration time.
19913 var node = fiber.return;
19914 var root = null;
19915 if (node === null && fiber.tag === HostRoot) {
19916 root = fiber.stateNode;
19917 } else {
19918 while (node !== null) {
19919 alternate = node.alternate;
19920 if (node.childExpirationTime < expirationTime) {
19921 node.childExpirationTime = expirationTime;
19922 if (alternate !== null && alternate.childExpirationTime < expirationTime) {
19923 alternate.childExpirationTime = expirationTime;
19924 }
19925 } else if (alternate !== null && alternate.childExpirationTime < expirationTime) {
19926 alternate.childExpirationTime = expirationTime;
19927 }
19928 if (node.return === null && node.tag === HostRoot) {
19929 root = node.stateNode;
19930 break;
19931 }
19932 node = node.return;
19933 }
19934 }
19935
19936 if (enableSchedulerTracing) {
19937 if (root !== null) {
19938 var interactions = __interactionsRef.current;
19939 if (interactions.size > 0) {
19940 var pendingInteractionMap = root.pendingInteractionMap;
19941 var pendingInteractions = pendingInteractionMap.get(expirationTime);
19942 if (pendingInteractions != null) {
19943 interactions.forEach(function (interaction) {
19944 if (!pendingInteractions.has(interaction)) {
19945 // Update the pending async work count for previously unscheduled interaction.
19946 interaction.__count++;
19947 }
19948
19949 pendingInteractions.add(interaction);
19950 });
19951 } else {
19952 pendingInteractionMap.set(expirationTime, new Set(interactions));
19953
19954 // Update the pending async work count for the current interactions.
19955 interactions.forEach(function (interaction) {
19956 interaction.__count++;
19957 });
19958 }
19959
19960 var subscriber = __subscriberRef.current;
19961 if (subscriber !== null) {
19962 var threadID = computeThreadID(expirationTime, root.interactionThreadID);
19963 subscriber.onWorkScheduled(interactions, threadID);
19964 }
19965 }
19966 }
19967 }
19968 return root;
19969}
19970
19971function warnIfNotCurrentlyBatchingInDev(fiber) {
19972 {
19973 if (isRendering === false && isBatchingUpdates === false) {
19974 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));
19975 }
19976 }
19977}
19978
19979function scheduleWork(fiber, expirationTime) {
19980 var root = scheduleWorkToRoot(fiber, expirationTime);
19981 if (root === null) {
19982 {
19983 switch (fiber.tag) {
19984 case ClassComponent:
19985 warnAboutUpdateOnUnmounted(fiber, true);
19986 break;
19987 case FunctionComponent:
19988 case ForwardRef:
19989 case MemoComponent:
19990 case SimpleMemoComponent:
19991 warnAboutUpdateOnUnmounted(fiber, false);
19992 break;
19993 }
19994 }
19995 return;
19996 }
19997
19998 if (!isWorking && nextRenderExpirationTime !== NoWork && expirationTime > nextRenderExpirationTime) {
19999 // This is an interruption. (Used for performance tracking.)
20000 interruptedBy = fiber;
20001 resetStack();
20002 }
20003 markPendingPriorityLevel(root, expirationTime);
20004 if (
20005 // If we're in the render phase, we don't need to schedule this root
20006 // for an update, because we'll do it before we exit...
20007 !isWorking || isCommitting$1 ||
20008 // ...unless this is a different root than the one we're rendering.
20009 nextRoot !== root) {
20010 var rootExpirationTime = root.expirationTime;
20011 requestWork(root, rootExpirationTime);
20012 }
20013 if (nestedUpdateCount > NESTED_UPDATE_LIMIT) {
20014 // Reset this back to zero so subsequent updates don't throw.
20015 nestedUpdateCount = 0;
20016 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.');
20017 }
20018}
20019
20020function syncUpdates(fn, a, b, c, d) {
20021 return unstable_runWithPriority(unstable_ImmediatePriority, function () {
20022 return fn(a, b, c, d);
20023 });
20024}
20025
20026// TODO: Everything below this is written as if it has been lifted to the
20027// renderers. I'll do this in a follow-up.
20028
20029// Linked-list of roots
20030var firstScheduledRoot = null;
20031var lastScheduledRoot = null;
20032
20033var callbackExpirationTime = NoWork;
20034var callbackID = void 0;
20035var isRendering = false;
20036var nextFlushedRoot = null;
20037var nextFlushedExpirationTime = NoWork;
20038var lowestPriorityPendingInteractiveExpirationTime = NoWork;
20039var hasUnhandledError = false;
20040var unhandledError = null;
20041
20042var isBatchingUpdates = false;
20043var isUnbatchingUpdates = false;
20044
20045var completedBatches = null;
20046
20047var originalStartTimeMs = unstable_now();
20048var currentRendererTime = msToExpirationTime(originalStartTimeMs);
20049var currentSchedulerTime = currentRendererTime;
20050
20051// Use these to prevent an infinite loop of nested updates
20052var NESTED_UPDATE_LIMIT = 50;
20053var nestedUpdateCount = 0;
20054var lastCommittedRootDuringThisBatch = null;
20055
20056function recomputeCurrentRendererTime() {
20057 var currentTimeMs = unstable_now() - originalStartTimeMs;
20058 currentRendererTime = msToExpirationTime(currentTimeMs);
20059}
20060
20061function scheduleCallbackWithExpirationTime(root, expirationTime) {
20062 if (callbackExpirationTime !== NoWork) {
20063 // A callback is already scheduled. Check its expiration time (timeout).
20064 if (expirationTime < callbackExpirationTime) {
20065 // Existing callback has sufficient timeout. Exit.
20066 return;
20067 } else {
20068 if (callbackID !== null) {
20069 // Existing callback has insufficient timeout. Cancel and schedule a
20070 // new one.
20071 unstable_cancelCallback(callbackID);
20072 }
20073 }
20074 // The request callback timer is already running. Don't start a new one.
20075 } else {
20076 startRequestCallbackTimer();
20077 }
20078
20079 callbackExpirationTime = expirationTime;
20080 var currentMs = unstable_now() - originalStartTimeMs;
20081 var expirationTimeMs = expirationTimeToMs(expirationTime);
20082 var timeout = expirationTimeMs - currentMs;
20083 callbackID = unstable_scheduleCallback(performAsyncWork, { timeout: timeout });
20084}
20085
20086// For every call to renderRoot, one of onFatal, onComplete, onSuspend, and
20087// onYield is called upon exiting. We use these in lieu of returning a tuple.
20088// I've also chosen not to inline them into renderRoot because these will
20089// eventually be lifted into the renderer.
20090function onFatal(root) {
20091 root.finishedWork = null;
20092}
20093
20094function onComplete(root, finishedWork, expirationTime) {
20095 root.pendingCommitExpirationTime = expirationTime;
20096 root.finishedWork = finishedWork;
20097}
20098
20099function onSuspend(root, finishedWork, suspendedExpirationTime, rootExpirationTime, msUntilTimeout) {
20100 root.expirationTime = rootExpirationTime;
20101 if (msUntilTimeout === 0 && !shouldYieldToRenderer()) {
20102 // Don't wait an additional tick. Commit the tree immediately.
20103 root.pendingCommitExpirationTime = suspendedExpirationTime;
20104 root.finishedWork = finishedWork;
20105 } else if (msUntilTimeout > 0) {
20106 // Wait `msUntilTimeout` milliseconds before committing.
20107 root.timeoutHandle = scheduleTimeout(onTimeout.bind(null, root, finishedWork, suspendedExpirationTime), msUntilTimeout);
20108 }
20109}
20110
20111function onYield(root) {
20112 root.finishedWork = null;
20113}
20114
20115function onTimeout(root, finishedWork, suspendedExpirationTime) {
20116 // The root timed out. Commit it.
20117 root.pendingCommitExpirationTime = suspendedExpirationTime;
20118 root.finishedWork = finishedWork;
20119 // Read the current time before entering the commit phase. We can be
20120 // certain this won't cause tearing related to batching of event updates
20121 // because we're at the top of a timer event.
20122 recomputeCurrentRendererTime();
20123 currentSchedulerTime = currentRendererTime;
20124 flushRoot(root, suspendedExpirationTime);
20125}
20126
20127function onCommit(root, expirationTime) {
20128 root.expirationTime = expirationTime;
20129 root.finishedWork = null;
20130}
20131
20132function requestCurrentTime() {
20133 // requestCurrentTime is called by the scheduler to compute an expiration
20134 // time.
20135 //
20136 // Expiration times are computed by adding to the current time (the start
20137 // time). However, if two updates are scheduled within the same event, we
20138 // should treat their start times as simultaneous, even if the actual clock
20139 // time has advanced between the first and second call.
20140
20141 // In other words, because expiration times determine how updates are batched,
20142 // we want all updates of like priority that occur within the same event to
20143 // receive the same expiration time. Otherwise we get tearing.
20144 //
20145 // We keep track of two separate times: the current "renderer" time and the
20146 // current "scheduler" time. The renderer time can be updated whenever; it
20147 // only exists to minimize the calls performance.now.
20148 //
20149 // But the scheduler time can only be updated if there's no pending work, or
20150 // if we know for certain that we're not in the middle of an event.
20151
20152 if (isRendering) {
20153 // We're already rendering. Return the most recently read time.
20154 return currentSchedulerTime;
20155 }
20156 // Check if there's pending work.
20157 findHighestPriorityRoot();
20158 if (nextFlushedExpirationTime === NoWork || nextFlushedExpirationTime === Never) {
20159 // If there's no pending work, or if the pending work is offscreen, we can
20160 // read the current time without risk of tearing.
20161 recomputeCurrentRendererTime();
20162 currentSchedulerTime = currentRendererTime;
20163 return currentSchedulerTime;
20164 }
20165 // There's already pending work. We might be in the middle of a browser
20166 // event. If we were to read the current time, it could cause multiple updates
20167 // within the same event to receive different expiration times, leading to
20168 // tearing. Return the last read time. During the next idle callback, the
20169 // time will be updated.
20170 return currentSchedulerTime;
20171}
20172
20173// requestWork is called by the scheduler whenever a root receives an update.
20174// It's up to the renderer to call renderRoot at some point in the future.
20175function requestWork(root, expirationTime) {
20176 addRootToSchedule(root, expirationTime);
20177 if (isRendering) {
20178 // Prevent reentrancy. Remaining work will be scheduled at the end of
20179 // the currently rendering batch.
20180 return;
20181 }
20182
20183 if (isBatchingUpdates) {
20184 // Flush work at the end of the batch.
20185 if (isUnbatchingUpdates) {
20186 // ...unless we're inside unbatchedUpdates, in which case we should
20187 // flush it now.
20188 nextFlushedRoot = root;
20189 nextFlushedExpirationTime = Sync;
20190 performWorkOnRoot(root, Sync, false);
20191 }
20192 return;
20193 }
20194
20195 // TODO: Get rid of Sync and use current time?
20196 if (expirationTime === Sync) {
20197 performSyncWork();
20198 } else {
20199 scheduleCallbackWithExpirationTime(root, expirationTime);
20200 }
20201}
20202
20203function addRootToSchedule(root, expirationTime) {
20204 // Add the root to the schedule.
20205 // Check if this root is already part of the schedule.
20206 if (root.nextScheduledRoot === null) {
20207 // This root is not already scheduled. Add it.
20208 root.expirationTime = expirationTime;
20209 if (lastScheduledRoot === null) {
20210 firstScheduledRoot = lastScheduledRoot = root;
20211 root.nextScheduledRoot = root;
20212 } else {
20213 lastScheduledRoot.nextScheduledRoot = root;
20214 lastScheduledRoot = root;
20215 lastScheduledRoot.nextScheduledRoot = firstScheduledRoot;
20216 }
20217 } else {
20218 // This root is already scheduled, but its priority may have increased.
20219 var remainingExpirationTime = root.expirationTime;
20220 if (expirationTime > remainingExpirationTime) {
20221 // Update the priority.
20222 root.expirationTime = expirationTime;
20223 }
20224 }
20225}
20226
20227function findHighestPriorityRoot() {
20228 var highestPriorityWork = NoWork;
20229 var highestPriorityRoot = null;
20230 if (lastScheduledRoot !== null) {
20231 var previousScheduledRoot = lastScheduledRoot;
20232 var root = firstScheduledRoot;
20233 while (root !== null) {
20234 var remainingExpirationTime = root.expirationTime;
20235 if (remainingExpirationTime === NoWork) {
20236 // This root no longer has work. Remove it from the scheduler.
20237
20238 // TODO: This check is redudant, but Flow is confused by the branch
20239 // below where we set lastScheduledRoot to null, even though we break
20240 // from the loop right after.
20241 !(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;
20242 if (root === root.nextScheduledRoot) {
20243 // This is the only root in the list.
20244 root.nextScheduledRoot = null;
20245 firstScheduledRoot = lastScheduledRoot = null;
20246 break;
20247 } else if (root === firstScheduledRoot) {
20248 // This is the first root in the list.
20249 var next = root.nextScheduledRoot;
20250 firstScheduledRoot = next;
20251 lastScheduledRoot.nextScheduledRoot = next;
20252 root.nextScheduledRoot = null;
20253 } else if (root === lastScheduledRoot) {
20254 // This is the last root in the list.
20255 lastScheduledRoot = previousScheduledRoot;
20256 lastScheduledRoot.nextScheduledRoot = firstScheduledRoot;
20257 root.nextScheduledRoot = null;
20258 break;
20259 } else {
20260 previousScheduledRoot.nextScheduledRoot = root.nextScheduledRoot;
20261 root.nextScheduledRoot = null;
20262 }
20263 root = previousScheduledRoot.nextScheduledRoot;
20264 } else {
20265 if (remainingExpirationTime > highestPriorityWork) {
20266 // Update the priority, if it's higher
20267 highestPriorityWork = remainingExpirationTime;
20268 highestPriorityRoot = root;
20269 }
20270 if (root === lastScheduledRoot) {
20271 break;
20272 }
20273 if (highestPriorityWork === Sync) {
20274 // Sync is highest priority by definition so
20275 // we can stop searching.
20276 break;
20277 }
20278 previousScheduledRoot = root;
20279 root = root.nextScheduledRoot;
20280 }
20281 }
20282 }
20283
20284 nextFlushedRoot = highestPriorityRoot;
20285 nextFlushedExpirationTime = highestPriorityWork;
20286}
20287
20288// TODO: This wrapper exists because many of the older tests (the ones that use
20289// flushDeferredPri) rely on the number of times `shouldYield` is called. We
20290// should get rid of it.
20291var didYield = false;
20292function shouldYieldToRenderer() {
20293 if (didYield) {
20294 return true;
20295 }
20296 if (unstable_shouldYield()) {
20297 didYield = true;
20298 return true;
20299 }
20300 return false;
20301}
20302
20303function performAsyncWork() {
20304 try {
20305 if (!shouldYieldToRenderer()) {
20306 // The callback timed out. That means at least one update has expired.
20307 // Iterate through the root schedule. If they contain expired work, set
20308 // the next render expiration time to the current time. This has the effect
20309 // of flushing all expired work in a single batch, instead of flushing each
20310 // level one at a time.
20311 if (firstScheduledRoot !== null) {
20312 recomputeCurrentRendererTime();
20313 var root = firstScheduledRoot;
20314 do {
20315 didExpireAtExpirationTime(root, currentRendererTime);
20316 // The root schedule is circular, so this is never null.
20317 root = root.nextScheduledRoot;
20318 } while (root !== firstScheduledRoot);
20319 }
20320 }
20321 performWork(NoWork, true);
20322 } finally {
20323 didYield = false;
20324 }
20325}
20326
20327function performSyncWork() {
20328 performWork(Sync, false);
20329}
20330
20331function performWork(minExpirationTime, isYieldy) {
20332 // Keep working on roots until there's no more work, or until there's a higher
20333 // priority event.
20334 findHighestPriorityRoot();
20335
20336 if (isYieldy) {
20337 recomputeCurrentRendererTime();
20338 currentSchedulerTime = currentRendererTime;
20339
20340 if (enableUserTimingAPI) {
20341 var didExpire = nextFlushedExpirationTime > currentRendererTime;
20342 var timeout = expirationTimeToMs(nextFlushedExpirationTime);
20343 stopRequestCallbackTimer(didExpire, timeout);
20344 }
20345
20346 while (nextFlushedRoot !== null && nextFlushedExpirationTime !== NoWork && minExpirationTime <= nextFlushedExpirationTime && !(didYield && currentRendererTime > nextFlushedExpirationTime)) {
20347 performWorkOnRoot(nextFlushedRoot, nextFlushedExpirationTime, currentRendererTime > nextFlushedExpirationTime);
20348 findHighestPriorityRoot();
20349 recomputeCurrentRendererTime();
20350 currentSchedulerTime = currentRendererTime;
20351 }
20352 } else {
20353 while (nextFlushedRoot !== null && nextFlushedExpirationTime !== NoWork && minExpirationTime <= nextFlushedExpirationTime) {
20354 performWorkOnRoot(nextFlushedRoot, nextFlushedExpirationTime, false);
20355 findHighestPriorityRoot();
20356 }
20357 }
20358
20359 // We're done flushing work. Either we ran out of time in this callback,
20360 // or there's no more work left with sufficient priority.
20361
20362 // If we're inside a callback, set this to false since we just completed it.
20363 if (isYieldy) {
20364 callbackExpirationTime = NoWork;
20365 callbackID = null;
20366 }
20367 // If there's work left over, schedule a new callback.
20368 if (nextFlushedExpirationTime !== NoWork) {
20369 scheduleCallbackWithExpirationTime(nextFlushedRoot, nextFlushedExpirationTime);
20370 }
20371
20372 // Clean-up.
20373 finishRendering();
20374}
20375
20376function flushRoot(root, expirationTime) {
20377 !!isRendering ? invariant(false, 'work.commit(): Cannot commit while already rendering. This likely means you attempted to commit from inside a lifecycle method.') : void 0;
20378 // Perform work on root as if the given expiration time is the current time.
20379 // This has the effect of synchronously flushing all work up to and
20380 // including the given time.
20381 nextFlushedRoot = root;
20382 nextFlushedExpirationTime = expirationTime;
20383 performWorkOnRoot(root, expirationTime, false);
20384 // Flush any sync work that was scheduled by lifecycles
20385 performSyncWork();
20386}
20387
20388function finishRendering() {
20389 nestedUpdateCount = 0;
20390 lastCommittedRootDuringThisBatch = null;
20391
20392 if (completedBatches !== null) {
20393 var batches = completedBatches;
20394 completedBatches = null;
20395 for (var i = 0; i < batches.length; i++) {
20396 var batch = batches[i];
20397 try {
20398 batch._onComplete();
20399 } catch (error) {
20400 if (!hasUnhandledError) {
20401 hasUnhandledError = true;
20402 unhandledError = error;
20403 }
20404 }
20405 }
20406 }
20407
20408 if (hasUnhandledError) {
20409 var error = unhandledError;
20410 unhandledError = null;
20411 hasUnhandledError = false;
20412 throw error;
20413 }
20414}
20415
20416function performWorkOnRoot(root, expirationTime, isYieldy) {
20417 !!isRendering ? invariant(false, 'performWorkOnRoot was called recursively. This error is likely caused by a bug in React. Please file an issue.') : void 0;
20418
20419 isRendering = true;
20420
20421 // Check if this is async work or sync/expired work.
20422 if (!isYieldy) {
20423 // Flush work without yielding.
20424 // TODO: Non-yieldy work does not necessarily imply expired work. A renderer
20425 // may want to perform some work without yielding, but also without
20426 // requiring the root to complete (by triggering placeholders).
20427
20428 var finishedWork = root.finishedWork;
20429 if (finishedWork !== null) {
20430 // This root is already complete. We can commit it.
20431 completeRoot(root, finishedWork, expirationTime);
20432 } else {
20433 root.finishedWork = null;
20434 // If this root previously suspended, clear its existing timeout, since
20435 // we're about to try rendering again.
20436 var timeoutHandle = root.timeoutHandle;
20437 if (timeoutHandle !== noTimeout) {
20438 root.timeoutHandle = noTimeout;
20439 // $FlowFixMe Complains noTimeout is not a TimeoutID, despite the check above
20440 cancelTimeout(timeoutHandle);
20441 }
20442 renderRoot(root, isYieldy);
20443 finishedWork = root.finishedWork;
20444 if (finishedWork !== null) {
20445 // We've completed the root. Commit it.
20446 completeRoot(root, finishedWork, expirationTime);
20447 }
20448 }
20449 } else {
20450 // Flush async work.
20451 var _finishedWork = root.finishedWork;
20452 if (_finishedWork !== null) {
20453 // This root is already complete. We can commit it.
20454 completeRoot(root, _finishedWork, expirationTime);
20455 } else {
20456 root.finishedWork = null;
20457 // If this root previously suspended, clear its existing timeout, since
20458 // we're about to try rendering again.
20459 var _timeoutHandle = root.timeoutHandle;
20460 if (_timeoutHandle !== noTimeout) {
20461 root.timeoutHandle = noTimeout;
20462 // $FlowFixMe Complains noTimeout is not a TimeoutID, despite the check above
20463 cancelTimeout(_timeoutHandle);
20464 }
20465 renderRoot(root, isYieldy);
20466 _finishedWork = root.finishedWork;
20467 if (_finishedWork !== null) {
20468 // We've completed the root. Check the if we should yield one more time
20469 // before committing.
20470 if (!shouldYieldToRenderer()) {
20471 // Still time left. Commit the root.
20472 completeRoot(root, _finishedWork, expirationTime);
20473 } else {
20474 // There's no time left. Mark this root as complete. We'll come
20475 // back and commit it later.
20476 root.finishedWork = _finishedWork;
20477 }
20478 }
20479 }
20480 }
20481
20482 isRendering = false;
20483}
20484
20485function completeRoot(root, finishedWork, expirationTime) {
20486 // Check if there's a batch that matches this expiration time.
20487 var firstBatch = root.firstBatch;
20488 if (firstBatch !== null && firstBatch._expirationTime >= expirationTime) {
20489 if (completedBatches === null) {
20490 completedBatches = [firstBatch];
20491 } else {
20492 completedBatches.push(firstBatch);
20493 }
20494 if (firstBatch._defer) {
20495 // This root is blocked from committing by a batch. Unschedule it until
20496 // we receive another update.
20497 root.finishedWork = finishedWork;
20498 root.expirationTime = NoWork;
20499 return;
20500 }
20501 }
20502
20503 // Commit the root.
20504 root.finishedWork = null;
20505
20506 // Check if this is a nested update (a sync update scheduled during the
20507 // commit phase).
20508 if (root === lastCommittedRootDuringThisBatch) {
20509 // If the next root is the same as the previous root, this is a nested
20510 // update. To prevent an infinite loop, increment the nested update count.
20511 nestedUpdateCount++;
20512 } else {
20513 // Reset whenever we switch roots.
20514 lastCommittedRootDuringThisBatch = root;
20515 nestedUpdateCount = 0;
20516 }
20517 unstable_runWithPriority(unstable_ImmediatePriority, function () {
20518 commitRoot(root, finishedWork);
20519 });
20520}
20521
20522function onUncaughtError(error) {
20523 !(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;
20524 // Unschedule this root so we don't work on it again until there's
20525 // another update.
20526 nextFlushedRoot.expirationTime = NoWork;
20527 if (!hasUnhandledError) {
20528 hasUnhandledError = true;
20529 unhandledError = error;
20530 }
20531}
20532
20533// TODO: Batching should be implemented at the renderer level, not inside
20534// the reconciler.
20535function batchedUpdates$1(fn, a) {
20536 var previousIsBatchingUpdates = isBatchingUpdates;
20537 isBatchingUpdates = true;
20538 try {
20539 return fn(a);
20540 } finally {
20541 isBatchingUpdates = previousIsBatchingUpdates;
20542 if (!isBatchingUpdates && !isRendering) {
20543 performSyncWork();
20544 }
20545 }
20546}
20547
20548// TODO: Batching should be implemented at the renderer level, not inside
20549// the reconciler.
20550function unbatchedUpdates(fn, a) {
20551 if (isBatchingUpdates && !isUnbatchingUpdates) {
20552 isUnbatchingUpdates = true;
20553 try {
20554 return fn(a);
20555 } finally {
20556 isUnbatchingUpdates = false;
20557 }
20558 }
20559 return fn(a);
20560}
20561
20562// TODO: Batching should be implemented at the renderer level, not within
20563// the reconciler.
20564function flushSync(fn, a) {
20565 !!isRendering ? invariant(false, 'flushSync was called from inside a lifecycle method. It cannot be called when React is already rendering.') : void 0;
20566 var previousIsBatchingUpdates = isBatchingUpdates;
20567 isBatchingUpdates = true;
20568 try {
20569 return syncUpdates(fn, a);
20570 } finally {
20571 isBatchingUpdates = previousIsBatchingUpdates;
20572 performSyncWork();
20573 }
20574}
20575
20576function interactiveUpdates$1(fn, a, b) {
20577 // If there are any pending interactive updates, synchronously flush them.
20578 // This needs to happen before we read any handlers, because the effect of
20579 // the previous event may influence which handlers are called during
20580 // this event.
20581 if (!isBatchingUpdates && !isRendering && lowestPriorityPendingInteractiveExpirationTime !== NoWork) {
20582 // Synchronously flush pending interactive updates.
20583 performWork(lowestPriorityPendingInteractiveExpirationTime, false);
20584 lowestPriorityPendingInteractiveExpirationTime = NoWork;
20585 }
20586 var previousIsBatchingUpdates = isBatchingUpdates;
20587 isBatchingUpdates = true;
20588 try {
20589 return unstable_runWithPriority(unstable_UserBlockingPriority, function () {
20590 return fn(a, b);
20591 });
20592 } finally {
20593 isBatchingUpdates = previousIsBatchingUpdates;
20594 if (!isBatchingUpdates && !isRendering) {
20595 performSyncWork();
20596 }
20597 }
20598}
20599
20600function flushInteractiveUpdates$1() {
20601 if (!isRendering && lowestPriorityPendingInteractiveExpirationTime !== NoWork) {
20602 // Synchronously flush pending interactive updates.
20603 performWork(lowestPriorityPendingInteractiveExpirationTime, false);
20604 lowestPriorityPendingInteractiveExpirationTime = NoWork;
20605 }
20606}
20607
20608function flushControlled(fn) {
20609 var previousIsBatchingUpdates = isBatchingUpdates;
20610 isBatchingUpdates = true;
20611 try {
20612 syncUpdates(fn);
20613 } finally {
20614 isBatchingUpdates = previousIsBatchingUpdates;
20615 if (!isBatchingUpdates && !isRendering) {
20616 performSyncWork();
20617 }
20618 }
20619}
20620
20621// 0 is PROD, 1 is DEV.
20622// Might add PROFILE later.
20623
20624
20625var didWarnAboutNestedUpdates = void 0;
20626var didWarnAboutFindNodeInStrictMode = void 0;
20627
20628{
20629 didWarnAboutNestedUpdates = false;
20630 didWarnAboutFindNodeInStrictMode = {};
20631}
20632
20633function getContextForSubtree(parentComponent) {
20634 if (!parentComponent) {
20635 return emptyContextObject;
20636 }
20637
20638 var fiber = get(parentComponent);
20639 var parentContext = findCurrentUnmaskedContext(fiber);
20640
20641 if (fiber.tag === ClassComponent) {
20642 var Component = fiber.type;
20643 if (isContextProvider(Component)) {
20644 return processChildContext(fiber, Component, parentContext);
20645 }
20646 }
20647
20648 return parentContext;
20649}
20650
20651function scheduleRootUpdate(current$$1, element, expirationTime, callback) {
20652 {
20653 if (phase === 'render' && current !== null && !didWarnAboutNestedUpdates) {
20654 didWarnAboutNestedUpdates = true;
20655 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');
20656 }
20657 }
20658
20659 var update = createUpdate(expirationTime);
20660 // Caution: React DevTools currently depends on this property
20661 // being called "element".
20662 update.payload = { element: element };
20663
20664 callback = callback === undefined ? null : callback;
20665 if (callback !== null) {
20666 !(typeof callback === 'function') ? warningWithoutStack$1(false, 'render(...): Expected the last optional `callback` argument to be a ' + 'function. Instead received: %s.', callback) : void 0;
20667 update.callback = callback;
20668 }
20669
20670 flushPassiveEffects();
20671 enqueueUpdate(current$$1, update);
20672 scheduleWork(current$$1, expirationTime);
20673
20674 return expirationTime;
20675}
20676
20677function updateContainerAtExpirationTime(element, container, parentComponent, expirationTime, callback) {
20678 // TODO: If this is a nested container, this won't be the root.
20679 var current$$1 = container.current;
20680
20681 {
20682 if (ReactFiberInstrumentation_1.debugTool) {
20683 if (current$$1.alternate === null) {
20684 ReactFiberInstrumentation_1.debugTool.onMountContainer(container);
20685 } else if (element === null) {
20686 ReactFiberInstrumentation_1.debugTool.onUnmountContainer(container);
20687 } else {
20688 ReactFiberInstrumentation_1.debugTool.onUpdateContainer(container);
20689 }
20690 }
20691 }
20692
20693 var context = getContextForSubtree(parentComponent);
20694 if (container.context === null) {
20695 container.context = context;
20696 } else {
20697 container.pendingContext = context;
20698 }
20699
20700 return scheduleRootUpdate(current$$1, element, expirationTime, callback);
20701}
20702
20703function findHostInstance(component) {
20704 var fiber = get(component);
20705 if (fiber === undefined) {
20706 if (typeof component.render === 'function') {
20707 invariant(false, 'Unable to find node on an unmounted component.');
20708 } else {
20709 invariant(false, 'Argument appears to not be a ReactComponent. Keys: %s', Object.keys(component));
20710 }
20711 }
20712 var hostFiber = findCurrentHostFiber(fiber);
20713 if (hostFiber === null) {
20714 return null;
20715 }
20716 return hostFiber.stateNode;
20717}
20718
20719function findHostInstanceWithWarning(component, methodName) {
20720 {
20721 var fiber = get(component);
20722 if (fiber === undefined) {
20723 if (typeof component.render === 'function') {
20724 invariant(false, 'Unable to find node on an unmounted component.');
20725 } else {
20726 invariant(false, 'Argument appears to not be a ReactComponent. Keys: %s', Object.keys(component));
20727 }
20728 }
20729 var hostFiber = findCurrentHostFiber(fiber);
20730 if (hostFiber === null) {
20731 return null;
20732 }
20733 if (hostFiber.mode & StrictMode) {
20734 var componentName = getComponentName(fiber.type) || 'Component';
20735 if (!didWarnAboutFindNodeInStrictMode[componentName]) {
20736 didWarnAboutFindNodeInStrictMode[componentName] = true;
20737 if (fiber.mode & StrictMode) {
20738 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));
20739 } else {
20740 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));
20741 }
20742 }
20743 }
20744 return hostFiber.stateNode;
20745 }
20746 return findHostInstance(component);
20747}
20748
20749function createContainer(containerInfo, isConcurrent, hydrate) {
20750 return createFiberRoot(containerInfo, isConcurrent, hydrate);
20751}
20752
20753function updateContainer(element, container, parentComponent, callback) {
20754 var current$$1 = container.current;
20755 var currentTime = requestCurrentTime();
20756 var expirationTime = computeExpirationForFiber(currentTime, current$$1);
20757 return updateContainerAtExpirationTime(element, container, parentComponent, expirationTime, callback);
20758}
20759
20760function getPublicRootInstance(container) {
20761 var containerFiber = container.current;
20762 if (!containerFiber.child) {
20763 return null;
20764 }
20765 switch (containerFiber.child.tag) {
20766 case HostComponent:
20767 return getPublicInstance(containerFiber.child.stateNode);
20768 default:
20769 return containerFiber.child.stateNode;
20770 }
20771}
20772
20773function findHostInstanceWithNoPortals(fiber) {
20774 var hostFiber = findCurrentHostFiberWithNoPortals(fiber);
20775 if (hostFiber === null) {
20776 return null;
20777 }
20778 return hostFiber.stateNode;
20779}
20780
20781var overrideProps = null;
20782
20783{
20784 var copyWithSetImpl = function (obj, path, idx, value) {
20785 if (idx >= path.length) {
20786 return value;
20787 }
20788 var key = path[idx];
20789 var updated = Array.isArray(obj) ? obj.slice() : _assign({}, obj);
20790 // $FlowFixMe number or string is fine here
20791 updated[key] = copyWithSetImpl(obj[key], path, idx + 1, value);
20792 return updated;
20793 };
20794
20795 var copyWithSet = function (obj, path, value) {
20796 return copyWithSetImpl(obj, path, 0, value);
20797 };
20798
20799 // Support DevTools props for function components, forwardRef, memo, host components, etc.
20800 overrideProps = function (fiber, path, value) {
20801 flushPassiveEffects();
20802 fiber.pendingProps = copyWithSet(fiber.memoizedProps, path, value);
20803 if (fiber.alternate) {
20804 fiber.alternate.pendingProps = fiber.pendingProps;
20805 }
20806 scheduleWork(fiber, Sync);
20807 };
20808}
20809
20810function injectIntoDevTools(devToolsConfig) {
20811 var findFiberByHostInstance = devToolsConfig.findFiberByHostInstance;
20812 var ReactCurrentDispatcher = ReactSharedInternals.ReactCurrentDispatcher;
20813
20814
20815 return injectInternals(_assign({}, devToolsConfig, {
20816 overrideProps: overrideProps,
20817 currentDispatcherRef: ReactCurrentDispatcher,
20818 findHostInstanceByFiber: function (fiber) {
20819 var hostFiber = findCurrentHostFiber(fiber);
20820 if (hostFiber === null) {
20821 return null;
20822 }
20823 return hostFiber.stateNode;
20824 },
20825 findFiberByHostInstance: function (instance) {
20826 if (!findFiberByHostInstance) {
20827 // Might not be implemented by the renderer.
20828 return null;
20829 }
20830 return findFiberByHostInstance(instance);
20831 }
20832 }));
20833}
20834
20835// This file intentionally does *not* have the Flow annotation.
20836// Don't add it. See `./inline-typed.js` for an explanation.
20837
20838function createPortal$1(children, containerInfo,
20839// TODO: figure out the API for cross-renderer implementation.
20840implementation) {
20841 var key = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : null;
20842
20843 return {
20844 // This tag allow us to uniquely identify this as a React Portal
20845 $$typeof: REACT_PORTAL_TYPE,
20846 key: key == null ? null : '' + key,
20847 children: children,
20848 containerInfo: containerInfo,
20849 implementation: implementation
20850 };
20851}
20852
20853// TODO: this is special because it gets imported during build.
20854
20855var ReactVersion = '16.8.5';
20856
20857// TODO: This type is shared between the reconciler and ReactDOM, but will
20858// eventually be lifted out to the renderer.
20859
20860var ReactCurrentOwner = ReactSharedInternals.ReactCurrentOwner;
20861
20862var topLevelUpdateWarnings = void 0;
20863var warnOnInvalidCallback = void 0;
20864var didWarnAboutUnstableCreatePortal = false;
20865
20866{
20867 if (typeof Map !== 'function' ||
20868 // $FlowIssue Flow incorrectly thinks Map has no prototype
20869 Map.prototype == null || typeof Map.prototype.forEach !== 'function' || typeof Set !== 'function' ||
20870 // $FlowIssue Flow incorrectly thinks Set has no prototype
20871 Set.prototype == null || typeof Set.prototype.clear !== 'function' || typeof Set.prototype.forEach !== 'function') {
20872 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');
20873 }
20874
20875 topLevelUpdateWarnings = function (container) {
20876 if (container._reactRootContainer && container.nodeType !== COMMENT_NODE) {
20877 var hostInstance = findHostInstanceWithNoPortals(container._reactRootContainer._internalRoot.current);
20878 if (hostInstance) {
20879 !(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;
20880 }
20881 }
20882
20883 var isRootRenderedBySomeReact = !!container._reactRootContainer;
20884 var rootEl = getReactRootElementInContainer(container);
20885 var hasNonRootReactChild = !!(rootEl && getInstanceFromNode$1(rootEl));
20886
20887 !(!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;
20888
20889 !(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;
20890 };
20891
20892 warnOnInvalidCallback = function (callback, callerName) {
20893 !(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;
20894 };
20895}
20896
20897setRestoreImplementation(restoreControlledState$1);
20898
20899function ReactBatch(root) {
20900 var expirationTime = computeUniqueAsyncExpiration();
20901 this._expirationTime = expirationTime;
20902 this._root = root;
20903 this._next = null;
20904 this._callbacks = null;
20905 this._didComplete = false;
20906 this._hasChildren = false;
20907 this._children = null;
20908 this._defer = true;
20909}
20910ReactBatch.prototype.render = function (children) {
20911 !this._defer ? invariant(false, 'batch.render: Cannot render a batch that already committed.') : void 0;
20912 this._hasChildren = true;
20913 this._children = children;
20914 var internalRoot = this._root._internalRoot;
20915 var expirationTime = this._expirationTime;
20916 var work = new ReactWork();
20917 updateContainerAtExpirationTime(children, internalRoot, null, expirationTime, work._onCommit);
20918 return work;
20919};
20920ReactBatch.prototype.then = function (onComplete) {
20921 if (this._didComplete) {
20922 onComplete();
20923 return;
20924 }
20925 var callbacks = this._callbacks;
20926 if (callbacks === null) {
20927 callbacks = this._callbacks = [];
20928 }
20929 callbacks.push(onComplete);
20930};
20931ReactBatch.prototype.commit = function () {
20932 var internalRoot = this._root._internalRoot;
20933 var firstBatch = internalRoot.firstBatch;
20934 !(this._defer && firstBatch !== null) ? invariant(false, 'batch.commit: Cannot commit a batch multiple times.') : void 0;
20935
20936 if (!this._hasChildren) {
20937 // This batch is empty. Return.
20938 this._next = null;
20939 this._defer = false;
20940 return;
20941 }
20942
20943 var expirationTime = this._expirationTime;
20944
20945 // Ensure this is the first batch in the list.
20946 if (firstBatch !== this) {
20947 // This batch is not the earliest batch. We need to move it to the front.
20948 // Update its expiration time to be the expiration time of the earliest
20949 // batch, so that we can flush it without flushing the other batches.
20950 if (this._hasChildren) {
20951 expirationTime = this._expirationTime = firstBatch._expirationTime;
20952 // Rendering this batch again ensures its children will be the final state
20953 // when we flush (updates are processed in insertion order: last
20954 // update wins).
20955 // TODO: This forces a restart. Should we print a warning?
20956 this.render(this._children);
20957 }
20958
20959 // Remove the batch from the list.
20960 var previous = null;
20961 var batch = firstBatch;
20962 while (batch !== this) {
20963 previous = batch;
20964 batch = batch._next;
20965 }
20966 !(previous !== null) ? invariant(false, 'batch.commit: Cannot commit a batch multiple times.') : void 0;
20967 previous._next = batch._next;
20968
20969 // Add it to the front.
20970 this._next = firstBatch;
20971 firstBatch = internalRoot.firstBatch = this;
20972 }
20973
20974 // Synchronously flush all the work up to this batch's expiration time.
20975 this._defer = false;
20976 flushRoot(internalRoot, expirationTime);
20977
20978 // Pop the batch from the list.
20979 var next = this._next;
20980 this._next = null;
20981 firstBatch = internalRoot.firstBatch = next;
20982
20983 // Append the next earliest batch's children to the update queue.
20984 if (firstBatch !== null && firstBatch._hasChildren) {
20985 firstBatch.render(firstBatch._children);
20986 }
20987};
20988ReactBatch.prototype._onComplete = function () {
20989 if (this._didComplete) {
20990 return;
20991 }
20992 this._didComplete = true;
20993 var callbacks = this._callbacks;
20994 if (callbacks === null) {
20995 return;
20996 }
20997 // TODO: Error handling.
20998 for (var i = 0; i < callbacks.length; i++) {
20999 var _callback = callbacks[i];
21000 _callback();
21001 }
21002};
21003
21004function ReactWork() {
21005 this._callbacks = null;
21006 this._didCommit = false;
21007 // TODO: Avoid need to bind by replacing callbacks in the update queue with
21008 // list of Work objects.
21009 this._onCommit = this._onCommit.bind(this);
21010}
21011ReactWork.prototype.then = function (onCommit) {
21012 if (this._didCommit) {
21013 onCommit();
21014 return;
21015 }
21016 var callbacks = this._callbacks;
21017 if (callbacks === null) {
21018 callbacks = this._callbacks = [];
21019 }
21020 callbacks.push(onCommit);
21021};
21022ReactWork.prototype._onCommit = function () {
21023 if (this._didCommit) {
21024 return;
21025 }
21026 this._didCommit = true;
21027 var callbacks = this._callbacks;
21028 if (callbacks === null) {
21029 return;
21030 }
21031 // TODO: Error handling.
21032 for (var i = 0; i < callbacks.length; i++) {
21033 var _callback2 = callbacks[i];
21034 !(typeof _callback2 === 'function') ? invariant(false, 'Invalid argument passed as callback. Expected a function. Instead received: %s', _callback2) : void 0;
21035 _callback2();
21036 }
21037};
21038
21039function ReactRoot(container, isConcurrent, hydrate) {
21040 var root = createContainer(container, isConcurrent, hydrate);
21041 this._internalRoot = root;
21042}
21043ReactRoot.prototype.render = function (children, callback) {
21044 var root = this._internalRoot;
21045 var work = new ReactWork();
21046 callback = callback === undefined ? null : callback;
21047 {
21048 warnOnInvalidCallback(callback, 'render');
21049 }
21050 if (callback !== null) {
21051 work.then(callback);
21052 }
21053 updateContainer(children, root, null, work._onCommit);
21054 return work;
21055};
21056ReactRoot.prototype.unmount = function (callback) {
21057 var root = this._internalRoot;
21058 var work = new ReactWork();
21059 callback = callback === undefined ? null : callback;
21060 {
21061 warnOnInvalidCallback(callback, 'render');
21062 }
21063 if (callback !== null) {
21064 work.then(callback);
21065 }
21066 updateContainer(null, root, null, work._onCommit);
21067 return work;
21068};
21069ReactRoot.prototype.legacy_renderSubtreeIntoContainer = function (parentComponent, children, callback) {
21070 var root = this._internalRoot;
21071 var work = new ReactWork();
21072 callback = callback === undefined ? null : callback;
21073 {
21074 warnOnInvalidCallback(callback, 'render');
21075 }
21076 if (callback !== null) {
21077 work.then(callback);
21078 }
21079 updateContainer(children, root, parentComponent, work._onCommit);
21080 return work;
21081};
21082ReactRoot.prototype.createBatch = function () {
21083 var batch = new ReactBatch(this);
21084 var expirationTime = batch._expirationTime;
21085
21086 var internalRoot = this._internalRoot;
21087 var firstBatch = internalRoot.firstBatch;
21088 if (firstBatch === null) {
21089 internalRoot.firstBatch = batch;
21090 batch._next = null;
21091 } else {
21092 // Insert sorted by expiration time then insertion order
21093 var insertAfter = null;
21094 var insertBefore = firstBatch;
21095 while (insertBefore !== null && insertBefore._expirationTime >= expirationTime) {
21096 insertAfter = insertBefore;
21097 insertBefore = insertBefore._next;
21098 }
21099 batch._next = insertBefore;
21100 if (insertAfter !== null) {
21101 insertAfter._next = batch;
21102 }
21103 }
21104
21105 return batch;
21106};
21107
21108/**
21109 * True if the supplied DOM node is a valid node element.
21110 *
21111 * @param {?DOMElement} node The candidate DOM node.
21112 * @return {boolean} True if the DOM is a valid DOM node.
21113 * @internal
21114 */
21115function isValidContainer(node) {
21116 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 '));
21117}
21118
21119function getReactRootElementInContainer(container) {
21120 if (!container) {
21121 return null;
21122 }
21123
21124 if (container.nodeType === DOCUMENT_NODE) {
21125 return container.documentElement;
21126 } else {
21127 return container.firstChild;
21128 }
21129}
21130
21131function shouldHydrateDueToLegacyHeuristic(container) {
21132 var rootElement = getReactRootElementInContainer(container);
21133 return !!(rootElement && rootElement.nodeType === ELEMENT_NODE && rootElement.hasAttribute(ROOT_ATTRIBUTE_NAME));
21134}
21135
21136setBatchingImplementation(batchedUpdates$1, interactiveUpdates$1, flushInteractiveUpdates$1);
21137
21138var warnedAboutHydrateAPI = false;
21139
21140function legacyCreateRootFromDOMContainer(container, forceHydrate) {
21141 var shouldHydrate = forceHydrate || shouldHydrateDueToLegacyHeuristic(container);
21142 // First clear any existing content.
21143 if (!shouldHydrate) {
21144 var warned = false;
21145 var rootSibling = void 0;
21146 while (rootSibling = container.lastChild) {
21147 {
21148 if (!warned && rootSibling.nodeType === ELEMENT_NODE && rootSibling.hasAttribute(ROOT_ATTRIBUTE_NAME)) {
21149 warned = true;
21150 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.');
21151 }
21152 }
21153 container.removeChild(rootSibling);
21154 }
21155 }
21156 {
21157 if (shouldHydrate && !forceHydrate && !warnedAboutHydrateAPI) {
21158 warnedAboutHydrateAPI = true;
21159 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.');
21160 }
21161 }
21162 // Legacy roots are not async by default.
21163 var isConcurrent = false;
21164 return new ReactRoot(container, isConcurrent, shouldHydrate);
21165}
21166
21167function legacyRenderSubtreeIntoContainer(parentComponent, children, container, forceHydrate, callback) {
21168 {
21169 topLevelUpdateWarnings(container);
21170 }
21171
21172 // TODO: Without `any` type, Flow says "Property cannot be accessed on any
21173 // member of intersection type." Whyyyyyy.
21174 var root = container._reactRootContainer;
21175 if (!root) {
21176 // Initial mount
21177 root = container._reactRootContainer = legacyCreateRootFromDOMContainer(container, forceHydrate);
21178 if (typeof callback === 'function') {
21179 var originalCallback = callback;
21180 callback = function () {
21181 var instance = getPublicRootInstance(root._internalRoot);
21182 originalCallback.call(instance);
21183 };
21184 }
21185 // Initial mount should not be batched.
21186 unbatchedUpdates(function () {
21187 if (parentComponent != null) {
21188 root.legacy_renderSubtreeIntoContainer(parentComponent, children, callback);
21189 } else {
21190 root.render(children, callback);
21191 }
21192 });
21193 } else {
21194 if (typeof callback === 'function') {
21195 var _originalCallback = callback;
21196 callback = function () {
21197 var instance = getPublicRootInstance(root._internalRoot);
21198 _originalCallback.call(instance);
21199 };
21200 }
21201 // Update
21202 if (parentComponent != null) {
21203 root.legacy_renderSubtreeIntoContainer(parentComponent, children, callback);
21204 } else {
21205 root.render(children, callback);
21206 }
21207 }
21208 return getPublicRootInstance(root._internalRoot);
21209}
21210
21211function createPortal$$1(children, container) {
21212 var key = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : null;
21213
21214 !isValidContainer(container) ? invariant(false, 'Target container is not a DOM element.') : void 0;
21215 // TODO: pass ReactDOM portal implementation as third argument
21216 return createPortal$1(children, container, null, key);
21217}
21218
21219var ReactDOM = {
21220 createPortal: createPortal$$1,
21221
21222 findDOMNode: function (componentOrElement) {
21223 {
21224 var owner = ReactCurrentOwner.current;
21225 if (owner !== null && owner.stateNode !== null) {
21226 var warnedAboutRefsInRender = owner.stateNode._warnedAboutRefsInRender;
21227 !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;
21228 owner.stateNode._warnedAboutRefsInRender = true;
21229 }
21230 }
21231 if (componentOrElement == null) {
21232 return null;
21233 }
21234 if (componentOrElement.nodeType === ELEMENT_NODE) {
21235 return componentOrElement;
21236 }
21237 {
21238 return findHostInstanceWithWarning(componentOrElement, 'findDOMNode');
21239 }
21240 return findHostInstance(componentOrElement);
21241 },
21242 hydrate: function (element, container, callback) {
21243 !isValidContainer(container) ? invariant(false, 'Target container is not a DOM element.') : void 0;
21244 {
21245 !!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;
21246 }
21247 // TODO: throw or warn if we couldn't hydrate?
21248 return legacyRenderSubtreeIntoContainer(null, element, container, true, callback);
21249 },
21250 render: function (element, container, callback) {
21251 !isValidContainer(container) ? invariant(false, 'Target container is not a DOM element.') : void 0;
21252 {
21253 !!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;
21254 }
21255 return legacyRenderSubtreeIntoContainer(null, element, container, false, callback);
21256 },
21257 unstable_renderSubtreeIntoContainer: function (parentComponent, element, containerNode, callback) {
21258 !isValidContainer(containerNode) ? invariant(false, 'Target container is not a DOM element.') : void 0;
21259 !(parentComponent != null && has(parentComponent)) ? invariant(false, 'parentComponent must be a valid React Component') : void 0;
21260 return legacyRenderSubtreeIntoContainer(parentComponent, element, containerNode, false, callback);
21261 },
21262 unmountComponentAtNode: function (container) {
21263 !isValidContainer(container) ? invariant(false, 'unmountComponentAtNode(...): Target container is not a DOM element.') : void 0;
21264
21265 {
21266 !!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;
21267 }
21268
21269 if (container._reactRootContainer) {
21270 {
21271 var rootEl = getReactRootElementInContainer(container);
21272 var renderedByDifferentReact = rootEl && !getInstanceFromNode$1(rootEl);
21273 !!renderedByDifferentReact ? warningWithoutStack$1(false, "unmountComponentAtNode(): The node you're attempting to unmount " + 'was rendered by another copy of React.') : void 0;
21274 }
21275
21276 // Unmount should not be batched.
21277 unbatchedUpdates(function () {
21278 legacyRenderSubtreeIntoContainer(null, null, container, false, function () {
21279 container._reactRootContainer = null;
21280 });
21281 });
21282 // If you call unmountComponentAtNode twice in quick succession, you'll
21283 // get `true` twice. That's probably fine?
21284 return true;
21285 } else {
21286 {
21287 var _rootEl = getReactRootElementInContainer(container);
21288 var hasNonRootReactChild = !!(_rootEl && getInstanceFromNode$1(_rootEl));
21289
21290 // Check if the container itself is a React root node.
21291 var isContainerReactRoot = container.nodeType === ELEMENT_NODE && isValidContainer(container.parentNode) && !!container.parentNode._reactRootContainer;
21292
21293 !!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;
21294 }
21295
21296 return false;
21297 }
21298 },
21299
21300
21301 // Temporary alias since we already shipped React 16 RC with it.
21302 // TODO: remove in React 17.
21303 unstable_createPortal: function () {
21304 if (!didWarnAboutUnstableCreatePortal) {
21305 didWarnAboutUnstableCreatePortal = true;
21306 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.');
21307 }
21308 return createPortal$$1.apply(undefined, arguments);
21309 },
21310
21311
21312 unstable_batchedUpdates: batchedUpdates$1,
21313
21314 unstable_interactiveUpdates: interactiveUpdates$1,
21315
21316 flushSync: flushSync,
21317
21318 unstable_createRoot: createRoot,
21319 unstable_flushControlled: flushControlled,
21320
21321 __SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED: {
21322 // Keep in sync with ReactDOMUnstableNativeDependencies.js
21323 // and ReactTestUtils.js. This is an array for better minification.
21324 Events: [getInstanceFromNode$1, getNodeFromInstance$1, getFiberCurrentPropsFromNode$1, injection.injectEventPluginsByName, eventNameDispatchConfigs, accumulateTwoPhaseDispatches, accumulateDirectDispatches, enqueueStateRestore, restoreStateIfNeeded, dispatchEvent, runEventsInBatch]
21325 }
21326};
21327
21328function createRoot(container, options) {
21329 var functionName = enableStableConcurrentModeAPIs ? 'createRoot' : 'unstable_createRoot';
21330 !isValidContainer(container) ? invariant(false, '%s(...): Target container is not a DOM element.', functionName) : void 0;
21331 {
21332 !!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;
21333 container._reactHasBeenPassedToCreateRootDEV = true;
21334 }
21335 var hydrate = options != null && options.hydrate === true;
21336 return new ReactRoot(container, true, hydrate);
21337}
21338
21339if (enableStableConcurrentModeAPIs) {
21340 ReactDOM.createRoot = createRoot;
21341 ReactDOM.unstable_createRoot = undefined;
21342}
21343
21344var foundDevTools = injectIntoDevTools({
21345 findFiberByHostInstance: getClosestInstanceFromNode,
21346 bundleType: 1,
21347 version: ReactVersion,
21348 rendererPackageName: 'react-dom'
21349});
21350
21351{
21352 if (!foundDevTools && canUseDOM && window.top === window.self) {
21353 // If we're in Chrome or Firefox, provide a download link if not installed.
21354 if (navigator.userAgent.indexOf('Chrome') > -1 && navigator.userAgent.indexOf('Edge') === -1 || navigator.userAgent.indexOf('Firefox') > -1) {
21355 var protocol = window.location.protocol;
21356 // Don't warn in exotic cases like chrome-extension://.
21357 if (/^(https?|file):$/.test(protocol)) {
21358 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');
21359 }
21360 }
21361 }
21362}
21363
21364
21365
21366var ReactDOM$2 = Object.freeze({
21367 default: ReactDOM
21368});
21369
21370var ReactDOM$3 = ( ReactDOM$2 && ReactDOM ) || ReactDOM$2;
21371
21372// TODO: decide on the top-level export form.
21373// This is hacky but makes it work with both Rollup and Jest.
21374var reactDom = ReactDOM$3.default || ReactDOM$3;
21375
21376return reactDom;
21377
21378})));