UNPKG

784 kBJavaScriptView Raw
1/** @license React v16.8.2
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`
7737 // attribute on `select`s needs to be added before `option`s are inserted. This prevents
7738 // a bug where the `select` does not scroll to the correct option because singular
7739 // `select` elements automatically pick the first item.
7740 // See https://github.com/facebook/react/issues/13222
7741 if (type === 'select' && props.multiple) {
7742 var node = domElement;
7743 node.multiple = true;
7744 }
7745 }
7746 } else {
7747 domElement = ownerDocument.createElementNS(namespaceURI, type);
7748 }
7749
7750 {
7751 if (namespaceURI === HTML_NAMESPACE) {
7752 if (!isCustomComponentTag && Object.prototype.toString.call(domElement) === '[object HTMLUnknownElement]' && !Object.prototype.hasOwnProperty.call(warnedUnknownTags, type)) {
7753 warnedUnknownTags[type] = true;
7754 warning$1(false, 'The tag <%s> is unrecognized in this browser. ' + 'If you meant to render a React component, start its name with ' + 'an uppercase letter.', type);
7755 }
7756 }
7757 }
7758
7759 return domElement;
7760}
7761
7762function createTextNode(text, rootContainerElement) {
7763 return getOwnerDocumentFromRootContainer(rootContainerElement).createTextNode(text);
7764}
7765
7766function setInitialProperties(domElement, tag, rawProps, rootContainerElement) {
7767 var isCustomComponentTag = isCustomComponent(tag, rawProps);
7768 {
7769 validatePropertiesInDevelopment(tag, rawProps);
7770 if (isCustomComponentTag && !didWarnShadyDOM && domElement.shadyRoot) {
7771 warning$1(false, '%s is using shady DOM. Using shady DOM with React can ' + 'cause things to break subtly.', getCurrentFiberOwnerNameInDevOrNull() || 'A component');
7772 didWarnShadyDOM = true;
7773 }
7774 }
7775
7776 // TODO: Make sure that we check isMounted before firing any of these events.
7777 var props = void 0;
7778 switch (tag) {
7779 case 'iframe':
7780 case 'object':
7781 trapBubbledEvent(TOP_LOAD, domElement);
7782 props = rawProps;
7783 break;
7784 case 'video':
7785 case 'audio':
7786 // Create listener for each media event
7787 for (var i = 0; i < mediaEventTypes.length; i++) {
7788 trapBubbledEvent(mediaEventTypes[i], domElement);
7789 }
7790 props = rawProps;
7791 break;
7792 case 'source':
7793 trapBubbledEvent(TOP_ERROR, domElement);
7794 props = rawProps;
7795 break;
7796 case 'img':
7797 case 'image':
7798 case 'link':
7799 trapBubbledEvent(TOP_ERROR, domElement);
7800 trapBubbledEvent(TOP_LOAD, domElement);
7801 props = rawProps;
7802 break;
7803 case 'form':
7804 trapBubbledEvent(TOP_RESET, domElement);
7805 trapBubbledEvent(TOP_SUBMIT, domElement);
7806 props = rawProps;
7807 break;
7808 case 'details':
7809 trapBubbledEvent(TOP_TOGGLE, domElement);
7810 props = rawProps;
7811 break;
7812 case 'input':
7813 initWrapperState(domElement, rawProps);
7814 props = getHostProps(domElement, rawProps);
7815 trapBubbledEvent(TOP_INVALID, domElement);
7816 // For controlled components we always need to ensure we're listening
7817 // to onChange. Even if there is no listener.
7818 ensureListeningTo(rootContainerElement, 'onChange');
7819 break;
7820 case 'option':
7821 validateProps(domElement, rawProps);
7822 props = getHostProps$1(domElement, rawProps);
7823 break;
7824 case 'select':
7825 initWrapperState$1(domElement, rawProps);
7826 props = getHostProps$2(domElement, rawProps);
7827 trapBubbledEvent(TOP_INVALID, domElement);
7828 // For controlled components we always need to ensure we're listening
7829 // to onChange. Even if there is no listener.
7830 ensureListeningTo(rootContainerElement, 'onChange');
7831 break;
7832 case 'textarea':
7833 initWrapperState$2(domElement, rawProps);
7834 props = getHostProps$3(domElement, rawProps);
7835 trapBubbledEvent(TOP_INVALID, domElement);
7836 // For controlled components we always need to ensure we're listening
7837 // to onChange. Even if there is no listener.
7838 ensureListeningTo(rootContainerElement, 'onChange');
7839 break;
7840 default:
7841 props = rawProps;
7842 }
7843
7844 assertValidProps(tag, props);
7845
7846 setInitialDOMProperties(tag, domElement, rootContainerElement, props, isCustomComponentTag);
7847
7848 switch (tag) {
7849 case 'input':
7850 // TODO: Make sure we check if this is still unmounted or do any clean
7851 // up necessary since we never stop tracking anymore.
7852 track(domElement);
7853 postMountWrapper(domElement, rawProps, false);
7854 break;
7855 case 'textarea':
7856 // TODO: Make sure we check if this is still unmounted or do any clean
7857 // up necessary since we never stop tracking anymore.
7858 track(domElement);
7859 postMountWrapper$3(domElement, rawProps);
7860 break;
7861 case 'option':
7862 postMountWrapper$1(domElement, rawProps);
7863 break;
7864 case 'select':
7865 postMountWrapper$2(domElement, rawProps);
7866 break;
7867 default:
7868 if (typeof props.onClick === 'function') {
7869 // TODO: This cast may not be sound for SVG, MathML or custom elements.
7870 trapClickOnNonInteractiveElement(domElement);
7871 }
7872 break;
7873 }
7874}
7875
7876// Calculate the diff between the two objects.
7877function diffProperties(domElement, tag, lastRawProps, nextRawProps, rootContainerElement) {
7878 {
7879 validatePropertiesInDevelopment(tag, nextRawProps);
7880 }
7881
7882 var updatePayload = null;
7883
7884 var lastProps = void 0;
7885 var nextProps = void 0;
7886 switch (tag) {
7887 case 'input':
7888 lastProps = getHostProps(domElement, lastRawProps);
7889 nextProps = getHostProps(domElement, nextRawProps);
7890 updatePayload = [];
7891 break;
7892 case 'option':
7893 lastProps = getHostProps$1(domElement, lastRawProps);
7894 nextProps = getHostProps$1(domElement, nextRawProps);
7895 updatePayload = [];
7896 break;
7897 case 'select':
7898 lastProps = getHostProps$2(domElement, lastRawProps);
7899 nextProps = getHostProps$2(domElement, nextRawProps);
7900 updatePayload = [];
7901 break;
7902 case 'textarea':
7903 lastProps = getHostProps$3(domElement, lastRawProps);
7904 nextProps = getHostProps$3(domElement, nextRawProps);
7905 updatePayload = [];
7906 break;
7907 default:
7908 lastProps = lastRawProps;
7909 nextProps = nextRawProps;
7910 if (typeof lastProps.onClick !== 'function' && typeof nextProps.onClick === 'function') {
7911 // TODO: This cast may not be sound for SVG, MathML or custom elements.
7912 trapClickOnNonInteractiveElement(domElement);
7913 }
7914 break;
7915 }
7916
7917 assertValidProps(tag, nextProps);
7918
7919 var propKey = void 0;
7920 var styleName = void 0;
7921 var styleUpdates = null;
7922 for (propKey in lastProps) {
7923 if (nextProps.hasOwnProperty(propKey) || !lastProps.hasOwnProperty(propKey) || lastProps[propKey] == null) {
7924 continue;
7925 }
7926 if (propKey === STYLE$1) {
7927 var lastStyle = lastProps[propKey];
7928 for (styleName in lastStyle) {
7929 if (lastStyle.hasOwnProperty(styleName)) {
7930 if (!styleUpdates) {
7931 styleUpdates = {};
7932 }
7933 styleUpdates[styleName] = '';
7934 }
7935 }
7936 } else if (propKey === DANGEROUSLY_SET_INNER_HTML || propKey === CHILDREN) {
7937 // Noop. This is handled by the clear text mechanism.
7938 } else if (propKey === SUPPRESS_CONTENT_EDITABLE_WARNING || propKey === SUPPRESS_HYDRATION_WARNING$1) {
7939 // Noop
7940 } else if (propKey === AUTOFOCUS) {
7941 // Noop. It doesn't work on updates anyway.
7942 } else if (registrationNameModules.hasOwnProperty(propKey)) {
7943 // This is a special case. If any listener updates we need to ensure
7944 // that the "current" fiber pointer gets updated so we need a commit
7945 // to update this element.
7946 if (!updatePayload) {
7947 updatePayload = [];
7948 }
7949 } else {
7950 // For all other deleted properties we add it to the queue. We use
7951 // the whitelist in the commit phase instead.
7952 (updatePayload = updatePayload || []).push(propKey, null);
7953 }
7954 }
7955 for (propKey in nextProps) {
7956 var nextProp = nextProps[propKey];
7957 var lastProp = lastProps != null ? lastProps[propKey] : undefined;
7958 if (!nextProps.hasOwnProperty(propKey) || nextProp === lastProp || nextProp == null && lastProp == null) {
7959 continue;
7960 }
7961 if (propKey === STYLE$1) {
7962 {
7963 if (nextProp) {
7964 // Freeze the next style object so that we can assume it won't be
7965 // mutated. We have already warned for this in the past.
7966 Object.freeze(nextProp);
7967 }
7968 }
7969 if (lastProp) {
7970 // Unset styles on `lastProp` but not on `nextProp`.
7971 for (styleName in lastProp) {
7972 if (lastProp.hasOwnProperty(styleName) && (!nextProp || !nextProp.hasOwnProperty(styleName))) {
7973 if (!styleUpdates) {
7974 styleUpdates = {};
7975 }
7976 styleUpdates[styleName] = '';
7977 }
7978 }
7979 // Update styles that changed since `lastProp`.
7980 for (styleName in nextProp) {
7981 if (nextProp.hasOwnProperty(styleName) && lastProp[styleName] !== nextProp[styleName]) {
7982 if (!styleUpdates) {
7983 styleUpdates = {};
7984 }
7985 styleUpdates[styleName] = nextProp[styleName];
7986 }
7987 }
7988 } else {
7989 // Relies on `updateStylesByID` not mutating `styleUpdates`.
7990 if (!styleUpdates) {
7991 if (!updatePayload) {
7992 updatePayload = [];
7993 }
7994 updatePayload.push(propKey, styleUpdates);
7995 }
7996 styleUpdates = nextProp;
7997 }
7998 } else if (propKey === DANGEROUSLY_SET_INNER_HTML) {
7999 var nextHtml = nextProp ? nextProp[HTML] : undefined;
8000 var lastHtml = lastProp ? lastProp[HTML] : undefined;
8001 if (nextHtml != null) {
8002 if (lastHtml !== nextHtml) {
8003 (updatePayload = updatePayload || []).push(propKey, '' + nextHtml);
8004 }
8005 } else {
8006 // TODO: It might be too late to clear this if we have children
8007 // inserted already.
8008 }
8009 } else if (propKey === CHILDREN) {
8010 if (lastProp !== nextProp && (typeof nextProp === 'string' || typeof nextProp === 'number')) {
8011 (updatePayload = updatePayload || []).push(propKey, '' + nextProp);
8012 }
8013 } else if (propKey === SUPPRESS_CONTENT_EDITABLE_WARNING || propKey === SUPPRESS_HYDRATION_WARNING$1) {
8014 // Noop
8015 } else if (registrationNameModules.hasOwnProperty(propKey)) {
8016 if (nextProp != null) {
8017 // We eagerly listen to this even though we haven't committed yet.
8018 if (true && typeof nextProp !== 'function') {
8019 warnForInvalidEventListener(propKey, nextProp);
8020 }
8021 ensureListeningTo(rootContainerElement, propKey);
8022 }
8023 if (!updatePayload && lastProp !== nextProp) {
8024 // This is a special case. If any listener updates we need to ensure
8025 // that the "current" props pointer gets updated so we need a commit
8026 // to update this element.
8027 updatePayload = [];
8028 }
8029 } else {
8030 // For any other property we always add it to the queue and then we
8031 // filter it out using the whitelist during the commit.
8032 (updatePayload = updatePayload || []).push(propKey, nextProp);
8033 }
8034 }
8035 if (styleUpdates) {
8036 {
8037 validateShorthandPropertyCollisionInDev(styleUpdates, nextProps[STYLE$1]);
8038 }
8039 (updatePayload = updatePayload || []).push(STYLE$1, styleUpdates);
8040 }
8041 return updatePayload;
8042}
8043
8044// Apply the diff.
8045function updateProperties(domElement, updatePayload, tag, lastRawProps, nextRawProps) {
8046 // Update checked *before* name.
8047 // In the middle of an update, it is possible to have multiple checked.
8048 // When a checked radio tries to change name, browser makes another radio's checked false.
8049 if (tag === 'input' && nextRawProps.type === 'radio' && nextRawProps.name != null) {
8050 updateChecked(domElement, nextRawProps);
8051 }
8052
8053 var wasCustomComponentTag = isCustomComponent(tag, lastRawProps);
8054 var isCustomComponentTag = isCustomComponent(tag, nextRawProps);
8055 // Apply the diff.
8056 updateDOMProperties(domElement, updatePayload, wasCustomComponentTag, isCustomComponentTag);
8057
8058 // TODO: Ensure that an update gets scheduled if any of the special props
8059 // changed.
8060 switch (tag) {
8061 case 'input':
8062 // Update the wrapper around inputs *after* updating props. This has to
8063 // happen after `updateDOMProperties`. Otherwise HTML5 input validations
8064 // raise warnings and prevent the new value from being assigned.
8065 updateWrapper(domElement, nextRawProps);
8066 break;
8067 case 'textarea':
8068 updateWrapper$1(domElement, nextRawProps);
8069 break;
8070 case 'select':
8071 // <select> value update needs to occur after <option> children
8072 // reconciliation
8073 postUpdateWrapper(domElement, nextRawProps);
8074 break;
8075 }
8076}
8077
8078function getPossibleStandardName(propName) {
8079 {
8080 var lowerCasedName = propName.toLowerCase();
8081 if (!possibleStandardNames.hasOwnProperty(lowerCasedName)) {
8082 return null;
8083 }
8084 return possibleStandardNames[lowerCasedName] || null;
8085 }
8086 return null;
8087}
8088
8089function diffHydratedProperties(domElement, tag, rawProps, parentNamespace, rootContainerElement) {
8090 var isCustomComponentTag = void 0;
8091 var extraAttributeNames = void 0;
8092
8093 {
8094 suppressHydrationWarning = rawProps[SUPPRESS_HYDRATION_WARNING$1] === true;
8095 isCustomComponentTag = isCustomComponent(tag, rawProps);
8096 validatePropertiesInDevelopment(tag, rawProps);
8097 if (isCustomComponentTag && !didWarnShadyDOM && domElement.shadyRoot) {
8098 warning$1(false, '%s is using shady DOM. Using shady DOM with React can ' + 'cause things to break subtly.', getCurrentFiberOwnerNameInDevOrNull() || 'A component');
8099 didWarnShadyDOM = true;
8100 }
8101 }
8102
8103 // TODO: Make sure that we check isMounted before firing any of these events.
8104 switch (tag) {
8105 case 'iframe':
8106 case 'object':
8107 trapBubbledEvent(TOP_LOAD, domElement);
8108 break;
8109 case 'video':
8110 case 'audio':
8111 // Create listener for each media event
8112 for (var i = 0; i < mediaEventTypes.length; i++) {
8113 trapBubbledEvent(mediaEventTypes[i], domElement);
8114 }
8115 break;
8116 case 'source':
8117 trapBubbledEvent(TOP_ERROR, domElement);
8118 break;
8119 case 'img':
8120 case 'image':
8121 case 'link':
8122 trapBubbledEvent(TOP_ERROR, domElement);
8123 trapBubbledEvent(TOP_LOAD, domElement);
8124 break;
8125 case 'form':
8126 trapBubbledEvent(TOP_RESET, domElement);
8127 trapBubbledEvent(TOP_SUBMIT, domElement);
8128 break;
8129 case 'details':
8130 trapBubbledEvent(TOP_TOGGLE, domElement);
8131 break;
8132 case 'input':
8133 initWrapperState(domElement, rawProps);
8134 trapBubbledEvent(TOP_INVALID, domElement);
8135 // For controlled components we always need to ensure we're listening
8136 // to onChange. Even if there is no listener.
8137 ensureListeningTo(rootContainerElement, 'onChange');
8138 break;
8139 case 'option':
8140 validateProps(domElement, rawProps);
8141 break;
8142 case 'select':
8143 initWrapperState$1(domElement, rawProps);
8144 trapBubbledEvent(TOP_INVALID, domElement);
8145 // For controlled components we always need to ensure we're listening
8146 // to onChange. Even if there is no listener.
8147 ensureListeningTo(rootContainerElement, 'onChange');
8148 break;
8149 case 'textarea':
8150 initWrapperState$2(domElement, rawProps);
8151 trapBubbledEvent(TOP_INVALID, domElement);
8152 // For controlled components we always need to ensure we're listening
8153 // to onChange. Even if there is no listener.
8154 ensureListeningTo(rootContainerElement, 'onChange');
8155 break;
8156 }
8157
8158 assertValidProps(tag, rawProps);
8159
8160 {
8161 extraAttributeNames = new Set();
8162 var attributes = domElement.attributes;
8163 for (var _i = 0; _i < attributes.length; _i++) {
8164 var name = attributes[_i].name.toLowerCase();
8165 switch (name) {
8166 // Built-in SSR attribute is whitelisted
8167 case 'data-reactroot':
8168 break;
8169 // Controlled attributes are not validated
8170 // TODO: Only ignore them on controlled tags.
8171 case 'value':
8172 break;
8173 case 'checked':
8174 break;
8175 case 'selected':
8176 break;
8177 default:
8178 // Intentionally use the original name.
8179 // See discussion in https://github.com/facebook/react/pull/10676.
8180 extraAttributeNames.add(attributes[_i].name);
8181 }
8182 }
8183 }
8184
8185 var updatePayload = null;
8186 for (var propKey in rawProps) {
8187 if (!rawProps.hasOwnProperty(propKey)) {
8188 continue;
8189 }
8190 var nextProp = rawProps[propKey];
8191 if (propKey === CHILDREN) {
8192 // For text content children we compare against textContent. This
8193 // might match additional HTML that is hidden when we read it using
8194 // textContent. E.g. "foo" will match "f<span>oo</span>" but that still
8195 // satisfies our requirement. Our requirement is not to produce perfect
8196 // HTML and attributes. Ideally we should preserve structure but it's
8197 // ok not to if the visible content is still enough to indicate what
8198 // even listeners these nodes might be wired up to.
8199 // TODO: Warn if there is more than a single textNode as a child.
8200 // TODO: Should we use domElement.firstChild.nodeValue to compare?
8201 if (typeof nextProp === 'string') {
8202 if (domElement.textContent !== nextProp) {
8203 if (true && !suppressHydrationWarning) {
8204 warnForTextDifference(domElement.textContent, nextProp);
8205 }
8206 updatePayload = [CHILDREN, nextProp];
8207 }
8208 } else if (typeof nextProp === 'number') {
8209 if (domElement.textContent !== '' + nextProp) {
8210 if (true && !suppressHydrationWarning) {
8211 warnForTextDifference(domElement.textContent, nextProp);
8212 }
8213 updatePayload = [CHILDREN, '' + nextProp];
8214 }
8215 }
8216 } else if (registrationNameModules.hasOwnProperty(propKey)) {
8217 if (nextProp != null) {
8218 if (true && typeof nextProp !== 'function') {
8219 warnForInvalidEventListener(propKey, nextProp);
8220 }
8221 ensureListeningTo(rootContainerElement, propKey);
8222 }
8223 } else if (true &&
8224 // Convince Flow we've calculated it (it's DEV-only in this method.)
8225 typeof isCustomComponentTag === 'boolean') {
8226 // Validate that the properties correspond to their expected values.
8227 var serverValue = void 0;
8228 var propertyInfo = getPropertyInfo(propKey);
8229 if (suppressHydrationWarning) {
8230 // Don't bother comparing. We're ignoring all these warnings.
8231 } else if (propKey === SUPPRESS_CONTENT_EDITABLE_WARNING || propKey === SUPPRESS_HYDRATION_WARNING$1 ||
8232 // Controlled attributes are not validated
8233 // TODO: Only ignore them on controlled tags.
8234 propKey === 'value' || propKey === 'checked' || propKey === 'selected') {
8235 // Noop
8236 } else if (propKey === DANGEROUSLY_SET_INNER_HTML) {
8237 var serverHTML = domElement.innerHTML;
8238 var nextHtml = nextProp ? nextProp[HTML] : undefined;
8239 var expectedHTML = normalizeHTML(domElement, nextHtml != null ? nextHtml : '');
8240 if (expectedHTML !== serverHTML) {
8241 warnForPropDifference(propKey, serverHTML, expectedHTML);
8242 }
8243 } else if (propKey === STYLE$1) {
8244 // $FlowFixMe - Should be inferred as not undefined.
8245 extraAttributeNames.delete(propKey);
8246
8247 if (canDiffStyleForHydrationWarning) {
8248 var expectedStyle = createDangerousStringForStyles(nextProp);
8249 serverValue = domElement.getAttribute('style');
8250 if (expectedStyle !== serverValue) {
8251 warnForPropDifference(propKey, serverValue, expectedStyle);
8252 }
8253 }
8254 } else if (isCustomComponentTag) {
8255 // $FlowFixMe - Should be inferred as not undefined.
8256 extraAttributeNames.delete(propKey.toLowerCase());
8257 serverValue = getValueForAttribute(domElement, propKey, nextProp);
8258
8259 if (nextProp !== serverValue) {
8260 warnForPropDifference(propKey, serverValue, nextProp);
8261 }
8262 } else if (!shouldIgnoreAttribute(propKey, propertyInfo, isCustomComponentTag) && !shouldRemoveAttribute(propKey, nextProp, propertyInfo, isCustomComponentTag)) {
8263 var isMismatchDueToBadCasing = false;
8264 if (propertyInfo !== null) {
8265 // $FlowFixMe - Should be inferred as not undefined.
8266 extraAttributeNames.delete(propertyInfo.attributeName);
8267 serverValue = getValueForProperty(domElement, propKey, nextProp, propertyInfo);
8268 } else {
8269 var ownNamespace = parentNamespace;
8270 if (ownNamespace === HTML_NAMESPACE) {
8271 ownNamespace = getIntrinsicNamespace(tag);
8272 }
8273 if (ownNamespace === HTML_NAMESPACE) {
8274 // $FlowFixMe - Should be inferred as not undefined.
8275 extraAttributeNames.delete(propKey.toLowerCase());
8276 } else {
8277 var standardName = getPossibleStandardName(propKey);
8278 if (standardName !== null && standardName !== propKey) {
8279 // If an SVG prop is supplied with bad casing, it will
8280 // be successfully parsed from HTML, but will produce a mismatch
8281 // (and would be incorrectly rendered on the client).
8282 // However, we already warn about bad casing elsewhere.
8283 // So we'll skip the misleading extra mismatch warning in this case.
8284 isMismatchDueToBadCasing = true;
8285 // $FlowFixMe - Should be inferred as not undefined.
8286 extraAttributeNames.delete(standardName);
8287 }
8288 // $FlowFixMe - Should be inferred as not undefined.
8289 extraAttributeNames.delete(propKey);
8290 }
8291 serverValue = getValueForAttribute(domElement, propKey, nextProp);
8292 }
8293
8294 if (nextProp !== serverValue && !isMismatchDueToBadCasing) {
8295 warnForPropDifference(propKey, serverValue, nextProp);
8296 }
8297 }
8298 }
8299 }
8300
8301 {
8302 // $FlowFixMe - Should be inferred as not undefined.
8303 if (extraAttributeNames.size > 0 && !suppressHydrationWarning) {
8304 // $FlowFixMe - Should be inferred as not undefined.
8305 warnForExtraAttributes(extraAttributeNames);
8306 }
8307 }
8308
8309 switch (tag) {
8310 case 'input':
8311 // TODO: Make sure we check if this is still unmounted or do any clean
8312 // up necessary since we never stop tracking anymore.
8313 track(domElement);
8314 postMountWrapper(domElement, rawProps, true);
8315 break;
8316 case 'textarea':
8317 // TODO: Make sure we check if this is still unmounted or do any clean
8318 // up necessary since we never stop tracking anymore.
8319 track(domElement);
8320 postMountWrapper$3(domElement, rawProps);
8321 break;
8322 case 'select':
8323 case 'option':
8324 // For input and textarea we current always set the value property at
8325 // post mount to force it to diverge from attributes. However, for
8326 // option and select we don't quite do the same thing and select
8327 // is not resilient to the DOM state changing so we don't do that here.
8328 // TODO: Consider not doing this for input and textarea.
8329 break;
8330 default:
8331 if (typeof rawProps.onClick === 'function') {
8332 // TODO: This cast may not be sound for SVG, MathML or custom elements.
8333 trapClickOnNonInteractiveElement(domElement);
8334 }
8335 break;
8336 }
8337
8338 return updatePayload;
8339}
8340
8341function diffHydratedText(textNode, text) {
8342 var isDifferent = textNode.nodeValue !== text;
8343 return isDifferent;
8344}
8345
8346function warnForUnmatchedText(textNode, text) {
8347 {
8348 warnForTextDifference(textNode.nodeValue, text);
8349 }
8350}
8351
8352function warnForDeletedHydratableElement(parentNode, child) {
8353 {
8354 if (didWarnInvalidHydration) {
8355 return;
8356 }
8357 didWarnInvalidHydration = true;
8358 warningWithoutStack$1(false, 'Did not expect server HTML to contain a <%s> in <%s>.', child.nodeName.toLowerCase(), parentNode.nodeName.toLowerCase());
8359 }
8360}
8361
8362function warnForDeletedHydratableText(parentNode, child) {
8363 {
8364 if (didWarnInvalidHydration) {
8365 return;
8366 }
8367 didWarnInvalidHydration = true;
8368 warningWithoutStack$1(false, 'Did not expect server HTML to contain the text node "%s" in <%s>.', child.nodeValue, parentNode.nodeName.toLowerCase());
8369 }
8370}
8371
8372function warnForInsertedHydratedElement(parentNode, tag, props) {
8373 {
8374 if (didWarnInvalidHydration) {
8375 return;
8376 }
8377 didWarnInvalidHydration = true;
8378 warningWithoutStack$1(false, 'Expected server HTML to contain a matching <%s> in <%s>.', tag, parentNode.nodeName.toLowerCase());
8379 }
8380}
8381
8382function warnForInsertedHydratedText(parentNode, text) {
8383 {
8384 if (text === '') {
8385 // We expect to insert empty text nodes since they're not represented in
8386 // the HTML.
8387 // TODO: Remove this special case if we can just avoid inserting empty
8388 // text nodes.
8389 return;
8390 }
8391 if (didWarnInvalidHydration) {
8392 return;
8393 }
8394 didWarnInvalidHydration = true;
8395 warningWithoutStack$1(false, 'Expected server HTML to contain a matching text node for "%s" in <%s>.', text, parentNode.nodeName.toLowerCase());
8396 }
8397}
8398
8399function restoreControlledState$1(domElement, tag, props) {
8400 switch (tag) {
8401 case 'input':
8402 restoreControlledState(domElement, props);
8403 return;
8404 case 'textarea':
8405 restoreControlledState$3(domElement, props);
8406 return;
8407 case 'select':
8408 restoreControlledState$2(domElement, props);
8409 return;
8410 }
8411}
8412
8413// TODO: direct imports like some-package/src/* are bad. Fix me.
8414var validateDOMNesting = function () {};
8415var updatedAncestorInfo = function () {};
8416
8417{
8418 // This validation code was written based on the HTML5 parsing spec:
8419 // https://html.spec.whatwg.org/multipage/syntax.html#has-an-element-in-scope
8420 //
8421 // Note: this does not catch all invalid nesting, nor does it try to (as it's
8422 // not clear what practical benefit doing so provides); instead, we warn only
8423 // for cases where the parser will give a parse tree differing from what React
8424 // intended. For example, <b><div></div></b> is invalid but we don't warn
8425 // because it still parses correctly; we do warn for other cases like nested
8426 // <p> tags where the beginning of the second element implicitly closes the
8427 // first, causing a confusing mess.
8428
8429 // https://html.spec.whatwg.org/multipage/syntax.html#special
8430 var specialTags = ['address', 'applet', 'area', 'article', 'aside', 'base', 'basefont', 'bgsound', 'blockquote', 'body', 'br', 'button', 'caption', 'center', 'col', 'colgroup', 'dd', 'details', 'dir', 'div', 'dl', 'dt', 'embed', 'fieldset', 'figcaption', 'figure', 'footer', 'form', 'frame', 'frameset', 'h1', 'h2', 'h3', 'h4', 'h5', 'h6', 'head', 'header', 'hgroup', 'hr', 'html', 'iframe', 'img', 'input', 'isindex', 'li', 'link', 'listing', 'main', 'marquee', 'menu', 'menuitem', 'meta', 'nav', 'noembed', 'noframes', 'noscript', 'object', 'ol', 'p', 'param', 'plaintext', 'pre', 'script', 'section', 'select', 'source', 'style', 'summary', 'table', 'tbody', 'td', 'template', 'textarea', 'tfoot', 'th', 'thead', 'title', 'tr', 'track', 'ul', 'wbr', 'xmp'];
8431
8432 // https://html.spec.whatwg.org/multipage/syntax.html#has-an-element-in-scope
8433 var inScopeTags = ['applet', 'caption', 'html', 'table', 'td', 'th', 'marquee', 'object', 'template',
8434
8435 // https://html.spec.whatwg.org/multipage/syntax.html#html-integration-point
8436 // TODO: Distinguish by namespace here -- for <title>, including it here
8437 // errs on the side of fewer warnings
8438 'foreignObject', 'desc', 'title'];
8439
8440 // https://html.spec.whatwg.org/multipage/syntax.html#has-an-element-in-button-scope
8441 var buttonScopeTags = inScopeTags.concat(['button']);
8442
8443 // https://html.spec.whatwg.org/multipage/syntax.html#generate-implied-end-tags
8444 var impliedEndTags = ['dd', 'dt', 'li', 'option', 'optgroup', 'p', 'rp', 'rt'];
8445
8446 var emptyAncestorInfo = {
8447 current: null,
8448
8449 formTag: null,
8450 aTagInScope: null,
8451 buttonTagInScope: null,
8452 nobrTagInScope: null,
8453 pTagInButtonScope: null,
8454
8455 listItemTagAutoclosing: null,
8456 dlItemTagAutoclosing: null
8457 };
8458
8459 updatedAncestorInfo = function (oldInfo, tag) {
8460 var ancestorInfo = _assign({}, oldInfo || emptyAncestorInfo);
8461 var info = { tag: tag };
8462
8463 if (inScopeTags.indexOf(tag) !== -1) {
8464 ancestorInfo.aTagInScope = null;
8465 ancestorInfo.buttonTagInScope = null;
8466 ancestorInfo.nobrTagInScope = null;
8467 }
8468 if (buttonScopeTags.indexOf(tag) !== -1) {
8469 ancestorInfo.pTagInButtonScope = null;
8470 }
8471
8472 // See rules for 'li', 'dd', 'dt' start tags in
8473 // https://html.spec.whatwg.org/multipage/syntax.html#parsing-main-inbody
8474 if (specialTags.indexOf(tag) !== -1 && tag !== 'address' && tag !== 'div' && tag !== 'p') {
8475 ancestorInfo.listItemTagAutoclosing = null;
8476 ancestorInfo.dlItemTagAutoclosing = null;
8477 }
8478
8479 ancestorInfo.current = info;
8480
8481 if (tag === 'form') {
8482 ancestorInfo.formTag = info;
8483 }
8484 if (tag === 'a') {
8485 ancestorInfo.aTagInScope = info;
8486 }
8487 if (tag === 'button') {
8488 ancestorInfo.buttonTagInScope = info;
8489 }
8490 if (tag === 'nobr') {
8491 ancestorInfo.nobrTagInScope = info;
8492 }
8493 if (tag === 'p') {
8494 ancestorInfo.pTagInButtonScope = info;
8495 }
8496 if (tag === 'li') {
8497 ancestorInfo.listItemTagAutoclosing = info;
8498 }
8499 if (tag === 'dd' || tag === 'dt') {
8500 ancestorInfo.dlItemTagAutoclosing = info;
8501 }
8502
8503 return ancestorInfo;
8504 };
8505
8506 /**
8507 * Returns whether
8508 */
8509 var isTagValidWithParent = function (tag, parentTag) {
8510 // First, let's check if we're in an unusual parsing mode...
8511 switch (parentTag) {
8512 // https://html.spec.whatwg.org/multipage/syntax.html#parsing-main-inselect
8513 case 'select':
8514 return tag === 'option' || tag === 'optgroup' || tag === '#text';
8515 case 'optgroup':
8516 return tag === 'option' || tag === '#text';
8517 // Strictly speaking, seeing an <option> doesn't mean we're in a <select>
8518 // but
8519 case 'option':
8520 return tag === '#text';
8521 // https://html.spec.whatwg.org/multipage/syntax.html#parsing-main-intd
8522 // https://html.spec.whatwg.org/multipage/syntax.html#parsing-main-incaption
8523 // No special behavior since these rules fall back to "in body" mode for
8524 // all except special table nodes which cause bad parsing behavior anyway.
8525
8526 // https://html.spec.whatwg.org/multipage/syntax.html#parsing-main-intr
8527 case 'tr':
8528 return tag === 'th' || tag === 'td' || tag === 'style' || tag === 'script' || tag === 'template';
8529 // https://html.spec.whatwg.org/multipage/syntax.html#parsing-main-intbody
8530 case 'tbody':
8531 case 'thead':
8532 case 'tfoot':
8533 return tag === 'tr' || tag === 'style' || tag === 'script' || tag === 'template';
8534 // https://html.spec.whatwg.org/multipage/syntax.html#parsing-main-incolgroup
8535 case 'colgroup':
8536 return tag === 'col' || tag === 'template';
8537 // https://html.spec.whatwg.org/multipage/syntax.html#parsing-main-intable
8538 case 'table':
8539 return tag === 'caption' || tag === 'colgroup' || tag === 'tbody' || tag === 'tfoot' || tag === 'thead' || tag === 'style' || tag === 'script' || tag === 'template';
8540 // https://html.spec.whatwg.org/multipage/syntax.html#parsing-main-inhead
8541 case 'head':
8542 return tag === 'base' || tag === 'basefont' || tag === 'bgsound' || tag === 'link' || tag === 'meta' || tag === 'title' || tag === 'noscript' || tag === 'noframes' || tag === 'style' || tag === 'script' || tag === 'template';
8543 // https://html.spec.whatwg.org/multipage/semantics.html#the-html-element
8544 case 'html':
8545 return tag === 'head' || tag === 'body';
8546 case '#document':
8547 return tag === 'html';
8548 }
8549
8550 // Probably in the "in body" parsing mode, so we outlaw only tag combos
8551 // where the parsing rules cause implicit opens or closes to be added.
8552 // https://html.spec.whatwg.org/multipage/syntax.html#parsing-main-inbody
8553 switch (tag) {
8554 case 'h1':
8555 case 'h2':
8556 case 'h3':
8557 case 'h4':
8558 case 'h5':
8559 case 'h6':
8560 return parentTag !== 'h1' && parentTag !== 'h2' && parentTag !== 'h3' && parentTag !== 'h4' && parentTag !== 'h5' && parentTag !== 'h6';
8561
8562 case 'rp':
8563 case 'rt':
8564 return impliedEndTags.indexOf(parentTag) === -1;
8565
8566 case 'body':
8567 case 'caption':
8568 case 'col':
8569 case 'colgroup':
8570 case 'frame':
8571 case 'head':
8572 case 'html':
8573 case 'tbody':
8574 case 'td':
8575 case 'tfoot':
8576 case 'th':
8577 case 'thead':
8578 case 'tr':
8579 // These tags are only valid with a few parents that have special child
8580 // parsing rules -- if we're down here, then none of those matched and
8581 // so we allow it only if we don't know what the parent is, as all other
8582 // cases are invalid.
8583 return parentTag == null;
8584 }
8585
8586 return true;
8587 };
8588
8589 /**
8590 * Returns whether
8591 */
8592 var findInvalidAncestorForTag = function (tag, ancestorInfo) {
8593 switch (tag) {
8594 case 'address':
8595 case 'article':
8596 case 'aside':
8597 case 'blockquote':
8598 case 'center':
8599 case 'details':
8600 case 'dialog':
8601 case 'dir':
8602 case 'div':
8603 case 'dl':
8604 case 'fieldset':
8605 case 'figcaption':
8606 case 'figure':
8607 case 'footer':
8608 case 'header':
8609 case 'hgroup':
8610 case 'main':
8611 case 'menu':
8612 case 'nav':
8613 case 'ol':
8614 case 'p':
8615 case 'section':
8616 case 'summary':
8617 case 'ul':
8618 case 'pre':
8619 case 'listing':
8620 case 'table':
8621 case 'hr':
8622 case 'xmp':
8623 case 'h1':
8624 case 'h2':
8625 case 'h3':
8626 case 'h4':
8627 case 'h5':
8628 case 'h6':
8629 return ancestorInfo.pTagInButtonScope;
8630
8631 case 'form':
8632 return ancestorInfo.formTag || ancestorInfo.pTagInButtonScope;
8633
8634 case 'li':
8635 return ancestorInfo.listItemTagAutoclosing;
8636
8637 case 'dd':
8638 case 'dt':
8639 return ancestorInfo.dlItemTagAutoclosing;
8640
8641 case 'button':
8642 return ancestorInfo.buttonTagInScope;
8643
8644 case 'a':
8645 // Spec says something about storing a list of markers, but it sounds
8646 // equivalent to this check.
8647 return ancestorInfo.aTagInScope;
8648
8649 case 'nobr':
8650 return ancestorInfo.nobrTagInScope;
8651 }
8652
8653 return null;
8654 };
8655
8656 var didWarn = {};
8657
8658 validateDOMNesting = function (childTag, childText, ancestorInfo) {
8659 ancestorInfo = ancestorInfo || emptyAncestorInfo;
8660 var parentInfo = ancestorInfo.current;
8661 var parentTag = parentInfo && parentInfo.tag;
8662
8663 if (childText != null) {
8664 !(childTag == null) ? warningWithoutStack$1(false, 'validateDOMNesting: when childText is passed, childTag should be null') : void 0;
8665 childTag = '#text';
8666 }
8667
8668 var invalidParent = isTagValidWithParent(childTag, parentTag) ? null : parentInfo;
8669 var invalidAncestor = invalidParent ? null : findInvalidAncestorForTag(childTag, ancestorInfo);
8670 var invalidParentOrAncestor = invalidParent || invalidAncestor;
8671 if (!invalidParentOrAncestor) {
8672 return;
8673 }
8674
8675 var ancestorTag = invalidParentOrAncestor.tag;
8676 var addendum = getCurrentFiberStackInDev();
8677
8678 var warnKey = !!invalidParent + '|' + childTag + '|' + ancestorTag + '|' + addendum;
8679 if (didWarn[warnKey]) {
8680 return;
8681 }
8682 didWarn[warnKey] = true;
8683
8684 var tagDisplayName = childTag;
8685 var whitespaceInfo = '';
8686 if (childTag === '#text') {
8687 if (/\S/.test(childText)) {
8688 tagDisplayName = 'Text nodes';
8689 } else {
8690 tagDisplayName = 'Whitespace text nodes';
8691 whitespaceInfo = " Make sure you don't have any extra whitespace between tags on " + 'each line of your source code.';
8692 }
8693 } else {
8694 tagDisplayName = '<' + childTag + '>';
8695 }
8696
8697 if (invalidParent) {
8698 var info = '';
8699 if (ancestorTag === 'table' && childTag === 'tr') {
8700 info += ' Add a <tbody> to your code to match the DOM tree generated by ' + 'the browser.';
8701 }
8702 warningWithoutStack$1(false, 'validateDOMNesting(...): %s cannot appear as a child of <%s>.%s%s%s', tagDisplayName, ancestorTag, whitespaceInfo, info, addendum);
8703 } else {
8704 warningWithoutStack$1(false, 'validateDOMNesting(...): %s cannot appear as a descendant of ' + '<%s>.%s', tagDisplayName, ancestorTag, addendum);
8705 }
8706 };
8707}
8708
8709var ReactInternals$1 = React.__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED;
8710
8711var _ReactInternals$Sched = ReactInternals$1.Scheduler;
8712var unstable_cancelCallback = _ReactInternals$Sched.unstable_cancelCallback;
8713var unstable_now = _ReactInternals$Sched.unstable_now;
8714var unstable_scheduleCallback = _ReactInternals$Sched.unstable_scheduleCallback;
8715var unstable_shouldYield = _ReactInternals$Sched.unstable_shouldYield;
8716var unstable_getFirstCallbackNode = _ReactInternals$Sched.unstable_getFirstCallbackNode;
8717var unstable_runWithPriority = _ReactInternals$Sched.unstable_runWithPriority;
8718var unstable_next = _ReactInternals$Sched.unstable_next;
8719var unstable_continueExecution = _ReactInternals$Sched.unstable_continueExecution;
8720var unstable_pauseExecution = _ReactInternals$Sched.unstable_pauseExecution;
8721var unstable_getCurrentPriorityLevel = _ReactInternals$Sched.unstable_getCurrentPriorityLevel;
8722var unstable_ImmediatePriority = _ReactInternals$Sched.unstable_ImmediatePriority;
8723var unstable_UserBlockingPriority = _ReactInternals$Sched.unstable_UserBlockingPriority;
8724var unstable_NormalPriority = _ReactInternals$Sched.unstable_NormalPriority;
8725var unstable_LowPriority = _ReactInternals$Sched.unstable_LowPriority;
8726var unstable_IdlePriority = _ReactInternals$Sched.unstable_IdlePriority;
8727
8728// Renderers that don't support persistence
8729// can re-export everything from this module.
8730
8731function shim() {
8732 invariant(false, 'The current renderer does not support persistence. This error is likely caused by a bug in React. Please file an issue.');
8733}
8734
8735// Persistence (when unsupported)
8736var supportsPersistence = false;
8737var cloneInstance = shim;
8738var createContainerChildSet = shim;
8739var appendChildToContainerChildSet = shim;
8740var finalizeContainerChildren = shim;
8741var replaceContainerChildren = shim;
8742var cloneHiddenInstance = shim;
8743var cloneUnhiddenInstance = shim;
8744var createHiddenTextInstance = shim;
8745
8746var SUPPRESS_HYDRATION_WARNING = void 0;
8747{
8748 SUPPRESS_HYDRATION_WARNING = 'suppressHydrationWarning';
8749}
8750
8751var SUSPENSE_START_DATA = '$';
8752var SUSPENSE_END_DATA = '/$';
8753
8754var STYLE = 'style';
8755
8756var eventsEnabled = null;
8757var selectionInformation = null;
8758
8759function shouldAutoFocusHostComponent(type, props) {
8760 switch (type) {
8761 case 'button':
8762 case 'input':
8763 case 'select':
8764 case 'textarea':
8765 return !!props.autoFocus;
8766 }
8767 return false;
8768}
8769
8770function getRootHostContext(rootContainerInstance) {
8771 var type = void 0;
8772 var namespace = void 0;
8773 var nodeType = rootContainerInstance.nodeType;
8774 switch (nodeType) {
8775 case DOCUMENT_NODE:
8776 case DOCUMENT_FRAGMENT_NODE:
8777 {
8778 type = nodeType === DOCUMENT_NODE ? '#document' : '#fragment';
8779 var root = rootContainerInstance.documentElement;
8780 namespace = root ? root.namespaceURI : getChildNamespace(null, '');
8781 break;
8782 }
8783 default:
8784 {
8785 var container = nodeType === COMMENT_NODE ? rootContainerInstance.parentNode : rootContainerInstance;
8786 var ownNamespace = container.namespaceURI || null;
8787 type = container.tagName;
8788 namespace = getChildNamespace(ownNamespace, type);
8789 break;
8790 }
8791 }
8792 {
8793 var validatedTag = type.toLowerCase();
8794 var _ancestorInfo = updatedAncestorInfo(null, validatedTag);
8795 return { namespace: namespace, ancestorInfo: _ancestorInfo };
8796 }
8797 return namespace;
8798}
8799
8800function getChildHostContext(parentHostContext, type, rootContainerInstance) {
8801 {
8802 var parentHostContextDev = parentHostContext;
8803 var _namespace = getChildNamespace(parentHostContextDev.namespace, type);
8804 var _ancestorInfo2 = updatedAncestorInfo(parentHostContextDev.ancestorInfo, type);
8805 return { namespace: _namespace, ancestorInfo: _ancestorInfo2 };
8806 }
8807 var parentNamespace = parentHostContext;
8808 return getChildNamespace(parentNamespace, type);
8809}
8810
8811function getPublicInstance(instance) {
8812 return instance;
8813}
8814
8815function prepareForCommit(containerInfo) {
8816 eventsEnabled = isEnabled();
8817 selectionInformation = getSelectionInformation();
8818 setEnabled(false);
8819}
8820
8821function resetAfterCommit(containerInfo) {
8822 restoreSelection(selectionInformation);
8823 selectionInformation = null;
8824 setEnabled(eventsEnabled);
8825 eventsEnabled = null;
8826}
8827
8828function createInstance(type, props, rootContainerInstance, hostContext, internalInstanceHandle) {
8829 var parentNamespace = void 0;
8830 {
8831 // TODO: take namespace into account when validating.
8832 var hostContextDev = hostContext;
8833 validateDOMNesting(type, null, hostContextDev.ancestorInfo);
8834 if (typeof props.children === 'string' || typeof props.children === 'number') {
8835 var string = '' + props.children;
8836 var ownAncestorInfo = updatedAncestorInfo(hostContextDev.ancestorInfo, type);
8837 validateDOMNesting(null, string, ownAncestorInfo);
8838 }
8839 parentNamespace = hostContextDev.namespace;
8840 }
8841 var domElement = createElement(type, props, rootContainerInstance, parentNamespace);
8842 precacheFiberNode(internalInstanceHandle, domElement);
8843 updateFiberProps(domElement, props);
8844 return domElement;
8845}
8846
8847function appendInitialChild(parentInstance, child) {
8848 parentInstance.appendChild(child);
8849}
8850
8851function finalizeInitialChildren(domElement, type, props, rootContainerInstance, hostContext) {
8852 setInitialProperties(domElement, type, props, rootContainerInstance);
8853 return shouldAutoFocusHostComponent(type, props);
8854}
8855
8856function prepareUpdate(domElement, type, oldProps, newProps, rootContainerInstance, hostContext) {
8857 {
8858 var hostContextDev = hostContext;
8859 if (typeof newProps.children !== typeof oldProps.children && (typeof newProps.children === 'string' || typeof newProps.children === 'number')) {
8860 var string = '' + newProps.children;
8861 var ownAncestorInfo = updatedAncestorInfo(hostContextDev.ancestorInfo, type);
8862 validateDOMNesting(null, string, ownAncestorInfo);
8863 }
8864 }
8865 return diffProperties(domElement, type, oldProps, newProps, rootContainerInstance);
8866}
8867
8868function shouldSetTextContent(type, props) {
8869 return type === 'textarea' || type === 'option' || type === 'noscript' || typeof props.children === 'string' || typeof props.children === 'number' || typeof props.dangerouslySetInnerHTML === 'object' && props.dangerouslySetInnerHTML !== null && props.dangerouslySetInnerHTML.__html != null;
8870}
8871
8872function shouldDeprioritizeSubtree(type, props) {
8873 return !!props.hidden;
8874}
8875
8876function createTextInstance(text, rootContainerInstance, hostContext, internalInstanceHandle) {
8877 {
8878 var hostContextDev = hostContext;
8879 validateDOMNesting(null, text, hostContextDev.ancestorInfo);
8880 }
8881 var textNode = createTextNode(text, rootContainerInstance);
8882 precacheFiberNode(internalInstanceHandle, textNode);
8883 return textNode;
8884}
8885
8886var isPrimaryRenderer = true;
8887// This initialization code may run even on server environments
8888// if a component just imports ReactDOM (e.g. for findDOMNode).
8889// Some environments might not have setTimeout or clearTimeout.
8890var scheduleTimeout = typeof setTimeout === 'function' ? setTimeout : undefined;
8891var cancelTimeout = typeof clearTimeout === 'function' ? clearTimeout : undefined;
8892var noTimeout = -1;
8893var schedulePassiveEffects = unstable_scheduleCallback;
8894var cancelPassiveEffects = unstable_cancelCallback;
8895
8896// -------------------
8897// Mutation
8898// -------------------
8899
8900var supportsMutation = true;
8901
8902function commitMount(domElement, type, newProps, internalInstanceHandle) {
8903 // Despite the naming that might imply otherwise, this method only
8904 // fires if there is an `Update` effect scheduled during mounting.
8905 // This happens if `finalizeInitialChildren` returns `true` (which it
8906 // does to implement the `autoFocus` attribute on the client). But
8907 // there are also other cases when this might happen (such as patching
8908 // up text content during hydration mismatch). So we'll check this again.
8909 if (shouldAutoFocusHostComponent(type, newProps)) {
8910 domElement.focus();
8911 }
8912}
8913
8914function commitUpdate(domElement, updatePayload, type, oldProps, newProps, internalInstanceHandle) {
8915 // Update the props handle so that we know which props are the ones with
8916 // with current event handlers.
8917 updateFiberProps(domElement, newProps);
8918 // Apply the diff to the DOM node.
8919 updateProperties(domElement, updatePayload, type, oldProps, newProps);
8920}
8921
8922function resetTextContent(domElement) {
8923 setTextContent(domElement, '');
8924}
8925
8926function commitTextUpdate(textInstance, oldText, newText) {
8927 textInstance.nodeValue = newText;
8928}
8929
8930function appendChild(parentInstance, child) {
8931 parentInstance.appendChild(child);
8932}
8933
8934function appendChildToContainer(container, child) {
8935 var parentNode = void 0;
8936 if (container.nodeType === COMMENT_NODE) {
8937 parentNode = container.parentNode;
8938 parentNode.insertBefore(child, container);
8939 } else {
8940 parentNode = container;
8941 parentNode.appendChild(child);
8942 }
8943 // This container might be used for a portal.
8944 // If something inside a portal is clicked, that click should bubble
8945 // through the React tree. However, on Mobile Safari the click would
8946 // never bubble through the *DOM* tree unless an ancestor with onclick
8947 // event exists. So we wouldn't see it and dispatch it.
8948 // This is why we ensure that non React root containers have inline onclick
8949 // defined.
8950 // https://github.com/facebook/react/issues/11918
8951 var reactRootContainer = container._reactRootContainer;
8952 if ((reactRootContainer === null || reactRootContainer === undefined) && parentNode.onclick === null) {
8953 // TODO: This cast may not be sound for SVG, MathML or custom elements.
8954 trapClickOnNonInteractiveElement(parentNode);
8955 }
8956}
8957
8958function insertBefore(parentInstance, child, beforeChild) {
8959 parentInstance.insertBefore(child, beforeChild);
8960}
8961
8962function insertInContainerBefore(container, child, beforeChild) {
8963 if (container.nodeType === COMMENT_NODE) {
8964 container.parentNode.insertBefore(child, beforeChild);
8965 } else {
8966 container.insertBefore(child, beforeChild);
8967 }
8968}
8969
8970function removeChild(parentInstance, child) {
8971 parentInstance.removeChild(child);
8972}
8973
8974function removeChildFromContainer(container, child) {
8975 if (container.nodeType === COMMENT_NODE) {
8976 container.parentNode.removeChild(child);
8977 } else {
8978 container.removeChild(child);
8979 }
8980}
8981
8982function clearSuspenseBoundary(parentInstance, suspenseInstance) {
8983 var node = suspenseInstance;
8984 // Delete all nodes within this suspense boundary.
8985 // There might be nested nodes so we need to keep track of how
8986 // deep we are and only break out when we're back on top.
8987 var depth = 0;
8988 do {
8989 var nextNode = node.nextSibling;
8990 parentInstance.removeChild(node);
8991 if (nextNode && nextNode.nodeType === COMMENT_NODE) {
8992 var data = nextNode.data;
8993 if (data === SUSPENSE_END_DATA) {
8994 if (depth === 0) {
8995 parentInstance.removeChild(nextNode);
8996 return;
8997 } else {
8998 depth--;
8999 }
9000 } else if (data === SUSPENSE_START_DATA) {
9001 depth++;
9002 }
9003 }
9004 node = nextNode;
9005 } while (node);
9006 // TODO: Warn, we didn't find the end comment boundary.
9007}
9008
9009function clearSuspenseBoundaryFromContainer(container, suspenseInstance) {
9010 if (container.nodeType === COMMENT_NODE) {
9011 clearSuspenseBoundary(container.parentNode, suspenseInstance);
9012 } else if (container.nodeType === ELEMENT_NODE) {
9013 clearSuspenseBoundary(container, suspenseInstance);
9014 } else {
9015 // Document nodes should never contain suspense boundaries.
9016 }
9017}
9018
9019function hideInstance(instance) {
9020 // TODO: Does this work for all element types? What about MathML? Should we
9021 // pass host context to this method?
9022 instance = instance;
9023 instance.style.display = 'none';
9024}
9025
9026function hideTextInstance(textInstance) {
9027 textInstance.nodeValue = '';
9028}
9029
9030function unhideInstance(instance, props) {
9031 instance = instance;
9032 var styleProp = props[STYLE];
9033 var display = styleProp !== undefined && styleProp !== null && styleProp.hasOwnProperty('display') ? styleProp.display : null;
9034 instance.style.display = dangerousStyleValue('display', display);
9035}
9036
9037function unhideTextInstance(textInstance, text) {
9038 textInstance.nodeValue = text;
9039}
9040
9041// -------------------
9042// Hydration
9043// -------------------
9044
9045var supportsHydration = true;
9046
9047function canHydrateInstance(instance, type, props) {
9048 if (instance.nodeType !== ELEMENT_NODE || type.toLowerCase() !== instance.nodeName.toLowerCase()) {
9049 return null;
9050 }
9051 // This has now been refined to an element node.
9052 return instance;
9053}
9054
9055function canHydrateTextInstance(instance, text) {
9056 if (text === '' || instance.nodeType !== TEXT_NODE) {
9057 // Empty strings are not parsed by HTML so there won't be a correct match here.
9058 return null;
9059 }
9060 // This has now been refined to a text node.
9061 return instance;
9062}
9063
9064function canHydrateSuspenseInstance(instance) {
9065 if (instance.nodeType !== COMMENT_NODE) {
9066 // Empty strings are not parsed by HTML so there won't be a correct match here.
9067 return null;
9068 }
9069 // This has now been refined to a suspense node.
9070 return instance;
9071}
9072
9073function getNextHydratableSibling(instance) {
9074 var node = instance.nextSibling;
9075 // Skip non-hydratable nodes.
9076 while (node && node.nodeType !== ELEMENT_NODE && node.nodeType !== TEXT_NODE && (!enableSuspenseServerRenderer || node.nodeType !== COMMENT_NODE || node.data !== SUSPENSE_START_DATA)) {
9077 node = node.nextSibling;
9078 }
9079 return node;
9080}
9081
9082function getFirstHydratableChild(parentInstance) {
9083 var next = parentInstance.firstChild;
9084 // Skip non-hydratable nodes.
9085 while (next && next.nodeType !== ELEMENT_NODE && next.nodeType !== TEXT_NODE && (!enableSuspenseServerRenderer || next.nodeType !== COMMENT_NODE || next.data !== SUSPENSE_START_DATA)) {
9086 next = next.nextSibling;
9087 }
9088 return next;
9089}
9090
9091function hydrateInstance(instance, type, props, rootContainerInstance, hostContext, internalInstanceHandle) {
9092 precacheFiberNode(internalInstanceHandle, instance);
9093 // TODO: Possibly defer this until the commit phase where all the events
9094 // get attached.
9095 updateFiberProps(instance, props);
9096 var parentNamespace = void 0;
9097 {
9098 var hostContextDev = hostContext;
9099 parentNamespace = hostContextDev.namespace;
9100 }
9101 return diffHydratedProperties(instance, type, props, parentNamespace, rootContainerInstance);
9102}
9103
9104function hydrateTextInstance(textInstance, text, internalInstanceHandle) {
9105 precacheFiberNode(internalInstanceHandle, textInstance);
9106 return diffHydratedText(textInstance, text);
9107}
9108
9109function getNextHydratableInstanceAfterSuspenseInstance(suspenseInstance) {
9110 var node = suspenseInstance.nextSibling;
9111 // Skip past all nodes within this suspense boundary.
9112 // There might be nested nodes so we need to keep track of how
9113 // deep we are and only break out when we're back on top.
9114 var depth = 0;
9115 while (node) {
9116 if (node.nodeType === COMMENT_NODE) {
9117 var data = node.data;
9118 if (data === SUSPENSE_END_DATA) {
9119 if (depth === 0) {
9120 return getNextHydratableSibling(node);
9121 } else {
9122 depth--;
9123 }
9124 } else if (data === SUSPENSE_START_DATA) {
9125 depth++;
9126 }
9127 }
9128 node = node.nextSibling;
9129 }
9130 // TODO: Warn, we didn't find the end comment boundary.
9131 return null;
9132}
9133
9134function didNotMatchHydratedContainerTextInstance(parentContainer, textInstance, text) {
9135 {
9136 warnForUnmatchedText(textInstance, text);
9137 }
9138}
9139
9140function didNotMatchHydratedTextInstance(parentType, parentProps, parentInstance, textInstance, text) {
9141 if (true && parentProps[SUPPRESS_HYDRATION_WARNING] !== true) {
9142 warnForUnmatchedText(textInstance, text);
9143 }
9144}
9145
9146function didNotHydrateContainerInstance(parentContainer, instance) {
9147 {
9148 if (instance.nodeType === ELEMENT_NODE) {
9149 warnForDeletedHydratableElement(parentContainer, instance);
9150 } else if (instance.nodeType === COMMENT_NODE) {
9151 // TODO: warnForDeletedHydratableSuspenseBoundary
9152 } else {
9153 warnForDeletedHydratableText(parentContainer, instance);
9154 }
9155 }
9156}
9157
9158function didNotHydrateInstance(parentType, parentProps, parentInstance, instance) {
9159 if (true && parentProps[SUPPRESS_HYDRATION_WARNING] !== true) {
9160 if (instance.nodeType === ELEMENT_NODE) {
9161 warnForDeletedHydratableElement(parentInstance, instance);
9162 } else if (instance.nodeType === COMMENT_NODE) {
9163 // TODO: warnForDeletedHydratableSuspenseBoundary
9164 } else {
9165 warnForDeletedHydratableText(parentInstance, instance);
9166 }
9167 }
9168}
9169
9170function didNotFindHydratableContainerInstance(parentContainer, type, props) {
9171 {
9172 warnForInsertedHydratedElement(parentContainer, type, props);
9173 }
9174}
9175
9176function didNotFindHydratableContainerTextInstance(parentContainer, text) {
9177 {
9178 warnForInsertedHydratedText(parentContainer, text);
9179 }
9180}
9181
9182
9183
9184function didNotFindHydratableInstance(parentType, parentProps, parentInstance, type, props) {
9185 if (true && parentProps[SUPPRESS_HYDRATION_WARNING] !== true) {
9186 warnForInsertedHydratedElement(parentInstance, type, props);
9187 }
9188}
9189
9190function didNotFindHydratableTextInstance(parentType, parentProps, parentInstance, text) {
9191 if (true && parentProps[SUPPRESS_HYDRATION_WARNING] !== true) {
9192 warnForInsertedHydratedText(parentInstance, text);
9193 }
9194}
9195
9196function didNotFindHydratableSuspenseInstance(parentType, parentProps, parentInstance) {
9197 if (true && parentProps[SUPPRESS_HYDRATION_WARNING] !== true) {
9198 // TODO: warnForInsertedHydratedSuspense(parentInstance);
9199 }
9200}
9201
9202// Prefix measurements so that it's possible to filter them.
9203// Longer prefixes are hard to read in DevTools.
9204var reactEmoji = '\u269B';
9205var warningEmoji = '\u26D4';
9206var supportsUserTiming = typeof performance !== 'undefined' && typeof performance.mark === 'function' && typeof performance.clearMarks === 'function' && typeof performance.measure === 'function' && typeof performance.clearMeasures === 'function';
9207
9208// Keep track of current fiber so that we know the path to unwind on pause.
9209// TODO: this looks the same as nextUnitOfWork in scheduler. Can we unify them?
9210var currentFiber = null;
9211// If we're in the middle of user code, which fiber and method is it?
9212// Reusing `currentFiber` would be confusing for this because user code fiber
9213// can change during commit phase too, but we don't need to unwind it (since
9214// lifecycles in the commit phase don't resemble a tree).
9215var currentPhase = null;
9216var currentPhaseFiber = null;
9217// Did lifecycle hook schedule an update? This is often a performance problem,
9218// so we will keep track of it, and include it in the report.
9219// Track commits caused by cascading updates.
9220var isCommitting = false;
9221var hasScheduledUpdateInCurrentCommit = false;
9222var hasScheduledUpdateInCurrentPhase = false;
9223var commitCountInCurrentWorkLoop = 0;
9224var effectCountInCurrentCommit = 0;
9225var isWaitingForCallback = false;
9226// During commits, we only show a measurement once per method name
9227// to avoid stretch the commit phase with measurement overhead.
9228var labelsInCurrentCommit = new Set();
9229
9230var formatMarkName = function (markName) {
9231 return reactEmoji + ' ' + markName;
9232};
9233
9234var formatLabel = function (label, warning) {
9235 var prefix = warning ? warningEmoji + ' ' : reactEmoji + ' ';
9236 var suffix = warning ? ' Warning: ' + warning : '';
9237 return '' + prefix + label + suffix;
9238};
9239
9240var beginMark = function (markName) {
9241 performance.mark(formatMarkName(markName));
9242};
9243
9244var clearMark = function (markName) {
9245 performance.clearMarks(formatMarkName(markName));
9246};
9247
9248var endMark = function (label, markName, warning) {
9249 var formattedMarkName = formatMarkName(markName);
9250 var formattedLabel = formatLabel(label, warning);
9251 try {
9252 performance.measure(formattedLabel, formattedMarkName);
9253 } catch (err) {}
9254 // If previous mark was missing for some reason, this will throw.
9255 // This could only happen if React crashed in an unexpected place earlier.
9256 // Don't pile on with more errors.
9257
9258 // Clear marks immediately to avoid growing buffer.
9259 performance.clearMarks(formattedMarkName);
9260 performance.clearMeasures(formattedLabel);
9261};
9262
9263var getFiberMarkName = function (label, debugID) {
9264 return label + ' (#' + debugID + ')';
9265};
9266
9267var getFiberLabel = function (componentName, isMounted, phase) {
9268 if (phase === null) {
9269 // These are composite component total time measurements.
9270 return componentName + ' [' + (isMounted ? 'update' : 'mount') + ']';
9271 } else {
9272 // Composite component methods.
9273 return componentName + '.' + phase;
9274 }
9275};
9276
9277var beginFiberMark = function (fiber, phase) {
9278 var componentName = getComponentName(fiber.type) || 'Unknown';
9279 var debugID = fiber._debugID;
9280 var isMounted = fiber.alternate !== null;
9281 var label = getFiberLabel(componentName, isMounted, phase);
9282
9283 if (isCommitting && labelsInCurrentCommit.has(label)) {
9284 // During the commit phase, we don't show duplicate labels because
9285 // there is a fixed overhead for every measurement, and we don't
9286 // want to stretch the commit phase beyond necessary.
9287 return false;
9288 }
9289 labelsInCurrentCommit.add(label);
9290
9291 var markName = getFiberMarkName(label, debugID);
9292 beginMark(markName);
9293 return true;
9294};
9295
9296var clearFiberMark = function (fiber, phase) {
9297 var componentName = getComponentName(fiber.type) || 'Unknown';
9298 var debugID = fiber._debugID;
9299 var isMounted = fiber.alternate !== null;
9300 var label = getFiberLabel(componentName, isMounted, phase);
9301 var markName = getFiberMarkName(label, debugID);
9302 clearMark(markName);
9303};
9304
9305var endFiberMark = function (fiber, phase, warning) {
9306 var componentName = getComponentName(fiber.type) || 'Unknown';
9307 var debugID = fiber._debugID;
9308 var isMounted = fiber.alternate !== null;
9309 var label = getFiberLabel(componentName, isMounted, phase);
9310 var markName = getFiberMarkName(label, debugID);
9311 endMark(label, markName, warning);
9312};
9313
9314var shouldIgnoreFiber = function (fiber) {
9315 // Host components should be skipped in the timeline.
9316 // We could check typeof fiber.type, but does this work with RN?
9317 switch (fiber.tag) {
9318 case HostRoot:
9319 case HostComponent:
9320 case HostText:
9321 case HostPortal:
9322 case Fragment:
9323 case ContextProvider:
9324 case ContextConsumer:
9325 case Mode:
9326 return true;
9327 default:
9328 return false;
9329 }
9330};
9331
9332var clearPendingPhaseMeasurement = function () {
9333 if (currentPhase !== null && currentPhaseFiber !== null) {
9334 clearFiberMark(currentPhaseFiber, currentPhase);
9335 }
9336 currentPhaseFiber = null;
9337 currentPhase = null;
9338 hasScheduledUpdateInCurrentPhase = false;
9339};
9340
9341var pauseTimers = function () {
9342 // Stops all currently active measurements so that they can be resumed
9343 // if we continue in a later deferred loop from the same unit of work.
9344 var fiber = currentFiber;
9345 while (fiber) {
9346 if (fiber._debugIsCurrentlyTiming) {
9347 endFiberMark(fiber, null, null);
9348 }
9349 fiber = fiber.return;
9350 }
9351};
9352
9353var resumeTimersRecursively = function (fiber) {
9354 if (fiber.return !== null) {
9355 resumeTimersRecursively(fiber.return);
9356 }
9357 if (fiber._debugIsCurrentlyTiming) {
9358 beginFiberMark(fiber, null);
9359 }
9360};
9361
9362var resumeTimers = function () {
9363 // Resumes all measurements that were active during the last deferred loop.
9364 if (currentFiber !== null) {
9365 resumeTimersRecursively(currentFiber);
9366 }
9367};
9368
9369function recordEffect() {
9370 if (enableUserTimingAPI) {
9371 effectCountInCurrentCommit++;
9372 }
9373}
9374
9375function recordScheduleUpdate() {
9376 if (enableUserTimingAPI) {
9377 if (isCommitting) {
9378 hasScheduledUpdateInCurrentCommit = true;
9379 }
9380 if (currentPhase !== null && currentPhase !== 'componentWillMount' && currentPhase !== 'componentWillReceiveProps') {
9381 hasScheduledUpdateInCurrentPhase = true;
9382 }
9383 }
9384}
9385
9386function startRequestCallbackTimer() {
9387 if (enableUserTimingAPI) {
9388 if (supportsUserTiming && !isWaitingForCallback) {
9389 isWaitingForCallback = true;
9390 beginMark('(Waiting for async callback...)');
9391 }
9392 }
9393}
9394
9395function stopRequestCallbackTimer(didExpire, expirationTime) {
9396 if (enableUserTimingAPI) {
9397 if (supportsUserTiming) {
9398 isWaitingForCallback = false;
9399 var warning = didExpire ? 'React was blocked by main thread' : null;
9400 endMark('(Waiting for async callback... will force flush in ' + expirationTime + ' ms)', '(Waiting for async callback...)', warning);
9401 }
9402 }
9403}
9404
9405function startWorkTimer(fiber) {
9406 if (enableUserTimingAPI) {
9407 if (!supportsUserTiming || shouldIgnoreFiber(fiber)) {
9408 return;
9409 }
9410 // If we pause, this is the fiber to unwind from.
9411 currentFiber = fiber;
9412 if (!beginFiberMark(fiber, null)) {
9413 return;
9414 }
9415 fiber._debugIsCurrentlyTiming = true;
9416 }
9417}
9418
9419function cancelWorkTimer(fiber) {
9420 if (enableUserTimingAPI) {
9421 if (!supportsUserTiming || shouldIgnoreFiber(fiber)) {
9422 return;
9423 }
9424 // Remember we shouldn't complete measurement for this fiber.
9425 // Otherwise flamechart will be deep even for small updates.
9426 fiber._debugIsCurrentlyTiming = false;
9427 clearFiberMark(fiber, null);
9428 }
9429}
9430
9431function stopWorkTimer(fiber) {
9432 if (enableUserTimingAPI) {
9433 if (!supportsUserTiming || shouldIgnoreFiber(fiber)) {
9434 return;
9435 }
9436 // If we pause, its parent is the fiber to unwind from.
9437 currentFiber = fiber.return;
9438 if (!fiber._debugIsCurrentlyTiming) {
9439 return;
9440 }
9441 fiber._debugIsCurrentlyTiming = false;
9442 endFiberMark(fiber, null, null);
9443 }
9444}
9445
9446function stopFailedWorkTimer(fiber) {
9447 if (enableUserTimingAPI) {
9448 if (!supportsUserTiming || shouldIgnoreFiber(fiber)) {
9449 return;
9450 }
9451 // If we pause, its parent is the fiber to unwind from.
9452 currentFiber = fiber.return;
9453 if (!fiber._debugIsCurrentlyTiming) {
9454 return;
9455 }
9456 fiber._debugIsCurrentlyTiming = false;
9457 var warning = fiber.tag === SuspenseComponent || fiber.tag === DehydratedSuspenseComponent ? 'Rendering was suspended' : 'An error was thrown inside this error boundary';
9458 endFiberMark(fiber, null, warning);
9459 }
9460}
9461
9462function startPhaseTimer(fiber, phase) {
9463 if (enableUserTimingAPI) {
9464 if (!supportsUserTiming) {
9465 return;
9466 }
9467 clearPendingPhaseMeasurement();
9468 if (!beginFiberMark(fiber, phase)) {
9469 return;
9470 }
9471 currentPhaseFiber = fiber;
9472 currentPhase = phase;
9473 }
9474}
9475
9476function stopPhaseTimer() {
9477 if (enableUserTimingAPI) {
9478 if (!supportsUserTiming) {
9479 return;
9480 }
9481 if (currentPhase !== null && currentPhaseFiber !== null) {
9482 var warning = hasScheduledUpdateInCurrentPhase ? 'Scheduled a cascading update' : null;
9483 endFiberMark(currentPhaseFiber, currentPhase, warning);
9484 }
9485 currentPhase = null;
9486 currentPhaseFiber = null;
9487 }
9488}
9489
9490function startWorkLoopTimer(nextUnitOfWork) {
9491 if (enableUserTimingAPI) {
9492 currentFiber = nextUnitOfWork;
9493 if (!supportsUserTiming) {
9494 return;
9495 }
9496 commitCountInCurrentWorkLoop = 0;
9497 // This is top level call.
9498 // Any other measurements are performed within.
9499 beginMark('(React Tree Reconciliation)');
9500 // Resume any measurements that were in progress during the last loop.
9501 resumeTimers();
9502 }
9503}
9504
9505function stopWorkLoopTimer(interruptedBy, didCompleteRoot) {
9506 if (enableUserTimingAPI) {
9507 if (!supportsUserTiming) {
9508 return;
9509 }
9510 var warning = null;
9511 if (interruptedBy !== null) {
9512 if (interruptedBy.tag === HostRoot) {
9513 warning = 'A top-level update interrupted the previous render';
9514 } else {
9515 var componentName = getComponentName(interruptedBy.type) || 'Unknown';
9516 warning = 'An update to ' + componentName + ' interrupted the previous render';
9517 }
9518 } else if (commitCountInCurrentWorkLoop > 1) {
9519 warning = 'There were cascading updates';
9520 }
9521 commitCountInCurrentWorkLoop = 0;
9522 var label = didCompleteRoot ? '(React Tree Reconciliation: Completed Root)' : '(React Tree Reconciliation: Yielded)';
9523 // Pause any measurements until the next loop.
9524 pauseTimers();
9525 endMark(label, '(React Tree Reconciliation)', warning);
9526 }
9527}
9528
9529function startCommitTimer() {
9530 if (enableUserTimingAPI) {
9531 if (!supportsUserTiming) {
9532 return;
9533 }
9534 isCommitting = true;
9535 hasScheduledUpdateInCurrentCommit = false;
9536 labelsInCurrentCommit.clear();
9537 beginMark('(Committing Changes)');
9538 }
9539}
9540
9541function stopCommitTimer() {
9542 if (enableUserTimingAPI) {
9543 if (!supportsUserTiming) {
9544 return;
9545 }
9546
9547 var warning = null;
9548 if (hasScheduledUpdateInCurrentCommit) {
9549 warning = 'Lifecycle hook scheduled a cascading update';
9550 } else if (commitCountInCurrentWorkLoop > 0) {
9551 warning = 'Caused by a cascading update in earlier commit';
9552 }
9553 hasScheduledUpdateInCurrentCommit = false;
9554 commitCountInCurrentWorkLoop++;
9555 isCommitting = false;
9556 labelsInCurrentCommit.clear();
9557
9558 endMark('(Committing Changes)', '(Committing Changes)', warning);
9559 }
9560}
9561
9562function startCommitSnapshotEffectsTimer() {
9563 if (enableUserTimingAPI) {
9564 if (!supportsUserTiming) {
9565 return;
9566 }
9567 effectCountInCurrentCommit = 0;
9568 beginMark('(Committing Snapshot Effects)');
9569 }
9570}
9571
9572function stopCommitSnapshotEffectsTimer() {
9573 if (enableUserTimingAPI) {
9574 if (!supportsUserTiming) {
9575 return;
9576 }
9577 var count = effectCountInCurrentCommit;
9578 effectCountInCurrentCommit = 0;
9579 endMark('(Committing Snapshot Effects: ' + count + ' Total)', '(Committing Snapshot Effects)', null);
9580 }
9581}
9582
9583function startCommitHostEffectsTimer() {
9584 if (enableUserTimingAPI) {
9585 if (!supportsUserTiming) {
9586 return;
9587 }
9588 effectCountInCurrentCommit = 0;
9589 beginMark('(Committing Host Effects)');
9590 }
9591}
9592
9593function stopCommitHostEffectsTimer() {
9594 if (enableUserTimingAPI) {
9595 if (!supportsUserTiming) {
9596 return;
9597 }
9598 var count = effectCountInCurrentCommit;
9599 effectCountInCurrentCommit = 0;
9600 endMark('(Committing Host Effects: ' + count + ' Total)', '(Committing Host Effects)', null);
9601 }
9602}
9603
9604function startCommitLifeCyclesTimer() {
9605 if (enableUserTimingAPI) {
9606 if (!supportsUserTiming) {
9607 return;
9608 }
9609 effectCountInCurrentCommit = 0;
9610 beginMark('(Calling Lifecycle Methods)');
9611 }
9612}
9613
9614function stopCommitLifeCyclesTimer() {
9615 if (enableUserTimingAPI) {
9616 if (!supportsUserTiming) {
9617 return;
9618 }
9619 var count = effectCountInCurrentCommit;
9620 effectCountInCurrentCommit = 0;
9621 endMark('(Calling Lifecycle Methods: ' + count + ' Total)', '(Calling Lifecycle Methods)', null);
9622 }
9623}
9624
9625var valueStack = [];
9626
9627var fiberStack = void 0;
9628
9629{
9630 fiberStack = [];
9631}
9632
9633var index = -1;
9634
9635function createCursor(defaultValue) {
9636 return {
9637 current: defaultValue
9638 };
9639}
9640
9641function pop(cursor, fiber) {
9642 if (index < 0) {
9643 {
9644 warningWithoutStack$1(false, 'Unexpected pop.');
9645 }
9646 return;
9647 }
9648
9649 {
9650 if (fiber !== fiberStack[index]) {
9651 warningWithoutStack$1(false, 'Unexpected Fiber popped.');
9652 }
9653 }
9654
9655 cursor.current = valueStack[index];
9656
9657 valueStack[index] = null;
9658
9659 {
9660 fiberStack[index] = null;
9661 }
9662
9663 index--;
9664}
9665
9666function push(cursor, value, fiber) {
9667 index++;
9668
9669 valueStack[index] = cursor.current;
9670
9671 {
9672 fiberStack[index] = fiber;
9673 }
9674
9675 cursor.current = value;
9676}
9677
9678function checkThatStackIsEmpty() {
9679 {
9680 if (index !== -1) {
9681 warningWithoutStack$1(false, 'Expected an empty stack. Something was not reset properly.');
9682 }
9683 }
9684}
9685
9686function resetStackAfterFatalErrorInDev() {
9687 {
9688 index = -1;
9689 valueStack.length = 0;
9690 fiberStack.length = 0;
9691 }
9692}
9693
9694var warnedAboutMissingGetChildContext = void 0;
9695
9696{
9697 warnedAboutMissingGetChildContext = {};
9698}
9699
9700var emptyContextObject = {};
9701{
9702 Object.freeze(emptyContextObject);
9703}
9704
9705// A cursor to the current merged context object on the stack.
9706var contextStackCursor = createCursor(emptyContextObject);
9707// A cursor to a boolean indicating whether the context has changed.
9708var didPerformWorkStackCursor = createCursor(false);
9709// Keep track of the previous context object that was on the stack.
9710// We use this to get access to the parent context after we have already
9711// pushed the next context provider, and now need to merge their contexts.
9712var previousContext = emptyContextObject;
9713
9714function getUnmaskedContext(workInProgress, Component, didPushOwnContextIfProvider) {
9715 if (didPushOwnContextIfProvider && isContextProvider(Component)) {
9716 // If the fiber is a context provider itself, when we read its context
9717 // we may have already pushed its own child context on the stack. A context
9718 // provider should not "see" its own child context. Therefore we read the
9719 // previous (parent) context instead for a context provider.
9720 return previousContext;
9721 }
9722 return contextStackCursor.current;
9723}
9724
9725function cacheContext(workInProgress, unmaskedContext, maskedContext) {
9726 var instance = workInProgress.stateNode;
9727 instance.__reactInternalMemoizedUnmaskedChildContext = unmaskedContext;
9728 instance.__reactInternalMemoizedMaskedChildContext = maskedContext;
9729}
9730
9731function getMaskedContext(workInProgress, unmaskedContext) {
9732 var type = workInProgress.type;
9733 var contextTypes = type.contextTypes;
9734 if (!contextTypes) {
9735 return emptyContextObject;
9736 }
9737
9738 // Avoid recreating masked context unless unmasked context has changed.
9739 // Failing to do this will result in unnecessary calls to componentWillReceiveProps.
9740 // This may trigger infinite loops if componentWillReceiveProps calls setState.
9741 var instance = workInProgress.stateNode;
9742 if (instance && instance.__reactInternalMemoizedUnmaskedChildContext === unmaskedContext) {
9743 return instance.__reactInternalMemoizedMaskedChildContext;
9744 }
9745
9746 var context = {};
9747 for (var key in contextTypes) {
9748 context[key] = unmaskedContext[key];
9749 }
9750
9751 {
9752 var name = getComponentName(type) || 'Unknown';
9753 checkPropTypes_1(contextTypes, context, 'context', name, getCurrentFiberStackInDev);
9754 }
9755
9756 // Cache unmasked context so we can avoid recreating masked context unless necessary.
9757 // Context is created before the class component is instantiated so check for instance.
9758 if (instance) {
9759 cacheContext(workInProgress, unmaskedContext, context);
9760 }
9761
9762 return context;
9763}
9764
9765function hasContextChanged() {
9766 return didPerformWorkStackCursor.current;
9767}
9768
9769function isContextProvider(type) {
9770 var childContextTypes = type.childContextTypes;
9771 return childContextTypes !== null && childContextTypes !== undefined;
9772}
9773
9774function popContext(fiber) {
9775 pop(didPerformWorkStackCursor, fiber);
9776 pop(contextStackCursor, fiber);
9777}
9778
9779function popTopLevelContextObject(fiber) {
9780 pop(didPerformWorkStackCursor, fiber);
9781 pop(contextStackCursor, fiber);
9782}
9783
9784function pushTopLevelContextObject(fiber, context, didChange) {
9785 !(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;
9786
9787 push(contextStackCursor, context, fiber);
9788 push(didPerformWorkStackCursor, didChange, fiber);
9789}
9790
9791function processChildContext(fiber, type, parentContext) {
9792 var instance = fiber.stateNode;
9793 var childContextTypes = type.childContextTypes;
9794
9795 // TODO (bvaughn) Replace this behavior with an invariant() in the future.
9796 // It has only been added in Fiber to match the (unintentional) behavior in Stack.
9797 if (typeof instance.getChildContext !== 'function') {
9798 {
9799 var componentName = getComponentName(type) || 'Unknown';
9800
9801 if (!warnedAboutMissingGetChildContext[componentName]) {
9802 warnedAboutMissingGetChildContext[componentName] = true;
9803 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);
9804 }
9805 }
9806 return parentContext;
9807 }
9808
9809 var childContext = void 0;
9810 {
9811 setCurrentPhase('getChildContext');
9812 }
9813 startPhaseTimer(fiber, 'getChildContext');
9814 childContext = instance.getChildContext();
9815 stopPhaseTimer();
9816 {
9817 setCurrentPhase(null);
9818 }
9819 for (var contextKey in childContext) {
9820 !(contextKey in childContextTypes) ? invariant(false, '%s.getChildContext(): key "%s" is not defined in childContextTypes.', getComponentName(type) || 'Unknown', contextKey) : void 0;
9821 }
9822 {
9823 var name = getComponentName(type) || 'Unknown';
9824 checkPropTypes_1(childContextTypes, childContext, 'child context', name,
9825 // In practice, there is one case in which we won't get a stack. It's when
9826 // somebody calls unstable_renderSubtreeIntoContainer() and we process
9827 // context from the parent component instance. The stack will be missing
9828 // because it's outside of the reconciliation, and so the pointer has not
9829 // been set. This is rare and doesn't matter. We'll also remove that API.
9830 getCurrentFiberStackInDev);
9831 }
9832
9833 return _assign({}, parentContext, childContext);
9834}
9835
9836function pushContextProvider(workInProgress) {
9837 var instance = workInProgress.stateNode;
9838 // We push the context as early as possible to ensure stack integrity.
9839 // If the instance does not exist yet, we will push null at first,
9840 // and replace it on the stack later when invalidating the context.
9841 var memoizedMergedChildContext = instance && instance.__reactInternalMemoizedMergedChildContext || emptyContextObject;
9842
9843 // Remember the parent context so we can merge with it later.
9844 // Inherit the parent's did-perform-work value to avoid inadvertently blocking updates.
9845 previousContext = contextStackCursor.current;
9846 push(contextStackCursor, memoizedMergedChildContext, workInProgress);
9847 push(didPerformWorkStackCursor, didPerformWorkStackCursor.current, workInProgress);
9848
9849 return true;
9850}
9851
9852function invalidateContextProvider(workInProgress, type, didChange) {
9853 var instance = workInProgress.stateNode;
9854 !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;
9855
9856 if (didChange) {
9857 // Merge parent and own context.
9858 // Skip this if we're not updating due to sCU.
9859 // This avoids unnecessarily recomputing memoized values.
9860 var mergedContext = processChildContext(workInProgress, type, previousContext);
9861 instance.__reactInternalMemoizedMergedChildContext = mergedContext;
9862
9863 // Replace the old (or empty) context with the new one.
9864 // It is important to unwind the context in the reverse order.
9865 pop(didPerformWorkStackCursor, workInProgress);
9866 pop(contextStackCursor, workInProgress);
9867 // Now push the new context and mark that it has changed.
9868 push(contextStackCursor, mergedContext, workInProgress);
9869 push(didPerformWorkStackCursor, didChange, workInProgress);
9870 } else {
9871 pop(didPerformWorkStackCursor, workInProgress);
9872 push(didPerformWorkStackCursor, didChange, workInProgress);
9873 }
9874}
9875
9876function findCurrentUnmaskedContext(fiber) {
9877 // Currently this is only used with renderSubtreeIntoContainer; not sure if it
9878 // makes sense elsewhere
9879 !(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;
9880
9881 var node = fiber;
9882 do {
9883 switch (node.tag) {
9884 case HostRoot:
9885 return node.stateNode.context;
9886 case ClassComponent:
9887 {
9888 var Component = node.type;
9889 if (isContextProvider(Component)) {
9890 return node.stateNode.__reactInternalMemoizedMergedChildContext;
9891 }
9892 break;
9893 }
9894 }
9895 node = node.return;
9896 } while (node !== null);
9897 invariant(false, 'Found unexpected detached subtree parent. This error is likely caused by a bug in React. Please file an issue.');
9898}
9899
9900var onCommitFiberRoot = null;
9901var onCommitFiberUnmount = null;
9902var hasLoggedError = false;
9903
9904function catchErrors(fn) {
9905 return function (arg) {
9906 try {
9907 return fn(arg);
9908 } catch (err) {
9909 if (true && !hasLoggedError) {
9910 hasLoggedError = true;
9911 warningWithoutStack$1(false, 'React DevTools encountered an error: %s', err);
9912 }
9913 }
9914 };
9915}
9916
9917var isDevToolsPresent = typeof __REACT_DEVTOOLS_GLOBAL_HOOK__ !== 'undefined';
9918
9919function injectInternals(internals) {
9920 if (typeof __REACT_DEVTOOLS_GLOBAL_HOOK__ === 'undefined') {
9921 // No DevTools
9922 return false;
9923 }
9924 var hook = __REACT_DEVTOOLS_GLOBAL_HOOK__;
9925 if (hook.isDisabled) {
9926 // This isn't a real property on the hook, but it can be set to opt out
9927 // of DevTools integration and associated warnings and logs.
9928 // https://github.com/facebook/react/issues/3877
9929 return true;
9930 }
9931 if (!hook.supportsFiber) {
9932 {
9933 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');
9934 }
9935 // DevTools exists, even though it doesn't support Fiber.
9936 return true;
9937 }
9938 try {
9939 var rendererID = hook.inject(internals);
9940 // We have successfully injected, so now it is safe to set up hooks.
9941 onCommitFiberRoot = catchErrors(function (root) {
9942 return hook.onCommitFiberRoot(rendererID, root);
9943 });
9944 onCommitFiberUnmount = catchErrors(function (fiber) {
9945 return hook.onCommitFiberUnmount(rendererID, fiber);
9946 });
9947 } catch (err) {
9948 // Catch all errors because it is unsafe to throw during initialization.
9949 {
9950 warningWithoutStack$1(false, 'React DevTools encountered an error: %s.', err);
9951 }
9952 }
9953 // DevTools exists
9954 return true;
9955}
9956
9957function onCommitRoot(root) {
9958 if (typeof onCommitFiberRoot === 'function') {
9959 onCommitFiberRoot(root);
9960 }
9961}
9962
9963function onCommitUnmount(fiber) {
9964 if (typeof onCommitFiberUnmount === 'function') {
9965 onCommitFiberUnmount(fiber);
9966 }
9967}
9968
9969// Max 31 bit integer. The max integer size in V8 for 32-bit systems.
9970// Math.pow(2, 30) - 1
9971// 0b111111111111111111111111111111
9972var maxSigned31BitInt = 1073741823;
9973
9974var NoWork = 0;
9975var Never = 1;
9976var Sync = maxSigned31BitInt;
9977
9978var UNIT_SIZE = 10;
9979var MAGIC_NUMBER_OFFSET = maxSigned31BitInt - 1;
9980
9981// 1 unit of expiration time represents 10ms.
9982function msToExpirationTime(ms) {
9983 // Always add an offset so that we don't clash with the magic number for NoWork.
9984 return MAGIC_NUMBER_OFFSET - (ms / UNIT_SIZE | 0);
9985}
9986
9987function expirationTimeToMs(expirationTime) {
9988 return (MAGIC_NUMBER_OFFSET - expirationTime) * UNIT_SIZE;
9989}
9990
9991function ceiling(num, precision) {
9992 return ((num / precision | 0) + 1) * precision;
9993}
9994
9995function computeExpirationBucket(currentTime, expirationInMs, bucketSizeMs) {
9996 return MAGIC_NUMBER_OFFSET - ceiling(MAGIC_NUMBER_OFFSET - currentTime + expirationInMs / UNIT_SIZE, bucketSizeMs / UNIT_SIZE);
9997}
9998
9999var LOW_PRIORITY_EXPIRATION = 5000;
10000var LOW_PRIORITY_BATCH_SIZE = 250;
10001
10002function computeAsyncExpiration(currentTime) {
10003 return computeExpirationBucket(currentTime, LOW_PRIORITY_EXPIRATION, LOW_PRIORITY_BATCH_SIZE);
10004}
10005
10006// We intentionally set a higher expiration time for interactive updates in
10007// dev than in production.
10008//
10009// If the main thread is being blocked so long that you hit the expiration,
10010// it's a problem that could be solved with better scheduling.
10011//
10012// People will be more likely to notice this and fix it with the long
10013// expiration time in development.
10014//
10015// In production we opt for better UX at the risk of masking scheduling
10016// problems, by expiring fast.
10017var HIGH_PRIORITY_EXPIRATION = 500;
10018var HIGH_PRIORITY_BATCH_SIZE = 100;
10019
10020function computeInteractiveExpiration(currentTime) {
10021 return computeExpirationBucket(currentTime, HIGH_PRIORITY_EXPIRATION, HIGH_PRIORITY_BATCH_SIZE);
10022}
10023
10024var NoContext = 0;
10025var ConcurrentMode = 1;
10026var StrictMode = 2;
10027var ProfileMode = 4;
10028
10029var hasBadMapPolyfill = void 0;
10030
10031{
10032 hasBadMapPolyfill = false;
10033 try {
10034 var nonExtensibleObject = Object.preventExtensions({});
10035 var testMap = new Map([[nonExtensibleObject, null]]);
10036 var testSet = new Set([nonExtensibleObject]);
10037 // This is necessary for Rollup to not consider these unused.
10038 // https://github.com/rollup/rollup/issues/1771
10039 // TODO: we can remove these if Rollup fixes the bug.
10040 testMap.set(0, 0);
10041 testSet.add(0);
10042 } catch (e) {
10043 // TODO: Consider warning about bad polyfills
10044 hasBadMapPolyfill = true;
10045 }
10046}
10047
10048// A Fiber is work on a Component that needs to be done or was done. There can
10049// be more than one per component.
10050
10051
10052var debugCounter = void 0;
10053
10054{
10055 debugCounter = 1;
10056}
10057
10058function FiberNode(tag, pendingProps, key, mode) {
10059 // Instance
10060 this.tag = tag;
10061 this.key = key;
10062 this.elementType = null;
10063 this.type = null;
10064 this.stateNode = null;
10065
10066 // Fiber
10067 this.return = null;
10068 this.child = null;
10069 this.sibling = null;
10070 this.index = 0;
10071
10072 this.ref = null;
10073
10074 this.pendingProps = pendingProps;
10075 this.memoizedProps = null;
10076 this.updateQueue = null;
10077 this.memoizedState = null;
10078 this.contextDependencies = null;
10079
10080 this.mode = mode;
10081
10082 // Effects
10083 this.effectTag = NoEffect;
10084 this.nextEffect = null;
10085
10086 this.firstEffect = null;
10087 this.lastEffect = null;
10088
10089 this.expirationTime = NoWork;
10090 this.childExpirationTime = NoWork;
10091
10092 this.alternate = null;
10093
10094 if (enableProfilerTimer) {
10095 // Note: The following is done to avoid a v8 performance cliff.
10096 //
10097 // Initializing the fields below to smis and later updating them with
10098 // double values will cause Fibers to end up having separate shapes.
10099 // This behavior/bug has something to do with Object.preventExtension().
10100 // Fortunately this only impacts DEV builds.
10101 // Unfortunately it makes React unusably slow for some applications.
10102 // To work around this, initialize the fields below with doubles.
10103 //
10104 // Learn more about this here:
10105 // https://github.com/facebook/react/issues/14365
10106 // https://bugs.chromium.org/p/v8/issues/detail?id=8538
10107 this.actualDuration = Number.NaN;
10108 this.actualStartTime = Number.NaN;
10109 this.selfBaseDuration = Number.NaN;
10110 this.treeBaseDuration = Number.NaN;
10111
10112 // It's okay to replace the initial doubles with smis after initialization.
10113 // This won't trigger the performance cliff mentioned above,
10114 // and it simplifies other profiler code (including DevTools).
10115 this.actualDuration = 0;
10116 this.actualStartTime = -1;
10117 this.selfBaseDuration = 0;
10118 this.treeBaseDuration = 0;
10119 }
10120
10121 {
10122 this._debugID = debugCounter++;
10123 this._debugSource = null;
10124 this._debugOwner = null;
10125 this._debugIsCurrentlyTiming = false;
10126 if (!hasBadMapPolyfill && typeof Object.preventExtensions === 'function') {
10127 Object.preventExtensions(this);
10128 }
10129 }
10130}
10131
10132// This is a constructor function, rather than a POJO constructor, still
10133// please ensure we do the following:
10134// 1) Nobody should add any instance methods on this. Instance methods can be
10135// more difficult to predict when they get optimized and they are almost
10136// never inlined properly in static compilers.
10137// 2) Nobody should rely on `instanceof Fiber` for type testing. We should
10138// always know when it is a fiber.
10139// 3) We might want to experiment with using numeric keys since they are easier
10140// to optimize in a non-JIT environment.
10141// 4) We can easily go from a constructor to a createFiber object literal if that
10142// is faster.
10143// 5) It should be easy to port this to a C struct and keep a C implementation
10144// compatible.
10145var createFiber = function (tag, pendingProps, key, mode) {
10146 // $FlowFixMe: the shapes are exact here but Flow doesn't like constructors
10147 return new FiberNode(tag, pendingProps, key, mode);
10148};
10149
10150function shouldConstruct(Component) {
10151 var prototype = Component.prototype;
10152 return !!(prototype && prototype.isReactComponent);
10153}
10154
10155function isSimpleFunctionComponent(type) {
10156 return typeof type === 'function' && !shouldConstruct(type) && type.defaultProps === undefined;
10157}
10158
10159function resolveLazyComponentTag(Component) {
10160 if (typeof Component === 'function') {
10161 return shouldConstruct(Component) ? ClassComponent : FunctionComponent;
10162 } else if (Component !== undefined && Component !== null) {
10163 var $$typeof = Component.$$typeof;
10164 if ($$typeof === REACT_FORWARD_REF_TYPE) {
10165 return ForwardRef;
10166 }
10167 if ($$typeof === REACT_MEMO_TYPE) {
10168 return MemoComponent;
10169 }
10170 }
10171 return IndeterminateComponent;
10172}
10173
10174// This is used to create an alternate fiber to do work on.
10175function createWorkInProgress(current, pendingProps, expirationTime) {
10176 var workInProgress = current.alternate;
10177 if (workInProgress === null) {
10178 // We use a double buffering pooling technique because we know that we'll
10179 // only ever need at most two versions of a tree. We pool the "other" unused
10180 // node that we're free to reuse. This is lazily created to avoid allocating
10181 // extra objects for things that are never updated. It also allow us to
10182 // reclaim the extra memory if needed.
10183 workInProgress = createFiber(current.tag, pendingProps, current.key, current.mode);
10184 workInProgress.elementType = current.elementType;
10185 workInProgress.type = current.type;
10186 workInProgress.stateNode = current.stateNode;
10187
10188 {
10189 // DEV-only fields
10190 workInProgress._debugID = current._debugID;
10191 workInProgress._debugSource = current._debugSource;
10192 workInProgress._debugOwner = current._debugOwner;
10193 }
10194
10195 workInProgress.alternate = current;
10196 current.alternate = workInProgress;
10197 } else {
10198 workInProgress.pendingProps = pendingProps;
10199
10200 // We already have an alternate.
10201 // Reset the effect tag.
10202 workInProgress.effectTag = NoEffect;
10203
10204 // The effect list is no longer valid.
10205 workInProgress.nextEffect = null;
10206 workInProgress.firstEffect = null;
10207 workInProgress.lastEffect = null;
10208
10209 if (enableProfilerTimer) {
10210 // We intentionally reset, rather than copy, actualDuration & actualStartTime.
10211 // This prevents time from endlessly accumulating in new commits.
10212 // This has the downside of resetting values for different priority renders,
10213 // But works for yielding (the common case) and should support resuming.
10214 workInProgress.actualDuration = 0;
10215 workInProgress.actualStartTime = -1;
10216 }
10217 }
10218
10219 workInProgress.childExpirationTime = current.childExpirationTime;
10220 workInProgress.expirationTime = current.expirationTime;
10221
10222 workInProgress.child = current.child;
10223 workInProgress.memoizedProps = current.memoizedProps;
10224 workInProgress.memoizedState = current.memoizedState;
10225 workInProgress.updateQueue = current.updateQueue;
10226 workInProgress.contextDependencies = current.contextDependencies;
10227
10228 // These will be overridden during the parent's reconciliation
10229 workInProgress.sibling = current.sibling;
10230 workInProgress.index = current.index;
10231 workInProgress.ref = current.ref;
10232
10233 if (enableProfilerTimer) {
10234 workInProgress.selfBaseDuration = current.selfBaseDuration;
10235 workInProgress.treeBaseDuration = current.treeBaseDuration;
10236 }
10237
10238 return workInProgress;
10239}
10240
10241function createHostRootFiber(isConcurrent) {
10242 var mode = isConcurrent ? ConcurrentMode | StrictMode : NoContext;
10243
10244 if (enableProfilerTimer && isDevToolsPresent) {
10245 // Always collect profile timings when DevTools are present.
10246 // This enables DevTools to start capturing timing at any point–
10247 // Without some nodes in the tree having empty base times.
10248 mode |= ProfileMode;
10249 }
10250
10251 return createFiber(HostRoot, null, null, mode);
10252}
10253
10254function createFiberFromTypeAndProps(type, // React$ElementType
10255key, pendingProps, owner, mode, expirationTime) {
10256 var fiber = void 0;
10257
10258 var fiberTag = IndeterminateComponent;
10259 // The resolved type is set if we know what the final type will be. I.e. it's not lazy.
10260 var resolvedType = type;
10261 if (typeof type === 'function') {
10262 if (shouldConstruct(type)) {
10263 fiberTag = ClassComponent;
10264 }
10265 } else if (typeof type === 'string') {
10266 fiberTag = HostComponent;
10267 } else {
10268 getTag: switch (type) {
10269 case REACT_FRAGMENT_TYPE:
10270 return createFiberFromFragment(pendingProps.children, mode, expirationTime, key);
10271 case REACT_CONCURRENT_MODE_TYPE:
10272 return createFiberFromMode(pendingProps, mode | ConcurrentMode | StrictMode, expirationTime, key);
10273 case REACT_STRICT_MODE_TYPE:
10274 return createFiberFromMode(pendingProps, mode | StrictMode, expirationTime, key);
10275 case REACT_PROFILER_TYPE:
10276 return createFiberFromProfiler(pendingProps, mode, expirationTime, key);
10277 case REACT_SUSPENSE_TYPE:
10278 return createFiberFromSuspense(pendingProps, mode, expirationTime, key);
10279 default:
10280 {
10281 if (typeof type === 'object' && type !== null) {
10282 switch (type.$$typeof) {
10283 case REACT_PROVIDER_TYPE:
10284 fiberTag = ContextProvider;
10285 break getTag;
10286 case REACT_CONTEXT_TYPE:
10287 // This is a consumer
10288 fiberTag = ContextConsumer;
10289 break getTag;
10290 case REACT_FORWARD_REF_TYPE:
10291 fiberTag = ForwardRef;
10292 break getTag;
10293 case REACT_MEMO_TYPE:
10294 fiberTag = MemoComponent;
10295 break getTag;
10296 case REACT_LAZY_TYPE:
10297 fiberTag = LazyComponent;
10298 resolvedType = null;
10299 break getTag;
10300 }
10301 }
10302 var info = '';
10303 {
10304 if (type === undefined || typeof type === 'object' && type !== null && Object.keys(type).length === 0) {
10305 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.';
10306 }
10307 var ownerName = owner ? getComponentName(owner.type) : null;
10308 if (ownerName) {
10309 info += '\n\nCheck the render method of `' + ownerName + '`.';
10310 }
10311 }
10312 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);
10313 }
10314 }
10315 }
10316
10317 fiber = createFiber(fiberTag, pendingProps, key, mode);
10318 fiber.elementType = type;
10319 fiber.type = resolvedType;
10320 fiber.expirationTime = expirationTime;
10321
10322 return fiber;
10323}
10324
10325function createFiberFromElement(element, mode, expirationTime) {
10326 var owner = null;
10327 {
10328 owner = element._owner;
10329 }
10330 var type = element.type;
10331 var key = element.key;
10332 var pendingProps = element.props;
10333 var fiber = createFiberFromTypeAndProps(type, key, pendingProps, owner, mode, expirationTime);
10334 {
10335 fiber._debugSource = element._source;
10336 fiber._debugOwner = element._owner;
10337 }
10338 return fiber;
10339}
10340
10341function createFiberFromFragment(elements, mode, expirationTime, key) {
10342 var fiber = createFiber(Fragment, elements, key, mode);
10343 fiber.expirationTime = expirationTime;
10344 return fiber;
10345}
10346
10347function createFiberFromProfiler(pendingProps, mode, expirationTime, key) {
10348 {
10349 if (typeof pendingProps.id !== 'string' || typeof pendingProps.onRender !== 'function') {
10350 warningWithoutStack$1(false, 'Profiler must specify an "id" string and "onRender" function as props');
10351 }
10352 }
10353
10354 var fiber = createFiber(Profiler, pendingProps, key, mode | ProfileMode);
10355 // TODO: The Profiler fiber shouldn't have a type. It has a tag.
10356 fiber.elementType = REACT_PROFILER_TYPE;
10357 fiber.type = REACT_PROFILER_TYPE;
10358 fiber.expirationTime = expirationTime;
10359
10360 return fiber;
10361}
10362
10363function createFiberFromMode(pendingProps, mode, expirationTime, key) {
10364 var fiber = createFiber(Mode, pendingProps, key, mode);
10365
10366 // TODO: The Mode fiber shouldn't have a type. It has a tag.
10367 var type = (mode & ConcurrentMode) === NoContext ? REACT_STRICT_MODE_TYPE : REACT_CONCURRENT_MODE_TYPE;
10368 fiber.elementType = type;
10369 fiber.type = type;
10370
10371 fiber.expirationTime = expirationTime;
10372 return fiber;
10373}
10374
10375function createFiberFromSuspense(pendingProps, mode, expirationTime, key) {
10376 var fiber = createFiber(SuspenseComponent, pendingProps, key, mode);
10377
10378 // TODO: The SuspenseComponent fiber shouldn't have a type. It has a tag.
10379 var type = REACT_SUSPENSE_TYPE;
10380 fiber.elementType = type;
10381 fiber.type = type;
10382
10383 fiber.expirationTime = expirationTime;
10384 return fiber;
10385}
10386
10387function createFiberFromText(content, mode, expirationTime) {
10388 var fiber = createFiber(HostText, content, null, mode);
10389 fiber.expirationTime = expirationTime;
10390 return fiber;
10391}
10392
10393function createFiberFromHostInstanceForDeletion() {
10394 var fiber = createFiber(HostComponent, null, null, NoContext);
10395 // TODO: These should not need a type.
10396 fiber.elementType = 'DELETED';
10397 fiber.type = 'DELETED';
10398 return fiber;
10399}
10400
10401function createFiberFromPortal(portal, mode, expirationTime) {
10402 var pendingProps = portal.children !== null ? portal.children : [];
10403 var fiber = createFiber(HostPortal, pendingProps, portal.key, mode);
10404 fiber.expirationTime = expirationTime;
10405 fiber.stateNode = {
10406 containerInfo: portal.containerInfo,
10407 pendingChildren: null, // Used by persistent updates
10408 implementation: portal.implementation
10409 };
10410 return fiber;
10411}
10412
10413// Used for stashing WIP properties to replay failed work in DEV.
10414function assignFiberPropertiesInDEV(target, source) {
10415 if (target === null) {
10416 // This Fiber's initial properties will always be overwritten.
10417 // We only use a Fiber to ensure the same hidden class so DEV isn't slow.
10418 target = createFiber(IndeterminateComponent, null, null, NoContext);
10419 }
10420
10421 // This is intentionally written as a list of all properties.
10422 // We tried to use Object.assign() instead but this is called in
10423 // the hottest path, and Object.assign() was too slow:
10424 // https://github.com/facebook/react/issues/12502
10425 // This code is DEV-only so size is not a concern.
10426
10427 target.tag = source.tag;
10428 target.key = source.key;
10429 target.elementType = source.elementType;
10430 target.type = source.type;
10431 target.stateNode = source.stateNode;
10432 target.return = source.return;
10433 target.child = source.child;
10434 target.sibling = source.sibling;
10435 target.index = source.index;
10436 target.ref = source.ref;
10437 target.pendingProps = source.pendingProps;
10438 target.memoizedProps = source.memoizedProps;
10439 target.updateQueue = source.updateQueue;
10440 target.memoizedState = source.memoizedState;
10441 target.contextDependencies = source.contextDependencies;
10442 target.mode = source.mode;
10443 target.effectTag = source.effectTag;
10444 target.nextEffect = source.nextEffect;
10445 target.firstEffect = source.firstEffect;
10446 target.lastEffect = source.lastEffect;
10447 target.expirationTime = source.expirationTime;
10448 target.childExpirationTime = source.childExpirationTime;
10449 target.alternate = source.alternate;
10450 if (enableProfilerTimer) {
10451 target.actualDuration = source.actualDuration;
10452 target.actualStartTime = source.actualStartTime;
10453 target.selfBaseDuration = source.selfBaseDuration;
10454 target.treeBaseDuration = source.treeBaseDuration;
10455 }
10456 target._debugID = source._debugID;
10457 target._debugSource = source._debugSource;
10458 target._debugOwner = source._debugOwner;
10459 target._debugIsCurrentlyTiming = source._debugIsCurrentlyTiming;
10460 return target;
10461}
10462
10463var ReactInternals$2 = React.__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED;
10464
10465var _ReactInternals$Sched$1 = ReactInternals$2.SchedulerTracing;
10466var __interactionsRef = _ReactInternals$Sched$1.__interactionsRef;
10467var __subscriberRef = _ReactInternals$Sched$1.__subscriberRef;
10468var unstable_clear = _ReactInternals$Sched$1.unstable_clear;
10469var unstable_getCurrent = _ReactInternals$Sched$1.unstable_getCurrent;
10470var unstable_getThreadID = _ReactInternals$Sched$1.unstable_getThreadID;
10471var unstable_subscribe = _ReactInternals$Sched$1.unstable_subscribe;
10472var unstable_trace = _ReactInternals$Sched$1.unstable_trace;
10473var unstable_unsubscribe = _ReactInternals$Sched$1.unstable_unsubscribe;
10474var unstable_wrap = _ReactInternals$Sched$1.unstable_wrap;
10475
10476// TODO: This should be lifted into the renderer.
10477
10478
10479// The following attributes are only used by interaction tracing builds.
10480// They enable interactions to be associated with their async work,
10481// And expose interaction metadata to the React DevTools Profiler plugin.
10482// Note that these attributes are only defined when the enableSchedulerTracing flag is enabled.
10483
10484
10485// Exported FiberRoot type includes all properties,
10486// To avoid requiring potentially error-prone :any casts throughout the project.
10487// Profiling properties are only safe to access in profiling builds (when enableSchedulerTracing is true).
10488// The types are defined separately within this file to ensure they stay in sync.
10489// (We don't have to use an inline :any cast when enableSchedulerTracing is disabled.)
10490
10491
10492function createFiberRoot(containerInfo, isConcurrent, hydrate) {
10493 // Cyclic construction. This cheats the type system right now because
10494 // stateNode is any.
10495 var uninitializedFiber = createHostRootFiber(isConcurrent);
10496
10497 var root = void 0;
10498 if (enableSchedulerTracing) {
10499 root = {
10500 current: uninitializedFiber,
10501 containerInfo: containerInfo,
10502 pendingChildren: null,
10503
10504 earliestPendingTime: NoWork,
10505 latestPendingTime: NoWork,
10506 earliestSuspendedTime: NoWork,
10507 latestSuspendedTime: NoWork,
10508 latestPingedTime: NoWork,
10509
10510 pingCache: null,
10511
10512 didError: false,
10513
10514 pendingCommitExpirationTime: NoWork,
10515 finishedWork: null,
10516 timeoutHandle: noTimeout,
10517 context: null,
10518 pendingContext: null,
10519 hydrate: hydrate,
10520 nextExpirationTimeToWorkOn: NoWork,
10521 expirationTime: NoWork,
10522 firstBatch: null,
10523 nextScheduledRoot: null,
10524
10525 interactionThreadID: unstable_getThreadID(),
10526 memoizedInteractions: new Set(),
10527 pendingInteractionMap: new Map()
10528 };
10529 } else {
10530 root = {
10531 current: uninitializedFiber,
10532 containerInfo: containerInfo,
10533 pendingChildren: null,
10534
10535 pingCache: null,
10536
10537 earliestPendingTime: NoWork,
10538 latestPendingTime: NoWork,
10539 earliestSuspendedTime: NoWork,
10540 latestSuspendedTime: NoWork,
10541 latestPingedTime: NoWork,
10542
10543 didError: false,
10544
10545 pendingCommitExpirationTime: NoWork,
10546 finishedWork: null,
10547 timeoutHandle: noTimeout,
10548 context: null,
10549 pendingContext: null,
10550 hydrate: hydrate,
10551 nextExpirationTimeToWorkOn: NoWork,
10552 expirationTime: NoWork,
10553 firstBatch: null,
10554 nextScheduledRoot: null
10555 };
10556 }
10557
10558 uninitializedFiber.stateNode = root;
10559
10560 // The reason for the way the Flow types are structured in this file,
10561 // Is to avoid needing :any casts everywhere interaction tracing fields are used.
10562 // Unfortunately that requires an :any cast for non-interaction tracing capable builds.
10563 // $FlowFixMe Remove this :any cast and replace it with something better.
10564 return root;
10565}
10566
10567/**
10568 * Forked from fbjs/warning:
10569 * https://github.com/facebook/fbjs/blob/e66ba20ad5be433eb54423f2b097d829324d9de6/packages/fbjs/src/__forks__/warning.js
10570 *
10571 * Only change is we use console.warn instead of console.error,
10572 * and do nothing when 'console' is not supported.
10573 * This really simplifies the code.
10574 * ---
10575 * Similar to invariant but only logs a warning if the condition is not met.
10576 * This can be used to log issues in development environments in critical
10577 * paths. Removing the logging code for production environments will keep the
10578 * same logic and follow the same code paths.
10579 */
10580
10581var lowPriorityWarning = function () {};
10582
10583{
10584 var printWarning$1 = function (format) {
10585 for (var _len = arguments.length, args = Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) {
10586 args[_key - 1] = arguments[_key];
10587 }
10588
10589 var argIndex = 0;
10590 var message = 'Warning: ' + format.replace(/%s/g, function () {
10591 return args[argIndex++];
10592 });
10593 if (typeof console !== 'undefined') {
10594 console.warn(message);
10595 }
10596 try {
10597 // --- Welcome to debugging React ---
10598 // This error was thrown as a convenience so that you can use this stack
10599 // to find the callsite that caused this warning to fire.
10600 throw new Error(message);
10601 } catch (x) {}
10602 };
10603
10604 lowPriorityWarning = function (condition, format) {
10605 if (format === undefined) {
10606 throw new Error('`lowPriorityWarning(condition, format, ...args)` requires a warning ' + 'message argument');
10607 }
10608 if (!condition) {
10609 for (var _len2 = arguments.length, args = Array(_len2 > 2 ? _len2 - 2 : 0), _key2 = 2; _key2 < _len2; _key2++) {
10610 args[_key2 - 2] = arguments[_key2];
10611 }
10612
10613 printWarning$1.apply(undefined, [format].concat(args));
10614 }
10615 };
10616}
10617
10618var lowPriorityWarning$1 = lowPriorityWarning;
10619
10620var ReactStrictModeWarnings = {
10621 discardPendingWarnings: function () {},
10622 flushPendingDeprecationWarnings: function () {},
10623 flushPendingUnsafeLifecycleWarnings: function () {},
10624 recordDeprecationWarnings: function (fiber, instance) {},
10625 recordUnsafeLifecycleWarnings: function (fiber, instance) {},
10626 recordLegacyContextWarning: function (fiber, instance) {},
10627 flushLegacyContextWarning: function () {}
10628};
10629
10630{
10631 var LIFECYCLE_SUGGESTIONS = {
10632 UNSAFE_componentWillMount: 'componentDidMount',
10633 UNSAFE_componentWillReceiveProps: 'static getDerivedStateFromProps',
10634 UNSAFE_componentWillUpdate: 'componentDidUpdate'
10635 };
10636
10637 var pendingComponentWillMountWarnings = [];
10638 var pendingComponentWillReceivePropsWarnings = [];
10639 var pendingComponentWillUpdateWarnings = [];
10640 var pendingUnsafeLifecycleWarnings = new Map();
10641 var pendingLegacyContextWarning = new Map();
10642
10643 // Tracks components we have already warned about.
10644 var didWarnAboutDeprecatedLifecycles = new Set();
10645 var didWarnAboutUnsafeLifecycles = new Set();
10646 var didWarnAboutLegacyContext = new Set();
10647
10648 var setToSortedString = function (set) {
10649 var array = [];
10650 set.forEach(function (value) {
10651 array.push(value);
10652 });
10653 return array.sort().join(', ');
10654 };
10655
10656 ReactStrictModeWarnings.discardPendingWarnings = function () {
10657 pendingComponentWillMountWarnings = [];
10658 pendingComponentWillReceivePropsWarnings = [];
10659 pendingComponentWillUpdateWarnings = [];
10660 pendingUnsafeLifecycleWarnings = new Map();
10661 pendingLegacyContextWarning = new Map();
10662 };
10663
10664 ReactStrictModeWarnings.flushPendingUnsafeLifecycleWarnings = function () {
10665 pendingUnsafeLifecycleWarnings.forEach(function (lifecycleWarningsMap, strictRoot) {
10666 var lifecyclesWarningMessages = [];
10667
10668 Object.keys(lifecycleWarningsMap).forEach(function (lifecycle) {
10669 var lifecycleWarnings = lifecycleWarningsMap[lifecycle];
10670 if (lifecycleWarnings.length > 0) {
10671 var componentNames = new Set();
10672 lifecycleWarnings.forEach(function (fiber) {
10673 componentNames.add(getComponentName(fiber.type) || 'Component');
10674 didWarnAboutUnsafeLifecycles.add(fiber.type);
10675 });
10676
10677 var formatted = lifecycle.replace('UNSAFE_', '');
10678 var suggestion = LIFECYCLE_SUGGESTIONS[lifecycle];
10679 var sortedComponentNames = setToSortedString(componentNames);
10680
10681 lifecyclesWarningMessages.push(formatted + ': Please update the following components to use ' + (suggestion + ' instead: ' + sortedComponentNames));
10682 }
10683 });
10684
10685 if (lifecyclesWarningMessages.length > 0) {
10686 var strictRootComponentStack = getStackByFiberInDevAndProd(strictRoot);
10687
10688 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'));
10689 }
10690 });
10691
10692 pendingUnsafeLifecycleWarnings = new Map();
10693 };
10694
10695 var findStrictRoot = function (fiber) {
10696 var maybeStrictRoot = null;
10697
10698 var node = fiber;
10699 while (node !== null) {
10700 if (node.mode & StrictMode) {
10701 maybeStrictRoot = node;
10702 }
10703 node = node.return;
10704 }
10705
10706 return maybeStrictRoot;
10707 };
10708
10709 ReactStrictModeWarnings.flushPendingDeprecationWarnings = function () {
10710 if (pendingComponentWillMountWarnings.length > 0) {
10711 var uniqueNames = new Set();
10712 pendingComponentWillMountWarnings.forEach(function (fiber) {
10713 uniqueNames.add(getComponentName(fiber.type) || 'Component');
10714 didWarnAboutDeprecatedLifecycles.add(fiber.type);
10715 });
10716
10717 var sortedNames = setToSortedString(uniqueNames);
10718
10719 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);
10720
10721 pendingComponentWillMountWarnings = [];
10722 }
10723
10724 if (pendingComponentWillReceivePropsWarnings.length > 0) {
10725 var _uniqueNames = new Set();
10726 pendingComponentWillReceivePropsWarnings.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, '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);
10734
10735 pendingComponentWillReceivePropsWarnings = [];
10736 }
10737
10738 if (pendingComponentWillUpdateWarnings.length > 0) {
10739 var _uniqueNames2 = new Set();
10740 pendingComponentWillUpdateWarnings.forEach(function (fiber) {
10741 _uniqueNames2.add(getComponentName(fiber.type) || 'Component');
10742 didWarnAboutDeprecatedLifecycles.add(fiber.type);
10743 });
10744
10745 var _sortedNames2 = setToSortedString(_uniqueNames2);
10746
10747 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);
10748
10749 pendingComponentWillUpdateWarnings = [];
10750 }
10751 };
10752
10753 ReactStrictModeWarnings.recordDeprecationWarnings = function (fiber, instance) {
10754 // Dedup strategy: Warn once per component.
10755 if (didWarnAboutDeprecatedLifecycles.has(fiber.type)) {
10756 return;
10757 }
10758
10759 // Don't warn about react-lifecycles-compat polyfilled components.
10760 if (typeof instance.componentWillMount === 'function' && instance.componentWillMount.__suppressDeprecationWarning !== true) {
10761 pendingComponentWillMountWarnings.push(fiber);
10762 }
10763 if (typeof instance.componentWillReceiveProps === 'function' && instance.componentWillReceiveProps.__suppressDeprecationWarning !== true) {
10764 pendingComponentWillReceivePropsWarnings.push(fiber);
10765 }
10766 if (typeof instance.componentWillUpdate === 'function' && instance.componentWillUpdate.__suppressDeprecationWarning !== true) {
10767 pendingComponentWillUpdateWarnings.push(fiber);
10768 }
10769 };
10770
10771 ReactStrictModeWarnings.recordUnsafeLifecycleWarnings = function (fiber, instance) {
10772 var strictRoot = findStrictRoot(fiber);
10773 if (strictRoot === null) {
10774 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.');
10775 return;
10776 }
10777
10778 // Dedup strategy: Warn once per component.
10779 // This is difficult to track any other way since component names
10780 // are often vague and are likely to collide between 3rd party libraries.
10781 // An expand property is probably okay to use here since it's DEV-only,
10782 // and will only be set in the event of serious warnings.
10783 if (didWarnAboutUnsafeLifecycles.has(fiber.type)) {
10784 return;
10785 }
10786
10787 var warningsForRoot = void 0;
10788 if (!pendingUnsafeLifecycleWarnings.has(strictRoot)) {
10789 warningsForRoot = {
10790 UNSAFE_componentWillMount: [],
10791 UNSAFE_componentWillReceiveProps: [],
10792 UNSAFE_componentWillUpdate: []
10793 };
10794
10795 pendingUnsafeLifecycleWarnings.set(strictRoot, warningsForRoot);
10796 } else {
10797 warningsForRoot = pendingUnsafeLifecycleWarnings.get(strictRoot);
10798 }
10799
10800 var unsafeLifecycles = [];
10801 if (typeof instance.componentWillMount === 'function' && instance.componentWillMount.__suppressDeprecationWarning !== true || typeof instance.UNSAFE_componentWillMount === 'function') {
10802 unsafeLifecycles.push('UNSAFE_componentWillMount');
10803 }
10804 if (typeof instance.componentWillReceiveProps === 'function' && instance.componentWillReceiveProps.__suppressDeprecationWarning !== true || typeof instance.UNSAFE_componentWillReceiveProps === 'function') {
10805 unsafeLifecycles.push('UNSAFE_componentWillReceiveProps');
10806 }
10807 if (typeof instance.componentWillUpdate === 'function' && instance.componentWillUpdate.__suppressDeprecationWarning !== true || typeof instance.UNSAFE_componentWillUpdate === 'function') {
10808 unsafeLifecycles.push('UNSAFE_componentWillUpdate');
10809 }
10810
10811 if (unsafeLifecycles.length > 0) {
10812 unsafeLifecycles.forEach(function (lifecycle) {
10813 warningsForRoot[lifecycle].push(fiber);
10814 });
10815 }
10816 };
10817
10818 ReactStrictModeWarnings.recordLegacyContextWarning = function (fiber, instance) {
10819 var strictRoot = findStrictRoot(fiber);
10820 if (strictRoot === null) {
10821 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.');
10822 return;
10823 }
10824
10825 // Dedup strategy: Warn once per component.
10826 if (didWarnAboutLegacyContext.has(fiber.type)) {
10827 return;
10828 }
10829
10830 var warningsForRoot = pendingLegacyContextWarning.get(strictRoot);
10831
10832 if (fiber.type.contextTypes != null || fiber.type.childContextTypes != null || instance !== null && typeof instance.getChildContext === 'function') {
10833 if (warningsForRoot === undefined) {
10834 warningsForRoot = [];
10835 pendingLegacyContextWarning.set(strictRoot, warningsForRoot);
10836 }
10837 warningsForRoot.push(fiber);
10838 }
10839 };
10840
10841 ReactStrictModeWarnings.flushLegacyContextWarning = function () {
10842 pendingLegacyContextWarning.forEach(function (fiberArray, strictRoot) {
10843 var uniqueNames = new Set();
10844 fiberArray.forEach(function (fiber) {
10845 uniqueNames.add(getComponentName(fiber.type) || 'Component');
10846 didWarnAboutLegacyContext.add(fiber.type);
10847 });
10848
10849 var sortedNames = setToSortedString(uniqueNames);
10850 var strictRootComponentStack = getStackByFiberInDevAndProd(strictRoot);
10851
10852 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);
10853 });
10854 };
10855}
10856
10857// This lets us hook into Fiber to debug what it's doing.
10858// See https://github.com/facebook/react/pull/8033.
10859// This is not part of the public API, not even for React DevTools.
10860// You may only inject a debugTool if you work on React Fiber itself.
10861var ReactFiberInstrumentation = {
10862 debugTool: null
10863};
10864
10865var ReactFiberInstrumentation_1 = ReactFiberInstrumentation;
10866
10867// TODO: Offscreen updates should never suspend. However, a promise that
10868// suspended inside an offscreen subtree should be able to ping at the priority
10869// of the outer render.
10870
10871function markPendingPriorityLevel(root, expirationTime) {
10872 // If there's a gap between completing a failed root and retrying it,
10873 // additional updates may be scheduled. Clear `didError`, in case the update
10874 // is sufficient to fix the error.
10875 root.didError = false;
10876
10877 // Update the latest and earliest pending times
10878 var earliestPendingTime = root.earliestPendingTime;
10879 if (earliestPendingTime === NoWork) {
10880 // No other pending updates.
10881 root.earliestPendingTime = root.latestPendingTime = expirationTime;
10882 } else {
10883 if (earliestPendingTime < expirationTime) {
10884 // This is the earliest pending update.
10885 root.earliestPendingTime = expirationTime;
10886 } else {
10887 var latestPendingTime = root.latestPendingTime;
10888 if (latestPendingTime > expirationTime) {
10889 // This is the latest pending update
10890 root.latestPendingTime = expirationTime;
10891 }
10892 }
10893 }
10894 findNextExpirationTimeToWorkOn(expirationTime, root);
10895}
10896
10897function markCommittedPriorityLevels(root, earliestRemainingTime) {
10898 root.didError = false;
10899
10900 if (earliestRemainingTime === NoWork) {
10901 // Fast path. There's no remaining work. Clear everything.
10902 root.earliestPendingTime = NoWork;
10903 root.latestPendingTime = NoWork;
10904 root.earliestSuspendedTime = NoWork;
10905 root.latestSuspendedTime = NoWork;
10906 root.latestPingedTime = NoWork;
10907 findNextExpirationTimeToWorkOn(NoWork, root);
10908 return;
10909 }
10910
10911 if (earliestRemainingTime < root.latestPingedTime) {
10912 root.latestPingedTime = NoWork;
10913 }
10914
10915 // Let's see if the previous latest known pending level was just flushed.
10916 var latestPendingTime = root.latestPendingTime;
10917 if (latestPendingTime !== NoWork) {
10918 if (latestPendingTime > earliestRemainingTime) {
10919 // We've flushed all the known pending levels.
10920 root.earliestPendingTime = root.latestPendingTime = NoWork;
10921 } else {
10922 var earliestPendingTime = root.earliestPendingTime;
10923 if (earliestPendingTime > earliestRemainingTime) {
10924 // We've flushed the earliest known pending level. Set this to the
10925 // latest pending time.
10926 root.earliestPendingTime = root.latestPendingTime;
10927 }
10928 }
10929 }
10930
10931 // Now let's handle the earliest remaining level in the whole tree. We need to
10932 // decide whether to treat it as a pending level or as suspended. Check
10933 // it falls within the range of known suspended levels.
10934
10935 var earliestSuspendedTime = root.earliestSuspendedTime;
10936 if (earliestSuspendedTime === NoWork) {
10937 // There's no suspended work. Treat the earliest remaining level as a
10938 // pending level.
10939 markPendingPriorityLevel(root, earliestRemainingTime);
10940 findNextExpirationTimeToWorkOn(NoWork, root);
10941 return;
10942 }
10943
10944 var latestSuspendedTime = root.latestSuspendedTime;
10945 if (earliestRemainingTime < latestSuspendedTime) {
10946 // The earliest remaining level is later than all the suspended work. That
10947 // means we've flushed all the suspended work.
10948 root.earliestSuspendedTime = NoWork;
10949 root.latestSuspendedTime = NoWork;
10950 root.latestPingedTime = NoWork;
10951
10952 // There's no suspended work. Treat the earliest remaining level as a
10953 // pending level.
10954 markPendingPriorityLevel(root, earliestRemainingTime);
10955 findNextExpirationTimeToWorkOn(NoWork, root);
10956 return;
10957 }
10958
10959 if (earliestRemainingTime > earliestSuspendedTime) {
10960 // The earliest remaining time is earlier than all the suspended work.
10961 // Treat it as a pending update.
10962 markPendingPriorityLevel(root, earliestRemainingTime);
10963 findNextExpirationTimeToWorkOn(NoWork, root);
10964 return;
10965 }
10966
10967 // The earliest remaining time falls within the range of known suspended
10968 // levels. We should treat this as suspended work.
10969 findNextExpirationTimeToWorkOn(NoWork, root);
10970}
10971
10972function hasLowerPriorityWork(root, erroredExpirationTime) {
10973 var latestPendingTime = root.latestPendingTime;
10974 var latestSuspendedTime = root.latestSuspendedTime;
10975 var latestPingedTime = root.latestPingedTime;
10976 return latestPendingTime !== NoWork && latestPendingTime < erroredExpirationTime || latestSuspendedTime !== NoWork && latestSuspendedTime < erroredExpirationTime || latestPingedTime !== NoWork && latestPingedTime < erroredExpirationTime;
10977}
10978
10979function isPriorityLevelSuspended(root, expirationTime) {
10980 var earliestSuspendedTime = root.earliestSuspendedTime;
10981 var latestSuspendedTime = root.latestSuspendedTime;
10982 return earliestSuspendedTime !== NoWork && expirationTime <= earliestSuspendedTime && expirationTime >= latestSuspendedTime;
10983}
10984
10985function markSuspendedPriorityLevel(root, suspendedTime) {
10986 root.didError = false;
10987 clearPing(root, suspendedTime);
10988
10989 // First, check the known pending levels and update them if needed.
10990 var earliestPendingTime = root.earliestPendingTime;
10991 var latestPendingTime = root.latestPendingTime;
10992 if (earliestPendingTime === suspendedTime) {
10993 if (latestPendingTime === suspendedTime) {
10994 // Both known pending levels were suspended. Clear them.
10995 root.earliestPendingTime = root.latestPendingTime = NoWork;
10996 } else {
10997 // The earliest pending level was suspended. Clear by setting it to the
10998 // latest pending level.
10999 root.earliestPendingTime = latestPendingTime;
11000 }
11001 } else if (latestPendingTime === suspendedTime) {
11002 // The latest pending level was suspended. Clear by setting it to the
11003 // latest pending level.
11004 root.latestPendingTime = earliestPendingTime;
11005 }
11006
11007 // Finally, update the known suspended levels.
11008 var earliestSuspendedTime = root.earliestSuspendedTime;
11009 var latestSuspendedTime = root.latestSuspendedTime;
11010 if (earliestSuspendedTime === NoWork) {
11011 // No other suspended levels.
11012 root.earliestSuspendedTime = root.latestSuspendedTime = suspendedTime;
11013 } else {
11014 if (earliestSuspendedTime < suspendedTime) {
11015 // This is the earliest suspended level.
11016 root.earliestSuspendedTime = suspendedTime;
11017 } else if (latestSuspendedTime > suspendedTime) {
11018 // This is the latest suspended level
11019 root.latestSuspendedTime = suspendedTime;
11020 }
11021 }
11022
11023 findNextExpirationTimeToWorkOn(suspendedTime, root);
11024}
11025
11026function markPingedPriorityLevel(root, pingedTime) {
11027 root.didError = false;
11028
11029 // TODO: When we add back resuming, we need to ensure the progressed work
11030 // is thrown out and not reused during the restarted render. One way to
11031 // invalidate the progressed work is to restart at expirationTime + 1.
11032 var latestPingedTime = root.latestPingedTime;
11033 if (latestPingedTime === NoWork || latestPingedTime > pingedTime) {
11034 root.latestPingedTime = pingedTime;
11035 }
11036 findNextExpirationTimeToWorkOn(pingedTime, root);
11037}
11038
11039function clearPing(root, completedTime) {
11040 var latestPingedTime = root.latestPingedTime;
11041 if (latestPingedTime >= completedTime) {
11042 root.latestPingedTime = NoWork;
11043 }
11044}
11045
11046function findEarliestOutstandingPriorityLevel(root, renderExpirationTime) {
11047 var earliestExpirationTime = renderExpirationTime;
11048
11049 var earliestPendingTime = root.earliestPendingTime;
11050 var earliestSuspendedTime = root.earliestSuspendedTime;
11051 if (earliestPendingTime > earliestExpirationTime) {
11052 earliestExpirationTime = earliestPendingTime;
11053 }
11054 if (earliestSuspendedTime > earliestExpirationTime) {
11055 earliestExpirationTime = earliestSuspendedTime;
11056 }
11057 return earliestExpirationTime;
11058}
11059
11060function didExpireAtExpirationTime(root, currentTime) {
11061 var expirationTime = root.expirationTime;
11062 if (expirationTime !== NoWork && currentTime <= expirationTime) {
11063 // The root has expired. Flush all work up to the current time.
11064 root.nextExpirationTimeToWorkOn = currentTime;
11065 }
11066}
11067
11068function findNextExpirationTimeToWorkOn(completedExpirationTime, root) {
11069 var earliestSuspendedTime = root.earliestSuspendedTime;
11070 var latestSuspendedTime = root.latestSuspendedTime;
11071 var earliestPendingTime = root.earliestPendingTime;
11072 var latestPingedTime = root.latestPingedTime;
11073
11074 // Work on the earliest pending time. Failing that, work on the latest
11075 // pinged time.
11076 var nextExpirationTimeToWorkOn = earliestPendingTime !== NoWork ? earliestPendingTime : latestPingedTime;
11077
11078 // If there is no pending or pinged work, check if there's suspended work
11079 // that's lower priority than what we just completed.
11080 if (nextExpirationTimeToWorkOn === NoWork && (completedExpirationTime === NoWork || latestSuspendedTime < completedExpirationTime)) {
11081 // The lowest priority suspended work is the work most likely to be
11082 // committed next. Let's start rendering it again, so that if it times out,
11083 // it's ready to commit.
11084 nextExpirationTimeToWorkOn = latestSuspendedTime;
11085 }
11086
11087 var expirationTime = nextExpirationTimeToWorkOn;
11088 if (expirationTime !== NoWork && earliestSuspendedTime > expirationTime) {
11089 // Expire using the earliest known expiration time.
11090 expirationTime = earliestSuspendedTime;
11091 }
11092
11093 root.nextExpirationTimeToWorkOn = nextExpirationTimeToWorkOn;
11094 root.expirationTime = expirationTime;
11095}
11096
11097function resolveDefaultProps(Component, baseProps) {
11098 if (Component && Component.defaultProps) {
11099 // Resolve default props. Taken from ReactElement
11100 var props = _assign({}, baseProps);
11101 var defaultProps = Component.defaultProps;
11102 for (var propName in defaultProps) {
11103 if (props[propName] === undefined) {
11104 props[propName] = defaultProps[propName];
11105 }
11106 }
11107 return props;
11108 }
11109 return baseProps;
11110}
11111
11112function readLazyComponentType(lazyComponent) {
11113 var status = lazyComponent._status;
11114 var result = lazyComponent._result;
11115 switch (status) {
11116 case Resolved:
11117 {
11118 var Component = result;
11119 return Component;
11120 }
11121 case Rejected:
11122 {
11123 var error = result;
11124 throw error;
11125 }
11126 case Pending:
11127 {
11128 var thenable = result;
11129 throw thenable;
11130 }
11131 default:
11132 {
11133 lazyComponent._status = Pending;
11134 var ctor = lazyComponent._ctor;
11135 var _thenable = ctor();
11136 _thenable.then(function (moduleObject) {
11137 if (lazyComponent._status === Pending) {
11138 var defaultExport = moduleObject.default;
11139 {
11140 if (defaultExport === undefined) {
11141 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);
11142 }
11143 }
11144 lazyComponent._status = Resolved;
11145 lazyComponent._result = defaultExport;
11146 }
11147 }, function (error) {
11148 if (lazyComponent._status === Pending) {
11149 lazyComponent._status = Rejected;
11150 lazyComponent._result = error;
11151 }
11152 });
11153 // Handle synchronous thenables.
11154 switch (lazyComponent._status) {
11155 case Resolved:
11156 return lazyComponent._result;
11157 case Rejected:
11158 throw lazyComponent._result;
11159 }
11160 lazyComponent._result = _thenable;
11161 throw _thenable;
11162 }
11163 }
11164}
11165
11166var fakeInternalInstance = {};
11167var isArray$1 = Array.isArray;
11168
11169// React.Component uses a shared frozen object by default.
11170// We'll use it to determine whether we need to initialize legacy refs.
11171var emptyRefsObject = new React.Component().refs;
11172
11173var didWarnAboutStateAssignmentForComponent = void 0;
11174var didWarnAboutUninitializedState = void 0;
11175var didWarnAboutGetSnapshotBeforeUpdateWithoutDidUpdate = void 0;
11176var didWarnAboutLegacyLifecyclesAndDerivedState = void 0;
11177var didWarnAboutUndefinedDerivedState = void 0;
11178var warnOnUndefinedDerivedState = void 0;
11179var warnOnInvalidCallback$1 = void 0;
11180var didWarnAboutDirectlyAssigningPropsToState = void 0;
11181var didWarnAboutContextTypeAndContextTypes = void 0;
11182var didWarnAboutInvalidateContextType = void 0;
11183
11184{
11185 didWarnAboutStateAssignmentForComponent = new Set();
11186 didWarnAboutUninitializedState = new Set();
11187 didWarnAboutGetSnapshotBeforeUpdateWithoutDidUpdate = new Set();
11188 didWarnAboutLegacyLifecyclesAndDerivedState = new Set();
11189 didWarnAboutDirectlyAssigningPropsToState = new Set();
11190 didWarnAboutUndefinedDerivedState = new Set();
11191 didWarnAboutContextTypeAndContextTypes = new Set();
11192 didWarnAboutInvalidateContextType = new Set();
11193
11194 var didWarnOnInvalidCallback = new Set();
11195
11196 warnOnInvalidCallback$1 = function (callback, callerName) {
11197 if (callback === null || typeof callback === 'function') {
11198 return;
11199 }
11200 var key = callerName + '_' + callback;
11201 if (!didWarnOnInvalidCallback.has(key)) {
11202 didWarnOnInvalidCallback.add(key);
11203 warningWithoutStack$1(false, '%s(...): Expected the last optional `callback` argument to be a ' + 'function. Instead received: %s.', callerName, callback);
11204 }
11205 };
11206
11207 warnOnUndefinedDerivedState = function (type, partialState) {
11208 if (partialState === undefined) {
11209 var componentName = getComponentName(type) || 'Component';
11210 if (!didWarnAboutUndefinedDerivedState.has(componentName)) {
11211 didWarnAboutUndefinedDerivedState.add(componentName);
11212 warningWithoutStack$1(false, '%s.getDerivedStateFromProps(): A valid state object (or null) must be returned. ' + 'You have returned undefined.', componentName);
11213 }
11214 }
11215 };
11216
11217 // This is so gross but it's at least non-critical and can be removed if
11218 // it causes problems. This is meant to give a nicer error message for
11219 // ReactDOM15.unstable_renderSubtreeIntoContainer(reactDOM16Component,
11220 // ...)) which otherwise throws a "_processChildContext is not a function"
11221 // exception.
11222 Object.defineProperty(fakeInternalInstance, '_processChildContext', {
11223 enumerable: false,
11224 value: function () {
11225 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).');
11226 }
11227 });
11228 Object.freeze(fakeInternalInstance);
11229}
11230
11231function applyDerivedStateFromProps(workInProgress, ctor, getDerivedStateFromProps, nextProps) {
11232 var prevState = workInProgress.memoizedState;
11233
11234 {
11235 if (debugRenderPhaseSideEffects || debugRenderPhaseSideEffectsForStrictMode && workInProgress.mode & StrictMode) {
11236 // Invoke the function an extra time to help detect side-effects.
11237 getDerivedStateFromProps(nextProps, prevState);
11238 }
11239 }
11240
11241 var partialState = getDerivedStateFromProps(nextProps, prevState);
11242
11243 {
11244 warnOnUndefinedDerivedState(ctor, partialState);
11245 }
11246 // Merge the partial state and the previous state.
11247 var memoizedState = partialState === null || partialState === undefined ? prevState : _assign({}, prevState, partialState);
11248 workInProgress.memoizedState = memoizedState;
11249
11250 // Once the update queue is empty, persist the derived state onto the
11251 // base state.
11252 var updateQueue = workInProgress.updateQueue;
11253 if (updateQueue !== null && workInProgress.expirationTime === NoWork) {
11254 updateQueue.baseState = memoizedState;
11255 }
11256}
11257
11258var classComponentUpdater = {
11259 isMounted: isMounted,
11260 enqueueSetState: function (inst, payload, callback) {
11261 var fiber = get(inst);
11262 var currentTime = requestCurrentTime();
11263 var expirationTime = computeExpirationForFiber(currentTime, fiber);
11264
11265 var update = createUpdate(expirationTime);
11266 update.payload = payload;
11267 if (callback !== undefined && callback !== null) {
11268 {
11269 warnOnInvalidCallback$1(callback, 'setState');
11270 }
11271 update.callback = callback;
11272 }
11273
11274 flushPassiveEffects();
11275 enqueueUpdate(fiber, update);
11276 scheduleWork(fiber, expirationTime);
11277 },
11278 enqueueReplaceState: function (inst, payload, callback) {
11279 var fiber = get(inst);
11280 var currentTime = requestCurrentTime();
11281 var expirationTime = computeExpirationForFiber(currentTime, fiber);
11282
11283 var update = createUpdate(expirationTime);
11284 update.tag = ReplaceState;
11285 update.payload = payload;
11286
11287 if (callback !== undefined && callback !== null) {
11288 {
11289 warnOnInvalidCallback$1(callback, 'replaceState');
11290 }
11291 update.callback = callback;
11292 }
11293
11294 flushPassiveEffects();
11295 enqueueUpdate(fiber, update);
11296 scheduleWork(fiber, expirationTime);
11297 },
11298 enqueueForceUpdate: function (inst, callback) {
11299 var fiber = get(inst);
11300 var currentTime = requestCurrentTime();
11301 var expirationTime = computeExpirationForFiber(currentTime, fiber);
11302
11303 var update = createUpdate(expirationTime);
11304 update.tag = ForceUpdate;
11305
11306 if (callback !== undefined && callback !== null) {
11307 {
11308 warnOnInvalidCallback$1(callback, 'forceUpdate');
11309 }
11310 update.callback = callback;
11311 }
11312
11313 flushPassiveEffects();
11314 enqueueUpdate(fiber, update);
11315 scheduleWork(fiber, expirationTime);
11316 }
11317};
11318
11319function checkShouldComponentUpdate(workInProgress, ctor, oldProps, newProps, oldState, newState, nextContext) {
11320 var instance = workInProgress.stateNode;
11321 if (typeof instance.shouldComponentUpdate === 'function') {
11322 startPhaseTimer(workInProgress, 'shouldComponentUpdate');
11323 var shouldUpdate = instance.shouldComponentUpdate(newProps, newState, nextContext);
11324 stopPhaseTimer();
11325
11326 {
11327 !(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;
11328 }
11329
11330 return shouldUpdate;
11331 }
11332
11333 if (ctor.prototype && ctor.prototype.isPureReactComponent) {
11334 return !shallowEqual(oldProps, newProps) || !shallowEqual(oldState, newState);
11335 }
11336
11337 return true;
11338}
11339
11340function checkClassInstance(workInProgress, ctor, newProps) {
11341 var instance = workInProgress.stateNode;
11342 {
11343 var name = getComponentName(ctor) || 'Component';
11344 var renderPresent = instance.render;
11345
11346 if (!renderPresent) {
11347 if (ctor.prototype && typeof ctor.prototype.render === 'function') {
11348 warningWithoutStack$1(false, '%s(...): No `render` method found on the returned component ' + 'instance: did you accidentally return an object from the constructor?', name);
11349 } else {
11350 warningWithoutStack$1(false, '%s(...): No `render` method found on the returned component ' + 'instance: you may have forgotten to define `render`.', name);
11351 }
11352 }
11353
11354 var noGetInitialStateOnES6 = !instance.getInitialState || instance.getInitialState.isReactClassApproved || instance.state;
11355 !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;
11356 var noGetDefaultPropsOnES6 = !instance.getDefaultProps || instance.getDefaultProps.isReactClassApproved;
11357 !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;
11358 var noInstancePropTypes = !instance.propTypes;
11359 !noInstancePropTypes ? warningWithoutStack$1(false, 'propTypes was defined as an instance property on %s. Use a static ' + 'property to define propTypes instead.', name) : void 0;
11360 var noInstanceContextType = !instance.contextType;
11361 !noInstanceContextType ? warningWithoutStack$1(false, 'contextType was defined as an instance property on %s. Use a static ' + 'property to define contextType instead.', name) : void 0;
11362 var noInstanceContextTypes = !instance.contextTypes;
11363 !noInstanceContextTypes ? warningWithoutStack$1(false, 'contextTypes was defined as an instance property on %s. Use a static ' + 'property to define contextTypes instead.', name) : void 0;
11364
11365 if (ctor.contextType && ctor.contextTypes && !didWarnAboutContextTypeAndContextTypes.has(ctor)) {
11366 didWarnAboutContextTypeAndContextTypes.add(ctor);
11367 warningWithoutStack$1(false, '%s declares both contextTypes and contextType static properties. ' + 'The legacy contextTypes property will be ignored.', name);
11368 }
11369
11370 var noComponentShouldUpdate = typeof instance.componentShouldUpdate !== 'function';
11371 !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;
11372 if (ctor.prototype && ctor.prototype.isPureReactComponent && typeof instance.shouldComponentUpdate !== 'undefined') {
11373 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');
11374 }
11375 var noComponentDidUnmount = typeof instance.componentDidUnmount !== 'function';
11376 !noComponentDidUnmount ? warningWithoutStack$1(false, '%s has a method called ' + 'componentDidUnmount(). But there is no such lifecycle method. ' + 'Did you mean componentWillUnmount()?', name) : void 0;
11377 var noComponentDidReceiveProps = typeof instance.componentDidReceiveProps !== 'function';
11378 !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;
11379 var noComponentWillRecieveProps = typeof instance.componentWillRecieveProps !== 'function';
11380 !noComponentWillRecieveProps ? warningWithoutStack$1(false, '%s has a method called ' + 'componentWillRecieveProps(). Did you mean componentWillReceiveProps()?', name) : void 0;
11381 var noUnsafeComponentWillRecieveProps = typeof instance.UNSAFE_componentWillRecieveProps !== 'function';
11382 !noUnsafeComponentWillRecieveProps ? warningWithoutStack$1(false, '%s has a method called ' + 'UNSAFE_componentWillRecieveProps(). Did you mean UNSAFE_componentWillReceiveProps()?', name) : void 0;
11383 var hasMutatedProps = instance.props !== newProps;
11384 !(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;
11385 var noInstanceDefaultProps = !instance.defaultProps;
11386 !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;
11387
11388 if (typeof instance.getSnapshotBeforeUpdate === 'function' && typeof instance.componentDidUpdate !== 'function' && !didWarnAboutGetSnapshotBeforeUpdateWithoutDidUpdate.has(ctor)) {
11389 didWarnAboutGetSnapshotBeforeUpdateWithoutDidUpdate.add(ctor);
11390 warningWithoutStack$1(false, '%s: getSnapshotBeforeUpdate() should be used with componentDidUpdate(). ' + 'This component defines getSnapshotBeforeUpdate() only.', getComponentName(ctor));
11391 }
11392
11393 var noInstanceGetDerivedStateFromProps = typeof instance.getDerivedStateFromProps !== 'function';
11394 !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;
11395 var noInstanceGetDerivedStateFromCatch = typeof instance.getDerivedStateFromError !== 'function';
11396 !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;
11397 var noStaticGetSnapshotBeforeUpdate = typeof ctor.getSnapshotBeforeUpdate !== 'function';
11398 !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;
11399 var _state = instance.state;
11400 if (_state && (typeof _state !== 'object' || isArray$1(_state))) {
11401 warningWithoutStack$1(false, '%s.state: must be set to an object or null', name);
11402 }
11403 if (typeof instance.getChildContext === 'function') {
11404 !(typeof ctor.childContextTypes === 'object') ? warningWithoutStack$1(false, '%s.getChildContext(): childContextTypes must be defined in order to ' + 'use getChildContext().', name) : void 0;
11405 }
11406 }
11407}
11408
11409function adoptClassInstance(workInProgress, instance) {
11410 instance.updater = classComponentUpdater;
11411 workInProgress.stateNode = instance;
11412 // The instance needs access to the fiber so that it can schedule updates
11413 set(instance, workInProgress);
11414 {
11415 instance._reactInternalInstance = fakeInternalInstance;
11416 }
11417}
11418
11419function constructClassInstance(workInProgress, ctor, props, renderExpirationTime) {
11420 var isLegacyContextConsumer = false;
11421 var unmaskedContext = emptyContextObject;
11422 var context = null;
11423 var contextType = ctor.contextType;
11424 if (typeof contextType === 'object' && contextType !== null) {
11425 {
11426 if (contextType.$$typeof !== REACT_CONTEXT_TYPE && !didWarnAboutInvalidateContextType.has(ctor)) {
11427 didWarnAboutInvalidateContextType.add(ctor);
11428 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');
11429 }
11430 }
11431
11432 context = readContext(contextType);
11433 } else {
11434 unmaskedContext = getUnmaskedContext(workInProgress, ctor, true);
11435 var contextTypes = ctor.contextTypes;
11436 isLegacyContextConsumer = contextTypes !== null && contextTypes !== undefined;
11437 context = isLegacyContextConsumer ? getMaskedContext(workInProgress, unmaskedContext) : emptyContextObject;
11438 }
11439
11440 // Instantiate twice to help detect side-effects.
11441 {
11442 if (debugRenderPhaseSideEffects || debugRenderPhaseSideEffectsForStrictMode && workInProgress.mode & StrictMode) {
11443 new ctor(props, context); // eslint-disable-line no-new
11444 }
11445 }
11446
11447 var instance = new ctor(props, context);
11448 var state = workInProgress.memoizedState = instance.state !== null && instance.state !== undefined ? instance.state : null;
11449 adoptClassInstance(workInProgress, instance);
11450
11451 {
11452 if (typeof ctor.getDerivedStateFromProps === 'function' && state === null) {
11453 var componentName = getComponentName(ctor) || 'Component';
11454 if (!didWarnAboutUninitializedState.has(componentName)) {
11455 didWarnAboutUninitializedState.add(componentName);
11456 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);
11457 }
11458 }
11459
11460 // If new component APIs are defined, "unsafe" lifecycles won't be called.
11461 // Warn about these lifecycles if they are present.
11462 // Don't warn about react-lifecycles-compat polyfilled methods though.
11463 if (typeof ctor.getDerivedStateFromProps === 'function' || typeof instance.getSnapshotBeforeUpdate === 'function') {
11464 var foundWillMountName = null;
11465 var foundWillReceivePropsName = null;
11466 var foundWillUpdateName = null;
11467 if (typeof instance.componentWillMount === 'function' && instance.componentWillMount.__suppressDeprecationWarning !== true) {
11468 foundWillMountName = 'componentWillMount';
11469 } else if (typeof instance.UNSAFE_componentWillMount === 'function') {
11470 foundWillMountName = 'UNSAFE_componentWillMount';
11471 }
11472 if (typeof instance.componentWillReceiveProps === 'function' && instance.componentWillReceiveProps.__suppressDeprecationWarning !== true) {
11473 foundWillReceivePropsName = 'componentWillReceiveProps';
11474 } else if (typeof instance.UNSAFE_componentWillReceiveProps === 'function') {
11475 foundWillReceivePropsName = 'UNSAFE_componentWillReceiveProps';
11476 }
11477 if (typeof instance.componentWillUpdate === 'function' && instance.componentWillUpdate.__suppressDeprecationWarning !== true) {
11478 foundWillUpdateName = 'componentWillUpdate';
11479 } else if (typeof instance.UNSAFE_componentWillUpdate === 'function') {
11480 foundWillUpdateName = 'UNSAFE_componentWillUpdate';
11481 }
11482 if (foundWillMountName !== null || foundWillReceivePropsName !== null || foundWillUpdateName !== null) {
11483 var _componentName = getComponentName(ctor) || 'Component';
11484 var newApiName = typeof ctor.getDerivedStateFromProps === 'function' ? 'getDerivedStateFromProps()' : 'getSnapshotBeforeUpdate()';
11485 if (!didWarnAboutLegacyLifecyclesAndDerivedState.has(_componentName)) {
11486 didWarnAboutLegacyLifecyclesAndDerivedState.add(_componentName);
11487 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 : '');
11488 }
11489 }
11490 }
11491 }
11492
11493 // Cache unmasked context so we can avoid recreating masked context unless necessary.
11494 // ReactFiberContext usually updates this cache but can't for newly-created instances.
11495 if (isLegacyContextConsumer) {
11496 cacheContext(workInProgress, unmaskedContext, context);
11497 }
11498
11499 return instance;
11500}
11501
11502function callComponentWillMount(workInProgress, instance) {
11503 startPhaseTimer(workInProgress, 'componentWillMount');
11504 var oldState = instance.state;
11505
11506 if (typeof instance.componentWillMount === 'function') {
11507 instance.componentWillMount();
11508 }
11509 if (typeof instance.UNSAFE_componentWillMount === 'function') {
11510 instance.UNSAFE_componentWillMount();
11511 }
11512
11513 stopPhaseTimer();
11514
11515 if (oldState !== instance.state) {
11516 {
11517 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');
11518 }
11519 classComponentUpdater.enqueueReplaceState(instance, instance.state, null);
11520 }
11521}
11522
11523function callComponentWillReceiveProps(workInProgress, instance, newProps, nextContext) {
11524 var oldState = instance.state;
11525 startPhaseTimer(workInProgress, 'componentWillReceiveProps');
11526 if (typeof instance.componentWillReceiveProps === 'function') {
11527 instance.componentWillReceiveProps(newProps, nextContext);
11528 }
11529 if (typeof instance.UNSAFE_componentWillReceiveProps === 'function') {
11530 instance.UNSAFE_componentWillReceiveProps(newProps, nextContext);
11531 }
11532 stopPhaseTimer();
11533
11534 if (instance.state !== oldState) {
11535 {
11536 var componentName = getComponentName(workInProgress.type) || 'Component';
11537 if (!didWarnAboutStateAssignmentForComponent.has(componentName)) {
11538 didWarnAboutStateAssignmentForComponent.add(componentName);
11539 warningWithoutStack$1(false, '%s.componentWillReceiveProps(): Assigning directly to ' + "this.state is deprecated (except inside a component's " + 'constructor). Use setState instead.', componentName);
11540 }
11541 }
11542 classComponentUpdater.enqueueReplaceState(instance, instance.state, null);
11543 }
11544}
11545
11546// Invokes the mount life-cycles on a previously never rendered instance.
11547function mountClassInstance(workInProgress, ctor, newProps, renderExpirationTime) {
11548 {
11549 checkClassInstance(workInProgress, ctor, newProps);
11550 }
11551
11552 var instance = workInProgress.stateNode;
11553 instance.props = newProps;
11554 instance.state = workInProgress.memoizedState;
11555 instance.refs = emptyRefsObject;
11556
11557 var contextType = ctor.contextType;
11558 if (typeof contextType === 'object' && contextType !== null) {
11559 instance.context = readContext(contextType);
11560 } else {
11561 var unmaskedContext = getUnmaskedContext(workInProgress, ctor, true);
11562 instance.context = getMaskedContext(workInProgress, unmaskedContext);
11563 }
11564
11565 {
11566 if (instance.state === newProps) {
11567 var componentName = getComponentName(ctor) || 'Component';
11568 if (!didWarnAboutDirectlyAssigningPropsToState.has(componentName)) {
11569 didWarnAboutDirectlyAssigningPropsToState.add(componentName);
11570 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);
11571 }
11572 }
11573
11574 if (workInProgress.mode & StrictMode) {
11575 ReactStrictModeWarnings.recordUnsafeLifecycleWarnings(workInProgress, instance);
11576
11577 ReactStrictModeWarnings.recordLegacyContextWarning(workInProgress, instance);
11578 }
11579
11580 if (warnAboutDeprecatedLifecycles) {
11581 ReactStrictModeWarnings.recordDeprecationWarnings(workInProgress, instance);
11582 }
11583 }
11584
11585 var updateQueue = workInProgress.updateQueue;
11586 if (updateQueue !== null) {
11587 processUpdateQueue(workInProgress, updateQueue, newProps, instance, renderExpirationTime);
11588 instance.state = workInProgress.memoizedState;
11589 }
11590
11591 var getDerivedStateFromProps = ctor.getDerivedStateFromProps;
11592 if (typeof getDerivedStateFromProps === 'function') {
11593 applyDerivedStateFromProps(workInProgress, ctor, getDerivedStateFromProps, newProps);
11594 instance.state = workInProgress.memoizedState;
11595 }
11596
11597 // In order to support react-lifecycles-compat polyfilled components,
11598 // Unsafe lifecycles should not be invoked for components using the new APIs.
11599 if (typeof ctor.getDerivedStateFromProps !== 'function' && typeof instance.getSnapshotBeforeUpdate !== 'function' && (typeof instance.UNSAFE_componentWillMount === 'function' || typeof instance.componentWillMount === 'function')) {
11600 callComponentWillMount(workInProgress, instance);
11601 // If we had additional state updates during this life-cycle, let's
11602 // process them now.
11603 updateQueue = workInProgress.updateQueue;
11604 if (updateQueue !== null) {
11605 processUpdateQueue(workInProgress, updateQueue, newProps, instance, renderExpirationTime);
11606 instance.state = workInProgress.memoizedState;
11607 }
11608 }
11609
11610 if (typeof instance.componentDidMount === 'function') {
11611 workInProgress.effectTag |= Update;
11612 }
11613}
11614
11615function resumeMountClassInstance(workInProgress, ctor, newProps, renderExpirationTime) {
11616 var instance = workInProgress.stateNode;
11617
11618 var oldProps = workInProgress.memoizedProps;
11619 instance.props = oldProps;
11620
11621 var oldContext = instance.context;
11622 var contextType = ctor.contextType;
11623 var nextContext = void 0;
11624 if (typeof contextType === 'object' && contextType !== null) {
11625 nextContext = readContext(contextType);
11626 } else {
11627 var nextLegacyUnmaskedContext = getUnmaskedContext(workInProgress, ctor, true);
11628 nextContext = getMaskedContext(workInProgress, nextLegacyUnmaskedContext);
11629 }
11630
11631 var getDerivedStateFromProps = ctor.getDerivedStateFromProps;
11632 var hasNewLifecycles = typeof getDerivedStateFromProps === 'function' || typeof instance.getSnapshotBeforeUpdate === 'function';
11633
11634 // Note: During these life-cycles, instance.props/instance.state are what
11635 // ever the previously attempted to render - not the "current". However,
11636 // during componentDidUpdate we pass the "current" props.
11637
11638 // In order to support react-lifecycles-compat polyfilled components,
11639 // Unsafe lifecycles should not be invoked for components using the new APIs.
11640 if (!hasNewLifecycles && (typeof instance.UNSAFE_componentWillReceiveProps === 'function' || typeof instance.componentWillReceiveProps === 'function')) {
11641 if (oldProps !== newProps || oldContext !== nextContext) {
11642 callComponentWillReceiveProps(workInProgress, instance, newProps, nextContext);
11643 }
11644 }
11645
11646 resetHasForceUpdateBeforeProcessing();
11647
11648 var oldState = workInProgress.memoizedState;
11649 var newState = instance.state = oldState;
11650 var updateQueue = workInProgress.updateQueue;
11651 if (updateQueue !== null) {
11652 processUpdateQueue(workInProgress, updateQueue, newProps, instance, renderExpirationTime);
11653 newState = workInProgress.memoizedState;
11654 }
11655 if (oldProps === newProps && oldState === newState && !hasContextChanged() && !checkHasForceUpdateAfterProcessing()) {
11656 // If an update was already in progress, we should schedule an Update
11657 // effect even though we're bailing out, so that cWU/cDU are called.
11658 if (typeof instance.componentDidMount === 'function') {
11659 workInProgress.effectTag |= Update;
11660 }
11661 return false;
11662 }
11663
11664 if (typeof getDerivedStateFromProps === 'function') {
11665 applyDerivedStateFromProps(workInProgress, ctor, getDerivedStateFromProps, newProps);
11666 newState = workInProgress.memoizedState;
11667 }
11668
11669 var shouldUpdate = checkHasForceUpdateAfterProcessing() || checkShouldComponentUpdate(workInProgress, ctor, oldProps, newProps, oldState, newState, nextContext);
11670
11671 if (shouldUpdate) {
11672 // In order to support react-lifecycles-compat polyfilled components,
11673 // Unsafe lifecycles should not be invoked for components using the new APIs.
11674 if (!hasNewLifecycles && (typeof instance.UNSAFE_componentWillMount === 'function' || typeof instance.componentWillMount === 'function')) {
11675 startPhaseTimer(workInProgress, 'componentWillMount');
11676 if (typeof instance.componentWillMount === 'function') {
11677 instance.componentWillMount();
11678 }
11679 if (typeof instance.UNSAFE_componentWillMount === 'function') {
11680 instance.UNSAFE_componentWillMount();
11681 }
11682 stopPhaseTimer();
11683 }
11684 if (typeof instance.componentDidMount === 'function') {
11685 workInProgress.effectTag |= Update;
11686 }
11687 } else {
11688 // If an update was already in progress, we should schedule an Update
11689 // effect even though we're bailing out, so that cWU/cDU are called.
11690 if (typeof instance.componentDidMount === 'function') {
11691 workInProgress.effectTag |= Update;
11692 }
11693
11694 // If shouldComponentUpdate returned false, we should still update the
11695 // memoized state to indicate that this work can be reused.
11696 workInProgress.memoizedProps = newProps;
11697 workInProgress.memoizedState = newState;
11698 }
11699
11700 // Update the existing instance's state, props, and context pointers even
11701 // if shouldComponentUpdate returns false.
11702 instance.props = newProps;
11703 instance.state = newState;
11704 instance.context = nextContext;
11705
11706 return shouldUpdate;
11707}
11708
11709// Invokes the update life-cycles and returns false if it shouldn't rerender.
11710function updateClassInstance(current, workInProgress, ctor, newProps, renderExpirationTime) {
11711 var instance = workInProgress.stateNode;
11712
11713 var oldProps = workInProgress.memoizedProps;
11714 instance.props = workInProgress.type === workInProgress.elementType ? oldProps : resolveDefaultProps(workInProgress.type, oldProps);
11715
11716 var oldContext = instance.context;
11717 var contextType = ctor.contextType;
11718 var nextContext = void 0;
11719 if (typeof contextType === 'object' && contextType !== null) {
11720 nextContext = readContext(contextType);
11721 } else {
11722 var nextUnmaskedContext = getUnmaskedContext(workInProgress, ctor, true);
11723 nextContext = getMaskedContext(workInProgress, nextUnmaskedContext);
11724 }
11725
11726 var getDerivedStateFromProps = ctor.getDerivedStateFromProps;
11727 var hasNewLifecycles = typeof getDerivedStateFromProps === 'function' || typeof instance.getSnapshotBeforeUpdate === 'function';
11728
11729 // Note: During these life-cycles, instance.props/instance.state are what
11730 // ever the previously attempted to render - not the "current". However,
11731 // during componentDidUpdate we pass the "current" props.
11732
11733 // In order to support react-lifecycles-compat polyfilled components,
11734 // Unsafe lifecycles should not be invoked for components using the new APIs.
11735 if (!hasNewLifecycles && (typeof instance.UNSAFE_componentWillReceiveProps === 'function' || typeof instance.componentWillReceiveProps === 'function')) {
11736 if (oldProps !== newProps || oldContext !== nextContext) {
11737 callComponentWillReceiveProps(workInProgress, instance, newProps, nextContext);
11738 }
11739 }
11740
11741 resetHasForceUpdateBeforeProcessing();
11742
11743 var oldState = workInProgress.memoizedState;
11744 var newState = instance.state = oldState;
11745 var updateQueue = workInProgress.updateQueue;
11746 if (updateQueue !== null) {
11747 processUpdateQueue(workInProgress, updateQueue, newProps, instance, renderExpirationTime);
11748 newState = workInProgress.memoizedState;
11749 }
11750
11751 if (oldProps === newProps && oldState === newState && !hasContextChanged() && !checkHasForceUpdateAfterProcessing()) {
11752 // If an update was already in progress, we should schedule an Update
11753 // effect even though we're bailing out, so that cWU/cDU are called.
11754 if (typeof instance.componentDidUpdate === 'function') {
11755 if (oldProps !== current.memoizedProps || oldState !== current.memoizedState) {
11756 workInProgress.effectTag |= Update;
11757 }
11758 }
11759 if (typeof instance.getSnapshotBeforeUpdate === 'function') {
11760 if (oldProps !== current.memoizedProps || oldState !== current.memoizedState) {
11761 workInProgress.effectTag |= Snapshot;
11762 }
11763 }
11764 return false;
11765 }
11766
11767 if (typeof getDerivedStateFromProps === 'function') {
11768 applyDerivedStateFromProps(workInProgress, ctor, getDerivedStateFromProps, newProps);
11769 newState = workInProgress.memoizedState;
11770 }
11771
11772 var shouldUpdate = checkHasForceUpdateAfterProcessing() || checkShouldComponentUpdate(workInProgress, ctor, oldProps, newProps, oldState, newState, nextContext);
11773
11774 if (shouldUpdate) {
11775 // In order to support react-lifecycles-compat polyfilled components,
11776 // Unsafe lifecycles should not be invoked for components using the new APIs.
11777 if (!hasNewLifecycles && (typeof instance.UNSAFE_componentWillUpdate === 'function' || typeof instance.componentWillUpdate === 'function')) {
11778 startPhaseTimer(workInProgress, 'componentWillUpdate');
11779 if (typeof instance.componentWillUpdate === 'function') {
11780 instance.componentWillUpdate(newProps, newState, nextContext);
11781 }
11782 if (typeof instance.UNSAFE_componentWillUpdate === 'function') {
11783 instance.UNSAFE_componentWillUpdate(newProps, newState, nextContext);
11784 }
11785 stopPhaseTimer();
11786 }
11787 if (typeof instance.componentDidUpdate === 'function') {
11788 workInProgress.effectTag |= Update;
11789 }
11790 if (typeof instance.getSnapshotBeforeUpdate === 'function') {
11791 workInProgress.effectTag |= Snapshot;
11792 }
11793 } else {
11794 // If an update was already in progress, we should schedule an Update
11795 // effect even though we're bailing out, so that cWU/cDU are called.
11796 if (typeof instance.componentDidUpdate === 'function') {
11797 if (oldProps !== current.memoizedProps || oldState !== current.memoizedState) {
11798 workInProgress.effectTag |= Update;
11799 }
11800 }
11801 if (typeof instance.getSnapshotBeforeUpdate === 'function') {
11802 if (oldProps !== current.memoizedProps || oldState !== current.memoizedState) {
11803 workInProgress.effectTag |= Snapshot;
11804 }
11805 }
11806
11807 // If shouldComponentUpdate returned false, we should still update the
11808 // memoized props/state to indicate that this work can be reused.
11809 workInProgress.memoizedProps = newProps;
11810 workInProgress.memoizedState = newState;
11811 }
11812
11813 // Update the existing instance's state, props, and context pointers even
11814 // if shouldComponentUpdate returns false.
11815 instance.props = newProps;
11816 instance.state = newState;
11817 instance.context = nextContext;
11818
11819 return shouldUpdate;
11820}
11821
11822var didWarnAboutMaps = void 0;
11823var didWarnAboutGenerators = void 0;
11824var didWarnAboutStringRefInStrictMode = void 0;
11825var ownerHasKeyUseWarning = void 0;
11826var ownerHasFunctionTypeWarning = void 0;
11827var warnForMissingKey = function (child) {};
11828
11829{
11830 didWarnAboutMaps = false;
11831 didWarnAboutGenerators = false;
11832 didWarnAboutStringRefInStrictMode = {};
11833
11834 /**
11835 * Warn if there's no key explicitly set on dynamic arrays of children or
11836 * object keys are not valid. This allows us to keep track of children between
11837 * updates.
11838 */
11839 ownerHasKeyUseWarning = {};
11840 ownerHasFunctionTypeWarning = {};
11841
11842 warnForMissingKey = function (child) {
11843 if (child === null || typeof child !== 'object') {
11844 return;
11845 }
11846 if (!child._store || child._store.validated || child.key != null) {
11847 return;
11848 }
11849 !(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;
11850 child._store.validated = true;
11851
11852 var currentComponentErrorInfo = 'Each child in a list should have a unique ' + '"key" prop. See https://fb.me/react-warning-keys for ' + 'more information.' + getCurrentFiberStackInDev();
11853 if (ownerHasKeyUseWarning[currentComponentErrorInfo]) {
11854 return;
11855 }
11856 ownerHasKeyUseWarning[currentComponentErrorInfo] = true;
11857
11858 warning$1(false, 'Each child in a list should have a unique ' + '"key" prop. See https://fb.me/react-warning-keys for ' + 'more information.');
11859 };
11860}
11861
11862var isArray = Array.isArray;
11863
11864function coerceRef(returnFiber, current$$1, element) {
11865 var mixedRef = element.ref;
11866 if (mixedRef !== null && typeof mixedRef !== 'function' && typeof mixedRef !== 'object') {
11867 {
11868 if (returnFiber.mode & StrictMode) {
11869 var componentName = getComponentName(returnFiber.type) || 'Component';
11870 if (!didWarnAboutStringRefInStrictMode[componentName]) {
11871 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));
11872 didWarnAboutStringRefInStrictMode[componentName] = true;
11873 }
11874 }
11875 }
11876
11877 if (element._owner) {
11878 var owner = element._owner;
11879 var inst = void 0;
11880 if (owner) {
11881 var ownerFiber = owner;
11882 !(ownerFiber.tag === ClassComponent) ? invariant(false, 'Function components cannot have refs. Did you mean to use React.forwardRef()?') : void 0;
11883 inst = ownerFiber.stateNode;
11884 }
11885 !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;
11886 var stringRef = '' + mixedRef;
11887 // Check if previous string ref matches new string ref
11888 if (current$$1 !== null && current$$1.ref !== null && typeof current$$1.ref === 'function' && current$$1.ref._stringRef === stringRef) {
11889 return current$$1.ref;
11890 }
11891 var ref = function (value) {
11892 var refs = inst.refs;
11893 if (refs === emptyRefsObject) {
11894 // This is a lazy pooled frozen object, so we need to initialize.
11895 refs = inst.refs = {};
11896 }
11897 if (value === null) {
11898 delete refs[stringRef];
11899 } else {
11900 refs[stringRef] = value;
11901 }
11902 };
11903 ref._stringRef = stringRef;
11904 return ref;
11905 } else {
11906 !(typeof mixedRef === 'string') ? invariant(false, 'Expected ref to be a function, a string, an object returned by React.createRef(), or null.') : void 0;
11907 !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;
11908 }
11909 }
11910 return mixedRef;
11911}
11912
11913function throwOnInvalidObjectType(returnFiber, newChild) {
11914 if (returnFiber.type !== 'textarea') {
11915 var addendum = '';
11916 {
11917 addendum = ' If you meant to render a collection of children, use an array ' + 'instead.' + getCurrentFiberStackInDev();
11918 }
11919 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);
11920 }
11921}
11922
11923function warnOnFunctionType() {
11924 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();
11925
11926 if (ownerHasFunctionTypeWarning[currentComponentErrorInfo]) {
11927 return;
11928 }
11929 ownerHasFunctionTypeWarning[currentComponentErrorInfo] = true;
11930
11931 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.');
11932}
11933
11934// This wrapper function exists because I expect to clone the code in each path
11935// to be able to optimize each path individually by branching early. This needs
11936// a compiler or we can do it manually. Helpers that don't need this branching
11937// live outside of this function.
11938function ChildReconciler(shouldTrackSideEffects) {
11939 function deleteChild(returnFiber, childToDelete) {
11940 if (!shouldTrackSideEffects) {
11941 // Noop.
11942 return;
11943 }
11944 // Deletions are added in reversed order so we add it to the front.
11945 // At this point, the return fiber's effect list is empty except for
11946 // deletions, so we can just append the deletion to the list. The remaining
11947 // effects aren't added until the complete phase. Once we implement
11948 // resuming, this may not be true.
11949 var last = returnFiber.lastEffect;
11950 if (last !== null) {
11951 last.nextEffect = childToDelete;
11952 returnFiber.lastEffect = childToDelete;
11953 } else {
11954 returnFiber.firstEffect = returnFiber.lastEffect = childToDelete;
11955 }
11956 childToDelete.nextEffect = null;
11957 childToDelete.effectTag = Deletion;
11958 }
11959
11960 function deleteRemainingChildren(returnFiber, currentFirstChild) {
11961 if (!shouldTrackSideEffects) {
11962 // Noop.
11963 return null;
11964 }
11965
11966 // TODO: For the shouldClone case, this could be micro-optimized a bit by
11967 // assuming that after the first child we've already added everything.
11968 var childToDelete = currentFirstChild;
11969 while (childToDelete !== null) {
11970 deleteChild(returnFiber, childToDelete);
11971 childToDelete = childToDelete.sibling;
11972 }
11973 return null;
11974 }
11975
11976 function mapRemainingChildren(returnFiber, currentFirstChild) {
11977 // Add the remaining children to a temporary map so that we can find them by
11978 // keys quickly. Implicit (null) keys get added to this set with their index
11979 var existingChildren = new Map();
11980
11981 var existingChild = currentFirstChild;
11982 while (existingChild !== null) {
11983 if (existingChild.key !== null) {
11984 existingChildren.set(existingChild.key, existingChild);
11985 } else {
11986 existingChildren.set(existingChild.index, existingChild);
11987 }
11988 existingChild = existingChild.sibling;
11989 }
11990 return existingChildren;
11991 }
11992
11993 function useFiber(fiber, pendingProps, expirationTime) {
11994 // We currently set sibling to null and index to 0 here because it is easy
11995 // to forget to do before returning it. E.g. for the single child case.
11996 var clone = createWorkInProgress(fiber, pendingProps, expirationTime);
11997 clone.index = 0;
11998 clone.sibling = null;
11999 return clone;
12000 }
12001
12002 function placeChild(newFiber, lastPlacedIndex, newIndex) {
12003 newFiber.index = newIndex;
12004 if (!shouldTrackSideEffects) {
12005 // Noop.
12006 return lastPlacedIndex;
12007 }
12008 var current$$1 = newFiber.alternate;
12009 if (current$$1 !== null) {
12010 var oldIndex = current$$1.index;
12011 if (oldIndex < lastPlacedIndex) {
12012 // This is a move.
12013 newFiber.effectTag = Placement;
12014 return lastPlacedIndex;
12015 } else {
12016 // This item can stay in place.
12017 return oldIndex;
12018 }
12019 } else {
12020 // This is an insertion.
12021 newFiber.effectTag = Placement;
12022 return lastPlacedIndex;
12023 }
12024 }
12025
12026 function placeSingleChild(newFiber) {
12027 // This is simpler for the single child case. We only need to do a
12028 // placement for inserting new children.
12029 if (shouldTrackSideEffects && newFiber.alternate === null) {
12030 newFiber.effectTag = Placement;
12031 }
12032 return newFiber;
12033 }
12034
12035 function updateTextNode(returnFiber, current$$1, textContent, expirationTime) {
12036 if (current$$1 === null || current$$1.tag !== HostText) {
12037 // Insert
12038 var created = createFiberFromText(textContent, returnFiber.mode, expirationTime);
12039 created.return = returnFiber;
12040 return created;
12041 } else {
12042 // Update
12043 var existing = useFiber(current$$1, textContent, expirationTime);
12044 existing.return = returnFiber;
12045 return existing;
12046 }
12047 }
12048
12049 function updateElement(returnFiber, current$$1, element, expirationTime) {
12050 if (current$$1 !== null && current$$1.elementType === element.type) {
12051 // Move based on index
12052 var existing = useFiber(current$$1, element.props, expirationTime);
12053 existing.ref = coerceRef(returnFiber, current$$1, element);
12054 existing.return = returnFiber;
12055 {
12056 existing._debugSource = element._source;
12057 existing._debugOwner = element._owner;
12058 }
12059 return existing;
12060 } else {
12061 // Insert
12062 var created = createFiberFromElement(element, returnFiber.mode, expirationTime);
12063 created.ref = coerceRef(returnFiber, current$$1, element);
12064 created.return = returnFiber;
12065 return created;
12066 }
12067 }
12068
12069 function updatePortal(returnFiber, current$$1, portal, expirationTime) {
12070 if (current$$1 === null || current$$1.tag !== HostPortal || current$$1.stateNode.containerInfo !== portal.containerInfo || current$$1.stateNode.implementation !== portal.implementation) {
12071 // Insert
12072 var created = createFiberFromPortal(portal, returnFiber.mode, expirationTime);
12073 created.return = returnFiber;
12074 return created;
12075 } else {
12076 // Update
12077 var existing = useFiber(current$$1, portal.children || [], expirationTime);
12078 existing.return = returnFiber;
12079 return existing;
12080 }
12081 }
12082
12083 function updateFragment(returnFiber, current$$1, fragment, expirationTime, key) {
12084 if (current$$1 === null || current$$1.tag !== Fragment) {
12085 // Insert
12086 var created = createFiberFromFragment(fragment, returnFiber.mode, expirationTime, key);
12087 created.return = returnFiber;
12088 return created;
12089 } else {
12090 // Update
12091 var existing = useFiber(current$$1, fragment, expirationTime);
12092 existing.return = returnFiber;
12093 return existing;
12094 }
12095 }
12096
12097 function createChild(returnFiber, newChild, expirationTime) {
12098 if (typeof newChild === 'string' || typeof newChild === 'number') {
12099 // Text nodes don't have keys. If the previous node is implicitly keyed
12100 // we can continue to replace it without aborting even if it is not a text
12101 // node.
12102 var created = createFiberFromText('' + newChild, returnFiber.mode, expirationTime);
12103 created.return = returnFiber;
12104 return created;
12105 }
12106
12107 if (typeof newChild === 'object' && newChild !== null) {
12108 switch (newChild.$$typeof) {
12109 case REACT_ELEMENT_TYPE:
12110 {
12111 var _created = createFiberFromElement(newChild, returnFiber.mode, expirationTime);
12112 _created.ref = coerceRef(returnFiber, null, newChild);
12113 _created.return = returnFiber;
12114 return _created;
12115 }
12116 case REACT_PORTAL_TYPE:
12117 {
12118 var _created2 = createFiberFromPortal(newChild, returnFiber.mode, expirationTime);
12119 _created2.return = returnFiber;
12120 return _created2;
12121 }
12122 }
12123
12124 if (isArray(newChild) || getIteratorFn(newChild)) {
12125 var _created3 = createFiberFromFragment(newChild, returnFiber.mode, expirationTime, null);
12126 _created3.return = returnFiber;
12127 return _created3;
12128 }
12129
12130 throwOnInvalidObjectType(returnFiber, newChild);
12131 }
12132
12133 {
12134 if (typeof newChild === 'function') {
12135 warnOnFunctionType();
12136 }
12137 }
12138
12139 return null;
12140 }
12141
12142 function updateSlot(returnFiber, oldFiber, newChild, expirationTime) {
12143 // Update the fiber if the keys match, otherwise return null.
12144
12145 var key = oldFiber !== null ? oldFiber.key : null;
12146
12147 if (typeof newChild === 'string' || typeof newChild === 'number') {
12148 // Text nodes don't have keys. If the previous node is implicitly keyed
12149 // we can continue to replace it without aborting even if it is not a text
12150 // node.
12151 if (key !== null) {
12152 return null;
12153 }
12154 return updateTextNode(returnFiber, oldFiber, '' + newChild, expirationTime);
12155 }
12156
12157 if (typeof newChild === 'object' && newChild !== null) {
12158 switch (newChild.$$typeof) {
12159 case REACT_ELEMENT_TYPE:
12160 {
12161 if (newChild.key === key) {
12162 if (newChild.type === REACT_FRAGMENT_TYPE) {
12163 return updateFragment(returnFiber, oldFiber, newChild.props.children, expirationTime, key);
12164 }
12165 return updateElement(returnFiber, oldFiber, newChild, expirationTime);
12166 } else {
12167 return null;
12168 }
12169 }
12170 case REACT_PORTAL_TYPE:
12171 {
12172 if (newChild.key === key) {
12173 return updatePortal(returnFiber, oldFiber, newChild, expirationTime);
12174 } else {
12175 return null;
12176 }
12177 }
12178 }
12179
12180 if (isArray(newChild) || getIteratorFn(newChild)) {
12181 if (key !== null) {
12182 return null;
12183 }
12184
12185 return updateFragment(returnFiber, oldFiber, newChild, expirationTime, null);
12186 }
12187
12188 throwOnInvalidObjectType(returnFiber, newChild);
12189 }
12190
12191 {
12192 if (typeof newChild === 'function') {
12193 warnOnFunctionType();
12194 }
12195 }
12196
12197 return null;
12198 }
12199
12200 function updateFromMap(existingChildren, returnFiber, newIdx, newChild, expirationTime) {
12201 if (typeof newChild === 'string' || typeof newChild === 'number') {
12202 // Text nodes don't have keys, so we neither have to check the old nor
12203 // new node for the key. If both are text nodes, they match.
12204 var matchedFiber = existingChildren.get(newIdx) || null;
12205 return updateTextNode(returnFiber, matchedFiber, '' + newChild, expirationTime);
12206 }
12207
12208 if (typeof newChild === 'object' && newChild !== null) {
12209 switch (newChild.$$typeof) {
12210 case REACT_ELEMENT_TYPE:
12211 {
12212 var _matchedFiber = existingChildren.get(newChild.key === null ? newIdx : newChild.key) || null;
12213 if (newChild.type === REACT_FRAGMENT_TYPE) {
12214 return updateFragment(returnFiber, _matchedFiber, newChild.props.children, expirationTime, newChild.key);
12215 }
12216 return updateElement(returnFiber, _matchedFiber, newChild, expirationTime);
12217 }
12218 case REACT_PORTAL_TYPE:
12219 {
12220 var _matchedFiber2 = existingChildren.get(newChild.key === null ? newIdx : newChild.key) || null;
12221 return updatePortal(returnFiber, _matchedFiber2, newChild, expirationTime);
12222 }
12223 }
12224
12225 if (isArray(newChild) || getIteratorFn(newChild)) {
12226 var _matchedFiber3 = existingChildren.get(newIdx) || null;
12227 return updateFragment(returnFiber, _matchedFiber3, newChild, expirationTime, null);
12228 }
12229
12230 throwOnInvalidObjectType(returnFiber, newChild);
12231 }
12232
12233 {
12234 if (typeof newChild === 'function') {
12235 warnOnFunctionType();
12236 }
12237 }
12238
12239 return null;
12240 }
12241
12242 /**
12243 * Warns if there is a duplicate or missing key
12244 */
12245 function warnOnInvalidKey(child, knownKeys) {
12246 {
12247 if (typeof child !== 'object' || child === null) {
12248 return knownKeys;
12249 }
12250 switch (child.$$typeof) {
12251 case REACT_ELEMENT_TYPE:
12252 case REACT_PORTAL_TYPE:
12253 warnForMissingKey(child);
12254 var key = child.key;
12255 if (typeof key !== 'string') {
12256 break;
12257 }
12258 if (knownKeys === null) {
12259 knownKeys = new Set();
12260 knownKeys.add(key);
12261 break;
12262 }
12263 if (!knownKeys.has(key)) {
12264 knownKeys.add(key);
12265 break;
12266 }
12267 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);
12268 break;
12269 default:
12270 break;
12271 }
12272 }
12273 return knownKeys;
12274 }
12275
12276 function reconcileChildrenArray(returnFiber, currentFirstChild, newChildren, expirationTime) {
12277 // This algorithm can't optimize by searching from both ends since we
12278 // don't have backpointers on fibers. I'm trying to see how far we can get
12279 // with that model. If it ends up not being worth the tradeoffs, we can
12280 // add it later.
12281
12282 // Even with a two ended optimization, we'd want to optimize for the case
12283 // where there are few changes and brute force the comparison instead of
12284 // going for the Map. It'd like to explore hitting that path first in
12285 // forward-only mode and only go for the Map once we notice that we need
12286 // lots of look ahead. This doesn't handle reversal as well as two ended
12287 // search but that's unusual. Besides, for the two ended optimization to
12288 // work on Iterables, we'd need to copy the whole set.
12289
12290 // In this first iteration, we'll just live with hitting the bad case
12291 // (adding everything to a Map) in for every insert/move.
12292
12293 // If you change this code, also update reconcileChildrenIterator() which
12294 // uses the same algorithm.
12295
12296 {
12297 // First, validate keys.
12298 var knownKeys = null;
12299 for (var i = 0; i < newChildren.length; i++) {
12300 var child = newChildren[i];
12301 knownKeys = warnOnInvalidKey(child, knownKeys);
12302 }
12303 }
12304
12305 var resultingFirstChild = null;
12306 var previousNewFiber = null;
12307
12308 var oldFiber = currentFirstChild;
12309 var lastPlacedIndex = 0;
12310 var newIdx = 0;
12311 var nextOldFiber = null;
12312 for (; oldFiber !== null && newIdx < newChildren.length; newIdx++) {
12313 if (oldFiber.index > newIdx) {
12314 nextOldFiber = oldFiber;
12315 oldFiber = null;
12316 } else {
12317 nextOldFiber = oldFiber.sibling;
12318 }
12319 var newFiber = updateSlot(returnFiber, oldFiber, newChildren[newIdx], expirationTime);
12320 if (newFiber === null) {
12321 // TODO: This breaks on empty slots like null children. That's
12322 // unfortunate because it triggers the slow path all the time. We need
12323 // a better way to communicate whether this was a miss or null,
12324 // boolean, undefined, etc.
12325 if (oldFiber === null) {
12326 oldFiber = nextOldFiber;
12327 }
12328 break;
12329 }
12330 if (shouldTrackSideEffects) {
12331 if (oldFiber && newFiber.alternate === null) {
12332 // We matched the slot, but we didn't reuse the existing fiber, so we
12333 // need to delete the existing child.
12334 deleteChild(returnFiber, oldFiber);
12335 }
12336 }
12337 lastPlacedIndex = placeChild(newFiber, lastPlacedIndex, newIdx);
12338 if (previousNewFiber === null) {
12339 // TODO: Move out of the loop. This only happens for the first run.
12340 resultingFirstChild = newFiber;
12341 } else {
12342 // TODO: Defer siblings if we're not at the right index for this slot.
12343 // I.e. if we had null values before, then we want to defer this
12344 // for each null value. However, we also don't want to call updateSlot
12345 // with the previous one.
12346 previousNewFiber.sibling = newFiber;
12347 }
12348 previousNewFiber = newFiber;
12349 oldFiber = nextOldFiber;
12350 }
12351
12352 if (newIdx === newChildren.length) {
12353 // We've reached the end of the new children. We can delete the rest.
12354 deleteRemainingChildren(returnFiber, oldFiber);
12355 return resultingFirstChild;
12356 }
12357
12358 if (oldFiber === null) {
12359 // If we don't have any more existing children we can choose a fast path
12360 // since the rest will all be insertions.
12361 for (; newIdx < newChildren.length; newIdx++) {
12362 var _newFiber = createChild(returnFiber, newChildren[newIdx], expirationTime);
12363 if (!_newFiber) {
12364 continue;
12365 }
12366 lastPlacedIndex = placeChild(_newFiber, lastPlacedIndex, newIdx);
12367 if (previousNewFiber === null) {
12368 // TODO: Move out of the loop. This only happens for the first run.
12369 resultingFirstChild = _newFiber;
12370 } else {
12371 previousNewFiber.sibling = _newFiber;
12372 }
12373 previousNewFiber = _newFiber;
12374 }
12375 return resultingFirstChild;
12376 }
12377
12378 // Add all children to a key map for quick lookups.
12379 var existingChildren = mapRemainingChildren(returnFiber, oldFiber);
12380
12381 // Keep scanning and use the map to restore deleted items as moves.
12382 for (; newIdx < newChildren.length; newIdx++) {
12383 var _newFiber2 = updateFromMap(existingChildren, returnFiber, newIdx, newChildren[newIdx], expirationTime);
12384 if (_newFiber2) {
12385 if (shouldTrackSideEffects) {
12386 if (_newFiber2.alternate !== null) {
12387 // The new fiber is a work in progress, but if there exists a
12388 // current, that means that we reused the fiber. We need to delete
12389 // it from the child list so that we don't add it to the deletion
12390 // list.
12391 existingChildren.delete(_newFiber2.key === null ? newIdx : _newFiber2.key);
12392 }
12393 }
12394 lastPlacedIndex = placeChild(_newFiber2, lastPlacedIndex, newIdx);
12395 if (previousNewFiber === null) {
12396 resultingFirstChild = _newFiber2;
12397 } else {
12398 previousNewFiber.sibling = _newFiber2;
12399 }
12400 previousNewFiber = _newFiber2;
12401 }
12402 }
12403
12404 if (shouldTrackSideEffects) {
12405 // Any existing children that weren't consumed above were deleted. We need
12406 // to add them to the deletion list.
12407 existingChildren.forEach(function (child) {
12408 return deleteChild(returnFiber, child);
12409 });
12410 }
12411
12412 return resultingFirstChild;
12413 }
12414
12415 function reconcileChildrenIterator(returnFiber, currentFirstChild, newChildrenIterable, expirationTime) {
12416 // This is the same implementation as reconcileChildrenArray(),
12417 // but using the iterator instead.
12418
12419 var iteratorFn = getIteratorFn(newChildrenIterable);
12420 !(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;
12421
12422 {
12423 // We don't support rendering Generators because it's a mutation.
12424 // See https://github.com/facebook/react/issues/12995
12425 if (typeof Symbol === 'function' &&
12426 // $FlowFixMe Flow doesn't know about toStringTag
12427 newChildrenIterable[Symbol.toStringTag] === 'Generator') {
12428 !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;
12429 didWarnAboutGenerators = true;
12430 }
12431
12432 // Warn about using Maps as children
12433 if (newChildrenIterable.entries === iteratorFn) {
12434 !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;
12435 didWarnAboutMaps = true;
12436 }
12437
12438 // First, validate keys.
12439 // We'll get a different iterator later for the main pass.
12440 var _newChildren = iteratorFn.call(newChildrenIterable);
12441 if (_newChildren) {
12442 var knownKeys = null;
12443 var _step = _newChildren.next();
12444 for (; !_step.done; _step = _newChildren.next()) {
12445 var child = _step.value;
12446 knownKeys = warnOnInvalidKey(child, knownKeys);
12447 }
12448 }
12449 }
12450
12451 var newChildren = iteratorFn.call(newChildrenIterable);
12452 !(newChildren != null) ? invariant(false, 'An iterable object provided no iterator.') : void 0;
12453
12454 var resultingFirstChild = null;
12455 var previousNewFiber = null;
12456
12457 var oldFiber = currentFirstChild;
12458 var lastPlacedIndex = 0;
12459 var newIdx = 0;
12460 var nextOldFiber = null;
12461
12462 var step = newChildren.next();
12463 for (; oldFiber !== null && !step.done; newIdx++, step = newChildren.next()) {
12464 if (oldFiber.index > newIdx) {
12465 nextOldFiber = oldFiber;
12466 oldFiber = null;
12467 } else {
12468 nextOldFiber = oldFiber.sibling;
12469 }
12470 var newFiber = updateSlot(returnFiber, oldFiber, step.value, expirationTime);
12471 if (newFiber === null) {
12472 // TODO: This breaks on empty slots like null children. That's
12473 // unfortunate because it triggers the slow path all the time. We need
12474 // a better way to communicate whether this was a miss or null,
12475 // boolean, undefined, etc.
12476 if (!oldFiber) {
12477 oldFiber = nextOldFiber;
12478 }
12479 break;
12480 }
12481 if (shouldTrackSideEffects) {
12482 if (oldFiber && newFiber.alternate === null) {
12483 // We matched the slot, but we didn't reuse the existing fiber, so we
12484 // need to delete the existing child.
12485 deleteChild(returnFiber, oldFiber);
12486 }
12487 }
12488 lastPlacedIndex = placeChild(newFiber, lastPlacedIndex, newIdx);
12489 if (previousNewFiber === null) {
12490 // TODO: Move out of the loop. This only happens for the first run.
12491 resultingFirstChild = newFiber;
12492 } else {
12493 // TODO: Defer siblings if we're not at the right index for this slot.
12494 // I.e. if we had null values before, then we want to defer this
12495 // for each null value. However, we also don't want to call updateSlot
12496 // with the previous one.
12497 previousNewFiber.sibling = newFiber;
12498 }
12499 previousNewFiber = newFiber;
12500 oldFiber = nextOldFiber;
12501 }
12502
12503 if (step.done) {
12504 // We've reached the end of the new children. We can delete the rest.
12505 deleteRemainingChildren(returnFiber, oldFiber);
12506 return resultingFirstChild;
12507 }
12508
12509 if (oldFiber === null) {
12510 // If we don't have any more existing children we can choose a fast path
12511 // since the rest will all be insertions.
12512 for (; !step.done; newIdx++, step = newChildren.next()) {
12513 var _newFiber3 = createChild(returnFiber, step.value, expirationTime);
12514 if (_newFiber3 === null) {
12515 continue;
12516 }
12517 lastPlacedIndex = placeChild(_newFiber3, lastPlacedIndex, newIdx);
12518 if (previousNewFiber === null) {
12519 // TODO: Move out of the loop. This only happens for the first run.
12520 resultingFirstChild = _newFiber3;
12521 } else {
12522 previousNewFiber.sibling = _newFiber3;
12523 }
12524 previousNewFiber = _newFiber3;
12525 }
12526 return resultingFirstChild;
12527 }
12528
12529 // Add all children to a key map for quick lookups.
12530 var existingChildren = mapRemainingChildren(returnFiber, oldFiber);
12531
12532 // Keep scanning and use the map to restore deleted items as moves.
12533 for (; !step.done; newIdx++, step = newChildren.next()) {
12534 var _newFiber4 = updateFromMap(existingChildren, returnFiber, newIdx, step.value, expirationTime);
12535 if (_newFiber4 !== null) {
12536 if (shouldTrackSideEffects) {
12537 if (_newFiber4.alternate !== null) {
12538 // The new fiber is a work in progress, but if there exists a
12539 // current, that means that we reused the fiber. We need to delete
12540 // it from the child list so that we don't add it to the deletion
12541 // list.
12542 existingChildren.delete(_newFiber4.key === null ? newIdx : _newFiber4.key);
12543 }
12544 }
12545 lastPlacedIndex = placeChild(_newFiber4, lastPlacedIndex, newIdx);
12546 if (previousNewFiber === null) {
12547 resultingFirstChild = _newFiber4;
12548 } else {
12549 previousNewFiber.sibling = _newFiber4;
12550 }
12551 previousNewFiber = _newFiber4;
12552 }
12553 }
12554
12555 if (shouldTrackSideEffects) {
12556 // Any existing children that weren't consumed above were deleted. We need
12557 // to add them to the deletion list.
12558 existingChildren.forEach(function (child) {
12559 return deleteChild(returnFiber, child);
12560 });
12561 }
12562
12563 return resultingFirstChild;
12564 }
12565
12566 function reconcileSingleTextNode(returnFiber, currentFirstChild, textContent, expirationTime) {
12567 // There's no need to check for keys on text nodes since we don't have a
12568 // way to define them.
12569 if (currentFirstChild !== null && currentFirstChild.tag === HostText) {
12570 // We already have an existing node so let's just update it and delete
12571 // the rest.
12572 deleteRemainingChildren(returnFiber, currentFirstChild.sibling);
12573 var existing = useFiber(currentFirstChild, textContent, expirationTime);
12574 existing.return = returnFiber;
12575 return existing;
12576 }
12577 // The existing first child is not a text node so we need to create one
12578 // and delete the existing ones.
12579 deleteRemainingChildren(returnFiber, currentFirstChild);
12580 var created = createFiberFromText(textContent, returnFiber.mode, expirationTime);
12581 created.return = returnFiber;
12582 return created;
12583 }
12584
12585 function reconcileSingleElement(returnFiber, currentFirstChild, element, expirationTime) {
12586 var key = element.key;
12587 var child = currentFirstChild;
12588 while (child !== null) {
12589 // TODO: If key === null and child.key === null, then this only applies to
12590 // the first item in the list.
12591 if (child.key === key) {
12592 if (child.tag === Fragment ? element.type === REACT_FRAGMENT_TYPE : child.elementType === element.type) {
12593 deleteRemainingChildren(returnFiber, child.sibling);
12594 var existing = useFiber(child, element.type === REACT_FRAGMENT_TYPE ? element.props.children : element.props, expirationTime);
12595 existing.ref = coerceRef(returnFiber, child, element);
12596 existing.return = returnFiber;
12597 {
12598 existing._debugSource = element._source;
12599 existing._debugOwner = element._owner;
12600 }
12601 return existing;
12602 } else {
12603 deleteRemainingChildren(returnFiber, child);
12604 break;
12605 }
12606 } else {
12607 deleteChild(returnFiber, child);
12608 }
12609 child = child.sibling;
12610 }
12611
12612 if (element.type === REACT_FRAGMENT_TYPE) {
12613 var created = createFiberFromFragment(element.props.children, returnFiber.mode, expirationTime, element.key);
12614 created.return = returnFiber;
12615 return created;
12616 } else {
12617 var _created4 = createFiberFromElement(element, returnFiber.mode, expirationTime);
12618 _created4.ref = coerceRef(returnFiber, currentFirstChild, element);
12619 _created4.return = returnFiber;
12620 return _created4;
12621 }
12622 }
12623
12624 function reconcileSinglePortal(returnFiber, currentFirstChild, portal, expirationTime) {
12625 var key = portal.key;
12626 var child = currentFirstChild;
12627 while (child !== null) {
12628 // TODO: If key === null and child.key === null, then this only applies to
12629 // the first item in the list.
12630 if (child.key === key) {
12631 if (child.tag === HostPortal && child.stateNode.containerInfo === portal.containerInfo && child.stateNode.implementation === portal.implementation) {
12632 deleteRemainingChildren(returnFiber, child.sibling);
12633 var existing = useFiber(child, portal.children || [], expirationTime);
12634 existing.return = returnFiber;
12635 return existing;
12636 } else {
12637 deleteRemainingChildren(returnFiber, child);
12638 break;
12639 }
12640 } else {
12641 deleteChild(returnFiber, child);
12642 }
12643 child = child.sibling;
12644 }
12645
12646 var created = createFiberFromPortal(portal, returnFiber.mode, expirationTime);
12647 created.return = returnFiber;
12648 return created;
12649 }
12650
12651 // This API will tag the children with the side-effect of the reconciliation
12652 // itself. They will be added to the side-effect list as we pass through the
12653 // children and the parent.
12654 function reconcileChildFibers(returnFiber, currentFirstChild, newChild, expirationTime) {
12655 // This function is not recursive.
12656 // If the top level item is an array, we treat it as a set of children,
12657 // not as a fragment. Nested arrays on the other hand will be treated as
12658 // fragment nodes. Recursion happens at the normal flow.
12659
12660 // Handle top level unkeyed fragments as if they were arrays.
12661 // This leads to an ambiguity between <>{[...]}</> and <>...</>.
12662 // We treat the ambiguous cases above the same.
12663 var isUnkeyedTopLevelFragment = typeof newChild === 'object' && newChild !== null && newChild.type === REACT_FRAGMENT_TYPE && newChild.key === null;
12664 if (isUnkeyedTopLevelFragment) {
12665 newChild = newChild.props.children;
12666 }
12667
12668 // Handle object types
12669 var isObject = typeof newChild === 'object' && newChild !== null;
12670
12671 if (isObject) {
12672 switch (newChild.$$typeof) {
12673 case REACT_ELEMENT_TYPE:
12674 return placeSingleChild(reconcileSingleElement(returnFiber, currentFirstChild, newChild, expirationTime));
12675 case REACT_PORTAL_TYPE:
12676 return placeSingleChild(reconcileSinglePortal(returnFiber, currentFirstChild, newChild, expirationTime));
12677 }
12678 }
12679
12680 if (typeof newChild === 'string' || typeof newChild === 'number') {
12681 return placeSingleChild(reconcileSingleTextNode(returnFiber, currentFirstChild, '' + newChild, expirationTime));
12682 }
12683
12684 if (isArray(newChild)) {
12685 return reconcileChildrenArray(returnFiber, currentFirstChild, newChild, expirationTime);
12686 }
12687
12688 if (getIteratorFn(newChild)) {
12689 return reconcileChildrenIterator(returnFiber, currentFirstChild, newChild, expirationTime);
12690 }
12691
12692 if (isObject) {
12693 throwOnInvalidObjectType(returnFiber, newChild);
12694 }
12695
12696 {
12697 if (typeof newChild === 'function') {
12698 warnOnFunctionType();
12699 }
12700 }
12701 if (typeof newChild === 'undefined' && !isUnkeyedTopLevelFragment) {
12702 // If the new child is undefined, and the return fiber is a composite
12703 // component, throw an error. If Fiber return types are disabled,
12704 // we already threw above.
12705 switch (returnFiber.tag) {
12706 case ClassComponent:
12707 {
12708 {
12709 var instance = returnFiber.stateNode;
12710 if (instance.render._isMockFunction) {
12711 // We allow auto-mocks to proceed as if they're returning null.
12712 break;
12713 }
12714 }
12715 }
12716 // Intentionally fall through to the next case, which handles both
12717 // functions and classes
12718 // eslint-disable-next-lined no-fallthrough
12719 case FunctionComponent:
12720 {
12721 var Component = returnFiber.type;
12722 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');
12723 }
12724 }
12725 }
12726
12727 // Remaining cases are all treated as empty.
12728 return deleteRemainingChildren(returnFiber, currentFirstChild);
12729 }
12730
12731 return reconcileChildFibers;
12732}
12733
12734var reconcileChildFibers = ChildReconciler(true);
12735var mountChildFibers = ChildReconciler(false);
12736
12737function cloneChildFibers(current$$1, workInProgress) {
12738 !(current$$1 === null || workInProgress.child === current$$1.child) ? invariant(false, 'Resuming work not yet implemented.') : void 0;
12739
12740 if (workInProgress.child === null) {
12741 return;
12742 }
12743
12744 var currentChild = workInProgress.child;
12745 var newChild = createWorkInProgress(currentChild, currentChild.pendingProps, currentChild.expirationTime);
12746 workInProgress.child = newChild;
12747
12748 newChild.return = workInProgress;
12749 while (currentChild.sibling !== null) {
12750 currentChild = currentChild.sibling;
12751 newChild = newChild.sibling = createWorkInProgress(currentChild, currentChild.pendingProps, currentChild.expirationTime);
12752 newChild.return = workInProgress;
12753 }
12754 newChild.sibling = null;
12755}
12756
12757var NO_CONTEXT = {};
12758
12759var contextStackCursor$1 = createCursor(NO_CONTEXT);
12760var contextFiberStackCursor = createCursor(NO_CONTEXT);
12761var rootInstanceStackCursor = createCursor(NO_CONTEXT);
12762
12763function requiredContext(c) {
12764 !(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;
12765 return c;
12766}
12767
12768function getRootHostContainer() {
12769 var rootInstance = requiredContext(rootInstanceStackCursor.current);
12770 return rootInstance;
12771}
12772
12773function pushHostContainer(fiber, nextRootInstance) {
12774 // Push current root instance onto the stack;
12775 // This allows us to reset root when portals are popped.
12776 push(rootInstanceStackCursor, nextRootInstance, fiber);
12777 // Track the context and the Fiber that provided it.
12778 // This enables us to pop only Fibers that provide unique contexts.
12779 push(contextFiberStackCursor, fiber, fiber);
12780
12781 // Finally, we need to push the host context to the stack.
12782 // However, we can't just call getRootHostContext() and push it because
12783 // we'd have a different number of entries on the stack depending on
12784 // whether getRootHostContext() throws somewhere in renderer code or not.
12785 // So we push an empty value first. This lets us safely unwind on errors.
12786 push(contextStackCursor$1, NO_CONTEXT, fiber);
12787 var nextRootContext = getRootHostContext(nextRootInstance);
12788 // Now that we know this function doesn't throw, replace it.
12789 pop(contextStackCursor$1, fiber);
12790 push(contextStackCursor$1, nextRootContext, fiber);
12791}
12792
12793function popHostContainer(fiber) {
12794 pop(contextStackCursor$1, fiber);
12795 pop(contextFiberStackCursor, fiber);
12796 pop(rootInstanceStackCursor, fiber);
12797}
12798
12799function getHostContext() {
12800 var context = requiredContext(contextStackCursor$1.current);
12801 return context;
12802}
12803
12804function pushHostContext(fiber) {
12805 var rootInstance = requiredContext(rootInstanceStackCursor.current);
12806 var context = requiredContext(contextStackCursor$1.current);
12807 var nextContext = getChildHostContext(context, fiber.type, rootInstance);
12808
12809 // Don't push this Fiber's context unless it's unique.
12810 if (context === nextContext) {
12811 return;
12812 }
12813
12814 // Track the context and the Fiber that provided it.
12815 // This enables us to pop only Fibers that provide unique contexts.
12816 push(contextFiberStackCursor, fiber, fiber);
12817 push(contextStackCursor$1, nextContext, fiber);
12818}
12819
12820function popHostContext(fiber) {
12821 // Do not pop unless this Fiber provided the current context.
12822 // pushHostContext() only pushes Fibers that provide unique contexts.
12823 if (contextFiberStackCursor.current !== fiber) {
12824 return;
12825 }
12826
12827 pop(contextStackCursor$1, fiber);
12828 pop(contextFiberStackCursor, fiber);
12829}
12830
12831var NoEffect$1 = /* */0;
12832var UnmountSnapshot = /* */2;
12833var UnmountMutation = /* */4;
12834var MountMutation = /* */8;
12835var UnmountLayout = /* */16;
12836var MountLayout = /* */32;
12837var MountPassive = /* */64;
12838var UnmountPassive = /* */128;
12839
12840var ReactCurrentDispatcher$1 = ReactSharedInternals.ReactCurrentDispatcher;
12841
12842
12843var didWarnAboutMismatchedHooksForComponent = void 0;
12844{
12845 didWarnAboutMismatchedHooksForComponent = new Set();
12846}
12847
12848// These are set right before calling the component.
12849var renderExpirationTime = NoWork;
12850// The work-in-progress fiber. I've named it differently to distinguish it from
12851// the work-in-progress hook.
12852var currentlyRenderingFiber$1 = null;
12853
12854// Hooks are stored as a linked list on the fiber's memoizedState field. The
12855// current hook list is the list that belongs to the current fiber. The
12856// work-in-progress hook list is a new list that will be added to the
12857// work-in-progress fiber.
12858var firstCurrentHook = null;
12859var currentHook = null;
12860var nextCurrentHook = null;
12861var firstWorkInProgressHook = null;
12862var workInProgressHook = null;
12863var nextWorkInProgressHook = null;
12864
12865var remainingExpirationTime = NoWork;
12866var componentUpdateQueue = null;
12867var sideEffectTag = 0;
12868
12869// Updates scheduled during render will trigger an immediate re-render at the
12870// end of the current pass. We can't store these updates on the normal queue,
12871// because if the work is aborted, they should be discarded. Because this is
12872// a relatively rare case, we also don't want to add an additional field to
12873// either the hook or queue object types. So we store them in a lazily create
12874// map of queue -> render-phase updates, which are discarded once the component
12875// completes without re-rendering.
12876
12877// Whether an update was scheduled during the currently executing render pass.
12878var didScheduleRenderPhaseUpdate = false;
12879// Lazily created map of render-phase updates
12880var renderPhaseUpdates = null;
12881// Counter to prevent infinite loops.
12882var numberOfReRenders = 0;
12883var RE_RENDER_LIMIT = 25;
12884
12885// In DEV, this is the name of the currently executing primitive hook
12886var currentHookNameInDev = null;
12887
12888function warnOnHookMismatchInDev() {
12889 {
12890 var componentName = getComponentName(currentlyRenderingFiber$1.type);
12891 if (!didWarnAboutMismatchedHooksForComponent.has(componentName)) {
12892 didWarnAboutMismatchedHooksForComponent.add(componentName);
12893
12894 var secondColumnStart = 22;
12895
12896 var table = '';
12897 var prevHook = firstCurrentHook;
12898 var nextHook = firstWorkInProgressHook;
12899 var n = 1;
12900 while (prevHook !== null && nextHook !== null) {
12901 var oldHookName = prevHook._debugType;
12902 var newHookName = nextHook._debugType;
12903
12904 var row = n + '. ' + oldHookName;
12905
12906 // Extra space so second column lines up
12907 // lol @ IE not supporting String#repeat
12908 while (row.length < secondColumnStart) {
12909 row += ' ';
12910 }
12911
12912 row += newHookName + '\n';
12913
12914 table += row;
12915 prevHook = prevHook.next;
12916 nextHook = nextHook.next;
12917 n++;
12918 }
12919
12920 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);
12921 }
12922 }
12923}
12924
12925function throwInvalidHookError() {
12926 invariant(false, 'Hooks can only be called inside the body of a function component. (https://fb.me/react-invalid-hook-call)');
12927}
12928
12929function areHookInputsEqual(nextDeps, prevDeps) {
12930 if (prevDeps === null) {
12931 {
12932 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);
12933 }
12934 return false;
12935 }
12936
12937 {
12938 // Don't bother comparing lengths in prod because these arrays should be
12939 // passed inline.
12940 if (nextDeps.length !== prevDeps.length) {
12941 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(', ') + ']');
12942 }
12943 }
12944 for (var i = 0; i < prevDeps.length && i < nextDeps.length; i++) {
12945 if (is(nextDeps[i], prevDeps[i])) {
12946 continue;
12947 }
12948 return false;
12949 }
12950 return true;
12951}
12952
12953function renderWithHooks(current, workInProgress, Component, props, refOrContext, nextRenderExpirationTime) {
12954 renderExpirationTime = nextRenderExpirationTime;
12955 currentlyRenderingFiber$1 = workInProgress;
12956 firstCurrentHook = nextCurrentHook = current !== null ? current.memoizedState : null;
12957
12958 // The following should have already been reset
12959 // currentHook = null;
12960 // workInProgressHook = null;
12961
12962 // remainingExpirationTime = NoWork;
12963 // componentUpdateQueue = null;
12964
12965 // didScheduleRenderPhaseUpdate = false;
12966 // renderPhaseUpdates = null;
12967 // numberOfReRenders = 0;
12968 // sideEffectTag = 0;
12969
12970 {
12971 ReactCurrentDispatcher$1.current = nextCurrentHook === null ? HooksDispatcherOnMountInDEV : HooksDispatcherOnUpdateInDEV;
12972 }
12973
12974 var children = Component(props, refOrContext);
12975
12976 if (didScheduleRenderPhaseUpdate) {
12977 do {
12978 didScheduleRenderPhaseUpdate = false;
12979 numberOfReRenders += 1;
12980
12981 // Start over from the beginning of the list
12982 firstCurrentHook = nextCurrentHook = current !== null ? current.memoizedState : null;
12983 nextWorkInProgressHook = firstWorkInProgressHook;
12984
12985 currentHook = null;
12986 workInProgressHook = null;
12987 componentUpdateQueue = null;
12988
12989 ReactCurrentDispatcher$1.current = HooksDispatcherOnUpdateInDEV;
12990
12991 children = Component(props, refOrContext);
12992 } while (didScheduleRenderPhaseUpdate);
12993
12994 renderPhaseUpdates = null;
12995 numberOfReRenders = 0;
12996 }
12997
12998 {
12999 currentHookNameInDev = null;
13000 }
13001
13002 // We can assume the previous dispatcher is always this one, since we set it
13003 // at the beginning of the render phase and there's no re-entrancy.
13004 ReactCurrentDispatcher$1.current = ContextOnlyDispatcher;
13005
13006 var renderedWork = currentlyRenderingFiber$1;
13007
13008 renderedWork.memoizedState = firstWorkInProgressHook;
13009 renderedWork.expirationTime = remainingExpirationTime;
13010 renderedWork.updateQueue = componentUpdateQueue;
13011 renderedWork.effectTag |= sideEffectTag;
13012
13013 var didRenderTooFewHooks = currentHook !== null && currentHook.next !== null;
13014
13015 renderExpirationTime = NoWork;
13016 currentlyRenderingFiber$1 = null;
13017
13018 firstCurrentHook = null;
13019 currentHook = null;
13020 nextCurrentHook = null;
13021 firstWorkInProgressHook = null;
13022 workInProgressHook = null;
13023 nextWorkInProgressHook = null;
13024
13025 remainingExpirationTime = NoWork;
13026 componentUpdateQueue = null;
13027 sideEffectTag = 0;
13028
13029 // These were reset above
13030 // didScheduleRenderPhaseUpdate = false;
13031 // renderPhaseUpdates = null;
13032 // numberOfReRenders = 0;
13033
13034 !!didRenderTooFewHooks ? invariant(false, 'Rendered fewer hooks than expected. This may be caused by an accidental early return statement.') : void 0;
13035
13036 return children;
13037}
13038
13039function bailoutHooks(current, workInProgress, expirationTime) {
13040 workInProgress.updateQueue = current.updateQueue;
13041 workInProgress.effectTag &= ~(Passive | Update);
13042 if (current.expirationTime <= expirationTime) {
13043 current.expirationTime = NoWork;
13044 }
13045}
13046
13047function resetHooks() {
13048 // We can assume the previous dispatcher is always this one, since we set it
13049 // at the beginning of the render phase and there's no re-entrancy.
13050 ReactCurrentDispatcher$1.current = ContextOnlyDispatcher;
13051
13052 // This is used to reset the state of this module when a component throws.
13053 // It's also called inside mountIndeterminateComponent if we determine the
13054 // component is a module-style component.
13055 renderExpirationTime = NoWork;
13056 currentlyRenderingFiber$1 = null;
13057
13058 firstCurrentHook = null;
13059 currentHook = null;
13060 nextCurrentHook = null;
13061 firstWorkInProgressHook = null;
13062 workInProgressHook = null;
13063 nextWorkInProgressHook = null;
13064
13065 remainingExpirationTime = NoWork;
13066 componentUpdateQueue = null;
13067 sideEffectTag = 0;
13068
13069 {
13070 currentHookNameInDev = null;
13071 }
13072
13073 didScheduleRenderPhaseUpdate = false;
13074 renderPhaseUpdates = null;
13075 numberOfReRenders = 0;
13076}
13077
13078function mountWorkInProgressHook() {
13079 var hook = {
13080 memoizedState: null,
13081
13082 baseState: null,
13083 queue: null,
13084 baseUpdate: null,
13085
13086 next: null
13087 };
13088
13089 {
13090 hook._debugType = currentHookNameInDev;
13091 }
13092 if (workInProgressHook === null) {
13093 // This is the first hook in the list
13094 firstWorkInProgressHook = workInProgressHook = hook;
13095 } else {
13096 // Append to the end of the list
13097 workInProgressHook = workInProgressHook.next = hook;
13098 }
13099 return workInProgressHook;
13100}
13101
13102function updateWorkInProgressHook() {
13103 // This function is used both for updates and for re-renders triggered by a
13104 // render phase update. It assumes there is either a current hook we can
13105 // clone, or a work-in-progress hook from a previous render pass that we can
13106 // use as a base. When we reach the end of the base list, we must switch to
13107 // the dispatcher used for mounts.
13108 if (nextWorkInProgressHook !== null) {
13109 // There's already a work-in-progress. Reuse it.
13110 workInProgressHook = nextWorkInProgressHook;
13111 nextWorkInProgressHook = workInProgressHook.next;
13112
13113 currentHook = nextCurrentHook;
13114 nextCurrentHook = currentHook !== null ? currentHook.next : null;
13115 } else {
13116 // Clone from the current hook.
13117 !(nextCurrentHook !== null) ? invariant(false, 'Rendered more hooks than during the previous render.') : void 0;
13118 currentHook = nextCurrentHook;
13119
13120 var newHook = {
13121 memoizedState: currentHook.memoizedState,
13122
13123 baseState: currentHook.baseState,
13124 queue: currentHook.queue,
13125 baseUpdate: currentHook.baseUpdate,
13126
13127 next: null
13128 };
13129
13130 if (workInProgressHook === null) {
13131 // This is the first hook in the list.
13132 workInProgressHook = firstWorkInProgressHook = newHook;
13133 } else {
13134 // Append to the end of the list.
13135 workInProgressHook = workInProgressHook.next = newHook;
13136 }
13137 nextCurrentHook = currentHook.next;
13138
13139 {
13140 newHook._debugType = currentHookNameInDev;
13141 if (currentHookNameInDev !== currentHook._debugType) {
13142 warnOnHookMismatchInDev();
13143 }
13144 }
13145 }
13146 return workInProgressHook;
13147}
13148
13149function createFunctionComponentUpdateQueue() {
13150 return {
13151 lastEffect: null
13152 };
13153}
13154
13155function basicStateReducer(state, action) {
13156 return typeof action === 'function' ? action(state) : action;
13157}
13158
13159function mountContext(context, observedBits) {
13160 {
13161 mountWorkInProgressHook();
13162 }
13163 return readContext(context, observedBits);
13164}
13165
13166function updateContext(context, observedBits) {
13167 {
13168 updateWorkInProgressHook();
13169 }
13170 return readContext(context, observedBits);
13171}
13172
13173function mountReducer(reducer, initialArg, init) {
13174 var hook = mountWorkInProgressHook();
13175 var initialState = void 0;
13176 if (init !== undefined) {
13177 initialState = init(initialArg);
13178 } else {
13179 initialState = initialArg;
13180 }
13181 hook.memoizedState = hook.baseState = initialState;
13182 var queue = hook.queue = {
13183 last: null,
13184 dispatch: null,
13185 eagerReducer: reducer,
13186 eagerState: initialState
13187 };
13188 var dispatch = queue.dispatch = dispatchAction.bind(null,
13189 // Flow doesn't know this is non-null, but we do.
13190 currentlyRenderingFiber$1, queue);
13191 return [hook.memoizedState, dispatch];
13192}
13193
13194function updateReducer(reducer, initialArg, init) {
13195 var hook = updateWorkInProgressHook();
13196 var queue = hook.queue;
13197 !(queue !== null) ? invariant(false, 'Should have a queue. This is likely a bug in React. Please file an issue.') : void 0;
13198
13199 if (numberOfReRenders > 0) {
13200 // This is a re-render. Apply the new render phase updates to the previous
13201 var _dispatch = queue.dispatch;
13202 if (renderPhaseUpdates !== null) {
13203 // Render phase updates are stored in a map of queue -> linked list
13204 var firstRenderPhaseUpdate = renderPhaseUpdates.get(queue);
13205 if (firstRenderPhaseUpdate !== undefined) {
13206 renderPhaseUpdates.delete(queue);
13207 var newState = hook.memoizedState;
13208 var update = firstRenderPhaseUpdate;
13209 do {
13210 // Process this render phase update. We don't have to check the
13211 // priority because it will always be the same as the current
13212 // render's.
13213 var _action = update.action;
13214 newState = reducer(newState, _action);
13215 update = update.next;
13216 } while (update !== null);
13217
13218 // Mark that the fiber performed work, but only if the new state is
13219 // different from the current state.
13220 if (!is(newState, hook.memoizedState)) {
13221 markWorkInProgressReceivedUpdate();
13222 }
13223
13224 hook.memoizedState = newState;
13225
13226 // Don't persist the state accumlated from the render phase updates to
13227 // the base state unless the queue is empty.
13228 // TODO: Not sure if this is the desired semantics, but it's what we
13229 // do for gDSFP. I can't remember why.
13230 if (hook.baseUpdate === queue.last) {
13231 hook.baseState = newState;
13232 }
13233
13234 return [newState, _dispatch];
13235 }
13236 }
13237 return [hook.memoizedState, _dispatch];
13238 }
13239
13240 // The last update in the entire queue
13241 var last = queue.last;
13242 // The last update that is part of the base state.
13243 var baseUpdate = hook.baseUpdate;
13244 var baseState = hook.baseState;
13245
13246 // Find the first unprocessed update.
13247 var first = void 0;
13248 if (baseUpdate !== null) {
13249 if (last !== null) {
13250 // For the first update, the queue is a circular linked list where
13251 // `queue.last.next = queue.first`. Once the first update commits, and
13252 // the `baseUpdate` is no longer empty, we can unravel the list.
13253 last.next = null;
13254 }
13255 first = baseUpdate.next;
13256 } else {
13257 first = last !== null ? last.next : null;
13258 }
13259 if (first !== null) {
13260 var _newState = baseState;
13261 var newBaseState = null;
13262 var newBaseUpdate = null;
13263 var prevUpdate = baseUpdate;
13264 var _update = first;
13265 var didSkip = false;
13266 do {
13267 var updateExpirationTime = _update.expirationTime;
13268 if (updateExpirationTime < renderExpirationTime) {
13269 // Priority is insufficient. Skip this update. If this is the first
13270 // skipped update, the previous update/state is the new base
13271 // update/state.
13272 if (!didSkip) {
13273 didSkip = true;
13274 newBaseUpdate = prevUpdate;
13275 newBaseState = _newState;
13276 }
13277 // Update the remaining priority in the queue.
13278 if (updateExpirationTime > remainingExpirationTime) {
13279 remainingExpirationTime = updateExpirationTime;
13280 }
13281 } else {
13282 // Process this update.
13283 if (_update.eagerReducer === reducer) {
13284 // If this update was processed eagerly, and its reducer matches the
13285 // current reducer, we can use the eagerly computed state.
13286 _newState = _update.eagerState;
13287 } else {
13288 var _action2 = _update.action;
13289 _newState = reducer(_newState, _action2);
13290 }
13291 }
13292 prevUpdate = _update;
13293 _update = _update.next;
13294 } while (_update !== null && _update !== first);
13295
13296 if (!didSkip) {
13297 newBaseUpdate = prevUpdate;
13298 newBaseState = _newState;
13299 }
13300
13301 // Mark that the fiber performed work, but only if the new state is
13302 // different from the current state.
13303 if (!is(_newState, hook.memoizedState)) {
13304 markWorkInProgressReceivedUpdate();
13305 }
13306
13307 hook.memoizedState = _newState;
13308 hook.baseUpdate = newBaseUpdate;
13309 hook.baseState = newBaseState;
13310
13311 queue.eagerReducer = reducer;
13312 queue.eagerState = _newState;
13313 }
13314
13315 var dispatch = queue.dispatch;
13316 return [hook.memoizedState, dispatch];
13317}
13318
13319function mountState(initialState) {
13320 var hook = mountWorkInProgressHook();
13321 if (typeof initialState === 'function') {
13322 initialState = initialState();
13323 }
13324 hook.memoizedState = hook.baseState = initialState;
13325 var queue = hook.queue = {
13326 last: null,
13327 dispatch: null,
13328 eagerReducer: basicStateReducer,
13329 eagerState: initialState
13330 };
13331 var dispatch = queue.dispatch = dispatchAction.bind(null,
13332 // Flow doesn't know this is non-null, but we do.
13333 currentlyRenderingFiber$1, queue);
13334 return [hook.memoizedState, dispatch];
13335}
13336
13337function updateState(initialState) {
13338 return updateReducer(basicStateReducer, initialState);
13339}
13340
13341function pushEffect(tag, create, destroy, deps) {
13342 var effect = {
13343 tag: tag,
13344 create: create,
13345 destroy: destroy,
13346 deps: deps,
13347 // Circular
13348 next: null
13349 };
13350 if (componentUpdateQueue === null) {
13351 componentUpdateQueue = createFunctionComponentUpdateQueue();
13352 componentUpdateQueue.lastEffect = effect.next = effect;
13353 } else {
13354 var _lastEffect = componentUpdateQueue.lastEffect;
13355 if (_lastEffect === null) {
13356 componentUpdateQueue.lastEffect = effect.next = effect;
13357 } else {
13358 var firstEffect = _lastEffect.next;
13359 _lastEffect.next = effect;
13360 effect.next = firstEffect;
13361 componentUpdateQueue.lastEffect = effect;
13362 }
13363 }
13364 return effect;
13365}
13366
13367function mountRef(initialValue) {
13368 var hook = mountWorkInProgressHook();
13369 var ref = { current: initialValue };
13370 {
13371 Object.seal(ref);
13372 }
13373 hook.memoizedState = ref;
13374 return ref;
13375}
13376
13377function updateRef(initialValue) {
13378 var hook = updateWorkInProgressHook();
13379 return hook.memoizedState;
13380}
13381
13382function mountEffectImpl(fiberEffectTag, hookEffectTag, create, deps) {
13383 var hook = mountWorkInProgressHook();
13384 var nextDeps = deps === undefined ? null : deps;
13385 sideEffectTag |= fiberEffectTag;
13386 hook.memoizedState = pushEffect(hookEffectTag, create, undefined, nextDeps);
13387}
13388
13389function updateEffectImpl(fiberEffectTag, hookEffectTag, create, deps) {
13390 var hook = updateWorkInProgressHook();
13391 var nextDeps = deps === undefined ? null : deps;
13392 var destroy = undefined;
13393
13394 if (currentHook !== null) {
13395 var prevEffect = currentHook.memoizedState;
13396 destroy = prevEffect.destroy;
13397 if (nextDeps !== null) {
13398 var prevDeps = prevEffect.deps;
13399 if (areHookInputsEqual(nextDeps, prevDeps)) {
13400 pushEffect(NoEffect$1, create, destroy, nextDeps);
13401 return;
13402 }
13403 }
13404 }
13405
13406 sideEffectTag |= fiberEffectTag;
13407 hook.memoizedState = pushEffect(hookEffectTag, create, destroy, nextDeps);
13408}
13409
13410function mountEffect(create, deps) {
13411 return mountEffectImpl(Update | Passive, UnmountPassive | MountPassive, create, deps);
13412}
13413
13414function updateEffect(create, deps) {
13415 return updateEffectImpl(Update | Passive, UnmountPassive | MountPassive, create, deps);
13416}
13417
13418function mountLayoutEffect(create, deps) {
13419 return mountEffectImpl(Update, UnmountMutation | MountLayout, create, deps);
13420}
13421
13422function updateLayoutEffect(create, deps) {
13423 return updateEffectImpl(Update, UnmountMutation | MountLayout, create, deps);
13424}
13425
13426function imperativeHandleEffect(create, ref) {
13427 if (typeof ref === 'function') {
13428 var refCallback = ref;
13429 var _inst = create();
13430 refCallback(_inst);
13431 return function () {
13432 refCallback(null);
13433 };
13434 } else if (ref !== null && ref !== undefined) {
13435 var refObject = ref;
13436 {
13437 !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;
13438 }
13439 var _inst2 = create();
13440 refObject.current = _inst2;
13441 return function () {
13442 refObject.current = null;
13443 };
13444 }
13445}
13446
13447function mountImperativeHandle(ref, create, deps) {
13448 {
13449 !(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;
13450 }
13451
13452 // TODO: If deps are provided, should we skip comparing the ref itself?
13453 var effectDeps = deps !== null && deps !== undefined ? deps.concat([ref]) : null;
13454
13455 return mountEffectImpl(Update, UnmountMutation | MountLayout, imperativeHandleEffect.bind(null, create, ref), effectDeps);
13456}
13457
13458function updateImperativeHandle(ref, create, deps) {
13459 {
13460 !(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;
13461 }
13462
13463 // TODO: If deps are provided, should we skip comparing the ref itself?
13464 var effectDeps = deps !== null && deps !== undefined ? deps.concat([ref]) : null;
13465
13466 return updateEffectImpl(Update, UnmountMutation | MountLayout, imperativeHandleEffect.bind(null, create, ref), effectDeps);
13467}
13468
13469function mountDebugValue(value, formatterFn) {
13470 // This hook is normally a no-op.
13471 // The react-debug-hooks package injects its own implementation
13472 // so that e.g. DevTools can display custom hook values.
13473}
13474
13475var updateDebugValue = mountDebugValue;
13476
13477function mountCallback(callback, deps) {
13478 var hook = mountWorkInProgressHook();
13479 var nextDeps = deps === undefined ? null : deps;
13480 hook.memoizedState = [callback, nextDeps];
13481 return callback;
13482}
13483
13484function updateCallback(callback, deps) {
13485 var hook = updateWorkInProgressHook();
13486 var nextDeps = deps === undefined ? null : deps;
13487 var prevState = hook.memoizedState;
13488 if (prevState !== null) {
13489 if (nextDeps !== null) {
13490 var prevDeps = prevState[1];
13491 if (areHookInputsEqual(nextDeps, prevDeps)) {
13492 return prevState[0];
13493 }
13494 }
13495 }
13496 hook.memoizedState = [callback, nextDeps];
13497 return callback;
13498}
13499
13500function mountMemo(nextCreate, deps) {
13501 var hook = mountWorkInProgressHook();
13502 var nextDeps = deps === undefined ? null : deps;
13503 var nextValue = nextCreate();
13504 hook.memoizedState = [nextValue, nextDeps];
13505 return nextValue;
13506}
13507
13508function updateMemo(nextCreate, deps) {
13509 var hook = updateWorkInProgressHook();
13510 var nextDeps = deps === undefined ? null : deps;
13511 var prevState = hook.memoizedState;
13512 if (prevState !== null) {
13513 // Assume these are defined. If they're not, areHookInputsEqual will warn.
13514 if (nextDeps !== null) {
13515 var prevDeps = prevState[1];
13516 if (areHookInputsEqual(nextDeps, prevDeps)) {
13517 return prevState[0];
13518 }
13519 }
13520 }
13521 var nextValue = nextCreate();
13522 hook.memoizedState = [nextValue, nextDeps];
13523 return nextValue;
13524}
13525
13526// in a test-like environment, we want to warn if dispatchAction()
13527// is called outside of a batchedUpdates/TestUtils.act(...) call.
13528var shouldWarnForUnbatchedSetState = false;
13529
13530{
13531 // jest isn't a 'global', it's just exposed to tests via a wrapped function
13532 // further, this isn't a test file, so flow doesn't recognize the symbol. So...
13533 // $FlowExpectedError - because requirements don't give a damn about your type sigs.
13534 if ('undefined' !== typeof jest) {
13535 shouldWarnForUnbatchedSetState = true;
13536 }
13537}
13538
13539function dispatchAction(fiber, queue, action) {
13540 !(numberOfReRenders < RE_RENDER_LIMIT) ? invariant(false, 'Too many re-renders. React limits the number of renders to prevent an infinite loop.') : void 0;
13541
13542 {
13543 !(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;
13544 }
13545
13546 var alternate = fiber.alternate;
13547 if (fiber === currentlyRenderingFiber$1 || alternate !== null && alternate === currentlyRenderingFiber$1) {
13548 // This is a render phase update. Stash it in a lazily-created map of
13549 // queue -> linked list of updates. After this render pass, we'll restart
13550 // and apply the stashed updates on top of the work-in-progress hook.
13551 didScheduleRenderPhaseUpdate = true;
13552 var update = {
13553 expirationTime: renderExpirationTime,
13554 action: action,
13555 eagerReducer: null,
13556 eagerState: null,
13557 next: null
13558 };
13559 if (renderPhaseUpdates === null) {
13560 renderPhaseUpdates = new Map();
13561 }
13562 var firstRenderPhaseUpdate = renderPhaseUpdates.get(queue);
13563 if (firstRenderPhaseUpdate === undefined) {
13564 renderPhaseUpdates.set(queue, update);
13565 } else {
13566 // Append the update to the end of the list.
13567 var lastRenderPhaseUpdate = firstRenderPhaseUpdate;
13568 while (lastRenderPhaseUpdate.next !== null) {
13569 lastRenderPhaseUpdate = lastRenderPhaseUpdate.next;
13570 }
13571 lastRenderPhaseUpdate.next = update;
13572 }
13573 } else {
13574 flushPassiveEffects();
13575
13576 var currentTime = requestCurrentTime();
13577 var _expirationTime = computeExpirationForFiber(currentTime, fiber);
13578
13579 var _update2 = {
13580 expirationTime: _expirationTime,
13581 action: action,
13582 eagerReducer: null,
13583 eagerState: null,
13584 next: null
13585 };
13586
13587 // Append the update to the end of the list.
13588 var _last = queue.last;
13589 if (_last === null) {
13590 // This is the first update. Create a circular list.
13591 _update2.next = _update2;
13592 } else {
13593 var first = _last.next;
13594 if (first !== null) {
13595 // Still circular.
13596 _update2.next = first;
13597 }
13598 _last.next = _update2;
13599 }
13600 queue.last = _update2;
13601
13602 if (fiber.expirationTime === NoWork && (alternate === null || alternate.expirationTime === NoWork)) {
13603 // The queue is currently empty, which means we can eagerly compute the
13604 // next state before entering the render phase. If the new state is the
13605 // same as the current state, we may be able to bail out entirely.
13606 var _eagerReducer = queue.eagerReducer;
13607 if (_eagerReducer !== null) {
13608 var prevDispatcher = void 0;
13609 {
13610 prevDispatcher = ReactCurrentDispatcher$1.current;
13611 ReactCurrentDispatcher$1.current = InvalidNestedHooksDispatcherOnUpdateInDEV;
13612 }
13613 try {
13614 var currentState = queue.eagerState;
13615 var _eagerState = _eagerReducer(currentState, action);
13616 // Stash the eagerly computed state, and the reducer used to compute
13617 // it, on the update object. If the reducer hasn't changed by the
13618 // time we enter the render phase, then the eager state can be used
13619 // without calling the reducer again.
13620 _update2.eagerReducer = _eagerReducer;
13621 _update2.eagerState = _eagerState;
13622 if (is(_eagerState, currentState)) {
13623 // Fast path. We can bail out without scheduling React to re-render.
13624 // It's still possible that we'll need to rebase this update later,
13625 // if the component re-renders for a different reason and by that
13626 // time the reducer has changed.
13627 return;
13628 }
13629 } catch (error) {
13630 // Suppress the error. It will throw again in the render phase.
13631 } finally {
13632 {
13633 ReactCurrentDispatcher$1.current = prevDispatcher;
13634 }
13635 }
13636 }
13637 }
13638 {
13639 if (shouldWarnForUnbatchedSetState === true) {
13640 warnIfNotCurrentlyBatchingInDev(fiber);
13641 }
13642 }
13643 scheduleWork(fiber, _expirationTime);
13644 }
13645}
13646
13647var ContextOnlyDispatcher = {
13648 readContext: readContext,
13649
13650 useCallback: throwInvalidHookError,
13651 useContext: throwInvalidHookError,
13652 useEffect: throwInvalidHookError,
13653 useImperativeHandle: throwInvalidHookError,
13654 useLayoutEffect: throwInvalidHookError,
13655 useMemo: throwInvalidHookError,
13656 useReducer: throwInvalidHookError,
13657 useRef: throwInvalidHookError,
13658 useState: throwInvalidHookError,
13659 useDebugValue: throwInvalidHookError
13660};
13661
13662var HooksDispatcherOnMountInDEV = null;
13663var HooksDispatcherOnUpdateInDEV = null;
13664var InvalidNestedHooksDispatcherOnMountInDEV = null;
13665var InvalidNestedHooksDispatcherOnUpdateInDEV = null;
13666
13667{
13668 var warnInvalidContextAccess = function () {
13669 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().');
13670 };
13671
13672 var warnInvalidHookAccess = function () {
13673 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');
13674 };
13675
13676 HooksDispatcherOnMountInDEV = {
13677 readContext: function (context, observedBits) {
13678 return readContext(context, observedBits);
13679 },
13680 useCallback: function (callback, deps) {
13681 currentHookNameInDev = 'useCallback';
13682 return mountCallback(callback, deps);
13683 },
13684 useContext: function (context, observedBits) {
13685 currentHookNameInDev = 'useContext';
13686 return mountContext(context, observedBits);
13687 },
13688 useEffect: function (create, deps) {
13689 currentHookNameInDev = 'useEffect';
13690 return mountEffect(create, deps);
13691 },
13692 useImperativeHandle: function (ref, create, deps) {
13693 currentHookNameInDev = 'useImperativeHandle';
13694 return mountImperativeHandle(ref, create, deps);
13695 },
13696 useLayoutEffect: function (create, deps) {
13697 currentHookNameInDev = 'useLayoutEffect';
13698 return mountLayoutEffect(create, deps);
13699 },
13700 useMemo: function (create, deps) {
13701 currentHookNameInDev = 'useMemo';
13702 var prevDispatcher = ReactCurrentDispatcher$1.current;
13703 ReactCurrentDispatcher$1.current = InvalidNestedHooksDispatcherOnMountInDEV;
13704 try {
13705 return mountMemo(create, deps);
13706 } finally {
13707 ReactCurrentDispatcher$1.current = prevDispatcher;
13708 }
13709 },
13710 useReducer: function (reducer, initialArg, init) {
13711 currentHookNameInDev = 'useReducer';
13712 var prevDispatcher = ReactCurrentDispatcher$1.current;
13713 ReactCurrentDispatcher$1.current = InvalidNestedHooksDispatcherOnMountInDEV;
13714 try {
13715 return mountReducer(reducer, initialArg, init);
13716 } finally {
13717 ReactCurrentDispatcher$1.current = prevDispatcher;
13718 }
13719 },
13720 useRef: function (initialValue) {
13721 currentHookNameInDev = 'useRef';
13722 return mountRef(initialValue);
13723 },
13724 useState: function (initialState) {
13725 currentHookNameInDev = 'useState';
13726 var prevDispatcher = ReactCurrentDispatcher$1.current;
13727 ReactCurrentDispatcher$1.current = InvalidNestedHooksDispatcherOnMountInDEV;
13728 try {
13729 return mountState(initialState);
13730 } finally {
13731 ReactCurrentDispatcher$1.current = prevDispatcher;
13732 }
13733 },
13734 useDebugValue: function (value, formatterFn) {
13735 currentHookNameInDev = 'useDebugValue';
13736 return mountDebugValue(value, formatterFn);
13737 }
13738 };
13739
13740 HooksDispatcherOnUpdateInDEV = {
13741 readContext: function (context, observedBits) {
13742 return readContext(context, observedBits);
13743 },
13744 useCallback: function (callback, deps) {
13745 currentHookNameInDev = 'useCallback';
13746 return updateCallback(callback, deps);
13747 },
13748 useContext: function (context, observedBits) {
13749 currentHookNameInDev = 'useContext';
13750 return updateContext(context, observedBits);
13751 },
13752 useEffect: function (create, deps) {
13753 currentHookNameInDev = 'useEffect';
13754 return updateEffect(create, deps);
13755 },
13756 useImperativeHandle: function (ref, create, deps) {
13757 currentHookNameInDev = 'useImperativeHandle';
13758 return updateImperativeHandle(ref, create, deps);
13759 },
13760 useLayoutEffect: function (create, deps) {
13761 currentHookNameInDev = 'useLayoutEffect';
13762 return updateLayoutEffect(create, deps);
13763 },
13764 useMemo: function (create, deps) {
13765 currentHookNameInDev = 'useMemo';
13766 var prevDispatcher = ReactCurrentDispatcher$1.current;
13767 ReactCurrentDispatcher$1.current = InvalidNestedHooksDispatcherOnUpdateInDEV;
13768 try {
13769 return updateMemo(create, deps);
13770 } finally {
13771 ReactCurrentDispatcher$1.current = prevDispatcher;
13772 }
13773 },
13774 useReducer: function (reducer, initialArg, init) {
13775 currentHookNameInDev = 'useReducer';
13776 var prevDispatcher = ReactCurrentDispatcher$1.current;
13777 ReactCurrentDispatcher$1.current = InvalidNestedHooksDispatcherOnUpdateInDEV;
13778 try {
13779 return updateReducer(reducer, initialArg, init);
13780 } finally {
13781 ReactCurrentDispatcher$1.current = prevDispatcher;
13782 }
13783 },
13784 useRef: function (initialValue) {
13785 currentHookNameInDev = 'useRef';
13786 return updateRef(initialValue);
13787 },
13788 useState: function (initialState) {
13789 currentHookNameInDev = 'useState';
13790 var prevDispatcher = ReactCurrentDispatcher$1.current;
13791 ReactCurrentDispatcher$1.current = InvalidNestedHooksDispatcherOnUpdateInDEV;
13792 try {
13793 return updateState(initialState);
13794 } finally {
13795 ReactCurrentDispatcher$1.current = prevDispatcher;
13796 }
13797 },
13798 useDebugValue: function (value, formatterFn) {
13799 currentHookNameInDev = 'useDebugValue';
13800 return updateDebugValue(value, formatterFn);
13801 }
13802 };
13803
13804 InvalidNestedHooksDispatcherOnMountInDEV = {
13805 readContext: function (context, observedBits) {
13806 warnInvalidContextAccess();
13807 return readContext(context, observedBits);
13808 },
13809 useCallback: function (callback, deps) {
13810 currentHookNameInDev = 'useCallback';
13811 warnInvalidHookAccess();
13812 return mountCallback(callback, deps);
13813 },
13814 useContext: function (context, observedBits) {
13815 currentHookNameInDev = 'useContext';
13816 warnInvalidHookAccess();
13817 return mountContext(context, observedBits);
13818 },
13819 useEffect: function (create, deps) {
13820 currentHookNameInDev = 'useEffect';
13821 warnInvalidHookAccess();
13822 return mountEffect(create, deps);
13823 },
13824 useImperativeHandle: function (ref, create, deps) {
13825 currentHookNameInDev = 'useImperativeHandle';
13826 warnInvalidHookAccess();
13827 return mountImperativeHandle(ref, create, deps);
13828 },
13829 useLayoutEffect: function (create, deps) {
13830 currentHookNameInDev = 'useLayoutEffect';
13831 warnInvalidHookAccess();
13832 return mountLayoutEffect(create, deps);
13833 },
13834 useMemo: function (create, deps) {
13835 currentHookNameInDev = 'useMemo';
13836 warnInvalidHookAccess();
13837 var prevDispatcher = ReactCurrentDispatcher$1.current;
13838 ReactCurrentDispatcher$1.current = InvalidNestedHooksDispatcherOnMountInDEV;
13839 try {
13840 return mountMemo(create, deps);
13841 } finally {
13842 ReactCurrentDispatcher$1.current = prevDispatcher;
13843 }
13844 },
13845 useReducer: function (reducer, initialArg, init) {
13846 currentHookNameInDev = 'useReducer';
13847 warnInvalidHookAccess();
13848 var prevDispatcher = ReactCurrentDispatcher$1.current;
13849 ReactCurrentDispatcher$1.current = InvalidNestedHooksDispatcherOnMountInDEV;
13850 try {
13851 return mountReducer(reducer, initialArg, init);
13852 } finally {
13853 ReactCurrentDispatcher$1.current = prevDispatcher;
13854 }
13855 },
13856 useRef: function (initialValue) {
13857 currentHookNameInDev = 'useRef';
13858 warnInvalidHookAccess();
13859 return mountRef(initialValue);
13860 },
13861 useState: function (initialState) {
13862 currentHookNameInDev = 'useState';
13863 warnInvalidHookAccess();
13864 var prevDispatcher = ReactCurrentDispatcher$1.current;
13865 ReactCurrentDispatcher$1.current = InvalidNestedHooksDispatcherOnMountInDEV;
13866 try {
13867 return mountState(initialState);
13868 } finally {
13869 ReactCurrentDispatcher$1.current = prevDispatcher;
13870 }
13871 },
13872 useDebugValue: function (value, formatterFn) {
13873 currentHookNameInDev = 'useDebugValue';
13874 warnInvalidHookAccess();
13875 return mountDebugValue(value, formatterFn);
13876 }
13877 };
13878
13879 InvalidNestedHooksDispatcherOnUpdateInDEV = {
13880 readContext: function (context, observedBits) {
13881 warnInvalidContextAccess();
13882 return readContext(context, observedBits);
13883 },
13884 useCallback: function (callback, deps) {
13885 currentHookNameInDev = 'useCallback';
13886 warnInvalidHookAccess();
13887 return updateCallback(callback, deps);
13888 },
13889 useContext: function (context, observedBits) {
13890 currentHookNameInDev = 'useContext';
13891 warnInvalidHookAccess();
13892 return updateContext(context, observedBits);
13893 },
13894 useEffect: function (create, deps) {
13895 currentHookNameInDev = 'useEffect';
13896 warnInvalidHookAccess();
13897 return updateEffect(create, deps);
13898 },
13899 useImperativeHandle: function (ref, create, deps) {
13900 currentHookNameInDev = 'useImperativeHandle';
13901 warnInvalidHookAccess();
13902 return updateImperativeHandle(ref, create, deps);
13903 },
13904 useLayoutEffect: function (create, deps) {
13905 currentHookNameInDev = 'useLayoutEffect';
13906 warnInvalidHookAccess();
13907 return updateLayoutEffect(create, deps);
13908 },
13909 useMemo: function (create, deps) {
13910 currentHookNameInDev = 'useMemo';
13911 warnInvalidHookAccess();
13912 var prevDispatcher = ReactCurrentDispatcher$1.current;
13913 ReactCurrentDispatcher$1.current = InvalidNestedHooksDispatcherOnUpdateInDEV;
13914 try {
13915 return updateMemo(create, deps);
13916 } finally {
13917 ReactCurrentDispatcher$1.current = prevDispatcher;
13918 }
13919 },
13920 useReducer: function (reducer, initialArg, init) {
13921 currentHookNameInDev = 'useReducer';
13922 warnInvalidHookAccess();
13923 var prevDispatcher = ReactCurrentDispatcher$1.current;
13924 ReactCurrentDispatcher$1.current = InvalidNestedHooksDispatcherOnUpdateInDEV;
13925 try {
13926 return updateReducer(reducer, initialArg, init);
13927 } finally {
13928 ReactCurrentDispatcher$1.current = prevDispatcher;
13929 }
13930 },
13931 useRef: function (initialValue) {
13932 currentHookNameInDev = 'useRef';
13933 warnInvalidHookAccess();
13934 return updateRef(initialValue);
13935 },
13936 useState: function (initialState) {
13937 currentHookNameInDev = 'useState';
13938 warnInvalidHookAccess();
13939 var prevDispatcher = ReactCurrentDispatcher$1.current;
13940 ReactCurrentDispatcher$1.current = InvalidNestedHooksDispatcherOnUpdateInDEV;
13941 try {
13942 return updateState(initialState);
13943 } finally {
13944 ReactCurrentDispatcher$1.current = prevDispatcher;
13945 }
13946 },
13947 useDebugValue: function (value, formatterFn) {
13948 currentHookNameInDev = 'useDebugValue';
13949 warnInvalidHookAccess();
13950 return updateDebugValue(value, formatterFn);
13951 }
13952 };
13953}
13954
13955var commitTime = 0;
13956var profilerStartTime = -1;
13957
13958function getCommitTime() {
13959 return commitTime;
13960}
13961
13962function recordCommitTime() {
13963 if (!enableProfilerTimer) {
13964 return;
13965 }
13966 commitTime = unstable_now();
13967}
13968
13969function startProfilerTimer(fiber) {
13970 if (!enableProfilerTimer) {
13971 return;
13972 }
13973
13974 profilerStartTime = unstable_now();
13975
13976 if (fiber.actualStartTime < 0) {
13977 fiber.actualStartTime = unstable_now();
13978 }
13979}
13980
13981function stopProfilerTimerIfRunning(fiber) {
13982 if (!enableProfilerTimer) {
13983 return;
13984 }
13985 profilerStartTime = -1;
13986}
13987
13988function stopProfilerTimerIfRunningAndRecordDelta(fiber, overrideBaseTime) {
13989 if (!enableProfilerTimer) {
13990 return;
13991 }
13992
13993 if (profilerStartTime >= 0) {
13994 var elapsedTime = unstable_now() - profilerStartTime;
13995 fiber.actualDuration += elapsedTime;
13996 if (overrideBaseTime) {
13997 fiber.selfBaseDuration = elapsedTime;
13998 }
13999 profilerStartTime = -1;
14000 }
14001}
14002
14003// The deepest Fiber on the stack involved in a hydration context.
14004// This may have been an insertion or a hydration.
14005var hydrationParentFiber = null;
14006var nextHydratableInstance = null;
14007var isHydrating = false;
14008
14009function enterHydrationState(fiber) {
14010 if (!supportsHydration) {
14011 return false;
14012 }
14013
14014 var parentInstance = fiber.stateNode.containerInfo;
14015 nextHydratableInstance = getFirstHydratableChild(parentInstance);
14016 hydrationParentFiber = fiber;
14017 isHydrating = true;
14018 return true;
14019}
14020
14021function reenterHydrationStateFromDehydratedSuspenseInstance(fiber) {
14022 if (!supportsHydration) {
14023 return false;
14024 }
14025
14026 var suspenseInstance = fiber.stateNode;
14027 nextHydratableInstance = getNextHydratableSibling(suspenseInstance);
14028 popToNextHostParent(fiber);
14029 isHydrating = true;
14030 return true;
14031}
14032
14033function deleteHydratableInstance(returnFiber, instance) {
14034 {
14035 switch (returnFiber.tag) {
14036 case HostRoot:
14037 didNotHydrateContainerInstance(returnFiber.stateNode.containerInfo, instance);
14038 break;
14039 case HostComponent:
14040 didNotHydrateInstance(returnFiber.type, returnFiber.memoizedProps, returnFiber.stateNode, instance);
14041 break;
14042 }
14043 }
14044
14045 var childToDelete = createFiberFromHostInstanceForDeletion();
14046 childToDelete.stateNode = instance;
14047 childToDelete.return = returnFiber;
14048 childToDelete.effectTag = Deletion;
14049
14050 // This might seem like it belongs on progressedFirstDeletion. However,
14051 // these children are not part of the reconciliation list of children.
14052 // Even if we abort and rereconcile the children, that will try to hydrate
14053 // again and the nodes are still in the host tree so these will be
14054 // recreated.
14055 if (returnFiber.lastEffect !== null) {
14056 returnFiber.lastEffect.nextEffect = childToDelete;
14057 returnFiber.lastEffect = childToDelete;
14058 } else {
14059 returnFiber.firstEffect = returnFiber.lastEffect = childToDelete;
14060 }
14061}
14062
14063function insertNonHydratedInstance(returnFiber, fiber) {
14064 fiber.effectTag |= Placement;
14065 {
14066 switch (returnFiber.tag) {
14067 case HostRoot:
14068 {
14069 var parentContainer = returnFiber.stateNode.containerInfo;
14070 switch (fiber.tag) {
14071 case HostComponent:
14072 var type = fiber.type;
14073 var props = fiber.pendingProps;
14074 didNotFindHydratableContainerInstance(parentContainer, type, props);
14075 break;
14076 case HostText:
14077 var text = fiber.pendingProps;
14078 didNotFindHydratableContainerTextInstance(parentContainer, text);
14079 break;
14080 case SuspenseComponent:
14081
14082 break;
14083 }
14084 break;
14085 }
14086 case HostComponent:
14087 {
14088 var parentType = returnFiber.type;
14089 var parentProps = returnFiber.memoizedProps;
14090 var parentInstance = returnFiber.stateNode;
14091 switch (fiber.tag) {
14092 case HostComponent:
14093 var _type = fiber.type;
14094 var _props = fiber.pendingProps;
14095 didNotFindHydratableInstance(parentType, parentProps, parentInstance, _type, _props);
14096 break;
14097 case HostText:
14098 var _text = fiber.pendingProps;
14099 didNotFindHydratableTextInstance(parentType, parentProps, parentInstance, _text);
14100 break;
14101 case SuspenseComponent:
14102 didNotFindHydratableSuspenseInstance(parentType, parentProps, parentInstance);
14103 break;
14104 }
14105 break;
14106 }
14107 default:
14108 return;
14109 }
14110 }
14111}
14112
14113function tryHydrate(fiber, nextInstance) {
14114 switch (fiber.tag) {
14115 case HostComponent:
14116 {
14117 var type = fiber.type;
14118 var props = fiber.pendingProps;
14119 var instance = canHydrateInstance(nextInstance, type, props);
14120 if (instance !== null) {
14121 fiber.stateNode = instance;
14122 return true;
14123 }
14124 return false;
14125 }
14126 case HostText:
14127 {
14128 var text = fiber.pendingProps;
14129 var textInstance = canHydrateTextInstance(nextInstance, text);
14130 if (textInstance !== null) {
14131 fiber.stateNode = textInstance;
14132 return true;
14133 }
14134 return false;
14135 }
14136 case SuspenseComponent:
14137 {
14138 if (enableSuspenseServerRenderer) {
14139 var suspenseInstance = canHydrateSuspenseInstance(nextInstance);
14140 if (suspenseInstance !== null) {
14141 // Downgrade the tag to a dehydrated component until we've hydrated it.
14142 fiber.tag = DehydratedSuspenseComponent;
14143 fiber.stateNode = suspenseInstance;
14144 return true;
14145 }
14146 }
14147 return false;
14148 }
14149 default:
14150 return false;
14151 }
14152}
14153
14154function tryToClaimNextHydratableInstance(fiber) {
14155 if (!isHydrating) {
14156 return;
14157 }
14158 var nextInstance = nextHydratableInstance;
14159 if (!nextInstance) {
14160 // Nothing to hydrate. Make it an insertion.
14161 insertNonHydratedInstance(hydrationParentFiber, fiber);
14162 isHydrating = false;
14163 hydrationParentFiber = fiber;
14164 return;
14165 }
14166 var firstAttemptedInstance = nextInstance;
14167 if (!tryHydrate(fiber, nextInstance)) {
14168 // If we can't hydrate this instance let's try the next one.
14169 // We use this as a heuristic. It's based on intuition and not data so it
14170 // might be flawed or unnecessary.
14171 nextInstance = getNextHydratableSibling(firstAttemptedInstance);
14172 if (!nextInstance || !tryHydrate(fiber, nextInstance)) {
14173 // Nothing to hydrate. Make it an insertion.
14174 insertNonHydratedInstance(hydrationParentFiber, fiber);
14175 isHydrating = false;
14176 hydrationParentFiber = fiber;
14177 return;
14178 }
14179 // We matched the next one, we'll now assume that the first one was
14180 // superfluous and we'll delete it. Since we can't eagerly delete it
14181 // we'll have to schedule a deletion. To do that, this node needs a dummy
14182 // fiber associated with it.
14183 deleteHydratableInstance(hydrationParentFiber, firstAttemptedInstance);
14184 }
14185 hydrationParentFiber = fiber;
14186 nextHydratableInstance = getFirstHydratableChild(nextInstance);
14187}
14188
14189function prepareToHydrateHostInstance(fiber, rootContainerInstance, hostContext) {
14190 if (!supportsHydration) {
14191 invariant(false, 'Expected prepareToHydrateHostInstance() to never be called. This error is likely caused by a bug in React. Please file an issue.');
14192 }
14193
14194 var instance = fiber.stateNode;
14195 var updatePayload = hydrateInstance(instance, fiber.type, fiber.memoizedProps, rootContainerInstance, hostContext, fiber);
14196 // TODO: Type this specific to this type of component.
14197 fiber.updateQueue = updatePayload;
14198 // If the update payload indicates that there is a change or if there
14199 // is a new ref we mark this as an update.
14200 if (updatePayload !== null) {
14201 return true;
14202 }
14203 return false;
14204}
14205
14206function prepareToHydrateHostTextInstance(fiber) {
14207 if (!supportsHydration) {
14208 invariant(false, 'Expected prepareToHydrateHostTextInstance() to never be called. This error is likely caused by a bug in React. Please file an issue.');
14209 }
14210
14211 var textInstance = fiber.stateNode;
14212 var textContent = fiber.memoizedProps;
14213 var shouldUpdate = hydrateTextInstance(textInstance, textContent, fiber);
14214 {
14215 if (shouldUpdate) {
14216 // We assume that prepareToHydrateHostTextInstance is called in a context where the
14217 // hydration parent is the parent host component of this host text.
14218 var returnFiber = hydrationParentFiber;
14219 if (returnFiber !== null) {
14220 switch (returnFiber.tag) {
14221 case HostRoot:
14222 {
14223 var parentContainer = returnFiber.stateNode.containerInfo;
14224 didNotMatchHydratedContainerTextInstance(parentContainer, textInstance, textContent);
14225 break;
14226 }
14227 case HostComponent:
14228 {
14229 var parentType = returnFiber.type;
14230 var parentProps = returnFiber.memoizedProps;
14231 var parentInstance = returnFiber.stateNode;
14232 didNotMatchHydratedTextInstance(parentType, parentProps, parentInstance, textInstance, textContent);
14233 break;
14234 }
14235 }
14236 }
14237 }
14238 }
14239 return shouldUpdate;
14240}
14241
14242function skipPastDehydratedSuspenseInstance(fiber) {
14243 if (!supportsHydration) {
14244 invariant(false, 'Expected skipPastDehydratedSuspenseInstance() to never be called. This error is likely caused by a bug in React. Please file an issue.');
14245 }
14246 var suspenseInstance = fiber.stateNode;
14247 !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;
14248 nextHydratableInstance = getNextHydratableInstanceAfterSuspenseInstance(suspenseInstance);
14249}
14250
14251function popToNextHostParent(fiber) {
14252 var parent = fiber.return;
14253 while (parent !== null && parent.tag !== HostComponent && parent.tag !== HostRoot && parent.tag !== DehydratedSuspenseComponent) {
14254 parent = parent.return;
14255 }
14256 hydrationParentFiber = parent;
14257}
14258
14259function popHydrationState(fiber) {
14260 if (!supportsHydration) {
14261 return false;
14262 }
14263 if (fiber !== hydrationParentFiber) {
14264 // We're deeper than the current hydration context, inside an inserted
14265 // tree.
14266 return false;
14267 }
14268 if (!isHydrating) {
14269 // If we're not currently hydrating but we're in a hydration context, then
14270 // we were an insertion and now need to pop up reenter hydration of our
14271 // siblings.
14272 popToNextHostParent(fiber);
14273 isHydrating = true;
14274 return false;
14275 }
14276
14277 var type = fiber.type;
14278
14279 // If we have any remaining hydratable nodes, we need to delete them now.
14280 // We only do this deeper than head and body since they tend to have random
14281 // other nodes in them. We also ignore components with pure text content in
14282 // side of them.
14283 // TODO: Better heuristic.
14284 if (fiber.tag !== HostComponent || type !== 'head' && type !== 'body' && !shouldSetTextContent(type, fiber.memoizedProps)) {
14285 var nextInstance = nextHydratableInstance;
14286 while (nextInstance) {
14287 deleteHydratableInstance(fiber, nextInstance);
14288 nextInstance = getNextHydratableSibling(nextInstance);
14289 }
14290 }
14291
14292 popToNextHostParent(fiber);
14293 nextHydratableInstance = hydrationParentFiber ? getNextHydratableSibling(fiber.stateNode) : null;
14294 return true;
14295}
14296
14297function resetHydrationState() {
14298 if (!supportsHydration) {
14299 return;
14300 }
14301
14302 hydrationParentFiber = null;
14303 nextHydratableInstance = null;
14304 isHydrating = false;
14305}
14306
14307var ReactCurrentOwner$3 = ReactSharedInternals.ReactCurrentOwner;
14308
14309var didReceiveUpdate = false;
14310
14311var didWarnAboutBadClass = void 0;
14312var didWarnAboutContextTypeOnFunctionComponent = void 0;
14313var didWarnAboutGetDerivedStateOnFunctionComponent = void 0;
14314var didWarnAboutFunctionRefs = void 0;
14315var didWarnAboutReassigningProps = void 0;
14316
14317{
14318 didWarnAboutBadClass = {};
14319 didWarnAboutContextTypeOnFunctionComponent = {};
14320 didWarnAboutGetDerivedStateOnFunctionComponent = {};
14321 didWarnAboutFunctionRefs = {};
14322 didWarnAboutReassigningProps = false;
14323}
14324
14325function reconcileChildren(current$$1, workInProgress, nextChildren, renderExpirationTime) {
14326 if (current$$1 === null) {
14327 // If this is a fresh new component that hasn't been rendered yet, we
14328 // won't update its child set by applying minimal side-effects. Instead,
14329 // we will add them all to the child before it gets rendered. That means
14330 // we can optimize this reconciliation pass by not tracking side-effects.
14331 workInProgress.child = mountChildFibers(workInProgress, null, nextChildren, renderExpirationTime);
14332 } else {
14333 // If the current child is the same as the work in progress, it means that
14334 // we haven't yet started any work on these children. Therefore, we use
14335 // the clone algorithm to create a copy of all the current children.
14336
14337 // If we had any progressed work already, that is invalid at this point so
14338 // let's throw it out.
14339 workInProgress.child = reconcileChildFibers(workInProgress, current$$1.child, nextChildren, renderExpirationTime);
14340 }
14341}
14342
14343function forceUnmountCurrentAndReconcile(current$$1, workInProgress, nextChildren, renderExpirationTime) {
14344 // This function is fork of reconcileChildren. It's used in cases where we
14345 // want to reconcile without matching against the existing set. This has the
14346 // effect of all current children being unmounted; even if the type and key
14347 // are the same, the old child is unmounted and a new child is created.
14348 //
14349 // To do this, we're going to go through the reconcile algorithm twice. In
14350 // the first pass, we schedule a deletion for all the current children by
14351 // passing null.
14352 workInProgress.child = reconcileChildFibers(workInProgress, current$$1.child, null, renderExpirationTime);
14353 // In the second pass, we mount the new children. The trick here is that we
14354 // pass null in place of where we usually pass the current child set. This has
14355 // the effect of remounting all children regardless of whether their their
14356 // identity matches.
14357 workInProgress.child = reconcileChildFibers(workInProgress, null, nextChildren, renderExpirationTime);
14358}
14359
14360function updateForwardRef(current$$1, workInProgress, Component, nextProps, renderExpirationTime) {
14361 // TODO: current can be non-null here even if the component
14362 // hasn't yet mounted. This happens after the first render suspends.
14363 // We'll need to figure out if this is fine or can cause issues.
14364
14365 {
14366 if (workInProgress.type !== workInProgress.elementType) {
14367 // Lazy component props can't be validated in createElement
14368 // because they're only guaranteed to be resolved here.
14369 var innerPropTypes = Component.propTypes;
14370 if (innerPropTypes) {
14371 checkPropTypes_1(innerPropTypes, nextProps, // Resolved props
14372 'prop', getComponentName(Component), getCurrentFiberStackInDev);
14373 }
14374 }
14375 }
14376
14377 var render = Component.render;
14378 var ref = workInProgress.ref;
14379
14380 // The rest is a fork of updateFunctionComponent
14381 var nextChildren = void 0;
14382 prepareToReadContext(workInProgress, renderExpirationTime);
14383 {
14384 ReactCurrentOwner$3.current = workInProgress;
14385 setCurrentPhase('render');
14386 nextChildren = renderWithHooks(current$$1, workInProgress, render, nextProps, ref, renderExpirationTime);
14387 if (debugRenderPhaseSideEffects || debugRenderPhaseSideEffectsForStrictMode && workInProgress.mode & StrictMode) {
14388 // Only double-render components with Hooks
14389 if (workInProgress.memoizedState !== null) {
14390 nextChildren = renderWithHooks(current$$1, workInProgress, render, nextProps, ref, renderExpirationTime);
14391 }
14392 }
14393 setCurrentPhase(null);
14394 }
14395
14396 if (current$$1 !== null && !didReceiveUpdate) {
14397 bailoutHooks(current$$1, workInProgress, renderExpirationTime);
14398 return bailoutOnAlreadyFinishedWork(current$$1, workInProgress, renderExpirationTime);
14399 }
14400
14401 // React DevTools reads this flag.
14402 workInProgress.effectTag |= PerformedWork;
14403 reconcileChildren(current$$1, workInProgress, nextChildren, renderExpirationTime);
14404 return workInProgress.child;
14405}
14406
14407function updateMemoComponent(current$$1, workInProgress, Component, nextProps, updateExpirationTime, renderExpirationTime) {
14408 if (current$$1 === null) {
14409 var type = Component.type;
14410 if (isSimpleFunctionComponent(type) && Component.compare === null &&
14411 // SimpleMemoComponent codepath doesn't resolve outer props either.
14412 Component.defaultProps === undefined) {
14413 // If this is a plain function component without default props,
14414 // and with only the default shallow comparison, we upgrade it
14415 // to a SimpleMemoComponent to allow fast path updates.
14416 workInProgress.tag = SimpleMemoComponent;
14417 workInProgress.type = type;
14418 {
14419 validateFunctionComponentInDev(workInProgress, type);
14420 }
14421 return updateSimpleMemoComponent(current$$1, workInProgress, type, nextProps, updateExpirationTime, renderExpirationTime);
14422 }
14423 {
14424 var innerPropTypes = type.propTypes;
14425 if (innerPropTypes) {
14426 // Inner memo component props aren't currently validated in createElement.
14427 // We could move it there, but we'd still need this for lazy code path.
14428 checkPropTypes_1(innerPropTypes, nextProps, // Resolved props
14429 'prop', getComponentName(type), getCurrentFiberStackInDev);
14430 }
14431 }
14432 var child = createFiberFromTypeAndProps(Component.type, null, nextProps, null, workInProgress.mode, renderExpirationTime);
14433 child.ref = workInProgress.ref;
14434 child.return = workInProgress;
14435 workInProgress.child = child;
14436 return child;
14437 }
14438 {
14439 var _type = Component.type;
14440 var _innerPropTypes = _type.propTypes;
14441 if (_innerPropTypes) {
14442 // Inner memo component props aren't currently validated in createElement.
14443 // We could move it there, but we'd still need this for lazy code path.
14444 checkPropTypes_1(_innerPropTypes, nextProps, // Resolved props
14445 'prop', getComponentName(_type), getCurrentFiberStackInDev);
14446 }
14447 }
14448 var currentChild = current$$1.child; // This is always exactly one child
14449 if (updateExpirationTime < renderExpirationTime) {
14450 // This will be the props with resolved defaultProps,
14451 // unlike current.memoizedProps which will be the unresolved ones.
14452 var prevProps = currentChild.memoizedProps;
14453 // Default to shallow comparison
14454 var compare = Component.compare;
14455 compare = compare !== null ? compare : shallowEqual;
14456 if (compare(prevProps, nextProps) && current$$1.ref === workInProgress.ref) {
14457 return bailoutOnAlreadyFinishedWork(current$$1, workInProgress, renderExpirationTime);
14458 }
14459 }
14460 // React DevTools reads this flag.
14461 workInProgress.effectTag |= PerformedWork;
14462 var newChild = createWorkInProgress(currentChild, nextProps, renderExpirationTime);
14463 newChild.ref = workInProgress.ref;
14464 newChild.return = workInProgress;
14465 workInProgress.child = newChild;
14466 return newChild;
14467}
14468
14469function updateSimpleMemoComponent(current$$1, workInProgress, Component, nextProps, updateExpirationTime, renderExpirationTime) {
14470 // TODO: current can be non-null here even if the component
14471 // hasn't yet mounted. This happens when the inner render suspends.
14472 // We'll need to figure out if this is fine or can cause issues.
14473
14474 {
14475 if (workInProgress.type !== workInProgress.elementType) {
14476 // Lazy component props can't be validated in createElement
14477 // because they're only guaranteed to be resolved here.
14478 var outerMemoType = workInProgress.elementType;
14479 if (outerMemoType.$$typeof === REACT_LAZY_TYPE) {
14480 // We warn when you define propTypes on lazy()
14481 // so let's just skip over it to find memo() outer wrapper.
14482 // Inner props for memo are validated later.
14483 outerMemoType = refineResolvedLazyComponent(outerMemoType);
14484 }
14485 var outerPropTypes = outerMemoType && outerMemoType.propTypes;
14486 if (outerPropTypes) {
14487 checkPropTypes_1(outerPropTypes, nextProps, // Resolved (SimpleMemoComponent has no defaultProps)
14488 'prop', getComponentName(outerMemoType), getCurrentFiberStackInDev);
14489 }
14490 // Inner propTypes will be validated in the function component path.
14491 }
14492 }
14493 if (current$$1 !== null) {
14494 var prevProps = current$$1.memoizedProps;
14495 if (shallowEqual(prevProps, nextProps) && current$$1.ref === workInProgress.ref) {
14496 didReceiveUpdate = false;
14497 if (updateExpirationTime < renderExpirationTime) {
14498 return bailoutOnAlreadyFinishedWork(current$$1, workInProgress, renderExpirationTime);
14499 }
14500 }
14501 }
14502 return updateFunctionComponent(current$$1, workInProgress, Component, nextProps, renderExpirationTime);
14503}
14504
14505function updateFragment(current$$1, workInProgress, renderExpirationTime) {
14506 var nextChildren = workInProgress.pendingProps;
14507 reconcileChildren(current$$1, workInProgress, nextChildren, renderExpirationTime);
14508 return workInProgress.child;
14509}
14510
14511function updateMode(current$$1, workInProgress, renderExpirationTime) {
14512 var nextChildren = workInProgress.pendingProps.children;
14513 reconcileChildren(current$$1, workInProgress, nextChildren, renderExpirationTime);
14514 return workInProgress.child;
14515}
14516
14517function updateProfiler(current$$1, workInProgress, renderExpirationTime) {
14518 if (enableProfilerTimer) {
14519 workInProgress.effectTag |= Update;
14520 }
14521 var nextProps = workInProgress.pendingProps;
14522 var nextChildren = nextProps.children;
14523 reconcileChildren(current$$1, workInProgress, nextChildren, renderExpirationTime);
14524 return workInProgress.child;
14525}
14526
14527function markRef(current$$1, workInProgress) {
14528 var ref = workInProgress.ref;
14529 if (current$$1 === null && ref !== null || current$$1 !== null && current$$1.ref !== ref) {
14530 // Schedule a Ref effect
14531 workInProgress.effectTag |= Ref;
14532 }
14533}
14534
14535function updateFunctionComponent(current$$1, workInProgress, Component, nextProps, renderExpirationTime) {
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 unmaskedContext = getUnmaskedContext(workInProgress, Component, true);
14549 var context = getMaskedContext(workInProgress, unmaskedContext);
14550
14551 var nextChildren = void 0;
14552 prepareToReadContext(workInProgress, renderExpirationTime);
14553 {
14554 ReactCurrentOwner$3.current = workInProgress;
14555 setCurrentPhase('render');
14556 nextChildren = renderWithHooks(current$$1, workInProgress, Component, nextProps, context, renderExpirationTime);
14557 if (debugRenderPhaseSideEffects || debugRenderPhaseSideEffectsForStrictMode && workInProgress.mode & StrictMode) {
14558 // Only double-render components with Hooks
14559 if (workInProgress.memoizedState !== null) {
14560 nextChildren = renderWithHooks(current$$1, workInProgress, Component, nextProps, context, renderExpirationTime);
14561 }
14562 }
14563 setCurrentPhase(null);
14564 }
14565
14566 if (current$$1 !== null && !didReceiveUpdate) {
14567 bailoutHooks(current$$1, workInProgress, renderExpirationTime);
14568 return bailoutOnAlreadyFinishedWork(current$$1, workInProgress, renderExpirationTime);
14569 }
14570
14571 // React DevTools reads this flag.
14572 workInProgress.effectTag |= PerformedWork;
14573 reconcileChildren(current$$1, workInProgress, nextChildren, renderExpirationTime);
14574 return workInProgress.child;
14575}
14576
14577function updateClassComponent(current$$1, workInProgress, Component, nextProps, renderExpirationTime) {
14578 {
14579 if (workInProgress.type !== workInProgress.elementType) {
14580 // Lazy component props can't be validated in createElement
14581 // because they're only guaranteed to be resolved here.
14582 var innerPropTypes = Component.propTypes;
14583 if (innerPropTypes) {
14584 checkPropTypes_1(innerPropTypes, nextProps, // Resolved props
14585 'prop', getComponentName(Component), getCurrentFiberStackInDev);
14586 }
14587 }
14588 }
14589
14590 // Push context providers early to prevent context stack mismatches.
14591 // During mounting we don't know the child context yet as the instance doesn't exist.
14592 // We will invalidate the child context in finishClassComponent() right after rendering.
14593 var hasContext = void 0;
14594 if (isContextProvider(Component)) {
14595 hasContext = true;
14596 pushContextProvider(workInProgress);
14597 } else {
14598 hasContext = false;
14599 }
14600 prepareToReadContext(workInProgress, renderExpirationTime);
14601
14602 var instance = workInProgress.stateNode;
14603 var shouldUpdate = void 0;
14604 if (instance === null) {
14605 if (current$$1 !== null) {
14606 // An class component without an instance only mounts if it suspended
14607 // inside a non- concurrent tree, in an inconsistent state. We want to
14608 // tree it like a new mount, even though an empty version of it already
14609 // committed. Disconnect the alternate pointers.
14610 current$$1.alternate = null;
14611 workInProgress.alternate = null;
14612 // Since this is conceptually a new fiber, schedule a Placement effect
14613 workInProgress.effectTag |= Placement;
14614 }
14615 // In the initial pass we might need to construct the instance.
14616 constructClassInstance(workInProgress, Component, nextProps, renderExpirationTime);
14617 mountClassInstance(workInProgress, Component, nextProps, renderExpirationTime);
14618 shouldUpdate = true;
14619 } else if (current$$1 === null) {
14620 // In a resume, we'll already have an instance we can reuse.
14621 shouldUpdate = resumeMountClassInstance(workInProgress, Component, nextProps, renderExpirationTime);
14622 } else {
14623 shouldUpdate = updateClassInstance(current$$1, workInProgress, Component, nextProps, renderExpirationTime);
14624 }
14625 var nextUnitOfWork = finishClassComponent(current$$1, workInProgress, Component, shouldUpdate, hasContext, renderExpirationTime);
14626 {
14627 var inst = workInProgress.stateNode;
14628 if (inst.props !== nextProps) {
14629 !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;
14630 didWarnAboutReassigningProps = true;
14631 }
14632 }
14633 return nextUnitOfWork;
14634}
14635
14636function finishClassComponent(current$$1, workInProgress, Component, shouldUpdate, hasContext, renderExpirationTime) {
14637 // Refs should update even if shouldComponentUpdate returns false
14638 markRef(current$$1, workInProgress);
14639
14640 var didCaptureError = (workInProgress.effectTag & DidCapture) !== NoEffect;
14641
14642 if (!shouldUpdate && !didCaptureError) {
14643 // Context providers should defer to sCU for rendering
14644 if (hasContext) {
14645 invalidateContextProvider(workInProgress, Component, false);
14646 }
14647
14648 return bailoutOnAlreadyFinishedWork(current$$1, workInProgress, renderExpirationTime);
14649 }
14650
14651 var instance = workInProgress.stateNode;
14652
14653 // Rerender
14654 ReactCurrentOwner$3.current = workInProgress;
14655 var nextChildren = void 0;
14656 if (didCaptureError && typeof Component.getDerivedStateFromError !== 'function') {
14657 // If we captured an error, but getDerivedStateFrom catch is not defined,
14658 // unmount all the children. componentDidCatch will schedule an update to
14659 // re-render a fallback. This is temporary until we migrate everyone to
14660 // the new API.
14661 // TODO: Warn in a future release.
14662 nextChildren = null;
14663
14664 if (enableProfilerTimer) {
14665 stopProfilerTimerIfRunning(workInProgress);
14666 }
14667 } else {
14668 {
14669 setCurrentPhase('render');
14670 nextChildren = instance.render();
14671 if (debugRenderPhaseSideEffects || debugRenderPhaseSideEffectsForStrictMode && workInProgress.mode & StrictMode) {
14672 instance.render();
14673 }
14674 setCurrentPhase(null);
14675 }
14676 }
14677
14678 // React DevTools reads this flag.
14679 workInProgress.effectTag |= PerformedWork;
14680 if (current$$1 !== null && didCaptureError) {
14681 // If we're recovering from an error, reconcile without reusing any of
14682 // the existing children. Conceptually, the normal children and the children
14683 // that are shown on error are two different sets, so we shouldn't reuse
14684 // normal children even if their identities match.
14685 forceUnmountCurrentAndReconcile(current$$1, workInProgress, nextChildren, renderExpirationTime);
14686 } else {
14687 reconcileChildren(current$$1, workInProgress, nextChildren, renderExpirationTime);
14688 }
14689
14690 // Memoize state using the values we just used to render.
14691 // TODO: Restructure so we never read values from the instance.
14692 workInProgress.memoizedState = instance.state;
14693
14694 // The context might have changed so we need to recalculate it.
14695 if (hasContext) {
14696 invalidateContextProvider(workInProgress, Component, true);
14697 }
14698
14699 return workInProgress.child;
14700}
14701
14702function pushHostRootContext(workInProgress) {
14703 var root = workInProgress.stateNode;
14704 if (root.pendingContext) {
14705 pushTopLevelContextObject(workInProgress, root.pendingContext, root.pendingContext !== root.context);
14706 } else if (root.context) {
14707 // Should always be set
14708 pushTopLevelContextObject(workInProgress, root.context, false);
14709 }
14710 pushHostContainer(workInProgress, root.containerInfo);
14711}
14712
14713function updateHostRoot(current$$1, workInProgress, renderExpirationTime) {
14714 pushHostRootContext(workInProgress);
14715 var updateQueue = workInProgress.updateQueue;
14716 !(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;
14717 var nextProps = workInProgress.pendingProps;
14718 var prevState = workInProgress.memoizedState;
14719 var prevChildren = prevState !== null ? prevState.element : null;
14720 processUpdateQueue(workInProgress, updateQueue, nextProps, null, renderExpirationTime);
14721 var nextState = workInProgress.memoizedState;
14722 // Caution: React DevTools currently depends on this property
14723 // being called "element".
14724 var nextChildren = nextState.element;
14725 if (nextChildren === prevChildren) {
14726 // If the state is the same as before, that's a bailout because we had
14727 // no work that expires at this time.
14728 resetHydrationState();
14729 return bailoutOnAlreadyFinishedWork(current$$1, workInProgress, renderExpirationTime);
14730 }
14731 var root = workInProgress.stateNode;
14732 if ((current$$1 === null || current$$1.child === null) && root.hydrate && enterHydrationState(workInProgress)) {
14733 // If we don't have any current children this might be the first pass.
14734 // We always try to hydrate. If this isn't a hydration pass there won't
14735 // be any children to hydrate which is effectively the same thing as
14736 // not hydrating.
14737
14738 // This is a bit of a hack. We track the host root as a placement to
14739 // know that we're currently in a mounting state. That way isMounted
14740 // works as expected. We must reset this before committing.
14741 // TODO: Delete this when we delete isMounted and findDOMNode.
14742 workInProgress.effectTag |= Placement;
14743
14744 // Ensure that children mount into this root without tracking
14745 // side-effects. This ensures that we don't store Placement effects on
14746 // nodes that will be hydrated.
14747 workInProgress.child = mountChildFibers(workInProgress, null, nextChildren, renderExpirationTime);
14748 } else {
14749 // Otherwise reset hydration state in case we aborted and resumed another
14750 // root.
14751 reconcileChildren(current$$1, workInProgress, nextChildren, renderExpirationTime);
14752 resetHydrationState();
14753 }
14754 return workInProgress.child;
14755}
14756
14757function updateHostComponent(current$$1, workInProgress, renderExpirationTime) {
14758 pushHostContext(workInProgress);
14759
14760 if (current$$1 === null) {
14761 tryToClaimNextHydratableInstance(workInProgress);
14762 }
14763
14764 var type = workInProgress.type;
14765 var nextProps = workInProgress.pendingProps;
14766 var prevProps = current$$1 !== null ? current$$1.memoizedProps : null;
14767
14768 var nextChildren = nextProps.children;
14769 var isDirectTextChild = shouldSetTextContent(type, nextProps);
14770
14771 if (isDirectTextChild) {
14772 // We special case a direct text child of a host node. This is a common
14773 // case. We won't handle it as a reified child. We will instead handle
14774 // this in the host environment that also have access to this prop. That
14775 // avoids allocating another HostText fiber and traversing it.
14776 nextChildren = null;
14777 } else if (prevProps !== null && shouldSetTextContent(type, prevProps)) {
14778 // If we're switching from a direct text child to a normal child, or to
14779 // empty, we need to schedule the text content to be reset.
14780 workInProgress.effectTag |= ContentReset;
14781 }
14782
14783 markRef(current$$1, workInProgress);
14784
14785 // Check the host config to see if the children are offscreen/hidden.
14786 if (renderExpirationTime !== Never && workInProgress.mode & ConcurrentMode && shouldDeprioritizeSubtree(type, nextProps)) {
14787 // Schedule this fiber to re-render at offscreen priority. Then bailout.
14788 workInProgress.expirationTime = workInProgress.childExpirationTime = Never;
14789 return null;
14790 }
14791
14792 reconcileChildren(current$$1, workInProgress, nextChildren, renderExpirationTime);
14793 return workInProgress.child;
14794}
14795
14796function updateHostText(current$$1, workInProgress) {
14797 if (current$$1 === null) {
14798 tryToClaimNextHydratableInstance(workInProgress);
14799 }
14800 // Nothing to do here. This is terminal. We'll do the completion step
14801 // immediately after.
14802 return null;
14803}
14804
14805function mountLazyComponent(_current, workInProgress, elementType, updateExpirationTime, renderExpirationTime) {
14806 if (_current !== null) {
14807 // An lazy component only mounts if it suspended inside a non-
14808 // concurrent tree, in an inconsistent state. We want to treat it like
14809 // a new mount, even though an empty version of it already committed.
14810 // Disconnect the alternate pointers.
14811 _current.alternate = null;
14812 workInProgress.alternate = null;
14813 // Since this is conceptually a new fiber, schedule a Placement effect
14814 workInProgress.effectTag |= Placement;
14815 }
14816
14817 var props = workInProgress.pendingProps;
14818 // We can't start a User Timing measurement with correct label yet.
14819 // Cancel and resume right after we know the tag.
14820 cancelWorkTimer(workInProgress);
14821 var Component = readLazyComponentType(elementType);
14822 // Store the unwrapped component in the type.
14823 workInProgress.type = Component;
14824 var resolvedTag = workInProgress.tag = resolveLazyComponentTag(Component);
14825 startWorkTimer(workInProgress);
14826 var resolvedProps = resolveDefaultProps(Component, props);
14827 var child = void 0;
14828 switch (resolvedTag) {
14829 case FunctionComponent:
14830 {
14831 {
14832 validateFunctionComponentInDev(workInProgress, Component);
14833 }
14834 child = updateFunctionComponent(null, workInProgress, Component, resolvedProps, renderExpirationTime);
14835 break;
14836 }
14837 case ClassComponent:
14838 {
14839 child = updateClassComponent(null, workInProgress, Component, resolvedProps, renderExpirationTime);
14840 break;
14841 }
14842 case ForwardRef:
14843 {
14844 child = updateForwardRef(null, workInProgress, Component, resolvedProps, renderExpirationTime);
14845 break;
14846 }
14847 case MemoComponent:
14848 {
14849 {
14850 if (workInProgress.type !== workInProgress.elementType) {
14851 var outerPropTypes = Component.propTypes;
14852 if (outerPropTypes) {
14853 checkPropTypes_1(outerPropTypes, resolvedProps, // Resolved for outer only
14854 'prop', getComponentName(Component), getCurrentFiberStackInDev);
14855 }
14856 }
14857 }
14858 child = updateMemoComponent(null, workInProgress, Component, resolveDefaultProps(Component.type, resolvedProps), // The inner type can have defaults too
14859 updateExpirationTime, renderExpirationTime);
14860 break;
14861 }
14862 default:
14863 {
14864 var hint = '';
14865 {
14866 if (Component !== null && typeof Component === 'object' && Component.$$typeof === REACT_LAZY_TYPE) {
14867 hint = ' Did you wrap a component in React.lazy() more than once?';
14868 }
14869 }
14870 // This message intentionally doesn't mention ForwardRef or MemoComponent
14871 // because the fact that it's a separate type of work is an
14872 // implementation detail.
14873 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);
14874 }
14875 }
14876 return child;
14877}
14878
14879function mountIncompleteClassComponent(_current, workInProgress, Component, nextProps, renderExpirationTime) {
14880 if (_current !== null) {
14881 // An incomplete component only mounts if it suspended inside a non-
14882 // concurrent tree, in an inconsistent state. We want to treat it like
14883 // a new mount, even though an empty version of it already committed.
14884 // Disconnect the alternate pointers.
14885 _current.alternate = null;
14886 workInProgress.alternate = null;
14887 // Since this is conceptually a new fiber, schedule a Placement effect
14888 workInProgress.effectTag |= Placement;
14889 }
14890
14891 // Promote the fiber to a class and try rendering again.
14892 workInProgress.tag = ClassComponent;
14893
14894 // The rest of this function is a fork of `updateClassComponent`
14895
14896 // Push context providers early to prevent context stack mismatches.
14897 // During mounting we don't know the child context yet as the instance doesn't exist.
14898 // We will invalidate the child context in finishClassComponent() right after rendering.
14899 var hasContext = void 0;
14900 if (isContextProvider(Component)) {
14901 hasContext = true;
14902 pushContextProvider(workInProgress);
14903 } else {
14904 hasContext = false;
14905 }
14906 prepareToReadContext(workInProgress, renderExpirationTime);
14907
14908 constructClassInstance(workInProgress, Component, nextProps, renderExpirationTime);
14909 mountClassInstance(workInProgress, Component, nextProps, renderExpirationTime);
14910
14911 return finishClassComponent(null, workInProgress, Component, true, hasContext, renderExpirationTime);
14912}
14913
14914function mountIndeterminateComponent(_current, workInProgress, Component, renderExpirationTime) {
14915 if (_current !== null) {
14916 // An indeterminate component only mounts if it suspended inside a non-
14917 // concurrent tree, in an inconsistent state. We want to treat it like
14918 // a new mount, even though an empty version of it already committed.
14919 // Disconnect the alternate pointers.
14920 _current.alternate = null;
14921 workInProgress.alternate = null;
14922 // Since this is conceptually a new fiber, schedule a Placement effect
14923 workInProgress.effectTag |= Placement;
14924 }
14925
14926 var props = workInProgress.pendingProps;
14927 var unmaskedContext = getUnmaskedContext(workInProgress, Component, false);
14928 var context = getMaskedContext(workInProgress, unmaskedContext);
14929
14930 prepareToReadContext(workInProgress, renderExpirationTime);
14931
14932 var value = void 0;
14933
14934 {
14935 if (Component.prototype && typeof Component.prototype.render === 'function') {
14936 var componentName = getComponentName(Component) || 'Unknown';
14937
14938 if (!didWarnAboutBadClass[componentName]) {
14939 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);
14940 didWarnAboutBadClass[componentName] = true;
14941 }
14942 }
14943
14944 if (workInProgress.mode & StrictMode) {
14945 ReactStrictModeWarnings.recordLegacyContextWarning(workInProgress, null);
14946 }
14947
14948 ReactCurrentOwner$3.current = workInProgress;
14949 value = renderWithHooks(null, workInProgress, Component, props, context, renderExpirationTime);
14950 }
14951 // React DevTools reads this flag.
14952 workInProgress.effectTag |= PerformedWork;
14953
14954 if (typeof value === 'object' && value !== null && typeof value.render === 'function' && value.$$typeof === undefined) {
14955 // Proceed under the assumption that this is a class instance
14956 workInProgress.tag = ClassComponent;
14957
14958 // Throw out any hooks that were used.
14959 resetHooks();
14960
14961 // Push context providers early to prevent context stack mismatches.
14962 // During mounting we don't know the child context yet as the instance doesn't exist.
14963 // We will invalidate the child context in finishClassComponent() right after rendering.
14964 var hasContext = false;
14965 if (isContextProvider(Component)) {
14966 hasContext = true;
14967 pushContextProvider(workInProgress);
14968 } else {
14969 hasContext = false;
14970 }
14971
14972 workInProgress.memoizedState = value.state !== null && value.state !== undefined ? value.state : null;
14973
14974 var getDerivedStateFromProps = Component.getDerivedStateFromProps;
14975 if (typeof getDerivedStateFromProps === 'function') {
14976 applyDerivedStateFromProps(workInProgress, Component, getDerivedStateFromProps, props);
14977 }
14978
14979 adoptClassInstance(workInProgress, value);
14980 mountClassInstance(workInProgress, Component, props, renderExpirationTime);
14981 return finishClassComponent(null, workInProgress, Component, true, hasContext, renderExpirationTime);
14982 } else {
14983 // Proceed under the assumption that this is a function component
14984 workInProgress.tag = FunctionComponent;
14985 {
14986 if (debugRenderPhaseSideEffects || debugRenderPhaseSideEffectsForStrictMode && workInProgress.mode & StrictMode) {
14987 // Only double-render components with Hooks
14988 if (workInProgress.memoizedState !== null) {
14989 value = renderWithHooks(null, workInProgress, Component, props, context, renderExpirationTime);
14990 }
14991 }
14992 }
14993 reconcileChildren(null, workInProgress, value, renderExpirationTime);
14994 {
14995 validateFunctionComponentInDev(workInProgress, Component);
14996 }
14997 return workInProgress.child;
14998 }
14999}
15000
15001function validateFunctionComponentInDev(workInProgress, Component) {
15002 if (Component) {
15003 !!Component.childContextTypes ? warningWithoutStack$1(false, '%s(...): childContextTypes cannot be defined on a function component.', Component.displayName || Component.name || 'Component') : void 0;
15004 }
15005 if (workInProgress.ref !== null) {
15006 var info = '';
15007 var ownerName = getCurrentFiberOwnerNameInDevOrNull();
15008 if (ownerName) {
15009 info += '\n\nCheck the render method of `' + ownerName + '`.';
15010 }
15011
15012 var warningKey = ownerName || workInProgress._debugID || '';
15013 var debugSource = workInProgress._debugSource;
15014 if (debugSource) {
15015 warningKey = debugSource.fileName + ':' + debugSource.lineNumber;
15016 }
15017 if (!didWarnAboutFunctionRefs[warningKey]) {
15018 didWarnAboutFunctionRefs[warningKey] = true;
15019 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);
15020 }
15021 }
15022
15023 if (typeof Component.getDerivedStateFromProps === 'function') {
15024 var componentName = getComponentName(Component) || 'Unknown';
15025
15026 if (!didWarnAboutGetDerivedStateOnFunctionComponent[componentName]) {
15027 warningWithoutStack$1(false, '%s: Function components do not support getDerivedStateFromProps.', componentName);
15028 didWarnAboutGetDerivedStateOnFunctionComponent[componentName] = true;
15029 }
15030 }
15031
15032 if (typeof Component.contextType === 'object' && Component.contextType !== null) {
15033 var _componentName = getComponentName(Component) || 'Unknown';
15034
15035 if (!didWarnAboutContextTypeOnFunctionComponent[_componentName]) {
15036 warningWithoutStack$1(false, '%s: Function components do not support contextType.', _componentName);
15037 didWarnAboutContextTypeOnFunctionComponent[_componentName] = true;
15038 }
15039 }
15040}
15041
15042function updateSuspenseComponent(current$$1, workInProgress, renderExpirationTime) {
15043 var mode = workInProgress.mode;
15044 var nextProps = workInProgress.pendingProps;
15045
15046 // We should attempt to render the primary children unless this boundary
15047 // already suspended during this render (`alreadyCaptured` is true).
15048 var nextState = workInProgress.memoizedState;
15049
15050 var nextDidTimeout = void 0;
15051 if ((workInProgress.effectTag & DidCapture) === NoEffect) {
15052 // This is the first attempt.
15053 nextState = null;
15054 nextDidTimeout = false;
15055 } else {
15056 // Something in this boundary's subtree already suspended. Switch to
15057 // rendering the fallback children.
15058 nextState = {
15059 timedOutAt: nextState !== null ? nextState.timedOutAt : NoWork
15060 };
15061 nextDidTimeout = true;
15062 workInProgress.effectTag &= ~DidCapture;
15063 }
15064
15065 // This next part is a bit confusing. If the children timeout, we switch to
15066 // showing the fallback children in place of the "primary" children.
15067 // However, we don't want to delete the primary children because then their
15068 // state will be lost (both the React state and the host state, e.g.
15069 // uncontrolled form inputs). Instead we keep them mounted and hide them.
15070 // Both the fallback children AND the primary children are rendered at the
15071 // same time. Once the primary children are un-suspended, we can delete
15072 // the fallback children — don't need to preserve their state.
15073 //
15074 // The two sets of children are siblings in the host environment, but
15075 // semantically, for purposes of reconciliation, they are two separate sets.
15076 // So we store them using two fragment fibers.
15077 //
15078 // However, we want to avoid allocating extra fibers for every placeholder.
15079 // They're only necessary when the children time out, because that's the
15080 // only time when both sets are mounted.
15081 //
15082 // So, the extra fragment fibers are only used if the children time out.
15083 // Otherwise, we render the primary children directly. This requires some
15084 // custom reconciliation logic to preserve the state of the primary
15085 // children. It's essentially a very basic form of re-parenting.
15086
15087 // `child` points to the child fiber. In the normal case, this is the first
15088 // fiber of the primary children set. In the timed-out case, it's a
15089 // a fragment fiber containing the primary children.
15090 var child = void 0;
15091 // `next` points to the next fiber React should render. In the normal case,
15092 // it's the same as `child`: the first fiber of the primary children set.
15093 // In the timed-out case, it's a fragment fiber containing the *fallback*
15094 // children -- we skip over the primary children entirely.
15095 var next = void 0;
15096 if (current$$1 === null) {
15097 if (enableSuspenseServerRenderer) {
15098 // If we're currently hydrating, try to hydrate this boundary.
15099 // But only if this has a fallback.
15100 if (nextProps.fallback !== undefined) {
15101 tryToClaimNextHydratableInstance(workInProgress);
15102 // This could've changed the tag if this was a dehydrated suspense component.
15103 if (workInProgress.tag === DehydratedSuspenseComponent) {
15104 return updateDehydratedSuspenseComponent(null, workInProgress, renderExpirationTime);
15105 }
15106 }
15107 }
15108
15109 // This is the initial mount. This branch is pretty simple because there's
15110 // no previous state that needs to be preserved.
15111 if (nextDidTimeout) {
15112 // Mount separate fragments for primary and fallback children.
15113 var nextFallbackChildren = nextProps.fallback;
15114 var primaryChildFragment = createFiberFromFragment(null, mode, NoWork, null);
15115
15116 if ((workInProgress.mode & ConcurrentMode) === NoContext) {
15117 // Outside of concurrent mode, we commit the effects from the
15118 var progressedState = workInProgress.memoizedState;
15119 var progressedPrimaryChild = progressedState !== null ? workInProgress.child.child : workInProgress.child;
15120 primaryChildFragment.child = progressedPrimaryChild;
15121 }
15122
15123 var fallbackChildFragment = createFiberFromFragment(nextFallbackChildren, mode, renderExpirationTime, null);
15124 primaryChildFragment.sibling = fallbackChildFragment;
15125 child = primaryChildFragment;
15126 // Skip the primary children, and continue working on the
15127 // fallback children.
15128 next = fallbackChildFragment;
15129 child.return = next.return = workInProgress;
15130 } else {
15131 // Mount the primary children without an intermediate fragment fiber.
15132 var nextPrimaryChildren = nextProps.children;
15133 child = next = mountChildFibers(workInProgress, null, nextPrimaryChildren, renderExpirationTime);
15134 }
15135 } else {
15136 // This is an update. This branch is more complicated because we need to
15137 // ensure the state of the primary children is preserved.
15138 var prevState = current$$1.memoizedState;
15139 var prevDidTimeout = prevState !== null;
15140 if (prevDidTimeout) {
15141 // The current tree already timed out. That means each child set is
15142 var currentPrimaryChildFragment = current$$1.child;
15143 var currentFallbackChildFragment = currentPrimaryChildFragment.sibling;
15144 if (nextDidTimeout) {
15145 // Still timed out. Reuse the current primary children by cloning
15146 // its fragment. We're going to skip over these entirely.
15147 var _nextFallbackChildren = nextProps.fallback;
15148 var _primaryChildFragment = createWorkInProgress(currentPrimaryChildFragment, currentPrimaryChildFragment.pendingProps, NoWork);
15149
15150 if ((workInProgress.mode & ConcurrentMode) === NoContext) {
15151 // Outside of concurrent mode, we commit the effects from the
15152 var _progressedState = workInProgress.memoizedState;
15153 var _progressedPrimaryChild = _progressedState !== null ? workInProgress.child.child : workInProgress.child;
15154 if (_progressedPrimaryChild !== currentPrimaryChildFragment.child) {
15155 _primaryChildFragment.child = _progressedPrimaryChild;
15156 }
15157 }
15158
15159 // Because primaryChildFragment is a new fiber that we're inserting as the
15160 // parent of a new tree, we need to set its treeBaseDuration.
15161 if (enableProfilerTimer && workInProgress.mode & ProfileMode) {
15162 // treeBaseDuration is the sum of all the child tree base durations.
15163 var treeBaseDuration = 0;
15164 var hiddenChild = _primaryChildFragment.child;
15165 while (hiddenChild !== null) {
15166 treeBaseDuration += hiddenChild.treeBaseDuration;
15167 hiddenChild = hiddenChild.sibling;
15168 }
15169 _primaryChildFragment.treeBaseDuration = treeBaseDuration;
15170 }
15171
15172 // Clone the fallback child fragment, too. These we'll continue
15173 // working on.
15174 var _fallbackChildFragment = _primaryChildFragment.sibling = createWorkInProgress(currentFallbackChildFragment, _nextFallbackChildren, currentFallbackChildFragment.expirationTime);
15175 child = _primaryChildFragment;
15176 _primaryChildFragment.childExpirationTime = NoWork;
15177 // Skip the primary children, and continue working on the
15178 // fallback children.
15179 next = _fallbackChildFragment;
15180 child.return = next.return = workInProgress;
15181 } else {
15182 // No longer suspended. Switch back to showing the primary children,
15183 // and remove the intermediate fragment fiber.
15184 var _nextPrimaryChildren = nextProps.children;
15185 var currentPrimaryChild = currentPrimaryChildFragment.child;
15186 var primaryChild = reconcileChildFibers(workInProgress, currentPrimaryChild, _nextPrimaryChildren, renderExpirationTime);
15187
15188 // If this render doesn't suspend, we need to delete the fallback
15189 // children. Wait until the complete phase, after we've confirmed the
15190 // fallback is no longer needed.
15191 // TODO: Would it be better to store the fallback fragment on
15192 // the stateNode?
15193
15194 // Continue rendering the children, like we normally do.
15195 child = next = primaryChild;
15196 }
15197 } else {
15198 // The current tree has not already timed out. That means the primary
15199 // children are not wrapped in a fragment fiber.
15200 var _currentPrimaryChild = current$$1.child;
15201 if (nextDidTimeout) {
15202 // Timed out. Wrap the children in a fragment fiber to keep them
15203 // separate from the fallback children.
15204 var _nextFallbackChildren2 = nextProps.fallback;
15205 var _primaryChildFragment2 = createFiberFromFragment(
15206 // It shouldn't matter what the pending props are because we aren't
15207 // going to render this fragment.
15208 null, mode, NoWork, null);
15209 _primaryChildFragment2.child = _currentPrimaryChild;
15210
15211 // Even though we're creating a new fiber, there are no new children,
15212 // because we're reusing an already mounted tree. So we don't need to
15213 // schedule a placement.
15214 // primaryChildFragment.effectTag |= Placement;
15215
15216 if ((workInProgress.mode & ConcurrentMode) === NoContext) {
15217 // Outside of concurrent mode, we commit the effects from the
15218 var _progressedState2 = workInProgress.memoizedState;
15219 var _progressedPrimaryChild2 = _progressedState2 !== null ? workInProgress.child.child : workInProgress.child;
15220 _primaryChildFragment2.child = _progressedPrimaryChild2;
15221 }
15222
15223 // Because primaryChildFragment is a new fiber that we're inserting as the
15224 // parent of a new tree, we need to set its treeBaseDuration.
15225 if (enableProfilerTimer && workInProgress.mode & ProfileMode) {
15226 // treeBaseDuration is the sum of all the child tree base durations.
15227 var _treeBaseDuration = 0;
15228 var _hiddenChild = _primaryChildFragment2.child;
15229 while (_hiddenChild !== null) {
15230 _treeBaseDuration += _hiddenChild.treeBaseDuration;
15231 _hiddenChild = _hiddenChild.sibling;
15232 }
15233 _primaryChildFragment2.treeBaseDuration = _treeBaseDuration;
15234 }
15235
15236 // Create a fragment from the fallback children, too.
15237 var _fallbackChildFragment2 = _primaryChildFragment2.sibling = createFiberFromFragment(_nextFallbackChildren2, mode, renderExpirationTime, null);
15238 _fallbackChildFragment2.effectTag |= Placement;
15239 child = _primaryChildFragment2;
15240 _primaryChildFragment2.childExpirationTime = NoWork;
15241 // Skip the primary children, and continue working on the
15242 // fallback children.
15243 next = _fallbackChildFragment2;
15244 child.return = next.return = workInProgress;
15245 } else {
15246 // Still haven't timed out. Continue rendering the children, like we
15247 // normally do.
15248 var _nextPrimaryChildren2 = nextProps.children;
15249 next = child = reconcileChildFibers(workInProgress, _currentPrimaryChild, _nextPrimaryChildren2, renderExpirationTime);
15250 }
15251 }
15252 workInProgress.stateNode = current$$1.stateNode;
15253 }
15254
15255 workInProgress.memoizedState = nextState;
15256 workInProgress.child = child;
15257 return next;
15258}
15259
15260function updateDehydratedSuspenseComponent(current$$1, workInProgress, renderExpirationTime) {
15261 if (current$$1 === null) {
15262 // During the first pass, we'll bail out and not drill into the children.
15263 // Instead, we'll leave the content in place and try to hydrate it later.
15264 workInProgress.expirationTime = Never;
15265 return null;
15266 }
15267 // We use childExpirationTime to indicate that a child might depend on context, so if
15268 // any context has changed, we need to treat is as if the input might have changed.
15269 var hasContextChanged$$1 = current$$1.childExpirationTime >= renderExpirationTime;
15270 if (didReceiveUpdate || hasContextChanged$$1) {
15271 // This boundary has changed since the first render. This means that we are now unable to
15272 // hydrate it. We might still be able to hydrate it using an earlier expiration time but
15273 // during this render we can't. Instead, we're going to delete the whole subtree and
15274 // instead inject a new real Suspense boundary to take its place, which may render content
15275 // or fallback. The real Suspense boundary will suspend for a while so we have some time
15276 // to ensure it can produce real content, but all state and pending events will be lost.
15277
15278 // Detach from the current dehydrated boundary.
15279 current$$1.alternate = null;
15280 workInProgress.alternate = null;
15281
15282 // Insert a deletion in the effect list.
15283 var returnFiber = workInProgress.return;
15284 !(returnFiber !== null) ? invariant(false, 'Suspense boundaries are never on the root. This is probably a bug in React.') : void 0;
15285 var last = returnFiber.lastEffect;
15286 if (last !== null) {
15287 last.nextEffect = current$$1;
15288 returnFiber.lastEffect = current$$1;
15289 } else {
15290 returnFiber.firstEffect = returnFiber.lastEffect = current$$1;
15291 }
15292 current$$1.nextEffect = null;
15293 current$$1.effectTag = Deletion;
15294
15295 // Upgrade this work in progress to a real Suspense component.
15296 workInProgress.tag = SuspenseComponent;
15297 workInProgress.stateNode = null;
15298 workInProgress.memoizedState = null;
15299 // This is now an insertion.
15300 workInProgress.effectTag |= Placement;
15301 // Retry as a real Suspense component.
15302 return updateSuspenseComponent(null, workInProgress, renderExpirationTime);
15303 }
15304 if ((workInProgress.effectTag & DidCapture) === NoEffect) {
15305 // This is the first attempt.
15306 reenterHydrationStateFromDehydratedSuspenseInstance(workInProgress);
15307 var nextProps = workInProgress.pendingProps;
15308 var nextChildren = nextProps.children;
15309 workInProgress.child = mountChildFibers(workInProgress, null, nextChildren, renderExpirationTime);
15310 return workInProgress.child;
15311 } else {
15312 // Something suspended. Leave the existing children in place.
15313 // TODO: In non-concurrent mode, should we commit the nodes we have hydrated so far?
15314 workInProgress.child = null;
15315 return null;
15316 }
15317}
15318
15319function updatePortalComponent(current$$1, workInProgress, renderExpirationTime) {
15320 pushHostContainer(workInProgress, workInProgress.stateNode.containerInfo);
15321 var nextChildren = workInProgress.pendingProps;
15322 if (current$$1 === null) {
15323 // Portals are special because we don't append the children during mount
15324 // but at commit. Therefore we need to track insertions which the normal
15325 // flow doesn't do during mount. This doesn't happen at the root because
15326 // the root always starts with a "current" with a null child.
15327 // TODO: Consider unifying this with how the root works.
15328 workInProgress.child = reconcileChildFibers(workInProgress, null, nextChildren, renderExpirationTime);
15329 } else {
15330 reconcileChildren(current$$1, workInProgress, nextChildren, renderExpirationTime);
15331 }
15332 return workInProgress.child;
15333}
15334
15335function updateContextProvider(current$$1, workInProgress, renderExpirationTime) {
15336 var providerType = workInProgress.type;
15337 var context = providerType._context;
15338
15339 var newProps = workInProgress.pendingProps;
15340 var oldProps = workInProgress.memoizedProps;
15341
15342 var newValue = newProps.value;
15343
15344 {
15345 var providerPropTypes = workInProgress.type.propTypes;
15346
15347 if (providerPropTypes) {
15348 checkPropTypes_1(providerPropTypes, newProps, 'prop', 'Context.Provider', getCurrentFiberStackInDev);
15349 }
15350 }
15351
15352 pushProvider(workInProgress, newValue);
15353
15354 if (oldProps !== null) {
15355 var oldValue = oldProps.value;
15356 var changedBits = calculateChangedBits(context, newValue, oldValue);
15357 if (changedBits === 0) {
15358 // No change. Bailout early if children are the same.
15359 if (oldProps.children === newProps.children && !hasContextChanged()) {
15360 return bailoutOnAlreadyFinishedWork(current$$1, workInProgress, renderExpirationTime);
15361 }
15362 } else {
15363 // The context value changed. Search for matching consumers and schedule
15364 // them to update.
15365 propagateContextChange(workInProgress, context, changedBits, renderExpirationTime);
15366 }
15367 }
15368
15369 var newChildren = newProps.children;
15370 reconcileChildren(current$$1, workInProgress, newChildren, renderExpirationTime);
15371 return workInProgress.child;
15372}
15373
15374var hasWarnedAboutUsingContextAsConsumer = false;
15375
15376function updateContextConsumer(current$$1, workInProgress, renderExpirationTime) {
15377 var context = workInProgress.type;
15378 // The logic below for Context differs depending on PROD or DEV mode. In
15379 // DEV mode, we create a separate object for Context.Consumer that acts
15380 // like a proxy to Context. This proxy object adds unnecessary code in PROD
15381 // so we use the old behaviour (Context.Consumer references Context) to
15382 // reduce size and overhead. The separate object references context via
15383 // a property called "_context", which also gives us the ability to check
15384 // in DEV mode if this property exists or not and warn if it does not.
15385 {
15386 if (context._context === undefined) {
15387 // This may be because it's a Context (rather than a Consumer).
15388 // Or it may be because it's older React where they're the same thing.
15389 // We only want to warn if we're sure it's a new React.
15390 if (context !== context.Consumer) {
15391 if (!hasWarnedAboutUsingContextAsConsumer) {
15392 hasWarnedAboutUsingContextAsConsumer = true;
15393 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?');
15394 }
15395 }
15396 } else {
15397 context = context._context;
15398 }
15399 }
15400 var newProps = workInProgress.pendingProps;
15401 var render = newProps.children;
15402
15403 {
15404 !(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;
15405 }
15406
15407 prepareToReadContext(workInProgress, renderExpirationTime);
15408 var newValue = readContext(context, newProps.unstable_observedBits);
15409 var newChildren = void 0;
15410 {
15411 ReactCurrentOwner$3.current = workInProgress;
15412 setCurrentPhase('render');
15413 newChildren = render(newValue);
15414 setCurrentPhase(null);
15415 }
15416
15417 // React DevTools reads this flag.
15418 workInProgress.effectTag |= PerformedWork;
15419 reconcileChildren(current$$1, workInProgress, newChildren, renderExpirationTime);
15420 return workInProgress.child;
15421}
15422
15423function markWorkInProgressReceivedUpdate() {
15424 didReceiveUpdate = true;
15425}
15426
15427function bailoutOnAlreadyFinishedWork(current$$1, workInProgress, renderExpirationTime) {
15428 cancelWorkTimer(workInProgress);
15429
15430 if (current$$1 !== null) {
15431 // Reuse previous context list
15432 workInProgress.contextDependencies = current$$1.contextDependencies;
15433 }
15434
15435 if (enableProfilerTimer) {
15436 // Don't update "base" render times for bailouts.
15437 stopProfilerTimerIfRunning(workInProgress);
15438 }
15439
15440 // Check if the children have any pending work.
15441 var childExpirationTime = workInProgress.childExpirationTime;
15442 if (childExpirationTime < renderExpirationTime) {
15443 // The children don't have any work either. We can skip them.
15444 // TODO: Once we add back resuming, we should check if the children are
15445 // a work-in-progress set. If so, we need to transfer their effects.
15446 return null;
15447 } else {
15448 // This fiber doesn't have work, but its subtree does. Clone the child
15449 // fibers and continue.
15450 cloneChildFibers(current$$1, workInProgress);
15451 return workInProgress.child;
15452 }
15453}
15454
15455function beginWork(current$$1, workInProgress, renderExpirationTime) {
15456 var updateExpirationTime = workInProgress.expirationTime;
15457
15458 if (current$$1 !== null) {
15459 var oldProps = current$$1.memoizedProps;
15460 var newProps = workInProgress.pendingProps;
15461
15462 if (oldProps !== newProps || hasContextChanged()) {
15463 // If props or context changed, mark the fiber as having performed work.
15464 // This may be unset if the props are determined to be equal later (memo).
15465 didReceiveUpdate = true;
15466 } else if (updateExpirationTime < renderExpirationTime) {
15467 didReceiveUpdate = false;
15468 // This fiber does not have any pending work. Bailout without entering
15469 // the begin phase. There's still some bookkeeping we that needs to be done
15470 // in this optimized path, mostly pushing stuff onto the stack.
15471 switch (workInProgress.tag) {
15472 case HostRoot:
15473 pushHostRootContext(workInProgress);
15474 resetHydrationState();
15475 break;
15476 case HostComponent:
15477 pushHostContext(workInProgress);
15478 break;
15479 case ClassComponent:
15480 {
15481 var Component = workInProgress.type;
15482 if (isContextProvider(Component)) {
15483 pushContextProvider(workInProgress);
15484 }
15485 break;
15486 }
15487 case HostPortal:
15488 pushHostContainer(workInProgress, workInProgress.stateNode.containerInfo);
15489 break;
15490 case ContextProvider:
15491 {
15492 var newValue = workInProgress.memoizedProps.value;
15493 pushProvider(workInProgress, newValue);
15494 break;
15495 }
15496 case Profiler:
15497 if (enableProfilerTimer) {
15498 workInProgress.effectTag |= Update;
15499 }
15500 break;
15501 case SuspenseComponent:
15502 {
15503 var state = workInProgress.memoizedState;
15504 var didTimeout = state !== null;
15505 if (didTimeout) {
15506 // If this boundary is currently timed out, we need to decide
15507 // whether to retry the primary children, or to skip over it and
15508 // go straight to the fallback. Check the priority of the primary
15509 var primaryChildFragment = workInProgress.child;
15510 var primaryChildExpirationTime = primaryChildFragment.childExpirationTime;
15511 if (primaryChildExpirationTime !== NoWork && primaryChildExpirationTime >= renderExpirationTime) {
15512 // The primary children have pending work. Use the normal path
15513 // to attempt to render the primary children again.
15514 return updateSuspenseComponent(current$$1, workInProgress, renderExpirationTime);
15515 } else {
15516 // The primary children do not have pending work with sufficient
15517 // priority. Bailout.
15518 var child = bailoutOnAlreadyFinishedWork(current$$1, workInProgress, renderExpirationTime);
15519 if (child !== null) {
15520 // The fallback children have pending work. Skip over the
15521 // primary children and work on the fallback.
15522 return child.sibling;
15523 } else {
15524 return null;
15525 }
15526 }
15527 }
15528 break;
15529 }
15530 case DehydratedSuspenseComponent:
15531 {
15532 if (enableSuspenseServerRenderer) {
15533 // We know that this component will suspend again because if it has
15534 // been unsuspended it has committed as a regular Suspense component.
15535 // If it needs to be retried, it should have work scheduled on it.
15536 workInProgress.effectTag |= DidCapture;
15537 break;
15538 }
15539 }
15540 }
15541 return bailoutOnAlreadyFinishedWork(current$$1, workInProgress, renderExpirationTime);
15542 }
15543 } else {
15544 didReceiveUpdate = false;
15545 }
15546
15547 // Before entering the begin phase, clear the expiration time.
15548 workInProgress.expirationTime = NoWork;
15549
15550 switch (workInProgress.tag) {
15551 case IndeterminateComponent:
15552 {
15553 var elementType = workInProgress.elementType;
15554 return mountIndeterminateComponent(current$$1, workInProgress, elementType, renderExpirationTime);
15555 }
15556 case LazyComponent:
15557 {
15558 var _elementType = workInProgress.elementType;
15559 return mountLazyComponent(current$$1, workInProgress, _elementType, updateExpirationTime, renderExpirationTime);
15560 }
15561 case FunctionComponent:
15562 {
15563 var _Component = workInProgress.type;
15564 var unresolvedProps = workInProgress.pendingProps;
15565 var resolvedProps = workInProgress.elementType === _Component ? unresolvedProps : resolveDefaultProps(_Component, unresolvedProps);
15566 return updateFunctionComponent(current$$1, workInProgress, _Component, resolvedProps, renderExpirationTime);
15567 }
15568 case ClassComponent:
15569 {
15570 var _Component2 = workInProgress.type;
15571 var _unresolvedProps = workInProgress.pendingProps;
15572 var _resolvedProps = workInProgress.elementType === _Component2 ? _unresolvedProps : resolveDefaultProps(_Component2, _unresolvedProps);
15573 return updateClassComponent(current$$1, workInProgress, _Component2, _resolvedProps, renderExpirationTime);
15574 }
15575 case HostRoot:
15576 return updateHostRoot(current$$1, workInProgress, renderExpirationTime);
15577 case HostComponent:
15578 return updateHostComponent(current$$1, workInProgress, renderExpirationTime);
15579 case HostText:
15580 return updateHostText(current$$1, workInProgress);
15581 case SuspenseComponent:
15582 return updateSuspenseComponent(current$$1, workInProgress, renderExpirationTime);
15583 case HostPortal:
15584 return updatePortalComponent(current$$1, workInProgress, renderExpirationTime);
15585 case ForwardRef:
15586 {
15587 var type = workInProgress.type;
15588 var _unresolvedProps2 = workInProgress.pendingProps;
15589 var _resolvedProps2 = workInProgress.elementType === type ? _unresolvedProps2 : resolveDefaultProps(type, _unresolvedProps2);
15590 return updateForwardRef(current$$1, workInProgress, type, _resolvedProps2, renderExpirationTime);
15591 }
15592 case Fragment:
15593 return updateFragment(current$$1, workInProgress, renderExpirationTime);
15594 case Mode:
15595 return updateMode(current$$1, workInProgress, renderExpirationTime);
15596 case Profiler:
15597 return updateProfiler(current$$1, workInProgress, renderExpirationTime);
15598 case ContextProvider:
15599 return updateContextProvider(current$$1, workInProgress, renderExpirationTime);
15600 case ContextConsumer:
15601 return updateContextConsumer(current$$1, workInProgress, renderExpirationTime);
15602 case MemoComponent:
15603 {
15604 var _type2 = workInProgress.type;
15605 var _unresolvedProps3 = workInProgress.pendingProps;
15606 // Resolve outer props first, then resolve inner props.
15607 var _resolvedProps3 = resolveDefaultProps(_type2, _unresolvedProps3);
15608 {
15609 if (workInProgress.type !== workInProgress.elementType) {
15610 var outerPropTypes = _type2.propTypes;
15611 if (outerPropTypes) {
15612 checkPropTypes_1(outerPropTypes, _resolvedProps3, // Resolved for outer only
15613 'prop', getComponentName(_type2), getCurrentFiberStackInDev);
15614 }
15615 }
15616 }
15617 _resolvedProps3 = resolveDefaultProps(_type2.type, _resolvedProps3);
15618 return updateMemoComponent(current$$1, workInProgress, _type2, _resolvedProps3, updateExpirationTime, renderExpirationTime);
15619 }
15620 case SimpleMemoComponent:
15621 {
15622 return updateSimpleMemoComponent(current$$1, workInProgress, workInProgress.type, workInProgress.pendingProps, updateExpirationTime, renderExpirationTime);
15623 }
15624 case IncompleteClassComponent:
15625 {
15626 var _Component3 = workInProgress.type;
15627 var _unresolvedProps4 = workInProgress.pendingProps;
15628 var _resolvedProps4 = workInProgress.elementType === _Component3 ? _unresolvedProps4 : resolveDefaultProps(_Component3, _unresolvedProps4);
15629 return mountIncompleteClassComponent(current$$1, workInProgress, _Component3, _resolvedProps4, renderExpirationTime);
15630 }
15631 case DehydratedSuspenseComponent:
15632 {
15633 if (enableSuspenseServerRenderer) {
15634 return updateDehydratedSuspenseComponent(current$$1, workInProgress, renderExpirationTime);
15635 }
15636 break;
15637 }
15638 }
15639 invariant(false, 'Unknown unit of work tag. This error is likely caused by a bug in React. Please file an issue.');
15640}
15641
15642var valueCursor = createCursor(null);
15643
15644var rendererSigil = void 0;
15645{
15646 // Use this to detect multiple renderers using the same context
15647 rendererSigil = {};
15648}
15649
15650var currentlyRenderingFiber = null;
15651var lastContextDependency = null;
15652var lastContextWithAllBitsObserved = null;
15653
15654var isDisallowedContextReadInDEV = false;
15655
15656function resetContextDependences() {
15657 // This is called right before React yields execution, to ensure `readContext`
15658 // cannot be called outside the render phase.
15659 currentlyRenderingFiber = null;
15660 lastContextDependency = null;
15661 lastContextWithAllBitsObserved = null;
15662 {
15663 isDisallowedContextReadInDEV = false;
15664 }
15665}
15666
15667function enterDisallowedContextReadInDEV() {
15668 {
15669 isDisallowedContextReadInDEV = true;
15670 }
15671}
15672
15673function exitDisallowedContextReadInDEV() {
15674 {
15675 isDisallowedContextReadInDEV = false;
15676 }
15677}
15678
15679function pushProvider(providerFiber, nextValue) {
15680 var context = providerFiber.type._context;
15681
15682 if (isPrimaryRenderer) {
15683 push(valueCursor, context._currentValue, providerFiber);
15684
15685 context._currentValue = nextValue;
15686 {
15687 !(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;
15688 context._currentRenderer = rendererSigil;
15689 }
15690 } else {
15691 push(valueCursor, context._currentValue2, providerFiber);
15692
15693 context._currentValue2 = nextValue;
15694 {
15695 !(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;
15696 context._currentRenderer2 = rendererSigil;
15697 }
15698 }
15699}
15700
15701function popProvider(providerFiber) {
15702 var currentValue = valueCursor.current;
15703
15704 pop(valueCursor, providerFiber);
15705
15706 var context = providerFiber.type._context;
15707 if (isPrimaryRenderer) {
15708 context._currentValue = currentValue;
15709 } else {
15710 context._currentValue2 = currentValue;
15711 }
15712}
15713
15714function calculateChangedBits(context, newValue, oldValue) {
15715 if (is(oldValue, newValue)) {
15716 // No change
15717 return 0;
15718 } else {
15719 var changedBits = typeof context._calculateChangedBits === 'function' ? context._calculateChangedBits(oldValue, newValue) : maxSigned31BitInt;
15720
15721 {
15722 !((changedBits & maxSigned31BitInt) === changedBits) ? warning$1(false, 'calculateChangedBits: Expected the return value to be a ' + '31-bit integer. Instead received: %s', changedBits) : void 0;
15723 }
15724 return changedBits | 0;
15725 }
15726}
15727
15728function scheduleWorkOnParentPath(parent, renderExpirationTime) {
15729 // Update the child expiration time of all the ancestors, including
15730 // the alternates.
15731 var node = parent;
15732 while (node !== null) {
15733 var alternate = node.alternate;
15734 if (node.childExpirationTime < renderExpirationTime) {
15735 node.childExpirationTime = renderExpirationTime;
15736 if (alternate !== null && alternate.childExpirationTime < renderExpirationTime) {
15737 alternate.childExpirationTime = renderExpirationTime;
15738 }
15739 } else if (alternate !== null && alternate.childExpirationTime < renderExpirationTime) {
15740 alternate.childExpirationTime = renderExpirationTime;
15741 } else {
15742 // Neither alternate was updated, which means the rest of the
15743 // ancestor path already has sufficient priority.
15744 break;
15745 }
15746 node = node.return;
15747 }
15748}
15749
15750function propagateContextChange(workInProgress, context, changedBits, renderExpirationTime) {
15751 var fiber = workInProgress.child;
15752 if (fiber !== null) {
15753 // Set the return pointer of the child to the work-in-progress fiber.
15754 fiber.return = workInProgress;
15755 }
15756 while (fiber !== null) {
15757 var nextFiber = void 0;
15758
15759 // Visit this fiber.
15760 var list = fiber.contextDependencies;
15761 if (list !== null) {
15762 nextFiber = fiber.child;
15763
15764 var dependency = list.first;
15765 while (dependency !== null) {
15766 // Check if the context matches.
15767 if (dependency.context === context && (dependency.observedBits & changedBits) !== 0) {
15768 // Match! Schedule an update on this fiber.
15769
15770 if (fiber.tag === ClassComponent) {
15771 // Schedule a force update on the work-in-progress.
15772 var update = createUpdate(renderExpirationTime);
15773 update.tag = ForceUpdate;
15774 // TODO: Because we don't have a work-in-progress, this will add the
15775 // update to the current fiber, too, which means it will persist even if
15776 // this render is thrown away. Since it's a race condition, not sure it's
15777 // worth fixing.
15778 enqueueUpdate(fiber, update);
15779 }
15780
15781 if (fiber.expirationTime < renderExpirationTime) {
15782 fiber.expirationTime = renderExpirationTime;
15783 }
15784 var alternate = fiber.alternate;
15785 if (alternate !== null && alternate.expirationTime < renderExpirationTime) {
15786 alternate.expirationTime = renderExpirationTime;
15787 }
15788
15789 scheduleWorkOnParentPath(fiber.return, renderExpirationTime);
15790
15791 // Mark the expiration time on the list, too.
15792 if (list.expirationTime < renderExpirationTime) {
15793 list.expirationTime = renderExpirationTime;
15794 }
15795
15796 // Since we already found a match, we can stop traversing the
15797 // dependency list.
15798 break;
15799 }
15800 dependency = dependency.next;
15801 }
15802 } else if (fiber.tag === ContextProvider) {
15803 // Don't scan deeper if this is a matching provider
15804 nextFiber = fiber.type === workInProgress.type ? null : fiber.child;
15805 } else if (enableSuspenseServerRenderer && fiber.tag === DehydratedSuspenseComponent) {
15806 // If a dehydrated suspense component is in this subtree, we don't know
15807 // if it will have any context consumers in it. The best we can do is
15808 // mark it as having updates on its children.
15809 if (fiber.expirationTime < renderExpirationTime) {
15810 fiber.expirationTime = renderExpirationTime;
15811 }
15812 var _alternate = fiber.alternate;
15813 if (_alternate !== null && _alternate.expirationTime < renderExpirationTime) {
15814 _alternate.expirationTime = renderExpirationTime;
15815 }
15816 // This is intentionally passing this fiber as the parent
15817 // because we want to schedule this fiber as having work
15818 // on its children. We'll use the childExpirationTime on
15819 // this fiber to indicate that a context has changed.
15820 scheduleWorkOnParentPath(fiber, renderExpirationTime);
15821 nextFiber = fiber.sibling;
15822 } else {
15823 // Traverse down.
15824 nextFiber = fiber.child;
15825 }
15826
15827 if (nextFiber !== null) {
15828 // Set the return pointer of the child to the work-in-progress fiber.
15829 nextFiber.return = fiber;
15830 } else {
15831 // No child. Traverse to next sibling.
15832 nextFiber = fiber;
15833 while (nextFiber !== null) {
15834 if (nextFiber === workInProgress) {
15835 // We're back to the root of this subtree. Exit.
15836 nextFiber = null;
15837 break;
15838 }
15839 var sibling = nextFiber.sibling;
15840 if (sibling !== null) {
15841 // Set the return pointer of the sibling to the work-in-progress fiber.
15842 sibling.return = nextFiber.return;
15843 nextFiber = sibling;
15844 break;
15845 }
15846 // No more siblings. Traverse up.
15847 nextFiber = nextFiber.return;
15848 }
15849 }
15850 fiber = nextFiber;
15851 }
15852}
15853
15854function prepareToReadContext(workInProgress, renderExpirationTime) {
15855 currentlyRenderingFiber = workInProgress;
15856 lastContextDependency = null;
15857 lastContextWithAllBitsObserved = null;
15858
15859 var currentDependencies = workInProgress.contextDependencies;
15860 if (currentDependencies !== null && currentDependencies.expirationTime >= renderExpirationTime) {
15861 // Context list has a pending update. Mark that this fiber performed work.
15862 markWorkInProgressReceivedUpdate();
15863 }
15864
15865 // Reset the work-in-progress list
15866 workInProgress.contextDependencies = null;
15867}
15868
15869function readContext(context, observedBits) {
15870 {
15871 // This warning would fire if you read context inside a Hook like useMemo.
15872 // Unlike the class check below, it's not enforced in production for perf.
15873 !!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;
15874 }
15875
15876 if (lastContextWithAllBitsObserved === context) {
15877 // Nothing to do. We already observe everything in this context.
15878 } else if (observedBits === false || observedBits === 0) {
15879 // Do not observe any updates.
15880 } else {
15881 var resolvedObservedBits = void 0; // Avoid deopting on observable arguments or heterogeneous types.
15882 if (typeof observedBits !== 'number' || observedBits === maxSigned31BitInt) {
15883 // Observe all updates.
15884 lastContextWithAllBitsObserved = context;
15885 resolvedObservedBits = maxSigned31BitInt;
15886 } else {
15887 resolvedObservedBits = observedBits;
15888 }
15889
15890 var contextItem = {
15891 context: context,
15892 observedBits: resolvedObservedBits,
15893 next: null
15894 };
15895
15896 if (lastContextDependency === null) {
15897 !(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;
15898
15899 // This is the first dependency for this component. Create a new list.
15900 lastContextDependency = contextItem;
15901 currentlyRenderingFiber.contextDependencies = {
15902 first: contextItem,
15903 expirationTime: NoWork
15904 };
15905 } else {
15906 // Append a new context item.
15907 lastContextDependency = lastContextDependency.next = contextItem;
15908 }
15909 }
15910 return isPrimaryRenderer ? context._currentValue : context._currentValue2;
15911}
15912
15913// UpdateQueue is a linked list of prioritized updates.
15914//
15915// Like fibers, update queues come in pairs: a current queue, which represents
15916// the visible state of the screen, and a work-in-progress queue, which can be
15917// mutated and processed asynchronously before it is committed — a form of
15918// double buffering. If a work-in-progress render is discarded before finishing,
15919// we create a new work-in-progress by cloning the current queue.
15920//
15921// Both queues share a persistent, singly-linked list structure. To schedule an
15922// update, we append it to the end of both queues. Each queue maintains a
15923// pointer to first update in the persistent list that hasn't been processed.
15924// The work-in-progress pointer always has a position equal to or greater than
15925// the current queue, since we always work on that one. The current queue's
15926// pointer is only updated during the commit phase, when we swap in the
15927// work-in-progress.
15928//
15929// For example:
15930//
15931// Current pointer: A - B - C - D - E - F
15932// Work-in-progress pointer: D - E - F
15933// ^
15934// The work-in-progress queue has
15935// processed more updates than current.
15936//
15937// The reason we append to both queues is because otherwise we might drop
15938// updates without ever processing them. For example, if we only add updates to
15939// the work-in-progress queue, some updates could be lost whenever a work-in
15940// -progress render restarts by cloning from current. Similarly, if we only add
15941// updates to the current queue, the updates will be lost whenever an already
15942// in-progress queue commits and swaps with the current queue. However, by
15943// adding to both queues, we guarantee that the update will be part of the next
15944// work-in-progress. (And because the work-in-progress queue becomes the
15945// current queue once it commits, there's no danger of applying the same
15946// update twice.)
15947//
15948// Prioritization
15949// --------------
15950//
15951// Updates are not sorted by priority, but by insertion; new updates are always
15952// appended to the end of the list.
15953//
15954// The priority is still important, though. When processing the update queue
15955// during the render phase, only the updates with sufficient priority are
15956// included in the result. If we skip an update because it has insufficient
15957// priority, it remains in the queue to be processed later, during a lower
15958// priority render. Crucially, all updates subsequent to a skipped update also
15959// remain in the queue *regardless of their priority*. That means high priority
15960// updates are sometimes processed twice, at two separate priorities. We also
15961// keep track of a base state, that represents the state before the first
15962// update in the queue is applied.
15963//
15964// For example:
15965//
15966// Given a base state of '', and the following queue of updates
15967//
15968// A1 - B2 - C1 - D2
15969//
15970// where the number indicates the priority, and the update is applied to the
15971// previous state by appending a letter, React will process these updates as
15972// two separate renders, one per distinct priority level:
15973//
15974// First render, at priority 1:
15975// Base state: ''
15976// Updates: [A1, C1]
15977// Result state: 'AC'
15978//
15979// Second render, at priority 2:
15980// Base state: 'A' <- The base state does not include C1,
15981// because B2 was skipped.
15982// Updates: [B2, C1, D2] <- C1 was rebased on top of B2
15983// Result state: 'ABCD'
15984//
15985// Because we process updates in insertion order, and rebase high priority
15986// updates when preceding updates are skipped, the final result is deterministic
15987// regardless of priority. Intermediate state may vary according to system
15988// resources, but the final state is always the same.
15989
15990var UpdateState = 0;
15991var ReplaceState = 1;
15992var ForceUpdate = 2;
15993var CaptureUpdate = 3;
15994
15995// Global state that is reset at the beginning of calling `processUpdateQueue`.
15996// It should only be read right after calling `processUpdateQueue`, via
15997// `checkHasForceUpdateAfterProcessing`.
15998var hasForceUpdate = false;
15999
16000var didWarnUpdateInsideUpdate = void 0;
16001var currentlyProcessingQueue = void 0;
16002var resetCurrentlyProcessingQueue = void 0;
16003{
16004 didWarnUpdateInsideUpdate = false;
16005 currentlyProcessingQueue = null;
16006 resetCurrentlyProcessingQueue = function () {
16007 currentlyProcessingQueue = null;
16008 };
16009}
16010
16011function createUpdateQueue(baseState) {
16012 var queue = {
16013 baseState: baseState,
16014 firstUpdate: null,
16015 lastUpdate: null,
16016 firstCapturedUpdate: null,
16017 lastCapturedUpdate: null,
16018 firstEffect: null,
16019 lastEffect: null,
16020 firstCapturedEffect: null,
16021 lastCapturedEffect: null
16022 };
16023 return queue;
16024}
16025
16026function cloneUpdateQueue(currentQueue) {
16027 var queue = {
16028 baseState: currentQueue.baseState,
16029 firstUpdate: currentQueue.firstUpdate,
16030 lastUpdate: currentQueue.lastUpdate,
16031
16032 // TODO: With resuming, if we bail out and resuse the child tree, we should
16033 // keep these effects.
16034 firstCapturedUpdate: null,
16035 lastCapturedUpdate: null,
16036
16037 firstEffect: null,
16038 lastEffect: null,
16039
16040 firstCapturedEffect: null,
16041 lastCapturedEffect: null
16042 };
16043 return queue;
16044}
16045
16046function createUpdate(expirationTime) {
16047 return {
16048 expirationTime: expirationTime,
16049
16050 tag: UpdateState,
16051 payload: null,
16052 callback: null,
16053
16054 next: null,
16055 nextEffect: null
16056 };
16057}
16058
16059function appendUpdateToQueue(queue, update) {
16060 // Append the update to the end of the list.
16061 if (queue.lastUpdate === null) {
16062 // Queue is empty
16063 queue.firstUpdate = queue.lastUpdate = update;
16064 } else {
16065 queue.lastUpdate.next = update;
16066 queue.lastUpdate = update;
16067 }
16068}
16069
16070function enqueueUpdate(fiber, update) {
16071 // Update queues are created lazily.
16072 var alternate = fiber.alternate;
16073 var queue1 = void 0;
16074 var queue2 = void 0;
16075 if (alternate === null) {
16076 // There's only one fiber.
16077 queue1 = fiber.updateQueue;
16078 queue2 = null;
16079 if (queue1 === null) {
16080 queue1 = fiber.updateQueue = createUpdateQueue(fiber.memoizedState);
16081 }
16082 } else {
16083 // There are two owners.
16084 queue1 = fiber.updateQueue;
16085 queue2 = alternate.updateQueue;
16086 if (queue1 === null) {
16087 if (queue2 === null) {
16088 // Neither fiber has an update queue. Create new ones.
16089 queue1 = fiber.updateQueue = createUpdateQueue(fiber.memoizedState);
16090 queue2 = alternate.updateQueue = createUpdateQueue(alternate.memoizedState);
16091 } else {
16092 // Only one fiber has an update queue. Clone to create a new one.
16093 queue1 = fiber.updateQueue = cloneUpdateQueue(queue2);
16094 }
16095 } else {
16096 if (queue2 === null) {
16097 // Only one fiber has an update queue. Clone to create a new one.
16098 queue2 = alternate.updateQueue = cloneUpdateQueue(queue1);
16099 } else {
16100 // Both owners have an update queue.
16101 }
16102 }
16103 }
16104 if (queue2 === null || queue1 === queue2) {
16105 // There's only a single queue.
16106 appendUpdateToQueue(queue1, update);
16107 } else {
16108 // There are two queues. We need to append the update to both queues,
16109 // while accounting for the persistent structure of the list — we don't
16110 // want the same update to be added multiple times.
16111 if (queue1.lastUpdate === null || queue2.lastUpdate === null) {
16112 // One of the queues is not empty. We must add the update to both queues.
16113 appendUpdateToQueue(queue1, update);
16114 appendUpdateToQueue(queue2, update);
16115 } else {
16116 // Both queues are non-empty. The last update is the same in both lists,
16117 // because of structural sharing. So, only append to one of the lists.
16118 appendUpdateToQueue(queue1, update);
16119 // But we still need to update the `lastUpdate` pointer of queue2.
16120 queue2.lastUpdate = update;
16121 }
16122 }
16123
16124 {
16125 if (fiber.tag === ClassComponent && (currentlyProcessingQueue === queue1 || queue2 !== null && currentlyProcessingQueue === queue2) && !didWarnUpdateInsideUpdate) {
16126 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.');
16127 didWarnUpdateInsideUpdate = true;
16128 }
16129 }
16130}
16131
16132function enqueueCapturedUpdate(workInProgress, update) {
16133 // Captured updates go into a separate list, and only on the work-in-
16134 // progress queue.
16135 var workInProgressQueue = workInProgress.updateQueue;
16136 if (workInProgressQueue === null) {
16137 workInProgressQueue = workInProgress.updateQueue = createUpdateQueue(workInProgress.memoizedState);
16138 } else {
16139 // TODO: I put this here rather than createWorkInProgress so that we don't
16140 // clone the queue unnecessarily. There's probably a better way to
16141 // structure this.
16142 workInProgressQueue = ensureWorkInProgressQueueIsAClone(workInProgress, workInProgressQueue);
16143 }
16144
16145 // Append the update to the end of the list.
16146 if (workInProgressQueue.lastCapturedUpdate === null) {
16147 // This is the first render phase update
16148 workInProgressQueue.firstCapturedUpdate = workInProgressQueue.lastCapturedUpdate = update;
16149 } else {
16150 workInProgressQueue.lastCapturedUpdate.next = update;
16151 workInProgressQueue.lastCapturedUpdate = update;
16152 }
16153}
16154
16155function ensureWorkInProgressQueueIsAClone(workInProgress, queue) {
16156 var current = workInProgress.alternate;
16157 if (current !== null) {
16158 // If the work-in-progress queue is equal to the current queue,
16159 // we need to clone it first.
16160 if (queue === current.updateQueue) {
16161 queue = workInProgress.updateQueue = cloneUpdateQueue(queue);
16162 }
16163 }
16164 return queue;
16165}
16166
16167function getStateFromUpdate(workInProgress, queue, update, prevState, nextProps, instance) {
16168 switch (update.tag) {
16169 case ReplaceState:
16170 {
16171 var _payload = update.payload;
16172 if (typeof _payload === 'function') {
16173 // Updater function
16174 {
16175 enterDisallowedContextReadInDEV();
16176 if (debugRenderPhaseSideEffects || debugRenderPhaseSideEffectsForStrictMode && workInProgress.mode & StrictMode) {
16177 _payload.call(instance, prevState, nextProps);
16178 }
16179 }
16180 var nextState = _payload.call(instance, prevState, nextProps);
16181 {
16182 exitDisallowedContextReadInDEV();
16183 }
16184 return nextState;
16185 }
16186 // State object
16187 return _payload;
16188 }
16189 case CaptureUpdate:
16190 {
16191 workInProgress.effectTag = workInProgress.effectTag & ~ShouldCapture | DidCapture;
16192 }
16193 // Intentional fallthrough
16194 case UpdateState:
16195 {
16196 var _payload2 = update.payload;
16197 var partialState = void 0;
16198 if (typeof _payload2 === 'function') {
16199 // Updater function
16200 {
16201 enterDisallowedContextReadInDEV();
16202 if (debugRenderPhaseSideEffects || debugRenderPhaseSideEffectsForStrictMode && workInProgress.mode & StrictMode) {
16203 _payload2.call(instance, prevState, nextProps);
16204 }
16205 }
16206 partialState = _payload2.call(instance, prevState, nextProps);
16207 {
16208 exitDisallowedContextReadInDEV();
16209 }
16210 } else {
16211 // Partial state object
16212 partialState = _payload2;
16213 }
16214 if (partialState === null || partialState === undefined) {
16215 // Null and undefined are treated as no-ops.
16216 return prevState;
16217 }
16218 // Merge the partial state and the previous state.
16219 return _assign({}, prevState, partialState);
16220 }
16221 case ForceUpdate:
16222 {
16223 hasForceUpdate = true;
16224 return prevState;
16225 }
16226 }
16227 return prevState;
16228}
16229
16230function processUpdateQueue(workInProgress, queue, props, instance, renderExpirationTime) {
16231 hasForceUpdate = false;
16232
16233 queue = ensureWorkInProgressQueueIsAClone(workInProgress, queue);
16234
16235 {
16236 currentlyProcessingQueue = queue;
16237 }
16238
16239 // These values may change as we process the queue.
16240 var newBaseState = queue.baseState;
16241 var newFirstUpdate = null;
16242 var newExpirationTime = NoWork;
16243
16244 // Iterate through the list of updates to compute the result.
16245 var update = queue.firstUpdate;
16246 var resultState = newBaseState;
16247 while (update !== null) {
16248 var updateExpirationTime = update.expirationTime;
16249 if (updateExpirationTime < renderExpirationTime) {
16250 // This update does not have sufficient priority. Skip it.
16251 if (newFirstUpdate === null) {
16252 // This is the first skipped update. It will be the first update in
16253 // the new list.
16254 newFirstUpdate = update;
16255 // Since this is the first update that was skipped, the current result
16256 // is the new base state.
16257 newBaseState = resultState;
16258 }
16259 // Since this update will remain in the list, update the remaining
16260 // expiration time.
16261 if (newExpirationTime < updateExpirationTime) {
16262 newExpirationTime = updateExpirationTime;
16263 }
16264 } else {
16265 // This update does have sufficient priority. Process it and compute
16266 // a new result.
16267 resultState = getStateFromUpdate(workInProgress, queue, update, resultState, props, instance);
16268 var _callback = update.callback;
16269 if (_callback !== null) {
16270 workInProgress.effectTag |= Callback;
16271 // Set this to null, in case it was mutated during an aborted render.
16272 update.nextEffect = null;
16273 if (queue.lastEffect === null) {
16274 queue.firstEffect = queue.lastEffect = update;
16275 } else {
16276 queue.lastEffect.nextEffect = update;
16277 queue.lastEffect = update;
16278 }
16279 }
16280 }
16281 // Continue to the next update.
16282 update = update.next;
16283 }
16284
16285 // Separately, iterate though the list of captured updates.
16286 var newFirstCapturedUpdate = null;
16287 update = queue.firstCapturedUpdate;
16288 while (update !== null) {
16289 var _updateExpirationTime = update.expirationTime;
16290 if (_updateExpirationTime < renderExpirationTime) {
16291 // This update does not have sufficient priority. Skip it.
16292 if (newFirstCapturedUpdate === null) {
16293 // This is the first skipped captured update. It will be the first
16294 // update in the new list.
16295 newFirstCapturedUpdate = update;
16296 // If this is the first update that was skipped, the current result is
16297 // the new base state.
16298 if (newFirstUpdate === null) {
16299 newBaseState = resultState;
16300 }
16301 }
16302 // Since this update will remain in the list, update the remaining
16303 // expiration time.
16304 if (newExpirationTime < _updateExpirationTime) {
16305 newExpirationTime = _updateExpirationTime;
16306 }
16307 } else {
16308 // This update does have sufficient priority. Process it and compute
16309 // a new result.
16310 resultState = getStateFromUpdate(workInProgress, queue, update, resultState, props, instance);
16311 var _callback2 = update.callback;
16312 if (_callback2 !== null) {
16313 workInProgress.effectTag |= Callback;
16314 // Set this to null, in case it was mutated during an aborted render.
16315 update.nextEffect = null;
16316 if (queue.lastCapturedEffect === null) {
16317 queue.firstCapturedEffect = queue.lastCapturedEffect = update;
16318 } else {
16319 queue.lastCapturedEffect.nextEffect = update;
16320 queue.lastCapturedEffect = update;
16321 }
16322 }
16323 }
16324 update = update.next;
16325 }
16326
16327 if (newFirstUpdate === null) {
16328 queue.lastUpdate = null;
16329 }
16330 if (newFirstCapturedUpdate === null) {
16331 queue.lastCapturedUpdate = null;
16332 } else {
16333 workInProgress.effectTag |= Callback;
16334 }
16335 if (newFirstUpdate === null && newFirstCapturedUpdate === null) {
16336 // We processed every update, without skipping. That means the new base
16337 // state is the same as the result state.
16338 newBaseState = resultState;
16339 }
16340
16341 queue.baseState = newBaseState;
16342 queue.firstUpdate = newFirstUpdate;
16343 queue.firstCapturedUpdate = newFirstCapturedUpdate;
16344
16345 // Set the remaining expiration time to be whatever is remaining in the queue.
16346 // This should be fine because the only two other things that contribute to
16347 // expiration time are props and context. We're already in the middle of the
16348 // begin phase by the time we start processing the queue, so we've already
16349 // dealt with the props. Context in components that specify
16350 // shouldComponentUpdate is tricky; but we'll have to account for
16351 // that regardless.
16352 workInProgress.expirationTime = newExpirationTime;
16353 workInProgress.memoizedState = resultState;
16354
16355 {
16356 currentlyProcessingQueue = null;
16357 }
16358}
16359
16360function callCallback(callback, context) {
16361 !(typeof callback === 'function') ? invariant(false, 'Invalid argument passed as callback. Expected a function. Instead received: %s', callback) : void 0;
16362 callback.call(context);
16363}
16364
16365function resetHasForceUpdateBeforeProcessing() {
16366 hasForceUpdate = false;
16367}
16368
16369function checkHasForceUpdateAfterProcessing() {
16370 return hasForceUpdate;
16371}
16372
16373function commitUpdateQueue(finishedWork, finishedQueue, instance, renderExpirationTime) {
16374 // If the finished render included captured updates, and there are still
16375 // lower priority updates left over, we need to keep the captured updates
16376 // in the queue so that they are rebased and not dropped once we process the
16377 // queue again at the lower priority.
16378 if (finishedQueue.firstCapturedUpdate !== null) {
16379 // Join the captured update list to the end of the normal list.
16380 if (finishedQueue.lastUpdate !== null) {
16381 finishedQueue.lastUpdate.next = finishedQueue.firstCapturedUpdate;
16382 finishedQueue.lastUpdate = finishedQueue.lastCapturedUpdate;
16383 }
16384 // Clear the list of captured updates.
16385 finishedQueue.firstCapturedUpdate = finishedQueue.lastCapturedUpdate = null;
16386 }
16387
16388 // Commit the effects
16389 commitUpdateEffects(finishedQueue.firstEffect, instance);
16390 finishedQueue.firstEffect = finishedQueue.lastEffect = null;
16391
16392 commitUpdateEffects(finishedQueue.firstCapturedEffect, instance);
16393 finishedQueue.firstCapturedEffect = finishedQueue.lastCapturedEffect = null;
16394}
16395
16396function commitUpdateEffects(effect, instance) {
16397 while (effect !== null) {
16398 var _callback3 = effect.callback;
16399 if (_callback3 !== null) {
16400 effect.callback = null;
16401 callCallback(_callback3, instance);
16402 }
16403 effect = effect.nextEffect;
16404 }
16405}
16406
16407function createCapturedValue(value, source) {
16408 // If the value is an error, call this function immediately after it is thrown
16409 // so the stack is accurate.
16410 return {
16411 value: value,
16412 source: source,
16413 stack: getStackByFiberInDevAndProd(source)
16414 };
16415}
16416
16417function markUpdate(workInProgress) {
16418 // Tag the fiber with an update effect. This turns a Placement into
16419 // a PlacementAndUpdate.
16420 workInProgress.effectTag |= Update;
16421}
16422
16423function markRef$1(workInProgress) {
16424 workInProgress.effectTag |= Ref;
16425}
16426
16427var appendAllChildren = void 0;
16428var updateHostContainer = void 0;
16429var updateHostComponent$1 = void 0;
16430var updateHostText$1 = void 0;
16431if (supportsMutation) {
16432 // Mutation mode
16433
16434 appendAllChildren = function (parent, workInProgress, needsVisibilityToggle, isHidden) {
16435 // We only have the top Fiber that was created but we need recurse down its
16436 // children to find all the terminal nodes.
16437 var node = workInProgress.child;
16438 while (node !== null) {
16439 if (node.tag === HostComponent || node.tag === HostText) {
16440 appendInitialChild(parent, node.stateNode);
16441 } else if (node.tag === HostPortal) {
16442 // If we have a portal child, then we don't want to traverse
16443 // down its children. Instead, we'll get insertions from each child in
16444 // the portal directly.
16445 } else if (node.child !== null) {
16446 node.child.return = node;
16447 node = node.child;
16448 continue;
16449 }
16450 if (node === workInProgress) {
16451 return;
16452 }
16453 while (node.sibling === null) {
16454 if (node.return === null || node.return === workInProgress) {
16455 return;
16456 }
16457 node = node.return;
16458 }
16459 node.sibling.return = node.return;
16460 node = node.sibling;
16461 }
16462 };
16463
16464 updateHostContainer = function (workInProgress) {
16465 // Noop
16466 };
16467 updateHostComponent$1 = function (current, workInProgress, type, newProps, rootContainerInstance) {
16468 // If we have an alternate, that means this is an update and we need to
16469 // schedule a side-effect to do the updates.
16470 var oldProps = current.memoizedProps;
16471 if (oldProps === newProps) {
16472 // In mutation mode, this is sufficient for a bailout because
16473 // we won't touch this node even if children changed.
16474 return;
16475 }
16476
16477 // If we get updated because one of our children updated, we don't
16478 // have newProps so we'll have to reuse them.
16479 // TODO: Split the update API as separate for the props vs. children.
16480 // Even better would be if children weren't special cased at all tho.
16481 var instance = workInProgress.stateNode;
16482 var currentHostContext = getHostContext();
16483 // TODO: Experiencing an error where oldProps is null. Suggests a host
16484 // component is hitting the resume path. Figure out why. Possibly
16485 // related to `hidden`.
16486 var updatePayload = prepareUpdate(instance, type, oldProps, newProps, rootContainerInstance, currentHostContext);
16487 // TODO: Type this specific to this type of component.
16488 workInProgress.updateQueue = updatePayload;
16489 // If the update payload indicates that there is a change or if there
16490 // is a new ref we mark this as an update. All the work is done in commitWork.
16491 if (updatePayload) {
16492 markUpdate(workInProgress);
16493 }
16494 };
16495 updateHostText$1 = function (current, workInProgress, oldText, newText) {
16496 // If the text differs, mark it as an update. All the work in done in commitWork.
16497 if (oldText !== newText) {
16498 markUpdate(workInProgress);
16499 }
16500 };
16501} else if (supportsPersistence) {
16502 // Persistent host tree mode
16503
16504 appendAllChildren = function (parent, workInProgress, needsVisibilityToggle, isHidden) {
16505 // We only have the top Fiber that was created but we need recurse down its
16506 // children to find all the terminal nodes.
16507 var node = workInProgress.child;
16508 while (node !== null) {
16509 // eslint-disable-next-line no-labels
16510 branches: if (node.tag === HostComponent) {
16511 var instance = node.stateNode;
16512 if (needsVisibilityToggle) {
16513 var props = node.memoizedProps;
16514 var type = node.type;
16515 if (isHidden) {
16516 // This child is inside a timed out tree. Hide it.
16517 instance = cloneHiddenInstance(instance, type, props, node);
16518 } else {
16519 // This child was previously inside a timed out tree. If it was not
16520 // updated during this render, it may need to be unhidden. Clone
16521 // again to be sure.
16522 instance = cloneUnhiddenInstance(instance, type, props, node);
16523 }
16524 node.stateNode = instance;
16525 }
16526 appendInitialChild(parent, instance);
16527 } else if (node.tag === HostText) {
16528 var _instance = node.stateNode;
16529 if (needsVisibilityToggle) {
16530 var text = node.memoizedProps;
16531 var rootContainerInstance = getRootHostContainer();
16532 var currentHostContext = getHostContext();
16533 if (isHidden) {
16534 _instance = createHiddenTextInstance(text, rootContainerInstance, currentHostContext, workInProgress);
16535 } else {
16536 _instance = createTextInstance(text, rootContainerInstance, currentHostContext, workInProgress);
16537 }
16538 node.stateNode = _instance;
16539 }
16540 appendInitialChild(parent, _instance);
16541 } else if (node.tag === HostPortal) {
16542 // If we have a portal child, then we don't want to traverse
16543 // down its children. Instead, we'll get insertions from each child in
16544 // the portal directly.
16545 } else if (node.tag === SuspenseComponent) {
16546 var current = node.alternate;
16547 if (current !== null) {
16548 var oldState = current.memoizedState;
16549 var newState = node.memoizedState;
16550 var oldIsHidden = oldState !== null;
16551 var newIsHidden = newState !== null;
16552 if (oldIsHidden !== newIsHidden) {
16553 // The placeholder either just timed out or switched back to the normal
16554 // children after having previously timed out. Toggle the visibility of
16555 // the direct host children.
16556 var primaryChildParent = newIsHidden ? node.child : node;
16557 if (primaryChildParent !== null) {
16558 appendAllChildren(parent, primaryChildParent, true, newIsHidden);
16559 }
16560 // eslint-disable-next-line no-labels
16561 break branches;
16562 }
16563 }
16564 if (node.child !== null) {
16565 // Continue traversing like normal
16566 node.child.return = node;
16567 node = node.child;
16568 continue;
16569 }
16570 } else if (node.child !== null) {
16571 node.child.return = node;
16572 node = node.child;
16573 continue;
16574 }
16575 // $FlowFixMe This is correct but Flow is confused by the labeled break.
16576 node = node;
16577 if (node === workInProgress) {
16578 return;
16579 }
16580 while (node.sibling === null) {
16581 if (node.return === null || node.return === workInProgress) {
16582 return;
16583 }
16584 node = node.return;
16585 }
16586 node.sibling.return = node.return;
16587 node = node.sibling;
16588 }
16589 };
16590
16591 // An unfortunate fork of appendAllChildren because we have two different parent types.
16592 var appendAllChildrenToContainer = function (containerChildSet, workInProgress, needsVisibilityToggle, isHidden) {
16593 // We only have the top Fiber that was created but we need recurse down its
16594 // children to find all the terminal nodes.
16595 var node = workInProgress.child;
16596 while (node !== null) {
16597 // eslint-disable-next-line no-labels
16598 branches: if (node.tag === HostComponent) {
16599 var instance = node.stateNode;
16600 if (needsVisibilityToggle) {
16601 var props = node.memoizedProps;
16602 var type = node.type;
16603 if (isHidden) {
16604 // This child is inside a timed out tree. Hide it.
16605 instance = cloneHiddenInstance(instance, type, props, node);
16606 } else {
16607 // This child was previously inside a timed out tree. If it was not
16608 // updated during this render, it may need to be unhidden. Clone
16609 // again to be sure.
16610 instance = cloneUnhiddenInstance(instance, type, props, node);
16611 }
16612 node.stateNode = instance;
16613 }
16614 appendChildToContainerChildSet(containerChildSet, instance);
16615 } else if (node.tag === HostText) {
16616 var _instance2 = node.stateNode;
16617 if (needsVisibilityToggle) {
16618 var text = node.memoizedProps;
16619 var rootContainerInstance = getRootHostContainer();
16620 var currentHostContext = getHostContext();
16621 if (isHidden) {
16622 _instance2 = createHiddenTextInstance(text, rootContainerInstance, currentHostContext, workInProgress);
16623 } else {
16624 _instance2 = createTextInstance(text, rootContainerInstance, currentHostContext, workInProgress);
16625 }
16626 node.stateNode = _instance2;
16627 }
16628 appendChildToContainerChildSet(containerChildSet, _instance2);
16629 } else if (node.tag === HostPortal) {
16630 // If we have a portal child, then we don't want to traverse
16631 // down its children. Instead, we'll get insertions from each child in
16632 // the portal directly.
16633 } else if (node.tag === SuspenseComponent) {
16634 var current = node.alternate;
16635 if (current !== null) {
16636 var oldState = current.memoizedState;
16637 var newState = node.memoizedState;
16638 var oldIsHidden = oldState !== null;
16639 var newIsHidden = newState !== null;
16640 if (oldIsHidden !== newIsHidden) {
16641 // The placeholder either just timed out or switched back to the normal
16642 // children after having previously timed out. Toggle the visibility of
16643 // the direct host children.
16644 var primaryChildParent = newIsHidden ? node.child : node;
16645 if (primaryChildParent !== null) {
16646 appendAllChildrenToContainer(containerChildSet, primaryChildParent, true, newIsHidden);
16647 }
16648 // eslint-disable-next-line no-labels
16649 break branches;
16650 }
16651 }
16652 if (node.child !== null) {
16653 // Continue traversing like normal
16654 node.child.return = node;
16655 node = node.child;
16656 continue;
16657 }
16658 } else if (node.child !== null) {
16659 node.child.return = node;
16660 node = node.child;
16661 continue;
16662 }
16663 // $FlowFixMe This is correct but Flow is confused by the labeled break.
16664 node = node;
16665 if (node === workInProgress) {
16666 return;
16667 }
16668 while (node.sibling === null) {
16669 if (node.return === null || node.return === workInProgress) {
16670 return;
16671 }
16672 node = node.return;
16673 }
16674 node.sibling.return = node.return;
16675 node = node.sibling;
16676 }
16677 };
16678 updateHostContainer = function (workInProgress) {
16679 var portalOrRoot = workInProgress.stateNode;
16680 var childrenUnchanged = workInProgress.firstEffect === null;
16681 if (childrenUnchanged) {
16682 // No changes, just reuse the existing instance.
16683 } else {
16684 var container = portalOrRoot.containerInfo;
16685 var newChildSet = createContainerChildSet(container);
16686 // If children might have changed, we have to add them all to the set.
16687 appendAllChildrenToContainer(newChildSet, workInProgress, false, false);
16688 portalOrRoot.pendingChildren = newChildSet;
16689 // Schedule an update on the container to swap out the container.
16690 markUpdate(workInProgress);
16691 finalizeContainerChildren(container, newChildSet);
16692 }
16693 };
16694 updateHostComponent$1 = function (current, workInProgress, type, newProps, rootContainerInstance) {
16695 var currentInstance = current.stateNode;
16696 var oldProps = current.memoizedProps;
16697 // If there are no effects associated with this node, then none of our children had any updates.
16698 // This guarantees that we can reuse all of them.
16699 var childrenUnchanged = workInProgress.firstEffect === null;
16700 if (childrenUnchanged && oldProps === newProps) {
16701 // No changes, just reuse the existing instance.
16702 // Note that this might release a previous clone.
16703 workInProgress.stateNode = currentInstance;
16704 return;
16705 }
16706 var recyclableInstance = workInProgress.stateNode;
16707 var currentHostContext = getHostContext();
16708 var updatePayload = null;
16709 if (oldProps !== newProps) {
16710 updatePayload = prepareUpdate(recyclableInstance, type, oldProps, newProps, rootContainerInstance, currentHostContext);
16711 }
16712 if (childrenUnchanged && updatePayload === null) {
16713 // No changes, just reuse the existing instance.
16714 // Note that this might release a previous clone.
16715 workInProgress.stateNode = currentInstance;
16716 return;
16717 }
16718 var newInstance = cloneInstance(currentInstance, updatePayload, type, oldProps, newProps, workInProgress, childrenUnchanged, recyclableInstance);
16719 if (finalizeInitialChildren(newInstance, type, newProps, rootContainerInstance, currentHostContext)) {
16720 markUpdate(workInProgress);
16721 }
16722 workInProgress.stateNode = newInstance;
16723 if (childrenUnchanged) {
16724 // If there are no other effects in this tree, we need to flag this node as having one.
16725 // Even though we're not going to use it for anything.
16726 // Otherwise parents won't know that there are new children to propagate upwards.
16727 markUpdate(workInProgress);
16728 } else {
16729 // If children might have changed, we have to add them all to the set.
16730 appendAllChildren(newInstance, workInProgress, false, false);
16731 }
16732 };
16733 updateHostText$1 = function (current, workInProgress, oldText, newText) {
16734 if (oldText !== newText) {
16735 // If the text content differs, we'll create a new text instance for it.
16736 var rootContainerInstance = getRootHostContainer();
16737 var currentHostContext = getHostContext();
16738 workInProgress.stateNode = createTextInstance(newText, rootContainerInstance, currentHostContext, workInProgress);
16739 // We'll have to mark it as having an effect, even though we won't use the effect for anything.
16740 // This lets the parents know that at least one of their children has changed.
16741 markUpdate(workInProgress);
16742 }
16743 };
16744} else {
16745 // No host operations
16746 updateHostContainer = function (workInProgress) {
16747 // Noop
16748 };
16749 updateHostComponent$1 = function (current, workInProgress, type, newProps, rootContainerInstance) {
16750 // Noop
16751 };
16752 updateHostText$1 = function (current, workInProgress, oldText, newText) {
16753 // Noop
16754 };
16755}
16756
16757function completeWork(current, workInProgress, renderExpirationTime) {
16758 var newProps = workInProgress.pendingProps;
16759
16760 switch (workInProgress.tag) {
16761 case IndeterminateComponent:
16762 break;
16763 case LazyComponent:
16764 break;
16765 case SimpleMemoComponent:
16766 case FunctionComponent:
16767 break;
16768 case ClassComponent:
16769 {
16770 var Component = workInProgress.type;
16771 if (isContextProvider(Component)) {
16772 popContext(workInProgress);
16773 }
16774 break;
16775 }
16776 case HostRoot:
16777 {
16778 popHostContainer(workInProgress);
16779 popTopLevelContextObject(workInProgress);
16780 var fiberRoot = workInProgress.stateNode;
16781 if (fiberRoot.pendingContext) {
16782 fiberRoot.context = fiberRoot.pendingContext;
16783 fiberRoot.pendingContext = null;
16784 }
16785 if (current === null || current.child === null) {
16786 // If we hydrated, pop so that we can delete any remaining children
16787 // that weren't hydrated.
16788 popHydrationState(workInProgress);
16789 // This resets the hacky state to fix isMounted before committing.
16790 // TODO: Delete this when we delete isMounted and findDOMNode.
16791 workInProgress.effectTag &= ~Placement;
16792 }
16793 updateHostContainer(workInProgress);
16794 break;
16795 }
16796 case HostComponent:
16797 {
16798 popHostContext(workInProgress);
16799 var rootContainerInstance = getRootHostContainer();
16800 var type = workInProgress.type;
16801 if (current !== null && workInProgress.stateNode != null) {
16802 updateHostComponent$1(current, workInProgress, type, newProps, rootContainerInstance);
16803
16804 if (current.ref !== workInProgress.ref) {
16805 markRef$1(workInProgress);
16806 }
16807 } else {
16808 if (!newProps) {
16809 !(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;
16810 // This can happen when we abort work.
16811 break;
16812 }
16813
16814 var currentHostContext = getHostContext();
16815 // TODO: Move createInstance to beginWork and keep it on a context
16816 // "stack" as the parent. Then append children as we go in beginWork
16817 // or completeWork depending on we want to add then top->down or
16818 // bottom->up. Top->down is faster in IE11.
16819 var wasHydrated = popHydrationState(workInProgress);
16820 if (wasHydrated) {
16821 // TODO: Move this and createInstance step into the beginPhase
16822 // to consolidate.
16823 if (prepareToHydrateHostInstance(workInProgress, rootContainerInstance, currentHostContext)) {
16824 // If changes to the hydrated node needs to be applied at the
16825 // commit-phase we mark this as such.
16826 markUpdate(workInProgress);
16827 }
16828 } else {
16829 var instance = createInstance(type, newProps, rootContainerInstance, currentHostContext, workInProgress);
16830
16831 appendAllChildren(instance, workInProgress, false, false);
16832
16833 // Certain renderers require commit-time effects for initial mount.
16834 // (eg DOM renderer supports auto-focus for certain elements).
16835 // Make sure such renderers get scheduled for later work.
16836 if (finalizeInitialChildren(instance, type, newProps, rootContainerInstance, currentHostContext)) {
16837 markUpdate(workInProgress);
16838 }
16839 workInProgress.stateNode = instance;
16840 }
16841
16842 if (workInProgress.ref !== null) {
16843 // If there is a ref on a host node we need to schedule a callback
16844 markRef$1(workInProgress);
16845 }
16846 }
16847 break;
16848 }
16849 case HostText:
16850 {
16851 var newText = newProps;
16852 if (current && workInProgress.stateNode != null) {
16853 var oldText = current.memoizedProps;
16854 // If we have an alternate, that means this is an update and we need
16855 // to schedule a side-effect to do the updates.
16856 updateHostText$1(current, workInProgress, oldText, newText);
16857 } else {
16858 if (typeof newText !== 'string') {
16859 !(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;
16860 // This can happen when we abort work.
16861 }
16862 var _rootContainerInstance = getRootHostContainer();
16863 var _currentHostContext = getHostContext();
16864 var _wasHydrated = popHydrationState(workInProgress);
16865 if (_wasHydrated) {
16866 if (prepareToHydrateHostTextInstance(workInProgress)) {
16867 markUpdate(workInProgress);
16868 }
16869 } else {
16870 workInProgress.stateNode = createTextInstance(newText, _rootContainerInstance, _currentHostContext, workInProgress);
16871 }
16872 }
16873 break;
16874 }
16875 case ForwardRef:
16876 break;
16877 case SuspenseComponent:
16878 {
16879 var nextState = workInProgress.memoizedState;
16880 if ((workInProgress.effectTag & DidCapture) !== NoEffect) {
16881 // Something suspended. Re-render with the fallback children.
16882 workInProgress.expirationTime = renderExpirationTime;
16883 // Do not reset the effect list.
16884 return workInProgress;
16885 }
16886
16887 var nextDidTimeout = nextState !== null;
16888 var prevDidTimeout = current !== null && current.memoizedState !== null;
16889
16890 if (current !== null && !nextDidTimeout && prevDidTimeout) {
16891 // We just switched from the fallback to the normal children. Delete
16892 // the fallback.
16893 // TODO: Would it be better to store the fallback fragment on
16894 var currentFallbackChild = current.child.sibling;
16895 if (currentFallbackChild !== null) {
16896 // Deletions go at the beginning of the return fiber's effect list
16897 var first = workInProgress.firstEffect;
16898 if (first !== null) {
16899 workInProgress.firstEffect = currentFallbackChild;
16900 currentFallbackChild.nextEffect = first;
16901 } else {
16902 workInProgress.firstEffect = workInProgress.lastEffect = currentFallbackChild;
16903 currentFallbackChild.nextEffect = null;
16904 }
16905 currentFallbackChild.effectTag = Deletion;
16906 }
16907 }
16908
16909 if (nextDidTimeout || prevDidTimeout) {
16910 // If the children are hidden, or if they were previous hidden, schedule
16911 // an effect to toggle their visibility. This is also used to attach a
16912 // retry listener to the promise.
16913 workInProgress.effectTag |= Update;
16914 }
16915 break;
16916 }
16917 case Fragment:
16918 break;
16919 case Mode:
16920 break;
16921 case Profiler:
16922 break;
16923 case HostPortal:
16924 popHostContainer(workInProgress);
16925 updateHostContainer(workInProgress);
16926 break;
16927 case ContextProvider:
16928 // Pop provider fiber
16929 popProvider(workInProgress);
16930 break;
16931 case ContextConsumer:
16932 break;
16933 case MemoComponent:
16934 break;
16935 case IncompleteClassComponent:
16936 {
16937 // Same as class component case. I put it down here so that the tags are
16938 // sequential to ensure this switch is compiled to a jump table.
16939 var _Component = workInProgress.type;
16940 if (isContextProvider(_Component)) {
16941 popContext(workInProgress);
16942 }
16943 break;
16944 }
16945 case DehydratedSuspenseComponent:
16946 {
16947 if (enableSuspenseServerRenderer) {
16948 if (current === null) {
16949 var _wasHydrated2 = popHydrationState(workInProgress);
16950 !_wasHydrated2 ? invariant(false, 'A dehydrated suspense component was completed without a hydrated node. This is probably a bug in React.') : void 0;
16951 skipPastDehydratedSuspenseInstance(workInProgress);
16952 } else if ((workInProgress.effectTag & DidCapture) === NoEffect) {
16953 // This boundary did not suspend so it's now hydrated.
16954 // To handle any future suspense cases, we're going to now upgrade it
16955 // to a Suspense component. We detach it from the existing current fiber.
16956 current.alternate = null;
16957 workInProgress.alternate = null;
16958 workInProgress.tag = SuspenseComponent;
16959 workInProgress.memoizedState = null;
16960 workInProgress.stateNode = null;
16961 }
16962 }
16963 break;
16964 }
16965 default:
16966 invariant(false, 'Unknown unit of work tag. This error is likely caused by a bug in React. Please file an issue.');
16967 }
16968
16969 return null;
16970}
16971
16972function shouldCaptureSuspense(workInProgress) {
16973 // In order to capture, the Suspense component must have a fallback prop.
16974 if (workInProgress.memoizedProps.fallback === undefined) {
16975 return false;
16976 }
16977 // If it was the primary children that just suspended, capture and render the
16978 // fallback. Otherwise, don't capture and bubble to the next boundary.
16979 var nextState = workInProgress.memoizedState;
16980 return nextState === null;
16981}
16982
16983// This module is forked in different environments.
16984// By default, return `true` to log errors to the console.
16985// Forks can return `false` if this isn't desirable.
16986function showErrorDialog(capturedError) {
16987 return true;
16988}
16989
16990function logCapturedError(capturedError) {
16991 var logError = showErrorDialog(capturedError);
16992
16993 // Allow injected showErrorDialog() to prevent default console.error logging.
16994 // This enables renderers like ReactNative to better manage redbox behavior.
16995 if (logError === false) {
16996 return;
16997 }
16998
16999 var error = capturedError.error;
17000 {
17001 var componentName = capturedError.componentName,
17002 componentStack = capturedError.componentStack,
17003 errorBoundaryName = capturedError.errorBoundaryName,
17004 errorBoundaryFound = capturedError.errorBoundaryFound,
17005 willRetry = capturedError.willRetry;
17006
17007 // Browsers support silencing uncaught errors by calling
17008 // `preventDefault()` in window `error` handler.
17009 // We record this information as an expando on the error.
17010
17011 if (error != null && error._suppressLogging) {
17012 if (errorBoundaryFound && willRetry) {
17013 // The error is recoverable and was silenced.
17014 // Ignore it and don't print the stack addendum.
17015 // This is handy for testing error boundaries without noise.
17016 return;
17017 }
17018 // The error is fatal. Since the silencing might have
17019 // been accidental, we'll surface it anyway.
17020 // However, the browser would have silenced the original error
17021 // so we'll print it first, and then print the stack addendum.
17022 console.error(error);
17023 // For a more detailed description of this block, see:
17024 // https://github.com/facebook/react/pull/13384
17025 }
17026
17027 var componentNameMessage = componentName ? 'The above error occurred in the <' + componentName + '> component:' : 'The above error occurred in one of your React components:';
17028
17029 var errorBoundaryMessage = void 0;
17030 // errorBoundaryFound check is sufficient; errorBoundaryName check is to satisfy Flow.
17031 if (errorBoundaryFound && errorBoundaryName) {
17032 if (willRetry) {
17033 errorBoundaryMessage = 'React will try to recreate this component tree from scratch ' + ('using the error boundary you provided, ' + errorBoundaryName + '.');
17034 } else {
17035 errorBoundaryMessage = 'This error was initially handled by the error boundary ' + errorBoundaryName + '.\n' + 'Recreating the tree from scratch failed so React will unmount the tree.';
17036 }
17037 } else {
17038 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.';
17039 }
17040 var combinedMessage = '' + componentNameMessage + componentStack + '\n\n' + ('' + errorBoundaryMessage);
17041
17042 // In development, we provide our own message with just the component stack.
17043 // We don't include the original error message and JS stack because the browser
17044 // has already printed it. Even if the application swallows the error, it is still
17045 // displayed by the browser thanks to the DEV-only fake event trick in ReactErrorUtils.
17046 console.error(combinedMessage);
17047 }
17048}
17049
17050var didWarnAboutUndefinedSnapshotBeforeUpdate = null;
17051{
17052 didWarnAboutUndefinedSnapshotBeforeUpdate = new Set();
17053}
17054
17055var PossiblyWeakSet$1 = typeof WeakSet === 'function' ? WeakSet : Set;
17056
17057function logError(boundary, errorInfo) {
17058 var source = errorInfo.source;
17059 var stack = errorInfo.stack;
17060 if (stack === null && source !== null) {
17061 stack = getStackByFiberInDevAndProd(source);
17062 }
17063
17064 var capturedError = {
17065 componentName: source !== null ? getComponentName(source.type) : null,
17066 componentStack: stack !== null ? stack : '',
17067 error: errorInfo.value,
17068 errorBoundary: null,
17069 errorBoundaryName: null,
17070 errorBoundaryFound: false,
17071 willRetry: false
17072 };
17073
17074 if (boundary !== null && boundary.tag === ClassComponent) {
17075 capturedError.errorBoundary = boundary.stateNode;
17076 capturedError.errorBoundaryName = getComponentName(boundary.type);
17077 capturedError.errorBoundaryFound = true;
17078 capturedError.willRetry = true;
17079 }
17080
17081 try {
17082 logCapturedError(capturedError);
17083 } catch (e) {
17084 // This method must not throw, or React internal state will get messed up.
17085 // If console.error is overridden, or logCapturedError() shows a dialog that throws,
17086 // we want to report this error outside of the normal stack as a last resort.
17087 // https://github.com/facebook/react/issues/13188
17088 setTimeout(function () {
17089 throw e;
17090 });
17091 }
17092}
17093
17094var callComponentWillUnmountWithTimer = function (current$$1, instance) {
17095 startPhaseTimer(current$$1, 'componentWillUnmount');
17096 instance.props = current$$1.memoizedProps;
17097 instance.state = current$$1.memoizedState;
17098 instance.componentWillUnmount();
17099 stopPhaseTimer();
17100};
17101
17102// Capture errors so they don't interrupt unmounting.
17103function safelyCallComponentWillUnmount(current$$1, instance) {
17104 {
17105 invokeGuardedCallback(null, callComponentWillUnmountWithTimer, null, current$$1, instance);
17106 if (hasCaughtError()) {
17107 var unmountError = clearCaughtError();
17108 captureCommitPhaseError(current$$1, unmountError);
17109 }
17110 }
17111}
17112
17113function safelyDetachRef(current$$1) {
17114 var ref = current$$1.ref;
17115 if (ref !== null) {
17116 if (typeof ref === 'function') {
17117 {
17118 invokeGuardedCallback(null, ref, null, null);
17119 if (hasCaughtError()) {
17120 var refError = clearCaughtError();
17121 captureCommitPhaseError(current$$1, refError);
17122 }
17123 }
17124 } else {
17125 ref.current = null;
17126 }
17127 }
17128}
17129
17130function safelyCallDestroy(current$$1, destroy) {
17131 {
17132 invokeGuardedCallback(null, destroy, null);
17133 if (hasCaughtError()) {
17134 var error = clearCaughtError();
17135 captureCommitPhaseError(current$$1, error);
17136 }
17137 }
17138}
17139
17140function commitBeforeMutationLifeCycles(current$$1, finishedWork) {
17141 switch (finishedWork.tag) {
17142 case FunctionComponent:
17143 case ForwardRef:
17144 case SimpleMemoComponent:
17145 {
17146 commitHookEffectList(UnmountSnapshot, NoEffect$1, finishedWork);
17147 return;
17148 }
17149 case ClassComponent:
17150 {
17151 if (finishedWork.effectTag & Snapshot) {
17152 if (current$$1 !== null) {
17153 var prevProps = current$$1.memoizedProps;
17154 var prevState = current$$1.memoizedState;
17155 startPhaseTimer(finishedWork, 'getSnapshotBeforeUpdate');
17156 var instance = finishedWork.stateNode;
17157 // We could update instance props and state here,
17158 // but instead we rely on them being set during last render.
17159 // TODO: revisit this when we implement resuming.
17160 {
17161 if (finishedWork.type === finishedWork.elementType && !didWarnAboutReassigningProps) {
17162 !(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;
17163 !(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;
17164 }
17165 }
17166 var snapshot = instance.getSnapshotBeforeUpdate(finishedWork.elementType === finishedWork.type ? prevProps : resolveDefaultProps(finishedWork.type, prevProps), prevState);
17167 {
17168 var didWarnSet = didWarnAboutUndefinedSnapshotBeforeUpdate;
17169 if (snapshot === undefined && !didWarnSet.has(finishedWork.type)) {
17170 didWarnSet.add(finishedWork.type);
17171 warningWithoutStack$1(false, '%s.getSnapshotBeforeUpdate(): A snapshot value (or null) ' + 'must be returned. You have returned undefined.', getComponentName(finishedWork.type));
17172 }
17173 }
17174 instance.__reactInternalSnapshotBeforeUpdate = snapshot;
17175 stopPhaseTimer();
17176 }
17177 }
17178 return;
17179 }
17180 case HostRoot:
17181 case HostComponent:
17182 case HostText:
17183 case HostPortal:
17184 case IncompleteClassComponent:
17185 // Nothing to do for these component types
17186 return;
17187 default:
17188 {
17189 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.');
17190 }
17191 }
17192}
17193
17194function commitHookEffectList(unmountTag, mountTag, finishedWork) {
17195 var updateQueue = finishedWork.updateQueue;
17196 var lastEffect = updateQueue !== null ? updateQueue.lastEffect : null;
17197 if (lastEffect !== null) {
17198 var firstEffect = lastEffect.next;
17199 var effect = firstEffect;
17200 do {
17201 if ((effect.tag & unmountTag) !== NoEffect$1) {
17202 // Unmount
17203 var destroy = effect.destroy;
17204 effect.destroy = undefined;
17205 if (destroy !== undefined) {
17206 destroy();
17207 }
17208 }
17209 if ((effect.tag & mountTag) !== NoEffect$1) {
17210 // Mount
17211 var create = effect.create;
17212 effect.destroy = create();
17213
17214 {
17215 var _destroy = effect.destroy;
17216 if (_destroy !== undefined && typeof _destroy !== 'function') {
17217 var addendum = void 0;
17218 if (_destroy === null) {
17219 addendum = ' You returned null. If your effect does not require clean ' + 'up, return undefined (or nothing).';
17220 } else if (typeof _destroy.then === 'function') {
17221 addendum = '\n\nIt looks like you wrote useEffect(async () => ...) or returned a Promise. ' + 'Instead, you may write an async function separately ' + 'and then call it from inside the effect:\n\n' + 'async function fetchComment(commentId) {\n' + ' // You can await here\n' + '}\n\n' + 'useEffect(() => {\n' + ' fetchComment(commentId);\n' + '}, [commentId]);\n\n' + 'In the future, React will provide a more idiomatic solution for data fetching ' + "that doesn't involve writing effects manually.";
17222 } else {
17223 addendum = ' You returned: ' + _destroy;
17224 }
17225 warningWithoutStack$1(false, 'An Effect function must not return anything besides a function, ' + 'which is used for clean-up.%s%s', addendum, getStackByFiberInDevAndProd(finishedWork));
17226 }
17227 }
17228 }
17229 effect = effect.next;
17230 } while (effect !== firstEffect);
17231 }
17232}
17233
17234function commitPassiveHookEffects(finishedWork) {
17235 commitHookEffectList(UnmountPassive, NoEffect$1, finishedWork);
17236 commitHookEffectList(NoEffect$1, MountPassive, finishedWork);
17237}
17238
17239function commitLifeCycles(finishedRoot, current$$1, finishedWork, committedExpirationTime) {
17240 switch (finishedWork.tag) {
17241 case FunctionComponent:
17242 case ForwardRef:
17243 case SimpleMemoComponent:
17244 {
17245 commitHookEffectList(UnmountLayout, MountLayout, finishedWork);
17246 break;
17247 }
17248 case ClassComponent:
17249 {
17250 var instance = finishedWork.stateNode;
17251 if (finishedWork.effectTag & Update) {
17252 if (current$$1 === null) {
17253 startPhaseTimer(finishedWork, 'componentDidMount');
17254 // We could update instance props and state here,
17255 // but instead we rely on them being set during last render.
17256 // TODO: revisit this when we implement resuming.
17257 {
17258 if (finishedWork.type === finishedWork.elementType && !didWarnAboutReassigningProps) {
17259 !(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;
17260 !(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;
17261 }
17262 }
17263 instance.componentDidMount();
17264 stopPhaseTimer();
17265 } else {
17266 var prevProps = finishedWork.elementType === finishedWork.type ? current$$1.memoizedProps : resolveDefaultProps(finishedWork.type, current$$1.memoizedProps);
17267 var prevState = current$$1.memoizedState;
17268 startPhaseTimer(finishedWork, 'componentDidUpdate');
17269 // We could update instance props and state here,
17270 // but instead we rely on them being set during last render.
17271 // TODO: revisit this when we implement resuming.
17272 {
17273 if (finishedWork.type === finishedWork.elementType && !didWarnAboutReassigningProps) {
17274 !(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;
17275 !(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;
17276 }
17277 }
17278 instance.componentDidUpdate(prevProps, prevState, instance.__reactInternalSnapshotBeforeUpdate);
17279 stopPhaseTimer();
17280 }
17281 }
17282 var updateQueue = finishedWork.updateQueue;
17283 if (updateQueue !== null) {
17284 {
17285 if (finishedWork.type === finishedWork.elementType && !didWarnAboutReassigningProps) {
17286 !(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;
17287 !(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;
17288 }
17289 }
17290 // We could update instance props and state here,
17291 // but instead we rely on them being set during last render.
17292 // TODO: revisit this when we implement resuming.
17293 commitUpdateQueue(finishedWork, updateQueue, instance, committedExpirationTime);
17294 }
17295 return;
17296 }
17297 case HostRoot:
17298 {
17299 var _updateQueue = finishedWork.updateQueue;
17300 if (_updateQueue !== null) {
17301 var _instance = null;
17302 if (finishedWork.child !== null) {
17303 switch (finishedWork.child.tag) {
17304 case HostComponent:
17305 _instance = getPublicInstance(finishedWork.child.stateNode);
17306 break;
17307 case ClassComponent:
17308 _instance = finishedWork.child.stateNode;
17309 break;
17310 }
17311 }
17312 commitUpdateQueue(finishedWork, _updateQueue, _instance, committedExpirationTime);
17313 }
17314 return;
17315 }
17316 case HostComponent:
17317 {
17318 var _instance2 = finishedWork.stateNode;
17319
17320 // Renderers may schedule work to be done after host components are mounted
17321 // (eg DOM renderer may schedule auto-focus for inputs and form controls).
17322 // These effects should only be committed when components are first mounted,
17323 // aka when there is no current/alternate.
17324 if (current$$1 === null && finishedWork.effectTag & Update) {
17325 var type = finishedWork.type;
17326 var props = finishedWork.memoizedProps;
17327 commitMount(_instance2, type, props, finishedWork);
17328 }
17329
17330 return;
17331 }
17332 case HostText:
17333 {
17334 // We have no life-cycles associated with text.
17335 return;
17336 }
17337 case HostPortal:
17338 {
17339 // We have no life-cycles associated with portals.
17340 return;
17341 }
17342 case Profiler:
17343 {
17344 if (enableProfilerTimer) {
17345 var onRender = finishedWork.memoizedProps.onRender;
17346
17347 if (enableSchedulerTracing) {
17348 onRender(finishedWork.memoizedProps.id, current$$1 === null ? 'mount' : 'update', finishedWork.actualDuration, finishedWork.treeBaseDuration, finishedWork.actualStartTime, getCommitTime(), finishedRoot.memoizedInteractions);
17349 } else {
17350 onRender(finishedWork.memoizedProps.id, current$$1 === null ? 'mount' : 'update', finishedWork.actualDuration, finishedWork.treeBaseDuration, finishedWork.actualStartTime, getCommitTime());
17351 }
17352 }
17353 return;
17354 }
17355 case SuspenseComponent:
17356 break;
17357 case IncompleteClassComponent:
17358 break;
17359 default:
17360 {
17361 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.');
17362 }
17363 }
17364}
17365
17366function hideOrUnhideAllChildren(finishedWork, isHidden) {
17367 if (supportsMutation) {
17368 // We only have the top Fiber that was inserted but we need to recurse down its
17369 var node = finishedWork;
17370 while (true) {
17371 if (node.tag === HostComponent) {
17372 var instance = node.stateNode;
17373 if (isHidden) {
17374 hideInstance(instance);
17375 } else {
17376 unhideInstance(node.stateNode, node.memoizedProps);
17377 }
17378 } else if (node.tag === HostText) {
17379 var _instance3 = node.stateNode;
17380 if (isHidden) {
17381 hideTextInstance(_instance3);
17382 } else {
17383 unhideTextInstance(_instance3, node.memoizedProps);
17384 }
17385 } else if (node.tag === SuspenseComponent && node.memoizedState !== null) {
17386 // Found a nested Suspense component that timed out. Skip over the
17387 var fallbackChildFragment = node.child.sibling;
17388 fallbackChildFragment.return = node;
17389 node = fallbackChildFragment;
17390 continue;
17391 } else if (node.child !== null) {
17392 node.child.return = node;
17393 node = node.child;
17394 continue;
17395 }
17396 if (node === finishedWork) {
17397 return;
17398 }
17399 while (node.sibling === null) {
17400 if (node.return === null || node.return === finishedWork) {
17401 return;
17402 }
17403 node = node.return;
17404 }
17405 node.sibling.return = node.return;
17406 node = node.sibling;
17407 }
17408 }
17409}
17410
17411function commitAttachRef(finishedWork) {
17412 var ref = finishedWork.ref;
17413 if (ref !== null) {
17414 var instance = finishedWork.stateNode;
17415 var instanceToUse = void 0;
17416 switch (finishedWork.tag) {
17417 case HostComponent:
17418 instanceToUse = getPublicInstance(instance);
17419 break;
17420 default:
17421 instanceToUse = instance;
17422 }
17423 if (typeof ref === 'function') {
17424 ref(instanceToUse);
17425 } else {
17426 {
17427 if (!ref.hasOwnProperty('current')) {
17428 warningWithoutStack$1(false, 'Unexpected ref object provided for %s. ' + 'Use either a ref-setter function or React.createRef().%s', getComponentName(finishedWork.type), getStackByFiberInDevAndProd(finishedWork));
17429 }
17430 }
17431
17432 ref.current = instanceToUse;
17433 }
17434 }
17435}
17436
17437function commitDetachRef(current$$1) {
17438 var currentRef = current$$1.ref;
17439 if (currentRef !== null) {
17440 if (typeof currentRef === 'function') {
17441 currentRef(null);
17442 } else {
17443 currentRef.current = null;
17444 }
17445 }
17446}
17447
17448// User-originating errors (lifecycles and refs) should not interrupt
17449// deletion, so don't let them throw. Host-originating errors should
17450// interrupt deletion, so it's okay
17451function commitUnmount(current$$1) {
17452 onCommitUnmount(current$$1);
17453
17454 switch (current$$1.tag) {
17455 case FunctionComponent:
17456 case ForwardRef:
17457 case MemoComponent:
17458 case SimpleMemoComponent:
17459 {
17460 var updateQueue = current$$1.updateQueue;
17461 if (updateQueue !== null) {
17462 var lastEffect = updateQueue.lastEffect;
17463 if (lastEffect !== null) {
17464 var firstEffect = lastEffect.next;
17465 var effect = firstEffect;
17466 do {
17467 var destroy = effect.destroy;
17468 if (destroy !== undefined) {
17469 safelyCallDestroy(current$$1, destroy);
17470 }
17471 effect = effect.next;
17472 } while (effect !== firstEffect);
17473 }
17474 }
17475 break;
17476 }
17477 case ClassComponent:
17478 {
17479 safelyDetachRef(current$$1);
17480 var instance = current$$1.stateNode;
17481 if (typeof instance.componentWillUnmount === 'function') {
17482 safelyCallComponentWillUnmount(current$$1, instance);
17483 }
17484 return;
17485 }
17486 case HostComponent:
17487 {
17488 safelyDetachRef(current$$1);
17489 return;
17490 }
17491 case HostPortal:
17492 {
17493 // TODO: this is recursive.
17494 // We are also not using this parent because
17495 // the portal will get pushed immediately.
17496 if (supportsMutation) {
17497 unmountHostComponents(current$$1);
17498 } else if (supportsPersistence) {
17499 emptyPortalContainer(current$$1);
17500 }
17501 return;
17502 }
17503 }
17504}
17505
17506function commitNestedUnmounts(root) {
17507 // While we're inside a removed host node we don't want to call
17508 // removeChild on the inner nodes because they're removed by the top
17509 // call anyway. We also want to call componentWillUnmount on all
17510 // composites before this host node is removed from the tree. Therefore
17511 var node = root;
17512 while (true) {
17513 commitUnmount(node);
17514 // Visit children because they may contain more composite or host nodes.
17515 // Skip portals because commitUnmount() currently visits them recursively.
17516 if (node.child !== null && (
17517 // If we use mutation we drill down into portals using commitUnmount above.
17518 // If we don't use mutation we drill down into portals here instead.
17519 !supportsMutation || node.tag !== HostPortal)) {
17520 node.child.return = node;
17521 node = node.child;
17522 continue;
17523 }
17524 if (node === root) {
17525 return;
17526 }
17527 while (node.sibling === null) {
17528 if (node.return === null || node.return === root) {
17529 return;
17530 }
17531 node = node.return;
17532 }
17533 node.sibling.return = node.return;
17534 node = node.sibling;
17535 }
17536}
17537
17538function detachFiber(current$$1) {
17539 // Cut off the return pointers to disconnect it from the tree. Ideally, we
17540 // should clear the child pointer of the parent alternate to let this
17541 // get GC:ed but we don't know which for sure which parent is the current
17542 // one so we'll settle for GC:ing the subtree of this child. This child
17543 // itself will be GC:ed when the parent updates the next time.
17544 current$$1.return = null;
17545 current$$1.child = null;
17546 current$$1.memoizedState = null;
17547 current$$1.updateQueue = null;
17548 var alternate = current$$1.alternate;
17549 if (alternate !== null) {
17550 alternate.return = null;
17551 alternate.child = null;
17552 alternate.memoizedState = null;
17553 alternate.updateQueue = null;
17554 }
17555}
17556
17557function emptyPortalContainer(current$$1) {
17558 if (!supportsPersistence) {
17559 return;
17560 }
17561
17562 var portal = current$$1.stateNode;
17563 var containerInfo = portal.containerInfo;
17564
17565 var emptyChildSet = createContainerChildSet(containerInfo);
17566 replaceContainerChildren(containerInfo, emptyChildSet);
17567}
17568
17569function commitContainer(finishedWork) {
17570 if (!supportsPersistence) {
17571 return;
17572 }
17573
17574 switch (finishedWork.tag) {
17575 case ClassComponent:
17576 {
17577 return;
17578 }
17579 case HostComponent:
17580 {
17581 return;
17582 }
17583 case HostText:
17584 {
17585 return;
17586 }
17587 case HostRoot:
17588 case HostPortal:
17589 {
17590 var portalOrRoot = finishedWork.stateNode;
17591 var containerInfo = portalOrRoot.containerInfo,
17592 _pendingChildren = portalOrRoot.pendingChildren;
17593
17594 replaceContainerChildren(containerInfo, _pendingChildren);
17595 return;
17596 }
17597 default:
17598 {
17599 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.');
17600 }
17601 }
17602}
17603
17604function getHostParentFiber(fiber) {
17605 var parent = fiber.return;
17606 while (parent !== null) {
17607 if (isHostParent(parent)) {
17608 return parent;
17609 }
17610 parent = parent.return;
17611 }
17612 invariant(false, 'Expected to find a host parent. This error is likely caused by a bug in React. Please file an issue.');
17613}
17614
17615function isHostParent(fiber) {
17616 return fiber.tag === HostComponent || fiber.tag === HostRoot || fiber.tag === HostPortal;
17617}
17618
17619function getHostSibling(fiber) {
17620 // We're going to search forward into the tree until we find a sibling host
17621 // node. Unfortunately, if multiple insertions are done in a row we have to
17622 // search past them. This leads to exponential search for the next sibling.
17623 var node = fiber;
17624 siblings: while (true) {
17625 // If we didn't find anything, let's try the next sibling.
17626 while (node.sibling === null) {
17627 if (node.return === null || isHostParent(node.return)) {
17628 // If we pop out of the root or hit the parent the fiber we are the
17629 // last sibling.
17630 return null;
17631 }
17632 node = node.return;
17633 }
17634 node.sibling.return = node.return;
17635 node = node.sibling;
17636 while (node.tag !== HostComponent && node.tag !== HostText && node.tag !== DehydratedSuspenseComponent) {
17637 // If it is not host node and, we might have a host node inside it.
17638 // Try to search down until we find one.
17639 if (node.effectTag & Placement) {
17640 // If we don't have a child, try the siblings instead.
17641 continue siblings;
17642 }
17643 // If we don't have a child, try the siblings instead.
17644 // We also skip portals because they are not part of this host tree.
17645 if (node.child === null || node.tag === HostPortal) {
17646 continue siblings;
17647 } else {
17648 node.child.return = node;
17649 node = node.child;
17650 }
17651 }
17652 // Check if this host node is stable or about to be placed.
17653 if (!(node.effectTag & Placement)) {
17654 // Found it!
17655 return node.stateNode;
17656 }
17657 }
17658}
17659
17660function commitPlacement(finishedWork) {
17661 if (!supportsMutation) {
17662 return;
17663 }
17664
17665 // Recursively insert all host nodes into the parent.
17666 var parentFiber = getHostParentFiber(finishedWork);
17667
17668 // Note: these two variables *must* always be updated together.
17669 var parent = void 0;
17670 var isContainer = void 0;
17671
17672 switch (parentFiber.tag) {
17673 case HostComponent:
17674 parent = parentFiber.stateNode;
17675 isContainer = false;
17676 break;
17677 case HostRoot:
17678 parent = parentFiber.stateNode.containerInfo;
17679 isContainer = true;
17680 break;
17681 case HostPortal:
17682 parent = parentFiber.stateNode.containerInfo;
17683 isContainer = true;
17684 break;
17685 default:
17686 invariant(false, 'Invalid host parent fiber. This error is likely caused by a bug in React. Please file an issue.');
17687 }
17688 if (parentFiber.effectTag & ContentReset) {
17689 // Reset the text content of the parent before doing any insertions
17690 resetTextContent(parent);
17691 // Clear ContentReset from the effect tag
17692 parentFiber.effectTag &= ~ContentReset;
17693 }
17694
17695 var before = getHostSibling(finishedWork);
17696 // We only have the top Fiber that was inserted but we need to recurse down its
17697 // children to find all the terminal nodes.
17698 var node = finishedWork;
17699 while (true) {
17700 if (node.tag === HostComponent || node.tag === HostText) {
17701 if (before) {
17702 if (isContainer) {
17703 insertInContainerBefore(parent, node.stateNode, before);
17704 } else {
17705 insertBefore(parent, node.stateNode, before);
17706 }
17707 } else {
17708 if (isContainer) {
17709 appendChildToContainer(parent, node.stateNode);
17710 } else {
17711 appendChild(parent, node.stateNode);
17712 }
17713 }
17714 } else if (node.tag === HostPortal) {
17715 // If the insertion itself is a portal, then we don't want to traverse
17716 // down its children. Instead, we'll get insertions from each child in
17717 // the portal directly.
17718 } else if (node.child !== null) {
17719 node.child.return = node;
17720 node = node.child;
17721 continue;
17722 }
17723 if (node === finishedWork) {
17724 return;
17725 }
17726 while (node.sibling === null) {
17727 if (node.return === null || node.return === finishedWork) {
17728 return;
17729 }
17730 node = node.return;
17731 }
17732 node.sibling.return = node.return;
17733 node = node.sibling;
17734 }
17735}
17736
17737function unmountHostComponents(current$$1) {
17738 // We only have the top Fiber that was deleted but we need to recurse down its
17739 var node = current$$1;
17740
17741 // Each iteration, currentParent is populated with node's host parent if not
17742 // currentParentIsValid.
17743 var currentParentIsValid = false;
17744
17745 // Note: these two variables *must* always be updated together.
17746 var currentParent = void 0;
17747 var currentParentIsContainer = void 0;
17748
17749 while (true) {
17750 if (!currentParentIsValid) {
17751 var parent = node.return;
17752 findParent: while (true) {
17753 !(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;
17754 switch (parent.tag) {
17755 case HostComponent:
17756 currentParent = parent.stateNode;
17757 currentParentIsContainer = false;
17758 break findParent;
17759 case HostRoot:
17760 currentParent = parent.stateNode.containerInfo;
17761 currentParentIsContainer = true;
17762 break findParent;
17763 case HostPortal:
17764 currentParent = parent.stateNode.containerInfo;
17765 currentParentIsContainer = true;
17766 break findParent;
17767 }
17768 parent = parent.return;
17769 }
17770 currentParentIsValid = true;
17771 }
17772
17773 if (node.tag === HostComponent || node.tag === HostText) {
17774 commitNestedUnmounts(node);
17775 // After all the children have unmounted, it is now safe to remove the
17776 // node from the tree.
17777 if (currentParentIsContainer) {
17778 removeChildFromContainer(currentParent, node.stateNode);
17779 } else {
17780 removeChild(currentParent, node.stateNode);
17781 }
17782 // Don't visit children because we already visited them.
17783 } else if (enableSuspenseServerRenderer && node.tag === DehydratedSuspenseComponent) {
17784 // Delete the dehydrated suspense boundary and all of its content.
17785 if (currentParentIsContainer) {
17786 clearSuspenseBoundaryFromContainer(currentParent, node.stateNode);
17787 } else {
17788 clearSuspenseBoundary(currentParent, node.stateNode);
17789 }
17790 } else if (node.tag === HostPortal) {
17791 if (node.child !== null) {
17792 // When we go into a portal, it becomes the parent to remove from.
17793 // We will reassign it back when we pop the portal on the way up.
17794 currentParent = node.stateNode.containerInfo;
17795 currentParentIsContainer = true;
17796 // Visit children because portals might contain host components.
17797 node.child.return = node;
17798 node = node.child;
17799 continue;
17800 }
17801 } else {
17802 commitUnmount(node);
17803 // Visit children because we may find more host components below.
17804 if (node.child !== null) {
17805 node.child.return = node;
17806 node = node.child;
17807 continue;
17808 }
17809 }
17810 if (node === current$$1) {
17811 return;
17812 }
17813 while (node.sibling === null) {
17814 if (node.return === null || node.return === current$$1) {
17815 return;
17816 }
17817 node = node.return;
17818 if (node.tag === HostPortal) {
17819 // When we go out of the portal, we need to restore the parent.
17820 // Since we don't keep a stack of them, we will search for it.
17821 currentParentIsValid = false;
17822 }
17823 }
17824 node.sibling.return = node.return;
17825 node = node.sibling;
17826 }
17827}
17828
17829function commitDeletion(current$$1) {
17830 if (supportsMutation) {
17831 // Recursively delete all host nodes from the parent.
17832 // Detach refs and call componentWillUnmount() on the whole subtree.
17833 unmountHostComponents(current$$1);
17834 } else {
17835 // Detach refs and call componentWillUnmount() on the whole subtree.
17836 commitNestedUnmounts(current$$1);
17837 }
17838 detachFiber(current$$1);
17839}
17840
17841function commitWork(current$$1, finishedWork) {
17842 if (!supportsMutation) {
17843 switch (finishedWork.tag) {
17844 case FunctionComponent:
17845 case ForwardRef:
17846 case MemoComponent:
17847 case SimpleMemoComponent:
17848 {
17849 // Note: We currently never use MountMutation, but useLayout uses
17850 // UnmountMutation.
17851 commitHookEffectList(UnmountMutation, MountMutation, finishedWork);
17852 return;
17853 }
17854 }
17855
17856 commitContainer(finishedWork);
17857 return;
17858 }
17859
17860 switch (finishedWork.tag) {
17861 case FunctionComponent:
17862 case ForwardRef:
17863 case MemoComponent:
17864 case SimpleMemoComponent:
17865 {
17866 // Note: We currently never use MountMutation, but useLayout uses
17867 // UnmountMutation.
17868 commitHookEffectList(UnmountMutation, MountMutation, finishedWork);
17869 return;
17870 }
17871 case ClassComponent:
17872 {
17873 return;
17874 }
17875 case HostComponent:
17876 {
17877 var instance = finishedWork.stateNode;
17878 if (instance != null) {
17879 // Commit the work prepared earlier.
17880 var newProps = finishedWork.memoizedProps;
17881 // For hydration we reuse the update path but we treat the oldProps
17882 // as the newProps. The updatePayload will contain the real change in
17883 // this case.
17884 var oldProps = current$$1 !== null ? current$$1.memoizedProps : newProps;
17885 var type = finishedWork.type;
17886 // TODO: Type the updateQueue to be specific to host components.
17887 var updatePayload = finishedWork.updateQueue;
17888 finishedWork.updateQueue = null;
17889 if (updatePayload !== null) {
17890 commitUpdate(instance, updatePayload, type, oldProps, newProps, finishedWork);
17891 }
17892 }
17893 return;
17894 }
17895 case HostText:
17896 {
17897 !(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;
17898 var textInstance = finishedWork.stateNode;
17899 var newText = finishedWork.memoizedProps;
17900 // For hydration we reuse the update path but we treat the oldProps
17901 // as the newProps. The updatePayload will contain the real change in
17902 // this case.
17903 var oldText = current$$1 !== null ? current$$1.memoizedProps : newText;
17904 commitTextUpdate(textInstance, oldText, newText);
17905 return;
17906 }
17907 case HostRoot:
17908 {
17909 return;
17910 }
17911 case Profiler:
17912 {
17913 return;
17914 }
17915 case SuspenseComponent:
17916 {
17917 var newState = finishedWork.memoizedState;
17918
17919 var newDidTimeout = void 0;
17920 var primaryChildParent = finishedWork;
17921 if (newState === null) {
17922 newDidTimeout = false;
17923 } else {
17924 newDidTimeout = true;
17925 primaryChildParent = finishedWork.child;
17926 if (newState.timedOutAt === NoWork) {
17927 // If the children had not already timed out, record the time.
17928 // This is used to compute the elapsed time during subsequent
17929 // attempts to render the children.
17930 newState.timedOutAt = requestCurrentTime();
17931 }
17932 }
17933
17934 if (primaryChildParent !== null) {
17935 hideOrUnhideAllChildren(primaryChildParent, newDidTimeout);
17936 }
17937
17938 // If this boundary just timed out, then it will have a set of thenables.
17939 // For each thenable, attach a listener so that when it resolves, React
17940 // attempts to re-render the boundary in the primary (pre-timeout) state.
17941 var thenables = finishedWork.updateQueue;
17942 if (thenables !== null) {
17943 finishedWork.updateQueue = null;
17944 var retryCache = finishedWork.stateNode;
17945 if (retryCache === null) {
17946 retryCache = finishedWork.stateNode = new PossiblyWeakSet$1();
17947 }
17948 thenables.forEach(function (thenable) {
17949 // Memoize using the boundary fiber to prevent redundant listeners.
17950 var retry = retryTimedOutBoundary.bind(null, finishedWork, thenable);
17951 if (enableSchedulerTracing) {
17952 retry = unstable_wrap(retry);
17953 }
17954 if (!retryCache.has(thenable)) {
17955 retryCache.add(thenable);
17956 thenable.then(retry, retry);
17957 }
17958 });
17959 }
17960
17961 return;
17962 }
17963 case IncompleteClassComponent:
17964 {
17965 return;
17966 }
17967 default:
17968 {
17969 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.');
17970 }
17971 }
17972}
17973
17974function commitResetTextContent(current$$1) {
17975 if (!supportsMutation) {
17976 return;
17977 }
17978 resetTextContent(current$$1.stateNode);
17979}
17980
17981var PossiblyWeakSet = typeof WeakSet === 'function' ? WeakSet : Set;
17982var PossiblyWeakMap = typeof WeakMap === 'function' ? WeakMap : Map;
17983
17984function createRootErrorUpdate(fiber, errorInfo, expirationTime) {
17985 var update = createUpdate(expirationTime);
17986 // Unmount the root by rendering null.
17987 update.tag = CaptureUpdate;
17988 // Caution: React DevTools currently depends on this property
17989 // being called "element".
17990 update.payload = { element: null };
17991 var error = errorInfo.value;
17992 update.callback = function () {
17993 onUncaughtError(error);
17994 logError(fiber, errorInfo);
17995 };
17996 return update;
17997}
17998
17999function createClassErrorUpdate(fiber, errorInfo, expirationTime) {
18000 var update = createUpdate(expirationTime);
18001 update.tag = CaptureUpdate;
18002 var getDerivedStateFromError = fiber.type.getDerivedStateFromError;
18003 if (typeof getDerivedStateFromError === 'function') {
18004 var error = errorInfo.value;
18005 update.payload = function () {
18006 return getDerivedStateFromError(error);
18007 };
18008 }
18009
18010 var inst = fiber.stateNode;
18011 if (inst !== null && typeof inst.componentDidCatch === 'function') {
18012 update.callback = function callback() {
18013 if (typeof getDerivedStateFromError !== 'function') {
18014 // To preserve the preexisting retry behavior of error boundaries,
18015 // we keep track of which ones already failed during this batch.
18016 // This gets reset before we yield back to the browser.
18017 // TODO: Warn in strict mode if getDerivedStateFromError is
18018 // not defined.
18019 markLegacyErrorBoundaryAsFailed(this);
18020 }
18021 var error = errorInfo.value;
18022 var stack = errorInfo.stack;
18023 logError(fiber, errorInfo);
18024 this.componentDidCatch(error, {
18025 componentStack: stack !== null ? stack : ''
18026 });
18027 {
18028 if (typeof getDerivedStateFromError !== 'function') {
18029 // If componentDidCatch is the only error boundary method defined,
18030 // then it needs to call setState to recover from errors.
18031 // If no state update is scheduled then the boundary will swallow the error.
18032 !(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;
18033 }
18034 }
18035 };
18036 }
18037 return update;
18038}
18039
18040function attachPingListener(root, renderExpirationTime, thenable) {
18041 // Attach a listener to the promise to "ping" the root and retry. But
18042 // only if one does not already exist for the current render expiration
18043 // time (which acts like a "thread ID" here).
18044 var pingCache = root.pingCache;
18045 var threadIDs = void 0;
18046 if (pingCache === null) {
18047 pingCache = root.pingCache = new PossiblyWeakMap();
18048 threadIDs = new Set();
18049 pingCache.set(thenable, threadIDs);
18050 } else {
18051 threadIDs = pingCache.get(thenable);
18052 if (threadIDs === undefined) {
18053 threadIDs = new Set();
18054 pingCache.set(thenable, threadIDs);
18055 }
18056 }
18057 if (!threadIDs.has(renderExpirationTime)) {
18058 // Memoize using the thread ID to prevent redundant listeners.
18059 threadIDs.add(renderExpirationTime);
18060 var ping = pingSuspendedRoot.bind(null, root, thenable, renderExpirationTime);
18061 if (enableSchedulerTracing) {
18062 ping = unstable_wrap(ping);
18063 }
18064 thenable.then(ping, ping);
18065 }
18066}
18067
18068function throwException(root, returnFiber, sourceFiber, value, renderExpirationTime) {
18069 // The source fiber did not complete.
18070 sourceFiber.effectTag |= Incomplete;
18071 // Its effect list is no longer valid.
18072 sourceFiber.firstEffect = sourceFiber.lastEffect = null;
18073
18074 if (value !== null && typeof value === 'object' && typeof value.then === 'function') {
18075 // This is a thenable.
18076 var thenable = value;
18077
18078 // Find the earliest timeout threshold of all the placeholders in the
18079 // ancestor path. We could avoid this traversal by storing the thresholds on
18080 // the stack, but we choose not to because we only hit this path if we're
18081 // IO-bound (i.e. if something suspends). Whereas the stack is used even in
18082 // the non-IO- bound case.
18083 var _workInProgress = returnFiber;
18084 var earliestTimeoutMs = -1;
18085 var startTimeMs = -1;
18086 do {
18087 if (_workInProgress.tag === SuspenseComponent) {
18088 var current$$1 = _workInProgress.alternate;
18089 if (current$$1 !== null) {
18090 var currentState = current$$1.memoizedState;
18091 if (currentState !== null) {
18092 // Reached a boundary that already timed out. Do not search
18093 // any further.
18094 var timedOutAt = currentState.timedOutAt;
18095 startTimeMs = expirationTimeToMs(timedOutAt);
18096 // Do not search any further.
18097 break;
18098 }
18099 }
18100 var timeoutPropMs = _workInProgress.pendingProps.maxDuration;
18101 if (typeof timeoutPropMs === 'number') {
18102 if (timeoutPropMs <= 0) {
18103 earliestTimeoutMs = 0;
18104 } else if (earliestTimeoutMs === -1 || timeoutPropMs < earliestTimeoutMs) {
18105 earliestTimeoutMs = timeoutPropMs;
18106 }
18107 }
18108 }
18109 // If there is a DehydratedSuspenseComponent we don't have to do anything because
18110 // if something suspends inside it, we will simply leave that as dehydrated. It
18111 // will never timeout.
18112 _workInProgress = _workInProgress.return;
18113 } while (_workInProgress !== null);
18114
18115 // Schedule the nearest Suspense to re-render the timed out view.
18116 _workInProgress = returnFiber;
18117 do {
18118 if (_workInProgress.tag === SuspenseComponent && shouldCaptureSuspense(_workInProgress)) {
18119 // Found the nearest boundary.
18120
18121 // Stash the promise on the boundary fiber. If the boundary times out, we'll
18122 var thenables = _workInProgress.updateQueue;
18123 if (thenables === null) {
18124 var updateQueue = new Set();
18125 updateQueue.add(thenable);
18126 _workInProgress.updateQueue = updateQueue;
18127 } else {
18128 thenables.add(thenable);
18129 }
18130
18131 // If the boundary is outside of concurrent mode, we should *not*
18132 // suspend the commit. Pretend as if the suspended component rendered
18133 // null and keep rendering. In the commit phase, we'll schedule a
18134 // subsequent synchronous update to re-render the Suspense.
18135 //
18136 // Note: It doesn't matter whether the component that suspended was
18137 // inside a concurrent mode tree. If the Suspense is outside of it, we
18138 // should *not* suspend the commit.
18139 if ((_workInProgress.mode & ConcurrentMode) === NoEffect) {
18140 _workInProgress.effectTag |= DidCapture;
18141
18142 // We're going to commit this fiber even though it didn't complete.
18143 // But we shouldn't call any lifecycle methods or callbacks. Remove
18144 // all lifecycle effect tags.
18145 sourceFiber.effectTag &= ~(LifecycleEffectMask | Incomplete);
18146
18147 if (sourceFiber.tag === ClassComponent) {
18148 var currentSourceFiber = sourceFiber.alternate;
18149 if (currentSourceFiber === null) {
18150 // This is a new mount. Change the tag so it's not mistaken for a
18151 // completed class component. For example, we should not call
18152 // componentWillUnmount if it is deleted.
18153 sourceFiber.tag = IncompleteClassComponent;
18154 } else {
18155 // When we try rendering again, we should not reuse the current fiber,
18156 // since it's known to be in an inconsistent state. Use a force updte to
18157 // prevent a bail out.
18158 var update = createUpdate(Sync);
18159 update.tag = ForceUpdate;
18160 enqueueUpdate(sourceFiber, update);
18161 }
18162 }
18163
18164 // The source fiber did not complete. Mark it with Sync priority to
18165 // indicate that it still has pending work.
18166 sourceFiber.expirationTime = Sync;
18167
18168 // Exit without suspending.
18169 return;
18170 }
18171
18172 // Confirmed that the boundary is in a concurrent mode tree. Continue
18173 // with the normal suspend path.
18174
18175 attachPingListener(root, renderExpirationTime, thenable);
18176
18177 var absoluteTimeoutMs = void 0;
18178 if (earliestTimeoutMs === -1) {
18179 // If no explicit threshold is given, default to an arbitrarily large
18180 // value. The actual size doesn't matter because the threshold for the
18181 // whole tree will be clamped to the expiration time.
18182 absoluteTimeoutMs = maxSigned31BitInt;
18183 } else {
18184 if (startTimeMs === -1) {
18185 // This suspend happened outside of any already timed-out
18186 // placeholders. We don't know exactly when the update was
18187 // scheduled, but we can infer an approximate start time from the
18188 // expiration time. First, find the earliest uncommitted expiration
18189 // time in the tree, including work that is suspended. Then subtract
18190 // the offset used to compute an async update's expiration time.
18191 // This will cause high priority (interactive) work to expire
18192 // earlier than necessary, but we can account for this by adjusting
18193 // for the Just Noticeable Difference.
18194 var earliestExpirationTime = findEarliestOutstandingPriorityLevel(root, renderExpirationTime);
18195 var earliestExpirationTimeMs = expirationTimeToMs(earliestExpirationTime);
18196 startTimeMs = earliestExpirationTimeMs - LOW_PRIORITY_EXPIRATION;
18197 }
18198 absoluteTimeoutMs = startTimeMs + earliestTimeoutMs;
18199 }
18200
18201 // Mark the earliest timeout in the suspended fiber's ancestor path.
18202 // After completing the root, we'll take the largest of all the
18203 // suspended fiber's timeouts and use it to compute a timeout for the
18204 // whole tree.
18205 renderDidSuspend(root, absoluteTimeoutMs, renderExpirationTime);
18206
18207 _workInProgress.effectTag |= ShouldCapture;
18208 _workInProgress.expirationTime = renderExpirationTime;
18209 return;
18210 } else if (enableSuspenseServerRenderer && _workInProgress.tag === DehydratedSuspenseComponent) {
18211 attachPingListener(root, renderExpirationTime, thenable);
18212
18213 // Since we already have a current fiber, we can eagerly add a retry listener.
18214 var retryCache = _workInProgress.memoizedState;
18215 if (retryCache === null) {
18216 retryCache = _workInProgress.memoizedState = new PossiblyWeakSet();
18217 var _current = _workInProgress.alternate;
18218 !_current ? invariant(false, 'A dehydrated suspense boundary must commit before trying to render. This is probably a bug in React.') : void 0;
18219 _current.memoizedState = retryCache;
18220 }
18221 // Memoize using the boundary fiber to prevent redundant listeners.
18222 if (!retryCache.has(thenable)) {
18223 retryCache.add(thenable);
18224 var retry = retryTimedOutBoundary.bind(null, _workInProgress, thenable);
18225 if (enableSchedulerTracing) {
18226 retry = unstable_wrap(retry);
18227 }
18228 thenable.then(retry, retry);
18229 }
18230 _workInProgress.effectTag |= ShouldCapture;
18231 _workInProgress.expirationTime = renderExpirationTime;
18232 return;
18233 }
18234 // This boundary already captured during this render. Continue to the next
18235 // boundary.
18236 _workInProgress = _workInProgress.return;
18237 } while (_workInProgress !== null);
18238 // No boundary was found. Fallthrough to error mode.
18239 // TODO: Use invariant so the message is stripped in prod?
18240 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));
18241 }
18242
18243 // We didn't find a boundary that could handle this type of exception. Start
18244 // over and traverse parent path again, this time treating the exception
18245 // as an error.
18246 renderDidError();
18247 value = createCapturedValue(value, sourceFiber);
18248 var workInProgress = returnFiber;
18249 do {
18250 switch (workInProgress.tag) {
18251 case HostRoot:
18252 {
18253 var _errorInfo = value;
18254 workInProgress.effectTag |= ShouldCapture;
18255 workInProgress.expirationTime = renderExpirationTime;
18256 var _update = createRootErrorUpdate(workInProgress, _errorInfo, renderExpirationTime);
18257 enqueueCapturedUpdate(workInProgress, _update);
18258 return;
18259 }
18260 case ClassComponent:
18261 // Capture and retry
18262 var errorInfo = value;
18263 var ctor = workInProgress.type;
18264 var instance = workInProgress.stateNode;
18265 if ((workInProgress.effectTag & DidCapture) === NoEffect && (typeof ctor.getDerivedStateFromError === 'function' || instance !== null && typeof instance.componentDidCatch === 'function' && !isAlreadyFailedLegacyErrorBoundary(instance))) {
18266 workInProgress.effectTag |= ShouldCapture;
18267 workInProgress.expirationTime = renderExpirationTime;
18268 // Schedule the error boundary to re-render using updated state
18269 var _update2 = createClassErrorUpdate(workInProgress, errorInfo, renderExpirationTime);
18270 enqueueCapturedUpdate(workInProgress, _update2);
18271 return;
18272 }
18273 break;
18274 default:
18275 break;
18276 }
18277 workInProgress = workInProgress.return;
18278 } while (workInProgress !== null);
18279}
18280
18281function unwindWork(workInProgress, renderExpirationTime) {
18282 switch (workInProgress.tag) {
18283 case ClassComponent:
18284 {
18285 var Component = workInProgress.type;
18286 if (isContextProvider(Component)) {
18287 popContext(workInProgress);
18288 }
18289 var effectTag = workInProgress.effectTag;
18290 if (effectTag & ShouldCapture) {
18291 workInProgress.effectTag = effectTag & ~ShouldCapture | DidCapture;
18292 return workInProgress;
18293 }
18294 return null;
18295 }
18296 case HostRoot:
18297 {
18298 popHostContainer(workInProgress);
18299 popTopLevelContextObject(workInProgress);
18300 var _effectTag = workInProgress.effectTag;
18301 !((_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;
18302 workInProgress.effectTag = _effectTag & ~ShouldCapture | DidCapture;
18303 return workInProgress;
18304 }
18305 case HostComponent:
18306 {
18307 // TODO: popHydrationState
18308 popHostContext(workInProgress);
18309 return null;
18310 }
18311 case SuspenseComponent:
18312 {
18313 var _effectTag2 = workInProgress.effectTag;
18314 if (_effectTag2 & ShouldCapture) {
18315 workInProgress.effectTag = _effectTag2 & ~ShouldCapture | DidCapture;
18316 // Captured a suspense effect. Re-render the boundary.
18317 return workInProgress;
18318 }
18319 return null;
18320 }
18321 case DehydratedSuspenseComponent:
18322 {
18323 if (enableSuspenseServerRenderer) {
18324 // TODO: popHydrationState
18325 var _effectTag3 = workInProgress.effectTag;
18326 if (_effectTag3 & ShouldCapture) {
18327 workInProgress.effectTag = _effectTag3 & ~ShouldCapture | DidCapture;
18328 // Captured a suspense effect. Re-render the boundary.
18329 return workInProgress;
18330 }
18331 }
18332 return null;
18333 }
18334 case HostPortal:
18335 popHostContainer(workInProgress);
18336 return null;
18337 case ContextProvider:
18338 popProvider(workInProgress);
18339 return null;
18340 default:
18341 return null;
18342 }
18343}
18344
18345function unwindInterruptedWork(interruptedWork) {
18346 switch (interruptedWork.tag) {
18347 case ClassComponent:
18348 {
18349 var childContextTypes = interruptedWork.type.childContextTypes;
18350 if (childContextTypes !== null && childContextTypes !== undefined) {
18351 popContext(interruptedWork);
18352 }
18353 break;
18354 }
18355 case HostRoot:
18356 {
18357 popHostContainer(interruptedWork);
18358 popTopLevelContextObject(interruptedWork);
18359 break;
18360 }
18361 case HostComponent:
18362 {
18363 popHostContext(interruptedWork);
18364 break;
18365 }
18366 case HostPortal:
18367 popHostContainer(interruptedWork);
18368 break;
18369 case ContextProvider:
18370 popProvider(interruptedWork);
18371 break;
18372 default:
18373 break;
18374 }
18375}
18376
18377var ReactCurrentDispatcher = ReactSharedInternals.ReactCurrentDispatcher;
18378var ReactCurrentOwner$2 = ReactSharedInternals.ReactCurrentOwner;
18379
18380
18381var didWarnAboutStateTransition = void 0;
18382var didWarnSetStateChildContext = void 0;
18383var warnAboutUpdateOnUnmounted = void 0;
18384var warnAboutInvalidUpdates = void 0;
18385
18386if (enableSchedulerTracing) {
18387 // Provide explicit error message when production+profiling bundle of e.g. react-dom
18388 // is used with production (non-profiling) bundle of scheduler/tracing
18389 !(__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;
18390}
18391
18392{
18393 didWarnAboutStateTransition = false;
18394 didWarnSetStateChildContext = false;
18395 var didWarnStateUpdateForUnmountedComponent = {};
18396
18397 warnAboutUpdateOnUnmounted = function (fiber, isClass) {
18398 // We show the whole stack but dedupe on the top component's name because
18399 // the problematic code almost always lies inside that component.
18400 var componentName = getComponentName(fiber.type) || 'ReactComponent';
18401 if (didWarnStateUpdateForUnmountedComponent[componentName]) {
18402 return;
18403 }
18404 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));
18405 didWarnStateUpdateForUnmountedComponent[componentName] = true;
18406 };
18407
18408 warnAboutInvalidUpdates = function (instance) {
18409 switch (phase) {
18410 case 'getChildContext':
18411 if (didWarnSetStateChildContext) {
18412 return;
18413 }
18414 warningWithoutStack$1(false, 'setState(...): Cannot call setState() inside getChildContext()');
18415 didWarnSetStateChildContext = true;
18416 break;
18417 case 'render':
18418 if (didWarnAboutStateTransition) {
18419 return;
18420 }
18421 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.');
18422 didWarnAboutStateTransition = true;
18423 break;
18424 }
18425 };
18426}
18427
18428// Used to ensure computeUniqueAsyncExpiration is monotonically decreasing.
18429var lastUniqueAsyncExpiration = Sync - 1;
18430
18431var isWorking = false;
18432
18433// The next work in progress fiber that we're currently working on.
18434var nextUnitOfWork = null;
18435var nextRoot = null;
18436// The time at which we're currently rendering work.
18437var nextRenderExpirationTime = NoWork;
18438var nextLatestAbsoluteTimeoutMs = -1;
18439var nextRenderDidError = false;
18440
18441// The next fiber with an effect that we're currently committing.
18442var nextEffect = null;
18443
18444var isCommitting$1 = false;
18445var rootWithPendingPassiveEffects = null;
18446var passiveEffectCallbackHandle = null;
18447var passiveEffectCallback = null;
18448
18449var legacyErrorBoundariesThatAlreadyFailed = null;
18450
18451// Used for performance tracking.
18452var interruptedBy = null;
18453
18454var stashedWorkInProgressProperties = void 0;
18455var replayUnitOfWork = void 0;
18456var mayReplayFailedUnitOfWork = void 0;
18457var isReplayingFailedUnitOfWork = void 0;
18458var originalReplayError = void 0;
18459var rethrowOriginalError = void 0;
18460if (true && replayFailedUnitOfWorkWithInvokeGuardedCallback) {
18461 stashedWorkInProgressProperties = null;
18462 mayReplayFailedUnitOfWork = true;
18463 isReplayingFailedUnitOfWork = false;
18464 originalReplayError = null;
18465 replayUnitOfWork = function (failedUnitOfWork, thrownValue, isYieldy) {
18466 if (thrownValue !== null && typeof thrownValue === 'object' && typeof thrownValue.then === 'function') {
18467 // Don't replay promises. Treat everything else like an error.
18468 // TODO: Need to figure out a different strategy if/when we add
18469 // support for catching other types.
18470 return;
18471 }
18472
18473 // Restore the original state of the work-in-progress
18474 if (stashedWorkInProgressProperties === null) {
18475 // This should never happen. Don't throw because this code is DEV-only.
18476 warningWithoutStack$1(false, 'Could not replay rendering after an error. This is likely a bug in React. ' + 'Please file an issue.');
18477 return;
18478 }
18479 assignFiberPropertiesInDEV(failedUnitOfWork, stashedWorkInProgressProperties);
18480
18481 switch (failedUnitOfWork.tag) {
18482 case HostRoot:
18483 popHostContainer(failedUnitOfWork);
18484 popTopLevelContextObject(failedUnitOfWork);
18485 break;
18486 case HostComponent:
18487 popHostContext(failedUnitOfWork);
18488 break;
18489 case ClassComponent:
18490 {
18491 var Component = failedUnitOfWork.type;
18492 if (isContextProvider(Component)) {
18493 popContext(failedUnitOfWork);
18494 }
18495 break;
18496 }
18497 case HostPortal:
18498 popHostContainer(failedUnitOfWork);
18499 break;
18500 case ContextProvider:
18501 popProvider(failedUnitOfWork);
18502 break;
18503 }
18504 // Replay the begin phase.
18505 isReplayingFailedUnitOfWork = true;
18506 originalReplayError = thrownValue;
18507 invokeGuardedCallback(null, workLoop, null, isYieldy);
18508 isReplayingFailedUnitOfWork = false;
18509 originalReplayError = null;
18510 if (hasCaughtError()) {
18511 var replayError = clearCaughtError();
18512 if (replayError != null && thrownValue != null) {
18513 try {
18514 // Reading the expando property is intentionally
18515 // inside `try` because it might be a getter or Proxy.
18516 if (replayError._suppressLogging) {
18517 // Also suppress logging for the original error.
18518 thrownValue._suppressLogging = true;
18519 }
18520 } catch (inner) {
18521 // Ignore.
18522 }
18523 }
18524 } else {
18525 // If the begin phase did not fail the second time, set this pointer
18526 // back to the original value.
18527 nextUnitOfWork = failedUnitOfWork;
18528 }
18529 };
18530 rethrowOriginalError = function () {
18531 throw originalReplayError;
18532 };
18533}
18534
18535function resetStack() {
18536 if (nextUnitOfWork !== null) {
18537 var interruptedWork = nextUnitOfWork.return;
18538 while (interruptedWork !== null) {
18539 unwindInterruptedWork(interruptedWork);
18540 interruptedWork = interruptedWork.return;
18541 }
18542 }
18543
18544 {
18545 ReactStrictModeWarnings.discardPendingWarnings();
18546 checkThatStackIsEmpty();
18547 }
18548
18549 nextRoot = null;
18550 nextRenderExpirationTime = NoWork;
18551 nextLatestAbsoluteTimeoutMs = -1;
18552 nextRenderDidError = false;
18553 nextUnitOfWork = null;
18554}
18555
18556function commitAllHostEffects() {
18557 while (nextEffect !== null) {
18558 {
18559 setCurrentFiber(nextEffect);
18560 }
18561 recordEffect();
18562
18563 var effectTag = nextEffect.effectTag;
18564
18565 if (effectTag & ContentReset) {
18566 commitResetTextContent(nextEffect);
18567 }
18568
18569 if (effectTag & Ref) {
18570 var current$$1 = nextEffect.alternate;
18571 if (current$$1 !== null) {
18572 commitDetachRef(current$$1);
18573 }
18574 }
18575
18576 // The following switch statement is only concerned about placement,
18577 // updates, and deletions. To avoid needing to add a case for every
18578 // possible bitmap value, we remove the secondary effects from the
18579 // effect tag and switch on that value.
18580 var primaryEffectTag = effectTag & (Placement | Update | Deletion);
18581 switch (primaryEffectTag) {
18582 case Placement:
18583 {
18584 commitPlacement(nextEffect);
18585 // Clear the "placement" from effect tag so that we know that this is inserted, before
18586 // any life-cycles like componentDidMount gets called.
18587 // TODO: findDOMNode doesn't rely on this any more but isMounted
18588 // does and isMounted is deprecated anyway so we should be able
18589 // to kill this.
18590 nextEffect.effectTag &= ~Placement;
18591 break;
18592 }
18593 case PlacementAndUpdate:
18594 {
18595 // Placement
18596 commitPlacement(nextEffect);
18597 // Clear the "placement" from effect tag so that we know that this is inserted, before
18598 // any life-cycles like componentDidMount gets called.
18599 nextEffect.effectTag &= ~Placement;
18600
18601 // Update
18602 var _current = nextEffect.alternate;
18603 commitWork(_current, nextEffect);
18604 break;
18605 }
18606 case Update:
18607 {
18608 var _current2 = nextEffect.alternate;
18609 commitWork(_current2, nextEffect);
18610 break;
18611 }
18612 case Deletion:
18613 {
18614 commitDeletion(nextEffect);
18615 break;
18616 }
18617 }
18618 nextEffect = nextEffect.nextEffect;
18619 }
18620
18621 {
18622 resetCurrentFiber();
18623 }
18624}
18625
18626function commitBeforeMutationLifecycles() {
18627 while (nextEffect !== null) {
18628 {
18629 setCurrentFiber(nextEffect);
18630 }
18631
18632 var effectTag = nextEffect.effectTag;
18633 if (effectTag & Snapshot) {
18634 recordEffect();
18635 var current$$1 = nextEffect.alternate;
18636 commitBeforeMutationLifeCycles(current$$1, nextEffect);
18637 }
18638
18639 nextEffect = nextEffect.nextEffect;
18640 }
18641
18642 {
18643 resetCurrentFiber();
18644 }
18645}
18646
18647function commitAllLifeCycles(finishedRoot, committedExpirationTime) {
18648 {
18649 ReactStrictModeWarnings.flushPendingUnsafeLifecycleWarnings();
18650 ReactStrictModeWarnings.flushLegacyContextWarning();
18651
18652 if (warnAboutDeprecatedLifecycles) {
18653 ReactStrictModeWarnings.flushPendingDeprecationWarnings();
18654 }
18655 }
18656 while (nextEffect !== null) {
18657 {
18658 setCurrentFiber(nextEffect);
18659 }
18660 var effectTag = nextEffect.effectTag;
18661
18662 if (effectTag & (Update | Callback)) {
18663 recordEffect();
18664 var current$$1 = nextEffect.alternate;
18665 commitLifeCycles(finishedRoot, current$$1, nextEffect, committedExpirationTime);
18666 }
18667
18668 if (effectTag & Ref) {
18669 recordEffect();
18670 commitAttachRef(nextEffect);
18671 }
18672
18673 if (effectTag & Passive) {
18674 rootWithPendingPassiveEffects = finishedRoot;
18675 }
18676
18677 nextEffect = nextEffect.nextEffect;
18678 }
18679 {
18680 resetCurrentFiber();
18681 }
18682}
18683
18684function commitPassiveEffects(root, firstEffect) {
18685 rootWithPendingPassiveEffects = null;
18686 passiveEffectCallbackHandle = null;
18687 passiveEffectCallback = null;
18688
18689 // Set this to true to prevent re-entrancy
18690 var previousIsRendering = isRendering;
18691 isRendering = true;
18692
18693 var effect = firstEffect;
18694 do {
18695 {
18696 setCurrentFiber(effect);
18697 }
18698
18699 if (effect.effectTag & Passive) {
18700 var didError = false;
18701 var error = void 0;
18702 {
18703 invokeGuardedCallback(null, commitPassiveHookEffects, null, effect);
18704 if (hasCaughtError()) {
18705 didError = true;
18706 error = clearCaughtError();
18707 }
18708 }
18709 if (didError) {
18710 captureCommitPhaseError(effect, error);
18711 }
18712 }
18713 effect = effect.nextEffect;
18714 } while (effect !== null);
18715 {
18716 resetCurrentFiber();
18717 }
18718
18719 isRendering = previousIsRendering;
18720
18721 // Check if work was scheduled by one of the effects
18722 var rootExpirationTime = root.expirationTime;
18723 if (rootExpirationTime !== NoWork) {
18724 requestWork(root, rootExpirationTime);
18725 }
18726 // Flush any sync work that was scheduled by effects
18727 if (!isBatchingUpdates && !isRendering) {
18728 performSyncWork();
18729 }
18730}
18731
18732function isAlreadyFailedLegacyErrorBoundary(instance) {
18733 return legacyErrorBoundariesThatAlreadyFailed !== null && legacyErrorBoundariesThatAlreadyFailed.has(instance);
18734}
18735
18736function markLegacyErrorBoundaryAsFailed(instance) {
18737 if (legacyErrorBoundariesThatAlreadyFailed === null) {
18738 legacyErrorBoundariesThatAlreadyFailed = new Set([instance]);
18739 } else {
18740 legacyErrorBoundariesThatAlreadyFailed.add(instance);
18741 }
18742}
18743
18744function flushPassiveEffects() {
18745 if (passiveEffectCallbackHandle !== null) {
18746 cancelPassiveEffects(passiveEffectCallbackHandle);
18747 }
18748 if (passiveEffectCallback !== null) {
18749 // We call the scheduled callback instead of commitPassiveEffects directly
18750 // to ensure tracing works correctly.
18751 passiveEffectCallback();
18752 }
18753}
18754
18755function commitRoot(root, finishedWork) {
18756 isWorking = true;
18757 isCommitting$1 = true;
18758 startCommitTimer();
18759
18760 !(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;
18761 var committedExpirationTime = root.pendingCommitExpirationTime;
18762 !(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;
18763 root.pendingCommitExpirationTime = NoWork;
18764
18765 // Update the pending priority levels to account for the work that we are
18766 // about to commit. This needs to happen before calling the lifecycles, since
18767 // they may schedule additional updates.
18768 var updateExpirationTimeBeforeCommit = finishedWork.expirationTime;
18769 var childExpirationTimeBeforeCommit = finishedWork.childExpirationTime;
18770 var earliestRemainingTimeBeforeCommit = childExpirationTimeBeforeCommit > updateExpirationTimeBeforeCommit ? childExpirationTimeBeforeCommit : updateExpirationTimeBeforeCommit;
18771 markCommittedPriorityLevels(root, earliestRemainingTimeBeforeCommit);
18772
18773 var prevInteractions = null;
18774 if (enableSchedulerTracing) {
18775 // Restore any pending interactions at this point,
18776 // So that cascading work triggered during the render phase will be accounted for.
18777 prevInteractions = __interactionsRef.current;
18778 __interactionsRef.current = root.memoizedInteractions;
18779 }
18780
18781 // Reset this to null before calling lifecycles
18782 ReactCurrentOwner$2.current = null;
18783
18784 var firstEffect = void 0;
18785 if (finishedWork.effectTag > PerformedWork) {
18786 // A fiber's effect list consists only of its children, not itself. So if
18787 // the root has an effect, we need to add it to the end of the list. The
18788 // resulting list is the set that would belong to the root's parent, if
18789 // it had one; that is, all the effects in the tree including the root.
18790 if (finishedWork.lastEffect !== null) {
18791 finishedWork.lastEffect.nextEffect = finishedWork;
18792 firstEffect = finishedWork.firstEffect;
18793 } else {
18794 firstEffect = finishedWork;
18795 }
18796 } else {
18797 // There is no effect on the root.
18798 firstEffect = finishedWork.firstEffect;
18799 }
18800
18801 prepareForCommit(root.containerInfo);
18802
18803 // Invoke instances of getSnapshotBeforeUpdate before mutation.
18804 nextEffect = firstEffect;
18805 startCommitSnapshotEffectsTimer();
18806 while (nextEffect !== null) {
18807 var didError = false;
18808 var error = void 0;
18809 {
18810 invokeGuardedCallback(null, commitBeforeMutationLifecycles, null);
18811 if (hasCaughtError()) {
18812 didError = true;
18813 error = clearCaughtError();
18814 }
18815 }
18816 if (didError) {
18817 !(nextEffect !== null) ? invariant(false, 'Should have next effect. This error is likely caused by a bug in React. Please file an issue.') : void 0;
18818 captureCommitPhaseError(nextEffect, error);
18819 // Clean-up
18820 if (nextEffect !== null) {
18821 nextEffect = nextEffect.nextEffect;
18822 }
18823 }
18824 }
18825 stopCommitSnapshotEffectsTimer();
18826
18827 if (enableProfilerTimer) {
18828 // Mark the current commit time to be shared by all Profilers in this batch.
18829 // This enables them to be grouped later.
18830 recordCommitTime();
18831 }
18832
18833 // Commit all the side-effects within a tree. We'll do this in two passes.
18834 // The first pass performs all the host insertions, updates, deletions and
18835 // ref unmounts.
18836 nextEffect = firstEffect;
18837 startCommitHostEffectsTimer();
18838 while (nextEffect !== null) {
18839 var _didError = false;
18840 var _error = void 0;
18841 {
18842 invokeGuardedCallback(null, commitAllHostEffects, null);
18843 if (hasCaughtError()) {
18844 _didError = true;
18845 _error = clearCaughtError();
18846 }
18847 }
18848 if (_didError) {
18849 !(nextEffect !== null) ? invariant(false, 'Should have next effect. This error is likely caused by a bug in React. Please file an issue.') : void 0;
18850 captureCommitPhaseError(nextEffect, _error);
18851 // Clean-up
18852 if (nextEffect !== null) {
18853 nextEffect = nextEffect.nextEffect;
18854 }
18855 }
18856 }
18857 stopCommitHostEffectsTimer();
18858
18859 resetAfterCommit(root.containerInfo);
18860
18861 // The work-in-progress tree is now the current tree. This must come after
18862 // the first pass of the commit phase, so that the previous tree is still
18863 // current during componentWillUnmount, but before the second pass, so that
18864 // the finished work is current during componentDidMount/Update.
18865 root.current = finishedWork;
18866
18867 // In the second pass we'll perform all life-cycles and ref callbacks.
18868 // Life-cycles happen as a separate pass so that all placements, updates,
18869 // and deletions in the entire tree have already been invoked.
18870 // This pass also triggers any renderer-specific initial effects.
18871 nextEffect = firstEffect;
18872 startCommitLifeCyclesTimer();
18873 while (nextEffect !== null) {
18874 var _didError2 = false;
18875 var _error2 = void 0;
18876 {
18877 invokeGuardedCallback(null, commitAllLifeCycles, null, root, committedExpirationTime);
18878 if (hasCaughtError()) {
18879 _didError2 = true;
18880 _error2 = clearCaughtError();
18881 }
18882 }
18883 if (_didError2) {
18884 !(nextEffect !== null) ? invariant(false, 'Should have next effect. This error is likely caused by a bug in React. Please file an issue.') : void 0;
18885 captureCommitPhaseError(nextEffect, _error2);
18886 if (nextEffect !== null) {
18887 nextEffect = nextEffect.nextEffect;
18888 }
18889 }
18890 }
18891
18892 if (firstEffect !== null && rootWithPendingPassiveEffects !== null) {
18893 // This commit included a passive effect. These do not need to fire until
18894 // after the next paint. Schedule an callback to fire them in an async
18895 // event. To ensure serial execution, the callback will be flushed early if
18896 // we enter rootWithPendingPassiveEffects commit phase before then.
18897 var callback = commitPassiveEffects.bind(null, root, firstEffect);
18898 if (enableSchedulerTracing) {
18899 // TODO: Avoid this extra callback by mutating the tracing ref directly,
18900 // like we do at the beginning of commitRoot. I've opted not to do that
18901 // here because that code is still in flux.
18902 callback = unstable_wrap(callback);
18903 }
18904 passiveEffectCallbackHandle = unstable_runWithPriority(unstable_NormalPriority, function () {
18905 return schedulePassiveEffects(callback);
18906 });
18907 passiveEffectCallback = callback;
18908 }
18909
18910 isCommitting$1 = false;
18911 isWorking = false;
18912 stopCommitLifeCyclesTimer();
18913 stopCommitTimer();
18914 onCommitRoot(finishedWork.stateNode);
18915 if (true && ReactFiberInstrumentation_1.debugTool) {
18916 ReactFiberInstrumentation_1.debugTool.onCommitWork(finishedWork);
18917 }
18918
18919 var updateExpirationTimeAfterCommit = finishedWork.expirationTime;
18920 var childExpirationTimeAfterCommit = finishedWork.childExpirationTime;
18921 var earliestRemainingTimeAfterCommit = childExpirationTimeAfterCommit > updateExpirationTimeAfterCommit ? childExpirationTimeAfterCommit : updateExpirationTimeAfterCommit;
18922 if (earliestRemainingTimeAfterCommit === NoWork) {
18923 // If there's no remaining work, we can clear the set of already failed
18924 // error boundaries.
18925 legacyErrorBoundariesThatAlreadyFailed = null;
18926 }
18927 onCommit(root, earliestRemainingTimeAfterCommit);
18928
18929 if (enableSchedulerTracing) {
18930 __interactionsRef.current = prevInteractions;
18931
18932 var subscriber = void 0;
18933
18934 try {
18935 subscriber = __subscriberRef.current;
18936 if (subscriber !== null && root.memoizedInteractions.size > 0) {
18937 var threadID = computeThreadID(committedExpirationTime, root.interactionThreadID);
18938 subscriber.onWorkStopped(root.memoizedInteractions, threadID);
18939 }
18940 } catch (error) {
18941 // It's not safe for commitRoot() to throw.
18942 // Store the error for now and we'll re-throw in finishRendering().
18943 if (!hasUnhandledError) {
18944 hasUnhandledError = true;
18945 unhandledError = error;
18946 }
18947 } finally {
18948 // Clear completed interactions from the pending Map.
18949 // Unless the render was suspended or cascading work was scheduled,
18950 // In which case– leave pending interactions until the subsequent render.
18951 var pendingInteractionMap = root.pendingInteractionMap;
18952 pendingInteractionMap.forEach(function (scheduledInteractions, scheduledExpirationTime) {
18953 // Only decrement the pending interaction count if we're done.
18954 // If there's still work at the current priority,
18955 // That indicates that we are waiting for suspense data.
18956 if (scheduledExpirationTime > earliestRemainingTimeAfterCommit) {
18957 pendingInteractionMap.delete(scheduledExpirationTime);
18958
18959 scheduledInteractions.forEach(function (interaction) {
18960 interaction.__count--;
18961
18962 if (subscriber !== null && interaction.__count === 0) {
18963 try {
18964 subscriber.onInteractionScheduledWorkCompleted(interaction);
18965 } catch (error) {
18966 // It's not safe for commitRoot() to throw.
18967 // Store the error for now and we'll re-throw in finishRendering().
18968 if (!hasUnhandledError) {
18969 hasUnhandledError = true;
18970 unhandledError = error;
18971 }
18972 }
18973 }
18974 });
18975 }
18976 });
18977 }
18978 }
18979}
18980
18981function resetChildExpirationTime(workInProgress, renderTime) {
18982 if (renderTime !== Never && workInProgress.childExpirationTime === Never) {
18983 // The children of this component are hidden. Don't bubble their
18984 // expiration times.
18985 return;
18986 }
18987
18988 var newChildExpirationTime = NoWork;
18989
18990 // Bubble up the earliest expiration time.
18991 if (enableProfilerTimer && workInProgress.mode & ProfileMode) {
18992 // We're in profiling mode.
18993 // Let's use this same traversal to update the render durations.
18994 var actualDuration = workInProgress.actualDuration;
18995 var treeBaseDuration = workInProgress.selfBaseDuration;
18996
18997 // When a fiber is cloned, its actualDuration is reset to 0.
18998 // This value will only be updated if work is done on the fiber (i.e. it doesn't bailout).
18999 // When work is done, it should bubble to the parent's actualDuration.
19000 // If the fiber has not been cloned though, (meaning no work was done),
19001 // Then this value will reflect the amount of time spent working on a previous render.
19002 // In that case it should not bubble.
19003 // We determine whether it was cloned by comparing the child pointer.
19004 var shouldBubbleActualDurations = workInProgress.alternate === null || workInProgress.child !== workInProgress.alternate.child;
19005
19006 var child = workInProgress.child;
19007 while (child !== null) {
19008 var childUpdateExpirationTime = child.expirationTime;
19009 var childChildExpirationTime = child.childExpirationTime;
19010 if (childUpdateExpirationTime > newChildExpirationTime) {
19011 newChildExpirationTime = childUpdateExpirationTime;
19012 }
19013 if (childChildExpirationTime > newChildExpirationTime) {
19014 newChildExpirationTime = childChildExpirationTime;
19015 }
19016 if (shouldBubbleActualDurations) {
19017 actualDuration += child.actualDuration;
19018 }
19019 treeBaseDuration += child.treeBaseDuration;
19020 child = child.sibling;
19021 }
19022 workInProgress.actualDuration = actualDuration;
19023 workInProgress.treeBaseDuration = treeBaseDuration;
19024 } else {
19025 var _child = workInProgress.child;
19026 while (_child !== null) {
19027 var _childUpdateExpirationTime = _child.expirationTime;
19028 var _childChildExpirationTime = _child.childExpirationTime;
19029 if (_childUpdateExpirationTime > newChildExpirationTime) {
19030 newChildExpirationTime = _childUpdateExpirationTime;
19031 }
19032 if (_childChildExpirationTime > newChildExpirationTime) {
19033 newChildExpirationTime = _childChildExpirationTime;
19034 }
19035 _child = _child.sibling;
19036 }
19037 }
19038
19039 workInProgress.childExpirationTime = newChildExpirationTime;
19040}
19041
19042function completeUnitOfWork(workInProgress) {
19043 // Attempt to complete the current unit of work, then move to the
19044 // next sibling. If there are no more siblings, return to the
19045 // parent fiber.
19046 while (true) {
19047 // The current, flushed, state of this fiber is the alternate.
19048 // Ideally nothing should rely on this, but relying on it here
19049 // means that we don't need an additional field on the work in
19050 // progress.
19051 var current$$1 = workInProgress.alternate;
19052 {
19053 setCurrentFiber(workInProgress);
19054 }
19055
19056 var returnFiber = workInProgress.return;
19057 var siblingFiber = workInProgress.sibling;
19058
19059 if ((workInProgress.effectTag & Incomplete) === NoEffect) {
19060 if (true && replayFailedUnitOfWorkWithInvokeGuardedCallback) {
19061 // Don't replay if it fails during completion phase.
19062 mayReplayFailedUnitOfWork = false;
19063 }
19064 // This fiber completed.
19065 // Remember we're completing this unit so we can find a boundary if it fails.
19066 nextUnitOfWork = workInProgress;
19067 if (enableProfilerTimer) {
19068 if (workInProgress.mode & ProfileMode) {
19069 startProfilerTimer(workInProgress);
19070 }
19071 nextUnitOfWork = completeWork(current$$1, workInProgress, nextRenderExpirationTime);
19072 if (workInProgress.mode & ProfileMode) {
19073 // Update render duration assuming we didn't error.
19074 stopProfilerTimerIfRunningAndRecordDelta(workInProgress, false);
19075 }
19076 } else {
19077 nextUnitOfWork = completeWork(current$$1, workInProgress, nextRenderExpirationTime);
19078 }
19079 if (true && replayFailedUnitOfWorkWithInvokeGuardedCallback) {
19080 // We're out of completion phase so replaying is fine now.
19081 mayReplayFailedUnitOfWork = true;
19082 }
19083 stopWorkTimer(workInProgress);
19084 resetChildExpirationTime(workInProgress, nextRenderExpirationTime);
19085 {
19086 resetCurrentFiber();
19087 }
19088
19089 if (nextUnitOfWork !== null) {
19090 // Completing this fiber spawned new work. Work on that next.
19091 return nextUnitOfWork;
19092 }
19093
19094 if (returnFiber !== null &&
19095 // Do not append effects to parents if a sibling failed to complete
19096 (returnFiber.effectTag & Incomplete) === NoEffect) {
19097 // Append all the effects of the subtree and this fiber onto the effect
19098 // list of the parent. The completion order of the children affects the
19099 // side-effect order.
19100 if (returnFiber.firstEffect === null) {
19101 returnFiber.firstEffect = workInProgress.firstEffect;
19102 }
19103 if (workInProgress.lastEffect !== null) {
19104 if (returnFiber.lastEffect !== null) {
19105 returnFiber.lastEffect.nextEffect = workInProgress.firstEffect;
19106 }
19107 returnFiber.lastEffect = workInProgress.lastEffect;
19108 }
19109
19110 // If this fiber had side-effects, we append it AFTER the children's
19111 // side-effects. We can perform certain side-effects earlier if
19112 // needed, by doing multiple passes over the effect list. We don't want
19113 // to schedule our own side-effect on our own list because if end up
19114 // reusing children we'll schedule this effect onto itself since we're
19115 // at the end.
19116 var effectTag = workInProgress.effectTag;
19117 // Skip both NoWork and PerformedWork tags when creating the effect list.
19118 // PerformedWork effect is read by React DevTools but shouldn't be committed.
19119 if (effectTag > PerformedWork) {
19120 if (returnFiber.lastEffect !== null) {
19121 returnFiber.lastEffect.nextEffect = workInProgress;
19122 } else {
19123 returnFiber.firstEffect = workInProgress;
19124 }
19125 returnFiber.lastEffect = workInProgress;
19126 }
19127 }
19128
19129 if (true && ReactFiberInstrumentation_1.debugTool) {
19130 ReactFiberInstrumentation_1.debugTool.onCompleteWork(workInProgress);
19131 }
19132
19133 if (siblingFiber !== null) {
19134 // If there is more work to do in this returnFiber, do that next.
19135 return siblingFiber;
19136 } else if (returnFiber !== null) {
19137 // If there's no more work in this returnFiber. Complete the returnFiber.
19138 workInProgress = returnFiber;
19139 continue;
19140 } else {
19141 // We've reached the root.
19142 return null;
19143 }
19144 } else {
19145 if (enableProfilerTimer && workInProgress.mode & ProfileMode) {
19146 // Record the render duration for the fiber that errored.
19147 stopProfilerTimerIfRunningAndRecordDelta(workInProgress, false);
19148
19149 // Include the time spent working on failed children before continuing.
19150 var actualDuration = workInProgress.actualDuration;
19151 var child = workInProgress.child;
19152 while (child !== null) {
19153 actualDuration += child.actualDuration;
19154 child = child.sibling;
19155 }
19156 workInProgress.actualDuration = actualDuration;
19157 }
19158
19159 // This fiber did not complete because something threw. Pop values off
19160 // the stack without entering the complete phase. If this is a boundary,
19161 // capture values if possible.
19162 var next = unwindWork(workInProgress, nextRenderExpirationTime);
19163 // Because this fiber did not complete, don't reset its expiration time.
19164 if (workInProgress.effectTag & DidCapture) {
19165 // Restarting an error boundary
19166 stopFailedWorkTimer(workInProgress);
19167 } else {
19168 stopWorkTimer(workInProgress);
19169 }
19170
19171 {
19172 resetCurrentFiber();
19173 }
19174
19175 if (next !== null) {
19176 stopWorkTimer(workInProgress);
19177 if (true && ReactFiberInstrumentation_1.debugTool) {
19178 ReactFiberInstrumentation_1.debugTool.onCompleteWork(workInProgress);
19179 }
19180
19181 // If completing this work spawned new work, do that next. We'll come
19182 // back here again.
19183 // Since we're restarting, remove anything that is not a host effect
19184 // from the effect tag.
19185 next.effectTag &= HostEffectMask;
19186 return next;
19187 }
19188
19189 if (returnFiber !== null) {
19190 // Mark the parent fiber as incomplete and clear its effect list.
19191 returnFiber.firstEffect = returnFiber.lastEffect = null;
19192 returnFiber.effectTag |= Incomplete;
19193 }
19194
19195 if (true && ReactFiberInstrumentation_1.debugTool) {
19196 ReactFiberInstrumentation_1.debugTool.onCompleteWork(workInProgress);
19197 }
19198
19199 if (siblingFiber !== null) {
19200 // If there is more work to do in this returnFiber, do that next.
19201 return siblingFiber;
19202 } else if (returnFiber !== null) {
19203 // If there's no more work in this returnFiber. Complete the returnFiber.
19204 workInProgress = returnFiber;
19205 continue;
19206 } else {
19207 return null;
19208 }
19209 }
19210 }
19211
19212 // Without this explicit null return Flow complains of invalid return type
19213 // TODO Remove the above while(true) loop
19214 // eslint-disable-next-line no-unreachable
19215 return null;
19216}
19217
19218function performUnitOfWork(workInProgress) {
19219 // The current, flushed, state of this fiber is the alternate.
19220 // Ideally nothing should rely on this, but relying on it here
19221 // means that we don't need an additional field on the work in
19222 // progress.
19223 var current$$1 = workInProgress.alternate;
19224
19225 // See if beginning this work spawns more work.
19226 startWorkTimer(workInProgress);
19227 {
19228 setCurrentFiber(workInProgress);
19229 }
19230
19231 if (true && replayFailedUnitOfWorkWithInvokeGuardedCallback) {
19232 stashedWorkInProgressProperties = assignFiberPropertiesInDEV(stashedWorkInProgressProperties, workInProgress);
19233 }
19234
19235 var next = void 0;
19236 if (enableProfilerTimer) {
19237 if (workInProgress.mode & ProfileMode) {
19238 startProfilerTimer(workInProgress);
19239 }
19240
19241 next = beginWork(current$$1, workInProgress, nextRenderExpirationTime);
19242 workInProgress.memoizedProps = workInProgress.pendingProps;
19243
19244 if (workInProgress.mode & ProfileMode) {
19245 // Record the render duration assuming we didn't bailout (or error).
19246 stopProfilerTimerIfRunningAndRecordDelta(workInProgress, true);
19247 }
19248 } else {
19249 next = beginWork(current$$1, workInProgress, nextRenderExpirationTime);
19250 workInProgress.memoizedProps = workInProgress.pendingProps;
19251 }
19252
19253 {
19254 resetCurrentFiber();
19255 if (isReplayingFailedUnitOfWork) {
19256 // Currently replaying a failed unit of work. This should be unreachable,
19257 // because the render phase is meant to be idempotent, and it should
19258 // have thrown again. Since it didn't, rethrow the original error, so
19259 // React's internal stack is not misaligned.
19260 rethrowOriginalError();
19261 }
19262 }
19263 if (true && ReactFiberInstrumentation_1.debugTool) {
19264 ReactFiberInstrumentation_1.debugTool.onBeginWork(workInProgress);
19265 }
19266
19267 if (next === null) {
19268 // If this doesn't spawn new work, complete the current work.
19269 next = completeUnitOfWork(workInProgress);
19270 }
19271
19272 ReactCurrentOwner$2.current = null;
19273
19274 return next;
19275}
19276
19277function workLoop(isYieldy) {
19278 if (!isYieldy) {
19279 // Flush work without yielding
19280 while (nextUnitOfWork !== null) {
19281 nextUnitOfWork = performUnitOfWork(nextUnitOfWork);
19282 }
19283 } else {
19284 // Flush asynchronous work until there's a higher priority event
19285 while (nextUnitOfWork !== null && !shouldYieldToRenderer()) {
19286 nextUnitOfWork = performUnitOfWork(nextUnitOfWork);
19287 }
19288 }
19289}
19290
19291function renderRoot(root, isYieldy) {
19292 !!isWorking ? invariant(false, 'renderRoot was called recursively. This error is likely caused by a bug in React. Please file an issue.') : void 0;
19293
19294 flushPassiveEffects();
19295
19296 isWorking = true;
19297 var previousDispatcher = ReactCurrentDispatcher.current;
19298 ReactCurrentDispatcher.current = ContextOnlyDispatcher;
19299
19300 var expirationTime = root.nextExpirationTimeToWorkOn;
19301
19302 // Check if we're starting from a fresh stack, or if we're resuming from
19303 // previously yielded work.
19304 if (expirationTime !== nextRenderExpirationTime || root !== nextRoot || nextUnitOfWork === null) {
19305 // Reset the stack and start working from the root.
19306 resetStack();
19307 nextRoot = root;
19308 nextRenderExpirationTime = expirationTime;
19309 nextUnitOfWork = createWorkInProgress(nextRoot.current, null, nextRenderExpirationTime);
19310 root.pendingCommitExpirationTime = NoWork;
19311
19312 if (enableSchedulerTracing) {
19313 // Determine which interactions this batch of work currently includes,
19314 // So that we can accurately attribute time spent working on it,
19315 var interactions = new Set();
19316 root.pendingInteractionMap.forEach(function (scheduledInteractions, scheduledExpirationTime) {
19317 if (scheduledExpirationTime >= expirationTime) {
19318 scheduledInteractions.forEach(function (interaction) {
19319 return interactions.add(interaction);
19320 });
19321 }
19322 });
19323
19324 // Store the current set of interactions on the FiberRoot for a few reasons:
19325 // We can re-use it in hot functions like renderRoot() without having to recalculate it.
19326 // We will also use it in commitWork() to pass to any Profiler onRender() hooks.
19327 // This also provides DevTools with a way to access it when the onCommitRoot() hook is called.
19328 root.memoizedInteractions = interactions;
19329
19330 if (interactions.size > 0) {
19331 var subscriber = __subscriberRef.current;
19332 if (subscriber !== null) {
19333 var threadID = computeThreadID(expirationTime, root.interactionThreadID);
19334 try {
19335 subscriber.onWorkStarted(interactions, threadID);
19336 } catch (error) {
19337 // Work thrown by an interaction tracing subscriber should be rethrown,
19338 // But only once it's safe (to avoid leaving the scheduler in an invalid state).
19339 // Store the error for now and we'll re-throw in finishRendering().
19340 if (!hasUnhandledError) {
19341 hasUnhandledError = true;
19342 unhandledError = error;
19343 }
19344 }
19345 }
19346 }
19347 }
19348 }
19349
19350 var prevInteractions = null;
19351 if (enableSchedulerTracing) {
19352 // We're about to start new traced work.
19353 // Restore pending interactions so cascading work triggered during the render phase will be accounted for.
19354 prevInteractions = __interactionsRef.current;
19355 __interactionsRef.current = root.memoizedInteractions;
19356 }
19357
19358 var didFatal = false;
19359
19360 startWorkLoopTimer(nextUnitOfWork);
19361
19362 do {
19363 try {
19364 workLoop(isYieldy);
19365 } catch (thrownValue) {
19366 resetContextDependences();
19367 resetHooks();
19368
19369 // Reset in case completion throws.
19370 // This is only used in DEV and when replaying is on.
19371 var mayReplay = void 0;
19372 if (true && replayFailedUnitOfWorkWithInvokeGuardedCallback) {
19373 mayReplay = mayReplayFailedUnitOfWork;
19374 mayReplayFailedUnitOfWork = true;
19375 }
19376
19377 if (nextUnitOfWork === null) {
19378 // This is a fatal error.
19379 didFatal = true;
19380 onUncaughtError(thrownValue);
19381 } else {
19382 if (enableProfilerTimer && nextUnitOfWork.mode & ProfileMode) {
19383 // Record the time spent rendering before an error was thrown.
19384 // This avoids inaccurate Profiler durations in the case of a suspended render.
19385 stopProfilerTimerIfRunningAndRecordDelta(nextUnitOfWork, true);
19386 }
19387
19388 {
19389 // Reset global debug state
19390 // We assume this is defined in DEV
19391 resetCurrentlyProcessingQueue();
19392 }
19393
19394 if (true && replayFailedUnitOfWorkWithInvokeGuardedCallback) {
19395 if (mayReplay) {
19396 var failedUnitOfWork = nextUnitOfWork;
19397 replayUnitOfWork(failedUnitOfWork, thrownValue, isYieldy);
19398 }
19399 }
19400
19401 // TODO: we already know this isn't true in some cases.
19402 // At least this shows a nicer error message until we figure out the cause.
19403 // https://github.com/facebook/react/issues/12449#issuecomment-386727431
19404 !(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;
19405
19406 var sourceFiber = nextUnitOfWork;
19407 var returnFiber = sourceFiber.return;
19408 if (returnFiber === null) {
19409 // This is the root. The root could capture its own errors. However,
19410 // we don't know if it errors before or after we pushed the host
19411 // context. This information is needed to avoid a stack mismatch.
19412 // Because we're not sure, treat this as a fatal error. We could track
19413 // which phase it fails in, but doesn't seem worth it. At least
19414 // for now.
19415 didFatal = true;
19416 onUncaughtError(thrownValue);
19417 } else {
19418 throwException(root, returnFiber, sourceFiber, thrownValue, nextRenderExpirationTime);
19419 nextUnitOfWork = completeUnitOfWork(sourceFiber);
19420 continue;
19421 }
19422 }
19423 }
19424 break;
19425 } while (true);
19426
19427 if (enableSchedulerTracing) {
19428 // Traced work is done for now; restore the previous interactions.
19429 __interactionsRef.current = prevInteractions;
19430 }
19431
19432 // We're done performing work. Time to clean up.
19433 isWorking = false;
19434 ReactCurrentDispatcher.current = previousDispatcher;
19435 resetContextDependences();
19436 resetHooks();
19437
19438 // Yield back to main thread.
19439 if (didFatal) {
19440 var _didCompleteRoot = false;
19441 stopWorkLoopTimer(interruptedBy, _didCompleteRoot);
19442 interruptedBy = null;
19443 // There was a fatal error.
19444 {
19445 resetStackAfterFatalErrorInDev();
19446 }
19447 // `nextRoot` points to the in-progress root. A non-null value indicates
19448 // that we're in the middle of an async render. Set it to null to indicate
19449 // there's no more work to be done in the current batch.
19450 nextRoot = null;
19451 onFatal(root);
19452 return;
19453 }
19454
19455 if (nextUnitOfWork !== null) {
19456 // There's still remaining async work in this tree, but we ran out of time
19457 // in the current frame. Yield back to the renderer. Unless we're
19458 // interrupted by a higher priority update, we'll continue later from where
19459 // we left off.
19460 var _didCompleteRoot2 = false;
19461 stopWorkLoopTimer(interruptedBy, _didCompleteRoot2);
19462 interruptedBy = null;
19463 onYield(root);
19464 return;
19465 }
19466
19467 // We completed the whole tree.
19468 var didCompleteRoot = true;
19469 stopWorkLoopTimer(interruptedBy, didCompleteRoot);
19470 var rootWorkInProgress = root.current.alternate;
19471 !(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;
19472
19473 // `nextRoot` points to the in-progress root. A non-null value indicates
19474 // that we're in the middle of an async render. Set it to null to indicate
19475 // there's no more work to be done in the current batch.
19476 nextRoot = null;
19477 interruptedBy = null;
19478
19479 if (nextRenderDidError) {
19480 // There was an error
19481 if (hasLowerPriorityWork(root, expirationTime)) {
19482 // There's lower priority work. If so, it may have the effect of fixing
19483 // the exception that was just thrown. Exit without committing. This is
19484 // similar to a suspend, but without a timeout because we're not waiting
19485 // for a promise to resolve. React will restart at the lower
19486 // priority level.
19487 markSuspendedPriorityLevel(root, expirationTime);
19488 var suspendedExpirationTime = expirationTime;
19489 var rootExpirationTime = root.expirationTime;
19490 onSuspend(root, rootWorkInProgress, suspendedExpirationTime, rootExpirationTime, -1 // Indicates no timeout
19491 );
19492 return;
19493 } else if (
19494 // There's no lower priority work, but we're rendering asynchronously.
19495 // Synchronously attempt to render the same level one more time. This is
19496 // similar to a suspend, but without a timeout because we're not waiting
19497 // for a promise to resolve.
19498 !root.didError && isYieldy) {
19499 root.didError = true;
19500 var _suspendedExpirationTime = root.nextExpirationTimeToWorkOn = expirationTime;
19501 var _rootExpirationTime = root.expirationTime = Sync;
19502 onSuspend(root, rootWorkInProgress, _suspendedExpirationTime, _rootExpirationTime, -1 // Indicates no timeout
19503 );
19504 return;
19505 }
19506 }
19507
19508 if (isYieldy && nextLatestAbsoluteTimeoutMs !== -1) {
19509 // The tree was suspended.
19510 var _suspendedExpirationTime2 = expirationTime;
19511 markSuspendedPriorityLevel(root, _suspendedExpirationTime2);
19512
19513 // Find the earliest uncommitted expiration time in the tree, including
19514 // work that is suspended. The timeout threshold cannot be longer than
19515 // the overall expiration.
19516 var earliestExpirationTime = findEarliestOutstandingPriorityLevel(root, expirationTime);
19517 var earliestExpirationTimeMs = expirationTimeToMs(earliestExpirationTime);
19518 if (earliestExpirationTimeMs < nextLatestAbsoluteTimeoutMs) {
19519 nextLatestAbsoluteTimeoutMs = earliestExpirationTimeMs;
19520 }
19521
19522 // Subtract the current time from the absolute timeout to get the number
19523 // of milliseconds until the timeout. In other words, convert an absolute
19524 // timestamp to a relative time. This is the value that is passed
19525 // to `setTimeout`.
19526 var currentTimeMs = expirationTimeToMs(requestCurrentTime());
19527 var msUntilTimeout = nextLatestAbsoluteTimeoutMs - currentTimeMs;
19528 msUntilTimeout = msUntilTimeout < 0 ? 0 : msUntilTimeout;
19529
19530 // TODO: Account for the Just Noticeable Difference
19531
19532 var _rootExpirationTime2 = root.expirationTime;
19533 onSuspend(root, rootWorkInProgress, _suspendedExpirationTime2, _rootExpirationTime2, msUntilTimeout);
19534 return;
19535 }
19536
19537 // Ready to commit.
19538 onComplete(root, rootWorkInProgress, expirationTime);
19539}
19540
19541function captureCommitPhaseError(sourceFiber, value) {
19542 var expirationTime = Sync;
19543 var fiber = sourceFiber.return;
19544 while (fiber !== null) {
19545 switch (fiber.tag) {
19546 case ClassComponent:
19547 var ctor = fiber.type;
19548 var instance = fiber.stateNode;
19549 if (typeof ctor.getDerivedStateFromError === 'function' || typeof instance.componentDidCatch === 'function' && !isAlreadyFailedLegacyErrorBoundary(instance)) {
19550 var errorInfo = createCapturedValue(value, sourceFiber);
19551 var update = createClassErrorUpdate(fiber, errorInfo, expirationTime);
19552 enqueueUpdate(fiber, update);
19553 scheduleWork(fiber, expirationTime);
19554 return;
19555 }
19556 break;
19557 case HostRoot:
19558 {
19559 var _errorInfo = createCapturedValue(value, sourceFiber);
19560 var _update = createRootErrorUpdate(fiber, _errorInfo, expirationTime);
19561 enqueueUpdate(fiber, _update);
19562 scheduleWork(fiber, expirationTime);
19563 return;
19564 }
19565 }
19566 fiber = fiber.return;
19567 }
19568
19569 if (sourceFiber.tag === HostRoot) {
19570 // Error was thrown at the root. There is no parent, so the root
19571 // itself should capture it.
19572 var rootFiber = sourceFiber;
19573 var _errorInfo2 = createCapturedValue(value, rootFiber);
19574 var _update2 = createRootErrorUpdate(rootFiber, _errorInfo2, expirationTime);
19575 enqueueUpdate(rootFiber, _update2);
19576 scheduleWork(rootFiber, expirationTime);
19577 }
19578}
19579
19580function computeThreadID(expirationTime, interactionThreadID) {
19581 // Interaction threads are unique per root and expiration time.
19582 return expirationTime * 1000 + interactionThreadID;
19583}
19584
19585// Creates a unique async expiration time.
19586function computeUniqueAsyncExpiration() {
19587 var currentTime = requestCurrentTime();
19588 var result = computeAsyncExpiration(currentTime);
19589 if (result >= lastUniqueAsyncExpiration) {
19590 // Since we assume the current time monotonically increases, we only hit
19591 // this branch when computeUniqueAsyncExpiration is fired multiple times
19592 // within a 200ms window (or whatever the async bucket size is).
19593 result = lastUniqueAsyncExpiration - 1;
19594 }
19595 lastUniqueAsyncExpiration = result;
19596 return lastUniqueAsyncExpiration;
19597}
19598
19599function computeExpirationForFiber(currentTime, fiber) {
19600 var priorityLevel = unstable_getCurrentPriorityLevel();
19601
19602 var expirationTime = void 0;
19603 if ((fiber.mode & ConcurrentMode) === NoContext) {
19604 // Outside of concurrent mode, updates are always synchronous.
19605 expirationTime = Sync;
19606 } else if (isWorking && !isCommitting$1) {
19607 // During render phase, updates expire during as the current render.
19608 expirationTime = nextRenderExpirationTime;
19609 } else {
19610 switch (priorityLevel) {
19611 case unstable_ImmediatePriority:
19612 expirationTime = Sync;
19613 break;
19614 case unstable_UserBlockingPriority:
19615 expirationTime = computeInteractiveExpiration(currentTime);
19616 break;
19617 case unstable_NormalPriority:
19618 // This is a normal, concurrent update
19619 expirationTime = computeAsyncExpiration(currentTime);
19620 break;
19621 case unstable_LowPriority:
19622 case unstable_IdlePriority:
19623 expirationTime = Never;
19624 break;
19625 default:
19626 invariant(false, 'Unknown priority level. This error is likely caused by a bug in React. Please file an issue.');
19627 }
19628
19629 // If we're in the middle of rendering a tree, do not update at the same
19630 // expiration time that is already rendering.
19631 if (nextRoot !== null && expirationTime === nextRenderExpirationTime) {
19632 expirationTime -= 1;
19633 }
19634 }
19635
19636 // Keep track of the lowest pending interactive expiration time. This
19637 // allows us to synchronously flush all interactive updates
19638 // when needed.
19639 // TODO: Move this to renderer?
19640 if (priorityLevel === unstable_UserBlockingPriority && (lowestPriorityPendingInteractiveExpirationTime === NoWork || expirationTime < lowestPriorityPendingInteractiveExpirationTime)) {
19641 lowestPriorityPendingInteractiveExpirationTime = expirationTime;
19642 }
19643
19644 return expirationTime;
19645}
19646
19647function renderDidSuspend(root, absoluteTimeoutMs, suspendedTime) {
19648 // Schedule the timeout.
19649 if (absoluteTimeoutMs >= 0 && nextLatestAbsoluteTimeoutMs < absoluteTimeoutMs) {
19650 nextLatestAbsoluteTimeoutMs = absoluteTimeoutMs;
19651 }
19652}
19653
19654function renderDidError() {
19655 nextRenderDidError = true;
19656}
19657
19658function pingSuspendedRoot(root, thenable, pingTime) {
19659 // A promise that previously suspended React from committing has resolved.
19660 // If React is still suspended, try again at the previous level (pingTime).
19661
19662 var pingCache = root.pingCache;
19663 if (pingCache !== null) {
19664 // The thenable resolved, so we no longer need to memoize, because it will
19665 // never be thrown again.
19666 pingCache.delete(thenable);
19667 }
19668
19669 if (nextRoot !== null && nextRenderExpirationTime === pingTime) {
19670 // Received a ping at the same priority level at which we're currently
19671 // rendering. Restart from the root.
19672 nextRoot = null;
19673 } else {
19674 // Confirm that the root is still suspended at this level. Otherwise exit.
19675 if (isPriorityLevelSuspended(root, pingTime)) {
19676 // Ping at the original level
19677 markPingedPriorityLevel(root, pingTime);
19678 var rootExpirationTime = root.expirationTime;
19679 if (rootExpirationTime !== NoWork) {
19680 requestWork(root, rootExpirationTime);
19681 }
19682 }
19683 }
19684}
19685
19686function retryTimedOutBoundary(boundaryFiber, thenable) {
19687 // The boundary fiber (a Suspense component) previously timed out and was
19688 // rendered in its fallback state. One of the promises that suspended it has
19689 // resolved, which means at least part of the tree was likely unblocked. Try
19690 var retryCache = void 0;
19691 if (enableSuspenseServerRenderer) {
19692 switch (boundaryFiber.tag) {
19693 case SuspenseComponent:
19694 retryCache = boundaryFiber.stateNode;
19695 break;
19696 case DehydratedSuspenseComponent:
19697 retryCache = boundaryFiber.memoizedState;
19698 break;
19699 default:
19700 invariant(false, 'Pinged unknown suspense boundary type. This is probably a bug in React.');
19701 }
19702 } else {
19703 retryCache = boundaryFiber.stateNode;
19704 }
19705 if (retryCache !== null) {
19706 // The thenable resolved, so we no longer need to memoize, because it will
19707 // never be thrown again.
19708 retryCache.delete(thenable);
19709 }
19710
19711 var currentTime = requestCurrentTime();
19712 var retryTime = computeExpirationForFiber(currentTime, boundaryFiber);
19713 var root = scheduleWorkToRoot(boundaryFiber, retryTime);
19714 if (root !== null) {
19715 markPendingPriorityLevel(root, retryTime);
19716 var rootExpirationTime = root.expirationTime;
19717 if (rootExpirationTime !== NoWork) {
19718 requestWork(root, rootExpirationTime);
19719 }
19720 }
19721}
19722
19723function scheduleWorkToRoot(fiber, expirationTime) {
19724 recordScheduleUpdate();
19725
19726 {
19727 if (fiber.tag === ClassComponent) {
19728 var instance = fiber.stateNode;
19729 warnAboutInvalidUpdates(instance);
19730 }
19731 }
19732
19733 // Update the source fiber's expiration time
19734 if (fiber.expirationTime < expirationTime) {
19735 fiber.expirationTime = expirationTime;
19736 }
19737 var alternate = fiber.alternate;
19738 if (alternate !== null && alternate.expirationTime < expirationTime) {
19739 alternate.expirationTime = expirationTime;
19740 }
19741 // Walk the parent path to the root and update the child expiration time.
19742 var node = fiber.return;
19743 var root = null;
19744 if (node === null && fiber.tag === HostRoot) {
19745 root = fiber.stateNode;
19746 } else {
19747 while (node !== null) {
19748 alternate = node.alternate;
19749 if (node.childExpirationTime < expirationTime) {
19750 node.childExpirationTime = expirationTime;
19751 if (alternate !== null && alternate.childExpirationTime < expirationTime) {
19752 alternate.childExpirationTime = expirationTime;
19753 }
19754 } else if (alternate !== null && alternate.childExpirationTime < expirationTime) {
19755 alternate.childExpirationTime = expirationTime;
19756 }
19757 if (node.return === null && node.tag === HostRoot) {
19758 root = node.stateNode;
19759 break;
19760 }
19761 node = node.return;
19762 }
19763 }
19764
19765 if (enableSchedulerTracing) {
19766 if (root !== null) {
19767 var interactions = __interactionsRef.current;
19768 if (interactions.size > 0) {
19769 var pendingInteractionMap = root.pendingInteractionMap;
19770 var pendingInteractions = pendingInteractionMap.get(expirationTime);
19771 if (pendingInteractions != null) {
19772 interactions.forEach(function (interaction) {
19773 if (!pendingInteractions.has(interaction)) {
19774 // Update the pending async work count for previously unscheduled interaction.
19775 interaction.__count++;
19776 }
19777
19778 pendingInteractions.add(interaction);
19779 });
19780 } else {
19781 pendingInteractionMap.set(expirationTime, new Set(interactions));
19782
19783 // Update the pending async work count for the current interactions.
19784 interactions.forEach(function (interaction) {
19785 interaction.__count++;
19786 });
19787 }
19788
19789 var subscriber = __subscriberRef.current;
19790 if (subscriber !== null) {
19791 var threadID = computeThreadID(expirationTime, root.interactionThreadID);
19792 subscriber.onWorkScheduled(interactions, threadID);
19793 }
19794 }
19795 }
19796 }
19797 return root;
19798}
19799
19800function warnIfNotCurrentlyBatchingInDev(fiber) {
19801 {
19802 if (isRendering === false && isBatchingUpdates === false) {
19803 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));
19804 }
19805 }
19806}
19807
19808function scheduleWork(fiber, expirationTime) {
19809 var root = scheduleWorkToRoot(fiber, expirationTime);
19810 if (root === null) {
19811 {
19812 switch (fiber.tag) {
19813 case ClassComponent:
19814 warnAboutUpdateOnUnmounted(fiber, true);
19815 break;
19816 case FunctionComponent:
19817 case ForwardRef:
19818 case MemoComponent:
19819 case SimpleMemoComponent:
19820 warnAboutUpdateOnUnmounted(fiber, false);
19821 break;
19822 }
19823 }
19824 return;
19825 }
19826
19827 if (!isWorking && nextRenderExpirationTime !== NoWork && expirationTime > nextRenderExpirationTime) {
19828 // This is an interruption. (Used for performance tracking.)
19829 interruptedBy = fiber;
19830 resetStack();
19831 }
19832 markPendingPriorityLevel(root, expirationTime);
19833 if (
19834 // If we're in the render phase, we don't need to schedule this root
19835 // for an update, because we'll do it before we exit...
19836 !isWorking || isCommitting$1 ||
19837 // ...unless this is a different root than the one we're rendering.
19838 nextRoot !== root) {
19839 var rootExpirationTime = root.expirationTime;
19840 requestWork(root, rootExpirationTime);
19841 }
19842 if (nestedUpdateCount > NESTED_UPDATE_LIMIT) {
19843 // Reset this back to zero so subsequent updates don't throw.
19844 nestedUpdateCount = 0;
19845 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.');
19846 }
19847}
19848
19849function syncUpdates(fn, a, b, c, d) {
19850 return unstable_runWithPriority(unstable_ImmediatePriority, function () {
19851 return fn(a, b, c, d);
19852 });
19853}
19854
19855// TODO: Everything below this is written as if it has been lifted to the
19856// renderers. I'll do this in a follow-up.
19857
19858// Linked-list of roots
19859var firstScheduledRoot = null;
19860var lastScheduledRoot = null;
19861
19862var callbackExpirationTime = NoWork;
19863var callbackID = void 0;
19864var isRendering = false;
19865var nextFlushedRoot = null;
19866var nextFlushedExpirationTime = NoWork;
19867var lowestPriorityPendingInteractiveExpirationTime = NoWork;
19868var hasUnhandledError = false;
19869var unhandledError = null;
19870
19871var isBatchingUpdates = false;
19872var isUnbatchingUpdates = false;
19873
19874var completedBatches = null;
19875
19876var originalStartTimeMs = unstable_now();
19877var currentRendererTime = msToExpirationTime(originalStartTimeMs);
19878var currentSchedulerTime = currentRendererTime;
19879
19880// Use these to prevent an infinite loop of nested updates
19881var NESTED_UPDATE_LIMIT = 50;
19882var nestedUpdateCount = 0;
19883var lastCommittedRootDuringThisBatch = null;
19884
19885function recomputeCurrentRendererTime() {
19886 var currentTimeMs = unstable_now() - originalStartTimeMs;
19887 currentRendererTime = msToExpirationTime(currentTimeMs);
19888}
19889
19890function scheduleCallbackWithExpirationTime(root, expirationTime) {
19891 if (callbackExpirationTime !== NoWork) {
19892 // A callback is already scheduled. Check its expiration time (timeout).
19893 if (expirationTime < callbackExpirationTime) {
19894 // Existing callback has sufficient timeout. Exit.
19895 return;
19896 } else {
19897 if (callbackID !== null) {
19898 // Existing callback has insufficient timeout. Cancel and schedule a
19899 // new one.
19900 unstable_cancelCallback(callbackID);
19901 }
19902 }
19903 // The request callback timer is already running. Don't start a new one.
19904 } else {
19905 startRequestCallbackTimer();
19906 }
19907
19908 callbackExpirationTime = expirationTime;
19909 var currentMs = unstable_now() - originalStartTimeMs;
19910 var expirationTimeMs = expirationTimeToMs(expirationTime);
19911 var timeout = expirationTimeMs - currentMs;
19912 callbackID = unstable_scheduleCallback(performAsyncWork, { timeout: timeout });
19913}
19914
19915// For every call to renderRoot, one of onFatal, onComplete, onSuspend, and
19916// onYield is called upon exiting. We use these in lieu of returning a tuple.
19917// I've also chosen not to inline them into renderRoot because these will
19918// eventually be lifted into the renderer.
19919function onFatal(root) {
19920 root.finishedWork = null;
19921}
19922
19923function onComplete(root, finishedWork, expirationTime) {
19924 root.pendingCommitExpirationTime = expirationTime;
19925 root.finishedWork = finishedWork;
19926}
19927
19928function onSuspend(root, finishedWork, suspendedExpirationTime, rootExpirationTime, msUntilTimeout) {
19929 root.expirationTime = rootExpirationTime;
19930 if (msUntilTimeout === 0 && !shouldYieldToRenderer()) {
19931 // Don't wait an additional tick. Commit the tree immediately.
19932 root.pendingCommitExpirationTime = suspendedExpirationTime;
19933 root.finishedWork = finishedWork;
19934 } else if (msUntilTimeout > 0) {
19935 // Wait `msUntilTimeout` milliseconds before committing.
19936 root.timeoutHandle = scheduleTimeout(onTimeout.bind(null, root, finishedWork, suspendedExpirationTime), msUntilTimeout);
19937 }
19938}
19939
19940function onYield(root) {
19941 root.finishedWork = null;
19942}
19943
19944function onTimeout(root, finishedWork, suspendedExpirationTime) {
19945 // The root timed out. Commit it.
19946 root.pendingCommitExpirationTime = suspendedExpirationTime;
19947 root.finishedWork = finishedWork;
19948 // Read the current time before entering the commit phase. We can be
19949 // certain this won't cause tearing related to batching of event updates
19950 // because we're at the top of a timer event.
19951 recomputeCurrentRendererTime();
19952 currentSchedulerTime = currentRendererTime;
19953 flushRoot(root, suspendedExpirationTime);
19954}
19955
19956function onCommit(root, expirationTime) {
19957 root.expirationTime = expirationTime;
19958 root.finishedWork = null;
19959}
19960
19961function requestCurrentTime() {
19962 // requestCurrentTime is called by the scheduler to compute an expiration
19963 // time.
19964 //
19965 // Expiration times are computed by adding to the current time (the start
19966 // time). However, if two updates are scheduled within the same event, we
19967 // should treat their start times as simultaneous, even if the actual clock
19968 // time has advanced between the first and second call.
19969
19970 // In other words, because expiration times determine how updates are batched,
19971 // we want all updates of like priority that occur within the same event to
19972 // receive the same expiration time. Otherwise we get tearing.
19973 //
19974 // We keep track of two separate times: the current "renderer" time and the
19975 // current "scheduler" time. The renderer time can be updated whenever; it
19976 // only exists to minimize the calls performance.now.
19977 //
19978 // But the scheduler time can only be updated if there's no pending work, or
19979 // if we know for certain that we're not in the middle of an event.
19980
19981 if (isRendering) {
19982 // We're already rendering. Return the most recently read time.
19983 return currentSchedulerTime;
19984 }
19985 // Check if there's pending work.
19986 findHighestPriorityRoot();
19987 if (nextFlushedExpirationTime === NoWork || nextFlushedExpirationTime === Never) {
19988 // If there's no pending work, or if the pending work is offscreen, we can
19989 // read the current time without risk of tearing.
19990 recomputeCurrentRendererTime();
19991 currentSchedulerTime = currentRendererTime;
19992 return currentSchedulerTime;
19993 }
19994 // There's already pending work. We might be in the middle of a browser
19995 // event. If we were to read the current time, it could cause multiple updates
19996 // within the same event to receive different expiration times, leading to
19997 // tearing. Return the last read time. During the next idle callback, the
19998 // time will be updated.
19999 return currentSchedulerTime;
20000}
20001
20002// requestWork is called by the scheduler whenever a root receives an update.
20003// It's up to the renderer to call renderRoot at some point in the future.
20004function requestWork(root, expirationTime) {
20005 addRootToSchedule(root, expirationTime);
20006 if (isRendering) {
20007 // Prevent reentrancy. Remaining work will be scheduled at the end of
20008 // the currently rendering batch.
20009 return;
20010 }
20011
20012 if (isBatchingUpdates) {
20013 // Flush work at the end of the batch.
20014 if (isUnbatchingUpdates) {
20015 // ...unless we're inside unbatchedUpdates, in which case we should
20016 // flush it now.
20017 nextFlushedRoot = root;
20018 nextFlushedExpirationTime = Sync;
20019 performWorkOnRoot(root, Sync, false);
20020 }
20021 return;
20022 }
20023
20024 // TODO: Get rid of Sync and use current time?
20025 if (expirationTime === Sync) {
20026 performSyncWork();
20027 } else {
20028 scheduleCallbackWithExpirationTime(root, expirationTime);
20029 }
20030}
20031
20032function addRootToSchedule(root, expirationTime) {
20033 // Add the root to the schedule.
20034 // Check if this root is already part of the schedule.
20035 if (root.nextScheduledRoot === null) {
20036 // This root is not already scheduled. Add it.
20037 root.expirationTime = expirationTime;
20038 if (lastScheduledRoot === null) {
20039 firstScheduledRoot = lastScheduledRoot = root;
20040 root.nextScheduledRoot = root;
20041 } else {
20042 lastScheduledRoot.nextScheduledRoot = root;
20043 lastScheduledRoot = root;
20044 lastScheduledRoot.nextScheduledRoot = firstScheduledRoot;
20045 }
20046 } else {
20047 // This root is already scheduled, but its priority may have increased.
20048 var remainingExpirationTime = root.expirationTime;
20049 if (expirationTime > remainingExpirationTime) {
20050 // Update the priority.
20051 root.expirationTime = expirationTime;
20052 }
20053 }
20054}
20055
20056function findHighestPriorityRoot() {
20057 var highestPriorityWork = NoWork;
20058 var highestPriorityRoot = null;
20059 if (lastScheduledRoot !== null) {
20060 var previousScheduledRoot = lastScheduledRoot;
20061 var root = firstScheduledRoot;
20062 while (root !== null) {
20063 var remainingExpirationTime = root.expirationTime;
20064 if (remainingExpirationTime === NoWork) {
20065 // This root no longer has work. Remove it from the scheduler.
20066
20067 // TODO: This check is redudant, but Flow is confused by the branch
20068 // below where we set lastScheduledRoot to null, even though we break
20069 // from the loop right after.
20070 !(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;
20071 if (root === root.nextScheduledRoot) {
20072 // This is the only root in the list.
20073 root.nextScheduledRoot = null;
20074 firstScheduledRoot = lastScheduledRoot = null;
20075 break;
20076 } else if (root === firstScheduledRoot) {
20077 // This is the first root in the list.
20078 var next = root.nextScheduledRoot;
20079 firstScheduledRoot = next;
20080 lastScheduledRoot.nextScheduledRoot = next;
20081 root.nextScheduledRoot = null;
20082 } else if (root === lastScheduledRoot) {
20083 // This is the last root in the list.
20084 lastScheduledRoot = previousScheduledRoot;
20085 lastScheduledRoot.nextScheduledRoot = firstScheduledRoot;
20086 root.nextScheduledRoot = null;
20087 break;
20088 } else {
20089 previousScheduledRoot.nextScheduledRoot = root.nextScheduledRoot;
20090 root.nextScheduledRoot = null;
20091 }
20092 root = previousScheduledRoot.nextScheduledRoot;
20093 } else {
20094 if (remainingExpirationTime > highestPriorityWork) {
20095 // Update the priority, if it's higher
20096 highestPriorityWork = remainingExpirationTime;
20097 highestPriorityRoot = root;
20098 }
20099 if (root === lastScheduledRoot) {
20100 break;
20101 }
20102 if (highestPriorityWork === Sync) {
20103 // Sync is highest priority by definition so
20104 // we can stop searching.
20105 break;
20106 }
20107 previousScheduledRoot = root;
20108 root = root.nextScheduledRoot;
20109 }
20110 }
20111 }
20112
20113 nextFlushedRoot = highestPriorityRoot;
20114 nextFlushedExpirationTime = highestPriorityWork;
20115}
20116
20117// TODO: This wrapper exists because many of the older tests (the ones that use
20118// flushDeferredPri) rely on the number of times `shouldYield` is called. We
20119// should get rid of it.
20120var didYield = false;
20121function shouldYieldToRenderer() {
20122 if (didYield) {
20123 return true;
20124 }
20125 if (unstable_shouldYield()) {
20126 didYield = true;
20127 return true;
20128 }
20129 return false;
20130}
20131
20132function performAsyncWork() {
20133 try {
20134 if (!shouldYieldToRenderer()) {
20135 // The callback timed out. That means at least one update has expired.
20136 // Iterate through the root schedule. If they contain expired work, set
20137 // the next render expiration time to the current time. This has the effect
20138 // of flushing all expired work in a single batch, instead of flushing each
20139 // level one at a time.
20140 if (firstScheduledRoot !== null) {
20141 recomputeCurrentRendererTime();
20142 var root = firstScheduledRoot;
20143 do {
20144 didExpireAtExpirationTime(root, currentRendererTime);
20145 // The root schedule is circular, so this is never null.
20146 root = root.nextScheduledRoot;
20147 } while (root !== firstScheduledRoot);
20148 }
20149 }
20150 performWork(NoWork, true);
20151 } finally {
20152 didYield = false;
20153 }
20154}
20155
20156function performSyncWork() {
20157 performWork(Sync, false);
20158}
20159
20160function performWork(minExpirationTime, isYieldy) {
20161 // Keep working on roots until there's no more work, or until there's a higher
20162 // priority event.
20163 findHighestPriorityRoot();
20164
20165 if (isYieldy) {
20166 recomputeCurrentRendererTime();
20167 currentSchedulerTime = currentRendererTime;
20168
20169 if (enableUserTimingAPI) {
20170 var didExpire = nextFlushedExpirationTime > currentRendererTime;
20171 var timeout = expirationTimeToMs(nextFlushedExpirationTime);
20172 stopRequestCallbackTimer(didExpire, timeout);
20173 }
20174
20175 while (nextFlushedRoot !== null && nextFlushedExpirationTime !== NoWork && minExpirationTime <= nextFlushedExpirationTime && !(didYield && currentRendererTime > nextFlushedExpirationTime)) {
20176 performWorkOnRoot(nextFlushedRoot, nextFlushedExpirationTime, currentRendererTime > nextFlushedExpirationTime);
20177 findHighestPriorityRoot();
20178 recomputeCurrentRendererTime();
20179 currentSchedulerTime = currentRendererTime;
20180 }
20181 } else {
20182 while (nextFlushedRoot !== null && nextFlushedExpirationTime !== NoWork && minExpirationTime <= nextFlushedExpirationTime) {
20183 performWorkOnRoot(nextFlushedRoot, nextFlushedExpirationTime, false);
20184 findHighestPriorityRoot();
20185 }
20186 }
20187
20188 // We're done flushing work. Either we ran out of time in this callback,
20189 // or there's no more work left with sufficient priority.
20190
20191 // If we're inside a callback, set this to false since we just completed it.
20192 if (isYieldy) {
20193 callbackExpirationTime = NoWork;
20194 callbackID = null;
20195 }
20196 // If there's work left over, schedule a new callback.
20197 if (nextFlushedExpirationTime !== NoWork) {
20198 scheduleCallbackWithExpirationTime(nextFlushedRoot, nextFlushedExpirationTime);
20199 }
20200
20201 // Clean-up.
20202 finishRendering();
20203}
20204
20205function flushRoot(root, expirationTime) {
20206 !!isRendering ? invariant(false, 'work.commit(): Cannot commit while already rendering. This likely means you attempted to commit from inside a lifecycle method.') : void 0;
20207 // Perform work on root as if the given expiration time is the current time.
20208 // This has the effect of synchronously flushing all work up to and
20209 // including the given time.
20210 nextFlushedRoot = root;
20211 nextFlushedExpirationTime = expirationTime;
20212 performWorkOnRoot(root, expirationTime, false);
20213 // Flush any sync work that was scheduled by lifecycles
20214 performSyncWork();
20215}
20216
20217function finishRendering() {
20218 nestedUpdateCount = 0;
20219 lastCommittedRootDuringThisBatch = null;
20220
20221 if (completedBatches !== null) {
20222 var batches = completedBatches;
20223 completedBatches = null;
20224 for (var i = 0; i < batches.length; i++) {
20225 var batch = batches[i];
20226 try {
20227 batch._onComplete();
20228 } catch (error) {
20229 if (!hasUnhandledError) {
20230 hasUnhandledError = true;
20231 unhandledError = error;
20232 }
20233 }
20234 }
20235 }
20236
20237 if (hasUnhandledError) {
20238 var error = unhandledError;
20239 unhandledError = null;
20240 hasUnhandledError = false;
20241 throw error;
20242 }
20243}
20244
20245function performWorkOnRoot(root, expirationTime, isYieldy) {
20246 !!isRendering ? invariant(false, 'performWorkOnRoot was called recursively. This error is likely caused by a bug in React. Please file an issue.') : void 0;
20247
20248 isRendering = true;
20249
20250 // Check if this is async work or sync/expired work.
20251 if (!isYieldy) {
20252 // Flush work without yielding.
20253 // TODO: Non-yieldy work does not necessarily imply expired work. A renderer
20254 // may want to perform some work without yielding, but also without
20255 // requiring the root to complete (by triggering placeholders).
20256
20257 var finishedWork = root.finishedWork;
20258 if (finishedWork !== null) {
20259 // This root is already complete. We can commit it.
20260 completeRoot(root, finishedWork, expirationTime);
20261 } else {
20262 root.finishedWork = null;
20263 // If this root previously suspended, clear its existing timeout, since
20264 // we're about to try rendering again.
20265 var timeoutHandle = root.timeoutHandle;
20266 if (timeoutHandle !== noTimeout) {
20267 root.timeoutHandle = noTimeout;
20268 // $FlowFixMe Complains noTimeout is not a TimeoutID, despite the check above
20269 cancelTimeout(timeoutHandle);
20270 }
20271 renderRoot(root, isYieldy);
20272 finishedWork = root.finishedWork;
20273 if (finishedWork !== null) {
20274 // We've completed the root. Commit it.
20275 completeRoot(root, finishedWork, expirationTime);
20276 }
20277 }
20278 } else {
20279 // Flush async work.
20280 var _finishedWork = root.finishedWork;
20281 if (_finishedWork !== null) {
20282 // This root is already complete. We can commit it.
20283 completeRoot(root, _finishedWork, expirationTime);
20284 } else {
20285 root.finishedWork = null;
20286 // If this root previously suspended, clear its existing timeout, since
20287 // we're about to try rendering again.
20288 var _timeoutHandle = root.timeoutHandle;
20289 if (_timeoutHandle !== noTimeout) {
20290 root.timeoutHandle = noTimeout;
20291 // $FlowFixMe Complains noTimeout is not a TimeoutID, despite the check above
20292 cancelTimeout(_timeoutHandle);
20293 }
20294 renderRoot(root, isYieldy);
20295 _finishedWork = root.finishedWork;
20296 if (_finishedWork !== null) {
20297 // We've completed the root. Check the if we should yield one more time
20298 // before committing.
20299 if (!shouldYieldToRenderer()) {
20300 // Still time left. Commit the root.
20301 completeRoot(root, _finishedWork, expirationTime);
20302 } else {
20303 // There's no time left. Mark this root as complete. We'll come
20304 // back and commit it later.
20305 root.finishedWork = _finishedWork;
20306 }
20307 }
20308 }
20309 }
20310
20311 isRendering = false;
20312}
20313
20314function completeRoot(root, finishedWork, expirationTime) {
20315 // Check if there's a batch that matches this expiration time.
20316 var firstBatch = root.firstBatch;
20317 if (firstBatch !== null && firstBatch._expirationTime >= expirationTime) {
20318 if (completedBatches === null) {
20319 completedBatches = [firstBatch];
20320 } else {
20321 completedBatches.push(firstBatch);
20322 }
20323 if (firstBatch._defer) {
20324 // This root is blocked from committing by a batch. Unschedule it until
20325 // we receive another update.
20326 root.finishedWork = finishedWork;
20327 root.expirationTime = NoWork;
20328 return;
20329 }
20330 }
20331
20332 // Commit the root.
20333 root.finishedWork = null;
20334
20335 // Check if this is a nested update (a sync update scheduled during the
20336 // commit phase).
20337 if (root === lastCommittedRootDuringThisBatch) {
20338 // If the next root is the same as the previous root, this is a nested
20339 // update. To prevent an infinite loop, increment the nested update count.
20340 nestedUpdateCount++;
20341 } else {
20342 // Reset whenever we switch roots.
20343 lastCommittedRootDuringThisBatch = root;
20344 nestedUpdateCount = 0;
20345 }
20346 unstable_runWithPriority(unstable_ImmediatePriority, function () {
20347 commitRoot(root, finishedWork);
20348 });
20349}
20350
20351function onUncaughtError(error) {
20352 !(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;
20353 // Unschedule this root so we don't work on it again until there's
20354 // another update.
20355 nextFlushedRoot.expirationTime = NoWork;
20356 if (!hasUnhandledError) {
20357 hasUnhandledError = true;
20358 unhandledError = error;
20359 }
20360}
20361
20362// TODO: Batching should be implemented at the renderer level, not inside
20363// the reconciler.
20364function batchedUpdates$1(fn, a) {
20365 var previousIsBatchingUpdates = isBatchingUpdates;
20366 isBatchingUpdates = true;
20367 try {
20368 return fn(a);
20369 } finally {
20370 isBatchingUpdates = previousIsBatchingUpdates;
20371 if (!isBatchingUpdates && !isRendering) {
20372 performSyncWork();
20373 }
20374 }
20375}
20376
20377// TODO: Batching should be implemented at the renderer level, not inside
20378// the reconciler.
20379function unbatchedUpdates(fn, a) {
20380 if (isBatchingUpdates && !isUnbatchingUpdates) {
20381 isUnbatchingUpdates = true;
20382 try {
20383 return fn(a);
20384 } finally {
20385 isUnbatchingUpdates = false;
20386 }
20387 }
20388 return fn(a);
20389}
20390
20391// TODO: Batching should be implemented at the renderer level, not within
20392// the reconciler.
20393function flushSync(fn, a) {
20394 !!isRendering ? invariant(false, 'flushSync was called from inside a lifecycle method. It cannot be called when React is already rendering.') : void 0;
20395 var previousIsBatchingUpdates = isBatchingUpdates;
20396 isBatchingUpdates = true;
20397 try {
20398 return syncUpdates(fn, a);
20399 } finally {
20400 isBatchingUpdates = previousIsBatchingUpdates;
20401 performSyncWork();
20402 }
20403}
20404
20405function interactiveUpdates$1(fn, a, b) {
20406 // If there are any pending interactive updates, synchronously flush them.
20407 // This needs to happen before we read any handlers, because the effect of
20408 // the previous event may influence which handlers are called during
20409 // this event.
20410 if (!isBatchingUpdates && !isRendering && lowestPriorityPendingInteractiveExpirationTime !== NoWork) {
20411 // Synchronously flush pending interactive updates.
20412 performWork(lowestPriorityPendingInteractiveExpirationTime, false);
20413 lowestPriorityPendingInteractiveExpirationTime = NoWork;
20414 }
20415 var previousIsBatchingUpdates = isBatchingUpdates;
20416 isBatchingUpdates = true;
20417 try {
20418 return unstable_runWithPriority(unstable_UserBlockingPriority, function () {
20419 return fn(a, b);
20420 });
20421 } finally {
20422 isBatchingUpdates = previousIsBatchingUpdates;
20423 if (!isBatchingUpdates && !isRendering) {
20424 performSyncWork();
20425 }
20426 }
20427}
20428
20429function flushInteractiveUpdates$1() {
20430 if (!isRendering && lowestPriorityPendingInteractiveExpirationTime !== NoWork) {
20431 // Synchronously flush pending interactive updates.
20432 performWork(lowestPriorityPendingInteractiveExpirationTime, false);
20433 lowestPriorityPendingInteractiveExpirationTime = NoWork;
20434 }
20435}
20436
20437function flushControlled(fn) {
20438 var previousIsBatchingUpdates = isBatchingUpdates;
20439 isBatchingUpdates = true;
20440 try {
20441 syncUpdates(fn);
20442 } finally {
20443 isBatchingUpdates = previousIsBatchingUpdates;
20444 if (!isBatchingUpdates && !isRendering) {
20445 performSyncWork();
20446 }
20447 }
20448}
20449
20450// 0 is PROD, 1 is DEV.
20451// Might add PROFILE later.
20452
20453
20454var didWarnAboutNestedUpdates = void 0;
20455var didWarnAboutFindNodeInStrictMode = void 0;
20456
20457{
20458 didWarnAboutNestedUpdates = false;
20459 didWarnAboutFindNodeInStrictMode = {};
20460}
20461
20462function getContextForSubtree(parentComponent) {
20463 if (!parentComponent) {
20464 return emptyContextObject;
20465 }
20466
20467 var fiber = get(parentComponent);
20468 var parentContext = findCurrentUnmaskedContext(fiber);
20469
20470 if (fiber.tag === ClassComponent) {
20471 var Component = fiber.type;
20472 if (isContextProvider(Component)) {
20473 return processChildContext(fiber, Component, parentContext);
20474 }
20475 }
20476
20477 return parentContext;
20478}
20479
20480function scheduleRootUpdate(current$$1, element, expirationTime, callback) {
20481 {
20482 if (phase === 'render' && current !== null && !didWarnAboutNestedUpdates) {
20483 didWarnAboutNestedUpdates = true;
20484 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');
20485 }
20486 }
20487
20488 var update = createUpdate(expirationTime);
20489 // Caution: React DevTools currently depends on this property
20490 // being called "element".
20491 update.payload = { element: element };
20492
20493 callback = callback === undefined ? null : callback;
20494 if (callback !== null) {
20495 !(typeof callback === 'function') ? warningWithoutStack$1(false, 'render(...): Expected the last optional `callback` argument to be a ' + 'function. Instead received: %s.', callback) : void 0;
20496 update.callback = callback;
20497 }
20498
20499 flushPassiveEffects();
20500 enqueueUpdate(current$$1, update);
20501 scheduleWork(current$$1, expirationTime);
20502
20503 return expirationTime;
20504}
20505
20506function updateContainerAtExpirationTime(element, container, parentComponent, expirationTime, callback) {
20507 // TODO: If this is a nested container, this won't be the root.
20508 var current$$1 = container.current;
20509
20510 {
20511 if (ReactFiberInstrumentation_1.debugTool) {
20512 if (current$$1.alternate === null) {
20513 ReactFiberInstrumentation_1.debugTool.onMountContainer(container);
20514 } else if (element === null) {
20515 ReactFiberInstrumentation_1.debugTool.onUnmountContainer(container);
20516 } else {
20517 ReactFiberInstrumentation_1.debugTool.onUpdateContainer(container);
20518 }
20519 }
20520 }
20521
20522 var context = getContextForSubtree(parentComponent);
20523 if (container.context === null) {
20524 container.context = context;
20525 } else {
20526 container.pendingContext = context;
20527 }
20528
20529 return scheduleRootUpdate(current$$1, element, expirationTime, callback);
20530}
20531
20532function findHostInstance(component) {
20533 var fiber = get(component);
20534 if (fiber === undefined) {
20535 if (typeof component.render === 'function') {
20536 invariant(false, 'Unable to find node on an unmounted component.');
20537 } else {
20538 invariant(false, 'Argument appears to not be a ReactComponent. Keys: %s', Object.keys(component));
20539 }
20540 }
20541 var hostFiber = findCurrentHostFiber(fiber);
20542 if (hostFiber === null) {
20543 return null;
20544 }
20545 return hostFiber.stateNode;
20546}
20547
20548function findHostInstanceWithWarning(component, methodName) {
20549 {
20550 var fiber = get(component);
20551 if (fiber === undefined) {
20552 if (typeof component.render === 'function') {
20553 invariant(false, 'Unable to find node on an unmounted component.');
20554 } else {
20555 invariant(false, 'Argument appears to not be a ReactComponent. Keys: %s', Object.keys(component));
20556 }
20557 }
20558 var hostFiber = findCurrentHostFiber(fiber);
20559 if (hostFiber === null) {
20560 return null;
20561 }
20562 if (hostFiber.mode & StrictMode) {
20563 var componentName = getComponentName(fiber.type) || 'Component';
20564 if (!didWarnAboutFindNodeInStrictMode[componentName]) {
20565 didWarnAboutFindNodeInStrictMode[componentName] = true;
20566 if (fiber.mode & StrictMode) {
20567 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));
20568 } else {
20569 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));
20570 }
20571 }
20572 }
20573 return hostFiber.stateNode;
20574 }
20575 return findHostInstance(component);
20576}
20577
20578function createContainer(containerInfo, isConcurrent, hydrate) {
20579 return createFiberRoot(containerInfo, isConcurrent, hydrate);
20580}
20581
20582function updateContainer(element, container, parentComponent, callback) {
20583 var current$$1 = container.current;
20584 var currentTime = requestCurrentTime();
20585 var expirationTime = computeExpirationForFiber(currentTime, current$$1);
20586 return updateContainerAtExpirationTime(element, container, parentComponent, expirationTime, callback);
20587}
20588
20589function getPublicRootInstance(container) {
20590 var containerFiber = container.current;
20591 if (!containerFiber.child) {
20592 return null;
20593 }
20594 switch (containerFiber.child.tag) {
20595 case HostComponent:
20596 return getPublicInstance(containerFiber.child.stateNode);
20597 default:
20598 return containerFiber.child.stateNode;
20599 }
20600}
20601
20602function findHostInstanceWithNoPortals(fiber) {
20603 var hostFiber = findCurrentHostFiberWithNoPortals(fiber);
20604 if (hostFiber === null) {
20605 return null;
20606 }
20607 return hostFiber.stateNode;
20608}
20609
20610var overrideProps = null;
20611
20612{
20613 var copyWithSetImpl = function (obj, path, idx, value) {
20614 if (idx >= path.length) {
20615 return value;
20616 }
20617 var key = path[idx];
20618 var updated = Array.isArray(obj) ? obj.slice() : _assign({}, obj);
20619 // $FlowFixMe number or string is fine here
20620 updated[key] = copyWithSetImpl(obj[key], path, idx + 1, value);
20621 return updated;
20622 };
20623
20624 var copyWithSet = function (obj, path, value) {
20625 return copyWithSetImpl(obj, path, 0, value);
20626 };
20627
20628 // Support DevTools props for function components, forwardRef, memo, host components, etc.
20629 overrideProps = function (fiber, path, value) {
20630 flushPassiveEffects();
20631 fiber.pendingProps = copyWithSet(fiber.memoizedProps, path, value);
20632 if (fiber.alternate) {
20633 fiber.alternate.pendingProps = fiber.pendingProps;
20634 }
20635 scheduleWork(fiber, Sync);
20636 };
20637}
20638
20639function injectIntoDevTools(devToolsConfig) {
20640 var findFiberByHostInstance = devToolsConfig.findFiberByHostInstance;
20641 var ReactCurrentDispatcher = ReactSharedInternals.ReactCurrentDispatcher;
20642
20643
20644 return injectInternals(_assign({}, devToolsConfig, {
20645 overrideProps: overrideProps,
20646 currentDispatcherRef: ReactCurrentDispatcher,
20647 findHostInstanceByFiber: function (fiber) {
20648 var hostFiber = findCurrentHostFiber(fiber);
20649 if (hostFiber === null) {
20650 return null;
20651 }
20652 return hostFiber.stateNode;
20653 },
20654 findFiberByHostInstance: function (instance) {
20655 if (!findFiberByHostInstance) {
20656 // Might not be implemented by the renderer.
20657 return null;
20658 }
20659 return findFiberByHostInstance(instance);
20660 }
20661 }));
20662}
20663
20664// This file intentionally does *not* have the Flow annotation.
20665// Don't add it. See `./inline-typed.js` for an explanation.
20666
20667function createPortal$1(children, containerInfo,
20668// TODO: figure out the API for cross-renderer implementation.
20669implementation) {
20670 var key = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : null;
20671
20672 return {
20673 // This tag allow us to uniquely identify this as a React Portal
20674 $$typeof: REACT_PORTAL_TYPE,
20675 key: key == null ? null : '' + key,
20676 children: children,
20677 containerInfo: containerInfo,
20678 implementation: implementation
20679 };
20680}
20681
20682// TODO: this is special because it gets imported during build.
20683
20684var ReactVersion = '16.8.2';
20685
20686// TODO: This type is shared between the reconciler and ReactDOM, but will
20687// eventually be lifted out to the renderer.
20688
20689var ReactCurrentOwner = ReactSharedInternals.ReactCurrentOwner;
20690
20691var topLevelUpdateWarnings = void 0;
20692var warnOnInvalidCallback = void 0;
20693var didWarnAboutUnstableCreatePortal = false;
20694
20695{
20696 if (typeof Map !== 'function' ||
20697 // $FlowIssue Flow incorrectly thinks Map has no prototype
20698 Map.prototype == null || typeof Map.prototype.forEach !== 'function' || typeof Set !== 'function' ||
20699 // $FlowIssue Flow incorrectly thinks Set has no prototype
20700 Set.prototype == null || typeof Set.prototype.clear !== 'function' || typeof Set.prototype.forEach !== 'function') {
20701 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');
20702 }
20703
20704 topLevelUpdateWarnings = function (container) {
20705 if (container._reactRootContainer && container.nodeType !== COMMENT_NODE) {
20706 var hostInstance = findHostInstanceWithNoPortals(container._reactRootContainer._internalRoot.current);
20707 if (hostInstance) {
20708 !(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;
20709 }
20710 }
20711
20712 var isRootRenderedBySomeReact = !!container._reactRootContainer;
20713 var rootEl = getReactRootElementInContainer(container);
20714 var hasNonRootReactChild = !!(rootEl && getInstanceFromNode$1(rootEl));
20715
20716 !(!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;
20717
20718 !(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;
20719 };
20720
20721 warnOnInvalidCallback = function (callback, callerName) {
20722 !(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;
20723 };
20724}
20725
20726setRestoreImplementation(restoreControlledState$1);
20727
20728function ReactBatch(root) {
20729 var expirationTime = computeUniqueAsyncExpiration();
20730 this._expirationTime = expirationTime;
20731 this._root = root;
20732 this._next = null;
20733 this._callbacks = null;
20734 this._didComplete = false;
20735 this._hasChildren = false;
20736 this._children = null;
20737 this._defer = true;
20738}
20739ReactBatch.prototype.render = function (children) {
20740 !this._defer ? invariant(false, 'batch.render: Cannot render a batch that already committed.') : void 0;
20741 this._hasChildren = true;
20742 this._children = children;
20743 var internalRoot = this._root._internalRoot;
20744 var expirationTime = this._expirationTime;
20745 var work = new ReactWork();
20746 updateContainerAtExpirationTime(children, internalRoot, null, expirationTime, work._onCommit);
20747 return work;
20748};
20749ReactBatch.prototype.then = function (onComplete) {
20750 if (this._didComplete) {
20751 onComplete();
20752 return;
20753 }
20754 var callbacks = this._callbacks;
20755 if (callbacks === null) {
20756 callbacks = this._callbacks = [];
20757 }
20758 callbacks.push(onComplete);
20759};
20760ReactBatch.prototype.commit = function () {
20761 var internalRoot = this._root._internalRoot;
20762 var firstBatch = internalRoot.firstBatch;
20763 !(this._defer && firstBatch !== null) ? invariant(false, 'batch.commit: Cannot commit a batch multiple times.') : void 0;
20764
20765 if (!this._hasChildren) {
20766 // This batch is empty. Return.
20767 this._next = null;
20768 this._defer = false;
20769 return;
20770 }
20771
20772 var expirationTime = this._expirationTime;
20773
20774 // Ensure this is the first batch in the list.
20775 if (firstBatch !== this) {
20776 // This batch is not the earliest batch. We need to move it to the front.
20777 // Update its expiration time to be the expiration time of the earliest
20778 // batch, so that we can flush it without flushing the other batches.
20779 if (this._hasChildren) {
20780 expirationTime = this._expirationTime = firstBatch._expirationTime;
20781 // Rendering this batch again ensures its children will be the final state
20782 // when we flush (updates are processed in insertion order: last
20783 // update wins).
20784 // TODO: This forces a restart. Should we print a warning?
20785 this.render(this._children);
20786 }
20787
20788 // Remove the batch from the list.
20789 var previous = null;
20790 var batch = firstBatch;
20791 while (batch !== this) {
20792 previous = batch;
20793 batch = batch._next;
20794 }
20795 !(previous !== null) ? invariant(false, 'batch.commit: Cannot commit a batch multiple times.') : void 0;
20796 previous._next = batch._next;
20797
20798 // Add it to the front.
20799 this._next = firstBatch;
20800 firstBatch = internalRoot.firstBatch = this;
20801 }
20802
20803 // Synchronously flush all the work up to this batch's expiration time.
20804 this._defer = false;
20805 flushRoot(internalRoot, expirationTime);
20806
20807 // Pop the batch from the list.
20808 var next = this._next;
20809 this._next = null;
20810 firstBatch = internalRoot.firstBatch = next;
20811
20812 // Append the next earliest batch's children to the update queue.
20813 if (firstBatch !== null && firstBatch._hasChildren) {
20814 firstBatch.render(firstBatch._children);
20815 }
20816};
20817ReactBatch.prototype._onComplete = function () {
20818 if (this._didComplete) {
20819 return;
20820 }
20821 this._didComplete = true;
20822 var callbacks = this._callbacks;
20823 if (callbacks === null) {
20824 return;
20825 }
20826 // TODO: Error handling.
20827 for (var i = 0; i < callbacks.length; i++) {
20828 var _callback = callbacks[i];
20829 _callback();
20830 }
20831};
20832
20833function ReactWork() {
20834 this._callbacks = null;
20835 this._didCommit = false;
20836 // TODO: Avoid need to bind by replacing callbacks in the update queue with
20837 // list of Work objects.
20838 this._onCommit = this._onCommit.bind(this);
20839}
20840ReactWork.prototype.then = function (onCommit) {
20841 if (this._didCommit) {
20842 onCommit();
20843 return;
20844 }
20845 var callbacks = this._callbacks;
20846 if (callbacks === null) {
20847 callbacks = this._callbacks = [];
20848 }
20849 callbacks.push(onCommit);
20850};
20851ReactWork.prototype._onCommit = function () {
20852 if (this._didCommit) {
20853 return;
20854 }
20855 this._didCommit = true;
20856 var callbacks = this._callbacks;
20857 if (callbacks === null) {
20858 return;
20859 }
20860 // TODO: Error handling.
20861 for (var i = 0; i < callbacks.length; i++) {
20862 var _callback2 = callbacks[i];
20863 !(typeof _callback2 === 'function') ? invariant(false, 'Invalid argument passed as callback. Expected a function. Instead received: %s', _callback2) : void 0;
20864 _callback2();
20865 }
20866};
20867
20868function ReactRoot(container, isConcurrent, hydrate) {
20869 var root = createContainer(container, isConcurrent, hydrate);
20870 this._internalRoot = root;
20871}
20872ReactRoot.prototype.render = function (children, callback) {
20873 var root = this._internalRoot;
20874 var work = new ReactWork();
20875 callback = callback === undefined ? null : callback;
20876 {
20877 warnOnInvalidCallback(callback, 'render');
20878 }
20879 if (callback !== null) {
20880 work.then(callback);
20881 }
20882 updateContainer(children, root, null, work._onCommit);
20883 return work;
20884};
20885ReactRoot.prototype.unmount = function (callback) {
20886 var root = this._internalRoot;
20887 var work = new ReactWork();
20888 callback = callback === undefined ? null : callback;
20889 {
20890 warnOnInvalidCallback(callback, 'render');
20891 }
20892 if (callback !== null) {
20893 work.then(callback);
20894 }
20895 updateContainer(null, root, null, work._onCommit);
20896 return work;
20897};
20898ReactRoot.prototype.legacy_renderSubtreeIntoContainer = function (parentComponent, children, callback) {
20899 var root = this._internalRoot;
20900 var work = new ReactWork();
20901 callback = callback === undefined ? null : callback;
20902 {
20903 warnOnInvalidCallback(callback, 'render');
20904 }
20905 if (callback !== null) {
20906 work.then(callback);
20907 }
20908 updateContainer(children, root, parentComponent, work._onCommit);
20909 return work;
20910};
20911ReactRoot.prototype.createBatch = function () {
20912 var batch = new ReactBatch(this);
20913 var expirationTime = batch._expirationTime;
20914
20915 var internalRoot = this._internalRoot;
20916 var firstBatch = internalRoot.firstBatch;
20917 if (firstBatch === null) {
20918 internalRoot.firstBatch = batch;
20919 batch._next = null;
20920 } else {
20921 // Insert sorted by expiration time then insertion order
20922 var insertAfter = null;
20923 var insertBefore = firstBatch;
20924 while (insertBefore !== null && insertBefore._expirationTime >= expirationTime) {
20925 insertAfter = insertBefore;
20926 insertBefore = insertBefore._next;
20927 }
20928 batch._next = insertBefore;
20929 if (insertAfter !== null) {
20930 insertAfter._next = batch;
20931 }
20932 }
20933
20934 return batch;
20935};
20936
20937/**
20938 * True if the supplied DOM node is a valid node element.
20939 *
20940 * @param {?DOMElement} node The candidate DOM node.
20941 * @return {boolean} True if the DOM is a valid DOM node.
20942 * @internal
20943 */
20944function isValidContainer(node) {
20945 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 '));
20946}
20947
20948function getReactRootElementInContainer(container) {
20949 if (!container) {
20950 return null;
20951 }
20952
20953 if (container.nodeType === DOCUMENT_NODE) {
20954 return container.documentElement;
20955 } else {
20956 return container.firstChild;
20957 }
20958}
20959
20960function shouldHydrateDueToLegacyHeuristic(container) {
20961 var rootElement = getReactRootElementInContainer(container);
20962 return !!(rootElement && rootElement.nodeType === ELEMENT_NODE && rootElement.hasAttribute(ROOT_ATTRIBUTE_NAME));
20963}
20964
20965setBatchingImplementation(batchedUpdates$1, interactiveUpdates$1, flushInteractiveUpdates$1);
20966
20967var warnedAboutHydrateAPI = false;
20968
20969function legacyCreateRootFromDOMContainer(container, forceHydrate) {
20970 var shouldHydrate = forceHydrate || shouldHydrateDueToLegacyHeuristic(container);
20971 // First clear any existing content.
20972 if (!shouldHydrate) {
20973 var warned = false;
20974 var rootSibling = void 0;
20975 while (rootSibling = container.lastChild) {
20976 {
20977 if (!warned && rootSibling.nodeType === ELEMENT_NODE && rootSibling.hasAttribute(ROOT_ATTRIBUTE_NAME)) {
20978 warned = true;
20979 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.');
20980 }
20981 }
20982 container.removeChild(rootSibling);
20983 }
20984 }
20985 {
20986 if (shouldHydrate && !forceHydrate && !warnedAboutHydrateAPI) {
20987 warnedAboutHydrateAPI = true;
20988 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.');
20989 }
20990 }
20991 // Legacy roots are not async by default.
20992 var isConcurrent = false;
20993 return new ReactRoot(container, isConcurrent, shouldHydrate);
20994}
20995
20996function legacyRenderSubtreeIntoContainer(parentComponent, children, container, forceHydrate, callback) {
20997 {
20998 topLevelUpdateWarnings(container);
20999 }
21000
21001 // TODO: Without `any` type, Flow says "Property cannot be accessed on any
21002 // member of intersection type." Whyyyyyy.
21003 var root = container._reactRootContainer;
21004 if (!root) {
21005 // Initial mount
21006 root = container._reactRootContainer = legacyCreateRootFromDOMContainer(container, forceHydrate);
21007 if (typeof callback === 'function') {
21008 var originalCallback = callback;
21009 callback = function () {
21010 var instance = getPublicRootInstance(root._internalRoot);
21011 originalCallback.call(instance);
21012 };
21013 }
21014 // Initial mount should not be batched.
21015 unbatchedUpdates(function () {
21016 if (parentComponent != null) {
21017 root.legacy_renderSubtreeIntoContainer(parentComponent, children, callback);
21018 } else {
21019 root.render(children, callback);
21020 }
21021 });
21022 } else {
21023 if (typeof callback === 'function') {
21024 var _originalCallback = callback;
21025 callback = function () {
21026 var instance = getPublicRootInstance(root._internalRoot);
21027 _originalCallback.call(instance);
21028 };
21029 }
21030 // Update
21031 if (parentComponent != null) {
21032 root.legacy_renderSubtreeIntoContainer(parentComponent, children, callback);
21033 } else {
21034 root.render(children, callback);
21035 }
21036 }
21037 return getPublicRootInstance(root._internalRoot);
21038}
21039
21040function createPortal$$1(children, container) {
21041 var key = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : null;
21042
21043 !isValidContainer(container) ? invariant(false, 'Target container is not a DOM element.') : void 0;
21044 // TODO: pass ReactDOM portal implementation as third argument
21045 return createPortal$1(children, container, null, key);
21046}
21047
21048var ReactDOM = {
21049 createPortal: createPortal$$1,
21050
21051 findDOMNode: function (componentOrElement) {
21052 {
21053 var owner = ReactCurrentOwner.current;
21054 if (owner !== null && owner.stateNode !== null) {
21055 var warnedAboutRefsInRender = owner.stateNode._warnedAboutRefsInRender;
21056 !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;
21057 owner.stateNode._warnedAboutRefsInRender = true;
21058 }
21059 }
21060 if (componentOrElement == null) {
21061 return null;
21062 }
21063 if (componentOrElement.nodeType === ELEMENT_NODE) {
21064 return componentOrElement;
21065 }
21066 {
21067 return findHostInstanceWithWarning(componentOrElement, 'findDOMNode');
21068 }
21069 return findHostInstance(componentOrElement);
21070 },
21071 hydrate: function (element, container, callback) {
21072 !isValidContainer(container) ? invariant(false, 'Target container is not a DOM element.') : void 0;
21073 {
21074 !!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;
21075 }
21076 // TODO: throw or warn if we couldn't hydrate?
21077 return legacyRenderSubtreeIntoContainer(null, element, container, true, callback);
21078 },
21079 render: function (element, container, callback) {
21080 !isValidContainer(container) ? invariant(false, 'Target container is not a DOM element.') : void 0;
21081 {
21082 !!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;
21083 }
21084 return legacyRenderSubtreeIntoContainer(null, element, container, false, callback);
21085 },
21086 unstable_renderSubtreeIntoContainer: function (parentComponent, element, containerNode, callback) {
21087 !isValidContainer(containerNode) ? invariant(false, 'Target container is not a DOM element.') : void 0;
21088 !(parentComponent != null && has(parentComponent)) ? invariant(false, 'parentComponent must be a valid React Component') : void 0;
21089 return legacyRenderSubtreeIntoContainer(parentComponent, element, containerNode, false, callback);
21090 },
21091 unmountComponentAtNode: function (container) {
21092 !isValidContainer(container) ? invariant(false, 'unmountComponentAtNode(...): Target container is not a DOM element.') : void 0;
21093
21094 {
21095 !!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;
21096 }
21097
21098 if (container._reactRootContainer) {
21099 {
21100 var rootEl = getReactRootElementInContainer(container);
21101 var renderedByDifferentReact = rootEl && !getInstanceFromNode$1(rootEl);
21102 !!renderedByDifferentReact ? warningWithoutStack$1(false, "unmountComponentAtNode(): The node you're attempting to unmount " + 'was rendered by another copy of React.') : void 0;
21103 }
21104
21105 // Unmount should not be batched.
21106 unbatchedUpdates(function () {
21107 legacyRenderSubtreeIntoContainer(null, null, container, false, function () {
21108 container._reactRootContainer = null;
21109 });
21110 });
21111 // If you call unmountComponentAtNode twice in quick succession, you'll
21112 // get `true` twice. That's probably fine?
21113 return true;
21114 } else {
21115 {
21116 var _rootEl = getReactRootElementInContainer(container);
21117 var hasNonRootReactChild = !!(_rootEl && getInstanceFromNode$1(_rootEl));
21118
21119 // Check if the container itself is a React root node.
21120 var isContainerReactRoot = container.nodeType === ELEMENT_NODE && isValidContainer(container.parentNode) && !!container.parentNode._reactRootContainer;
21121
21122 !!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;
21123 }
21124
21125 return false;
21126 }
21127 },
21128
21129
21130 // Temporary alias since we already shipped React 16 RC with it.
21131 // TODO: remove in React 17.
21132 unstable_createPortal: function () {
21133 if (!didWarnAboutUnstableCreatePortal) {
21134 didWarnAboutUnstableCreatePortal = true;
21135 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.');
21136 }
21137 return createPortal$$1.apply(undefined, arguments);
21138 },
21139
21140
21141 unstable_batchedUpdates: batchedUpdates$1,
21142
21143 unstable_interactiveUpdates: interactiveUpdates$1,
21144
21145 flushSync: flushSync,
21146
21147 unstable_createRoot: createRoot,
21148 unstable_flushControlled: flushControlled,
21149
21150 __SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED: {
21151 // Keep in sync with ReactDOMUnstableNativeDependencies.js
21152 // and ReactTestUtils.js. This is an array for better minification.
21153 Events: [getInstanceFromNode$1, getNodeFromInstance$1, getFiberCurrentPropsFromNode$1, injection.injectEventPluginsByName, eventNameDispatchConfigs, accumulateTwoPhaseDispatches, accumulateDirectDispatches, enqueueStateRestore, restoreStateIfNeeded, dispatchEvent, runEventsInBatch]
21154 }
21155};
21156
21157function createRoot(container, options) {
21158 var functionName = enableStableConcurrentModeAPIs ? 'createRoot' : 'unstable_createRoot';
21159 !isValidContainer(container) ? invariant(false, '%s(...): Target container is not a DOM element.', functionName) : void 0;
21160 {
21161 !!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;
21162 container._reactHasBeenPassedToCreateRootDEV = true;
21163 }
21164 var hydrate = options != null && options.hydrate === true;
21165 return new ReactRoot(container, true, hydrate);
21166}
21167
21168if (enableStableConcurrentModeAPIs) {
21169 ReactDOM.createRoot = createRoot;
21170 ReactDOM.unstable_createRoot = undefined;
21171}
21172
21173var foundDevTools = injectIntoDevTools({
21174 findFiberByHostInstance: getClosestInstanceFromNode,
21175 bundleType: 1,
21176 version: ReactVersion,
21177 rendererPackageName: 'react-dom'
21178});
21179
21180{
21181 if (!foundDevTools && canUseDOM && window.top === window.self) {
21182 // If we're in Chrome or Firefox, provide a download link if not installed.
21183 if (navigator.userAgent.indexOf('Chrome') > -1 && navigator.userAgent.indexOf('Edge') === -1 || navigator.userAgent.indexOf('Firefox') > -1) {
21184 var protocol = window.location.protocol;
21185 // Don't warn in exotic cases like chrome-extension://.
21186 if (/^(https?|file):$/.test(protocol)) {
21187 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');
21188 }
21189 }
21190 }
21191}
21192
21193
21194
21195var ReactDOM$2 = Object.freeze({
21196 default: ReactDOM
21197});
21198
21199var ReactDOM$3 = ( ReactDOM$2 && ReactDOM ) || ReactDOM$2;
21200
21201// TODO: decide on the top-level export form.
21202// This is hacky but makes it work with both Rollup and Jest.
21203var reactDom = ReactDOM$3.default || ReactDOM$3;
21204
21205return reactDom;
21206
21207})));