UNPKG

784 kBJavaScriptView Raw
1/** @license React v16.8.3
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 // Don't persist the state accumlated from the render phase updates to
13226 // the base state unless the queue is empty.
13227 // TODO: Not sure if this is the desired semantics, but it's what we
13228 // do for gDSFP. I can't remember why.
13229 if (hook.baseUpdate === queue.last) {
13230 hook.baseState = newState;
13231 }
13232
13233 queue.eagerReducer = reducer;
13234 queue.eagerState = newState;
13235
13236 return [newState, _dispatch];
13237 }
13238 }
13239 return [hook.memoizedState, _dispatch];
13240 }
13241
13242 // The last update in the entire queue
13243 var last = queue.last;
13244 // The last update that is part of the base state.
13245 var baseUpdate = hook.baseUpdate;
13246 var baseState = hook.baseState;
13247
13248 // Find the first unprocessed update.
13249 var first = void 0;
13250 if (baseUpdate !== null) {
13251 if (last !== null) {
13252 // For the first update, the queue is a circular linked list where
13253 // `queue.last.next = queue.first`. Once the first update commits, and
13254 // the `baseUpdate` is no longer empty, we can unravel the list.
13255 last.next = null;
13256 }
13257 first = baseUpdate.next;
13258 } else {
13259 first = last !== null ? last.next : null;
13260 }
13261 if (first !== null) {
13262 var _newState = baseState;
13263 var newBaseState = null;
13264 var newBaseUpdate = null;
13265 var prevUpdate = baseUpdate;
13266 var _update = first;
13267 var didSkip = false;
13268 do {
13269 var updateExpirationTime = _update.expirationTime;
13270 if (updateExpirationTime < renderExpirationTime) {
13271 // Priority is insufficient. Skip this update. If this is the first
13272 // skipped update, the previous update/state is the new base
13273 // update/state.
13274 if (!didSkip) {
13275 didSkip = true;
13276 newBaseUpdate = prevUpdate;
13277 newBaseState = _newState;
13278 }
13279 // Update the remaining priority in the queue.
13280 if (updateExpirationTime > remainingExpirationTime) {
13281 remainingExpirationTime = updateExpirationTime;
13282 }
13283 } else {
13284 // Process this update.
13285 if (_update.eagerReducer === reducer) {
13286 // If this update was processed eagerly, and its reducer matches the
13287 // current reducer, we can use the eagerly computed state.
13288 _newState = _update.eagerState;
13289 } else {
13290 var _action2 = _update.action;
13291 _newState = reducer(_newState, _action2);
13292 }
13293 }
13294 prevUpdate = _update;
13295 _update = _update.next;
13296 } while (_update !== null && _update !== first);
13297
13298 if (!didSkip) {
13299 newBaseUpdate = prevUpdate;
13300 newBaseState = _newState;
13301 }
13302
13303 // Mark that the fiber performed work, but only if the new state is
13304 // different from the current state.
13305 if (!is(_newState, hook.memoizedState)) {
13306 markWorkInProgressReceivedUpdate();
13307 }
13308
13309 hook.memoizedState = _newState;
13310 hook.baseUpdate = newBaseUpdate;
13311 hook.baseState = newBaseState;
13312
13313 queue.eagerReducer = reducer;
13314 queue.eagerState = _newState;
13315 }
13316
13317 var dispatch = queue.dispatch;
13318 return [hook.memoizedState, dispatch];
13319}
13320
13321function mountState(initialState) {
13322 var hook = mountWorkInProgressHook();
13323 if (typeof initialState === 'function') {
13324 initialState = initialState();
13325 }
13326 hook.memoizedState = hook.baseState = initialState;
13327 var queue = hook.queue = {
13328 last: null,
13329 dispatch: null,
13330 eagerReducer: basicStateReducer,
13331 eagerState: initialState
13332 };
13333 var dispatch = queue.dispatch = dispatchAction.bind(null,
13334 // Flow doesn't know this is non-null, but we do.
13335 currentlyRenderingFiber$1, queue);
13336 return [hook.memoizedState, dispatch];
13337}
13338
13339function updateState(initialState) {
13340 return updateReducer(basicStateReducer, initialState);
13341}
13342
13343function pushEffect(tag, create, destroy, deps) {
13344 var effect = {
13345 tag: tag,
13346 create: create,
13347 destroy: destroy,
13348 deps: deps,
13349 // Circular
13350 next: null
13351 };
13352 if (componentUpdateQueue === null) {
13353 componentUpdateQueue = createFunctionComponentUpdateQueue();
13354 componentUpdateQueue.lastEffect = effect.next = effect;
13355 } else {
13356 var _lastEffect = componentUpdateQueue.lastEffect;
13357 if (_lastEffect === null) {
13358 componentUpdateQueue.lastEffect = effect.next = effect;
13359 } else {
13360 var firstEffect = _lastEffect.next;
13361 _lastEffect.next = effect;
13362 effect.next = firstEffect;
13363 componentUpdateQueue.lastEffect = effect;
13364 }
13365 }
13366 return effect;
13367}
13368
13369function mountRef(initialValue) {
13370 var hook = mountWorkInProgressHook();
13371 var ref = { current: initialValue };
13372 {
13373 Object.seal(ref);
13374 }
13375 hook.memoizedState = ref;
13376 return ref;
13377}
13378
13379function updateRef(initialValue) {
13380 var hook = updateWorkInProgressHook();
13381 return hook.memoizedState;
13382}
13383
13384function mountEffectImpl(fiberEffectTag, hookEffectTag, create, deps) {
13385 var hook = mountWorkInProgressHook();
13386 var nextDeps = deps === undefined ? null : deps;
13387 sideEffectTag |= fiberEffectTag;
13388 hook.memoizedState = pushEffect(hookEffectTag, create, undefined, nextDeps);
13389}
13390
13391function updateEffectImpl(fiberEffectTag, hookEffectTag, create, deps) {
13392 var hook = updateWorkInProgressHook();
13393 var nextDeps = deps === undefined ? null : deps;
13394 var destroy = undefined;
13395
13396 if (currentHook !== null) {
13397 var prevEffect = currentHook.memoizedState;
13398 destroy = prevEffect.destroy;
13399 if (nextDeps !== null) {
13400 var prevDeps = prevEffect.deps;
13401 if (areHookInputsEqual(nextDeps, prevDeps)) {
13402 pushEffect(NoEffect$1, create, destroy, nextDeps);
13403 return;
13404 }
13405 }
13406 }
13407
13408 sideEffectTag |= fiberEffectTag;
13409 hook.memoizedState = pushEffect(hookEffectTag, create, destroy, nextDeps);
13410}
13411
13412function mountEffect(create, deps) {
13413 return mountEffectImpl(Update | Passive, UnmountPassive | MountPassive, create, deps);
13414}
13415
13416function updateEffect(create, deps) {
13417 return updateEffectImpl(Update | Passive, UnmountPassive | MountPassive, create, deps);
13418}
13419
13420function mountLayoutEffect(create, deps) {
13421 return mountEffectImpl(Update, UnmountMutation | MountLayout, create, deps);
13422}
13423
13424function updateLayoutEffect(create, deps) {
13425 return updateEffectImpl(Update, UnmountMutation | MountLayout, create, deps);
13426}
13427
13428function imperativeHandleEffect(create, ref) {
13429 if (typeof ref === 'function') {
13430 var refCallback = ref;
13431 var _inst = create();
13432 refCallback(_inst);
13433 return function () {
13434 refCallback(null);
13435 };
13436 } else if (ref !== null && ref !== undefined) {
13437 var refObject = ref;
13438 {
13439 !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;
13440 }
13441 var _inst2 = create();
13442 refObject.current = _inst2;
13443 return function () {
13444 refObject.current = null;
13445 };
13446 }
13447}
13448
13449function mountImperativeHandle(ref, create, deps) {
13450 {
13451 !(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;
13452 }
13453
13454 // TODO: If deps are provided, should we skip comparing the ref itself?
13455 var effectDeps = deps !== null && deps !== undefined ? deps.concat([ref]) : null;
13456
13457 return mountEffectImpl(Update, UnmountMutation | MountLayout, imperativeHandleEffect.bind(null, create, ref), effectDeps);
13458}
13459
13460function updateImperativeHandle(ref, create, deps) {
13461 {
13462 !(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;
13463 }
13464
13465 // TODO: If deps are provided, should we skip comparing the ref itself?
13466 var effectDeps = deps !== null && deps !== undefined ? deps.concat([ref]) : null;
13467
13468 return updateEffectImpl(Update, UnmountMutation | MountLayout, imperativeHandleEffect.bind(null, create, ref), effectDeps);
13469}
13470
13471function mountDebugValue(value, formatterFn) {
13472 // This hook is normally a no-op.
13473 // The react-debug-hooks package injects its own implementation
13474 // so that e.g. DevTools can display custom hook values.
13475}
13476
13477var updateDebugValue = mountDebugValue;
13478
13479function mountCallback(callback, deps) {
13480 var hook = mountWorkInProgressHook();
13481 var nextDeps = deps === undefined ? null : deps;
13482 hook.memoizedState = [callback, nextDeps];
13483 return callback;
13484}
13485
13486function updateCallback(callback, deps) {
13487 var hook = updateWorkInProgressHook();
13488 var nextDeps = deps === undefined ? null : deps;
13489 var prevState = hook.memoizedState;
13490 if (prevState !== null) {
13491 if (nextDeps !== null) {
13492 var prevDeps = prevState[1];
13493 if (areHookInputsEqual(nextDeps, prevDeps)) {
13494 return prevState[0];
13495 }
13496 }
13497 }
13498 hook.memoizedState = [callback, nextDeps];
13499 return callback;
13500}
13501
13502function mountMemo(nextCreate, deps) {
13503 var hook = mountWorkInProgressHook();
13504 var nextDeps = deps === undefined ? null : deps;
13505 var nextValue = nextCreate();
13506 hook.memoizedState = [nextValue, nextDeps];
13507 return nextValue;
13508}
13509
13510function updateMemo(nextCreate, deps) {
13511 var hook = updateWorkInProgressHook();
13512 var nextDeps = deps === undefined ? null : deps;
13513 var prevState = hook.memoizedState;
13514 if (prevState !== null) {
13515 // Assume these are defined. If they're not, areHookInputsEqual will warn.
13516 if (nextDeps !== null) {
13517 var prevDeps = prevState[1];
13518 if (areHookInputsEqual(nextDeps, prevDeps)) {
13519 return prevState[0];
13520 }
13521 }
13522 }
13523 var nextValue = nextCreate();
13524 hook.memoizedState = [nextValue, nextDeps];
13525 return nextValue;
13526}
13527
13528// in a test-like environment, we want to warn if dispatchAction()
13529// is called outside of a batchedUpdates/TestUtils.act(...) call.
13530var shouldWarnForUnbatchedSetState = false;
13531
13532{
13533 // jest isn't a 'global', it's just exposed to tests via a wrapped function
13534 // further, this isn't a test file, so flow doesn't recognize the symbol. So...
13535 // $FlowExpectedError - because requirements don't give a damn about your type sigs.
13536 if ('undefined' !== typeof jest) {
13537 shouldWarnForUnbatchedSetState = true;
13538 }
13539}
13540
13541function dispatchAction(fiber, queue, action) {
13542 !(numberOfReRenders < RE_RENDER_LIMIT) ? invariant(false, 'Too many re-renders. React limits the number of renders to prevent an infinite loop.') : void 0;
13543
13544 {
13545 !(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;
13546 }
13547
13548 var alternate = fiber.alternate;
13549 if (fiber === currentlyRenderingFiber$1 || alternate !== null && alternate === currentlyRenderingFiber$1) {
13550 // This is a render phase update. Stash it in a lazily-created map of
13551 // queue -> linked list of updates. After this render pass, we'll restart
13552 // and apply the stashed updates on top of the work-in-progress hook.
13553 didScheduleRenderPhaseUpdate = true;
13554 var update = {
13555 expirationTime: renderExpirationTime,
13556 action: action,
13557 eagerReducer: null,
13558 eagerState: null,
13559 next: null
13560 };
13561 if (renderPhaseUpdates === null) {
13562 renderPhaseUpdates = new Map();
13563 }
13564 var firstRenderPhaseUpdate = renderPhaseUpdates.get(queue);
13565 if (firstRenderPhaseUpdate === undefined) {
13566 renderPhaseUpdates.set(queue, update);
13567 } else {
13568 // Append the update to the end of the list.
13569 var lastRenderPhaseUpdate = firstRenderPhaseUpdate;
13570 while (lastRenderPhaseUpdate.next !== null) {
13571 lastRenderPhaseUpdate = lastRenderPhaseUpdate.next;
13572 }
13573 lastRenderPhaseUpdate.next = update;
13574 }
13575 } else {
13576 flushPassiveEffects();
13577
13578 var currentTime = requestCurrentTime();
13579 var _expirationTime = computeExpirationForFiber(currentTime, fiber);
13580
13581 var _update2 = {
13582 expirationTime: _expirationTime,
13583 action: action,
13584 eagerReducer: null,
13585 eagerState: null,
13586 next: null
13587 };
13588
13589 // Append the update to the end of the list.
13590 var _last = queue.last;
13591 if (_last === null) {
13592 // This is the first update. Create a circular list.
13593 _update2.next = _update2;
13594 } else {
13595 var first = _last.next;
13596 if (first !== null) {
13597 // Still circular.
13598 _update2.next = first;
13599 }
13600 _last.next = _update2;
13601 }
13602 queue.last = _update2;
13603
13604 if (fiber.expirationTime === NoWork && (alternate === null || alternate.expirationTime === NoWork)) {
13605 // The queue is currently empty, which means we can eagerly compute the
13606 // next state before entering the render phase. If the new state is the
13607 // same as the current state, we may be able to bail out entirely.
13608 var _eagerReducer = queue.eagerReducer;
13609 if (_eagerReducer !== null) {
13610 var prevDispatcher = void 0;
13611 {
13612 prevDispatcher = ReactCurrentDispatcher$1.current;
13613 ReactCurrentDispatcher$1.current = InvalidNestedHooksDispatcherOnUpdateInDEV;
13614 }
13615 try {
13616 var currentState = queue.eagerState;
13617 var _eagerState = _eagerReducer(currentState, action);
13618 // Stash the eagerly computed state, and the reducer used to compute
13619 // it, on the update object. If the reducer hasn't changed by the
13620 // time we enter the render phase, then the eager state can be used
13621 // without calling the reducer again.
13622 _update2.eagerReducer = _eagerReducer;
13623 _update2.eagerState = _eagerState;
13624 if (is(_eagerState, currentState)) {
13625 // Fast path. We can bail out without scheduling React to re-render.
13626 // It's still possible that we'll need to rebase this update later,
13627 // if the component re-renders for a different reason and by that
13628 // time the reducer has changed.
13629 return;
13630 }
13631 } catch (error) {
13632 // Suppress the error. It will throw again in the render phase.
13633 } finally {
13634 {
13635 ReactCurrentDispatcher$1.current = prevDispatcher;
13636 }
13637 }
13638 }
13639 }
13640 {
13641 if (shouldWarnForUnbatchedSetState === true) {
13642 warnIfNotCurrentlyBatchingInDev(fiber);
13643 }
13644 }
13645 scheduleWork(fiber, _expirationTime);
13646 }
13647}
13648
13649var ContextOnlyDispatcher = {
13650 readContext: readContext,
13651
13652 useCallback: throwInvalidHookError,
13653 useContext: throwInvalidHookError,
13654 useEffect: throwInvalidHookError,
13655 useImperativeHandle: throwInvalidHookError,
13656 useLayoutEffect: throwInvalidHookError,
13657 useMemo: throwInvalidHookError,
13658 useReducer: throwInvalidHookError,
13659 useRef: throwInvalidHookError,
13660 useState: throwInvalidHookError,
13661 useDebugValue: throwInvalidHookError
13662};
13663
13664var HooksDispatcherOnMountInDEV = null;
13665var HooksDispatcherOnUpdateInDEV = null;
13666var InvalidNestedHooksDispatcherOnMountInDEV = null;
13667var InvalidNestedHooksDispatcherOnUpdateInDEV = null;
13668
13669{
13670 var warnInvalidContextAccess = function () {
13671 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().');
13672 };
13673
13674 var warnInvalidHookAccess = function () {
13675 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');
13676 };
13677
13678 HooksDispatcherOnMountInDEV = {
13679 readContext: function (context, observedBits) {
13680 return readContext(context, observedBits);
13681 },
13682 useCallback: function (callback, deps) {
13683 currentHookNameInDev = 'useCallback';
13684 return mountCallback(callback, deps);
13685 },
13686 useContext: function (context, observedBits) {
13687 currentHookNameInDev = 'useContext';
13688 return mountContext(context, observedBits);
13689 },
13690 useEffect: function (create, deps) {
13691 currentHookNameInDev = 'useEffect';
13692 return mountEffect(create, deps);
13693 },
13694 useImperativeHandle: function (ref, create, deps) {
13695 currentHookNameInDev = 'useImperativeHandle';
13696 return mountImperativeHandle(ref, create, deps);
13697 },
13698 useLayoutEffect: function (create, deps) {
13699 currentHookNameInDev = 'useLayoutEffect';
13700 return mountLayoutEffect(create, deps);
13701 },
13702 useMemo: function (create, deps) {
13703 currentHookNameInDev = 'useMemo';
13704 var prevDispatcher = ReactCurrentDispatcher$1.current;
13705 ReactCurrentDispatcher$1.current = InvalidNestedHooksDispatcherOnMountInDEV;
13706 try {
13707 return mountMemo(create, deps);
13708 } finally {
13709 ReactCurrentDispatcher$1.current = prevDispatcher;
13710 }
13711 },
13712 useReducer: function (reducer, initialArg, init) {
13713 currentHookNameInDev = 'useReducer';
13714 var prevDispatcher = ReactCurrentDispatcher$1.current;
13715 ReactCurrentDispatcher$1.current = InvalidNestedHooksDispatcherOnMountInDEV;
13716 try {
13717 return mountReducer(reducer, initialArg, init);
13718 } finally {
13719 ReactCurrentDispatcher$1.current = prevDispatcher;
13720 }
13721 },
13722 useRef: function (initialValue) {
13723 currentHookNameInDev = 'useRef';
13724 return mountRef(initialValue);
13725 },
13726 useState: function (initialState) {
13727 currentHookNameInDev = 'useState';
13728 var prevDispatcher = ReactCurrentDispatcher$1.current;
13729 ReactCurrentDispatcher$1.current = InvalidNestedHooksDispatcherOnMountInDEV;
13730 try {
13731 return mountState(initialState);
13732 } finally {
13733 ReactCurrentDispatcher$1.current = prevDispatcher;
13734 }
13735 },
13736 useDebugValue: function (value, formatterFn) {
13737 currentHookNameInDev = 'useDebugValue';
13738 return mountDebugValue(value, formatterFn);
13739 }
13740 };
13741
13742 HooksDispatcherOnUpdateInDEV = {
13743 readContext: function (context, observedBits) {
13744 return readContext(context, observedBits);
13745 },
13746 useCallback: function (callback, deps) {
13747 currentHookNameInDev = 'useCallback';
13748 return updateCallback(callback, deps);
13749 },
13750 useContext: function (context, observedBits) {
13751 currentHookNameInDev = 'useContext';
13752 return updateContext(context, observedBits);
13753 },
13754 useEffect: function (create, deps) {
13755 currentHookNameInDev = 'useEffect';
13756 return updateEffect(create, deps);
13757 },
13758 useImperativeHandle: function (ref, create, deps) {
13759 currentHookNameInDev = 'useImperativeHandle';
13760 return updateImperativeHandle(ref, create, deps);
13761 },
13762 useLayoutEffect: function (create, deps) {
13763 currentHookNameInDev = 'useLayoutEffect';
13764 return updateLayoutEffect(create, deps);
13765 },
13766 useMemo: function (create, deps) {
13767 currentHookNameInDev = 'useMemo';
13768 var prevDispatcher = ReactCurrentDispatcher$1.current;
13769 ReactCurrentDispatcher$1.current = InvalidNestedHooksDispatcherOnUpdateInDEV;
13770 try {
13771 return updateMemo(create, deps);
13772 } finally {
13773 ReactCurrentDispatcher$1.current = prevDispatcher;
13774 }
13775 },
13776 useReducer: function (reducer, initialArg, init) {
13777 currentHookNameInDev = 'useReducer';
13778 var prevDispatcher = ReactCurrentDispatcher$1.current;
13779 ReactCurrentDispatcher$1.current = InvalidNestedHooksDispatcherOnUpdateInDEV;
13780 try {
13781 return updateReducer(reducer, initialArg, init);
13782 } finally {
13783 ReactCurrentDispatcher$1.current = prevDispatcher;
13784 }
13785 },
13786 useRef: function (initialValue) {
13787 currentHookNameInDev = 'useRef';
13788 return updateRef(initialValue);
13789 },
13790 useState: function (initialState) {
13791 currentHookNameInDev = 'useState';
13792 var prevDispatcher = ReactCurrentDispatcher$1.current;
13793 ReactCurrentDispatcher$1.current = InvalidNestedHooksDispatcherOnUpdateInDEV;
13794 try {
13795 return updateState(initialState);
13796 } finally {
13797 ReactCurrentDispatcher$1.current = prevDispatcher;
13798 }
13799 },
13800 useDebugValue: function (value, formatterFn) {
13801 currentHookNameInDev = 'useDebugValue';
13802 return updateDebugValue(value, formatterFn);
13803 }
13804 };
13805
13806 InvalidNestedHooksDispatcherOnMountInDEV = {
13807 readContext: function (context, observedBits) {
13808 warnInvalidContextAccess();
13809 return readContext(context, observedBits);
13810 },
13811 useCallback: function (callback, deps) {
13812 currentHookNameInDev = 'useCallback';
13813 warnInvalidHookAccess();
13814 return mountCallback(callback, deps);
13815 },
13816 useContext: function (context, observedBits) {
13817 currentHookNameInDev = 'useContext';
13818 warnInvalidHookAccess();
13819 return mountContext(context, observedBits);
13820 },
13821 useEffect: function (create, deps) {
13822 currentHookNameInDev = 'useEffect';
13823 warnInvalidHookAccess();
13824 return mountEffect(create, deps);
13825 },
13826 useImperativeHandle: function (ref, create, deps) {
13827 currentHookNameInDev = 'useImperativeHandle';
13828 warnInvalidHookAccess();
13829 return mountImperativeHandle(ref, create, deps);
13830 },
13831 useLayoutEffect: function (create, deps) {
13832 currentHookNameInDev = 'useLayoutEffect';
13833 warnInvalidHookAccess();
13834 return mountLayoutEffect(create, deps);
13835 },
13836 useMemo: function (create, deps) {
13837 currentHookNameInDev = 'useMemo';
13838 warnInvalidHookAccess();
13839 var prevDispatcher = ReactCurrentDispatcher$1.current;
13840 ReactCurrentDispatcher$1.current = InvalidNestedHooksDispatcherOnMountInDEV;
13841 try {
13842 return mountMemo(create, deps);
13843 } finally {
13844 ReactCurrentDispatcher$1.current = prevDispatcher;
13845 }
13846 },
13847 useReducer: function (reducer, initialArg, init) {
13848 currentHookNameInDev = 'useReducer';
13849 warnInvalidHookAccess();
13850 var prevDispatcher = ReactCurrentDispatcher$1.current;
13851 ReactCurrentDispatcher$1.current = InvalidNestedHooksDispatcherOnMountInDEV;
13852 try {
13853 return mountReducer(reducer, initialArg, init);
13854 } finally {
13855 ReactCurrentDispatcher$1.current = prevDispatcher;
13856 }
13857 },
13858 useRef: function (initialValue) {
13859 currentHookNameInDev = 'useRef';
13860 warnInvalidHookAccess();
13861 return mountRef(initialValue);
13862 },
13863 useState: function (initialState) {
13864 currentHookNameInDev = 'useState';
13865 warnInvalidHookAccess();
13866 var prevDispatcher = ReactCurrentDispatcher$1.current;
13867 ReactCurrentDispatcher$1.current = InvalidNestedHooksDispatcherOnMountInDEV;
13868 try {
13869 return mountState(initialState);
13870 } finally {
13871 ReactCurrentDispatcher$1.current = prevDispatcher;
13872 }
13873 },
13874 useDebugValue: function (value, formatterFn) {
13875 currentHookNameInDev = 'useDebugValue';
13876 warnInvalidHookAccess();
13877 return mountDebugValue(value, formatterFn);
13878 }
13879 };
13880
13881 InvalidNestedHooksDispatcherOnUpdateInDEV = {
13882 readContext: function (context, observedBits) {
13883 warnInvalidContextAccess();
13884 return readContext(context, observedBits);
13885 },
13886 useCallback: function (callback, deps) {
13887 currentHookNameInDev = 'useCallback';
13888 warnInvalidHookAccess();
13889 return updateCallback(callback, deps);
13890 },
13891 useContext: function (context, observedBits) {
13892 currentHookNameInDev = 'useContext';
13893 warnInvalidHookAccess();
13894 return updateContext(context, observedBits);
13895 },
13896 useEffect: function (create, deps) {
13897 currentHookNameInDev = 'useEffect';
13898 warnInvalidHookAccess();
13899 return updateEffect(create, deps);
13900 },
13901 useImperativeHandle: function (ref, create, deps) {
13902 currentHookNameInDev = 'useImperativeHandle';
13903 warnInvalidHookAccess();
13904 return updateImperativeHandle(ref, create, deps);
13905 },
13906 useLayoutEffect: function (create, deps) {
13907 currentHookNameInDev = 'useLayoutEffect';
13908 warnInvalidHookAccess();
13909 return updateLayoutEffect(create, deps);
13910 },
13911 useMemo: function (create, deps) {
13912 currentHookNameInDev = 'useMemo';
13913 warnInvalidHookAccess();
13914 var prevDispatcher = ReactCurrentDispatcher$1.current;
13915 ReactCurrentDispatcher$1.current = InvalidNestedHooksDispatcherOnUpdateInDEV;
13916 try {
13917 return updateMemo(create, deps);
13918 } finally {
13919 ReactCurrentDispatcher$1.current = prevDispatcher;
13920 }
13921 },
13922 useReducer: function (reducer, initialArg, init) {
13923 currentHookNameInDev = 'useReducer';
13924 warnInvalidHookAccess();
13925 var prevDispatcher = ReactCurrentDispatcher$1.current;
13926 ReactCurrentDispatcher$1.current = InvalidNestedHooksDispatcherOnUpdateInDEV;
13927 try {
13928 return updateReducer(reducer, initialArg, init);
13929 } finally {
13930 ReactCurrentDispatcher$1.current = prevDispatcher;
13931 }
13932 },
13933 useRef: function (initialValue) {
13934 currentHookNameInDev = 'useRef';
13935 warnInvalidHookAccess();
13936 return updateRef(initialValue);
13937 },
13938 useState: function (initialState) {
13939 currentHookNameInDev = 'useState';
13940 warnInvalidHookAccess();
13941 var prevDispatcher = ReactCurrentDispatcher$1.current;
13942 ReactCurrentDispatcher$1.current = InvalidNestedHooksDispatcherOnUpdateInDEV;
13943 try {
13944 return updateState(initialState);
13945 } finally {
13946 ReactCurrentDispatcher$1.current = prevDispatcher;
13947 }
13948 },
13949 useDebugValue: function (value, formatterFn) {
13950 currentHookNameInDev = 'useDebugValue';
13951 warnInvalidHookAccess();
13952 return updateDebugValue(value, formatterFn);
13953 }
13954 };
13955}
13956
13957var commitTime = 0;
13958var profilerStartTime = -1;
13959
13960function getCommitTime() {
13961 return commitTime;
13962}
13963
13964function recordCommitTime() {
13965 if (!enableProfilerTimer) {
13966 return;
13967 }
13968 commitTime = unstable_now();
13969}
13970
13971function startProfilerTimer(fiber) {
13972 if (!enableProfilerTimer) {
13973 return;
13974 }
13975
13976 profilerStartTime = unstable_now();
13977
13978 if (fiber.actualStartTime < 0) {
13979 fiber.actualStartTime = unstable_now();
13980 }
13981}
13982
13983function stopProfilerTimerIfRunning(fiber) {
13984 if (!enableProfilerTimer) {
13985 return;
13986 }
13987 profilerStartTime = -1;
13988}
13989
13990function stopProfilerTimerIfRunningAndRecordDelta(fiber, overrideBaseTime) {
13991 if (!enableProfilerTimer) {
13992 return;
13993 }
13994
13995 if (profilerStartTime >= 0) {
13996 var elapsedTime = unstable_now() - profilerStartTime;
13997 fiber.actualDuration += elapsedTime;
13998 if (overrideBaseTime) {
13999 fiber.selfBaseDuration = elapsedTime;
14000 }
14001 profilerStartTime = -1;
14002 }
14003}
14004
14005// The deepest Fiber on the stack involved in a hydration context.
14006// This may have been an insertion or a hydration.
14007var hydrationParentFiber = null;
14008var nextHydratableInstance = null;
14009var isHydrating = false;
14010
14011function enterHydrationState(fiber) {
14012 if (!supportsHydration) {
14013 return false;
14014 }
14015
14016 var parentInstance = fiber.stateNode.containerInfo;
14017 nextHydratableInstance = getFirstHydratableChild(parentInstance);
14018 hydrationParentFiber = fiber;
14019 isHydrating = true;
14020 return true;
14021}
14022
14023function reenterHydrationStateFromDehydratedSuspenseInstance(fiber) {
14024 if (!supportsHydration) {
14025 return false;
14026 }
14027
14028 var suspenseInstance = fiber.stateNode;
14029 nextHydratableInstance = getNextHydratableSibling(suspenseInstance);
14030 popToNextHostParent(fiber);
14031 isHydrating = true;
14032 return true;
14033}
14034
14035function deleteHydratableInstance(returnFiber, instance) {
14036 {
14037 switch (returnFiber.tag) {
14038 case HostRoot:
14039 didNotHydrateContainerInstance(returnFiber.stateNode.containerInfo, instance);
14040 break;
14041 case HostComponent:
14042 didNotHydrateInstance(returnFiber.type, returnFiber.memoizedProps, returnFiber.stateNode, instance);
14043 break;
14044 }
14045 }
14046
14047 var childToDelete = createFiberFromHostInstanceForDeletion();
14048 childToDelete.stateNode = instance;
14049 childToDelete.return = returnFiber;
14050 childToDelete.effectTag = Deletion;
14051
14052 // This might seem like it belongs on progressedFirstDeletion. However,
14053 // these children are not part of the reconciliation list of children.
14054 // Even if we abort and rereconcile the children, that will try to hydrate
14055 // again and the nodes are still in the host tree so these will be
14056 // recreated.
14057 if (returnFiber.lastEffect !== null) {
14058 returnFiber.lastEffect.nextEffect = childToDelete;
14059 returnFiber.lastEffect = childToDelete;
14060 } else {
14061 returnFiber.firstEffect = returnFiber.lastEffect = childToDelete;
14062 }
14063}
14064
14065function insertNonHydratedInstance(returnFiber, fiber) {
14066 fiber.effectTag |= Placement;
14067 {
14068 switch (returnFiber.tag) {
14069 case HostRoot:
14070 {
14071 var parentContainer = returnFiber.stateNode.containerInfo;
14072 switch (fiber.tag) {
14073 case HostComponent:
14074 var type = fiber.type;
14075 var props = fiber.pendingProps;
14076 didNotFindHydratableContainerInstance(parentContainer, type, props);
14077 break;
14078 case HostText:
14079 var text = fiber.pendingProps;
14080 didNotFindHydratableContainerTextInstance(parentContainer, text);
14081 break;
14082 case SuspenseComponent:
14083
14084 break;
14085 }
14086 break;
14087 }
14088 case HostComponent:
14089 {
14090 var parentType = returnFiber.type;
14091 var parentProps = returnFiber.memoizedProps;
14092 var parentInstance = returnFiber.stateNode;
14093 switch (fiber.tag) {
14094 case HostComponent:
14095 var _type = fiber.type;
14096 var _props = fiber.pendingProps;
14097 didNotFindHydratableInstance(parentType, parentProps, parentInstance, _type, _props);
14098 break;
14099 case HostText:
14100 var _text = fiber.pendingProps;
14101 didNotFindHydratableTextInstance(parentType, parentProps, parentInstance, _text);
14102 break;
14103 case SuspenseComponent:
14104 didNotFindHydratableSuspenseInstance(parentType, parentProps, parentInstance);
14105 break;
14106 }
14107 break;
14108 }
14109 default:
14110 return;
14111 }
14112 }
14113}
14114
14115function tryHydrate(fiber, nextInstance) {
14116 switch (fiber.tag) {
14117 case HostComponent:
14118 {
14119 var type = fiber.type;
14120 var props = fiber.pendingProps;
14121 var instance = canHydrateInstance(nextInstance, type, props);
14122 if (instance !== null) {
14123 fiber.stateNode = instance;
14124 return true;
14125 }
14126 return false;
14127 }
14128 case HostText:
14129 {
14130 var text = fiber.pendingProps;
14131 var textInstance = canHydrateTextInstance(nextInstance, text);
14132 if (textInstance !== null) {
14133 fiber.stateNode = textInstance;
14134 return true;
14135 }
14136 return false;
14137 }
14138 case SuspenseComponent:
14139 {
14140 if (enableSuspenseServerRenderer) {
14141 var suspenseInstance = canHydrateSuspenseInstance(nextInstance);
14142 if (suspenseInstance !== null) {
14143 // Downgrade the tag to a dehydrated component until we've hydrated it.
14144 fiber.tag = DehydratedSuspenseComponent;
14145 fiber.stateNode = suspenseInstance;
14146 return true;
14147 }
14148 }
14149 return false;
14150 }
14151 default:
14152 return false;
14153 }
14154}
14155
14156function tryToClaimNextHydratableInstance(fiber) {
14157 if (!isHydrating) {
14158 return;
14159 }
14160 var nextInstance = nextHydratableInstance;
14161 if (!nextInstance) {
14162 // Nothing to hydrate. Make it an insertion.
14163 insertNonHydratedInstance(hydrationParentFiber, fiber);
14164 isHydrating = false;
14165 hydrationParentFiber = fiber;
14166 return;
14167 }
14168 var firstAttemptedInstance = nextInstance;
14169 if (!tryHydrate(fiber, nextInstance)) {
14170 // If we can't hydrate this instance let's try the next one.
14171 // We use this as a heuristic. It's based on intuition and not data so it
14172 // might be flawed or unnecessary.
14173 nextInstance = getNextHydratableSibling(firstAttemptedInstance);
14174 if (!nextInstance || !tryHydrate(fiber, nextInstance)) {
14175 // Nothing to hydrate. Make it an insertion.
14176 insertNonHydratedInstance(hydrationParentFiber, fiber);
14177 isHydrating = false;
14178 hydrationParentFiber = fiber;
14179 return;
14180 }
14181 // We matched the next one, we'll now assume that the first one was
14182 // superfluous and we'll delete it. Since we can't eagerly delete it
14183 // we'll have to schedule a deletion. To do that, this node needs a dummy
14184 // fiber associated with it.
14185 deleteHydratableInstance(hydrationParentFiber, firstAttemptedInstance);
14186 }
14187 hydrationParentFiber = fiber;
14188 nextHydratableInstance = getFirstHydratableChild(nextInstance);
14189}
14190
14191function prepareToHydrateHostInstance(fiber, rootContainerInstance, hostContext) {
14192 if (!supportsHydration) {
14193 invariant(false, 'Expected prepareToHydrateHostInstance() to never be called. This error is likely caused by a bug in React. Please file an issue.');
14194 }
14195
14196 var instance = fiber.stateNode;
14197 var updatePayload = hydrateInstance(instance, fiber.type, fiber.memoizedProps, rootContainerInstance, hostContext, fiber);
14198 // TODO: Type this specific to this type of component.
14199 fiber.updateQueue = updatePayload;
14200 // If the update payload indicates that there is a change or if there
14201 // is a new ref we mark this as an update.
14202 if (updatePayload !== null) {
14203 return true;
14204 }
14205 return false;
14206}
14207
14208function prepareToHydrateHostTextInstance(fiber) {
14209 if (!supportsHydration) {
14210 invariant(false, 'Expected prepareToHydrateHostTextInstance() to never be called. This error is likely caused by a bug in React. Please file an issue.');
14211 }
14212
14213 var textInstance = fiber.stateNode;
14214 var textContent = fiber.memoizedProps;
14215 var shouldUpdate = hydrateTextInstance(textInstance, textContent, fiber);
14216 {
14217 if (shouldUpdate) {
14218 // We assume that prepareToHydrateHostTextInstance is called in a context where the
14219 // hydration parent is the parent host component of this host text.
14220 var returnFiber = hydrationParentFiber;
14221 if (returnFiber !== null) {
14222 switch (returnFiber.tag) {
14223 case HostRoot:
14224 {
14225 var parentContainer = returnFiber.stateNode.containerInfo;
14226 didNotMatchHydratedContainerTextInstance(parentContainer, textInstance, textContent);
14227 break;
14228 }
14229 case HostComponent:
14230 {
14231 var parentType = returnFiber.type;
14232 var parentProps = returnFiber.memoizedProps;
14233 var parentInstance = returnFiber.stateNode;
14234 didNotMatchHydratedTextInstance(parentType, parentProps, parentInstance, textInstance, textContent);
14235 break;
14236 }
14237 }
14238 }
14239 }
14240 }
14241 return shouldUpdate;
14242}
14243
14244function skipPastDehydratedSuspenseInstance(fiber) {
14245 if (!supportsHydration) {
14246 invariant(false, 'Expected skipPastDehydratedSuspenseInstance() to never be called. This error is likely caused by a bug in React. Please file an issue.');
14247 }
14248 var suspenseInstance = fiber.stateNode;
14249 !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;
14250 nextHydratableInstance = getNextHydratableInstanceAfterSuspenseInstance(suspenseInstance);
14251}
14252
14253function popToNextHostParent(fiber) {
14254 var parent = fiber.return;
14255 while (parent !== null && parent.tag !== HostComponent && parent.tag !== HostRoot && parent.tag !== DehydratedSuspenseComponent) {
14256 parent = parent.return;
14257 }
14258 hydrationParentFiber = parent;
14259}
14260
14261function popHydrationState(fiber) {
14262 if (!supportsHydration) {
14263 return false;
14264 }
14265 if (fiber !== hydrationParentFiber) {
14266 // We're deeper than the current hydration context, inside an inserted
14267 // tree.
14268 return false;
14269 }
14270 if (!isHydrating) {
14271 // If we're not currently hydrating but we're in a hydration context, then
14272 // we were an insertion and now need to pop up reenter hydration of our
14273 // siblings.
14274 popToNextHostParent(fiber);
14275 isHydrating = true;
14276 return false;
14277 }
14278
14279 var type = fiber.type;
14280
14281 // If we have any remaining hydratable nodes, we need to delete them now.
14282 // We only do this deeper than head and body since they tend to have random
14283 // other nodes in them. We also ignore components with pure text content in
14284 // side of them.
14285 // TODO: Better heuristic.
14286 if (fiber.tag !== HostComponent || type !== 'head' && type !== 'body' && !shouldSetTextContent(type, fiber.memoizedProps)) {
14287 var nextInstance = nextHydratableInstance;
14288 while (nextInstance) {
14289 deleteHydratableInstance(fiber, nextInstance);
14290 nextInstance = getNextHydratableSibling(nextInstance);
14291 }
14292 }
14293
14294 popToNextHostParent(fiber);
14295 nextHydratableInstance = hydrationParentFiber ? getNextHydratableSibling(fiber.stateNode) : null;
14296 return true;
14297}
14298
14299function resetHydrationState() {
14300 if (!supportsHydration) {
14301 return;
14302 }
14303
14304 hydrationParentFiber = null;
14305 nextHydratableInstance = null;
14306 isHydrating = false;
14307}
14308
14309var ReactCurrentOwner$3 = ReactSharedInternals.ReactCurrentOwner;
14310
14311var didReceiveUpdate = false;
14312
14313var didWarnAboutBadClass = void 0;
14314var didWarnAboutContextTypeOnFunctionComponent = void 0;
14315var didWarnAboutGetDerivedStateOnFunctionComponent = void 0;
14316var didWarnAboutFunctionRefs = void 0;
14317var didWarnAboutReassigningProps = void 0;
14318
14319{
14320 didWarnAboutBadClass = {};
14321 didWarnAboutContextTypeOnFunctionComponent = {};
14322 didWarnAboutGetDerivedStateOnFunctionComponent = {};
14323 didWarnAboutFunctionRefs = {};
14324 didWarnAboutReassigningProps = false;
14325}
14326
14327function reconcileChildren(current$$1, workInProgress, nextChildren, renderExpirationTime) {
14328 if (current$$1 === null) {
14329 // If this is a fresh new component that hasn't been rendered yet, we
14330 // won't update its child set by applying minimal side-effects. Instead,
14331 // we will add them all to the child before it gets rendered. That means
14332 // we can optimize this reconciliation pass by not tracking side-effects.
14333 workInProgress.child = mountChildFibers(workInProgress, null, nextChildren, renderExpirationTime);
14334 } else {
14335 // If the current child is the same as the work in progress, it means that
14336 // we haven't yet started any work on these children. Therefore, we use
14337 // the clone algorithm to create a copy of all the current children.
14338
14339 // If we had any progressed work already, that is invalid at this point so
14340 // let's throw it out.
14341 workInProgress.child = reconcileChildFibers(workInProgress, current$$1.child, nextChildren, renderExpirationTime);
14342 }
14343}
14344
14345function forceUnmountCurrentAndReconcile(current$$1, workInProgress, nextChildren, renderExpirationTime) {
14346 // This function is fork of reconcileChildren. It's used in cases where we
14347 // want to reconcile without matching against the existing set. This has the
14348 // effect of all current children being unmounted; even if the type and key
14349 // are the same, the old child is unmounted and a new child is created.
14350 //
14351 // To do this, we're going to go through the reconcile algorithm twice. In
14352 // the first pass, we schedule a deletion for all the current children by
14353 // passing null.
14354 workInProgress.child = reconcileChildFibers(workInProgress, current$$1.child, null, renderExpirationTime);
14355 // In the second pass, we mount the new children. The trick here is that we
14356 // pass null in place of where we usually pass the current child set. This has
14357 // the effect of remounting all children regardless of whether their their
14358 // identity matches.
14359 workInProgress.child = reconcileChildFibers(workInProgress, null, nextChildren, renderExpirationTime);
14360}
14361
14362function updateForwardRef(current$$1, workInProgress, Component, nextProps, renderExpirationTime) {
14363 // TODO: current can be non-null here even if the component
14364 // hasn't yet mounted. This happens after the first render suspends.
14365 // We'll need to figure out if this is fine or can cause issues.
14366
14367 {
14368 if (workInProgress.type !== workInProgress.elementType) {
14369 // Lazy component props can't be validated in createElement
14370 // because they're only guaranteed to be resolved here.
14371 var innerPropTypes = Component.propTypes;
14372 if (innerPropTypes) {
14373 checkPropTypes_1(innerPropTypes, nextProps, // Resolved props
14374 'prop', getComponentName(Component), getCurrentFiberStackInDev);
14375 }
14376 }
14377 }
14378
14379 var render = Component.render;
14380 var ref = workInProgress.ref;
14381
14382 // The rest is a fork of updateFunctionComponent
14383 var nextChildren = void 0;
14384 prepareToReadContext(workInProgress, renderExpirationTime);
14385 {
14386 ReactCurrentOwner$3.current = workInProgress;
14387 setCurrentPhase('render');
14388 nextChildren = renderWithHooks(current$$1, workInProgress, render, nextProps, ref, renderExpirationTime);
14389 if (debugRenderPhaseSideEffects || debugRenderPhaseSideEffectsForStrictMode && workInProgress.mode & StrictMode) {
14390 // Only double-render components with Hooks
14391 if (workInProgress.memoizedState !== null) {
14392 nextChildren = renderWithHooks(current$$1, workInProgress, render, nextProps, ref, renderExpirationTime);
14393 }
14394 }
14395 setCurrentPhase(null);
14396 }
14397
14398 if (current$$1 !== null && !didReceiveUpdate) {
14399 bailoutHooks(current$$1, workInProgress, renderExpirationTime);
14400 return bailoutOnAlreadyFinishedWork(current$$1, workInProgress, renderExpirationTime);
14401 }
14402
14403 // React DevTools reads this flag.
14404 workInProgress.effectTag |= PerformedWork;
14405 reconcileChildren(current$$1, workInProgress, nextChildren, renderExpirationTime);
14406 return workInProgress.child;
14407}
14408
14409function updateMemoComponent(current$$1, workInProgress, Component, nextProps, updateExpirationTime, renderExpirationTime) {
14410 if (current$$1 === null) {
14411 var type = Component.type;
14412 if (isSimpleFunctionComponent(type) && Component.compare === null &&
14413 // SimpleMemoComponent codepath doesn't resolve outer props either.
14414 Component.defaultProps === undefined) {
14415 // If this is a plain function component without default props,
14416 // and with only the default shallow comparison, we upgrade it
14417 // to a SimpleMemoComponent to allow fast path updates.
14418 workInProgress.tag = SimpleMemoComponent;
14419 workInProgress.type = type;
14420 {
14421 validateFunctionComponentInDev(workInProgress, type);
14422 }
14423 return updateSimpleMemoComponent(current$$1, workInProgress, type, nextProps, updateExpirationTime, renderExpirationTime);
14424 }
14425 {
14426 var innerPropTypes = type.propTypes;
14427 if (innerPropTypes) {
14428 // Inner memo component props aren't currently validated in createElement.
14429 // We could move it there, but we'd still need this for lazy code path.
14430 checkPropTypes_1(innerPropTypes, nextProps, // Resolved props
14431 'prop', getComponentName(type), getCurrentFiberStackInDev);
14432 }
14433 }
14434 var child = createFiberFromTypeAndProps(Component.type, null, nextProps, null, workInProgress.mode, renderExpirationTime);
14435 child.ref = workInProgress.ref;
14436 child.return = workInProgress;
14437 workInProgress.child = child;
14438 return child;
14439 }
14440 {
14441 var _type = Component.type;
14442 var _innerPropTypes = _type.propTypes;
14443 if (_innerPropTypes) {
14444 // Inner memo component props aren't currently validated in createElement.
14445 // We could move it there, but we'd still need this for lazy code path.
14446 checkPropTypes_1(_innerPropTypes, nextProps, // Resolved props
14447 'prop', getComponentName(_type), getCurrentFiberStackInDev);
14448 }
14449 }
14450 var currentChild = current$$1.child; // This is always exactly one child
14451 if (updateExpirationTime < renderExpirationTime) {
14452 // This will be the props with resolved defaultProps,
14453 // unlike current.memoizedProps which will be the unresolved ones.
14454 var prevProps = currentChild.memoizedProps;
14455 // Default to shallow comparison
14456 var compare = Component.compare;
14457 compare = compare !== null ? compare : shallowEqual;
14458 if (compare(prevProps, nextProps) && current$$1.ref === workInProgress.ref) {
14459 return bailoutOnAlreadyFinishedWork(current$$1, workInProgress, renderExpirationTime);
14460 }
14461 }
14462 // React DevTools reads this flag.
14463 workInProgress.effectTag |= PerformedWork;
14464 var newChild = createWorkInProgress(currentChild, nextProps, renderExpirationTime);
14465 newChild.ref = workInProgress.ref;
14466 newChild.return = workInProgress;
14467 workInProgress.child = newChild;
14468 return newChild;
14469}
14470
14471function updateSimpleMemoComponent(current$$1, workInProgress, Component, nextProps, updateExpirationTime, renderExpirationTime) {
14472 // TODO: current can be non-null here even if the component
14473 // hasn't yet mounted. This happens when the inner render suspends.
14474 // We'll need to figure out if this is fine or can cause issues.
14475
14476 {
14477 if (workInProgress.type !== workInProgress.elementType) {
14478 // Lazy component props can't be validated in createElement
14479 // because they're only guaranteed to be resolved here.
14480 var outerMemoType = workInProgress.elementType;
14481 if (outerMemoType.$$typeof === REACT_LAZY_TYPE) {
14482 // We warn when you define propTypes on lazy()
14483 // so let's just skip over it to find memo() outer wrapper.
14484 // Inner props for memo are validated later.
14485 outerMemoType = refineResolvedLazyComponent(outerMemoType);
14486 }
14487 var outerPropTypes = outerMemoType && outerMemoType.propTypes;
14488 if (outerPropTypes) {
14489 checkPropTypes_1(outerPropTypes, nextProps, // Resolved (SimpleMemoComponent has no defaultProps)
14490 'prop', getComponentName(outerMemoType), getCurrentFiberStackInDev);
14491 }
14492 // Inner propTypes will be validated in the function component path.
14493 }
14494 }
14495 if (current$$1 !== null) {
14496 var prevProps = current$$1.memoizedProps;
14497 if (shallowEqual(prevProps, nextProps) && current$$1.ref === workInProgress.ref) {
14498 didReceiveUpdate = false;
14499 if (updateExpirationTime < renderExpirationTime) {
14500 return bailoutOnAlreadyFinishedWork(current$$1, workInProgress, renderExpirationTime);
14501 }
14502 }
14503 }
14504 return updateFunctionComponent(current$$1, workInProgress, Component, nextProps, renderExpirationTime);
14505}
14506
14507function updateFragment(current$$1, workInProgress, renderExpirationTime) {
14508 var nextChildren = workInProgress.pendingProps;
14509 reconcileChildren(current$$1, workInProgress, nextChildren, renderExpirationTime);
14510 return workInProgress.child;
14511}
14512
14513function updateMode(current$$1, workInProgress, renderExpirationTime) {
14514 var nextChildren = workInProgress.pendingProps.children;
14515 reconcileChildren(current$$1, workInProgress, nextChildren, renderExpirationTime);
14516 return workInProgress.child;
14517}
14518
14519function updateProfiler(current$$1, workInProgress, renderExpirationTime) {
14520 if (enableProfilerTimer) {
14521 workInProgress.effectTag |= Update;
14522 }
14523 var nextProps = workInProgress.pendingProps;
14524 var nextChildren = nextProps.children;
14525 reconcileChildren(current$$1, workInProgress, nextChildren, renderExpirationTime);
14526 return workInProgress.child;
14527}
14528
14529function markRef(current$$1, workInProgress) {
14530 var ref = workInProgress.ref;
14531 if (current$$1 === null && ref !== null || current$$1 !== null && current$$1.ref !== ref) {
14532 // Schedule a Ref effect
14533 workInProgress.effectTag |= Ref;
14534 }
14535}
14536
14537function updateFunctionComponent(current$$1, workInProgress, Component, nextProps, renderExpirationTime) {
14538 {
14539 if (workInProgress.type !== workInProgress.elementType) {
14540 // Lazy component props can't be validated in createElement
14541 // because they're only guaranteed to be resolved here.
14542 var innerPropTypes = Component.propTypes;
14543 if (innerPropTypes) {
14544 checkPropTypes_1(innerPropTypes, nextProps, // Resolved props
14545 'prop', getComponentName(Component), getCurrentFiberStackInDev);
14546 }
14547 }
14548 }
14549
14550 var unmaskedContext = getUnmaskedContext(workInProgress, Component, true);
14551 var context = getMaskedContext(workInProgress, unmaskedContext);
14552
14553 var nextChildren = void 0;
14554 prepareToReadContext(workInProgress, renderExpirationTime);
14555 {
14556 ReactCurrentOwner$3.current = workInProgress;
14557 setCurrentPhase('render');
14558 nextChildren = renderWithHooks(current$$1, workInProgress, Component, nextProps, context, renderExpirationTime);
14559 if (debugRenderPhaseSideEffects || debugRenderPhaseSideEffectsForStrictMode && workInProgress.mode & StrictMode) {
14560 // Only double-render components with Hooks
14561 if (workInProgress.memoizedState !== null) {
14562 nextChildren = renderWithHooks(current$$1, workInProgress, Component, nextProps, context, renderExpirationTime);
14563 }
14564 }
14565 setCurrentPhase(null);
14566 }
14567
14568 if (current$$1 !== null && !didReceiveUpdate) {
14569 bailoutHooks(current$$1, workInProgress, renderExpirationTime);
14570 return bailoutOnAlreadyFinishedWork(current$$1, workInProgress, renderExpirationTime);
14571 }
14572
14573 // React DevTools reads this flag.
14574 workInProgress.effectTag |= PerformedWork;
14575 reconcileChildren(current$$1, workInProgress, nextChildren, renderExpirationTime);
14576 return workInProgress.child;
14577}
14578
14579function updateClassComponent(current$$1, workInProgress, Component, nextProps, renderExpirationTime) {
14580 {
14581 if (workInProgress.type !== workInProgress.elementType) {
14582 // Lazy component props can't be validated in createElement
14583 // because they're only guaranteed to be resolved here.
14584 var innerPropTypes = Component.propTypes;
14585 if (innerPropTypes) {
14586 checkPropTypes_1(innerPropTypes, nextProps, // Resolved props
14587 'prop', getComponentName(Component), getCurrentFiberStackInDev);
14588 }
14589 }
14590 }
14591
14592 // Push context providers early to prevent context stack mismatches.
14593 // During mounting we don't know the child context yet as the instance doesn't exist.
14594 // We will invalidate the child context in finishClassComponent() right after rendering.
14595 var hasContext = void 0;
14596 if (isContextProvider(Component)) {
14597 hasContext = true;
14598 pushContextProvider(workInProgress);
14599 } else {
14600 hasContext = false;
14601 }
14602 prepareToReadContext(workInProgress, renderExpirationTime);
14603
14604 var instance = workInProgress.stateNode;
14605 var shouldUpdate = void 0;
14606 if (instance === null) {
14607 if (current$$1 !== null) {
14608 // An class component without an instance only mounts if it suspended
14609 // inside a non- concurrent tree, in an inconsistent state. We want to
14610 // tree it like a new mount, even though an empty version of it already
14611 // committed. Disconnect the alternate pointers.
14612 current$$1.alternate = null;
14613 workInProgress.alternate = null;
14614 // Since this is conceptually a new fiber, schedule a Placement effect
14615 workInProgress.effectTag |= Placement;
14616 }
14617 // In the initial pass we might need to construct the instance.
14618 constructClassInstance(workInProgress, Component, nextProps, renderExpirationTime);
14619 mountClassInstance(workInProgress, Component, nextProps, renderExpirationTime);
14620 shouldUpdate = true;
14621 } else if (current$$1 === null) {
14622 // In a resume, we'll already have an instance we can reuse.
14623 shouldUpdate = resumeMountClassInstance(workInProgress, Component, nextProps, renderExpirationTime);
14624 } else {
14625 shouldUpdate = updateClassInstance(current$$1, workInProgress, Component, nextProps, renderExpirationTime);
14626 }
14627 var nextUnitOfWork = finishClassComponent(current$$1, workInProgress, Component, shouldUpdate, hasContext, renderExpirationTime);
14628 {
14629 var inst = workInProgress.stateNode;
14630 if (inst.props !== nextProps) {
14631 !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;
14632 didWarnAboutReassigningProps = true;
14633 }
14634 }
14635 return nextUnitOfWork;
14636}
14637
14638function finishClassComponent(current$$1, workInProgress, Component, shouldUpdate, hasContext, renderExpirationTime) {
14639 // Refs should update even if shouldComponentUpdate returns false
14640 markRef(current$$1, workInProgress);
14641
14642 var didCaptureError = (workInProgress.effectTag & DidCapture) !== NoEffect;
14643
14644 if (!shouldUpdate && !didCaptureError) {
14645 // Context providers should defer to sCU for rendering
14646 if (hasContext) {
14647 invalidateContextProvider(workInProgress, Component, false);
14648 }
14649
14650 return bailoutOnAlreadyFinishedWork(current$$1, workInProgress, renderExpirationTime);
14651 }
14652
14653 var instance = workInProgress.stateNode;
14654
14655 // Rerender
14656 ReactCurrentOwner$3.current = workInProgress;
14657 var nextChildren = void 0;
14658 if (didCaptureError && typeof Component.getDerivedStateFromError !== 'function') {
14659 // If we captured an error, but getDerivedStateFrom catch is not defined,
14660 // unmount all the children. componentDidCatch will schedule an update to
14661 // re-render a fallback. This is temporary until we migrate everyone to
14662 // the new API.
14663 // TODO: Warn in a future release.
14664 nextChildren = null;
14665
14666 if (enableProfilerTimer) {
14667 stopProfilerTimerIfRunning(workInProgress);
14668 }
14669 } else {
14670 {
14671 setCurrentPhase('render');
14672 nextChildren = instance.render();
14673 if (debugRenderPhaseSideEffects || debugRenderPhaseSideEffectsForStrictMode && workInProgress.mode & StrictMode) {
14674 instance.render();
14675 }
14676 setCurrentPhase(null);
14677 }
14678 }
14679
14680 // React DevTools reads this flag.
14681 workInProgress.effectTag |= PerformedWork;
14682 if (current$$1 !== null && didCaptureError) {
14683 // If we're recovering from an error, reconcile without reusing any of
14684 // the existing children. Conceptually, the normal children and the children
14685 // that are shown on error are two different sets, so we shouldn't reuse
14686 // normal children even if their identities match.
14687 forceUnmountCurrentAndReconcile(current$$1, workInProgress, nextChildren, renderExpirationTime);
14688 } else {
14689 reconcileChildren(current$$1, workInProgress, nextChildren, renderExpirationTime);
14690 }
14691
14692 // Memoize state using the values we just used to render.
14693 // TODO: Restructure so we never read values from the instance.
14694 workInProgress.memoizedState = instance.state;
14695
14696 // The context might have changed so we need to recalculate it.
14697 if (hasContext) {
14698 invalidateContextProvider(workInProgress, Component, true);
14699 }
14700
14701 return workInProgress.child;
14702}
14703
14704function pushHostRootContext(workInProgress) {
14705 var root = workInProgress.stateNode;
14706 if (root.pendingContext) {
14707 pushTopLevelContextObject(workInProgress, root.pendingContext, root.pendingContext !== root.context);
14708 } else if (root.context) {
14709 // Should always be set
14710 pushTopLevelContextObject(workInProgress, root.context, false);
14711 }
14712 pushHostContainer(workInProgress, root.containerInfo);
14713}
14714
14715function updateHostRoot(current$$1, workInProgress, renderExpirationTime) {
14716 pushHostRootContext(workInProgress);
14717 var updateQueue = workInProgress.updateQueue;
14718 !(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;
14719 var nextProps = workInProgress.pendingProps;
14720 var prevState = workInProgress.memoizedState;
14721 var prevChildren = prevState !== null ? prevState.element : null;
14722 processUpdateQueue(workInProgress, updateQueue, nextProps, null, renderExpirationTime);
14723 var nextState = workInProgress.memoizedState;
14724 // Caution: React DevTools currently depends on this property
14725 // being called "element".
14726 var nextChildren = nextState.element;
14727 if (nextChildren === prevChildren) {
14728 // If the state is the same as before, that's a bailout because we had
14729 // no work that expires at this time.
14730 resetHydrationState();
14731 return bailoutOnAlreadyFinishedWork(current$$1, workInProgress, renderExpirationTime);
14732 }
14733 var root = workInProgress.stateNode;
14734 if ((current$$1 === null || current$$1.child === null) && root.hydrate && enterHydrationState(workInProgress)) {
14735 // If we don't have any current children this might be the first pass.
14736 // We always try to hydrate. If this isn't a hydration pass there won't
14737 // be any children to hydrate which is effectively the same thing as
14738 // not hydrating.
14739
14740 // This is a bit of a hack. We track the host root as a placement to
14741 // know that we're currently in a mounting state. That way isMounted
14742 // works as expected. We must reset this before committing.
14743 // TODO: Delete this when we delete isMounted and findDOMNode.
14744 workInProgress.effectTag |= Placement;
14745
14746 // Ensure that children mount into this root without tracking
14747 // side-effects. This ensures that we don't store Placement effects on
14748 // nodes that will be hydrated.
14749 workInProgress.child = mountChildFibers(workInProgress, null, nextChildren, renderExpirationTime);
14750 } else {
14751 // Otherwise reset hydration state in case we aborted and resumed another
14752 // root.
14753 reconcileChildren(current$$1, workInProgress, nextChildren, renderExpirationTime);
14754 resetHydrationState();
14755 }
14756 return workInProgress.child;
14757}
14758
14759function updateHostComponent(current$$1, workInProgress, renderExpirationTime) {
14760 pushHostContext(workInProgress);
14761
14762 if (current$$1 === null) {
14763 tryToClaimNextHydratableInstance(workInProgress);
14764 }
14765
14766 var type = workInProgress.type;
14767 var nextProps = workInProgress.pendingProps;
14768 var prevProps = current$$1 !== null ? current$$1.memoizedProps : null;
14769
14770 var nextChildren = nextProps.children;
14771 var isDirectTextChild = shouldSetTextContent(type, nextProps);
14772
14773 if (isDirectTextChild) {
14774 // We special case a direct text child of a host node. This is a common
14775 // case. We won't handle it as a reified child. We will instead handle
14776 // this in the host environment that also have access to this prop. That
14777 // avoids allocating another HostText fiber and traversing it.
14778 nextChildren = null;
14779 } else if (prevProps !== null && shouldSetTextContent(type, prevProps)) {
14780 // If we're switching from a direct text child to a normal child, or to
14781 // empty, we need to schedule the text content to be reset.
14782 workInProgress.effectTag |= ContentReset;
14783 }
14784
14785 markRef(current$$1, workInProgress);
14786
14787 // Check the host config to see if the children are offscreen/hidden.
14788 if (renderExpirationTime !== Never && workInProgress.mode & ConcurrentMode && shouldDeprioritizeSubtree(type, nextProps)) {
14789 // Schedule this fiber to re-render at offscreen priority. Then bailout.
14790 workInProgress.expirationTime = workInProgress.childExpirationTime = Never;
14791 return null;
14792 }
14793
14794 reconcileChildren(current$$1, workInProgress, nextChildren, renderExpirationTime);
14795 return workInProgress.child;
14796}
14797
14798function updateHostText(current$$1, workInProgress) {
14799 if (current$$1 === null) {
14800 tryToClaimNextHydratableInstance(workInProgress);
14801 }
14802 // Nothing to do here. This is terminal. We'll do the completion step
14803 // immediately after.
14804 return null;
14805}
14806
14807function mountLazyComponent(_current, workInProgress, elementType, updateExpirationTime, renderExpirationTime) {
14808 if (_current !== null) {
14809 // An lazy component only mounts if it suspended inside a non-
14810 // concurrent tree, in an inconsistent state. We want to treat it like
14811 // a new mount, even though an empty version of it already committed.
14812 // Disconnect the alternate pointers.
14813 _current.alternate = null;
14814 workInProgress.alternate = null;
14815 // Since this is conceptually a new fiber, schedule a Placement effect
14816 workInProgress.effectTag |= Placement;
14817 }
14818
14819 var props = workInProgress.pendingProps;
14820 // We can't start a User Timing measurement with correct label yet.
14821 // Cancel and resume right after we know the tag.
14822 cancelWorkTimer(workInProgress);
14823 var Component = readLazyComponentType(elementType);
14824 // Store the unwrapped component in the type.
14825 workInProgress.type = Component;
14826 var resolvedTag = workInProgress.tag = resolveLazyComponentTag(Component);
14827 startWorkTimer(workInProgress);
14828 var resolvedProps = resolveDefaultProps(Component, props);
14829 var child = void 0;
14830 switch (resolvedTag) {
14831 case FunctionComponent:
14832 {
14833 {
14834 validateFunctionComponentInDev(workInProgress, Component);
14835 }
14836 child = updateFunctionComponent(null, workInProgress, Component, resolvedProps, renderExpirationTime);
14837 break;
14838 }
14839 case ClassComponent:
14840 {
14841 child = updateClassComponent(null, workInProgress, Component, resolvedProps, renderExpirationTime);
14842 break;
14843 }
14844 case ForwardRef:
14845 {
14846 child = updateForwardRef(null, workInProgress, Component, resolvedProps, renderExpirationTime);
14847 break;
14848 }
14849 case MemoComponent:
14850 {
14851 {
14852 if (workInProgress.type !== workInProgress.elementType) {
14853 var outerPropTypes = Component.propTypes;
14854 if (outerPropTypes) {
14855 checkPropTypes_1(outerPropTypes, resolvedProps, // Resolved for outer only
14856 'prop', getComponentName(Component), getCurrentFiberStackInDev);
14857 }
14858 }
14859 }
14860 child = updateMemoComponent(null, workInProgress, Component, resolveDefaultProps(Component.type, resolvedProps), // The inner type can have defaults too
14861 updateExpirationTime, renderExpirationTime);
14862 break;
14863 }
14864 default:
14865 {
14866 var hint = '';
14867 {
14868 if (Component !== null && typeof Component === 'object' && Component.$$typeof === REACT_LAZY_TYPE) {
14869 hint = ' Did you wrap a component in React.lazy() more than once?';
14870 }
14871 }
14872 // This message intentionally doesn't mention ForwardRef or MemoComponent
14873 // because the fact that it's a separate type of work is an
14874 // implementation detail.
14875 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);
14876 }
14877 }
14878 return child;
14879}
14880
14881function mountIncompleteClassComponent(_current, workInProgress, Component, nextProps, renderExpirationTime) {
14882 if (_current !== null) {
14883 // An incomplete component only mounts if it suspended inside a non-
14884 // concurrent tree, in an inconsistent state. We want to treat it like
14885 // a new mount, even though an empty version of it already committed.
14886 // Disconnect the alternate pointers.
14887 _current.alternate = null;
14888 workInProgress.alternate = null;
14889 // Since this is conceptually a new fiber, schedule a Placement effect
14890 workInProgress.effectTag |= Placement;
14891 }
14892
14893 // Promote the fiber to a class and try rendering again.
14894 workInProgress.tag = ClassComponent;
14895
14896 // The rest of this function is a fork of `updateClassComponent`
14897
14898 // Push context providers early to prevent context stack mismatches.
14899 // During mounting we don't know the child context yet as the instance doesn't exist.
14900 // We will invalidate the child context in finishClassComponent() right after rendering.
14901 var hasContext = void 0;
14902 if (isContextProvider(Component)) {
14903 hasContext = true;
14904 pushContextProvider(workInProgress);
14905 } else {
14906 hasContext = false;
14907 }
14908 prepareToReadContext(workInProgress, renderExpirationTime);
14909
14910 constructClassInstance(workInProgress, Component, nextProps, renderExpirationTime);
14911 mountClassInstance(workInProgress, Component, nextProps, renderExpirationTime);
14912
14913 return finishClassComponent(null, workInProgress, Component, true, hasContext, renderExpirationTime);
14914}
14915
14916function mountIndeterminateComponent(_current, workInProgress, Component, renderExpirationTime) {
14917 if (_current !== null) {
14918 // An indeterminate component only mounts if it suspended inside a non-
14919 // concurrent tree, in an inconsistent state. We want to treat it like
14920 // a new mount, even though an empty version of it already committed.
14921 // Disconnect the alternate pointers.
14922 _current.alternate = null;
14923 workInProgress.alternate = null;
14924 // Since this is conceptually a new fiber, schedule a Placement effect
14925 workInProgress.effectTag |= Placement;
14926 }
14927
14928 var props = workInProgress.pendingProps;
14929 var unmaskedContext = getUnmaskedContext(workInProgress, Component, false);
14930 var context = getMaskedContext(workInProgress, unmaskedContext);
14931
14932 prepareToReadContext(workInProgress, renderExpirationTime);
14933
14934 var value = void 0;
14935
14936 {
14937 if (Component.prototype && typeof Component.prototype.render === 'function') {
14938 var componentName = getComponentName(Component) || 'Unknown';
14939
14940 if (!didWarnAboutBadClass[componentName]) {
14941 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);
14942 didWarnAboutBadClass[componentName] = true;
14943 }
14944 }
14945
14946 if (workInProgress.mode & StrictMode) {
14947 ReactStrictModeWarnings.recordLegacyContextWarning(workInProgress, null);
14948 }
14949
14950 ReactCurrentOwner$3.current = workInProgress;
14951 value = renderWithHooks(null, workInProgress, Component, props, context, renderExpirationTime);
14952 }
14953 // React DevTools reads this flag.
14954 workInProgress.effectTag |= PerformedWork;
14955
14956 if (typeof value === 'object' && value !== null && typeof value.render === 'function' && value.$$typeof === undefined) {
14957 // Proceed under the assumption that this is a class instance
14958 workInProgress.tag = ClassComponent;
14959
14960 // Throw out any hooks that were used.
14961 resetHooks();
14962
14963 // Push context providers early to prevent context stack mismatches.
14964 // During mounting we don't know the child context yet as the instance doesn't exist.
14965 // We will invalidate the child context in finishClassComponent() right after rendering.
14966 var hasContext = false;
14967 if (isContextProvider(Component)) {
14968 hasContext = true;
14969 pushContextProvider(workInProgress);
14970 } else {
14971 hasContext = false;
14972 }
14973
14974 workInProgress.memoizedState = value.state !== null && value.state !== undefined ? value.state : null;
14975
14976 var getDerivedStateFromProps = Component.getDerivedStateFromProps;
14977 if (typeof getDerivedStateFromProps === 'function') {
14978 applyDerivedStateFromProps(workInProgress, Component, getDerivedStateFromProps, props);
14979 }
14980
14981 adoptClassInstance(workInProgress, value);
14982 mountClassInstance(workInProgress, Component, props, renderExpirationTime);
14983 return finishClassComponent(null, workInProgress, Component, true, hasContext, renderExpirationTime);
14984 } else {
14985 // Proceed under the assumption that this is a function component
14986 workInProgress.tag = FunctionComponent;
14987 {
14988 if (debugRenderPhaseSideEffects || debugRenderPhaseSideEffectsForStrictMode && workInProgress.mode & StrictMode) {
14989 // Only double-render components with Hooks
14990 if (workInProgress.memoizedState !== null) {
14991 value = renderWithHooks(null, workInProgress, Component, props, context, renderExpirationTime);
14992 }
14993 }
14994 }
14995 reconcileChildren(null, workInProgress, value, renderExpirationTime);
14996 {
14997 validateFunctionComponentInDev(workInProgress, Component);
14998 }
14999 return workInProgress.child;
15000 }
15001}
15002
15003function validateFunctionComponentInDev(workInProgress, Component) {
15004 if (Component) {
15005 !!Component.childContextTypes ? warningWithoutStack$1(false, '%s(...): childContextTypes cannot be defined on a function component.', Component.displayName || Component.name || 'Component') : void 0;
15006 }
15007 if (workInProgress.ref !== null) {
15008 var info = '';
15009 var ownerName = getCurrentFiberOwnerNameInDevOrNull();
15010 if (ownerName) {
15011 info += '\n\nCheck the render method of `' + ownerName + '`.';
15012 }
15013
15014 var warningKey = ownerName || workInProgress._debugID || '';
15015 var debugSource = workInProgress._debugSource;
15016 if (debugSource) {
15017 warningKey = debugSource.fileName + ':' + debugSource.lineNumber;
15018 }
15019 if (!didWarnAboutFunctionRefs[warningKey]) {
15020 didWarnAboutFunctionRefs[warningKey] = true;
15021 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);
15022 }
15023 }
15024
15025 if (typeof Component.getDerivedStateFromProps === 'function') {
15026 var componentName = getComponentName(Component) || 'Unknown';
15027
15028 if (!didWarnAboutGetDerivedStateOnFunctionComponent[componentName]) {
15029 warningWithoutStack$1(false, '%s: Function components do not support getDerivedStateFromProps.', componentName);
15030 didWarnAboutGetDerivedStateOnFunctionComponent[componentName] = true;
15031 }
15032 }
15033
15034 if (typeof Component.contextType === 'object' && Component.contextType !== null) {
15035 var _componentName = getComponentName(Component) || 'Unknown';
15036
15037 if (!didWarnAboutContextTypeOnFunctionComponent[_componentName]) {
15038 warningWithoutStack$1(false, '%s: Function components do not support contextType.', _componentName);
15039 didWarnAboutContextTypeOnFunctionComponent[_componentName] = true;
15040 }
15041 }
15042}
15043
15044function updateSuspenseComponent(current$$1, workInProgress, renderExpirationTime) {
15045 var mode = workInProgress.mode;
15046 var nextProps = workInProgress.pendingProps;
15047
15048 // We should attempt to render the primary children unless this boundary
15049 // already suspended during this render (`alreadyCaptured` is true).
15050 var nextState = workInProgress.memoizedState;
15051
15052 var nextDidTimeout = void 0;
15053 if ((workInProgress.effectTag & DidCapture) === NoEffect) {
15054 // This is the first attempt.
15055 nextState = null;
15056 nextDidTimeout = false;
15057 } else {
15058 // Something in this boundary's subtree already suspended. Switch to
15059 // rendering the fallback children.
15060 nextState = {
15061 timedOutAt: nextState !== null ? nextState.timedOutAt : NoWork
15062 };
15063 nextDidTimeout = true;
15064 workInProgress.effectTag &= ~DidCapture;
15065 }
15066
15067 // This next part is a bit confusing. If the children timeout, we switch to
15068 // showing the fallback children in place of the "primary" children.
15069 // However, we don't want to delete the primary children because then their
15070 // state will be lost (both the React state and the host state, e.g.
15071 // uncontrolled form inputs). Instead we keep them mounted and hide them.
15072 // Both the fallback children AND the primary children are rendered at the
15073 // same time. Once the primary children are un-suspended, we can delete
15074 // the fallback children — don't need to preserve their state.
15075 //
15076 // The two sets of children are siblings in the host environment, but
15077 // semantically, for purposes of reconciliation, they are two separate sets.
15078 // So we store them using two fragment fibers.
15079 //
15080 // However, we want to avoid allocating extra fibers for every placeholder.
15081 // They're only necessary when the children time out, because that's the
15082 // only time when both sets are mounted.
15083 //
15084 // So, the extra fragment fibers are only used if the children time out.
15085 // Otherwise, we render the primary children directly. This requires some
15086 // custom reconciliation logic to preserve the state of the primary
15087 // children. It's essentially a very basic form of re-parenting.
15088
15089 // `child` points to the child fiber. In the normal case, this is the first
15090 // fiber of the primary children set. In the timed-out case, it's a
15091 // a fragment fiber containing the primary children.
15092 var child = void 0;
15093 // `next` points to the next fiber React should render. In the normal case,
15094 // it's the same as `child`: the first fiber of the primary children set.
15095 // In the timed-out case, it's a fragment fiber containing the *fallback*
15096 // children -- we skip over the primary children entirely.
15097 var next = void 0;
15098 if (current$$1 === null) {
15099 if (enableSuspenseServerRenderer) {
15100 // If we're currently hydrating, try to hydrate this boundary.
15101 // But only if this has a fallback.
15102 if (nextProps.fallback !== undefined) {
15103 tryToClaimNextHydratableInstance(workInProgress);
15104 // This could've changed the tag if this was a dehydrated suspense component.
15105 if (workInProgress.tag === DehydratedSuspenseComponent) {
15106 return updateDehydratedSuspenseComponent(null, workInProgress, renderExpirationTime);
15107 }
15108 }
15109 }
15110
15111 // This is the initial mount. This branch is pretty simple because there's
15112 // no previous state that needs to be preserved.
15113 if (nextDidTimeout) {
15114 // Mount separate fragments for primary and fallback children.
15115 var nextFallbackChildren = nextProps.fallback;
15116 var primaryChildFragment = createFiberFromFragment(null, mode, NoWork, null);
15117
15118 if ((workInProgress.mode & ConcurrentMode) === NoContext) {
15119 // Outside of concurrent mode, we commit the effects from the
15120 var progressedState = workInProgress.memoizedState;
15121 var progressedPrimaryChild = progressedState !== null ? workInProgress.child.child : workInProgress.child;
15122 primaryChildFragment.child = progressedPrimaryChild;
15123 }
15124
15125 var fallbackChildFragment = createFiberFromFragment(nextFallbackChildren, mode, renderExpirationTime, null);
15126 primaryChildFragment.sibling = fallbackChildFragment;
15127 child = primaryChildFragment;
15128 // Skip the primary children, and continue working on the
15129 // fallback children.
15130 next = fallbackChildFragment;
15131 child.return = next.return = workInProgress;
15132 } else {
15133 // Mount the primary children without an intermediate fragment fiber.
15134 var nextPrimaryChildren = nextProps.children;
15135 child = next = mountChildFibers(workInProgress, null, nextPrimaryChildren, renderExpirationTime);
15136 }
15137 } else {
15138 // This is an update. This branch is more complicated because we need to
15139 // ensure the state of the primary children is preserved.
15140 var prevState = current$$1.memoizedState;
15141 var prevDidTimeout = prevState !== null;
15142 if (prevDidTimeout) {
15143 // The current tree already timed out. That means each child set is
15144 var currentPrimaryChildFragment = current$$1.child;
15145 var currentFallbackChildFragment = currentPrimaryChildFragment.sibling;
15146 if (nextDidTimeout) {
15147 // Still timed out. Reuse the current primary children by cloning
15148 // its fragment. We're going to skip over these entirely.
15149 var _nextFallbackChildren = nextProps.fallback;
15150 var _primaryChildFragment = createWorkInProgress(currentPrimaryChildFragment, currentPrimaryChildFragment.pendingProps, NoWork);
15151
15152 if ((workInProgress.mode & ConcurrentMode) === NoContext) {
15153 // Outside of concurrent mode, we commit the effects from the
15154 var _progressedState = workInProgress.memoizedState;
15155 var _progressedPrimaryChild = _progressedState !== null ? workInProgress.child.child : workInProgress.child;
15156 if (_progressedPrimaryChild !== currentPrimaryChildFragment.child) {
15157 _primaryChildFragment.child = _progressedPrimaryChild;
15158 }
15159 }
15160
15161 // Because primaryChildFragment is a new fiber that we're inserting as the
15162 // parent of a new tree, we need to set its treeBaseDuration.
15163 if (enableProfilerTimer && workInProgress.mode & ProfileMode) {
15164 // treeBaseDuration is the sum of all the child tree base durations.
15165 var treeBaseDuration = 0;
15166 var hiddenChild = _primaryChildFragment.child;
15167 while (hiddenChild !== null) {
15168 treeBaseDuration += hiddenChild.treeBaseDuration;
15169 hiddenChild = hiddenChild.sibling;
15170 }
15171 _primaryChildFragment.treeBaseDuration = treeBaseDuration;
15172 }
15173
15174 // Clone the fallback child fragment, too. These we'll continue
15175 // working on.
15176 var _fallbackChildFragment = _primaryChildFragment.sibling = createWorkInProgress(currentFallbackChildFragment, _nextFallbackChildren, currentFallbackChildFragment.expirationTime);
15177 child = _primaryChildFragment;
15178 _primaryChildFragment.childExpirationTime = NoWork;
15179 // Skip the primary children, and continue working on the
15180 // fallback children.
15181 next = _fallbackChildFragment;
15182 child.return = next.return = workInProgress;
15183 } else {
15184 // No longer suspended. Switch back to showing the primary children,
15185 // and remove the intermediate fragment fiber.
15186 var _nextPrimaryChildren = nextProps.children;
15187 var currentPrimaryChild = currentPrimaryChildFragment.child;
15188 var primaryChild = reconcileChildFibers(workInProgress, currentPrimaryChild, _nextPrimaryChildren, renderExpirationTime);
15189
15190 // If this render doesn't suspend, we need to delete the fallback
15191 // children. Wait until the complete phase, after we've confirmed the
15192 // fallback is no longer needed.
15193 // TODO: Would it be better to store the fallback fragment on
15194 // the stateNode?
15195
15196 // Continue rendering the children, like we normally do.
15197 child = next = primaryChild;
15198 }
15199 } else {
15200 // The current tree has not already timed out. That means the primary
15201 // children are not wrapped in a fragment fiber.
15202 var _currentPrimaryChild = current$$1.child;
15203 if (nextDidTimeout) {
15204 // Timed out. Wrap the children in a fragment fiber to keep them
15205 // separate from the fallback children.
15206 var _nextFallbackChildren2 = nextProps.fallback;
15207 var _primaryChildFragment2 = createFiberFromFragment(
15208 // It shouldn't matter what the pending props are because we aren't
15209 // going to render this fragment.
15210 null, mode, NoWork, null);
15211 _primaryChildFragment2.child = _currentPrimaryChild;
15212
15213 // Even though we're creating a new fiber, there are no new children,
15214 // because we're reusing an already mounted tree. So we don't need to
15215 // schedule a placement.
15216 // primaryChildFragment.effectTag |= Placement;
15217
15218 if ((workInProgress.mode & ConcurrentMode) === NoContext) {
15219 // Outside of concurrent mode, we commit the effects from the
15220 var _progressedState2 = workInProgress.memoizedState;
15221 var _progressedPrimaryChild2 = _progressedState2 !== null ? workInProgress.child.child : workInProgress.child;
15222 _primaryChildFragment2.child = _progressedPrimaryChild2;
15223 }
15224
15225 // Because primaryChildFragment is a new fiber that we're inserting as the
15226 // parent of a new tree, we need to set its treeBaseDuration.
15227 if (enableProfilerTimer && workInProgress.mode & ProfileMode) {
15228 // treeBaseDuration is the sum of all the child tree base durations.
15229 var _treeBaseDuration = 0;
15230 var _hiddenChild = _primaryChildFragment2.child;
15231 while (_hiddenChild !== null) {
15232 _treeBaseDuration += _hiddenChild.treeBaseDuration;
15233 _hiddenChild = _hiddenChild.sibling;
15234 }
15235 _primaryChildFragment2.treeBaseDuration = _treeBaseDuration;
15236 }
15237
15238 // Create a fragment from the fallback children, too.
15239 var _fallbackChildFragment2 = _primaryChildFragment2.sibling = createFiberFromFragment(_nextFallbackChildren2, mode, renderExpirationTime, null);
15240 _fallbackChildFragment2.effectTag |= Placement;
15241 child = _primaryChildFragment2;
15242 _primaryChildFragment2.childExpirationTime = NoWork;
15243 // Skip the primary children, and continue working on the
15244 // fallback children.
15245 next = _fallbackChildFragment2;
15246 child.return = next.return = workInProgress;
15247 } else {
15248 // Still haven't timed out. Continue rendering the children, like we
15249 // normally do.
15250 var _nextPrimaryChildren2 = nextProps.children;
15251 next = child = reconcileChildFibers(workInProgress, _currentPrimaryChild, _nextPrimaryChildren2, renderExpirationTime);
15252 }
15253 }
15254 workInProgress.stateNode = current$$1.stateNode;
15255 }
15256
15257 workInProgress.memoizedState = nextState;
15258 workInProgress.child = child;
15259 return next;
15260}
15261
15262function updateDehydratedSuspenseComponent(current$$1, workInProgress, renderExpirationTime) {
15263 if (current$$1 === null) {
15264 // During the first pass, we'll bail out and not drill into the children.
15265 // Instead, we'll leave the content in place and try to hydrate it later.
15266 workInProgress.expirationTime = Never;
15267 return null;
15268 }
15269 // We use childExpirationTime to indicate that a child might depend on context, so if
15270 // any context has changed, we need to treat is as if the input might have changed.
15271 var hasContextChanged$$1 = current$$1.childExpirationTime >= renderExpirationTime;
15272 if (didReceiveUpdate || hasContextChanged$$1) {
15273 // This boundary has changed since the first render. This means that we are now unable to
15274 // hydrate it. We might still be able to hydrate it using an earlier expiration time but
15275 // during this render we can't. Instead, we're going to delete the whole subtree and
15276 // instead inject a new real Suspense boundary to take its place, which may render content
15277 // or fallback. The real Suspense boundary will suspend for a while so we have some time
15278 // to ensure it can produce real content, but all state and pending events will be lost.
15279
15280 // Detach from the current dehydrated boundary.
15281 current$$1.alternate = null;
15282 workInProgress.alternate = null;
15283
15284 // Insert a deletion in the effect list.
15285 var returnFiber = workInProgress.return;
15286 !(returnFiber !== null) ? invariant(false, 'Suspense boundaries are never on the root. This is probably a bug in React.') : void 0;
15287 var last = returnFiber.lastEffect;
15288 if (last !== null) {
15289 last.nextEffect = current$$1;
15290 returnFiber.lastEffect = current$$1;
15291 } else {
15292 returnFiber.firstEffect = returnFiber.lastEffect = current$$1;
15293 }
15294 current$$1.nextEffect = null;
15295 current$$1.effectTag = Deletion;
15296
15297 // Upgrade this work in progress to a real Suspense component.
15298 workInProgress.tag = SuspenseComponent;
15299 workInProgress.stateNode = null;
15300 workInProgress.memoizedState = null;
15301 // This is now an insertion.
15302 workInProgress.effectTag |= Placement;
15303 // Retry as a real Suspense component.
15304 return updateSuspenseComponent(null, workInProgress, renderExpirationTime);
15305 }
15306 if ((workInProgress.effectTag & DidCapture) === NoEffect) {
15307 // This is the first attempt.
15308 reenterHydrationStateFromDehydratedSuspenseInstance(workInProgress);
15309 var nextProps = workInProgress.pendingProps;
15310 var nextChildren = nextProps.children;
15311 workInProgress.child = mountChildFibers(workInProgress, null, nextChildren, renderExpirationTime);
15312 return workInProgress.child;
15313 } else {
15314 // Something suspended. Leave the existing children in place.
15315 // TODO: In non-concurrent mode, should we commit the nodes we have hydrated so far?
15316 workInProgress.child = null;
15317 return null;
15318 }
15319}
15320
15321function updatePortalComponent(current$$1, workInProgress, renderExpirationTime) {
15322 pushHostContainer(workInProgress, workInProgress.stateNode.containerInfo);
15323 var nextChildren = workInProgress.pendingProps;
15324 if (current$$1 === null) {
15325 // Portals are special because we don't append the children during mount
15326 // but at commit. Therefore we need to track insertions which the normal
15327 // flow doesn't do during mount. This doesn't happen at the root because
15328 // the root always starts with a "current" with a null child.
15329 // TODO: Consider unifying this with how the root works.
15330 workInProgress.child = reconcileChildFibers(workInProgress, null, nextChildren, renderExpirationTime);
15331 } else {
15332 reconcileChildren(current$$1, workInProgress, nextChildren, renderExpirationTime);
15333 }
15334 return workInProgress.child;
15335}
15336
15337function updateContextProvider(current$$1, workInProgress, renderExpirationTime) {
15338 var providerType = workInProgress.type;
15339 var context = providerType._context;
15340
15341 var newProps = workInProgress.pendingProps;
15342 var oldProps = workInProgress.memoizedProps;
15343
15344 var newValue = newProps.value;
15345
15346 {
15347 var providerPropTypes = workInProgress.type.propTypes;
15348
15349 if (providerPropTypes) {
15350 checkPropTypes_1(providerPropTypes, newProps, 'prop', 'Context.Provider', getCurrentFiberStackInDev);
15351 }
15352 }
15353
15354 pushProvider(workInProgress, newValue);
15355
15356 if (oldProps !== null) {
15357 var oldValue = oldProps.value;
15358 var changedBits = calculateChangedBits(context, newValue, oldValue);
15359 if (changedBits === 0) {
15360 // No change. Bailout early if children are the same.
15361 if (oldProps.children === newProps.children && !hasContextChanged()) {
15362 return bailoutOnAlreadyFinishedWork(current$$1, workInProgress, renderExpirationTime);
15363 }
15364 } else {
15365 // The context value changed. Search for matching consumers and schedule
15366 // them to update.
15367 propagateContextChange(workInProgress, context, changedBits, renderExpirationTime);
15368 }
15369 }
15370
15371 var newChildren = newProps.children;
15372 reconcileChildren(current$$1, workInProgress, newChildren, renderExpirationTime);
15373 return workInProgress.child;
15374}
15375
15376var hasWarnedAboutUsingContextAsConsumer = false;
15377
15378function updateContextConsumer(current$$1, workInProgress, renderExpirationTime) {
15379 var context = workInProgress.type;
15380 // The logic below for Context differs depending on PROD or DEV mode. In
15381 // DEV mode, we create a separate object for Context.Consumer that acts
15382 // like a proxy to Context. This proxy object adds unnecessary code in PROD
15383 // so we use the old behaviour (Context.Consumer references Context) to
15384 // reduce size and overhead. The separate object references context via
15385 // a property called "_context", which also gives us the ability to check
15386 // in DEV mode if this property exists or not and warn if it does not.
15387 {
15388 if (context._context === undefined) {
15389 // This may be because it's a Context (rather than a Consumer).
15390 // Or it may be because it's older React where they're the same thing.
15391 // We only want to warn if we're sure it's a new React.
15392 if (context !== context.Consumer) {
15393 if (!hasWarnedAboutUsingContextAsConsumer) {
15394 hasWarnedAboutUsingContextAsConsumer = true;
15395 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?');
15396 }
15397 }
15398 } else {
15399 context = context._context;
15400 }
15401 }
15402 var newProps = workInProgress.pendingProps;
15403 var render = newProps.children;
15404
15405 {
15406 !(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;
15407 }
15408
15409 prepareToReadContext(workInProgress, renderExpirationTime);
15410 var newValue = readContext(context, newProps.unstable_observedBits);
15411 var newChildren = void 0;
15412 {
15413 ReactCurrentOwner$3.current = workInProgress;
15414 setCurrentPhase('render');
15415 newChildren = render(newValue);
15416 setCurrentPhase(null);
15417 }
15418
15419 // React DevTools reads this flag.
15420 workInProgress.effectTag |= PerformedWork;
15421 reconcileChildren(current$$1, workInProgress, newChildren, renderExpirationTime);
15422 return workInProgress.child;
15423}
15424
15425function markWorkInProgressReceivedUpdate() {
15426 didReceiveUpdate = true;
15427}
15428
15429function bailoutOnAlreadyFinishedWork(current$$1, workInProgress, renderExpirationTime) {
15430 cancelWorkTimer(workInProgress);
15431
15432 if (current$$1 !== null) {
15433 // Reuse previous context list
15434 workInProgress.contextDependencies = current$$1.contextDependencies;
15435 }
15436
15437 if (enableProfilerTimer) {
15438 // Don't update "base" render times for bailouts.
15439 stopProfilerTimerIfRunning(workInProgress);
15440 }
15441
15442 // Check if the children have any pending work.
15443 var childExpirationTime = workInProgress.childExpirationTime;
15444 if (childExpirationTime < renderExpirationTime) {
15445 // The children don't have any work either. We can skip them.
15446 // TODO: Once we add back resuming, we should check if the children are
15447 // a work-in-progress set. If so, we need to transfer their effects.
15448 return null;
15449 } else {
15450 // This fiber doesn't have work, but its subtree does. Clone the child
15451 // fibers and continue.
15452 cloneChildFibers(current$$1, workInProgress);
15453 return workInProgress.child;
15454 }
15455}
15456
15457function beginWork(current$$1, workInProgress, renderExpirationTime) {
15458 var updateExpirationTime = workInProgress.expirationTime;
15459
15460 if (current$$1 !== null) {
15461 var oldProps = current$$1.memoizedProps;
15462 var newProps = workInProgress.pendingProps;
15463
15464 if (oldProps !== newProps || hasContextChanged()) {
15465 // If props or context changed, mark the fiber as having performed work.
15466 // This may be unset if the props are determined to be equal later (memo).
15467 didReceiveUpdate = true;
15468 } else if (updateExpirationTime < renderExpirationTime) {
15469 didReceiveUpdate = false;
15470 // This fiber does not have any pending work. Bailout without entering
15471 // the begin phase. There's still some bookkeeping we that needs to be done
15472 // in this optimized path, mostly pushing stuff onto the stack.
15473 switch (workInProgress.tag) {
15474 case HostRoot:
15475 pushHostRootContext(workInProgress);
15476 resetHydrationState();
15477 break;
15478 case HostComponent:
15479 pushHostContext(workInProgress);
15480 break;
15481 case ClassComponent:
15482 {
15483 var Component = workInProgress.type;
15484 if (isContextProvider(Component)) {
15485 pushContextProvider(workInProgress);
15486 }
15487 break;
15488 }
15489 case HostPortal:
15490 pushHostContainer(workInProgress, workInProgress.stateNode.containerInfo);
15491 break;
15492 case ContextProvider:
15493 {
15494 var newValue = workInProgress.memoizedProps.value;
15495 pushProvider(workInProgress, newValue);
15496 break;
15497 }
15498 case Profiler:
15499 if (enableProfilerTimer) {
15500 workInProgress.effectTag |= Update;
15501 }
15502 break;
15503 case SuspenseComponent:
15504 {
15505 var state = workInProgress.memoizedState;
15506 var didTimeout = state !== null;
15507 if (didTimeout) {
15508 // If this boundary is currently timed out, we need to decide
15509 // whether to retry the primary children, or to skip over it and
15510 // go straight to the fallback. Check the priority of the primary
15511 var primaryChildFragment = workInProgress.child;
15512 var primaryChildExpirationTime = primaryChildFragment.childExpirationTime;
15513 if (primaryChildExpirationTime !== NoWork && primaryChildExpirationTime >= renderExpirationTime) {
15514 // The primary children have pending work. Use the normal path
15515 // to attempt to render the primary children again.
15516 return updateSuspenseComponent(current$$1, workInProgress, renderExpirationTime);
15517 } else {
15518 // The primary children do not have pending work with sufficient
15519 // priority. Bailout.
15520 var child = bailoutOnAlreadyFinishedWork(current$$1, workInProgress, renderExpirationTime);
15521 if (child !== null) {
15522 // The fallback children have pending work. Skip over the
15523 // primary children and work on the fallback.
15524 return child.sibling;
15525 } else {
15526 return null;
15527 }
15528 }
15529 }
15530 break;
15531 }
15532 case DehydratedSuspenseComponent:
15533 {
15534 if (enableSuspenseServerRenderer) {
15535 // We know that this component will suspend again because if it has
15536 // been unsuspended it has committed as a regular Suspense component.
15537 // If it needs to be retried, it should have work scheduled on it.
15538 workInProgress.effectTag |= DidCapture;
15539 break;
15540 }
15541 }
15542 }
15543 return bailoutOnAlreadyFinishedWork(current$$1, workInProgress, renderExpirationTime);
15544 }
15545 } else {
15546 didReceiveUpdate = false;
15547 }
15548
15549 // Before entering the begin phase, clear the expiration time.
15550 workInProgress.expirationTime = NoWork;
15551
15552 switch (workInProgress.tag) {
15553 case IndeterminateComponent:
15554 {
15555 var elementType = workInProgress.elementType;
15556 return mountIndeterminateComponent(current$$1, workInProgress, elementType, renderExpirationTime);
15557 }
15558 case LazyComponent:
15559 {
15560 var _elementType = workInProgress.elementType;
15561 return mountLazyComponent(current$$1, workInProgress, _elementType, updateExpirationTime, renderExpirationTime);
15562 }
15563 case FunctionComponent:
15564 {
15565 var _Component = workInProgress.type;
15566 var unresolvedProps = workInProgress.pendingProps;
15567 var resolvedProps = workInProgress.elementType === _Component ? unresolvedProps : resolveDefaultProps(_Component, unresolvedProps);
15568 return updateFunctionComponent(current$$1, workInProgress, _Component, resolvedProps, renderExpirationTime);
15569 }
15570 case ClassComponent:
15571 {
15572 var _Component2 = workInProgress.type;
15573 var _unresolvedProps = workInProgress.pendingProps;
15574 var _resolvedProps = workInProgress.elementType === _Component2 ? _unresolvedProps : resolveDefaultProps(_Component2, _unresolvedProps);
15575 return updateClassComponent(current$$1, workInProgress, _Component2, _resolvedProps, renderExpirationTime);
15576 }
15577 case HostRoot:
15578 return updateHostRoot(current$$1, workInProgress, renderExpirationTime);
15579 case HostComponent:
15580 return updateHostComponent(current$$1, workInProgress, renderExpirationTime);
15581 case HostText:
15582 return updateHostText(current$$1, workInProgress);
15583 case SuspenseComponent:
15584 return updateSuspenseComponent(current$$1, workInProgress, renderExpirationTime);
15585 case HostPortal:
15586 return updatePortalComponent(current$$1, workInProgress, renderExpirationTime);
15587 case ForwardRef:
15588 {
15589 var type = workInProgress.type;
15590 var _unresolvedProps2 = workInProgress.pendingProps;
15591 var _resolvedProps2 = workInProgress.elementType === type ? _unresolvedProps2 : resolveDefaultProps(type, _unresolvedProps2);
15592 return updateForwardRef(current$$1, workInProgress, type, _resolvedProps2, renderExpirationTime);
15593 }
15594 case Fragment:
15595 return updateFragment(current$$1, workInProgress, renderExpirationTime);
15596 case Mode:
15597 return updateMode(current$$1, workInProgress, renderExpirationTime);
15598 case Profiler:
15599 return updateProfiler(current$$1, workInProgress, renderExpirationTime);
15600 case ContextProvider:
15601 return updateContextProvider(current$$1, workInProgress, renderExpirationTime);
15602 case ContextConsumer:
15603 return updateContextConsumer(current$$1, workInProgress, renderExpirationTime);
15604 case MemoComponent:
15605 {
15606 var _type2 = workInProgress.type;
15607 var _unresolvedProps3 = workInProgress.pendingProps;
15608 // Resolve outer props first, then resolve inner props.
15609 var _resolvedProps3 = resolveDefaultProps(_type2, _unresolvedProps3);
15610 {
15611 if (workInProgress.type !== workInProgress.elementType) {
15612 var outerPropTypes = _type2.propTypes;
15613 if (outerPropTypes) {
15614 checkPropTypes_1(outerPropTypes, _resolvedProps3, // Resolved for outer only
15615 'prop', getComponentName(_type2), getCurrentFiberStackInDev);
15616 }
15617 }
15618 }
15619 _resolvedProps3 = resolveDefaultProps(_type2.type, _resolvedProps3);
15620 return updateMemoComponent(current$$1, workInProgress, _type2, _resolvedProps3, updateExpirationTime, renderExpirationTime);
15621 }
15622 case SimpleMemoComponent:
15623 {
15624 return updateSimpleMemoComponent(current$$1, workInProgress, workInProgress.type, workInProgress.pendingProps, updateExpirationTime, renderExpirationTime);
15625 }
15626 case IncompleteClassComponent:
15627 {
15628 var _Component3 = workInProgress.type;
15629 var _unresolvedProps4 = workInProgress.pendingProps;
15630 var _resolvedProps4 = workInProgress.elementType === _Component3 ? _unresolvedProps4 : resolveDefaultProps(_Component3, _unresolvedProps4);
15631 return mountIncompleteClassComponent(current$$1, workInProgress, _Component3, _resolvedProps4, renderExpirationTime);
15632 }
15633 case DehydratedSuspenseComponent:
15634 {
15635 if (enableSuspenseServerRenderer) {
15636 return updateDehydratedSuspenseComponent(current$$1, workInProgress, renderExpirationTime);
15637 }
15638 break;
15639 }
15640 }
15641 invariant(false, 'Unknown unit of work tag. This error is likely caused by a bug in React. Please file an issue.');
15642}
15643
15644var valueCursor = createCursor(null);
15645
15646var rendererSigil = void 0;
15647{
15648 // Use this to detect multiple renderers using the same context
15649 rendererSigil = {};
15650}
15651
15652var currentlyRenderingFiber = null;
15653var lastContextDependency = null;
15654var lastContextWithAllBitsObserved = null;
15655
15656var isDisallowedContextReadInDEV = false;
15657
15658function resetContextDependences() {
15659 // This is called right before React yields execution, to ensure `readContext`
15660 // cannot be called outside the render phase.
15661 currentlyRenderingFiber = null;
15662 lastContextDependency = null;
15663 lastContextWithAllBitsObserved = null;
15664 {
15665 isDisallowedContextReadInDEV = false;
15666 }
15667}
15668
15669function enterDisallowedContextReadInDEV() {
15670 {
15671 isDisallowedContextReadInDEV = true;
15672 }
15673}
15674
15675function exitDisallowedContextReadInDEV() {
15676 {
15677 isDisallowedContextReadInDEV = false;
15678 }
15679}
15680
15681function pushProvider(providerFiber, nextValue) {
15682 var context = providerFiber.type._context;
15683
15684 if (isPrimaryRenderer) {
15685 push(valueCursor, context._currentValue, providerFiber);
15686
15687 context._currentValue = nextValue;
15688 {
15689 !(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;
15690 context._currentRenderer = rendererSigil;
15691 }
15692 } else {
15693 push(valueCursor, context._currentValue2, providerFiber);
15694
15695 context._currentValue2 = nextValue;
15696 {
15697 !(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;
15698 context._currentRenderer2 = rendererSigil;
15699 }
15700 }
15701}
15702
15703function popProvider(providerFiber) {
15704 var currentValue = valueCursor.current;
15705
15706 pop(valueCursor, providerFiber);
15707
15708 var context = providerFiber.type._context;
15709 if (isPrimaryRenderer) {
15710 context._currentValue = currentValue;
15711 } else {
15712 context._currentValue2 = currentValue;
15713 }
15714}
15715
15716function calculateChangedBits(context, newValue, oldValue) {
15717 if (is(oldValue, newValue)) {
15718 // No change
15719 return 0;
15720 } else {
15721 var changedBits = typeof context._calculateChangedBits === 'function' ? context._calculateChangedBits(oldValue, newValue) : maxSigned31BitInt;
15722
15723 {
15724 !((changedBits & maxSigned31BitInt) === changedBits) ? warning$1(false, 'calculateChangedBits: Expected the return value to be a ' + '31-bit integer. Instead received: %s', changedBits) : void 0;
15725 }
15726 return changedBits | 0;
15727 }
15728}
15729
15730function scheduleWorkOnParentPath(parent, renderExpirationTime) {
15731 // Update the child expiration time of all the ancestors, including
15732 // the alternates.
15733 var node = parent;
15734 while (node !== null) {
15735 var alternate = node.alternate;
15736 if (node.childExpirationTime < renderExpirationTime) {
15737 node.childExpirationTime = renderExpirationTime;
15738 if (alternate !== null && alternate.childExpirationTime < renderExpirationTime) {
15739 alternate.childExpirationTime = renderExpirationTime;
15740 }
15741 } else if (alternate !== null && alternate.childExpirationTime < renderExpirationTime) {
15742 alternate.childExpirationTime = renderExpirationTime;
15743 } else {
15744 // Neither alternate was updated, which means the rest of the
15745 // ancestor path already has sufficient priority.
15746 break;
15747 }
15748 node = node.return;
15749 }
15750}
15751
15752function propagateContextChange(workInProgress, context, changedBits, renderExpirationTime) {
15753 var fiber = workInProgress.child;
15754 if (fiber !== null) {
15755 // Set the return pointer of the child to the work-in-progress fiber.
15756 fiber.return = workInProgress;
15757 }
15758 while (fiber !== null) {
15759 var nextFiber = void 0;
15760
15761 // Visit this fiber.
15762 var list = fiber.contextDependencies;
15763 if (list !== null) {
15764 nextFiber = fiber.child;
15765
15766 var dependency = list.first;
15767 while (dependency !== null) {
15768 // Check if the context matches.
15769 if (dependency.context === context && (dependency.observedBits & changedBits) !== 0) {
15770 // Match! Schedule an update on this fiber.
15771
15772 if (fiber.tag === ClassComponent) {
15773 // Schedule a force update on the work-in-progress.
15774 var update = createUpdate(renderExpirationTime);
15775 update.tag = ForceUpdate;
15776 // TODO: Because we don't have a work-in-progress, this will add the
15777 // update to the current fiber, too, which means it will persist even if
15778 // this render is thrown away. Since it's a race condition, not sure it's
15779 // worth fixing.
15780 enqueueUpdate(fiber, update);
15781 }
15782
15783 if (fiber.expirationTime < renderExpirationTime) {
15784 fiber.expirationTime = renderExpirationTime;
15785 }
15786 var alternate = fiber.alternate;
15787 if (alternate !== null && alternate.expirationTime < renderExpirationTime) {
15788 alternate.expirationTime = renderExpirationTime;
15789 }
15790
15791 scheduleWorkOnParentPath(fiber.return, renderExpirationTime);
15792
15793 // Mark the expiration time on the list, too.
15794 if (list.expirationTime < renderExpirationTime) {
15795 list.expirationTime = renderExpirationTime;
15796 }
15797
15798 // Since we already found a match, we can stop traversing the
15799 // dependency list.
15800 break;
15801 }
15802 dependency = dependency.next;
15803 }
15804 } else if (fiber.tag === ContextProvider) {
15805 // Don't scan deeper if this is a matching provider
15806 nextFiber = fiber.type === workInProgress.type ? null : fiber.child;
15807 } else if (enableSuspenseServerRenderer && fiber.tag === DehydratedSuspenseComponent) {
15808 // If a dehydrated suspense component is in this subtree, we don't know
15809 // if it will have any context consumers in it. The best we can do is
15810 // mark it as having updates on its children.
15811 if (fiber.expirationTime < renderExpirationTime) {
15812 fiber.expirationTime = renderExpirationTime;
15813 }
15814 var _alternate = fiber.alternate;
15815 if (_alternate !== null && _alternate.expirationTime < renderExpirationTime) {
15816 _alternate.expirationTime = renderExpirationTime;
15817 }
15818 // This is intentionally passing this fiber as the parent
15819 // because we want to schedule this fiber as having work
15820 // on its children. We'll use the childExpirationTime on
15821 // this fiber to indicate that a context has changed.
15822 scheduleWorkOnParentPath(fiber, renderExpirationTime);
15823 nextFiber = fiber.sibling;
15824 } else {
15825 // Traverse down.
15826 nextFiber = fiber.child;
15827 }
15828
15829 if (nextFiber !== null) {
15830 // Set the return pointer of the child to the work-in-progress fiber.
15831 nextFiber.return = fiber;
15832 } else {
15833 // No child. Traverse to next sibling.
15834 nextFiber = fiber;
15835 while (nextFiber !== null) {
15836 if (nextFiber === workInProgress) {
15837 // We're back to the root of this subtree. Exit.
15838 nextFiber = null;
15839 break;
15840 }
15841 var sibling = nextFiber.sibling;
15842 if (sibling !== null) {
15843 // Set the return pointer of the sibling to the work-in-progress fiber.
15844 sibling.return = nextFiber.return;
15845 nextFiber = sibling;
15846 break;
15847 }
15848 // No more siblings. Traverse up.
15849 nextFiber = nextFiber.return;
15850 }
15851 }
15852 fiber = nextFiber;
15853 }
15854}
15855
15856function prepareToReadContext(workInProgress, renderExpirationTime) {
15857 currentlyRenderingFiber = workInProgress;
15858 lastContextDependency = null;
15859 lastContextWithAllBitsObserved = null;
15860
15861 var currentDependencies = workInProgress.contextDependencies;
15862 if (currentDependencies !== null && currentDependencies.expirationTime >= renderExpirationTime) {
15863 // Context list has a pending update. Mark that this fiber performed work.
15864 markWorkInProgressReceivedUpdate();
15865 }
15866
15867 // Reset the work-in-progress list
15868 workInProgress.contextDependencies = null;
15869}
15870
15871function readContext(context, observedBits) {
15872 {
15873 // This warning would fire if you read context inside a Hook like useMemo.
15874 // Unlike the class check below, it's not enforced in production for perf.
15875 !!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;
15876 }
15877
15878 if (lastContextWithAllBitsObserved === context) {
15879 // Nothing to do. We already observe everything in this context.
15880 } else if (observedBits === false || observedBits === 0) {
15881 // Do not observe any updates.
15882 } else {
15883 var resolvedObservedBits = void 0; // Avoid deopting on observable arguments or heterogeneous types.
15884 if (typeof observedBits !== 'number' || observedBits === maxSigned31BitInt) {
15885 // Observe all updates.
15886 lastContextWithAllBitsObserved = context;
15887 resolvedObservedBits = maxSigned31BitInt;
15888 } else {
15889 resolvedObservedBits = observedBits;
15890 }
15891
15892 var contextItem = {
15893 context: context,
15894 observedBits: resolvedObservedBits,
15895 next: null
15896 };
15897
15898 if (lastContextDependency === null) {
15899 !(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;
15900
15901 // This is the first dependency for this component. Create a new list.
15902 lastContextDependency = contextItem;
15903 currentlyRenderingFiber.contextDependencies = {
15904 first: contextItem,
15905 expirationTime: NoWork
15906 };
15907 } else {
15908 // Append a new context item.
15909 lastContextDependency = lastContextDependency.next = contextItem;
15910 }
15911 }
15912 return isPrimaryRenderer ? context._currentValue : context._currentValue2;
15913}
15914
15915// UpdateQueue is a linked list of prioritized updates.
15916//
15917// Like fibers, update queues come in pairs: a current queue, which represents
15918// the visible state of the screen, and a work-in-progress queue, which can be
15919// mutated and processed asynchronously before it is committed — a form of
15920// double buffering. If a work-in-progress render is discarded before finishing,
15921// we create a new work-in-progress by cloning the current queue.
15922//
15923// Both queues share a persistent, singly-linked list structure. To schedule an
15924// update, we append it to the end of both queues. Each queue maintains a
15925// pointer to first update in the persistent list that hasn't been processed.
15926// The work-in-progress pointer always has a position equal to or greater than
15927// the current queue, since we always work on that one. The current queue's
15928// pointer is only updated during the commit phase, when we swap in the
15929// work-in-progress.
15930//
15931// For example:
15932//
15933// Current pointer: A - B - C - D - E - F
15934// Work-in-progress pointer: D - E - F
15935// ^
15936// The work-in-progress queue has
15937// processed more updates than current.
15938//
15939// The reason we append to both queues is because otherwise we might drop
15940// updates without ever processing them. For example, if we only add updates to
15941// the work-in-progress queue, some updates could be lost whenever a work-in
15942// -progress render restarts by cloning from current. Similarly, if we only add
15943// updates to the current queue, the updates will be lost whenever an already
15944// in-progress queue commits and swaps with the current queue. However, by
15945// adding to both queues, we guarantee that the update will be part of the next
15946// work-in-progress. (And because the work-in-progress queue becomes the
15947// current queue once it commits, there's no danger of applying the same
15948// update twice.)
15949//
15950// Prioritization
15951// --------------
15952//
15953// Updates are not sorted by priority, but by insertion; new updates are always
15954// appended to the end of the list.
15955//
15956// The priority is still important, though. When processing the update queue
15957// during the render phase, only the updates with sufficient priority are
15958// included in the result. If we skip an update because it has insufficient
15959// priority, it remains in the queue to be processed later, during a lower
15960// priority render. Crucially, all updates subsequent to a skipped update also
15961// remain in the queue *regardless of their priority*. That means high priority
15962// updates are sometimes processed twice, at two separate priorities. We also
15963// keep track of a base state, that represents the state before the first
15964// update in the queue is applied.
15965//
15966// For example:
15967//
15968// Given a base state of '', and the following queue of updates
15969//
15970// A1 - B2 - C1 - D2
15971//
15972// where the number indicates the priority, and the update is applied to the
15973// previous state by appending a letter, React will process these updates as
15974// two separate renders, one per distinct priority level:
15975//
15976// First render, at priority 1:
15977// Base state: ''
15978// Updates: [A1, C1]
15979// Result state: 'AC'
15980//
15981// Second render, at priority 2:
15982// Base state: 'A' <- The base state does not include C1,
15983// because B2 was skipped.
15984// Updates: [B2, C1, D2] <- C1 was rebased on top of B2
15985// Result state: 'ABCD'
15986//
15987// Because we process updates in insertion order, and rebase high priority
15988// updates when preceding updates are skipped, the final result is deterministic
15989// regardless of priority. Intermediate state may vary according to system
15990// resources, but the final state is always the same.
15991
15992var UpdateState = 0;
15993var ReplaceState = 1;
15994var ForceUpdate = 2;
15995var CaptureUpdate = 3;
15996
15997// Global state that is reset at the beginning of calling `processUpdateQueue`.
15998// It should only be read right after calling `processUpdateQueue`, via
15999// `checkHasForceUpdateAfterProcessing`.
16000var hasForceUpdate = false;
16001
16002var didWarnUpdateInsideUpdate = void 0;
16003var currentlyProcessingQueue = void 0;
16004var resetCurrentlyProcessingQueue = void 0;
16005{
16006 didWarnUpdateInsideUpdate = false;
16007 currentlyProcessingQueue = null;
16008 resetCurrentlyProcessingQueue = function () {
16009 currentlyProcessingQueue = null;
16010 };
16011}
16012
16013function createUpdateQueue(baseState) {
16014 var queue = {
16015 baseState: baseState,
16016 firstUpdate: null,
16017 lastUpdate: null,
16018 firstCapturedUpdate: null,
16019 lastCapturedUpdate: null,
16020 firstEffect: null,
16021 lastEffect: null,
16022 firstCapturedEffect: null,
16023 lastCapturedEffect: null
16024 };
16025 return queue;
16026}
16027
16028function cloneUpdateQueue(currentQueue) {
16029 var queue = {
16030 baseState: currentQueue.baseState,
16031 firstUpdate: currentQueue.firstUpdate,
16032 lastUpdate: currentQueue.lastUpdate,
16033
16034 // TODO: With resuming, if we bail out and resuse the child tree, we should
16035 // keep these effects.
16036 firstCapturedUpdate: null,
16037 lastCapturedUpdate: null,
16038
16039 firstEffect: null,
16040 lastEffect: null,
16041
16042 firstCapturedEffect: null,
16043 lastCapturedEffect: null
16044 };
16045 return queue;
16046}
16047
16048function createUpdate(expirationTime) {
16049 return {
16050 expirationTime: expirationTime,
16051
16052 tag: UpdateState,
16053 payload: null,
16054 callback: null,
16055
16056 next: null,
16057 nextEffect: null
16058 };
16059}
16060
16061function appendUpdateToQueue(queue, update) {
16062 // Append the update to the end of the list.
16063 if (queue.lastUpdate === null) {
16064 // Queue is empty
16065 queue.firstUpdate = queue.lastUpdate = update;
16066 } else {
16067 queue.lastUpdate.next = update;
16068 queue.lastUpdate = update;
16069 }
16070}
16071
16072function enqueueUpdate(fiber, update) {
16073 // Update queues are created lazily.
16074 var alternate = fiber.alternate;
16075 var queue1 = void 0;
16076 var queue2 = void 0;
16077 if (alternate === null) {
16078 // There's only one fiber.
16079 queue1 = fiber.updateQueue;
16080 queue2 = null;
16081 if (queue1 === null) {
16082 queue1 = fiber.updateQueue = createUpdateQueue(fiber.memoizedState);
16083 }
16084 } else {
16085 // There are two owners.
16086 queue1 = fiber.updateQueue;
16087 queue2 = alternate.updateQueue;
16088 if (queue1 === null) {
16089 if (queue2 === null) {
16090 // Neither fiber has an update queue. Create new ones.
16091 queue1 = fiber.updateQueue = createUpdateQueue(fiber.memoizedState);
16092 queue2 = alternate.updateQueue = createUpdateQueue(alternate.memoizedState);
16093 } else {
16094 // Only one fiber has an update queue. Clone to create a new one.
16095 queue1 = fiber.updateQueue = cloneUpdateQueue(queue2);
16096 }
16097 } else {
16098 if (queue2 === null) {
16099 // Only one fiber has an update queue. Clone to create a new one.
16100 queue2 = alternate.updateQueue = cloneUpdateQueue(queue1);
16101 } else {
16102 // Both owners have an update queue.
16103 }
16104 }
16105 }
16106 if (queue2 === null || queue1 === queue2) {
16107 // There's only a single queue.
16108 appendUpdateToQueue(queue1, update);
16109 } else {
16110 // There are two queues. We need to append the update to both queues,
16111 // while accounting for the persistent structure of the list — we don't
16112 // want the same update to be added multiple times.
16113 if (queue1.lastUpdate === null || queue2.lastUpdate === null) {
16114 // One of the queues is not empty. We must add the update to both queues.
16115 appendUpdateToQueue(queue1, update);
16116 appendUpdateToQueue(queue2, update);
16117 } else {
16118 // Both queues are non-empty. The last update is the same in both lists,
16119 // because of structural sharing. So, only append to one of the lists.
16120 appendUpdateToQueue(queue1, update);
16121 // But we still need to update the `lastUpdate` pointer of queue2.
16122 queue2.lastUpdate = update;
16123 }
16124 }
16125
16126 {
16127 if (fiber.tag === ClassComponent && (currentlyProcessingQueue === queue1 || queue2 !== null && currentlyProcessingQueue === queue2) && !didWarnUpdateInsideUpdate) {
16128 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.');
16129 didWarnUpdateInsideUpdate = true;
16130 }
16131 }
16132}
16133
16134function enqueueCapturedUpdate(workInProgress, update) {
16135 // Captured updates go into a separate list, and only on the work-in-
16136 // progress queue.
16137 var workInProgressQueue = workInProgress.updateQueue;
16138 if (workInProgressQueue === null) {
16139 workInProgressQueue = workInProgress.updateQueue = createUpdateQueue(workInProgress.memoizedState);
16140 } else {
16141 // TODO: I put this here rather than createWorkInProgress so that we don't
16142 // clone the queue unnecessarily. There's probably a better way to
16143 // structure this.
16144 workInProgressQueue = ensureWorkInProgressQueueIsAClone(workInProgress, workInProgressQueue);
16145 }
16146
16147 // Append the update to the end of the list.
16148 if (workInProgressQueue.lastCapturedUpdate === null) {
16149 // This is the first render phase update
16150 workInProgressQueue.firstCapturedUpdate = workInProgressQueue.lastCapturedUpdate = update;
16151 } else {
16152 workInProgressQueue.lastCapturedUpdate.next = update;
16153 workInProgressQueue.lastCapturedUpdate = update;
16154 }
16155}
16156
16157function ensureWorkInProgressQueueIsAClone(workInProgress, queue) {
16158 var current = workInProgress.alternate;
16159 if (current !== null) {
16160 // If the work-in-progress queue is equal to the current queue,
16161 // we need to clone it first.
16162 if (queue === current.updateQueue) {
16163 queue = workInProgress.updateQueue = cloneUpdateQueue(queue);
16164 }
16165 }
16166 return queue;
16167}
16168
16169function getStateFromUpdate(workInProgress, queue, update, prevState, nextProps, instance) {
16170 switch (update.tag) {
16171 case ReplaceState:
16172 {
16173 var _payload = update.payload;
16174 if (typeof _payload === 'function') {
16175 // Updater function
16176 {
16177 enterDisallowedContextReadInDEV();
16178 if (debugRenderPhaseSideEffects || debugRenderPhaseSideEffectsForStrictMode && workInProgress.mode & StrictMode) {
16179 _payload.call(instance, prevState, nextProps);
16180 }
16181 }
16182 var nextState = _payload.call(instance, prevState, nextProps);
16183 {
16184 exitDisallowedContextReadInDEV();
16185 }
16186 return nextState;
16187 }
16188 // State object
16189 return _payload;
16190 }
16191 case CaptureUpdate:
16192 {
16193 workInProgress.effectTag = workInProgress.effectTag & ~ShouldCapture | DidCapture;
16194 }
16195 // Intentional fallthrough
16196 case UpdateState:
16197 {
16198 var _payload2 = update.payload;
16199 var partialState = void 0;
16200 if (typeof _payload2 === 'function') {
16201 // Updater function
16202 {
16203 enterDisallowedContextReadInDEV();
16204 if (debugRenderPhaseSideEffects || debugRenderPhaseSideEffectsForStrictMode && workInProgress.mode & StrictMode) {
16205 _payload2.call(instance, prevState, nextProps);
16206 }
16207 }
16208 partialState = _payload2.call(instance, prevState, nextProps);
16209 {
16210 exitDisallowedContextReadInDEV();
16211 }
16212 } else {
16213 // Partial state object
16214 partialState = _payload2;
16215 }
16216 if (partialState === null || partialState === undefined) {
16217 // Null and undefined are treated as no-ops.
16218 return prevState;
16219 }
16220 // Merge the partial state and the previous state.
16221 return _assign({}, prevState, partialState);
16222 }
16223 case ForceUpdate:
16224 {
16225 hasForceUpdate = true;
16226 return prevState;
16227 }
16228 }
16229 return prevState;
16230}
16231
16232function processUpdateQueue(workInProgress, queue, props, instance, renderExpirationTime) {
16233 hasForceUpdate = false;
16234
16235 queue = ensureWorkInProgressQueueIsAClone(workInProgress, queue);
16236
16237 {
16238 currentlyProcessingQueue = queue;
16239 }
16240
16241 // These values may change as we process the queue.
16242 var newBaseState = queue.baseState;
16243 var newFirstUpdate = null;
16244 var newExpirationTime = NoWork;
16245
16246 // Iterate through the list of updates to compute the result.
16247 var update = queue.firstUpdate;
16248 var resultState = newBaseState;
16249 while (update !== null) {
16250 var updateExpirationTime = update.expirationTime;
16251 if (updateExpirationTime < renderExpirationTime) {
16252 // This update does not have sufficient priority. Skip it.
16253 if (newFirstUpdate === null) {
16254 // This is the first skipped update. It will be the first update in
16255 // the new list.
16256 newFirstUpdate = update;
16257 // Since this is the first update that was skipped, the current result
16258 // is the new base state.
16259 newBaseState = resultState;
16260 }
16261 // Since this update will remain in the list, update the remaining
16262 // expiration time.
16263 if (newExpirationTime < updateExpirationTime) {
16264 newExpirationTime = updateExpirationTime;
16265 }
16266 } else {
16267 // This update does have sufficient priority. Process it and compute
16268 // a new result.
16269 resultState = getStateFromUpdate(workInProgress, queue, update, resultState, props, instance);
16270 var _callback = update.callback;
16271 if (_callback !== null) {
16272 workInProgress.effectTag |= Callback;
16273 // Set this to null, in case it was mutated during an aborted render.
16274 update.nextEffect = null;
16275 if (queue.lastEffect === null) {
16276 queue.firstEffect = queue.lastEffect = update;
16277 } else {
16278 queue.lastEffect.nextEffect = update;
16279 queue.lastEffect = update;
16280 }
16281 }
16282 }
16283 // Continue to the next update.
16284 update = update.next;
16285 }
16286
16287 // Separately, iterate though the list of captured updates.
16288 var newFirstCapturedUpdate = null;
16289 update = queue.firstCapturedUpdate;
16290 while (update !== null) {
16291 var _updateExpirationTime = update.expirationTime;
16292 if (_updateExpirationTime < renderExpirationTime) {
16293 // This update does not have sufficient priority. Skip it.
16294 if (newFirstCapturedUpdate === null) {
16295 // This is the first skipped captured update. It will be the first
16296 // update in the new list.
16297 newFirstCapturedUpdate = update;
16298 // If this is the first update that was skipped, the current result is
16299 // the new base state.
16300 if (newFirstUpdate === null) {
16301 newBaseState = resultState;
16302 }
16303 }
16304 // Since this update will remain in the list, update the remaining
16305 // expiration time.
16306 if (newExpirationTime < _updateExpirationTime) {
16307 newExpirationTime = _updateExpirationTime;
16308 }
16309 } else {
16310 // This update does have sufficient priority. Process it and compute
16311 // a new result.
16312 resultState = getStateFromUpdate(workInProgress, queue, update, resultState, props, instance);
16313 var _callback2 = update.callback;
16314 if (_callback2 !== null) {
16315 workInProgress.effectTag |= Callback;
16316 // Set this to null, in case it was mutated during an aborted render.
16317 update.nextEffect = null;
16318 if (queue.lastCapturedEffect === null) {
16319 queue.firstCapturedEffect = queue.lastCapturedEffect = update;
16320 } else {
16321 queue.lastCapturedEffect.nextEffect = update;
16322 queue.lastCapturedEffect = update;
16323 }
16324 }
16325 }
16326 update = update.next;
16327 }
16328
16329 if (newFirstUpdate === null) {
16330 queue.lastUpdate = null;
16331 }
16332 if (newFirstCapturedUpdate === null) {
16333 queue.lastCapturedUpdate = null;
16334 } else {
16335 workInProgress.effectTag |= Callback;
16336 }
16337 if (newFirstUpdate === null && newFirstCapturedUpdate === null) {
16338 // We processed every update, without skipping. That means the new base
16339 // state is the same as the result state.
16340 newBaseState = resultState;
16341 }
16342
16343 queue.baseState = newBaseState;
16344 queue.firstUpdate = newFirstUpdate;
16345 queue.firstCapturedUpdate = newFirstCapturedUpdate;
16346
16347 // Set the remaining expiration time to be whatever is remaining in the queue.
16348 // This should be fine because the only two other things that contribute to
16349 // expiration time are props and context. We're already in the middle of the
16350 // begin phase by the time we start processing the queue, so we've already
16351 // dealt with the props. Context in components that specify
16352 // shouldComponentUpdate is tricky; but we'll have to account for
16353 // that regardless.
16354 workInProgress.expirationTime = newExpirationTime;
16355 workInProgress.memoizedState = resultState;
16356
16357 {
16358 currentlyProcessingQueue = null;
16359 }
16360}
16361
16362function callCallback(callback, context) {
16363 !(typeof callback === 'function') ? invariant(false, 'Invalid argument passed as callback. Expected a function. Instead received: %s', callback) : void 0;
16364 callback.call(context);
16365}
16366
16367function resetHasForceUpdateBeforeProcessing() {
16368 hasForceUpdate = false;
16369}
16370
16371function checkHasForceUpdateAfterProcessing() {
16372 return hasForceUpdate;
16373}
16374
16375function commitUpdateQueue(finishedWork, finishedQueue, instance, renderExpirationTime) {
16376 // If the finished render included captured updates, and there are still
16377 // lower priority updates left over, we need to keep the captured updates
16378 // in the queue so that they are rebased and not dropped once we process the
16379 // queue again at the lower priority.
16380 if (finishedQueue.firstCapturedUpdate !== null) {
16381 // Join the captured update list to the end of the normal list.
16382 if (finishedQueue.lastUpdate !== null) {
16383 finishedQueue.lastUpdate.next = finishedQueue.firstCapturedUpdate;
16384 finishedQueue.lastUpdate = finishedQueue.lastCapturedUpdate;
16385 }
16386 // Clear the list of captured updates.
16387 finishedQueue.firstCapturedUpdate = finishedQueue.lastCapturedUpdate = null;
16388 }
16389
16390 // Commit the effects
16391 commitUpdateEffects(finishedQueue.firstEffect, instance);
16392 finishedQueue.firstEffect = finishedQueue.lastEffect = null;
16393
16394 commitUpdateEffects(finishedQueue.firstCapturedEffect, instance);
16395 finishedQueue.firstCapturedEffect = finishedQueue.lastCapturedEffect = null;
16396}
16397
16398function commitUpdateEffects(effect, instance) {
16399 while (effect !== null) {
16400 var _callback3 = effect.callback;
16401 if (_callback3 !== null) {
16402 effect.callback = null;
16403 callCallback(_callback3, instance);
16404 }
16405 effect = effect.nextEffect;
16406 }
16407}
16408
16409function createCapturedValue(value, source) {
16410 // If the value is an error, call this function immediately after it is thrown
16411 // so the stack is accurate.
16412 return {
16413 value: value,
16414 source: source,
16415 stack: getStackByFiberInDevAndProd(source)
16416 };
16417}
16418
16419function markUpdate(workInProgress) {
16420 // Tag the fiber with an update effect. This turns a Placement into
16421 // a PlacementAndUpdate.
16422 workInProgress.effectTag |= Update;
16423}
16424
16425function markRef$1(workInProgress) {
16426 workInProgress.effectTag |= Ref;
16427}
16428
16429var appendAllChildren = void 0;
16430var updateHostContainer = void 0;
16431var updateHostComponent$1 = void 0;
16432var updateHostText$1 = void 0;
16433if (supportsMutation) {
16434 // Mutation mode
16435
16436 appendAllChildren = function (parent, workInProgress, needsVisibilityToggle, isHidden) {
16437 // We only have the top Fiber that was created but we need recurse down its
16438 // children to find all the terminal nodes.
16439 var node = workInProgress.child;
16440 while (node !== null) {
16441 if (node.tag === HostComponent || node.tag === HostText) {
16442 appendInitialChild(parent, node.stateNode);
16443 } else if (node.tag === HostPortal) {
16444 // If we have a portal child, then we don't want to traverse
16445 // down its children. Instead, we'll get insertions from each child in
16446 // the portal directly.
16447 } else if (node.child !== null) {
16448 node.child.return = node;
16449 node = node.child;
16450 continue;
16451 }
16452 if (node === workInProgress) {
16453 return;
16454 }
16455 while (node.sibling === null) {
16456 if (node.return === null || node.return === workInProgress) {
16457 return;
16458 }
16459 node = node.return;
16460 }
16461 node.sibling.return = node.return;
16462 node = node.sibling;
16463 }
16464 };
16465
16466 updateHostContainer = function (workInProgress) {
16467 // Noop
16468 };
16469 updateHostComponent$1 = function (current, workInProgress, type, newProps, rootContainerInstance) {
16470 // If we have an alternate, that means this is an update and we need to
16471 // schedule a side-effect to do the updates.
16472 var oldProps = current.memoizedProps;
16473 if (oldProps === newProps) {
16474 // In mutation mode, this is sufficient for a bailout because
16475 // we won't touch this node even if children changed.
16476 return;
16477 }
16478
16479 // If we get updated because one of our children updated, we don't
16480 // have newProps so we'll have to reuse them.
16481 // TODO: Split the update API as separate for the props vs. children.
16482 // Even better would be if children weren't special cased at all tho.
16483 var instance = workInProgress.stateNode;
16484 var currentHostContext = getHostContext();
16485 // TODO: Experiencing an error where oldProps is null. Suggests a host
16486 // component is hitting the resume path. Figure out why. Possibly
16487 // related to `hidden`.
16488 var updatePayload = prepareUpdate(instance, type, oldProps, newProps, rootContainerInstance, currentHostContext);
16489 // TODO: Type this specific to this type of component.
16490 workInProgress.updateQueue = updatePayload;
16491 // If the update payload indicates that there is a change or if there
16492 // is a new ref we mark this as an update. All the work is done in commitWork.
16493 if (updatePayload) {
16494 markUpdate(workInProgress);
16495 }
16496 };
16497 updateHostText$1 = function (current, workInProgress, oldText, newText) {
16498 // If the text differs, mark it as an update. All the work in done in commitWork.
16499 if (oldText !== newText) {
16500 markUpdate(workInProgress);
16501 }
16502 };
16503} else if (supportsPersistence) {
16504 // Persistent host tree mode
16505
16506 appendAllChildren = function (parent, workInProgress, needsVisibilityToggle, isHidden) {
16507 // We only have the top Fiber that was created but we need recurse down its
16508 // children to find all the terminal nodes.
16509 var node = workInProgress.child;
16510 while (node !== null) {
16511 // eslint-disable-next-line no-labels
16512 branches: if (node.tag === HostComponent) {
16513 var instance = node.stateNode;
16514 if (needsVisibilityToggle) {
16515 var props = node.memoizedProps;
16516 var type = node.type;
16517 if (isHidden) {
16518 // This child is inside a timed out tree. Hide it.
16519 instance = cloneHiddenInstance(instance, type, props, node);
16520 } else {
16521 // This child was previously inside a timed out tree. If it was not
16522 // updated during this render, it may need to be unhidden. Clone
16523 // again to be sure.
16524 instance = cloneUnhiddenInstance(instance, type, props, node);
16525 }
16526 node.stateNode = instance;
16527 }
16528 appendInitialChild(parent, instance);
16529 } else if (node.tag === HostText) {
16530 var _instance = node.stateNode;
16531 if (needsVisibilityToggle) {
16532 var text = node.memoizedProps;
16533 var rootContainerInstance = getRootHostContainer();
16534 var currentHostContext = getHostContext();
16535 if (isHidden) {
16536 _instance = createHiddenTextInstance(text, rootContainerInstance, currentHostContext, workInProgress);
16537 } else {
16538 _instance = createTextInstance(text, rootContainerInstance, currentHostContext, workInProgress);
16539 }
16540 node.stateNode = _instance;
16541 }
16542 appendInitialChild(parent, _instance);
16543 } else if (node.tag === HostPortal) {
16544 // If we have a portal child, then we don't want to traverse
16545 // down its children. Instead, we'll get insertions from each child in
16546 // the portal directly.
16547 } else if (node.tag === SuspenseComponent) {
16548 var current = node.alternate;
16549 if (current !== null) {
16550 var oldState = current.memoizedState;
16551 var newState = node.memoizedState;
16552 var oldIsHidden = oldState !== null;
16553 var newIsHidden = newState !== null;
16554 if (oldIsHidden !== newIsHidden) {
16555 // The placeholder either just timed out or switched back to the normal
16556 // children after having previously timed out. Toggle the visibility of
16557 // the direct host children.
16558 var primaryChildParent = newIsHidden ? node.child : node;
16559 if (primaryChildParent !== null) {
16560 appendAllChildren(parent, primaryChildParent, true, newIsHidden);
16561 }
16562 // eslint-disable-next-line no-labels
16563 break branches;
16564 }
16565 }
16566 if (node.child !== null) {
16567 // Continue traversing like normal
16568 node.child.return = node;
16569 node = node.child;
16570 continue;
16571 }
16572 } else if (node.child !== null) {
16573 node.child.return = node;
16574 node = node.child;
16575 continue;
16576 }
16577 // $FlowFixMe This is correct but Flow is confused by the labeled break.
16578 node = node;
16579 if (node === workInProgress) {
16580 return;
16581 }
16582 while (node.sibling === null) {
16583 if (node.return === null || node.return === workInProgress) {
16584 return;
16585 }
16586 node = node.return;
16587 }
16588 node.sibling.return = node.return;
16589 node = node.sibling;
16590 }
16591 };
16592
16593 // An unfortunate fork of appendAllChildren because we have two different parent types.
16594 var appendAllChildrenToContainer = function (containerChildSet, workInProgress, needsVisibilityToggle, isHidden) {
16595 // We only have the top Fiber that was created but we need recurse down its
16596 // children to find all the terminal nodes.
16597 var node = workInProgress.child;
16598 while (node !== null) {
16599 // eslint-disable-next-line no-labels
16600 branches: if (node.tag === HostComponent) {
16601 var instance = node.stateNode;
16602 if (needsVisibilityToggle) {
16603 var props = node.memoizedProps;
16604 var type = node.type;
16605 if (isHidden) {
16606 // This child is inside a timed out tree. Hide it.
16607 instance = cloneHiddenInstance(instance, type, props, node);
16608 } else {
16609 // This child was previously inside a timed out tree. If it was not
16610 // updated during this render, it may need to be unhidden. Clone
16611 // again to be sure.
16612 instance = cloneUnhiddenInstance(instance, type, props, node);
16613 }
16614 node.stateNode = instance;
16615 }
16616 appendChildToContainerChildSet(containerChildSet, instance);
16617 } else if (node.tag === HostText) {
16618 var _instance2 = node.stateNode;
16619 if (needsVisibilityToggle) {
16620 var text = node.memoizedProps;
16621 var rootContainerInstance = getRootHostContainer();
16622 var currentHostContext = getHostContext();
16623 if (isHidden) {
16624 _instance2 = createHiddenTextInstance(text, rootContainerInstance, currentHostContext, workInProgress);
16625 } else {
16626 _instance2 = createTextInstance(text, rootContainerInstance, currentHostContext, workInProgress);
16627 }
16628 node.stateNode = _instance2;
16629 }
16630 appendChildToContainerChildSet(containerChildSet, _instance2);
16631 } else if (node.tag === HostPortal) {
16632 // If we have a portal child, then we don't want to traverse
16633 // down its children. Instead, we'll get insertions from each child in
16634 // the portal directly.
16635 } else if (node.tag === SuspenseComponent) {
16636 var current = node.alternate;
16637 if (current !== null) {
16638 var oldState = current.memoizedState;
16639 var newState = node.memoizedState;
16640 var oldIsHidden = oldState !== null;
16641 var newIsHidden = newState !== null;
16642 if (oldIsHidden !== newIsHidden) {
16643 // The placeholder either just timed out or switched back to the normal
16644 // children after having previously timed out. Toggle the visibility of
16645 // the direct host children.
16646 var primaryChildParent = newIsHidden ? node.child : node;
16647 if (primaryChildParent !== null) {
16648 appendAllChildrenToContainer(containerChildSet, primaryChildParent, true, newIsHidden);
16649 }
16650 // eslint-disable-next-line no-labels
16651 break branches;
16652 }
16653 }
16654 if (node.child !== null) {
16655 // Continue traversing like normal
16656 node.child.return = node;
16657 node = node.child;
16658 continue;
16659 }
16660 } else if (node.child !== null) {
16661 node.child.return = node;
16662 node = node.child;
16663 continue;
16664 }
16665 // $FlowFixMe This is correct but Flow is confused by the labeled break.
16666 node = node;
16667 if (node === workInProgress) {
16668 return;
16669 }
16670 while (node.sibling === null) {
16671 if (node.return === null || node.return === workInProgress) {
16672 return;
16673 }
16674 node = node.return;
16675 }
16676 node.sibling.return = node.return;
16677 node = node.sibling;
16678 }
16679 };
16680 updateHostContainer = function (workInProgress) {
16681 var portalOrRoot = workInProgress.stateNode;
16682 var childrenUnchanged = workInProgress.firstEffect === null;
16683 if (childrenUnchanged) {
16684 // No changes, just reuse the existing instance.
16685 } else {
16686 var container = portalOrRoot.containerInfo;
16687 var newChildSet = createContainerChildSet(container);
16688 // If children might have changed, we have to add them all to the set.
16689 appendAllChildrenToContainer(newChildSet, workInProgress, false, false);
16690 portalOrRoot.pendingChildren = newChildSet;
16691 // Schedule an update on the container to swap out the container.
16692 markUpdate(workInProgress);
16693 finalizeContainerChildren(container, newChildSet);
16694 }
16695 };
16696 updateHostComponent$1 = function (current, workInProgress, type, newProps, rootContainerInstance) {
16697 var currentInstance = current.stateNode;
16698 var oldProps = current.memoizedProps;
16699 // If there are no effects associated with this node, then none of our children had any updates.
16700 // This guarantees that we can reuse all of them.
16701 var childrenUnchanged = workInProgress.firstEffect === null;
16702 if (childrenUnchanged && oldProps === newProps) {
16703 // No changes, just reuse the existing instance.
16704 // Note that this might release a previous clone.
16705 workInProgress.stateNode = currentInstance;
16706 return;
16707 }
16708 var recyclableInstance = workInProgress.stateNode;
16709 var currentHostContext = getHostContext();
16710 var updatePayload = null;
16711 if (oldProps !== newProps) {
16712 updatePayload = prepareUpdate(recyclableInstance, type, oldProps, newProps, rootContainerInstance, currentHostContext);
16713 }
16714 if (childrenUnchanged && updatePayload === null) {
16715 // No changes, just reuse the existing instance.
16716 // Note that this might release a previous clone.
16717 workInProgress.stateNode = currentInstance;
16718 return;
16719 }
16720 var newInstance = cloneInstance(currentInstance, updatePayload, type, oldProps, newProps, workInProgress, childrenUnchanged, recyclableInstance);
16721 if (finalizeInitialChildren(newInstance, type, newProps, rootContainerInstance, currentHostContext)) {
16722 markUpdate(workInProgress);
16723 }
16724 workInProgress.stateNode = newInstance;
16725 if (childrenUnchanged) {
16726 // If there are no other effects in this tree, we need to flag this node as having one.
16727 // Even though we're not going to use it for anything.
16728 // Otherwise parents won't know that there are new children to propagate upwards.
16729 markUpdate(workInProgress);
16730 } else {
16731 // If children might have changed, we have to add them all to the set.
16732 appendAllChildren(newInstance, workInProgress, false, false);
16733 }
16734 };
16735 updateHostText$1 = function (current, workInProgress, oldText, newText) {
16736 if (oldText !== newText) {
16737 // If the text content differs, we'll create a new text instance for it.
16738 var rootContainerInstance = getRootHostContainer();
16739 var currentHostContext = getHostContext();
16740 workInProgress.stateNode = createTextInstance(newText, rootContainerInstance, currentHostContext, workInProgress);
16741 // We'll have to mark it as having an effect, even though we won't use the effect for anything.
16742 // This lets the parents know that at least one of their children has changed.
16743 markUpdate(workInProgress);
16744 }
16745 };
16746} else {
16747 // No host operations
16748 updateHostContainer = function (workInProgress) {
16749 // Noop
16750 };
16751 updateHostComponent$1 = function (current, workInProgress, type, newProps, rootContainerInstance) {
16752 // Noop
16753 };
16754 updateHostText$1 = function (current, workInProgress, oldText, newText) {
16755 // Noop
16756 };
16757}
16758
16759function completeWork(current, workInProgress, renderExpirationTime) {
16760 var newProps = workInProgress.pendingProps;
16761
16762 switch (workInProgress.tag) {
16763 case IndeterminateComponent:
16764 break;
16765 case LazyComponent:
16766 break;
16767 case SimpleMemoComponent:
16768 case FunctionComponent:
16769 break;
16770 case ClassComponent:
16771 {
16772 var Component = workInProgress.type;
16773 if (isContextProvider(Component)) {
16774 popContext(workInProgress);
16775 }
16776 break;
16777 }
16778 case HostRoot:
16779 {
16780 popHostContainer(workInProgress);
16781 popTopLevelContextObject(workInProgress);
16782 var fiberRoot = workInProgress.stateNode;
16783 if (fiberRoot.pendingContext) {
16784 fiberRoot.context = fiberRoot.pendingContext;
16785 fiberRoot.pendingContext = null;
16786 }
16787 if (current === null || current.child === null) {
16788 // If we hydrated, pop so that we can delete any remaining children
16789 // that weren't hydrated.
16790 popHydrationState(workInProgress);
16791 // This resets the hacky state to fix isMounted before committing.
16792 // TODO: Delete this when we delete isMounted and findDOMNode.
16793 workInProgress.effectTag &= ~Placement;
16794 }
16795 updateHostContainer(workInProgress);
16796 break;
16797 }
16798 case HostComponent:
16799 {
16800 popHostContext(workInProgress);
16801 var rootContainerInstance = getRootHostContainer();
16802 var type = workInProgress.type;
16803 if (current !== null && workInProgress.stateNode != null) {
16804 updateHostComponent$1(current, workInProgress, type, newProps, rootContainerInstance);
16805
16806 if (current.ref !== workInProgress.ref) {
16807 markRef$1(workInProgress);
16808 }
16809 } else {
16810 if (!newProps) {
16811 !(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;
16812 // This can happen when we abort work.
16813 break;
16814 }
16815
16816 var currentHostContext = getHostContext();
16817 // TODO: Move createInstance to beginWork and keep it on a context
16818 // "stack" as the parent. Then append children as we go in beginWork
16819 // or completeWork depending on we want to add then top->down or
16820 // bottom->up. Top->down is faster in IE11.
16821 var wasHydrated = popHydrationState(workInProgress);
16822 if (wasHydrated) {
16823 // TODO: Move this and createInstance step into the beginPhase
16824 // to consolidate.
16825 if (prepareToHydrateHostInstance(workInProgress, rootContainerInstance, currentHostContext)) {
16826 // If changes to the hydrated node needs to be applied at the
16827 // commit-phase we mark this as such.
16828 markUpdate(workInProgress);
16829 }
16830 } else {
16831 var instance = createInstance(type, newProps, rootContainerInstance, currentHostContext, workInProgress);
16832
16833 appendAllChildren(instance, workInProgress, false, false);
16834
16835 // Certain renderers require commit-time effects for initial mount.
16836 // (eg DOM renderer supports auto-focus for certain elements).
16837 // Make sure such renderers get scheduled for later work.
16838 if (finalizeInitialChildren(instance, type, newProps, rootContainerInstance, currentHostContext)) {
16839 markUpdate(workInProgress);
16840 }
16841 workInProgress.stateNode = instance;
16842 }
16843
16844 if (workInProgress.ref !== null) {
16845 // If there is a ref on a host node we need to schedule a callback
16846 markRef$1(workInProgress);
16847 }
16848 }
16849 break;
16850 }
16851 case HostText:
16852 {
16853 var newText = newProps;
16854 if (current && workInProgress.stateNode != null) {
16855 var oldText = current.memoizedProps;
16856 // If we have an alternate, that means this is an update and we need
16857 // to schedule a side-effect to do the updates.
16858 updateHostText$1(current, workInProgress, oldText, newText);
16859 } else {
16860 if (typeof newText !== 'string') {
16861 !(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;
16862 // This can happen when we abort work.
16863 }
16864 var _rootContainerInstance = getRootHostContainer();
16865 var _currentHostContext = getHostContext();
16866 var _wasHydrated = popHydrationState(workInProgress);
16867 if (_wasHydrated) {
16868 if (prepareToHydrateHostTextInstance(workInProgress)) {
16869 markUpdate(workInProgress);
16870 }
16871 } else {
16872 workInProgress.stateNode = createTextInstance(newText, _rootContainerInstance, _currentHostContext, workInProgress);
16873 }
16874 }
16875 break;
16876 }
16877 case ForwardRef:
16878 break;
16879 case SuspenseComponent:
16880 {
16881 var nextState = workInProgress.memoizedState;
16882 if ((workInProgress.effectTag & DidCapture) !== NoEffect) {
16883 // Something suspended. Re-render with the fallback children.
16884 workInProgress.expirationTime = renderExpirationTime;
16885 // Do not reset the effect list.
16886 return workInProgress;
16887 }
16888
16889 var nextDidTimeout = nextState !== null;
16890 var prevDidTimeout = current !== null && current.memoizedState !== null;
16891
16892 if (current !== null && !nextDidTimeout && prevDidTimeout) {
16893 // We just switched from the fallback to the normal children. Delete
16894 // the fallback.
16895 // TODO: Would it be better to store the fallback fragment on
16896 var currentFallbackChild = current.child.sibling;
16897 if (currentFallbackChild !== null) {
16898 // Deletions go at the beginning of the return fiber's effect list
16899 var first = workInProgress.firstEffect;
16900 if (first !== null) {
16901 workInProgress.firstEffect = currentFallbackChild;
16902 currentFallbackChild.nextEffect = first;
16903 } else {
16904 workInProgress.firstEffect = workInProgress.lastEffect = currentFallbackChild;
16905 currentFallbackChild.nextEffect = null;
16906 }
16907 currentFallbackChild.effectTag = Deletion;
16908 }
16909 }
16910
16911 if (nextDidTimeout || prevDidTimeout) {
16912 // If the children are hidden, or if they were previous hidden, schedule
16913 // an effect to toggle their visibility. This is also used to attach a
16914 // retry listener to the promise.
16915 workInProgress.effectTag |= Update;
16916 }
16917 break;
16918 }
16919 case Fragment:
16920 break;
16921 case Mode:
16922 break;
16923 case Profiler:
16924 break;
16925 case HostPortal:
16926 popHostContainer(workInProgress);
16927 updateHostContainer(workInProgress);
16928 break;
16929 case ContextProvider:
16930 // Pop provider fiber
16931 popProvider(workInProgress);
16932 break;
16933 case ContextConsumer:
16934 break;
16935 case MemoComponent:
16936 break;
16937 case IncompleteClassComponent:
16938 {
16939 // Same as class component case. I put it down here so that the tags are
16940 // sequential to ensure this switch is compiled to a jump table.
16941 var _Component = workInProgress.type;
16942 if (isContextProvider(_Component)) {
16943 popContext(workInProgress);
16944 }
16945 break;
16946 }
16947 case DehydratedSuspenseComponent:
16948 {
16949 if (enableSuspenseServerRenderer) {
16950 if (current === null) {
16951 var _wasHydrated2 = popHydrationState(workInProgress);
16952 !_wasHydrated2 ? invariant(false, 'A dehydrated suspense component was completed without a hydrated node. This is probably a bug in React.') : void 0;
16953 skipPastDehydratedSuspenseInstance(workInProgress);
16954 } else if ((workInProgress.effectTag & DidCapture) === NoEffect) {
16955 // This boundary did not suspend so it's now hydrated.
16956 // To handle any future suspense cases, we're going to now upgrade it
16957 // to a Suspense component. We detach it from the existing current fiber.
16958 current.alternate = null;
16959 workInProgress.alternate = null;
16960 workInProgress.tag = SuspenseComponent;
16961 workInProgress.memoizedState = null;
16962 workInProgress.stateNode = null;
16963 }
16964 }
16965 break;
16966 }
16967 default:
16968 invariant(false, 'Unknown unit of work tag. This error is likely caused by a bug in React. Please file an issue.');
16969 }
16970
16971 return null;
16972}
16973
16974function shouldCaptureSuspense(workInProgress) {
16975 // In order to capture, the Suspense component must have a fallback prop.
16976 if (workInProgress.memoizedProps.fallback === undefined) {
16977 return false;
16978 }
16979 // If it was the primary children that just suspended, capture and render the
16980 // fallback. Otherwise, don't capture and bubble to the next boundary.
16981 var nextState = workInProgress.memoizedState;
16982 return nextState === null;
16983}
16984
16985// This module is forked in different environments.
16986// By default, return `true` to log errors to the console.
16987// Forks can return `false` if this isn't desirable.
16988function showErrorDialog(capturedError) {
16989 return true;
16990}
16991
16992function logCapturedError(capturedError) {
16993 var logError = showErrorDialog(capturedError);
16994
16995 // Allow injected showErrorDialog() to prevent default console.error logging.
16996 // This enables renderers like ReactNative to better manage redbox behavior.
16997 if (logError === false) {
16998 return;
16999 }
17000
17001 var error = capturedError.error;
17002 {
17003 var componentName = capturedError.componentName,
17004 componentStack = capturedError.componentStack,
17005 errorBoundaryName = capturedError.errorBoundaryName,
17006 errorBoundaryFound = capturedError.errorBoundaryFound,
17007 willRetry = capturedError.willRetry;
17008
17009 // Browsers support silencing uncaught errors by calling
17010 // `preventDefault()` in window `error` handler.
17011 // We record this information as an expando on the error.
17012
17013 if (error != null && error._suppressLogging) {
17014 if (errorBoundaryFound && willRetry) {
17015 // The error is recoverable and was silenced.
17016 // Ignore it and don't print the stack addendum.
17017 // This is handy for testing error boundaries without noise.
17018 return;
17019 }
17020 // The error is fatal. Since the silencing might have
17021 // been accidental, we'll surface it anyway.
17022 // However, the browser would have silenced the original error
17023 // so we'll print it first, and then print the stack addendum.
17024 console.error(error);
17025 // For a more detailed description of this block, see:
17026 // https://github.com/facebook/react/pull/13384
17027 }
17028
17029 var componentNameMessage = componentName ? 'The above error occurred in the <' + componentName + '> component:' : 'The above error occurred in one of your React components:';
17030
17031 var errorBoundaryMessage = void 0;
17032 // errorBoundaryFound check is sufficient; errorBoundaryName check is to satisfy Flow.
17033 if (errorBoundaryFound && errorBoundaryName) {
17034 if (willRetry) {
17035 errorBoundaryMessage = 'React will try to recreate this component tree from scratch ' + ('using the error boundary you provided, ' + errorBoundaryName + '.');
17036 } else {
17037 errorBoundaryMessage = 'This error was initially handled by the error boundary ' + errorBoundaryName + '.\n' + 'Recreating the tree from scratch failed so React will unmount the tree.';
17038 }
17039 } else {
17040 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.';
17041 }
17042 var combinedMessage = '' + componentNameMessage + componentStack + '\n\n' + ('' + errorBoundaryMessage);
17043
17044 // In development, we provide our own message with just the component stack.
17045 // We don't include the original error message and JS stack because the browser
17046 // has already printed it. Even if the application swallows the error, it is still
17047 // displayed by the browser thanks to the DEV-only fake event trick in ReactErrorUtils.
17048 console.error(combinedMessage);
17049 }
17050}
17051
17052var didWarnAboutUndefinedSnapshotBeforeUpdate = null;
17053{
17054 didWarnAboutUndefinedSnapshotBeforeUpdate = new Set();
17055}
17056
17057var PossiblyWeakSet$1 = typeof WeakSet === 'function' ? WeakSet : Set;
17058
17059function logError(boundary, errorInfo) {
17060 var source = errorInfo.source;
17061 var stack = errorInfo.stack;
17062 if (stack === null && source !== null) {
17063 stack = getStackByFiberInDevAndProd(source);
17064 }
17065
17066 var capturedError = {
17067 componentName: source !== null ? getComponentName(source.type) : null,
17068 componentStack: stack !== null ? stack : '',
17069 error: errorInfo.value,
17070 errorBoundary: null,
17071 errorBoundaryName: null,
17072 errorBoundaryFound: false,
17073 willRetry: false
17074 };
17075
17076 if (boundary !== null && boundary.tag === ClassComponent) {
17077 capturedError.errorBoundary = boundary.stateNode;
17078 capturedError.errorBoundaryName = getComponentName(boundary.type);
17079 capturedError.errorBoundaryFound = true;
17080 capturedError.willRetry = true;
17081 }
17082
17083 try {
17084 logCapturedError(capturedError);
17085 } catch (e) {
17086 // This method must not throw, or React internal state will get messed up.
17087 // If console.error is overridden, or logCapturedError() shows a dialog that throws,
17088 // we want to report this error outside of the normal stack as a last resort.
17089 // https://github.com/facebook/react/issues/13188
17090 setTimeout(function () {
17091 throw e;
17092 });
17093 }
17094}
17095
17096var callComponentWillUnmountWithTimer = function (current$$1, instance) {
17097 startPhaseTimer(current$$1, 'componentWillUnmount');
17098 instance.props = current$$1.memoizedProps;
17099 instance.state = current$$1.memoizedState;
17100 instance.componentWillUnmount();
17101 stopPhaseTimer();
17102};
17103
17104// Capture errors so they don't interrupt unmounting.
17105function safelyCallComponentWillUnmount(current$$1, instance) {
17106 {
17107 invokeGuardedCallback(null, callComponentWillUnmountWithTimer, null, current$$1, instance);
17108 if (hasCaughtError()) {
17109 var unmountError = clearCaughtError();
17110 captureCommitPhaseError(current$$1, unmountError);
17111 }
17112 }
17113}
17114
17115function safelyDetachRef(current$$1) {
17116 var ref = current$$1.ref;
17117 if (ref !== null) {
17118 if (typeof ref === 'function') {
17119 {
17120 invokeGuardedCallback(null, ref, null, null);
17121 if (hasCaughtError()) {
17122 var refError = clearCaughtError();
17123 captureCommitPhaseError(current$$1, refError);
17124 }
17125 }
17126 } else {
17127 ref.current = null;
17128 }
17129 }
17130}
17131
17132function safelyCallDestroy(current$$1, destroy) {
17133 {
17134 invokeGuardedCallback(null, destroy, null);
17135 if (hasCaughtError()) {
17136 var error = clearCaughtError();
17137 captureCommitPhaseError(current$$1, error);
17138 }
17139 }
17140}
17141
17142function commitBeforeMutationLifeCycles(current$$1, finishedWork) {
17143 switch (finishedWork.tag) {
17144 case FunctionComponent:
17145 case ForwardRef:
17146 case SimpleMemoComponent:
17147 {
17148 commitHookEffectList(UnmountSnapshot, NoEffect$1, finishedWork);
17149 return;
17150 }
17151 case ClassComponent:
17152 {
17153 if (finishedWork.effectTag & Snapshot) {
17154 if (current$$1 !== null) {
17155 var prevProps = current$$1.memoizedProps;
17156 var prevState = current$$1.memoizedState;
17157 startPhaseTimer(finishedWork, 'getSnapshotBeforeUpdate');
17158 var instance = finishedWork.stateNode;
17159 // We could update instance props and state here,
17160 // but instead we rely on them being set during last render.
17161 // TODO: revisit this when we implement resuming.
17162 {
17163 if (finishedWork.type === finishedWork.elementType && !didWarnAboutReassigningProps) {
17164 !(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;
17165 !(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;
17166 }
17167 }
17168 var snapshot = instance.getSnapshotBeforeUpdate(finishedWork.elementType === finishedWork.type ? prevProps : resolveDefaultProps(finishedWork.type, prevProps), prevState);
17169 {
17170 var didWarnSet = didWarnAboutUndefinedSnapshotBeforeUpdate;
17171 if (snapshot === undefined && !didWarnSet.has(finishedWork.type)) {
17172 didWarnSet.add(finishedWork.type);
17173 warningWithoutStack$1(false, '%s.getSnapshotBeforeUpdate(): A snapshot value (or null) ' + 'must be returned. You have returned undefined.', getComponentName(finishedWork.type));
17174 }
17175 }
17176 instance.__reactInternalSnapshotBeforeUpdate = snapshot;
17177 stopPhaseTimer();
17178 }
17179 }
17180 return;
17181 }
17182 case HostRoot:
17183 case HostComponent:
17184 case HostText:
17185 case HostPortal:
17186 case IncompleteClassComponent:
17187 // Nothing to do for these component types
17188 return;
17189 default:
17190 {
17191 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.');
17192 }
17193 }
17194}
17195
17196function commitHookEffectList(unmountTag, mountTag, finishedWork) {
17197 var updateQueue = finishedWork.updateQueue;
17198 var lastEffect = updateQueue !== null ? updateQueue.lastEffect : null;
17199 if (lastEffect !== null) {
17200 var firstEffect = lastEffect.next;
17201 var effect = firstEffect;
17202 do {
17203 if ((effect.tag & unmountTag) !== NoEffect$1) {
17204 // Unmount
17205 var destroy = effect.destroy;
17206 effect.destroy = undefined;
17207 if (destroy !== undefined) {
17208 destroy();
17209 }
17210 }
17211 if ((effect.tag & mountTag) !== NoEffect$1) {
17212 // Mount
17213 var create = effect.create;
17214 effect.destroy = create();
17215
17216 {
17217 var _destroy = effect.destroy;
17218 if (_destroy !== undefined && typeof _destroy !== 'function') {
17219 var addendum = void 0;
17220 if (_destroy === null) {
17221 addendum = ' You returned null. If your effect does not require clean ' + 'up, return undefined (or nothing).';
17222 } else if (typeof _destroy.then === 'function') {
17223 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.";
17224 } else {
17225 addendum = ' You returned: ' + _destroy;
17226 }
17227 warningWithoutStack$1(false, 'An Effect function must not return anything besides a function, ' + 'which is used for clean-up.%s%s', addendum, getStackByFiberInDevAndProd(finishedWork));
17228 }
17229 }
17230 }
17231 effect = effect.next;
17232 } while (effect !== firstEffect);
17233 }
17234}
17235
17236function commitPassiveHookEffects(finishedWork) {
17237 commitHookEffectList(UnmountPassive, NoEffect$1, finishedWork);
17238 commitHookEffectList(NoEffect$1, MountPassive, finishedWork);
17239}
17240
17241function commitLifeCycles(finishedRoot, current$$1, finishedWork, committedExpirationTime) {
17242 switch (finishedWork.tag) {
17243 case FunctionComponent:
17244 case ForwardRef:
17245 case SimpleMemoComponent:
17246 {
17247 commitHookEffectList(UnmountLayout, MountLayout, finishedWork);
17248 break;
17249 }
17250 case ClassComponent:
17251 {
17252 var instance = finishedWork.stateNode;
17253 if (finishedWork.effectTag & Update) {
17254 if (current$$1 === null) {
17255 startPhaseTimer(finishedWork, 'componentDidMount');
17256 // We could update instance props and state here,
17257 // but instead we rely on them being set during last render.
17258 // TODO: revisit this when we implement resuming.
17259 {
17260 if (finishedWork.type === finishedWork.elementType && !didWarnAboutReassigningProps) {
17261 !(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;
17262 !(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;
17263 }
17264 }
17265 instance.componentDidMount();
17266 stopPhaseTimer();
17267 } else {
17268 var prevProps = finishedWork.elementType === finishedWork.type ? current$$1.memoizedProps : resolveDefaultProps(finishedWork.type, current$$1.memoizedProps);
17269 var prevState = current$$1.memoizedState;
17270 startPhaseTimer(finishedWork, 'componentDidUpdate');
17271 // We could update instance props and state here,
17272 // but instead we rely on them being set during last render.
17273 // TODO: revisit this when we implement resuming.
17274 {
17275 if (finishedWork.type === finishedWork.elementType && !didWarnAboutReassigningProps) {
17276 !(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;
17277 !(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;
17278 }
17279 }
17280 instance.componentDidUpdate(prevProps, prevState, instance.__reactInternalSnapshotBeforeUpdate);
17281 stopPhaseTimer();
17282 }
17283 }
17284 var updateQueue = finishedWork.updateQueue;
17285 if (updateQueue !== null) {
17286 {
17287 if (finishedWork.type === finishedWork.elementType && !didWarnAboutReassigningProps) {
17288 !(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;
17289 !(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;
17290 }
17291 }
17292 // We could update instance props and state here,
17293 // but instead we rely on them being set during last render.
17294 // TODO: revisit this when we implement resuming.
17295 commitUpdateQueue(finishedWork, updateQueue, instance, committedExpirationTime);
17296 }
17297 return;
17298 }
17299 case HostRoot:
17300 {
17301 var _updateQueue = finishedWork.updateQueue;
17302 if (_updateQueue !== null) {
17303 var _instance = null;
17304 if (finishedWork.child !== null) {
17305 switch (finishedWork.child.tag) {
17306 case HostComponent:
17307 _instance = getPublicInstance(finishedWork.child.stateNode);
17308 break;
17309 case ClassComponent:
17310 _instance = finishedWork.child.stateNode;
17311 break;
17312 }
17313 }
17314 commitUpdateQueue(finishedWork, _updateQueue, _instance, committedExpirationTime);
17315 }
17316 return;
17317 }
17318 case HostComponent:
17319 {
17320 var _instance2 = finishedWork.stateNode;
17321
17322 // Renderers may schedule work to be done after host components are mounted
17323 // (eg DOM renderer may schedule auto-focus for inputs and form controls).
17324 // These effects should only be committed when components are first mounted,
17325 // aka when there is no current/alternate.
17326 if (current$$1 === null && finishedWork.effectTag & Update) {
17327 var type = finishedWork.type;
17328 var props = finishedWork.memoizedProps;
17329 commitMount(_instance2, type, props, finishedWork);
17330 }
17331
17332 return;
17333 }
17334 case HostText:
17335 {
17336 // We have no life-cycles associated with text.
17337 return;
17338 }
17339 case HostPortal:
17340 {
17341 // We have no life-cycles associated with portals.
17342 return;
17343 }
17344 case Profiler:
17345 {
17346 if (enableProfilerTimer) {
17347 var onRender = finishedWork.memoizedProps.onRender;
17348
17349 if (enableSchedulerTracing) {
17350 onRender(finishedWork.memoizedProps.id, current$$1 === null ? 'mount' : 'update', finishedWork.actualDuration, finishedWork.treeBaseDuration, finishedWork.actualStartTime, getCommitTime(), finishedRoot.memoizedInteractions);
17351 } else {
17352 onRender(finishedWork.memoizedProps.id, current$$1 === null ? 'mount' : 'update', finishedWork.actualDuration, finishedWork.treeBaseDuration, finishedWork.actualStartTime, getCommitTime());
17353 }
17354 }
17355 return;
17356 }
17357 case SuspenseComponent:
17358 break;
17359 case IncompleteClassComponent:
17360 break;
17361 default:
17362 {
17363 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.');
17364 }
17365 }
17366}
17367
17368function hideOrUnhideAllChildren(finishedWork, isHidden) {
17369 if (supportsMutation) {
17370 // We only have the top Fiber that was inserted but we need to recurse down its
17371 var node = finishedWork;
17372 while (true) {
17373 if (node.tag === HostComponent) {
17374 var instance = node.stateNode;
17375 if (isHidden) {
17376 hideInstance(instance);
17377 } else {
17378 unhideInstance(node.stateNode, node.memoizedProps);
17379 }
17380 } else if (node.tag === HostText) {
17381 var _instance3 = node.stateNode;
17382 if (isHidden) {
17383 hideTextInstance(_instance3);
17384 } else {
17385 unhideTextInstance(_instance3, node.memoizedProps);
17386 }
17387 } else if (node.tag === SuspenseComponent && node.memoizedState !== null) {
17388 // Found a nested Suspense component that timed out. Skip over the
17389 var fallbackChildFragment = node.child.sibling;
17390 fallbackChildFragment.return = node;
17391 node = fallbackChildFragment;
17392 continue;
17393 } else if (node.child !== null) {
17394 node.child.return = node;
17395 node = node.child;
17396 continue;
17397 }
17398 if (node === finishedWork) {
17399 return;
17400 }
17401 while (node.sibling === null) {
17402 if (node.return === null || node.return === finishedWork) {
17403 return;
17404 }
17405 node = node.return;
17406 }
17407 node.sibling.return = node.return;
17408 node = node.sibling;
17409 }
17410 }
17411}
17412
17413function commitAttachRef(finishedWork) {
17414 var ref = finishedWork.ref;
17415 if (ref !== null) {
17416 var instance = finishedWork.stateNode;
17417 var instanceToUse = void 0;
17418 switch (finishedWork.tag) {
17419 case HostComponent:
17420 instanceToUse = getPublicInstance(instance);
17421 break;
17422 default:
17423 instanceToUse = instance;
17424 }
17425 if (typeof ref === 'function') {
17426 ref(instanceToUse);
17427 } else {
17428 {
17429 if (!ref.hasOwnProperty('current')) {
17430 warningWithoutStack$1(false, 'Unexpected ref object provided for %s. ' + 'Use either a ref-setter function or React.createRef().%s', getComponentName(finishedWork.type), getStackByFiberInDevAndProd(finishedWork));
17431 }
17432 }
17433
17434 ref.current = instanceToUse;
17435 }
17436 }
17437}
17438
17439function commitDetachRef(current$$1) {
17440 var currentRef = current$$1.ref;
17441 if (currentRef !== null) {
17442 if (typeof currentRef === 'function') {
17443 currentRef(null);
17444 } else {
17445 currentRef.current = null;
17446 }
17447 }
17448}
17449
17450// User-originating errors (lifecycles and refs) should not interrupt
17451// deletion, so don't let them throw. Host-originating errors should
17452// interrupt deletion, so it's okay
17453function commitUnmount(current$$1) {
17454 onCommitUnmount(current$$1);
17455
17456 switch (current$$1.tag) {
17457 case FunctionComponent:
17458 case ForwardRef:
17459 case MemoComponent:
17460 case SimpleMemoComponent:
17461 {
17462 var updateQueue = current$$1.updateQueue;
17463 if (updateQueue !== null) {
17464 var lastEffect = updateQueue.lastEffect;
17465 if (lastEffect !== null) {
17466 var firstEffect = lastEffect.next;
17467 var effect = firstEffect;
17468 do {
17469 var destroy = effect.destroy;
17470 if (destroy !== undefined) {
17471 safelyCallDestroy(current$$1, destroy);
17472 }
17473 effect = effect.next;
17474 } while (effect !== firstEffect);
17475 }
17476 }
17477 break;
17478 }
17479 case ClassComponent:
17480 {
17481 safelyDetachRef(current$$1);
17482 var instance = current$$1.stateNode;
17483 if (typeof instance.componentWillUnmount === 'function') {
17484 safelyCallComponentWillUnmount(current$$1, instance);
17485 }
17486 return;
17487 }
17488 case HostComponent:
17489 {
17490 safelyDetachRef(current$$1);
17491 return;
17492 }
17493 case HostPortal:
17494 {
17495 // TODO: this is recursive.
17496 // We are also not using this parent because
17497 // the portal will get pushed immediately.
17498 if (supportsMutation) {
17499 unmountHostComponents(current$$1);
17500 } else if (supportsPersistence) {
17501 emptyPortalContainer(current$$1);
17502 }
17503 return;
17504 }
17505 }
17506}
17507
17508function commitNestedUnmounts(root) {
17509 // While we're inside a removed host node we don't want to call
17510 // removeChild on the inner nodes because they're removed by the top
17511 // call anyway. We also want to call componentWillUnmount on all
17512 // composites before this host node is removed from the tree. Therefore
17513 var node = root;
17514 while (true) {
17515 commitUnmount(node);
17516 // Visit children because they may contain more composite or host nodes.
17517 // Skip portals because commitUnmount() currently visits them recursively.
17518 if (node.child !== null && (
17519 // If we use mutation we drill down into portals using commitUnmount above.
17520 // If we don't use mutation we drill down into portals here instead.
17521 !supportsMutation || node.tag !== HostPortal)) {
17522 node.child.return = node;
17523 node = node.child;
17524 continue;
17525 }
17526 if (node === root) {
17527 return;
17528 }
17529 while (node.sibling === null) {
17530 if (node.return === null || node.return === root) {
17531 return;
17532 }
17533 node = node.return;
17534 }
17535 node.sibling.return = node.return;
17536 node = node.sibling;
17537 }
17538}
17539
17540function detachFiber(current$$1) {
17541 // Cut off the return pointers to disconnect it from the tree. Ideally, we
17542 // should clear the child pointer of the parent alternate to let this
17543 // get GC:ed but we don't know which for sure which parent is the current
17544 // one so we'll settle for GC:ing the subtree of this child. This child
17545 // itself will be GC:ed when the parent updates the next time.
17546 current$$1.return = null;
17547 current$$1.child = null;
17548 current$$1.memoizedState = null;
17549 current$$1.updateQueue = null;
17550 var alternate = current$$1.alternate;
17551 if (alternate !== null) {
17552 alternate.return = null;
17553 alternate.child = null;
17554 alternate.memoizedState = null;
17555 alternate.updateQueue = null;
17556 }
17557}
17558
17559function emptyPortalContainer(current$$1) {
17560 if (!supportsPersistence) {
17561 return;
17562 }
17563
17564 var portal = current$$1.stateNode;
17565 var containerInfo = portal.containerInfo;
17566
17567 var emptyChildSet = createContainerChildSet(containerInfo);
17568 replaceContainerChildren(containerInfo, emptyChildSet);
17569}
17570
17571function commitContainer(finishedWork) {
17572 if (!supportsPersistence) {
17573 return;
17574 }
17575
17576 switch (finishedWork.tag) {
17577 case ClassComponent:
17578 {
17579 return;
17580 }
17581 case HostComponent:
17582 {
17583 return;
17584 }
17585 case HostText:
17586 {
17587 return;
17588 }
17589 case HostRoot:
17590 case HostPortal:
17591 {
17592 var portalOrRoot = finishedWork.stateNode;
17593 var containerInfo = portalOrRoot.containerInfo,
17594 _pendingChildren = portalOrRoot.pendingChildren;
17595
17596 replaceContainerChildren(containerInfo, _pendingChildren);
17597 return;
17598 }
17599 default:
17600 {
17601 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.');
17602 }
17603 }
17604}
17605
17606function getHostParentFiber(fiber) {
17607 var parent = fiber.return;
17608 while (parent !== null) {
17609 if (isHostParent(parent)) {
17610 return parent;
17611 }
17612 parent = parent.return;
17613 }
17614 invariant(false, 'Expected to find a host parent. This error is likely caused by a bug in React. Please file an issue.');
17615}
17616
17617function isHostParent(fiber) {
17618 return fiber.tag === HostComponent || fiber.tag === HostRoot || fiber.tag === HostPortal;
17619}
17620
17621function getHostSibling(fiber) {
17622 // We're going to search forward into the tree until we find a sibling host
17623 // node. Unfortunately, if multiple insertions are done in a row we have to
17624 // search past them. This leads to exponential search for the next sibling.
17625 var node = fiber;
17626 siblings: while (true) {
17627 // If we didn't find anything, let's try the next sibling.
17628 while (node.sibling === null) {
17629 if (node.return === null || isHostParent(node.return)) {
17630 // If we pop out of the root or hit the parent the fiber we are the
17631 // last sibling.
17632 return null;
17633 }
17634 node = node.return;
17635 }
17636 node.sibling.return = node.return;
17637 node = node.sibling;
17638 while (node.tag !== HostComponent && node.tag !== HostText && node.tag !== DehydratedSuspenseComponent) {
17639 // If it is not host node and, we might have a host node inside it.
17640 // Try to search down until we find one.
17641 if (node.effectTag & Placement) {
17642 // If we don't have a child, try the siblings instead.
17643 continue siblings;
17644 }
17645 // If we don't have a child, try the siblings instead.
17646 // We also skip portals because they are not part of this host tree.
17647 if (node.child === null || node.tag === HostPortal) {
17648 continue siblings;
17649 } else {
17650 node.child.return = node;
17651 node = node.child;
17652 }
17653 }
17654 // Check if this host node is stable or about to be placed.
17655 if (!(node.effectTag & Placement)) {
17656 // Found it!
17657 return node.stateNode;
17658 }
17659 }
17660}
17661
17662function commitPlacement(finishedWork) {
17663 if (!supportsMutation) {
17664 return;
17665 }
17666
17667 // Recursively insert all host nodes into the parent.
17668 var parentFiber = getHostParentFiber(finishedWork);
17669
17670 // Note: these two variables *must* always be updated together.
17671 var parent = void 0;
17672 var isContainer = void 0;
17673
17674 switch (parentFiber.tag) {
17675 case HostComponent:
17676 parent = parentFiber.stateNode;
17677 isContainer = false;
17678 break;
17679 case HostRoot:
17680 parent = parentFiber.stateNode.containerInfo;
17681 isContainer = true;
17682 break;
17683 case HostPortal:
17684 parent = parentFiber.stateNode.containerInfo;
17685 isContainer = true;
17686 break;
17687 default:
17688 invariant(false, 'Invalid host parent fiber. This error is likely caused by a bug in React. Please file an issue.');
17689 }
17690 if (parentFiber.effectTag & ContentReset) {
17691 // Reset the text content of the parent before doing any insertions
17692 resetTextContent(parent);
17693 // Clear ContentReset from the effect tag
17694 parentFiber.effectTag &= ~ContentReset;
17695 }
17696
17697 var before = getHostSibling(finishedWork);
17698 // We only have the top Fiber that was inserted but we need to recurse down its
17699 // children to find all the terminal nodes.
17700 var node = finishedWork;
17701 while (true) {
17702 if (node.tag === HostComponent || node.tag === HostText) {
17703 if (before) {
17704 if (isContainer) {
17705 insertInContainerBefore(parent, node.stateNode, before);
17706 } else {
17707 insertBefore(parent, node.stateNode, before);
17708 }
17709 } else {
17710 if (isContainer) {
17711 appendChildToContainer(parent, node.stateNode);
17712 } else {
17713 appendChild(parent, node.stateNode);
17714 }
17715 }
17716 } else if (node.tag === HostPortal) {
17717 // If the insertion itself is a portal, then we don't want to traverse
17718 // down its children. Instead, we'll get insertions from each child in
17719 // the portal directly.
17720 } else if (node.child !== null) {
17721 node.child.return = node;
17722 node = node.child;
17723 continue;
17724 }
17725 if (node === finishedWork) {
17726 return;
17727 }
17728 while (node.sibling === null) {
17729 if (node.return === null || node.return === finishedWork) {
17730 return;
17731 }
17732 node = node.return;
17733 }
17734 node.sibling.return = node.return;
17735 node = node.sibling;
17736 }
17737}
17738
17739function unmountHostComponents(current$$1) {
17740 // We only have the top Fiber that was deleted but we need to recurse down its
17741 var node = current$$1;
17742
17743 // Each iteration, currentParent is populated with node's host parent if not
17744 // currentParentIsValid.
17745 var currentParentIsValid = false;
17746
17747 // Note: these two variables *must* always be updated together.
17748 var currentParent = void 0;
17749 var currentParentIsContainer = void 0;
17750
17751 while (true) {
17752 if (!currentParentIsValid) {
17753 var parent = node.return;
17754 findParent: while (true) {
17755 !(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;
17756 switch (parent.tag) {
17757 case HostComponent:
17758 currentParent = parent.stateNode;
17759 currentParentIsContainer = false;
17760 break findParent;
17761 case HostRoot:
17762 currentParent = parent.stateNode.containerInfo;
17763 currentParentIsContainer = true;
17764 break findParent;
17765 case HostPortal:
17766 currentParent = parent.stateNode.containerInfo;
17767 currentParentIsContainer = true;
17768 break findParent;
17769 }
17770 parent = parent.return;
17771 }
17772 currentParentIsValid = true;
17773 }
17774
17775 if (node.tag === HostComponent || node.tag === HostText) {
17776 commitNestedUnmounts(node);
17777 // After all the children have unmounted, it is now safe to remove the
17778 // node from the tree.
17779 if (currentParentIsContainer) {
17780 removeChildFromContainer(currentParent, node.stateNode);
17781 } else {
17782 removeChild(currentParent, node.stateNode);
17783 }
17784 // Don't visit children because we already visited them.
17785 } else if (enableSuspenseServerRenderer && node.tag === DehydratedSuspenseComponent) {
17786 // Delete the dehydrated suspense boundary and all of its content.
17787 if (currentParentIsContainer) {
17788 clearSuspenseBoundaryFromContainer(currentParent, node.stateNode);
17789 } else {
17790 clearSuspenseBoundary(currentParent, node.stateNode);
17791 }
17792 } else if (node.tag === HostPortal) {
17793 if (node.child !== null) {
17794 // When we go into a portal, it becomes the parent to remove from.
17795 // We will reassign it back when we pop the portal on the way up.
17796 currentParent = node.stateNode.containerInfo;
17797 currentParentIsContainer = true;
17798 // Visit children because portals might contain host components.
17799 node.child.return = node;
17800 node = node.child;
17801 continue;
17802 }
17803 } else {
17804 commitUnmount(node);
17805 // Visit children because we may find more host components below.
17806 if (node.child !== null) {
17807 node.child.return = node;
17808 node = node.child;
17809 continue;
17810 }
17811 }
17812 if (node === current$$1) {
17813 return;
17814 }
17815 while (node.sibling === null) {
17816 if (node.return === null || node.return === current$$1) {
17817 return;
17818 }
17819 node = node.return;
17820 if (node.tag === HostPortal) {
17821 // When we go out of the portal, we need to restore the parent.
17822 // Since we don't keep a stack of them, we will search for it.
17823 currentParentIsValid = false;
17824 }
17825 }
17826 node.sibling.return = node.return;
17827 node = node.sibling;
17828 }
17829}
17830
17831function commitDeletion(current$$1) {
17832 if (supportsMutation) {
17833 // Recursively delete all host nodes from the parent.
17834 // Detach refs and call componentWillUnmount() on the whole subtree.
17835 unmountHostComponents(current$$1);
17836 } else {
17837 // Detach refs and call componentWillUnmount() on the whole subtree.
17838 commitNestedUnmounts(current$$1);
17839 }
17840 detachFiber(current$$1);
17841}
17842
17843function commitWork(current$$1, finishedWork) {
17844 if (!supportsMutation) {
17845 switch (finishedWork.tag) {
17846 case FunctionComponent:
17847 case ForwardRef:
17848 case MemoComponent:
17849 case SimpleMemoComponent:
17850 {
17851 // Note: We currently never use MountMutation, but useLayout uses
17852 // UnmountMutation.
17853 commitHookEffectList(UnmountMutation, MountMutation, finishedWork);
17854 return;
17855 }
17856 }
17857
17858 commitContainer(finishedWork);
17859 return;
17860 }
17861
17862 switch (finishedWork.tag) {
17863 case FunctionComponent:
17864 case ForwardRef:
17865 case MemoComponent:
17866 case SimpleMemoComponent:
17867 {
17868 // Note: We currently never use MountMutation, but useLayout uses
17869 // UnmountMutation.
17870 commitHookEffectList(UnmountMutation, MountMutation, finishedWork);
17871 return;
17872 }
17873 case ClassComponent:
17874 {
17875 return;
17876 }
17877 case HostComponent:
17878 {
17879 var instance = finishedWork.stateNode;
17880 if (instance != null) {
17881 // Commit the work prepared earlier.
17882 var newProps = finishedWork.memoizedProps;
17883 // For hydration we reuse the update path but we treat the oldProps
17884 // as the newProps. The updatePayload will contain the real change in
17885 // this case.
17886 var oldProps = current$$1 !== null ? current$$1.memoizedProps : newProps;
17887 var type = finishedWork.type;
17888 // TODO: Type the updateQueue to be specific to host components.
17889 var updatePayload = finishedWork.updateQueue;
17890 finishedWork.updateQueue = null;
17891 if (updatePayload !== null) {
17892 commitUpdate(instance, updatePayload, type, oldProps, newProps, finishedWork);
17893 }
17894 }
17895 return;
17896 }
17897 case HostText:
17898 {
17899 !(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;
17900 var textInstance = finishedWork.stateNode;
17901 var newText = finishedWork.memoizedProps;
17902 // For hydration we reuse the update path but we treat the oldProps
17903 // as the newProps. The updatePayload will contain the real change in
17904 // this case.
17905 var oldText = current$$1 !== null ? current$$1.memoizedProps : newText;
17906 commitTextUpdate(textInstance, oldText, newText);
17907 return;
17908 }
17909 case HostRoot:
17910 {
17911 return;
17912 }
17913 case Profiler:
17914 {
17915 return;
17916 }
17917 case SuspenseComponent:
17918 {
17919 var newState = finishedWork.memoizedState;
17920
17921 var newDidTimeout = void 0;
17922 var primaryChildParent = finishedWork;
17923 if (newState === null) {
17924 newDidTimeout = false;
17925 } else {
17926 newDidTimeout = true;
17927 primaryChildParent = finishedWork.child;
17928 if (newState.timedOutAt === NoWork) {
17929 // If the children had not already timed out, record the time.
17930 // This is used to compute the elapsed time during subsequent
17931 // attempts to render the children.
17932 newState.timedOutAt = requestCurrentTime();
17933 }
17934 }
17935
17936 if (primaryChildParent !== null) {
17937 hideOrUnhideAllChildren(primaryChildParent, newDidTimeout);
17938 }
17939
17940 // If this boundary just timed out, then it will have a set of thenables.
17941 // For each thenable, attach a listener so that when it resolves, React
17942 // attempts to re-render the boundary in the primary (pre-timeout) state.
17943 var thenables = finishedWork.updateQueue;
17944 if (thenables !== null) {
17945 finishedWork.updateQueue = null;
17946 var retryCache = finishedWork.stateNode;
17947 if (retryCache === null) {
17948 retryCache = finishedWork.stateNode = new PossiblyWeakSet$1();
17949 }
17950 thenables.forEach(function (thenable) {
17951 // Memoize using the boundary fiber to prevent redundant listeners.
17952 var retry = retryTimedOutBoundary.bind(null, finishedWork, thenable);
17953 if (enableSchedulerTracing) {
17954 retry = unstable_wrap(retry);
17955 }
17956 if (!retryCache.has(thenable)) {
17957 retryCache.add(thenable);
17958 thenable.then(retry, retry);
17959 }
17960 });
17961 }
17962
17963 return;
17964 }
17965 case IncompleteClassComponent:
17966 {
17967 return;
17968 }
17969 default:
17970 {
17971 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.');
17972 }
17973 }
17974}
17975
17976function commitResetTextContent(current$$1) {
17977 if (!supportsMutation) {
17978 return;
17979 }
17980 resetTextContent(current$$1.stateNode);
17981}
17982
17983var PossiblyWeakSet = typeof WeakSet === 'function' ? WeakSet : Set;
17984var PossiblyWeakMap = typeof WeakMap === 'function' ? WeakMap : Map;
17985
17986function createRootErrorUpdate(fiber, errorInfo, expirationTime) {
17987 var update = createUpdate(expirationTime);
17988 // Unmount the root by rendering null.
17989 update.tag = CaptureUpdate;
17990 // Caution: React DevTools currently depends on this property
17991 // being called "element".
17992 update.payload = { element: null };
17993 var error = errorInfo.value;
17994 update.callback = function () {
17995 onUncaughtError(error);
17996 logError(fiber, errorInfo);
17997 };
17998 return update;
17999}
18000
18001function createClassErrorUpdate(fiber, errorInfo, expirationTime) {
18002 var update = createUpdate(expirationTime);
18003 update.tag = CaptureUpdate;
18004 var getDerivedStateFromError = fiber.type.getDerivedStateFromError;
18005 if (typeof getDerivedStateFromError === 'function') {
18006 var error = errorInfo.value;
18007 update.payload = function () {
18008 return getDerivedStateFromError(error);
18009 };
18010 }
18011
18012 var inst = fiber.stateNode;
18013 if (inst !== null && typeof inst.componentDidCatch === 'function') {
18014 update.callback = function callback() {
18015 if (typeof getDerivedStateFromError !== 'function') {
18016 // To preserve the preexisting retry behavior of error boundaries,
18017 // we keep track of which ones already failed during this batch.
18018 // This gets reset before we yield back to the browser.
18019 // TODO: Warn in strict mode if getDerivedStateFromError is
18020 // not defined.
18021 markLegacyErrorBoundaryAsFailed(this);
18022 }
18023 var error = errorInfo.value;
18024 var stack = errorInfo.stack;
18025 logError(fiber, errorInfo);
18026 this.componentDidCatch(error, {
18027 componentStack: stack !== null ? stack : ''
18028 });
18029 {
18030 if (typeof getDerivedStateFromError !== 'function') {
18031 // If componentDidCatch is the only error boundary method defined,
18032 // then it needs to call setState to recover from errors.
18033 // If no state update is scheduled then the boundary will swallow the error.
18034 !(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;
18035 }
18036 }
18037 };
18038 }
18039 return update;
18040}
18041
18042function attachPingListener(root, renderExpirationTime, thenable) {
18043 // Attach a listener to the promise to "ping" the root and retry. But
18044 // only if one does not already exist for the current render expiration
18045 // time (which acts like a "thread ID" here).
18046 var pingCache = root.pingCache;
18047 var threadIDs = void 0;
18048 if (pingCache === null) {
18049 pingCache = root.pingCache = new PossiblyWeakMap();
18050 threadIDs = new Set();
18051 pingCache.set(thenable, threadIDs);
18052 } else {
18053 threadIDs = pingCache.get(thenable);
18054 if (threadIDs === undefined) {
18055 threadIDs = new Set();
18056 pingCache.set(thenable, threadIDs);
18057 }
18058 }
18059 if (!threadIDs.has(renderExpirationTime)) {
18060 // Memoize using the thread ID to prevent redundant listeners.
18061 threadIDs.add(renderExpirationTime);
18062 var ping = pingSuspendedRoot.bind(null, root, thenable, renderExpirationTime);
18063 if (enableSchedulerTracing) {
18064 ping = unstable_wrap(ping);
18065 }
18066 thenable.then(ping, ping);
18067 }
18068}
18069
18070function throwException(root, returnFiber, sourceFiber, value, renderExpirationTime) {
18071 // The source fiber did not complete.
18072 sourceFiber.effectTag |= Incomplete;
18073 // Its effect list is no longer valid.
18074 sourceFiber.firstEffect = sourceFiber.lastEffect = null;
18075
18076 if (value !== null && typeof value === 'object' && typeof value.then === 'function') {
18077 // This is a thenable.
18078 var thenable = value;
18079
18080 // Find the earliest timeout threshold of all the placeholders in the
18081 // ancestor path. We could avoid this traversal by storing the thresholds on
18082 // the stack, but we choose not to because we only hit this path if we're
18083 // IO-bound (i.e. if something suspends). Whereas the stack is used even in
18084 // the non-IO- bound case.
18085 var _workInProgress = returnFiber;
18086 var earliestTimeoutMs = -1;
18087 var startTimeMs = -1;
18088 do {
18089 if (_workInProgress.tag === SuspenseComponent) {
18090 var current$$1 = _workInProgress.alternate;
18091 if (current$$1 !== null) {
18092 var currentState = current$$1.memoizedState;
18093 if (currentState !== null) {
18094 // Reached a boundary that already timed out. Do not search
18095 // any further.
18096 var timedOutAt = currentState.timedOutAt;
18097 startTimeMs = expirationTimeToMs(timedOutAt);
18098 // Do not search any further.
18099 break;
18100 }
18101 }
18102 var timeoutPropMs = _workInProgress.pendingProps.maxDuration;
18103 if (typeof timeoutPropMs === 'number') {
18104 if (timeoutPropMs <= 0) {
18105 earliestTimeoutMs = 0;
18106 } else if (earliestTimeoutMs === -1 || timeoutPropMs < earliestTimeoutMs) {
18107 earliestTimeoutMs = timeoutPropMs;
18108 }
18109 }
18110 }
18111 // If there is a DehydratedSuspenseComponent we don't have to do anything because
18112 // if something suspends inside it, we will simply leave that as dehydrated. It
18113 // will never timeout.
18114 _workInProgress = _workInProgress.return;
18115 } while (_workInProgress !== null);
18116
18117 // Schedule the nearest Suspense to re-render the timed out view.
18118 _workInProgress = returnFiber;
18119 do {
18120 if (_workInProgress.tag === SuspenseComponent && shouldCaptureSuspense(_workInProgress)) {
18121 // Found the nearest boundary.
18122
18123 // Stash the promise on the boundary fiber. If the boundary times out, we'll
18124 var thenables = _workInProgress.updateQueue;
18125 if (thenables === null) {
18126 var updateQueue = new Set();
18127 updateQueue.add(thenable);
18128 _workInProgress.updateQueue = updateQueue;
18129 } else {
18130 thenables.add(thenable);
18131 }
18132
18133 // If the boundary is outside of concurrent mode, we should *not*
18134 // suspend the commit. Pretend as if the suspended component rendered
18135 // null and keep rendering. In the commit phase, we'll schedule a
18136 // subsequent synchronous update to re-render the Suspense.
18137 //
18138 // Note: It doesn't matter whether the component that suspended was
18139 // inside a concurrent mode tree. If the Suspense is outside of it, we
18140 // should *not* suspend the commit.
18141 if ((_workInProgress.mode & ConcurrentMode) === NoEffect) {
18142 _workInProgress.effectTag |= DidCapture;
18143
18144 // We're going to commit this fiber even though it didn't complete.
18145 // But we shouldn't call any lifecycle methods or callbacks. Remove
18146 // all lifecycle effect tags.
18147 sourceFiber.effectTag &= ~(LifecycleEffectMask | Incomplete);
18148
18149 if (sourceFiber.tag === ClassComponent) {
18150 var currentSourceFiber = sourceFiber.alternate;
18151 if (currentSourceFiber === null) {
18152 // This is a new mount. Change the tag so it's not mistaken for a
18153 // completed class component. For example, we should not call
18154 // componentWillUnmount if it is deleted.
18155 sourceFiber.tag = IncompleteClassComponent;
18156 } else {
18157 // When we try rendering again, we should not reuse the current fiber,
18158 // since it's known to be in an inconsistent state. Use a force updte to
18159 // prevent a bail out.
18160 var update = createUpdate(Sync);
18161 update.tag = ForceUpdate;
18162 enqueueUpdate(sourceFiber, update);
18163 }
18164 }
18165
18166 // The source fiber did not complete. Mark it with Sync priority to
18167 // indicate that it still has pending work.
18168 sourceFiber.expirationTime = Sync;
18169
18170 // Exit without suspending.
18171 return;
18172 }
18173
18174 // Confirmed that the boundary is in a concurrent mode tree. Continue
18175 // with the normal suspend path.
18176
18177 attachPingListener(root, renderExpirationTime, thenable);
18178
18179 var absoluteTimeoutMs = void 0;
18180 if (earliestTimeoutMs === -1) {
18181 // If no explicit threshold is given, default to an arbitrarily large
18182 // value. The actual size doesn't matter because the threshold for the
18183 // whole tree will be clamped to the expiration time.
18184 absoluteTimeoutMs = maxSigned31BitInt;
18185 } else {
18186 if (startTimeMs === -1) {
18187 // This suspend happened outside of any already timed-out
18188 // placeholders. We don't know exactly when the update was
18189 // scheduled, but we can infer an approximate start time from the
18190 // expiration time. First, find the earliest uncommitted expiration
18191 // time in the tree, including work that is suspended. Then subtract
18192 // the offset used to compute an async update's expiration time.
18193 // This will cause high priority (interactive) work to expire
18194 // earlier than necessary, but we can account for this by adjusting
18195 // for the Just Noticeable Difference.
18196 var earliestExpirationTime = findEarliestOutstandingPriorityLevel(root, renderExpirationTime);
18197 var earliestExpirationTimeMs = expirationTimeToMs(earliestExpirationTime);
18198 startTimeMs = earliestExpirationTimeMs - LOW_PRIORITY_EXPIRATION;
18199 }
18200 absoluteTimeoutMs = startTimeMs + earliestTimeoutMs;
18201 }
18202
18203 // Mark the earliest timeout in the suspended fiber's ancestor path.
18204 // After completing the root, we'll take the largest of all the
18205 // suspended fiber's timeouts and use it to compute a timeout for the
18206 // whole tree.
18207 renderDidSuspend(root, absoluteTimeoutMs, renderExpirationTime);
18208
18209 _workInProgress.effectTag |= ShouldCapture;
18210 _workInProgress.expirationTime = renderExpirationTime;
18211 return;
18212 } else if (enableSuspenseServerRenderer && _workInProgress.tag === DehydratedSuspenseComponent) {
18213 attachPingListener(root, renderExpirationTime, thenable);
18214
18215 // Since we already have a current fiber, we can eagerly add a retry listener.
18216 var retryCache = _workInProgress.memoizedState;
18217 if (retryCache === null) {
18218 retryCache = _workInProgress.memoizedState = new PossiblyWeakSet();
18219 var _current = _workInProgress.alternate;
18220 !_current ? invariant(false, 'A dehydrated suspense boundary must commit before trying to render. This is probably a bug in React.') : void 0;
18221 _current.memoizedState = retryCache;
18222 }
18223 // Memoize using the boundary fiber to prevent redundant listeners.
18224 if (!retryCache.has(thenable)) {
18225 retryCache.add(thenable);
18226 var retry = retryTimedOutBoundary.bind(null, _workInProgress, thenable);
18227 if (enableSchedulerTracing) {
18228 retry = unstable_wrap(retry);
18229 }
18230 thenable.then(retry, retry);
18231 }
18232 _workInProgress.effectTag |= ShouldCapture;
18233 _workInProgress.expirationTime = renderExpirationTime;
18234 return;
18235 }
18236 // This boundary already captured during this render. Continue to the next
18237 // boundary.
18238 _workInProgress = _workInProgress.return;
18239 } while (_workInProgress !== null);
18240 // No boundary was found. Fallthrough to error mode.
18241 // TODO: Use invariant so the message is stripped in prod?
18242 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));
18243 }
18244
18245 // We didn't find a boundary that could handle this type of exception. Start
18246 // over and traverse parent path again, this time treating the exception
18247 // as an error.
18248 renderDidError();
18249 value = createCapturedValue(value, sourceFiber);
18250 var workInProgress = returnFiber;
18251 do {
18252 switch (workInProgress.tag) {
18253 case HostRoot:
18254 {
18255 var _errorInfo = value;
18256 workInProgress.effectTag |= ShouldCapture;
18257 workInProgress.expirationTime = renderExpirationTime;
18258 var _update = createRootErrorUpdate(workInProgress, _errorInfo, renderExpirationTime);
18259 enqueueCapturedUpdate(workInProgress, _update);
18260 return;
18261 }
18262 case ClassComponent:
18263 // Capture and retry
18264 var errorInfo = value;
18265 var ctor = workInProgress.type;
18266 var instance = workInProgress.stateNode;
18267 if ((workInProgress.effectTag & DidCapture) === NoEffect && (typeof ctor.getDerivedStateFromError === 'function' || instance !== null && typeof instance.componentDidCatch === 'function' && !isAlreadyFailedLegacyErrorBoundary(instance))) {
18268 workInProgress.effectTag |= ShouldCapture;
18269 workInProgress.expirationTime = renderExpirationTime;
18270 // Schedule the error boundary to re-render using updated state
18271 var _update2 = createClassErrorUpdate(workInProgress, errorInfo, renderExpirationTime);
18272 enqueueCapturedUpdate(workInProgress, _update2);
18273 return;
18274 }
18275 break;
18276 default:
18277 break;
18278 }
18279 workInProgress = workInProgress.return;
18280 } while (workInProgress !== null);
18281}
18282
18283function unwindWork(workInProgress, renderExpirationTime) {
18284 switch (workInProgress.tag) {
18285 case ClassComponent:
18286 {
18287 var Component = workInProgress.type;
18288 if (isContextProvider(Component)) {
18289 popContext(workInProgress);
18290 }
18291 var effectTag = workInProgress.effectTag;
18292 if (effectTag & ShouldCapture) {
18293 workInProgress.effectTag = effectTag & ~ShouldCapture | DidCapture;
18294 return workInProgress;
18295 }
18296 return null;
18297 }
18298 case HostRoot:
18299 {
18300 popHostContainer(workInProgress);
18301 popTopLevelContextObject(workInProgress);
18302 var _effectTag = workInProgress.effectTag;
18303 !((_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;
18304 workInProgress.effectTag = _effectTag & ~ShouldCapture | DidCapture;
18305 return workInProgress;
18306 }
18307 case HostComponent:
18308 {
18309 // TODO: popHydrationState
18310 popHostContext(workInProgress);
18311 return null;
18312 }
18313 case SuspenseComponent:
18314 {
18315 var _effectTag2 = workInProgress.effectTag;
18316 if (_effectTag2 & ShouldCapture) {
18317 workInProgress.effectTag = _effectTag2 & ~ShouldCapture | DidCapture;
18318 // Captured a suspense effect. Re-render the boundary.
18319 return workInProgress;
18320 }
18321 return null;
18322 }
18323 case DehydratedSuspenseComponent:
18324 {
18325 if (enableSuspenseServerRenderer) {
18326 // TODO: popHydrationState
18327 var _effectTag3 = workInProgress.effectTag;
18328 if (_effectTag3 & ShouldCapture) {
18329 workInProgress.effectTag = _effectTag3 & ~ShouldCapture | DidCapture;
18330 // Captured a suspense effect. Re-render the boundary.
18331 return workInProgress;
18332 }
18333 }
18334 return null;
18335 }
18336 case HostPortal:
18337 popHostContainer(workInProgress);
18338 return null;
18339 case ContextProvider:
18340 popProvider(workInProgress);
18341 return null;
18342 default:
18343 return null;
18344 }
18345}
18346
18347function unwindInterruptedWork(interruptedWork) {
18348 switch (interruptedWork.tag) {
18349 case ClassComponent:
18350 {
18351 var childContextTypes = interruptedWork.type.childContextTypes;
18352 if (childContextTypes !== null && childContextTypes !== undefined) {
18353 popContext(interruptedWork);
18354 }
18355 break;
18356 }
18357 case HostRoot:
18358 {
18359 popHostContainer(interruptedWork);
18360 popTopLevelContextObject(interruptedWork);
18361 break;
18362 }
18363 case HostComponent:
18364 {
18365 popHostContext(interruptedWork);
18366 break;
18367 }
18368 case HostPortal:
18369 popHostContainer(interruptedWork);
18370 break;
18371 case ContextProvider:
18372 popProvider(interruptedWork);
18373 break;
18374 default:
18375 break;
18376 }
18377}
18378
18379var ReactCurrentDispatcher = ReactSharedInternals.ReactCurrentDispatcher;
18380var ReactCurrentOwner$2 = ReactSharedInternals.ReactCurrentOwner;
18381
18382
18383var didWarnAboutStateTransition = void 0;
18384var didWarnSetStateChildContext = void 0;
18385var warnAboutUpdateOnUnmounted = void 0;
18386var warnAboutInvalidUpdates = void 0;
18387
18388if (enableSchedulerTracing) {
18389 // Provide explicit error message when production+profiling bundle of e.g. react-dom
18390 // is used with production (non-profiling) bundle of scheduler/tracing
18391 !(__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;
18392}
18393
18394{
18395 didWarnAboutStateTransition = false;
18396 didWarnSetStateChildContext = false;
18397 var didWarnStateUpdateForUnmountedComponent = {};
18398
18399 warnAboutUpdateOnUnmounted = function (fiber, isClass) {
18400 // We show the whole stack but dedupe on the top component's name because
18401 // the problematic code almost always lies inside that component.
18402 var componentName = getComponentName(fiber.type) || 'ReactComponent';
18403 if (didWarnStateUpdateForUnmountedComponent[componentName]) {
18404 return;
18405 }
18406 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));
18407 didWarnStateUpdateForUnmountedComponent[componentName] = true;
18408 };
18409
18410 warnAboutInvalidUpdates = function (instance) {
18411 switch (phase) {
18412 case 'getChildContext':
18413 if (didWarnSetStateChildContext) {
18414 return;
18415 }
18416 warningWithoutStack$1(false, 'setState(...): Cannot call setState() inside getChildContext()');
18417 didWarnSetStateChildContext = true;
18418 break;
18419 case 'render':
18420 if (didWarnAboutStateTransition) {
18421 return;
18422 }
18423 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.');
18424 didWarnAboutStateTransition = true;
18425 break;
18426 }
18427 };
18428}
18429
18430// Used to ensure computeUniqueAsyncExpiration is monotonically decreasing.
18431var lastUniqueAsyncExpiration = Sync - 1;
18432
18433var isWorking = false;
18434
18435// The next work in progress fiber that we're currently working on.
18436var nextUnitOfWork = null;
18437var nextRoot = null;
18438// The time at which we're currently rendering work.
18439var nextRenderExpirationTime = NoWork;
18440var nextLatestAbsoluteTimeoutMs = -1;
18441var nextRenderDidError = false;
18442
18443// The next fiber with an effect that we're currently committing.
18444var nextEffect = null;
18445
18446var isCommitting$1 = false;
18447var rootWithPendingPassiveEffects = null;
18448var passiveEffectCallbackHandle = null;
18449var passiveEffectCallback = null;
18450
18451var legacyErrorBoundariesThatAlreadyFailed = null;
18452
18453// Used for performance tracking.
18454var interruptedBy = null;
18455
18456var stashedWorkInProgressProperties = void 0;
18457var replayUnitOfWork = void 0;
18458var mayReplayFailedUnitOfWork = void 0;
18459var isReplayingFailedUnitOfWork = void 0;
18460var originalReplayError = void 0;
18461var rethrowOriginalError = void 0;
18462if (true && replayFailedUnitOfWorkWithInvokeGuardedCallback) {
18463 stashedWorkInProgressProperties = null;
18464 mayReplayFailedUnitOfWork = true;
18465 isReplayingFailedUnitOfWork = false;
18466 originalReplayError = null;
18467 replayUnitOfWork = function (failedUnitOfWork, thrownValue, isYieldy) {
18468 if (thrownValue !== null && typeof thrownValue === 'object' && typeof thrownValue.then === 'function') {
18469 // Don't replay promises. Treat everything else like an error.
18470 // TODO: Need to figure out a different strategy if/when we add
18471 // support for catching other types.
18472 return;
18473 }
18474
18475 // Restore the original state of the work-in-progress
18476 if (stashedWorkInProgressProperties === null) {
18477 // This should never happen. Don't throw because this code is DEV-only.
18478 warningWithoutStack$1(false, 'Could not replay rendering after an error. This is likely a bug in React. ' + 'Please file an issue.');
18479 return;
18480 }
18481 assignFiberPropertiesInDEV(failedUnitOfWork, stashedWorkInProgressProperties);
18482
18483 switch (failedUnitOfWork.tag) {
18484 case HostRoot:
18485 popHostContainer(failedUnitOfWork);
18486 popTopLevelContextObject(failedUnitOfWork);
18487 break;
18488 case HostComponent:
18489 popHostContext(failedUnitOfWork);
18490 break;
18491 case ClassComponent:
18492 {
18493 var Component = failedUnitOfWork.type;
18494 if (isContextProvider(Component)) {
18495 popContext(failedUnitOfWork);
18496 }
18497 break;
18498 }
18499 case HostPortal:
18500 popHostContainer(failedUnitOfWork);
18501 break;
18502 case ContextProvider:
18503 popProvider(failedUnitOfWork);
18504 break;
18505 }
18506 // Replay the begin phase.
18507 isReplayingFailedUnitOfWork = true;
18508 originalReplayError = thrownValue;
18509 invokeGuardedCallback(null, workLoop, null, isYieldy);
18510 isReplayingFailedUnitOfWork = false;
18511 originalReplayError = null;
18512 if (hasCaughtError()) {
18513 var replayError = clearCaughtError();
18514 if (replayError != null && thrownValue != null) {
18515 try {
18516 // Reading the expando property is intentionally
18517 // inside `try` because it might be a getter or Proxy.
18518 if (replayError._suppressLogging) {
18519 // Also suppress logging for the original error.
18520 thrownValue._suppressLogging = true;
18521 }
18522 } catch (inner) {
18523 // Ignore.
18524 }
18525 }
18526 } else {
18527 // If the begin phase did not fail the second time, set this pointer
18528 // back to the original value.
18529 nextUnitOfWork = failedUnitOfWork;
18530 }
18531 };
18532 rethrowOriginalError = function () {
18533 throw originalReplayError;
18534 };
18535}
18536
18537function resetStack() {
18538 if (nextUnitOfWork !== null) {
18539 var interruptedWork = nextUnitOfWork.return;
18540 while (interruptedWork !== null) {
18541 unwindInterruptedWork(interruptedWork);
18542 interruptedWork = interruptedWork.return;
18543 }
18544 }
18545
18546 {
18547 ReactStrictModeWarnings.discardPendingWarnings();
18548 checkThatStackIsEmpty();
18549 }
18550
18551 nextRoot = null;
18552 nextRenderExpirationTime = NoWork;
18553 nextLatestAbsoluteTimeoutMs = -1;
18554 nextRenderDidError = false;
18555 nextUnitOfWork = null;
18556}
18557
18558function commitAllHostEffects() {
18559 while (nextEffect !== null) {
18560 {
18561 setCurrentFiber(nextEffect);
18562 }
18563 recordEffect();
18564
18565 var effectTag = nextEffect.effectTag;
18566
18567 if (effectTag & ContentReset) {
18568 commitResetTextContent(nextEffect);
18569 }
18570
18571 if (effectTag & Ref) {
18572 var current$$1 = nextEffect.alternate;
18573 if (current$$1 !== null) {
18574 commitDetachRef(current$$1);
18575 }
18576 }
18577
18578 // The following switch statement is only concerned about placement,
18579 // updates, and deletions. To avoid needing to add a case for every
18580 // possible bitmap value, we remove the secondary effects from the
18581 // effect tag and switch on that value.
18582 var primaryEffectTag = effectTag & (Placement | Update | Deletion);
18583 switch (primaryEffectTag) {
18584 case Placement:
18585 {
18586 commitPlacement(nextEffect);
18587 // Clear the "placement" from effect tag so that we know that this is inserted, before
18588 // any life-cycles like componentDidMount gets called.
18589 // TODO: findDOMNode doesn't rely on this any more but isMounted
18590 // does and isMounted is deprecated anyway so we should be able
18591 // to kill this.
18592 nextEffect.effectTag &= ~Placement;
18593 break;
18594 }
18595 case PlacementAndUpdate:
18596 {
18597 // Placement
18598 commitPlacement(nextEffect);
18599 // Clear the "placement" from effect tag so that we know that this is inserted, before
18600 // any life-cycles like componentDidMount gets called.
18601 nextEffect.effectTag &= ~Placement;
18602
18603 // Update
18604 var _current = nextEffect.alternate;
18605 commitWork(_current, nextEffect);
18606 break;
18607 }
18608 case Update:
18609 {
18610 var _current2 = nextEffect.alternate;
18611 commitWork(_current2, nextEffect);
18612 break;
18613 }
18614 case Deletion:
18615 {
18616 commitDeletion(nextEffect);
18617 break;
18618 }
18619 }
18620 nextEffect = nextEffect.nextEffect;
18621 }
18622
18623 {
18624 resetCurrentFiber();
18625 }
18626}
18627
18628function commitBeforeMutationLifecycles() {
18629 while (nextEffect !== null) {
18630 {
18631 setCurrentFiber(nextEffect);
18632 }
18633
18634 var effectTag = nextEffect.effectTag;
18635 if (effectTag & Snapshot) {
18636 recordEffect();
18637 var current$$1 = nextEffect.alternate;
18638 commitBeforeMutationLifeCycles(current$$1, nextEffect);
18639 }
18640
18641 nextEffect = nextEffect.nextEffect;
18642 }
18643
18644 {
18645 resetCurrentFiber();
18646 }
18647}
18648
18649function commitAllLifeCycles(finishedRoot, committedExpirationTime) {
18650 {
18651 ReactStrictModeWarnings.flushPendingUnsafeLifecycleWarnings();
18652 ReactStrictModeWarnings.flushLegacyContextWarning();
18653
18654 if (warnAboutDeprecatedLifecycles) {
18655 ReactStrictModeWarnings.flushPendingDeprecationWarnings();
18656 }
18657 }
18658 while (nextEffect !== null) {
18659 {
18660 setCurrentFiber(nextEffect);
18661 }
18662 var effectTag = nextEffect.effectTag;
18663
18664 if (effectTag & (Update | Callback)) {
18665 recordEffect();
18666 var current$$1 = nextEffect.alternate;
18667 commitLifeCycles(finishedRoot, current$$1, nextEffect, committedExpirationTime);
18668 }
18669
18670 if (effectTag & Ref) {
18671 recordEffect();
18672 commitAttachRef(nextEffect);
18673 }
18674
18675 if (effectTag & Passive) {
18676 rootWithPendingPassiveEffects = finishedRoot;
18677 }
18678
18679 nextEffect = nextEffect.nextEffect;
18680 }
18681 {
18682 resetCurrentFiber();
18683 }
18684}
18685
18686function commitPassiveEffects(root, firstEffect) {
18687 rootWithPendingPassiveEffects = null;
18688 passiveEffectCallbackHandle = null;
18689 passiveEffectCallback = null;
18690
18691 // Set this to true to prevent re-entrancy
18692 var previousIsRendering = isRendering;
18693 isRendering = true;
18694
18695 var effect = firstEffect;
18696 do {
18697 {
18698 setCurrentFiber(effect);
18699 }
18700
18701 if (effect.effectTag & Passive) {
18702 var didError = false;
18703 var error = void 0;
18704 {
18705 invokeGuardedCallback(null, commitPassiveHookEffects, null, effect);
18706 if (hasCaughtError()) {
18707 didError = true;
18708 error = clearCaughtError();
18709 }
18710 }
18711 if (didError) {
18712 captureCommitPhaseError(effect, error);
18713 }
18714 }
18715 effect = effect.nextEffect;
18716 } while (effect !== null);
18717 {
18718 resetCurrentFiber();
18719 }
18720
18721 isRendering = previousIsRendering;
18722
18723 // Check if work was scheduled by one of the effects
18724 var rootExpirationTime = root.expirationTime;
18725 if (rootExpirationTime !== NoWork) {
18726 requestWork(root, rootExpirationTime);
18727 }
18728 // Flush any sync work that was scheduled by effects
18729 if (!isBatchingUpdates && !isRendering) {
18730 performSyncWork();
18731 }
18732}
18733
18734function isAlreadyFailedLegacyErrorBoundary(instance) {
18735 return legacyErrorBoundariesThatAlreadyFailed !== null && legacyErrorBoundariesThatAlreadyFailed.has(instance);
18736}
18737
18738function markLegacyErrorBoundaryAsFailed(instance) {
18739 if (legacyErrorBoundariesThatAlreadyFailed === null) {
18740 legacyErrorBoundariesThatAlreadyFailed = new Set([instance]);
18741 } else {
18742 legacyErrorBoundariesThatAlreadyFailed.add(instance);
18743 }
18744}
18745
18746function flushPassiveEffects() {
18747 if (passiveEffectCallbackHandle !== null) {
18748 cancelPassiveEffects(passiveEffectCallbackHandle);
18749 }
18750 if (passiveEffectCallback !== null) {
18751 // We call the scheduled callback instead of commitPassiveEffects directly
18752 // to ensure tracing works correctly.
18753 passiveEffectCallback();
18754 }
18755}
18756
18757function commitRoot(root, finishedWork) {
18758 isWorking = true;
18759 isCommitting$1 = true;
18760 startCommitTimer();
18761
18762 !(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;
18763 var committedExpirationTime = root.pendingCommitExpirationTime;
18764 !(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;
18765 root.pendingCommitExpirationTime = NoWork;
18766
18767 // Update the pending priority levels to account for the work that we are
18768 // about to commit. This needs to happen before calling the lifecycles, since
18769 // they may schedule additional updates.
18770 var updateExpirationTimeBeforeCommit = finishedWork.expirationTime;
18771 var childExpirationTimeBeforeCommit = finishedWork.childExpirationTime;
18772 var earliestRemainingTimeBeforeCommit = childExpirationTimeBeforeCommit > updateExpirationTimeBeforeCommit ? childExpirationTimeBeforeCommit : updateExpirationTimeBeforeCommit;
18773 markCommittedPriorityLevels(root, earliestRemainingTimeBeforeCommit);
18774
18775 var prevInteractions = null;
18776 if (enableSchedulerTracing) {
18777 // Restore any pending interactions at this point,
18778 // So that cascading work triggered during the render phase will be accounted for.
18779 prevInteractions = __interactionsRef.current;
18780 __interactionsRef.current = root.memoizedInteractions;
18781 }
18782
18783 // Reset this to null before calling lifecycles
18784 ReactCurrentOwner$2.current = null;
18785
18786 var firstEffect = void 0;
18787 if (finishedWork.effectTag > PerformedWork) {
18788 // A fiber's effect list consists only of its children, not itself. So if
18789 // the root has an effect, we need to add it to the end of the list. The
18790 // resulting list is the set that would belong to the root's parent, if
18791 // it had one; that is, all the effects in the tree including the root.
18792 if (finishedWork.lastEffect !== null) {
18793 finishedWork.lastEffect.nextEffect = finishedWork;
18794 firstEffect = finishedWork.firstEffect;
18795 } else {
18796 firstEffect = finishedWork;
18797 }
18798 } else {
18799 // There is no effect on the root.
18800 firstEffect = finishedWork.firstEffect;
18801 }
18802
18803 prepareForCommit(root.containerInfo);
18804
18805 // Invoke instances of getSnapshotBeforeUpdate before mutation.
18806 nextEffect = firstEffect;
18807 startCommitSnapshotEffectsTimer();
18808 while (nextEffect !== null) {
18809 var didError = false;
18810 var error = void 0;
18811 {
18812 invokeGuardedCallback(null, commitBeforeMutationLifecycles, null);
18813 if (hasCaughtError()) {
18814 didError = true;
18815 error = clearCaughtError();
18816 }
18817 }
18818 if (didError) {
18819 !(nextEffect !== null) ? invariant(false, 'Should have next effect. This error is likely caused by a bug in React. Please file an issue.') : void 0;
18820 captureCommitPhaseError(nextEffect, error);
18821 // Clean-up
18822 if (nextEffect !== null) {
18823 nextEffect = nextEffect.nextEffect;
18824 }
18825 }
18826 }
18827 stopCommitSnapshotEffectsTimer();
18828
18829 if (enableProfilerTimer) {
18830 // Mark the current commit time to be shared by all Profilers in this batch.
18831 // This enables them to be grouped later.
18832 recordCommitTime();
18833 }
18834
18835 // Commit all the side-effects within a tree. We'll do this in two passes.
18836 // The first pass performs all the host insertions, updates, deletions and
18837 // ref unmounts.
18838 nextEffect = firstEffect;
18839 startCommitHostEffectsTimer();
18840 while (nextEffect !== null) {
18841 var _didError = false;
18842 var _error = void 0;
18843 {
18844 invokeGuardedCallback(null, commitAllHostEffects, null);
18845 if (hasCaughtError()) {
18846 _didError = true;
18847 _error = clearCaughtError();
18848 }
18849 }
18850 if (_didError) {
18851 !(nextEffect !== null) ? invariant(false, 'Should have next effect. This error is likely caused by a bug in React. Please file an issue.') : void 0;
18852 captureCommitPhaseError(nextEffect, _error);
18853 // Clean-up
18854 if (nextEffect !== null) {
18855 nextEffect = nextEffect.nextEffect;
18856 }
18857 }
18858 }
18859 stopCommitHostEffectsTimer();
18860
18861 resetAfterCommit(root.containerInfo);
18862
18863 // The work-in-progress tree is now the current tree. This must come after
18864 // the first pass of the commit phase, so that the previous tree is still
18865 // current during componentWillUnmount, but before the second pass, so that
18866 // the finished work is current during componentDidMount/Update.
18867 root.current = finishedWork;
18868
18869 // In the second pass we'll perform all life-cycles and ref callbacks.
18870 // Life-cycles happen as a separate pass so that all placements, updates,
18871 // and deletions in the entire tree have already been invoked.
18872 // This pass also triggers any renderer-specific initial effects.
18873 nextEffect = firstEffect;
18874 startCommitLifeCyclesTimer();
18875 while (nextEffect !== null) {
18876 var _didError2 = false;
18877 var _error2 = void 0;
18878 {
18879 invokeGuardedCallback(null, commitAllLifeCycles, null, root, committedExpirationTime);
18880 if (hasCaughtError()) {
18881 _didError2 = true;
18882 _error2 = clearCaughtError();
18883 }
18884 }
18885 if (_didError2) {
18886 !(nextEffect !== null) ? invariant(false, 'Should have next effect. This error is likely caused by a bug in React. Please file an issue.') : void 0;
18887 captureCommitPhaseError(nextEffect, _error2);
18888 if (nextEffect !== null) {
18889 nextEffect = nextEffect.nextEffect;
18890 }
18891 }
18892 }
18893
18894 if (firstEffect !== null && rootWithPendingPassiveEffects !== null) {
18895 // This commit included a passive effect. These do not need to fire until
18896 // after the next paint. Schedule an callback to fire them in an async
18897 // event. To ensure serial execution, the callback will be flushed early if
18898 // we enter rootWithPendingPassiveEffects commit phase before then.
18899 var callback = commitPassiveEffects.bind(null, root, firstEffect);
18900 if (enableSchedulerTracing) {
18901 // TODO: Avoid this extra callback by mutating the tracing ref directly,
18902 // like we do at the beginning of commitRoot. I've opted not to do that
18903 // here because that code is still in flux.
18904 callback = unstable_wrap(callback);
18905 }
18906 passiveEffectCallbackHandle = unstable_runWithPriority(unstable_NormalPriority, function () {
18907 return schedulePassiveEffects(callback);
18908 });
18909 passiveEffectCallback = callback;
18910 }
18911
18912 isCommitting$1 = false;
18913 isWorking = false;
18914 stopCommitLifeCyclesTimer();
18915 stopCommitTimer();
18916 onCommitRoot(finishedWork.stateNode);
18917 if (true && ReactFiberInstrumentation_1.debugTool) {
18918 ReactFiberInstrumentation_1.debugTool.onCommitWork(finishedWork);
18919 }
18920
18921 var updateExpirationTimeAfterCommit = finishedWork.expirationTime;
18922 var childExpirationTimeAfterCommit = finishedWork.childExpirationTime;
18923 var earliestRemainingTimeAfterCommit = childExpirationTimeAfterCommit > updateExpirationTimeAfterCommit ? childExpirationTimeAfterCommit : updateExpirationTimeAfterCommit;
18924 if (earliestRemainingTimeAfterCommit === NoWork) {
18925 // If there's no remaining work, we can clear the set of already failed
18926 // error boundaries.
18927 legacyErrorBoundariesThatAlreadyFailed = null;
18928 }
18929 onCommit(root, earliestRemainingTimeAfterCommit);
18930
18931 if (enableSchedulerTracing) {
18932 __interactionsRef.current = prevInteractions;
18933
18934 var subscriber = void 0;
18935
18936 try {
18937 subscriber = __subscriberRef.current;
18938 if (subscriber !== null && root.memoizedInteractions.size > 0) {
18939 var threadID = computeThreadID(committedExpirationTime, root.interactionThreadID);
18940 subscriber.onWorkStopped(root.memoizedInteractions, threadID);
18941 }
18942 } catch (error) {
18943 // It's not safe for commitRoot() to throw.
18944 // Store the error for now and we'll re-throw in finishRendering().
18945 if (!hasUnhandledError) {
18946 hasUnhandledError = true;
18947 unhandledError = error;
18948 }
18949 } finally {
18950 // Clear completed interactions from the pending Map.
18951 // Unless the render was suspended or cascading work was scheduled,
18952 // In which case– leave pending interactions until the subsequent render.
18953 var pendingInteractionMap = root.pendingInteractionMap;
18954 pendingInteractionMap.forEach(function (scheduledInteractions, scheduledExpirationTime) {
18955 // Only decrement the pending interaction count if we're done.
18956 // If there's still work at the current priority,
18957 // That indicates that we are waiting for suspense data.
18958 if (scheduledExpirationTime > earliestRemainingTimeAfterCommit) {
18959 pendingInteractionMap.delete(scheduledExpirationTime);
18960
18961 scheduledInteractions.forEach(function (interaction) {
18962 interaction.__count--;
18963
18964 if (subscriber !== null && interaction.__count === 0) {
18965 try {
18966 subscriber.onInteractionScheduledWorkCompleted(interaction);
18967 } catch (error) {
18968 // It's not safe for commitRoot() to throw.
18969 // Store the error for now and we'll re-throw in finishRendering().
18970 if (!hasUnhandledError) {
18971 hasUnhandledError = true;
18972 unhandledError = error;
18973 }
18974 }
18975 }
18976 });
18977 }
18978 });
18979 }
18980 }
18981}
18982
18983function resetChildExpirationTime(workInProgress, renderTime) {
18984 if (renderTime !== Never && workInProgress.childExpirationTime === Never) {
18985 // The children of this component are hidden. Don't bubble their
18986 // expiration times.
18987 return;
18988 }
18989
18990 var newChildExpirationTime = NoWork;
18991
18992 // Bubble up the earliest expiration time.
18993 if (enableProfilerTimer && workInProgress.mode & ProfileMode) {
18994 // We're in profiling mode.
18995 // Let's use this same traversal to update the render durations.
18996 var actualDuration = workInProgress.actualDuration;
18997 var treeBaseDuration = workInProgress.selfBaseDuration;
18998
18999 // When a fiber is cloned, its actualDuration is reset to 0.
19000 // This value will only be updated if work is done on the fiber (i.e. it doesn't bailout).
19001 // When work is done, it should bubble to the parent's actualDuration.
19002 // If the fiber has not been cloned though, (meaning no work was done),
19003 // Then this value will reflect the amount of time spent working on a previous render.
19004 // In that case it should not bubble.
19005 // We determine whether it was cloned by comparing the child pointer.
19006 var shouldBubbleActualDurations = workInProgress.alternate === null || workInProgress.child !== workInProgress.alternate.child;
19007
19008 var child = workInProgress.child;
19009 while (child !== null) {
19010 var childUpdateExpirationTime = child.expirationTime;
19011 var childChildExpirationTime = child.childExpirationTime;
19012 if (childUpdateExpirationTime > newChildExpirationTime) {
19013 newChildExpirationTime = childUpdateExpirationTime;
19014 }
19015 if (childChildExpirationTime > newChildExpirationTime) {
19016 newChildExpirationTime = childChildExpirationTime;
19017 }
19018 if (shouldBubbleActualDurations) {
19019 actualDuration += child.actualDuration;
19020 }
19021 treeBaseDuration += child.treeBaseDuration;
19022 child = child.sibling;
19023 }
19024 workInProgress.actualDuration = actualDuration;
19025 workInProgress.treeBaseDuration = treeBaseDuration;
19026 } else {
19027 var _child = workInProgress.child;
19028 while (_child !== null) {
19029 var _childUpdateExpirationTime = _child.expirationTime;
19030 var _childChildExpirationTime = _child.childExpirationTime;
19031 if (_childUpdateExpirationTime > newChildExpirationTime) {
19032 newChildExpirationTime = _childUpdateExpirationTime;
19033 }
19034 if (_childChildExpirationTime > newChildExpirationTime) {
19035 newChildExpirationTime = _childChildExpirationTime;
19036 }
19037 _child = _child.sibling;
19038 }
19039 }
19040
19041 workInProgress.childExpirationTime = newChildExpirationTime;
19042}
19043
19044function completeUnitOfWork(workInProgress) {
19045 // Attempt to complete the current unit of work, then move to the
19046 // next sibling. If there are no more siblings, return to the
19047 // parent fiber.
19048 while (true) {
19049 // The current, flushed, state of this fiber is the alternate.
19050 // Ideally nothing should rely on this, but relying on it here
19051 // means that we don't need an additional field on the work in
19052 // progress.
19053 var current$$1 = workInProgress.alternate;
19054 {
19055 setCurrentFiber(workInProgress);
19056 }
19057
19058 var returnFiber = workInProgress.return;
19059 var siblingFiber = workInProgress.sibling;
19060
19061 if ((workInProgress.effectTag & Incomplete) === NoEffect) {
19062 if (true && replayFailedUnitOfWorkWithInvokeGuardedCallback) {
19063 // Don't replay if it fails during completion phase.
19064 mayReplayFailedUnitOfWork = false;
19065 }
19066 // This fiber completed.
19067 // Remember we're completing this unit so we can find a boundary if it fails.
19068 nextUnitOfWork = workInProgress;
19069 if (enableProfilerTimer) {
19070 if (workInProgress.mode & ProfileMode) {
19071 startProfilerTimer(workInProgress);
19072 }
19073 nextUnitOfWork = completeWork(current$$1, workInProgress, nextRenderExpirationTime);
19074 if (workInProgress.mode & ProfileMode) {
19075 // Update render duration assuming we didn't error.
19076 stopProfilerTimerIfRunningAndRecordDelta(workInProgress, false);
19077 }
19078 } else {
19079 nextUnitOfWork = completeWork(current$$1, workInProgress, nextRenderExpirationTime);
19080 }
19081 if (true && replayFailedUnitOfWorkWithInvokeGuardedCallback) {
19082 // We're out of completion phase so replaying is fine now.
19083 mayReplayFailedUnitOfWork = true;
19084 }
19085 stopWorkTimer(workInProgress);
19086 resetChildExpirationTime(workInProgress, nextRenderExpirationTime);
19087 {
19088 resetCurrentFiber();
19089 }
19090
19091 if (nextUnitOfWork !== null) {
19092 // Completing this fiber spawned new work. Work on that next.
19093 return nextUnitOfWork;
19094 }
19095
19096 if (returnFiber !== null &&
19097 // Do not append effects to parents if a sibling failed to complete
19098 (returnFiber.effectTag & Incomplete) === NoEffect) {
19099 // Append all the effects of the subtree and this fiber onto the effect
19100 // list of the parent. The completion order of the children affects the
19101 // side-effect order.
19102 if (returnFiber.firstEffect === null) {
19103 returnFiber.firstEffect = workInProgress.firstEffect;
19104 }
19105 if (workInProgress.lastEffect !== null) {
19106 if (returnFiber.lastEffect !== null) {
19107 returnFiber.lastEffect.nextEffect = workInProgress.firstEffect;
19108 }
19109 returnFiber.lastEffect = workInProgress.lastEffect;
19110 }
19111
19112 // If this fiber had side-effects, we append it AFTER the children's
19113 // side-effects. We can perform certain side-effects earlier if
19114 // needed, by doing multiple passes over the effect list. We don't want
19115 // to schedule our own side-effect on our own list because if end up
19116 // reusing children we'll schedule this effect onto itself since we're
19117 // at the end.
19118 var effectTag = workInProgress.effectTag;
19119 // Skip both NoWork and PerformedWork tags when creating the effect list.
19120 // PerformedWork effect is read by React DevTools but shouldn't be committed.
19121 if (effectTag > PerformedWork) {
19122 if (returnFiber.lastEffect !== null) {
19123 returnFiber.lastEffect.nextEffect = workInProgress;
19124 } else {
19125 returnFiber.firstEffect = workInProgress;
19126 }
19127 returnFiber.lastEffect = workInProgress;
19128 }
19129 }
19130
19131 if (true && ReactFiberInstrumentation_1.debugTool) {
19132 ReactFiberInstrumentation_1.debugTool.onCompleteWork(workInProgress);
19133 }
19134
19135 if (siblingFiber !== null) {
19136 // If there is more work to do in this returnFiber, do that next.
19137 return siblingFiber;
19138 } else if (returnFiber !== null) {
19139 // If there's no more work in this returnFiber. Complete the returnFiber.
19140 workInProgress = returnFiber;
19141 continue;
19142 } else {
19143 // We've reached the root.
19144 return null;
19145 }
19146 } else {
19147 if (enableProfilerTimer && workInProgress.mode & ProfileMode) {
19148 // Record the render duration for the fiber that errored.
19149 stopProfilerTimerIfRunningAndRecordDelta(workInProgress, false);
19150
19151 // Include the time spent working on failed children before continuing.
19152 var actualDuration = workInProgress.actualDuration;
19153 var child = workInProgress.child;
19154 while (child !== null) {
19155 actualDuration += child.actualDuration;
19156 child = child.sibling;
19157 }
19158 workInProgress.actualDuration = actualDuration;
19159 }
19160
19161 // This fiber did not complete because something threw. Pop values off
19162 // the stack without entering the complete phase. If this is a boundary,
19163 // capture values if possible.
19164 var next = unwindWork(workInProgress, nextRenderExpirationTime);
19165 // Because this fiber did not complete, don't reset its expiration time.
19166 if (workInProgress.effectTag & DidCapture) {
19167 // Restarting an error boundary
19168 stopFailedWorkTimer(workInProgress);
19169 } else {
19170 stopWorkTimer(workInProgress);
19171 }
19172
19173 {
19174 resetCurrentFiber();
19175 }
19176
19177 if (next !== null) {
19178 stopWorkTimer(workInProgress);
19179 if (true && ReactFiberInstrumentation_1.debugTool) {
19180 ReactFiberInstrumentation_1.debugTool.onCompleteWork(workInProgress);
19181 }
19182
19183 // If completing this work spawned new work, do that next. We'll come
19184 // back here again.
19185 // Since we're restarting, remove anything that is not a host effect
19186 // from the effect tag.
19187 next.effectTag &= HostEffectMask;
19188 return next;
19189 }
19190
19191 if (returnFiber !== null) {
19192 // Mark the parent fiber as incomplete and clear its effect list.
19193 returnFiber.firstEffect = returnFiber.lastEffect = null;
19194 returnFiber.effectTag |= Incomplete;
19195 }
19196
19197 if (true && ReactFiberInstrumentation_1.debugTool) {
19198 ReactFiberInstrumentation_1.debugTool.onCompleteWork(workInProgress);
19199 }
19200
19201 if (siblingFiber !== null) {
19202 // If there is more work to do in this returnFiber, do that next.
19203 return siblingFiber;
19204 } else if (returnFiber !== null) {
19205 // If there's no more work in this returnFiber. Complete the returnFiber.
19206 workInProgress = returnFiber;
19207 continue;
19208 } else {
19209 return null;
19210 }
19211 }
19212 }
19213
19214 // Without this explicit null return Flow complains of invalid return type
19215 // TODO Remove the above while(true) loop
19216 // eslint-disable-next-line no-unreachable
19217 return null;
19218}
19219
19220function performUnitOfWork(workInProgress) {
19221 // The current, flushed, state of this fiber is the alternate.
19222 // Ideally nothing should rely on this, but relying on it here
19223 // means that we don't need an additional field on the work in
19224 // progress.
19225 var current$$1 = workInProgress.alternate;
19226
19227 // See if beginning this work spawns more work.
19228 startWorkTimer(workInProgress);
19229 {
19230 setCurrentFiber(workInProgress);
19231 }
19232
19233 if (true && replayFailedUnitOfWorkWithInvokeGuardedCallback) {
19234 stashedWorkInProgressProperties = assignFiberPropertiesInDEV(stashedWorkInProgressProperties, workInProgress);
19235 }
19236
19237 var next = void 0;
19238 if (enableProfilerTimer) {
19239 if (workInProgress.mode & ProfileMode) {
19240 startProfilerTimer(workInProgress);
19241 }
19242
19243 next = beginWork(current$$1, workInProgress, nextRenderExpirationTime);
19244 workInProgress.memoizedProps = workInProgress.pendingProps;
19245
19246 if (workInProgress.mode & ProfileMode) {
19247 // Record the render duration assuming we didn't bailout (or error).
19248 stopProfilerTimerIfRunningAndRecordDelta(workInProgress, true);
19249 }
19250 } else {
19251 next = beginWork(current$$1, workInProgress, nextRenderExpirationTime);
19252 workInProgress.memoizedProps = workInProgress.pendingProps;
19253 }
19254
19255 {
19256 resetCurrentFiber();
19257 if (isReplayingFailedUnitOfWork) {
19258 // Currently replaying a failed unit of work. This should be unreachable,
19259 // because the render phase is meant to be idempotent, and it should
19260 // have thrown again. Since it didn't, rethrow the original error, so
19261 // React's internal stack is not misaligned.
19262 rethrowOriginalError();
19263 }
19264 }
19265 if (true && ReactFiberInstrumentation_1.debugTool) {
19266 ReactFiberInstrumentation_1.debugTool.onBeginWork(workInProgress);
19267 }
19268
19269 if (next === null) {
19270 // If this doesn't spawn new work, complete the current work.
19271 next = completeUnitOfWork(workInProgress);
19272 }
19273
19274 ReactCurrentOwner$2.current = null;
19275
19276 return next;
19277}
19278
19279function workLoop(isYieldy) {
19280 if (!isYieldy) {
19281 // Flush work without yielding
19282 while (nextUnitOfWork !== null) {
19283 nextUnitOfWork = performUnitOfWork(nextUnitOfWork);
19284 }
19285 } else {
19286 // Flush asynchronous work until there's a higher priority event
19287 while (nextUnitOfWork !== null && !shouldYieldToRenderer()) {
19288 nextUnitOfWork = performUnitOfWork(nextUnitOfWork);
19289 }
19290 }
19291}
19292
19293function renderRoot(root, isYieldy) {
19294 !!isWorking ? invariant(false, 'renderRoot was called recursively. This error is likely caused by a bug in React. Please file an issue.') : void 0;
19295
19296 flushPassiveEffects();
19297
19298 isWorking = true;
19299 var previousDispatcher = ReactCurrentDispatcher.current;
19300 ReactCurrentDispatcher.current = ContextOnlyDispatcher;
19301
19302 var expirationTime = root.nextExpirationTimeToWorkOn;
19303
19304 // Check if we're starting from a fresh stack, or if we're resuming from
19305 // previously yielded work.
19306 if (expirationTime !== nextRenderExpirationTime || root !== nextRoot || nextUnitOfWork === null) {
19307 // Reset the stack and start working from the root.
19308 resetStack();
19309 nextRoot = root;
19310 nextRenderExpirationTime = expirationTime;
19311 nextUnitOfWork = createWorkInProgress(nextRoot.current, null, nextRenderExpirationTime);
19312 root.pendingCommitExpirationTime = NoWork;
19313
19314 if (enableSchedulerTracing) {
19315 // Determine which interactions this batch of work currently includes,
19316 // So that we can accurately attribute time spent working on it,
19317 var interactions = new Set();
19318 root.pendingInteractionMap.forEach(function (scheduledInteractions, scheduledExpirationTime) {
19319 if (scheduledExpirationTime >= expirationTime) {
19320 scheduledInteractions.forEach(function (interaction) {
19321 return interactions.add(interaction);
19322 });
19323 }
19324 });
19325
19326 // Store the current set of interactions on the FiberRoot for a few reasons:
19327 // We can re-use it in hot functions like renderRoot() without having to recalculate it.
19328 // We will also use it in commitWork() to pass to any Profiler onRender() hooks.
19329 // This also provides DevTools with a way to access it when the onCommitRoot() hook is called.
19330 root.memoizedInteractions = interactions;
19331
19332 if (interactions.size > 0) {
19333 var subscriber = __subscriberRef.current;
19334 if (subscriber !== null) {
19335 var threadID = computeThreadID(expirationTime, root.interactionThreadID);
19336 try {
19337 subscriber.onWorkStarted(interactions, threadID);
19338 } catch (error) {
19339 // Work thrown by an interaction tracing subscriber should be rethrown,
19340 // But only once it's safe (to avoid leaving the scheduler in an invalid state).
19341 // Store the error for now and we'll re-throw in finishRendering().
19342 if (!hasUnhandledError) {
19343 hasUnhandledError = true;
19344 unhandledError = error;
19345 }
19346 }
19347 }
19348 }
19349 }
19350 }
19351
19352 var prevInteractions = null;
19353 if (enableSchedulerTracing) {
19354 // We're about to start new traced work.
19355 // Restore pending interactions so cascading work triggered during the render phase will be accounted for.
19356 prevInteractions = __interactionsRef.current;
19357 __interactionsRef.current = root.memoizedInteractions;
19358 }
19359
19360 var didFatal = false;
19361
19362 startWorkLoopTimer(nextUnitOfWork);
19363
19364 do {
19365 try {
19366 workLoop(isYieldy);
19367 } catch (thrownValue) {
19368 resetContextDependences();
19369 resetHooks();
19370
19371 // Reset in case completion throws.
19372 // This is only used in DEV and when replaying is on.
19373 var mayReplay = void 0;
19374 if (true && replayFailedUnitOfWorkWithInvokeGuardedCallback) {
19375 mayReplay = mayReplayFailedUnitOfWork;
19376 mayReplayFailedUnitOfWork = true;
19377 }
19378
19379 if (nextUnitOfWork === null) {
19380 // This is a fatal error.
19381 didFatal = true;
19382 onUncaughtError(thrownValue);
19383 } else {
19384 if (enableProfilerTimer && nextUnitOfWork.mode & ProfileMode) {
19385 // Record the time spent rendering before an error was thrown.
19386 // This avoids inaccurate Profiler durations in the case of a suspended render.
19387 stopProfilerTimerIfRunningAndRecordDelta(nextUnitOfWork, true);
19388 }
19389
19390 {
19391 // Reset global debug state
19392 // We assume this is defined in DEV
19393 resetCurrentlyProcessingQueue();
19394 }
19395
19396 if (true && replayFailedUnitOfWorkWithInvokeGuardedCallback) {
19397 if (mayReplay) {
19398 var failedUnitOfWork = nextUnitOfWork;
19399 replayUnitOfWork(failedUnitOfWork, thrownValue, isYieldy);
19400 }
19401 }
19402
19403 // TODO: we already know this isn't true in some cases.
19404 // At least this shows a nicer error message until we figure out the cause.
19405 // https://github.com/facebook/react/issues/12449#issuecomment-386727431
19406 !(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;
19407
19408 var sourceFiber = nextUnitOfWork;
19409 var returnFiber = sourceFiber.return;
19410 if (returnFiber === null) {
19411 // This is the root. The root could capture its own errors. However,
19412 // we don't know if it errors before or after we pushed the host
19413 // context. This information is needed to avoid a stack mismatch.
19414 // Because we're not sure, treat this as a fatal error. We could track
19415 // which phase it fails in, but doesn't seem worth it. At least
19416 // for now.
19417 didFatal = true;
19418 onUncaughtError(thrownValue);
19419 } else {
19420 throwException(root, returnFiber, sourceFiber, thrownValue, nextRenderExpirationTime);
19421 nextUnitOfWork = completeUnitOfWork(sourceFiber);
19422 continue;
19423 }
19424 }
19425 }
19426 break;
19427 } while (true);
19428
19429 if (enableSchedulerTracing) {
19430 // Traced work is done for now; restore the previous interactions.
19431 __interactionsRef.current = prevInteractions;
19432 }
19433
19434 // We're done performing work. Time to clean up.
19435 isWorking = false;
19436 ReactCurrentDispatcher.current = previousDispatcher;
19437 resetContextDependences();
19438 resetHooks();
19439
19440 // Yield back to main thread.
19441 if (didFatal) {
19442 var _didCompleteRoot = false;
19443 stopWorkLoopTimer(interruptedBy, _didCompleteRoot);
19444 interruptedBy = null;
19445 // There was a fatal error.
19446 {
19447 resetStackAfterFatalErrorInDev();
19448 }
19449 // `nextRoot` points to the in-progress root. A non-null value indicates
19450 // that we're in the middle of an async render. Set it to null to indicate
19451 // there's no more work to be done in the current batch.
19452 nextRoot = null;
19453 onFatal(root);
19454 return;
19455 }
19456
19457 if (nextUnitOfWork !== null) {
19458 // There's still remaining async work in this tree, but we ran out of time
19459 // in the current frame. Yield back to the renderer. Unless we're
19460 // interrupted by a higher priority update, we'll continue later from where
19461 // we left off.
19462 var _didCompleteRoot2 = false;
19463 stopWorkLoopTimer(interruptedBy, _didCompleteRoot2);
19464 interruptedBy = null;
19465 onYield(root);
19466 return;
19467 }
19468
19469 // We completed the whole tree.
19470 var didCompleteRoot = true;
19471 stopWorkLoopTimer(interruptedBy, didCompleteRoot);
19472 var rootWorkInProgress = root.current.alternate;
19473 !(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;
19474
19475 // `nextRoot` points to the in-progress root. A non-null value indicates
19476 // that we're in the middle of an async render. Set it to null to indicate
19477 // there's no more work to be done in the current batch.
19478 nextRoot = null;
19479 interruptedBy = null;
19480
19481 if (nextRenderDidError) {
19482 // There was an error
19483 if (hasLowerPriorityWork(root, expirationTime)) {
19484 // There's lower priority work. If so, it may have the effect of fixing
19485 // the exception that was just thrown. Exit without committing. This is
19486 // similar to a suspend, but without a timeout because we're not waiting
19487 // for a promise to resolve. React will restart at the lower
19488 // priority level.
19489 markSuspendedPriorityLevel(root, expirationTime);
19490 var suspendedExpirationTime = expirationTime;
19491 var rootExpirationTime = root.expirationTime;
19492 onSuspend(root, rootWorkInProgress, suspendedExpirationTime, rootExpirationTime, -1 // Indicates no timeout
19493 );
19494 return;
19495 } else if (
19496 // There's no lower priority work, but we're rendering asynchronously.
19497 // Synchronously attempt to render the same level one more time. This is
19498 // similar to a suspend, but without a timeout because we're not waiting
19499 // for a promise to resolve.
19500 !root.didError && isYieldy) {
19501 root.didError = true;
19502 var _suspendedExpirationTime = root.nextExpirationTimeToWorkOn = expirationTime;
19503 var _rootExpirationTime = root.expirationTime = Sync;
19504 onSuspend(root, rootWorkInProgress, _suspendedExpirationTime, _rootExpirationTime, -1 // Indicates no timeout
19505 );
19506 return;
19507 }
19508 }
19509
19510 if (isYieldy && nextLatestAbsoluteTimeoutMs !== -1) {
19511 // The tree was suspended.
19512 var _suspendedExpirationTime2 = expirationTime;
19513 markSuspendedPriorityLevel(root, _suspendedExpirationTime2);
19514
19515 // Find the earliest uncommitted expiration time in the tree, including
19516 // work that is suspended. The timeout threshold cannot be longer than
19517 // the overall expiration.
19518 var earliestExpirationTime = findEarliestOutstandingPriorityLevel(root, expirationTime);
19519 var earliestExpirationTimeMs = expirationTimeToMs(earliestExpirationTime);
19520 if (earliestExpirationTimeMs < nextLatestAbsoluteTimeoutMs) {
19521 nextLatestAbsoluteTimeoutMs = earliestExpirationTimeMs;
19522 }
19523
19524 // Subtract the current time from the absolute timeout to get the number
19525 // of milliseconds until the timeout. In other words, convert an absolute
19526 // timestamp to a relative time. This is the value that is passed
19527 // to `setTimeout`.
19528 var currentTimeMs = expirationTimeToMs(requestCurrentTime());
19529 var msUntilTimeout = nextLatestAbsoluteTimeoutMs - currentTimeMs;
19530 msUntilTimeout = msUntilTimeout < 0 ? 0 : msUntilTimeout;
19531
19532 // TODO: Account for the Just Noticeable Difference
19533
19534 var _rootExpirationTime2 = root.expirationTime;
19535 onSuspend(root, rootWorkInProgress, _suspendedExpirationTime2, _rootExpirationTime2, msUntilTimeout);
19536 return;
19537 }
19538
19539 // Ready to commit.
19540 onComplete(root, rootWorkInProgress, expirationTime);
19541}
19542
19543function captureCommitPhaseError(sourceFiber, value) {
19544 var expirationTime = Sync;
19545 var fiber = sourceFiber.return;
19546 while (fiber !== null) {
19547 switch (fiber.tag) {
19548 case ClassComponent:
19549 var ctor = fiber.type;
19550 var instance = fiber.stateNode;
19551 if (typeof ctor.getDerivedStateFromError === 'function' || typeof instance.componentDidCatch === 'function' && !isAlreadyFailedLegacyErrorBoundary(instance)) {
19552 var errorInfo = createCapturedValue(value, sourceFiber);
19553 var update = createClassErrorUpdate(fiber, errorInfo, expirationTime);
19554 enqueueUpdate(fiber, update);
19555 scheduleWork(fiber, expirationTime);
19556 return;
19557 }
19558 break;
19559 case HostRoot:
19560 {
19561 var _errorInfo = createCapturedValue(value, sourceFiber);
19562 var _update = createRootErrorUpdate(fiber, _errorInfo, expirationTime);
19563 enqueueUpdate(fiber, _update);
19564 scheduleWork(fiber, expirationTime);
19565 return;
19566 }
19567 }
19568 fiber = fiber.return;
19569 }
19570
19571 if (sourceFiber.tag === HostRoot) {
19572 // Error was thrown at the root. There is no parent, so the root
19573 // itself should capture it.
19574 var rootFiber = sourceFiber;
19575 var _errorInfo2 = createCapturedValue(value, rootFiber);
19576 var _update2 = createRootErrorUpdate(rootFiber, _errorInfo2, expirationTime);
19577 enqueueUpdate(rootFiber, _update2);
19578 scheduleWork(rootFiber, expirationTime);
19579 }
19580}
19581
19582function computeThreadID(expirationTime, interactionThreadID) {
19583 // Interaction threads are unique per root and expiration time.
19584 return expirationTime * 1000 + interactionThreadID;
19585}
19586
19587// Creates a unique async expiration time.
19588function computeUniqueAsyncExpiration() {
19589 var currentTime = requestCurrentTime();
19590 var result = computeAsyncExpiration(currentTime);
19591 if (result >= lastUniqueAsyncExpiration) {
19592 // Since we assume the current time monotonically increases, we only hit
19593 // this branch when computeUniqueAsyncExpiration is fired multiple times
19594 // within a 200ms window (or whatever the async bucket size is).
19595 result = lastUniqueAsyncExpiration - 1;
19596 }
19597 lastUniqueAsyncExpiration = result;
19598 return lastUniqueAsyncExpiration;
19599}
19600
19601function computeExpirationForFiber(currentTime, fiber) {
19602 var priorityLevel = unstable_getCurrentPriorityLevel();
19603
19604 var expirationTime = void 0;
19605 if ((fiber.mode & ConcurrentMode) === NoContext) {
19606 // Outside of concurrent mode, updates are always synchronous.
19607 expirationTime = Sync;
19608 } else if (isWorking && !isCommitting$1) {
19609 // During render phase, updates expire during as the current render.
19610 expirationTime = nextRenderExpirationTime;
19611 } else {
19612 switch (priorityLevel) {
19613 case unstable_ImmediatePriority:
19614 expirationTime = Sync;
19615 break;
19616 case unstable_UserBlockingPriority:
19617 expirationTime = computeInteractiveExpiration(currentTime);
19618 break;
19619 case unstable_NormalPriority:
19620 // This is a normal, concurrent update
19621 expirationTime = computeAsyncExpiration(currentTime);
19622 break;
19623 case unstable_LowPriority:
19624 case unstable_IdlePriority:
19625 expirationTime = Never;
19626 break;
19627 default:
19628 invariant(false, 'Unknown priority level. This error is likely caused by a bug in React. Please file an issue.');
19629 }
19630
19631 // If we're in the middle of rendering a tree, do not update at the same
19632 // expiration time that is already rendering.
19633 if (nextRoot !== null && expirationTime === nextRenderExpirationTime) {
19634 expirationTime -= 1;
19635 }
19636 }
19637
19638 // Keep track of the lowest pending interactive expiration time. This
19639 // allows us to synchronously flush all interactive updates
19640 // when needed.
19641 // TODO: Move this to renderer?
19642 if (priorityLevel === unstable_UserBlockingPriority && (lowestPriorityPendingInteractiveExpirationTime === NoWork || expirationTime < lowestPriorityPendingInteractiveExpirationTime)) {
19643 lowestPriorityPendingInteractiveExpirationTime = expirationTime;
19644 }
19645
19646 return expirationTime;
19647}
19648
19649function renderDidSuspend(root, absoluteTimeoutMs, suspendedTime) {
19650 // Schedule the timeout.
19651 if (absoluteTimeoutMs >= 0 && nextLatestAbsoluteTimeoutMs < absoluteTimeoutMs) {
19652 nextLatestAbsoluteTimeoutMs = absoluteTimeoutMs;
19653 }
19654}
19655
19656function renderDidError() {
19657 nextRenderDidError = true;
19658}
19659
19660function pingSuspendedRoot(root, thenable, pingTime) {
19661 // A promise that previously suspended React from committing has resolved.
19662 // If React is still suspended, try again at the previous level (pingTime).
19663
19664 var pingCache = root.pingCache;
19665 if (pingCache !== null) {
19666 // The thenable resolved, so we no longer need to memoize, because it will
19667 // never be thrown again.
19668 pingCache.delete(thenable);
19669 }
19670
19671 if (nextRoot !== null && nextRenderExpirationTime === pingTime) {
19672 // Received a ping at the same priority level at which we're currently
19673 // rendering. Restart from the root.
19674 nextRoot = null;
19675 } else {
19676 // Confirm that the root is still suspended at this level. Otherwise exit.
19677 if (isPriorityLevelSuspended(root, pingTime)) {
19678 // Ping at the original level
19679 markPingedPriorityLevel(root, pingTime);
19680 var rootExpirationTime = root.expirationTime;
19681 if (rootExpirationTime !== NoWork) {
19682 requestWork(root, rootExpirationTime);
19683 }
19684 }
19685 }
19686}
19687
19688function retryTimedOutBoundary(boundaryFiber, thenable) {
19689 // The boundary fiber (a Suspense component) previously timed out and was
19690 // rendered in its fallback state. One of the promises that suspended it has
19691 // resolved, which means at least part of the tree was likely unblocked. Try
19692 var retryCache = void 0;
19693 if (enableSuspenseServerRenderer) {
19694 switch (boundaryFiber.tag) {
19695 case SuspenseComponent:
19696 retryCache = boundaryFiber.stateNode;
19697 break;
19698 case DehydratedSuspenseComponent:
19699 retryCache = boundaryFiber.memoizedState;
19700 break;
19701 default:
19702 invariant(false, 'Pinged unknown suspense boundary type. This is probably a bug in React.');
19703 }
19704 } else {
19705 retryCache = boundaryFiber.stateNode;
19706 }
19707 if (retryCache !== null) {
19708 // The thenable resolved, so we no longer need to memoize, because it will
19709 // never be thrown again.
19710 retryCache.delete(thenable);
19711 }
19712
19713 var currentTime = requestCurrentTime();
19714 var retryTime = computeExpirationForFiber(currentTime, boundaryFiber);
19715 var root = scheduleWorkToRoot(boundaryFiber, retryTime);
19716 if (root !== null) {
19717 markPendingPriorityLevel(root, retryTime);
19718 var rootExpirationTime = root.expirationTime;
19719 if (rootExpirationTime !== NoWork) {
19720 requestWork(root, rootExpirationTime);
19721 }
19722 }
19723}
19724
19725function scheduleWorkToRoot(fiber, expirationTime) {
19726 recordScheduleUpdate();
19727
19728 {
19729 if (fiber.tag === ClassComponent) {
19730 var instance = fiber.stateNode;
19731 warnAboutInvalidUpdates(instance);
19732 }
19733 }
19734
19735 // Update the source fiber's expiration time
19736 if (fiber.expirationTime < expirationTime) {
19737 fiber.expirationTime = expirationTime;
19738 }
19739 var alternate = fiber.alternate;
19740 if (alternate !== null && alternate.expirationTime < expirationTime) {
19741 alternate.expirationTime = expirationTime;
19742 }
19743 // Walk the parent path to the root and update the child expiration time.
19744 var node = fiber.return;
19745 var root = null;
19746 if (node === null && fiber.tag === HostRoot) {
19747 root = fiber.stateNode;
19748 } else {
19749 while (node !== null) {
19750 alternate = node.alternate;
19751 if (node.childExpirationTime < expirationTime) {
19752 node.childExpirationTime = expirationTime;
19753 if (alternate !== null && alternate.childExpirationTime < expirationTime) {
19754 alternate.childExpirationTime = expirationTime;
19755 }
19756 } else if (alternate !== null && alternate.childExpirationTime < expirationTime) {
19757 alternate.childExpirationTime = expirationTime;
19758 }
19759 if (node.return === null && node.tag === HostRoot) {
19760 root = node.stateNode;
19761 break;
19762 }
19763 node = node.return;
19764 }
19765 }
19766
19767 if (enableSchedulerTracing) {
19768 if (root !== null) {
19769 var interactions = __interactionsRef.current;
19770 if (interactions.size > 0) {
19771 var pendingInteractionMap = root.pendingInteractionMap;
19772 var pendingInteractions = pendingInteractionMap.get(expirationTime);
19773 if (pendingInteractions != null) {
19774 interactions.forEach(function (interaction) {
19775 if (!pendingInteractions.has(interaction)) {
19776 // Update the pending async work count for previously unscheduled interaction.
19777 interaction.__count++;
19778 }
19779
19780 pendingInteractions.add(interaction);
19781 });
19782 } else {
19783 pendingInteractionMap.set(expirationTime, new Set(interactions));
19784
19785 // Update the pending async work count for the current interactions.
19786 interactions.forEach(function (interaction) {
19787 interaction.__count++;
19788 });
19789 }
19790
19791 var subscriber = __subscriberRef.current;
19792 if (subscriber !== null) {
19793 var threadID = computeThreadID(expirationTime, root.interactionThreadID);
19794 subscriber.onWorkScheduled(interactions, threadID);
19795 }
19796 }
19797 }
19798 }
19799 return root;
19800}
19801
19802function warnIfNotCurrentlyBatchingInDev(fiber) {
19803 {
19804 if (isRendering === false && isBatchingUpdates === false) {
19805 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));
19806 }
19807 }
19808}
19809
19810function scheduleWork(fiber, expirationTime) {
19811 var root = scheduleWorkToRoot(fiber, expirationTime);
19812 if (root === null) {
19813 {
19814 switch (fiber.tag) {
19815 case ClassComponent:
19816 warnAboutUpdateOnUnmounted(fiber, true);
19817 break;
19818 case FunctionComponent:
19819 case ForwardRef:
19820 case MemoComponent:
19821 case SimpleMemoComponent:
19822 warnAboutUpdateOnUnmounted(fiber, false);
19823 break;
19824 }
19825 }
19826 return;
19827 }
19828
19829 if (!isWorking && nextRenderExpirationTime !== NoWork && expirationTime > nextRenderExpirationTime) {
19830 // This is an interruption. (Used for performance tracking.)
19831 interruptedBy = fiber;
19832 resetStack();
19833 }
19834 markPendingPriorityLevel(root, expirationTime);
19835 if (
19836 // If we're in the render phase, we don't need to schedule this root
19837 // for an update, because we'll do it before we exit...
19838 !isWorking || isCommitting$1 ||
19839 // ...unless this is a different root than the one we're rendering.
19840 nextRoot !== root) {
19841 var rootExpirationTime = root.expirationTime;
19842 requestWork(root, rootExpirationTime);
19843 }
19844 if (nestedUpdateCount > NESTED_UPDATE_LIMIT) {
19845 // Reset this back to zero so subsequent updates don't throw.
19846 nestedUpdateCount = 0;
19847 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.');
19848 }
19849}
19850
19851function syncUpdates(fn, a, b, c, d) {
19852 return unstable_runWithPriority(unstable_ImmediatePriority, function () {
19853 return fn(a, b, c, d);
19854 });
19855}
19856
19857// TODO: Everything below this is written as if it has been lifted to the
19858// renderers. I'll do this in a follow-up.
19859
19860// Linked-list of roots
19861var firstScheduledRoot = null;
19862var lastScheduledRoot = null;
19863
19864var callbackExpirationTime = NoWork;
19865var callbackID = void 0;
19866var isRendering = false;
19867var nextFlushedRoot = null;
19868var nextFlushedExpirationTime = NoWork;
19869var lowestPriorityPendingInteractiveExpirationTime = NoWork;
19870var hasUnhandledError = false;
19871var unhandledError = null;
19872
19873var isBatchingUpdates = false;
19874var isUnbatchingUpdates = false;
19875
19876var completedBatches = null;
19877
19878var originalStartTimeMs = unstable_now();
19879var currentRendererTime = msToExpirationTime(originalStartTimeMs);
19880var currentSchedulerTime = currentRendererTime;
19881
19882// Use these to prevent an infinite loop of nested updates
19883var NESTED_UPDATE_LIMIT = 50;
19884var nestedUpdateCount = 0;
19885var lastCommittedRootDuringThisBatch = null;
19886
19887function recomputeCurrentRendererTime() {
19888 var currentTimeMs = unstable_now() - originalStartTimeMs;
19889 currentRendererTime = msToExpirationTime(currentTimeMs);
19890}
19891
19892function scheduleCallbackWithExpirationTime(root, expirationTime) {
19893 if (callbackExpirationTime !== NoWork) {
19894 // A callback is already scheduled. Check its expiration time (timeout).
19895 if (expirationTime < callbackExpirationTime) {
19896 // Existing callback has sufficient timeout. Exit.
19897 return;
19898 } else {
19899 if (callbackID !== null) {
19900 // Existing callback has insufficient timeout. Cancel and schedule a
19901 // new one.
19902 unstable_cancelCallback(callbackID);
19903 }
19904 }
19905 // The request callback timer is already running. Don't start a new one.
19906 } else {
19907 startRequestCallbackTimer();
19908 }
19909
19910 callbackExpirationTime = expirationTime;
19911 var currentMs = unstable_now() - originalStartTimeMs;
19912 var expirationTimeMs = expirationTimeToMs(expirationTime);
19913 var timeout = expirationTimeMs - currentMs;
19914 callbackID = unstable_scheduleCallback(performAsyncWork, { timeout: timeout });
19915}
19916
19917// For every call to renderRoot, one of onFatal, onComplete, onSuspend, and
19918// onYield is called upon exiting. We use these in lieu of returning a tuple.
19919// I've also chosen not to inline them into renderRoot because these will
19920// eventually be lifted into the renderer.
19921function onFatal(root) {
19922 root.finishedWork = null;
19923}
19924
19925function onComplete(root, finishedWork, expirationTime) {
19926 root.pendingCommitExpirationTime = expirationTime;
19927 root.finishedWork = finishedWork;
19928}
19929
19930function onSuspend(root, finishedWork, suspendedExpirationTime, rootExpirationTime, msUntilTimeout) {
19931 root.expirationTime = rootExpirationTime;
19932 if (msUntilTimeout === 0 && !shouldYieldToRenderer()) {
19933 // Don't wait an additional tick. Commit the tree immediately.
19934 root.pendingCommitExpirationTime = suspendedExpirationTime;
19935 root.finishedWork = finishedWork;
19936 } else if (msUntilTimeout > 0) {
19937 // Wait `msUntilTimeout` milliseconds before committing.
19938 root.timeoutHandle = scheduleTimeout(onTimeout.bind(null, root, finishedWork, suspendedExpirationTime), msUntilTimeout);
19939 }
19940}
19941
19942function onYield(root) {
19943 root.finishedWork = null;
19944}
19945
19946function onTimeout(root, finishedWork, suspendedExpirationTime) {
19947 // The root timed out. Commit it.
19948 root.pendingCommitExpirationTime = suspendedExpirationTime;
19949 root.finishedWork = finishedWork;
19950 // Read the current time before entering the commit phase. We can be
19951 // certain this won't cause tearing related to batching of event updates
19952 // because we're at the top of a timer event.
19953 recomputeCurrentRendererTime();
19954 currentSchedulerTime = currentRendererTime;
19955 flushRoot(root, suspendedExpirationTime);
19956}
19957
19958function onCommit(root, expirationTime) {
19959 root.expirationTime = expirationTime;
19960 root.finishedWork = null;
19961}
19962
19963function requestCurrentTime() {
19964 // requestCurrentTime is called by the scheduler to compute an expiration
19965 // time.
19966 //
19967 // Expiration times are computed by adding to the current time (the start
19968 // time). However, if two updates are scheduled within the same event, we
19969 // should treat their start times as simultaneous, even if the actual clock
19970 // time has advanced between the first and second call.
19971
19972 // In other words, because expiration times determine how updates are batched,
19973 // we want all updates of like priority that occur within the same event to
19974 // receive the same expiration time. Otherwise we get tearing.
19975 //
19976 // We keep track of two separate times: the current "renderer" time and the
19977 // current "scheduler" time. The renderer time can be updated whenever; it
19978 // only exists to minimize the calls performance.now.
19979 //
19980 // But the scheduler time can only be updated if there's no pending work, or
19981 // if we know for certain that we're not in the middle of an event.
19982
19983 if (isRendering) {
19984 // We're already rendering. Return the most recently read time.
19985 return currentSchedulerTime;
19986 }
19987 // Check if there's pending work.
19988 findHighestPriorityRoot();
19989 if (nextFlushedExpirationTime === NoWork || nextFlushedExpirationTime === Never) {
19990 // If there's no pending work, or if the pending work is offscreen, we can
19991 // read the current time without risk of tearing.
19992 recomputeCurrentRendererTime();
19993 currentSchedulerTime = currentRendererTime;
19994 return currentSchedulerTime;
19995 }
19996 // There's already pending work. We might be in the middle of a browser
19997 // event. If we were to read the current time, it could cause multiple updates
19998 // within the same event to receive different expiration times, leading to
19999 // tearing. Return the last read time. During the next idle callback, the
20000 // time will be updated.
20001 return currentSchedulerTime;
20002}
20003
20004// requestWork is called by the scheduler whenever a root receives an update.
20005// It's up to the renderer to call renderRoot at some point in the future.
20006function requestWork(root, expirationTime) {
20007 addRootToSchedule(root, expirationTime);
20008 if (isRendering) {
20009 // Prevent reentrancy. Remaining work will be scheduled at the end of
20010 // the currently rendering batch.
20011 return;
20012 }
20013
20014 if (isBatchingUpdates) {
20015 // Flush work at the end of the batch.
20016 if (isUnbatchingUpdates) {
20017 // ...unless we're inside unbatchedUpdates, in which case we should
20018 // flush it now.
20019 nextFlushedRoot = root;
20020 nextFlushedExpirationTime = Sync;
20021 performWorkOnRoot(root, Sync, false);
20022 }
20023 return;
20024 }
20025
20026 // TODO: Get rid of Sync and use current time?
20027 if (expirationTime === Sync) {
20028 performSyncWork();
20029 } else {
20030 scheduleCallbackWithExpirationTime(root, expirationTime);
20031 }
20032}
20033
20034function addRootToSchedule(root, expirationTime) {
20035 // Add the root to the schedule.
20036 // Check if this root is already part of the schedule.
20037 if (root.nextScheduledRoot === null) {
20038 // This root is not already scheduled. Add it.
20039 root.expirationTime = expirationTime;
20040 if (lastScheduledRoot === null) {
20041 firstScheduledRoot = lastScheduledRoot = root;
20042 root.nextScheduledRoot = root;
20043 } else {
20044 lastScheduledRoot.nextScheduledRoot = root;
20045 lastScheduledRoot = root;
20046 lastScheduledRoot.nextScheduledRoot = firstScheduledRoot;
20047 }
20048 } else {
20049 // This root is already scheduled, but its priority may have increased.
20050 var remainingExpirationTime = root.expirationTime;
20051 if (expirationTime > remainingExpirationTime) {
20052 // Update the priority.
20053 root.expirationTime = expirationTime;
20054 }
20055 }
20056}
20057
20058function findHighestPriorityRoot() {
20059 var highestPriorityWork = NoWork;
20060 var highestPriorityRoot = null;
20061 if (lastScheduledRoot !== null) {
20062 var previousScheduledRoot = lastScheduledRoot;
20063 var root = firstScheduledRoot;
20064 while (root !== null) {
20065 var remainingExpirationTime = root.expirationTime;
20066 if (remainingExpirationTime === NoWork) {
20067 // This root no longer has work. Remove it from the scheduler.
20068
20069 // TODO: This check is redudant, but Flow is confused by the branch
20070 // below where we set lastScheduledRoot to null, even though we break
20071 // from the loop right after.
20072 !(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;
20073 if (root === root.nextScheduledRoot) {
20074 // This is the only root in the list.
20075 root.nextScheduledRoot = null;
20076 firstScheduledRoot = lastScheduledRoot = null;
20077 break;
20078 } else if (root === firstScheduledRoot) {
20079 // This is the first root in the list.
20080 var next = root.nextScheduledRoot;
20081 firstScheduledRoot = next;
20082 lastScheduledRoot.nextScheduledRoot = next;
20083 root.nextScheduledRoot = null;
20084 } else if (root === lastScheduledRoot) {
20085 // This is the last root in the list.
20086 lastScheduledRoot = previousScheduledRoot;
20087 lastScheduledRoot.nextScheduledRoot = firstScheduledRoot;
20088 root.nextScheduledRoot = null;
20089 break;
20090 } else {
20091 previousScheduledRoot.nextScheduledRoot = root.nextScheduledRoot;
20092 root.nextScheduledRoot = null;
20093 }
20094 root = previousScheduledRoot.nextScheduledRoot;
20095 } else {
20096 if (remainingExpirationTime > highestPriorityWork) {
20097 // Update the priority, if it's higher
20098 highestPriorityWork = remainingExpirationTime;
20099 highestPriorityRoot = root;
20100 }
20101 if (root === lastScheduledRoot) {
20102 break;
20103 }
20104 if (highestPriorityWork === Sync) {
20105 // Sync is highest priority by definition so
20106 // we can stop searching.
20107 break;
20108 }
20109 previousScheduledRoot = root;
20110 root = root.nextScheduledRoot;
20111 }
20112 }
20113 }
20114
20115 nextFlushedRoot = highestPriorityRoot;
20116 nextFlushedExpirationTime = highestPriorityWork;
20117}
20118
20119// TODO: This wrapper exists because many of the older tests (the ones that use
20120// flushDeferredPri) rely on the number of times `shouldYield` is called. We
20121// should get rid of it.
20122var didYield = false;
20123function shouldYieldToRenderer() {
20124 if (didYield) {
20125 return true;
20126 }
20127 if (unstable_shouldYield()) {
20128 didYield = true;
20129 return true;
20130 }
20131 return false;
20132}
20133
20134function performAsyncWork() {
20135 try {
20136 if (!shouldYieldToRenderer()) {
20137 // The callback timed out. That means at least one update has expired.
20138 // Iterate through the root schedule. If they contain expired work, set
20139 // the next render expiration time to the current time. This has the effect
20140 // of flushing all expired work in a single batch, instead of flushing each
20141 // level one at a time.
20142 if (firstScheduledRoot !== null) {
20143 recomputeCurrentRendererTime();
20144 var root = firstScheduledRoot;
20145 do {
20146 didExpireAtExpirationTime(root, currentRendererTime);
20147 // The root schedule is circular, so this is never null.
20148 root = root.nextScheduledRoot;
20149 } while (root !== firstScheduledRoot);
20150 }
20151 }
20152 performWork(NoWork, true);
20153 } finally {
20154 didYield = false;
20155 }
20156}
20157
20158function performSyncWork() {
20159 performWork(Sync, false);
20160}
20161
20162function performWork(minExpirationTime, isYieldy) {
20163 // Keep working on roots until there's no more work, or until there's a higher
20164 // priority event.
20165 findHighestPriorityRoot();
20166
20167 if (isYieldy) {
20168 recomputeCurrentRendererTime();
20169 currentSchedulerTime = currentRendererTime;
20170
20171 if (enableUserTimingAPI) {
20172 var didExpire = nextFlushedExpirationTime > currentRendererTime;
20173 var timeout = expirationTimeToMs(nextFlushedExpirationTime);
20174 stopRequestCallbackTimer(didExpire, timeout);
20175 }
20176
20177 while (nextFlushedRoot !== null && nextFlushedExpirationTime !== NoWork && minExpirationTime <= nextFlushedExpirationTime && !(didYield && currentRendererTime > nextFlushedExpirationTime)) {
20178 performWorkOnRoot(nextFlushedRoot, nextFlushedExpirationTime, currentRendererTime > nextFlushedExpirationTime);
20179 findHighestPriorityRoot();
20180 recomputeCurrentRendererTime();
20181 currentSchedulerTime = currentRendererTime;
20182 }
20183 } else {
20184 while (nextFlushedRoot !== null && nextFlushedExpirationTime !== NoWork && minExpirationTime <= nextFlushedExpirationTime) {
20185 performWorkOnRoot(nextFlushedRoot, nextFlushedExpirationTime, false);
20186 findHighestPriorityRoot();
20187 }
20188 }
20189
20190 // We're done flushing work. Either we ran out of time in this callback,
20191 // or there's no more work left with sufficient priority.
20192
20193 // If we're inside a callback, set this to false since we just completed it.
20194 if (isYieldy) {
20195 callbackExpirationTime = NoWork;
20196 callbackID = null;
20197 }
20198 // If there's work left over, schedule a new callback.
20199 if (nextFlushedExpirationTime !== NoWork) {
20200 scheduleCallbackWithExpirationTime(nextFlushedRoot, nextFlushedExpirationTime);
20201 }
20202
20203 // Clean-up.
20204 finishRendering();
20205}
20206
20207function flushRoot(root, expirationTime) {
20208 !!isRendering ? invariant(false, 'work.commit(): Cannot commit while already rendering. This likely means you attempted to commit from inside a lifecycle method.') : void 0;
20209 // Perform work on root as if the given expiration time is the current time.
20210 // This has the effect of synchronously flushing all work up to and
20211 // including the given time.
20212 nextFlushedRoot = root;
20213 nextFlushedExpirationTime = expirationTime;
20214 performWorkOnRoot(root, expirationTime, false);
20215 // Flush any sync work that was scheduled by lifecycles
20216 performSyncWork();
20217}
20218
20219function finishRendering() {
20220 nestedUpdateCount = 0;
20221 lastCommittedRootDuringThisBatch = null;
20222
20223 if (completedBatches !== null) {
20224 var batches = completedBatches;
20225 completedBatches = null;
20226 for (var i = 0; i < batches.length; i++) {
20227 var batch = batches[i];
20228 try {
20229 batch._onComplete();
20230 } catch (error) {
20231 if (!hasUnhandledError) {
20232 hasUnhandledError = true;
20233 unhandledError = error;
20234 }
20235 }
20236 }
20237 }
20238
20239 if (hasUnhandledError) {
20240 var error = unhandledError;
20241 unhandledError = null;
20242 hasUnhandledError = false;
20243 throw error;
20244 }
20245}
20246
20247function performWorkOnRoot(root, expirationTime, isYieldy) {
20248 !!isRendering ? invariant(false, 'performWorkOnRoot was called recursively. This error is likely caused by a bug in React. Please file an issue.') : void 0;
20249
20250 isRendering = true;
20251
20252 // Check if this is async work or sync/expired work.
20253 if (!isYieldy) {
20254 // Flush work without yielding.
20255 // TODO: Non-yieldy work does not necessarily imply expired work. A renderer
20256 // may want to perform some work without yielding, but also without
20257 // requiring the root to complete (by triggering placeholders).
20258
20259 var finishedWork = root.finishedWork;
20260 if (finishedWork !== null) {
20261 // This root is already complete. We can commit it.
20262 completeRoot(root, finishedWork, expirationTime);
20263 } else {
20264 root.finishedWork = null;
20265 // If this root previously suspended, clear its existing timeout, since
20266 // we're about to try rendering again.
20267 var timeoutHandle = root.timeoutHandle;
20268 if (timeoutHandle !== noTimeout) {
20269 root.timeoutHandle = noTimeout;
20270 // $FlowFixMe Complains noTimeout is not a TimeoutID, despite the check above
20271 cancelTimeout(timeoutHandle);
20272 }
20273 renderRoot(root, isYieldy);
20274 finishedWork = root.finishedWork;
20275 if (finishedWork !== null) {
20276 // We've completed the root. Commit it.
20277 completeRoot(root, finishedWork, expirationTime);
20278 }
20279 }
20280 } else {
20281 // Flush async work.
20282 var _finishedWork = root.finishedWork;
20283 if (_finishedWork !== null) {
20284 // This root is already complete. We can commit it.
20285 completeRoot(root, _finishedWork, expirationTime);
20286 } else {
20287 root.finishedWork = null;
20288 // If this root previously suspended, clear its existing timeout, since
20289 // we're about to try rendering again.
20290 var _timeoutHandle = root.timeoutHandle;
20291 if (_timeoutHandle !== noTimeout) {
20292 root.timeoutHandle = noTimeout;
20293 // $FlowFixMe Complains noTimeout is not a TimeoutID, despite the check above
20294 cancelTimeout(_timeoutHandle);
20295 }
20296 renderRoot(root, isYieldy);
20297 _finishedWork = root.finishedWork;
20298 if (_finishedWork !== null) {
20299 // We've completed the root. Check the if we should yield one more time
20300 // before committing.
20301 if (!shouldYieldToRenderer()) {
20302 // Still time left. Commit the root.
20303 completeRoot(root, _finishedWork, expirationTime);
20304 } else {
20305 // There's no time left. Mark this root as complete. We'll come
20306 // back and commit it later.
20307 root.finishedWork = _finishedWork;
20308 }
20309 }
20310 }
20311 }
20312
20313 isRendering = false;
20314}
20315
20316function completeRoot(root, finishedWork, expirationTime) {
20317 // Check if there's a batch that matches this expiration time.
20318 var firstBatch = root.firstBatch;
20319 if (firstBatch !== null && firstBatch._expirationTime >= expirationTime) {
20320 if (completedBatches === null) {
20321 completedBatches = [firstBatch];
20322 } else {
20323 completedBatches.push(firstBatch);
20324 }
20325 if (firstBatch._defer) {
20326 // This root is blocked from committing by a batch. Unschedule it until
20327 // we receive another update.
20328 root.finishedWork = finishedWork;
20329 root.expirationTime = NoWork;
20330 return;
20331 }
20332 }
20333
20334 // Commit the root.
20335 root.finishedWork = null;
20336
20337 // Check if this is a nested update (a sync update scheduled during the
20338 // commit phase).
20339 if (root === lastCommittedRootDuringThisBatch) {
20340 // If the next root is the same as the previous root, this is a nested
20341 // update. To prevent an infinite loop, increment the nested update count.
20342 nestedUpdateCount++;
20343 } else {
20344 // Reset whenever we switch roots.
20345 lastCommittedRootDuringThisBatch = root;
20346 nestedUpdateCount = 0;
20347 }
20348 unstable_runWithPriority(unstable_ImmediatePriority, function () {
20349 commitRoot(root, finishedWork);
20350 });
20351}
20352
20353function onUncaughtError(error) {
20354 !(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;
20355 // Unschedule this root so we don't work on it again until there's
20356 // another update.
20357 nextFlushedRoot.expirationTime = NoWork;
20358 if (!hasUnhandledError) {
20359 hasUnhandledError = true;
20360 unhandledError = error;
20361 }
20362}
20363
20364// TODO: Batching should be implemented at the renderer level, not inside
20365// the reconciler.
20366function batchedUpdates$1(fn, a) {
20367 var previousIsBatchingUpdates = isBatchingUpdates;
20368 isBatchingUpdates = true;
20369 try {
20370 return fn(a);
20371 } finally {
20372 isBatchingUpdates = previousIsBatchingUpdates;
20373 if (!isBatchingUpdates && !isRendering) {
20374 performSyncWork();
20375 }
20376 }
20377}
20378
20379// TODO: Batching should be implemented at the renderer level, not inside
20380// the reconciler.
20381function unbatchedUpdates(fn, a) {
20382 if (isBatchingUpdates && !isUnbatchingUpdates) {
20383 isUnbatchingUpdates = true;
20384 try {
20385 return fn(a);
20386 } finally {
20387 isUnbatchingUpdates = false;
20388 }
20389 }
20390 return fn(a);
20391}
20392
20393// TODO: Batching should be implemented at the renderer level, not within
20394// the reconciler.
20395function flushSync(fn, a) {
20396 !!isRendering ? invariant(false, 'flushSync was called from inside a lifecycle method. It cannot be called when React is already rendering.') : void 0;
20397 var previousIsBatchingUpdates = isBatchingUpdates;
20398 isBatchingUpdates = true;
20399 try {
20400 return syncUpdates(fn, a);
20401 } finally {
20402 isBatchingUpdates = previousIsBatchingUpdates;
20403 performSyncWork();
20404 }
20405}
20406
20407function interactiveUpdates$1(fn, a, b) {
20408 // If there are any pending interactive updates, synchronously flush them.
20409 // This needs to happen before we read any handlers, because the effect of
20410 // the previous event may influence which handlers are called during
20411 // this event.
20412 if (!isBatchingUpdates && !isRendering && lowestPriorityPendingInteractiveExpirationTime !== NoWork) {
20413 // Synchronously flush pending interactive updates.
20414 performWork(lowestPriorityPendingInteractiveExpirationTime, false);
20415 lowestPriorityPendingInteractiveExpirationTime = NoWork;
20416 }
20417 var previousIsBatchingUpdates = isBatchingUpdates;
20418 isBatchingUpdates = true;
20419 try {
20420 return unstable_runWithPriority(unstable_UserBlockingPriority, function () {
20421 return fn(a, b);
20422 });
20423 } finally {
20424 isBatchingUpdates = previousIsBatchingUpdates;
20425 if (!isBatchingUpdates && !isRendering) {
20426 performSyncWork();
20427 }
20428 }
20429}
20430
20431function flushInteractiveUpdates$1() {
20432 if (!isRendering && lowestPriorityPendingInteractiveExpirationTime !== NoWork) {
20433 // Synchronously flush pending interactive updates.
20434 performWork(lowestPriorityPendingInteractiveExpirationTime, false);
20435 lowestPriorityPendingInteractiveExpirationTime = NoWork;
20436 }
20437}
20438
20439function flushControlled(fn) {
20440 var previousIsBatchingUpdates = isBatchingUpdates;
20441 isBatchingUpdates = true;
20442 try {
20443 syncUpdates(fn);
20444 } finally {
20445 isBatchingUpdates = previousIsBatchingUpdates;
20446 if (!isBatchingUpdates && !isRendering) {
20447 performSyncWork();
20448 }
20449 }
20450}
20451
20452// 0 is PROD, 1 is DEV.
20453// Might add PROFILE later.
20454
20455
20456var didWarnAboutNestedUpdates = void 0;
20457var didWarnAboutFindNodeInStrictMode = void 0;
20458
20459{
20460 didWarnAboutNestedUpdates = false;
20461 didWarnAboutFindNodeInStrictMode = {};
20462}
20463
20464function getContextForSubtree(parentComponent) {
20465 if (!parentComponent) {
20466 return emptyContextObject;
20467 }
20468
20469 var fiber = get(parentComponent);
20470 var parentContext = findCurrentUnmaskedContext(fiber);
20471
20472 if (fiber.tag === ClassComponent) {
20473 var Component = fiber.type;
20474 if (isContextProvider(Component)) {
20475 return processChildContext(fiber, Component, parentContext);
20476 }
20477 }
20478
20479 return parentContext;
20480}
20481
20482function scheduleRootUpdate(current$$1, element, expirationTime, callback) {
20483 {
20484 if (phase === 'render' && current !== null && !didWarnAboutNestedUpdates) {
20485 didWarnAboutNestedUpdates = true;
20486 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');
20487 }
20488 }
20489
20490 var update = createUpdate(expirationTime);
20491 // Caution: React DevTools currently depends on this property
20492 // being called "element".
20493 update.payload = { element: element };
20494
20495 callback = callback === undefined ? null : callback;
20496 if (callback !== null) {
20497 !(typeof callback === 'function') ? warningWithoutStack$1(false, 'render(...): Expected the last optional `callback` argument to be a ' + 'function. Instead received: %s.', callback) : void 0;
20498 update.callback = callback;
20499 }
20500
20501 flushPassiveEffects();
20502 enqueueUpdate(current$$1, update);
20503 scheduleWork(current$$1, expirationTime);
20504
20505 return expirationTime;
20506}
20507
20508function updateContainerAtExpirationTime(element, container, parentComponent, expirationTime, callback) {
20509 // TODO: If this is a nested container, this won't be the root.
20510 var current$$1 = container.current;
20511
20512 {
20513 if (ReactFiberInstrumentation_1.debugTool) {
20514 if (current$$1.alternate === null) {
20515 ReactFiberInstrumentation_1.debugTool.onMountContainer(container);
20516 } else if (element === null) {
20517 ReactFiberInstrumentation_1.debugTool.onUnmountContainer(container);
20518 } else {
20519 ReactFiberInstrumentation_1.debugTool.onUpdateContainer(container);
20520 }
20521 }
20522 }
20523
20524 var context = getContextForSubtree(parentComponent);
20525 if (container.context === null) {
20526 container.context = context;
20527 } else {
20528 container.pendingContext = context;
20529 }
20530
20531 return scheduleRootUpdate(current$$1, element, expirationTime, callback);
20532}
20533
20534function findHostInstance(component) {
20535 var fiber = get(component);
20536 if (fiber === undefined) {
20537 if (typeof component.render === 'function') {
20538 invariant(false, 'Unable to find node on an unmounted component.');
20539 } else {
20540 invariant(false, 'Argument appears to not be a ReactComponent. Keys: %s', Object.keys(component));
20541 }
20542 }
20543 var hostFiber = findCurrentHostFiber(fiber);
20544 if (hostFiber === null) {
20545 return null;
20546 }
20547 return hostFiber.stateNode;
20548}
20549
20550function findHostInstanceWithWarning(component, methodName) {
20551 {
20552 var fiber = get(component);
20553 if (fiber === undefined) {
20554 if (typeof component.render === 'function') {
20555 invariant(false, 'Unable to find node on an unmounted component.');
20556 } else {
20557 invariant(false, 'Argument appears to not be a ReactComponent. Keys: %s', Object.keys(component));
20558 }
20559 }
20560 var hostFiber = findCurrentHostFiber(fiber);
20561 if (hostFiber === null) {
20562 return null;
20563 }
20564 if (hostFiber.mode & StrictMode) {
20565 var componentName = getComponentName(fiber.type) || 'Component';
20566 if (!didWarnAboutFindNodeInStrictMode[componentName]) {
20567 didWarnAboutFindNodeInStrictMode[componentName] = true;
20568 if (fiber.mode & StrictMode) {
20569 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));
20570 } else {
20571 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));
20572 }
20573 }
20574 }
20575 return hostFiber.stateNode;
20576 }
20577 return findHostInstance(component);
20578}
20579
20580function createContainer(containerInfo, isConcurrent, hydrate) {
20581 return createFiberRoot(containerInfo, isConcurrent, hydrate);
20582}
20583
20584function updateContainer(element, container, parentComponent, callback) {
20585 var current$$1 = container.current;
20586 var currentTime = requestCurrentTime();
20587 var expirationTime = computeExpirationForFiber(currentTime, current$$1);
20588 return updateContainerAtExpirationTime(element, container, parentComponent, expirationTime, callback);
20589}
20590
20591function getPublicRootInstance(container) {
20592 var containerFiber = container.current;
20593 if (!containerFiber.child) {
20594 return null;
20595 }
20596 switch (containerFiber.child.tag) {
20597 case HostComponent:
20598 return getPublicInstance(containerFiber.child.stateNode);
20599 default:
20600 return containerFiber.child.stateNode;
20601 }
20602}
20603
20604function findHostInstanceWithNoPortals(fiber) {
20605 var hostFiber = findCurrentHostFiberWithNoPortals(fiber);
20606 if (hostFiber === null) {
20607 return null;
20608 }
20609 return hostFiber.stateNode;
20610}
20611
20612var overrideProps = null;
20613
20614{
20615 var copyWithSetImpl = function (obj, path, idx, value) {
20616 if (idx >= path.length) {
20617 return value;
20618 }
20619 var key = path[idx];
20620 var updated = Array.isArray(obj) ? obj.slice() : _assign({}, obj);
20621 // $FlowFixMe number or string is fine here
20622 updated[key] = copyWithSetImpl(obj[key], path, idx + 1, value);
20623 return updated;
20624 };
20625
20626 var copyWithSet = function (obj, path, value) {
20627 return copyWithSetImpl(obj, path, 0, value);
20628 };
20629
20630 // Support DevTools props for function components, forwardRef, memo, host components, etc.
20631 overrideProps = function (fiber, path, value) {
20632 flushPassiveEffects();
20633 fiber.pendingProps = copyWithSet(fiber.memoizedProps, path, value);
20634 if (fiber.alternate) {
20635 fiber.alternate.pendingProps = fiber.pendingProps;
20636 }
20637 scheduleWork(fiber, Sync);
20638 };
20639}
20640
20641function injectIntoDevTools(devToolsConfig) {
20642 var findFiberByHostInstance = devToolsConfig.findFiberByHostInstance;
20643 var ReactCurrentDispatcher = ReactSharedInternals.ReactCurrentDispatcher;
20644
20645
20646 return injectInternals(_assign({}, devToolsConfig, {
20647 overrideProps: overrideProps,
20648 currentDispatcherRef: ReactCurrentDispatcher,
20649 findHostInstanceByFiber: function (fiber) {
20650 var hostFiber = findCurrentHostFiber(fiber);
20651 if (hostFiber === null) {
20652 return null;
20653 }
20654 return hostFiber.stateNode;
20655 },
20656 findFiberByHostInstance: function (instance) {
20657 if (!findFiberByHostInstance) {
20658 // Might not be implemented by the renderer.
20659 return null;
20660 }
20661 return findFiberByHostInstance(instance);
20662 }
20663 }));
20664}
20665
20666// This file intentionally does *not* have the Flow annotation.
20667// Don't add it. See `./inline-typed.js` for an explanation.
20668
20669function createPortal$1(children, containerInfo,
20670// TODO: figure out the API for cross-renderer implementation.
20671implementation) {
20672 var key = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : null;
20673
20674 return {
20675 // This tag allow us to uniquely identify this as a React Portal
20676 $$typeof: REACT_PORTAL_TYPE,
20677 key: key == null ? null : '' + key,
20678 children: children,
20679 containerInfo: containerInfo,
20680 implementation: implementation
20681 };
20682}
20683
20684// TODO: this is special because it gets imported during build.
20685
20686var ReactVersion = '16.8.3';
20687
20688// TODO: This type is shared between the reconciler and ReactDOM, but will
20689// eventually be lifted out to the renderer.
20690
20691var ReactCurrentOwner = ReactSharedInternals.ReactCurrentOwner;
20692
20693var topLevelUpdateWarnings = void 0;
20694var warnOnInvalidCallback = void 0;
20695var didWarnAboutUnstableCreatePortal = false;
20696
20697{
20698 if (typeof Map !== 'function' ||
20699 // $FlowIssue Flow incorrectly thinks Map has no prototype
20700 Map.prototype == null || typeof Map.prototype.forEach !== 'function' || typeof Set !== 'function' ||
20701 // $FlowIssue Flow incorrectly thinks Set has no prototype
20702 Set.prototype == null || typeof Set.prototype.clear !== 'function' || typeof Set.prototype.forEach !== 'function') {
20703 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');
20704 }
20705
20706 topLevelUpdateWarnings = function (container) {
20707 if (container._reactRootContainer && container.nodeType !== COMMENT_NODE) {
20708 var hostInstance = findHostInstanceWithNoPortals(container._reactRootContainer._internalRoot.current);
20709 if (hostInstance) {
20710 !(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;
20711 }
20712 }
20713
20714 var isRootRenderedBySomeReact = !!container._reactRootContainer;
20715 var rootEl = getReactRootElementInContainer(container);
20716 var hasNonRootReactChild = !!(rootEl && getInstanceFromNode$1(rootEl));
20717
20718 !(!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;
20719
20720 !(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;
20721 };
20722
20723 warnOnInvalidCallback = function (callback, callerName) {
20724 !(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;
20725 };
20726}
20727
20728setRestoreImplementation(restoreControlledState$1);
20729
20730function ReactBatch(root) {
20731 var expirationTime = computeUniqueAsyncExpiration();
20732 this._expirationTime = expirationTime;
20733 this._root = root;
20734 this._next = null;
20735 this._callbacks = null;
20736 this._didComplete = false;
20737 this._hasChildren = false;
20738 this._children = null;
20739 this._defer = true;
20740}
20741ReactBatch.prototype.render = function (children) {
20742 !this._defer ? invariant(false, 'batch.render: Cannot render a batch that already committed.') : void 0;
20743 this._hasChildren = true;
20744 this._children = children;
20745 var internalRoot = this._root._internalRoot;
20746 var expirationTime = this._expirationTime;
20747 var work = new ReactWork();
20748 updateContainerAtExpirationTime(children, internalRoot, null, expirationTime, work._onCommit);
20749 return work;
20750};
20751ReactBatch.prototype.then = function (onComplete) {
20752 if (this._didComplete) {
20753 onComplete();
20754 return;
20755 }
20756 var callbacks = this._callbacks;
20757 if (callbacks === null) {
20758 callbacks = this._callbacks = [];
20759 }
20760 callbacks.push(onComplete);
20761};
20762ReactBatch.prototype.commit = function () {
20763 var internalRoot = this._root._internalRoot;
20764 var firstBatch = internalRoot.firstBatch;
20765 !(this._defer && firstBatch !== null) ? invariant(false, 'batch.commit: Cannot commit a batch multiple times.') : void 0;
20766
20767 if (!this._hasChildren) {
20768 // This batch is empty. Return.
20769 this._next = null;
20770 this._defer = false;
20771 return;
20772 }
20773
20774 var expirationTime = this._expirationTime;
20775
20776 // Ensure this is the first batch in the list.
20777 if (firstBatch !== this) {
20778 // This batch is not the earliest batch. We need to move it to the front.
20779 // Update its expiration time to be the expiration time of the earliest
20780 // batch, so that we can flush it without flushing the other batches.
20781 if (this._hasChildren) {
20782 expirationTime = this._expirationTime = firstBatch._expirationTime;
20783 // Rendering this batch again ensures its children will be the final state
20784 // when we flush (updates are processed in insertion order: last
20785 // update wins).
20786 // TODO: This forces a restart. Should we print a warning?
20787 this.render(this._children);
20788 }
20789
20790 // Remove the batch from the list.
20791 var previous = null;
20792 var batch = firstBatch;
20793 while (batch !== this) {
20794 previous = batch;
20795 batch = batch._next;
20796 }
20797 !(previous !== null) ? invariant(false, 'batch.commit: Cannot commit a batch multiple times.') : void 0;
20798 previous._next = batch._next;
20799
20800 // Add it to the front.
20801 this._next = firstBatch;
20802 firstBatch = internalRoot.firstBatch = this;
20803 }
20804
20805 // Synchronously flush all the work up to this batch's expiration time.
20806 this._defer = false;
20807 flushRoot(internalRoot, expirationTime);
20808
20809 // Pop the batch from the list.
20810 var next = this._next;
20811 this._next = null;
20812 firstBatch = internalRoot.firstBatch = next;
20813
20814 // Append the next earliest batch's children to the update queue.
20815 if (firstBatch !== null && firstBatch._hasChildren) {
20816 firstBatch.render(firstBatch._children);
20817 }
20818};
20819ReactBatch.prototype._onComplete = function () {
20820 if (this._didComplete) {
20821 return;
20822 }
20823 this._didComplete = true;
20824 var callbacks = this._callbacks;
20825 if (callbacks === null) {
20826 return;
20827 }
20828 // TODO: Error handling.
20829 for (var i = 0; i < callbacks.length; i++) {
20830 var _callback = callbacks[i];
20831 _callback();
20832 }
20833};
20834
20835function ReactWork() {
20836 this._callbacks = null;
20837 this._didCommit = false;
20838 // TODO: Avoid need to bind by replacing callbacks in the update queue with
20839 // list of Work objects.
20840 this._onCommit = this._onCommit.bind(this);
20841}
20842ReactWork.prototype.then = function (onCommit) {
20843 if (this._didCommit) {
20844 onCommit();
20845 return;
20846 }
20847 var callbacks = this._callbacks;
20848 if (callbacks === null) {
20849 callbacks = this._callbacks = [];
20850 }
20851 callbacks.push(onCommit);
20852};
20853ReactWork.prototype._onCommit = function () {
20854 if (this._didCommit) {
20855 return;
20856 }
20857 this._didCommit = true;
20858 var callbacks = this._callbacks;
20859 if (callbacks === null) {
20860 return;
20861 }
20862 // TODO: Error handling.
20863 for (var i = 0; i < callbacks.length; i++) {
20864 var _callback2 = callbacks[i];
20865 !(typeof _callback2 === 'function') ? invariant(false, 'Invalid argument passed as callback. Expected a function. Instead received: %s', _callback2) : void 0;
20866 _callback2();
20867 }
20868};
20869
20870function ReactRoot(container, isConcurrent, hydrate) {
20871 var root = createContainer(container, isConcurrent, hydrate);
20872 this._internalRoot = root;
20873}
20874ReactRoot.prototype.render = function (children, callback) {
20875 var root = this._internalRoot;
20876 var work = new ReactWork();
20877 callback = callback === undefined ? null : callback;
20878 {
20879 warnOnInvalidCallback(callback, 'render');
20880 }
20881 if (callback !== null) {
20882 work.then(callback);
20883 }
20884 updateContainer(children, root, null, work._onCommit);
20885 return work;
20886};
20887ReactRoot.prototype.unmount = function (callback) {
20888 var root = this._internalRoot;
20889 var work = new ReactWork();
20890 callback = callback === undefined ? null : callback;
20891 {
20892 warnOnInvalidCallback(callback, 'render');
20893 }
20894 if (callback !== null) {
20895 work.then(callback);
20896 }
20897 updateContainer(null, root, null, work._onCommit);
20898 return work;
20899};
20900ReactRoot.prototype.legacy_renderSubtreeIntoContainer = function (parentComponent, children, callback) {
20901 var root = this._internalRoot;
20902 var work = new ReactWork();
20903 callback = callback === undefined ? null : callback;
20904 {
20905 warnOnInvalidCallback(callback, 'render');
20906 }
20907 if (callback !== null) {
20908 work.then(callback);
20909 }
20910 updateContainer(children, root, parentComponent, work._onCommit);
20911 return work;
20912};
20913ReactRoot.prototype.createBatch = function () {
20914 var batch = new ReactBatch(this);
20915 var expirationTime = batch._expirationTime;
20916
20917 var internalRoot = this._internalRoot;
20918 var firstBatch = internalRoot.firstBatch;
20919 if (firstBatch === null) {
20920 internalRoot.firstBatch = batch;
20921 batch._next = null;
20922 } else {
20923 // Insert sorted by expiration time then insertion order
20924 var insertAfter = null;
20925 var insertBefore = firstBatch;
20926 while (insertBefore !== null && insertBefore._expirationTime >= expirationTime) {
20927 insertAfter = insertBefore;
20928 insertBefore = insertBefore._next;
20929 }
20930 batch._next = insertBefore;
20931 if (insertAfter !== null) {
20932 insertAfter._next = batch;
20933 }
20934 }
20935
20936 return batch;
20937};
20938
20939/**
20940 * True if the supplied DOM node is a valid node element.
20941 *
20942 * @param {?DOMElement} node The candidate DOM node.
20943 * @return {boolean} True if the DOM is a valid DOM node.
20944 * @internal
20945 */
20946function isValidContainer(node) {
20947 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 '));
20948}
20949
20950function getReactRootElementInContainer(container) {
20951 if (!container) {
20952 return null;
20953 }
20954
20955 if (container.nodeType === DOCUMENT_NODE) {
20956 return container.documentElement;
20957 } else {
20958 return container.firstChild;
20959 }
20960}
20961
20962function shouldHydrateDueToLegacyHeuristic(container) {
20963 var rootElement = getReactRootElementInContainer(container);
20964 return !!(rootElement && rootElement.nodeType === ELEMENT_NODE && rootElement.hasAttribute(ROOT_ATTRIBUTE_NAME));
20965}
20966
20967setBatchingImplementation(batchedUpdates$1, interactiveUpdates$1, flushInteractiveUpdates$1);
20968
20969var warnedAboutHydrateAPI = false;
20970
20971function legacyCreateRootFromDOMContainer(container, forceHydrate) {
20972 var shouldHydrate = forceHydrate || shouldHydrateDueToLegacyHeuristic(container);
20973 // First clear any existing content.
20974 if (!shouldHydrate) {
20975 var warned = false;
20976 var rootSibling = void 0;
20977 while (rootSibling = container.lastChild) {
20978 {
20979 if (!warned && rootSibling.nodeType === ELEMENT_NODE && rootSibling.hasAttribute(ROOT_ATTRIBUTE_NAME)) {
20980 warned = true;
20981 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.');
20982 }
20983 }
20984 container.removeChild(rootSibling);
20985 }
20986 }
20987 {
20988 if (shouldHydrate && !forceHydrate && !warnedAboutHydrateAPI) {
20989 warnedAboutHydrateAPI = true;
20990 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.');
20991 }
20992 }
20993 // Legacy roots are not async by default.
20994 var isConcurrent = false;
20995 return new ReactRoot(container, isConcurrent, shouldHydrate);
20996}
20997
20998function legacyRenderSubtreeIntoContainer(parentComponent, children, container, forceHydrate, callback) {
20999 {
21000 topLevelUpdateWarnings(container);
21001 }
21002
21003 // TODO: Without `any` type, Flow says "Property cannot be accessed on any
21004 // member of intersection type." Whyyyyyy.
21005 var root = container._reactRootContainer;
21006 if (!root) {
21007 // Initial mount
21008 root = container._reactRootContainer = legacyCreateRootFromDOMContainer(container, forceHydrate);
21009 if (typeof callback === 'function') {
21010 var originalCallback = callback;
21011 callback = function () {
21012 var instance = getPublicRootInstance(root._internalRoot);
21013 originalCallback.call(instance);
21014 };
21015 }
21016 // Initial mount should not be batched.
21017 unbatchedUpdates(function () {
21018 if (parentComponent != null) {
21019 root.legacy_renderSubtreeIntoContainer(parentComponent, children, callback);
21020 } else {
21021 root.render(children, callback);
21022 }
21023 });
21024 } else {
21025 if (typeof callback === 'function') {
21026 var _originalCallback = callback;
21027 callback = function () {
21028 var instance = getPublicRootInstance(root._internalRoot);
21029 _originalCallback.call(instance);
21030 };
21031 }
21032 // Update
21033 if (parentComponent != null) {
21034 root.legacy_renderSubtreeIntoContainer(parentComponent, children, callback);
21035 } else {
21036 root.render(children, callback);
21037 }
21038 }
21039 return getPublicRootInstance(root._internalRoot);
21040}
21041
21042function createPortal$$1(children, container) {
21043 var key = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : null;
21044
21045 !isValidContainer(container) ? invariant(false, 'Target container is not a DOM element.') : void 0;
21046 // TODO: pass ReactDOM portal implementation as third argument
21047 return createPortal$1(children, container, null, key);
21048}
21049
21050var ReactDOM = {
21051 createPortal: createPortal$$1,
21052
21053 findDOMNode: function (componentOrElement) {
21054 {
21055 var owner = ReactCurrentOwner.current;
21056 if (owner !== null && owner.stateNode !== null) {
21057 var warnedAboutRefsInRender = owner.stateNode._warnedAboutRefsInRender;
21058 !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;
21059 owner.stateNode._warnedAboutRefsInRender = true;
21060 }
21061 }
21062 if (componentOrElement == null) {
21063 return null;
21064 }
21065 if (componentOrElement.nodeType === ELEMENT_NODE) {
21066 return componentOrElement;
21067 }
21068 {
21069 return findHostInstanceWithWarning(componentOrElement, 'findDOMNode');
21070 }
21071 return findHostInstance(componentOrElement);
21072 },
21073 hydrate: function (element, container, callback) {
21074 !isValidContainer(container) ? invariant(false, 'Target container is not a DOM element.') : void 0;
21075 {
21076 !!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;
21077 }
21078 // TODO: throw or warn if we couldn't hydrate?
21079 return legacyRenderSubtreeIntoContainer(null, element, container, true, callback);
21080 },
21081 render: function (element, container, callback) {
21082 !isValidContainer(container) ? invariant(false, 'Target container is not a DOM element.') : void 0;
21083 {
21084 !!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;
21085 }
21086 return legacyRenderSubtreeIntoContainer(null, element, container, false, callback);
21087 },
21088 unstable_renderSubtreeIntoContainer: function (parentComponent, element, containerNode, callback) {
21089 !isValidContainer(containerNode) ? invariant(false, 'Target container is not a DOM element.') : void 0;
21090 !(parentComponent != null && has(parentComponent)) ? invariant(false, 'parentComponent must be a valid React Component') : void 0;
21091 return legacyRenderSubtreeIntoContainer(parentComponent, element, containerNode, false, callback);
21092 },
21093 unmountComponentAtNode: function (container) {
21094 !isValidContainer(container) ? invariant(false, 'unmountComponentAtNode(...): Target container is not a DOM element.') : void 0;
21095
21096 {
21097 !!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;
21098 }
21099
21100 if (container._reactRootContainer) {
21101 {
21102 var rootEl = getReactRootElementInContainer(container);
21103 var renderedByDifferentReact = rootEl && !getInstanceFromNode$1(rootEl);
21104 !!renderedByDifferentReact ? warningWithoutStack$1(false, "unmountComponentAtNode(): The node you're attempting to unmount " + 'was rendered by another copy of React.') : void 0;
21105 }
21106
21107 // Unmount should not be batched.
21108 unbatchedUpdates(function () {
21109 legacyRenderSubtreeIntoContainer(null, null, container, false, function () {
21110 container._reactRootContainer = null;
21111 });
21112 });
21113 // If you call unmountComponentAtNode twice in quick succession, you'll
21114 // get `true` twice. That's probably fine?
21115 return true;
21116 } else {
21117 {
21118 var _rootEl = getReactRootElementInContainer(container);
21119 var hasNonRootReactChild = !!(_rootEl && getInstanceFromNode$1(_rootEl));
21120
21121 // Check if the container itself is a React root node.
21122 var isContainerReactRoot = container.nodeType === ELEMENT_NODE && isValidContainer(container.parentNode) && !!container.parentNode._reactRootContainer;
21123
21124 !!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;
21125 }
21126
21127 return false;
21128 }
21129 },
21130
21131
21132 // Temporary alias since we already shipped React 16 RC with it.
21133 // TODO: remove in React 17.
21134 unstable_createPortal: function () {
21135 if (!didWarnAboutUnstableCreatePortal) {
21136 didWarnAboutUnstableCreatePortal = true;
21137 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.');
21138 }
21139 return createPortal$$1.apply(undefined, arguments);
21140 },
21141
21142
21143 unstable_batchedUpdates: batchedUpdates$1,
21144
21145 unstable_interactiveUpdates: interactiveUpdates$1,
21146
21147 flushSync: flushSync,
21148
21149 unstable_createRoot: createRoot,
21150 unstable_flushControlled: flushControlled,
21151
21152 __SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED: {
21153 // Keep in sync with ReactDOMUnstableNativeDependencies.js
21154 // and ReactTestUtils.js. This is an array for better minification.
21155 Events: [getInstanceFromNode$1, getNodeFromInstance$1, getFiberCurrentPropsFromNode$1, injection.injectEventPluginsByName, eventNameDispatchConfigs, accumulateTwoPhaseDispatches, accumulateDirectDispatches, enqueueStateRestore, restoreStateIfNeeded, dispatchEvent, runEventsInBatch]
21156 }
21157};
21158
21159function createRoot(container, options) {
21160 var functionName = enableStableConcurrentModeAPIs ? 'createRoot' : 'unstable_createRoot';
21161 !isValidContainer(container) ? invariant(false, '%s(...): Target container is not a DOM element.', functionName) : void 0;
21162 {
21163 !!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;
21164 container._reactHasBeenPassedToCreateRootDEV = true;
21165 }
21166 var hydrate = options != null && options.hydrate === true;
21167 return new ReactRoot(container, true, hydrate);
21168}
21169
21170if (enableStableConcurrentModeAPIs) {
21171 ReactDOM.createRoot = createRoot;
21172 ReactDOM.unstable_createRoot = undefined;
21173}
21174
21175var foundDevTools = injectIntoDevTools({
21176 findFiberByHostInstance: getClosestInstanceFromNode,
21177 bundleType: 1,
21178 version: ReactVersion,
21179 rendererPackageName: 'react-dom'
21180});
21181
21182{
21183 if (!foundDevTools && canUseDOM && window.top === window.self) {
21184 // If we're in Chrome or Firefox, provide a download link if not installed.
21185 if (navigator.userAgent.indexOf('Chrome') > -1 && navigator.userAgent.indexOf('Edge') === -1 || navigator.userAgent.indexOf('Firefox') > -1) {
21186 var protocol = window.location.protocol;
21187 // Don't warn in exotic cases like chrome-extension://.
21188 if (/^(https?|file):$/.test(protocol)) {
21189 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');
21190 }
21191 }
21192 }
21193}
21194
21195
21196
21197var ReactDOM$2 = Object.freeze({
21198 default: ReactDOM
21199});
21200
21201var ReactDOM$3 = ( ReactDOM$2 && ReactDOM ) || ReactDOM$2;
21202
21203// TODO: decide on the top-level export form.
21204// This is hacky but makes it work with both Rollup and Jest.
21205var reactDom = ReactDOM$3.default || ReactDOM$3;
21206
21207return reactDom;
21208
21209})));