UNPKG

140 kBJavaScriptView Raw
1/** @license React v16.13.1
2 * react-dom-server.browser.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 = global || self, global.ReactDOMServer = factory(global.React));
16}(this, (function (React) { 'use strict';
17
18 // Do not require this module directly! Use normal `invariant` calls with
19 // template literal strings. The messages will be replaced with error codes
20 // during build.
21 function formatProdErrorMessage(code) {
22 var url = 'https://reactjs.org/docs/error-decoder.html?invariant=' + code;
23
24 for (var i = 1; i < arguments.length; i++) {
25 url += '&args[]=' + encodeURIComponent(arguments[i]);
26 }
27
28 return "Minified React error #" + code + "; visit " + url + " for the full message or " + 'use the non-minified dev environment for full errors and additional ' + 'helpful warnings.';
29 }
30
31 var ReactVersion = '16.13.1';
32
33 var ReactSharedInternals = React.__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED; // Prevent newer renderers from RTE when used with older react package versions.
34 // Current owner and dispatcher used to share the same ref,
35 // but PR #14548 split them out to better support the react-debug-tools package.
36
37 if (!ReactSharedInternals.hasOwnProperty('ReactCurrentDispatcher')) {
38 ReactSharedInternals.ReactCurrentDispatcher = {
39 current: null
40 };
41 }
42
43 if (!ReactSharedInternals.hasOwnProperty('ReactCurrentBatchConfig')) {
44 ReactSharedInternals.ReactCurrentBatchConfig = {
45 suspense: null
46 };
47 }
48
49 // by calls to these methods by a Babel plugin.
50 //
51 // In PROD (or in packages without access to React internals),
52 // they are left as they are instead.
53
54 function warn(format) {
55 {
56 for (var _len = arguments.length, args = new Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) {
57 args[_key - 1] = arguments[_key];
58 }
59
60 printWarning('warn', format, args);
61 }
62 }
63 function error(format) {
64 {
65 for (var _len2 = arguments.length, args = new Array(_len2 > 1 ? _len2 - 1 : 0), _key2 = 1; _key2 < _len2; _key2++) {
66 args[_key2 - 1] = arguments[_key2];
67 }
68
69 printWarning('error', format, args);
70 }
71 }
72
73 function printWarning(level, format, args) {
74 // When changing this logic, you might want to also
75 // update consoleWithStackDev.www.js as well.
76 {
77 var hasExistingStack = args.length > 0 && typeof args[args.length - 1] === 'string' && args[args.length - 1].indexOf('\n in') === 0;
78
79 if (!hasExistingStack) {
80 var ReactDebugCurrentFrame = ReactSharedInternals.ReactDebugCurrentFrame;
81 var stack = ReactDebugCurrentFrame.getStackAddendum();
82
83 if (stack !== '') {
84 format += '%s';
85 args = args.concat([stack]);
86 }
87 }
88
89 var argsWithFormat = args.map(function (item) {
90 return '' + item;
91 }); // Careful: RN currently depends on this prefix
92
93 argsWithFormat.unshift('Warning: ' + format); // We intentionally don't use spread (or .apply) directly because it
94 // breaks IE9: https://github.com/facebook/react/issues/13610
95 // eslint-disable-next-line react-internal/no-production-logging
96
97 Function.prototype.apply.call(console[level], console, argsWithFormat);
98
99 try {
100 // --- Welcome to debugging React ---
101 // This error was thrown as a convenience so that you can use this stack
102 // to find the callsite that caused this warning to fire.
103 var argIndex = 0;
104 var message = 'Warning: ' + format.replace(/%s/g, function () {
105 return args[argIndex++];
106 });
107 throw new Error(message);
108 } catch (x) {}
109 }
110 }
111
112 var ReactInternals = React.__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED;
113 var _assign = ReactInternals.assign;
114
115 // The Symbol used to tag the ReactElement-like types. If there is no native Symbol
116 // nor polyfill, then a plain number is used for performance.
117 var hasSymbol = typeof Symbol === 'function' && Symbol.for;
118 var REACT_PORTAL_TYPE = hasSymbol ? Symbol.for('react.portal') : 0xeaca;
119 var REACT_FRAGMENT_TYPE = hasSymbol ? Symbol.for('react.fragment') : 0xeacb;
120 var REACT_STRICT_MODE_TYPE = hasSymbol ? Symbol.for('react.strict_mode') : 0xeacc;
121 var REACT_PROFILER_TYPE = hasSymbol ? Symbol.for('react.profiler') : 0xead2;
122 var REACT_PROVIDER_TYPE = hasSymbol ? Symbol.for('react.provider') : 0xeacd;
123 var REACT_CONTEXT_TYPE = hasSymbol ? Symbol.for('react.context') : 0xeace; // TODO: We don't use AsyncMode or ConcurrentMode anymore. They were temporary
124 var REACT_CONCURRENT_MODE_TYPE = hasSymbol ? Symbol.for('react.concurrent_mode') : 0xeacf;
125 var REACT_FORWARD_REF_TYPE = hasSymbol ? Symbol.for('react.forward_ref') : 0xead0;
126 var REACT_SUSPENSE_TYPE = hasSymbol ? Symbol.for('react.suspense') : 0xead1;
127 var REACT_SUSPENSE_LIST_TYPE = hasSymbol ? Symbol.for('react.suspense_list') : 0xead8;
128 var REACT_MEMO_TYPE = hasSymbol ? Symbol.for('react.memo') : 0xead3;
129 var REACT_LAZY_TYPE = hasSymbol ? Symbol.for('react.lazy') : 0xead4;
130 var REACT_BLOCK_TYPE = hasSymbol ? Symbol.for('react.block') : 0xead9;
131 var REACT_FUNDAMENTAL_TYPE = hasSymbol ? Symbol.for('react.fundamental') : 0xead5;
132 var REACT_SCOPE_TYPE = hasSymbol ? Symbol.for('react.scope') : 0xead7;
133
134 var Uninitialized = -1;
135 var Pending = 0;
136 var Resolved = 1;
137 var Rejected = 2;
138 function refineResolvedLazyComponent(lazyComponent) {
139 return lazyComponent._status === Resolved ? lazyComponent._result : null;
140 }
141 function initializeLazyComponentType(lazyComponent) {
142 if (lazyComponent._status === Uninitialized) {
143 lazyComponent._status = Pending;
144 var ctor = lazyComponent._ctor;
145 var thenable = ctor();
146 lazyComponent._result = thenable;
147 thenable.then(function (moduleObject) {
148 if (lazyComponent._status === Pending) {
149 var defaultExport = moduleObject.default;
150
151 {
152 if (defaultExport === undefined) {
153 error('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);
154 }
155 }
156
157 lazyComponent._status = Resolved;
158 lazyComponent._result = defaultExport;
159 }
160 }, function (error) {
161 if (lazyComponent._status === Pending) {
162 lazyComponent._status = Rejected;
163 lazyComponent._result = error;
164 }
165 });
166 }
167 }
168
169 function getWrappedName(outerType, innerType, wrapperName) {
170 var functionName = innerType.displayName || innerType.name || '';
171 return outerType.displayName || (functionName !== '' ? wrapperName + "(" + functionName + ")" : wrapperName);
172 }
173
174 function getComponentName(type) {
175 if (type == null) {
176 // Host root, text node or just invalid type.
177 return null;
178 }
179
180 {
181 if (typeof type.tag === 'number') {
182 error('Received an unexpected object in getComponentName(). ' + 'This is likely a bug in React. Please file an issue.');
183 }
184 }
185
186 if (typeof type === 'function') {
187 return type.displayName || type.name || null;
188 }
189
190 if (typeof type === 'string') {
191 return type;
192 }
193
194 switch (type) {
195 case REACT_FRAGMENT_TYPE:
196 return 'Fragment';
197
198 case REACT_PORTAL_TYPE:
199 return 'Portal';
200
201 case REACT_PROFILER_TYPE:
202 return "Profiler";
203
204 case REACT_STRICT_MODE_TYPE:
205 return 'StrictMode';
206
207 case REACT_SUSPENSE_TYPE:
208 return 'Suspense';
209
210 case REACT_SUSPENSE_LIST_TYPE:
211 return 'SuspenseList';
212 }
213
214 if (typeof type === 'object') {
215 switch (type.$$typeof) {
216 case REACT_CONTEXT_TYPE:
217 return 'Context.Consumer';
218
219 case REACT_PROVIDER_TYPE:
220 return 'Context.Provider';
221
222 case REACT_FORWARD_REF_TYPE:
223 return getWrappedName(type, type.render, 'ForwardRef');
224
225 case REACT_MEMO_TYPE:
226 return getComponentName(type.type);
227
228 case REACT_BLOCK_TYPE:
229 return getComponentName(type.render);
230
231 case REACT_LAZY_TYPE:
232 {
233 var thenable = type;
234 var resolvedThenable = refineResolvedLazyComponent(thenable);
235
236 if (resolvedThenable) {
237 return getComponentName(resolvedThenable);
238 }
239
240 break;
241 }
242 }
243 }
244
245 return null;
246 }
247
248 var BEFORE_SLASH_RE = /^(.*)[\\\/]/;
249 function describeComponentFrame (name, source, ownerName) {
250 var sourceInfo = '';
251
252 if (source) {
253 var path = source.fileName;
254 var fileName = path.replace(BEFORE_SLASH_RE, '');
255
256 {
257 // In DEV, include code for a common special case:
258 // prefer "folder/index.js" instead of just "index.js".
259 if (/^index\./.test(fileName)) {
260 var match = path.match(BEFORE_SLASH_RE);
261
262 if (match) {
263 var pathBeforeSlash = match[1];
264
265 if (pathBeforeSlash) {
266 var folderName = pathBeforeSlash.replace(BEFORE_SLASH_RE, '');
267 fileName = folderName + '/' + fileName;
268 }
269 }
270 }
271 }
272
273 sourceInfo = ' (at ' + fileName + ':' + source.lineNumber + ')';
274 } else if (ownerName) {
275 sourceInfo = ' (created by ' + ownerName + ')';
276 }
277
278 return '\n in ' + (name || 'Unknown') + sourceInfo;
279 }
280
281 var enableSuspenseServerRenderer = false;
282
283 var enableDeprecatedFlareAPI = false; // Experimental Host Component support.
284
285 /**
286 * Copyright (c) 2013-present, Facebook, Inc.
287 *
288 * This source code is licensed under the MIT license found in the
289 * LICENSE file in the root directory of this source tree.
290 */
291
292 var ReactPropTypesSecret = 'SECRET_DO_NOT_PASS_THIS_OR_YOU_WILL_BE_FIRED';
293
294 var ReactPropTypesSecret_1 = ReactPropTypesSecret;
295
296 var printWarning$1 = function() {};
297
298 {
299 var ReactPropTypesSecret$1 = ReactPropTypesSecret_1;
300 var loggedTypeFailures = {};
301 var has = Function.call.bind(Object.prototype.hasOwnProperty);
302
303 printWarning$1 = function(text) {
304 var message = 'Warning: ' + text;
305 if (typeof console !== 'undefined') {
306 console.error(message);
307 }
308 try {
309 // --- Welcome to debugging React ---
310 // This error was thrown as a convenience so that you can use this stack
311 // to find the callsite that caused this warning to fire.
312 throw new Error(message);
313 } catch (x) {}
314 };
315 }
316
317 /**
318 * Assert that the values match with the type specs.
319 * Error messages are memorized and will only be shown once.
320 *
321 * @param {object} typeSpecs Map of name to a ReactPropType
322 * @param {object} values Runtime values that need to be type-checked
323 * @param {string} location e.g. "prop", "context", "child context"
324 * @param {string} componentName Name of the component for error messages.
325 * @param {?Function} getStack Returns the component stack.
326 * @private
327 */
328 function checkPropTypes(typeSpecs, values, location, componentName, getStack) {
329 {
330 for (var typeSpecName in typeSpecs) {
331 if (has(typeSpecs, typeSpecName)) {
332 var error;
333 // Prop type validation may throw. In case they do, we don't want to
334 // fail the render phase where it didn't fail before. So we log it.
335 // After these have been cleaned up, we'll let them throw.
336 try {
337 // This is intentionally an invariant that gets caught. It's the same
338 // behavior as without this statement except with a better message.
339 if (typeof typeSpecs[typeSpecName] !== 'function') {
340 var err = Error(
341 (componentName || 'React class') + ': ' + location + ' type `' + typeSpecName + '` is invalid; ' +
342 'it must be a function, usually from the `prop-types` package, but received `' + typeof typeSpecs[typeSpecName] + '`.'
343 );
344 err.name = 'Invariant Violation';
345 throw err;
346 }
347 error = typeSpecs[typeSpecName](values, typeSpecName, componentName, location, null, ReactPropTypesSecret$1);
348 } catch (ex) {
349 error = ex;
350 }
351 if (error && !(error instanceof Error)) {
352 printWarning$1(
353 (componentName || 'React class') + ': type specification of ' +
354 location + ' `' + typeSpecName + '` is invalid; the type checker ' +
355 'function must return `null` or an `Error` but returned a ' + typeof error + '. ' +
356 'You may have forgotten to pass an argument to the type checker ' +
357 'creator (arrayOf, instanceOf, objectOf, oneOf, oneOfType, and ' +
358 'shape all require an argument).'
359 );
360 }
361 if (error instanceof Error && !(error.message in loggedTypeFailures)) {
362 // Only monitor this failure once because there tends to be a lot of the
363 // same error.
364 loggedTypeFailures[error.message] = true;
365
366 var stack = getStack ? getStack() : '';
367
368 printWarning$1(
369 'Failed ' + location + ' type: ' + error.message + (stack != null ? stack : '')
370 );
371 }
372 }
373 }
374 }
375 }
376
377 /**
378 * Resets warning cache when testing.
379 *
380 * @private
381 */
382 checkPropTypes.resetWarningCache = function() {
383 {
384 loggedTypeFailures = {};
385 }
386 };
387
388 var checkPropTypes_1 = checkPropTypes;
389
390 var ReactDebugCurrentFrame;
391 var didWarnAboutInvalidateContextType;
392
393 {
394 ReactDebugCurrentFrame = ReactSharedInternals.ReactDebugCurrentFrame;
395 didWarnAboutInvalidateContextType = new Set();
396 }
397
398 var emptyObject = {};
399
400 {
401 Object.freeze(emptyObject);
402 }
403
404 function maskContext(type, context) {
405 var contextTypes = type.contextTypes;
406
407 if (!contextTypes) {
408 return emptyObject;
409 }
410
411 var maskedContext = {};
412
413 for (var contextName in contextTypes) {
414 maskedContext[contextName] = context[contextName];
415 }
416
417 return maskedContext;
418 }
419
420 function checkContextTypes(typeSpecs, values, location) {
421 {
422 checkPropTypes_1(typeSpecs, values, location, 'Component', ReactDebugCurrentFrame.getCurrentStack);
423 }
424 }
425
426 function validateContextBounds(context, threadID) {
427 // If we don't have enough slots in this context to store this threadID,
428 // fill it in without leaving any holes to ensure that the VM optimizes
429 // this as non-holey index properties.
430 // (Note: If `react` package is < 16.6, _threadCount is undefined.)
431 for (var i = context._threadCount | 0; i <= threadID; i++) {
432 // We assume that this is the same as the defaultValue which might not be
433 // true if we're rendering inside a secondary renderer but they are
434 // secondary because these use cases are very rare.
435 context[i] = context._currentValue2;
436 context._threadCount = i + 1;
437 }
438 }
439 function processContext(type, context, threadID, isClass) {
440 if (isClass) {
441 var contextType = type.contextType;
442
443 {
444 if ('contextType' in type) {
445 var isValid = // Allow null for conditional declaration
446 contextType === null || contextType !== undefined && contextType.$$typeof === REACT_CONTEXT_TYPE && contextType._context === undefined; // Not a <Context.Consumer>
447
448 if (!isValid && !didWarnAboutInvalidateContextType.has(type)) {
449 didWarnAboutInvalidateContextType.add(type);
450 var addendum = '';
451
452 if (contextType === undefined) {
453 addendum = ' However, it is set to undefined. ' + 'This can be caused by a typo or by mixing up named and default imports. ' + 'This can also happen due to a circular dependency, so ' + 'try moving the createContext() call to a separate file.';
454 } else if (typeof contextType !== 'object') {
455 addendum = ' However, it is set to a ' + typeof contextType + '.';
456 } else if (contextType.$$typeof === REACT_PROVIDER_TYPE) {
457 addendum = ' Did you accidentally pass the Context.Provider instead?';
458 } else if (contextType._context !== undefined) {
459 // <Context.Consumer>
460 addendum = ' Did you accidentally pass the Context.Consumer instead?';
461 } else {
462 addendum = ' However, it is set to an object with keys {' + Object.keys(contextType).join(', ') + '}.';
463 }
464
465 error('%s defines an invalid contextType. ' + 'contextType should point to the Context object returned by React.createContext().%s', getComponentName(type) || 'Component', addendum);
466 }
467 }
468 }
469
470 if (typeof contextType === 'object' && contextType !== null) {
471 validateContextBounds(contextType, threadID);
472 return contextType[threadID];
473 }
474
475 {
476 var maskedContext = maskContext(type, context);
477
478 {
479 if (type.contextTypes) {
480 checkContextTypes(type.contextTypes, maskedContext, 'context');
481 }
482 }
483
484 return maskedContext;
485 }
486 } else {
487 {
488 var _maskedContext = maskContext(type, context);
489
490 {
491 if (type.contextTypes) {
492 checkContextTypes(type.contextTypes, _maskedContext, 'context');
493 }
494 }
495
496 return _maskedContext;
497 }
498 }
499 }
500
501 var nextAvailableThreadIDs = new Uint16Array(16);
502
503 for (var i = 0; i < 15; i++) {
504 nextAvailableThreadIDs[i] = i + 1;
505 }
506
507 nextAvailableThreadIDs[15] = 0;
508
509 function growThreadCountAndReturnNextAvailable() {
510 var oldArray = nextAvailableThreadIDs;
511 var oldSize = oldArray.length;
512 var newSize = oldSize * 2;
513
514 if (!(newSize <= 0x10000)) {
515 {
516 throw Error( "Maximum number of concurrent React renderers exceeded. This can happen if you are not properly destroying the Readable provided by React. Ensure that you call .destroy() on it if you no longer want to read from it, and did not read to the end. If you use .pipe() this should be automatic." );
517 }
518 }
519
520 var newArray = new Uint16Array(newSize);
521 newArray.set(oldArray);
522 nextAvailableThreadIDs = newArray;
523 nextAvailableThreadIDs[0] = oldSize + 1;
524
525 for (var _i = oldSize; _i < newSize - 1; _i++) {
526 nextAvailableThreadIDs[_i] = _i + 1;
527 }
528
529 nextAvailableThreadIDs[newSize - 1] = 0;
530 return oldSize;
531 }
532
533 function allocThreadID() {
534 var nextID = nextAvailableThreadIDs[0];
535
536 if (nextID === 0) {
537 return growThreadCountAndReturnNextAvailable();
538 }
539
540 nextAvailableThreadIDs[0] = nextAvailableThreadIDs[nextID];
541 return nextID;
542 }
543 function freeThreadID(id) {
544 nextAvailableThreadIDs[id] = nextAvailableThreadIDs[0];
545 nextAvailableThreadIDs[0] = id;
546 }
547
548 // A reserved attribute.
549 // It is handled by React separately and shouldn't be written to the DOM.
550 var RESERVED = 0; // A simple string attribute.
551 // Attributes that aren't in the whitelist are presumed to have this type.
552
553 var STRING = 1; // A string attribute that accepts booleans in React. In HTML, these are called
554 // "enumerated" attributes with "true" and "false" as possible values.
555 // When true, it should be set to a "true" string.
556 // When false, it should be set to a "false" string.
557
558 var BOOLEANISH_STRING = 2; // A real boolean attribute.
559 // When true, it should be present (set either to an empty string or its name).
560 // When false, it should be omitted.
561
562 var BOOLEAN = 3; // An attribute that can be used as a flag as well as with a value.
563 // When true, it should be present (set either to an empty string or its name).
564 // When false, it should be omitted.
565 // For any other value, should be present with that value.
566
567 var OVERLOADED_BOOLEAN = 4; // An attribute that must be numeric or parse as a numeric.
568 // When falsy, it should be removed.
569
570 var NUMERIC = 5; // An attribute that must be positive numeric or parse as a positive numeric.
571 // When falsy, it should be removed.
572
573 var POSITIVE_NUMERIC = 6;
574
575 /* eslint-disable max-len */
576 var 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";
577 /* eslint-enable max-len */
578
579 var ATTRIBUTE_NAME_CHAR = ATTRIBUTE_NAME_START_CHAR + "\\-.0-9\\u00B7\\u0300-\\u036F\\u203F-\\u2040";
580 var ROOT_ATTRIBUTE_NAME = 'data-reactroot';
581 var VALID_ATTRIBUTE_NAME_REGEX = new RegExp('^[' + ATTRIBUTE_NAME_START_CHAR + '][' + ATTRIBUTE_NAME_CHAR + ']*$');
582 var hasOwnProperty = Object.prototype.hasOwnProperty;
583 var illegalAttributeNameCache = {};
584 var validatedAttributeNameCache = {};
585 function isAttributeNameSafe(attributeName) {
586 if (hasOwnProperty.call(validatedAttributeNameCache, attributeName)) {
587 return true;
588 }
589
590 if (hasOwnProperty.call(illegalAttributeNameCache, attributeName)) {
591 return false;
592 }
593
594 if (VALID_ATTRIBUTE_NAME_REGEX.test(attributeName)) {
595 validatedAttributeNameCache[attributeName] = true;
596 return true;
597 }
598
599 illegalAttributeNameCache[attributeName] = true;
600
601 {
602 error('Invalid attribute name: `%s`', attributeName);
603 }
604
605 return false;
606 }
607 function shouldIgnoreAttribute(name, propertyInfo, isCustomComponentTag) {
608 if (propertyInfo !== null) {
609 return propertyInfo.type === RESERVED;
610 }
611
612 if (isCustomComponentTag) {
613 return false;
614 }
615
616 if (name.length > 2 && (name[0] === 'o' || name[0] === 'O') && (name[1] === 'n' || name[1] === 'N')) {
617 return true;
618 }
619
620 return false;
621 }
622 function shouldRemoveAttributeWithWarning(name, value, propertyInfo, isCustomComponentTag) {
623 if (propertyInfo !== null && propertyInfo.type === RESERVED) {
624 return false;
625 }
626
627 switch (typeof value) {
628 case 'function': // $FlowIssue symbol is perfectly valid here
629
630 case 'symbol':
631 // eslint-disable-line
632 return true;
633
634 case 'boolean':
635 {
636 if (isCustomComponentTag) {
637 return false;
638 }
639
640 if (propertyInfo !== null) {
641 return !propertyInfo.acceptsBooleans;
642 } else {
643 var prefix = name.toLowerCase().slice(0, 5);
644 return prefix !== 'data-' && prefix !== 'aria-';
645 }
646 }
647
648 default:
649 return false;
650 }
651 }
652 function shouldRemoveAttribute(name, value, propertyInfo, isCustomComponentTag) {
653 if (value === null || typeof value === 'undefined') {
654 return true;
655 }
656
657 if (shouldRemoveAttributeWithWarning(name, value, propertyInfo, isCustomComponentTag)) {
658 return true;
659 }
660
661 if (isCustomComponentTag) {
662 return false;
663 }
664
665 if (propertyInfo !== null) {
666 switch (propertyInfo.type) {
667 case BOOLEAN:
668 return !value;
669
670 case OVERLOADED_BOOLEAN:
671 return value === false;
672
673 case NUMERIC:
674 return isNaN(value);
675
676 case POSITIVE_NUMERIC:
677 return isNaN(value) || value < 1;
678 }
679 }
680
681 return false;
682 }
683 function getPropertyInfo(name) {
684 return properties.hasOwnProperty(name) ? properties[name] : null;
685 }
686
687 function PropertyInfoRecord(name, type, mustUseProperty, attributeName, attributeNamespace, sanitizeURL) {
688 this.acceptsBooleans = type === BOOLEANISH_STRING || type === BOOLEAN || type === OVERLOADED_BOOLEAN;
689 this.attributeName = attributeName;
690 this.attributeNamespace = attributeNamespace;
691 this.mustUseProperty = mustUseProperty;
692 this.propertyName = name;
693 this.type = type;
694 this.sanitizeURL = sanitizeURL;
695 } // When adding attributes to this list, be sure to also add them to
696 // the `possibleStandardNames` module to ensure casing and incorrect
697 // name warnings.
698
699
700 var properties = {}; // These props are reserved by React. They shouldn't be written to the DOM.
701
702 var reservedProps = ['children', 'dangerouslySetInnerHTML', // TODO: This prevents the assignment of defaultValue to regular
703 // elements (not just inputs). Now that ReactDOMInput assigns to the
704 // defaultValue property -- do we need this?
705 'defaultValue', 'defaultChecked', 'innerHTML', 'suppressContentEditableWarning', 'suppressHydrationWarning', 'style'];
706
707 reservedProps.forEach(function (name) {
708 properties[name] = new PropertyInfoRecord(name, RESERVED, false, // mustUseProperty
709 name, // attributeName
710 null, // attributeNamespace
711 false);
712 }); // A few React string attributes have a different name.
713 // This is a mapping from React prop names to the attribute names.
714
715 [['acceptCharset', 'accept-charset'], ['className', 'class'], ['htmlFor', 'for'], ['httpEquiv', 'http-equiv']].forEach(function (_ref) {
716 var name = _ref[0],
717 attributeName = _ref[1];
718 properties[name] = new PropertyInfoRecord(name, STRING, false, // mustUseProperty
719 attributeName, // attributeName
720 null, // attributeNamespace
721 false);
722 }); // These are "enumerated" HTML attributes that accept "true" and "false".
723 // In React, we let users pass `true` and `false` even though technically
724 // these aren't boolean attributes (they are coerced to strings).
725
726 ['contentEditable', 'draggable', 'spellCheck', 'value'].forEach(function (name) {
727 properties[name] = new PropertyInfoRecord(name, BOOLEANISH_STRING, false, // mustUseProperty
728 name.toLowerCase(), // attributeName
729 null, // attributeNamespace
730 false);
731 }); // These are "enumerated" SVG attributes that accept "true" and "false".
732 // In React, we let users pass `true` and `false` even though technically
733 // these aren't boolean attributes (they are coerced to strings).
734 // Since these are SVG attributes, their attribute names are case-sensitive.
735
736 ['autoReverse', 'externalResourcesRequired', 'focusable', 'preserveAlpha'].forEach(function (name) {
737 properties[name] = new PropertyInfoRecord(name, BOOLEANISH_STRING, false, // mustUseProperty
738 name, // attributeName
739 null, // attributeNamespace
740 false);
741 }); // These are HTML boolean attributes.
742
743 ['allowFullScreen', 'async', // Note: there is a special case that prevents it from being written to the DOM
744 // on the client side because the browsers are inconsistent. Instead we call focus().
745 'autoFocus', 'autoPlay', 'controls', 'default', 'defer', 'disabled', 'disablePictureInPicture', 'formNoValidate', 'hidden', 'loop', 'noModule', 'noValidate', 'open', 'playsInline', 'readOnly', 'required', 'reversed', 'scoped', 'seamless', // Microdata
746 'itemScope'].forEach(function (name) {
747 properties[name] = new PropertyInfoRecord(name, BOOLEAN, false, // mustUseProperty
748 name.toLowerCase(), // attributeName
749 null, // attributeNamespace
750 false);
751 }); // These are the few React props that we set as DOM properties
752 // rather than attributes. These are all booleans.
753
754 ['checked', // Note: `option.selected` is not updated if `select.multiple` is
755 // disabled with `removeAttribute`. We have special logic for handling this.
756 'multiple', 'muted', 'selected' // NOTE: if you add a camelCased prop to this list,
757 // you'll need to set attributeName to name.toLowerCase()
758 // instead in the assignment below.
759 ].forEach(function (name) {
760 properties[name] = new PropertyInfoRecord(name, BOOLEAN, true, // mustUseProperty
761 name, // attributeName
762 null, // attributeNamespace
763 false);
764 }); // These are HTML attributes that are "overloaded booleans": they behave like
765 // booleans, but can also accept a string value.
766
767 ['capture', 'download' // NOTE: if you add a camelCased prop to this list,
768 // you'll need to set attributeName to name.toLowerCase()
769 // instead in the assignment below.
770 ].forEach(function (name) {
771 properties[name] = new PropertyInfoRecord(name, OVERLOADED_BOOLEAN, false, // mustUseProperty
772 name, // attributeName
773 null, // attributeNamespace
774 false);
775 }); // These are HTML attributes that must be positive numbers.
776
777 ['cols', 'rows', 'size', 'span' // NOTE: if you add a camelCased prop to this list,
778 // you'll need to set attributeName to name.toLowerCase()
779 // instead in the assignment below.
780 ].forEach(function (name) {
781 properties[name] = new PropertyInfoRecord(name, POSITIVE_NUMERIC, false, // mustUseProperty
782 name, // attributeName
783 null, // attributeNamespace
784 false);
785 }); // These are HTML attributes that must be numbers.
786
787 ['rowSpan', 'start'].forEach(function (name) {
788 properties[name] = new PropertyInfoRecord(name, NUMERIC, false, // mustUseProperty
789 name.toLowerCase(), // attributeName
790 null, // attributeNamespace
791 false);
792 });
793 var CAMELIZE = /[\-\:]([a-z])/g;
794
795 var capitalize = function (token) {
796 return token[1].toUpperCase();
797 }; // This is a list of all SVG attributes that need special casing, namespacing,
798 // or boolean value assignment. Regular attributes that just accept strings
799 // and have the same names are omitted, just like in the HTML whitelist.
800 // Some of these attributes can be hard to find. This list was created by
801 // scraping the MDN documentation.
802
803
804 ['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' // NOTE: if you add a camelCased prop to this list,
805 // you'll need to set attributeName to name.toLowerCase()
806 // instead in the assignment below.
807 ].forEach(function (attributeName) {
808 var name = attributeName.replace(CAMELIZE, capitalize);
809 properties[name] = new PropertyInfoRecord(name, STRING, false, // mustUseProperty
810 attributeName, null, // attributeNamespace
811 false);
812 }); // String SVG attributes with the xlink namespace.
813
814 ['xlink:actuate', 'xlink:arcrole', 'xlink:role', 'xlink:show', 'xlink:title', 'xlink:type' // NOTE: if you add a camelCased prop to this list,
815 // you'll need to set attributeName to name.toLowerCase()
816 // instead in the assignment below.
817 ].forEach(function (attributeName) {
818 var name = attributeName.replace(CAMELIZE, capitalize);
819 properties[name] = new PropertyInfoRecord(name, STRING, false, // mustUseProperty
820 attributeName, 'http://www.w3.org/1999/xlink', false);
821 }); // String SVG attributes with the xml namespace.
822
823 ['xml:base', 'xml:lang', 'xml:space' // NOTE: if you add a camelCased prop to this list,
824 // you'll need to set attributeName to name.toLowerCase()
825 // instead in the assignment below.
826 ].forEach(function (attributeName) {
827 var name = attributeName.replace(CAMELIZE, capitalize);
828 properties[name] = new PropertyInfoRecord(name, STRING, false, // mustUseProperty
829 attributeName, 'http://www.w3.org/XML/1998/namespace', false);
830 }); // These attribute exists both in HTML and SVG.
831 // The attribute name is case-sensitive in SVG so we can't just use
832 // the React name like we do for attributes that exist only in HTML.
833
834 ['tabIndex', 'crossOrigin'].forEach(function (attributeName) {
835 properties[attributeName] = new PropertyInfoRecord(attributeName, STRING, false, // mustUseProperty
836 attributeName.toLowerCase(), // attributeName
837 null, // attributeNamespace
838 false);
839 }); // These attributes accept URLs. These must not allow javascript: URLS.
840 // These will also need to accept Trusted Types object in the future.
841
842 var xlinkHref = 'xlinkHref';
843 properties[xlinkHref] = new PropertyInfoRecord('xlinkHref', STRING, false, // mustUseProperty
844 'xlink:href', 'http://www.w3.org/1999/xlink', true);
845 ['src', 'href', 'action', 'formAction'].forEach(function (attributeName) {
846 properties[attributeName] = new PropertyInfoRecord(attributeName, STRING, false, // mustUseProperty
847 attributeName.toLowerCase(), // attributeName
848 null, // attributeNamespace
849 true);
850 });
851
852 var ReactDebugCurrentFrame$1 = null;
853
854 {
855 ReactDebugCurrentFrame$1 = ReactSharedInternals.ReactDebugCurrentFrame;
856 } // A javascript: URL can contain leading C0 control or \u0020 SPACE,
857 // and any newline or tab are filtered out as if they're not part of the URL.
858 // https://url.spec.whatwg.org/#url-parsing
859 // Tab or newline are defined as \r\n\t:
860 // https://infra.spec.whatwg.org/#ascii-tab-or-newline
861 // A C0 control is a code point in the range \u0000 NULL to \u001F
862 // INFORMATION SEPARATOR ONE, inclusive:
863 // https://infra.spec.whatwg.org/#c0-control-or-space
864
865 /* eslint-disable max-len */
866
867
868 var isJavaScriptProtocol = /^[\u0000-\u001F ]*j[\r\n\t]*a[\r\n\t]*v[\r\n\t]*a[\r\n\t]*s[\r\n\t]*c[\r\n\t]*r[\r\n\t]*i[\r\n\t]*p[\r\n\t]*t[\r\n\t]*\:/i;
869 var didWarn = false;
870
871 function sanitizeURL(url) {
872 {
873 if (!didWarn && isJavaScriptProtocol.test(url)) {
874 didWarn = true;
875
876 error('A future version of React will block javascript: URLs as a security precaution. ' + 'Use event handlers instead if you can. If you need to generate unsafe HTML try ' + 'using dangerouslySetInnerHTML instead. React was passed %s.', JSON.stringify(url));
877 }
878 }
879 }
880
881 // code copied and modified from escape-html
882
883 /**
884 * Module variables.
885 * @private
886 */
887 var matchHtmlRegExp = /["'&<>]/;
888 /**
889 * Escapes special characters and HTML entities in a given html string.
890 *
891 * @param {string} string HTML string to escape for later insertion
892 * @return {string}
893 * @public
894 */
895
896 function escapeHtml(string) {
897 var str = '' + string;
898 var match = matchHtmlRegExp.exec(str);
899
900 if (!match) {
901 return str;
902 }
903
904 var escape;
905 var html = '';
906 var index;
907 var lastIndex = 0;
908
909 for (index = match.index; index < str.length; index++) {
910 switch (str.charCodeAt(index)) {
911 case 34:
912 // "
913 escape = '&quot;';
914 break;
915
916 case 38:
917 // &
918 escape = '&amp;';
919 break;
920
921 case 39:
922 // '
923 escape = '&#x27;'; // modified from escape-html; used to be '&#39'
924
925 break;
926
927 case 60:
928 // <
929 escape = '&lt;';
930 break;
931
932 case 62:
933 // >
934 escape = '&gt;';
935 break;
936
937 default:
938 continue;
939 }
940
941 if (lastIndex !== index) {
942 html += str.substring(lastIndex, index);
943 }
944
945 lastIndex = index + 1;
946 html += escape;
947 }
948
949 return lastIndex !== index ? html + str.substring(lastIndex, index) : html;
950 } // end code copied and modified from escape-html
951
952 /**
953 * Escapes text to prevent scripting attacks.
954 *
955 * @param {*} text Text value to escape.
956 * @return {string} An escaped string.
957 */
958
959
960 function escapeTextForBrowser(text) {
961 if (typeof text === 'boolean' || typeof text === 'number') {
962 // this shortcircuit helps perf for types that we know will never have
963 // special characters, especially given that this function is used often
964 // for numeric dom ids.
965 return '' + text;
966 }
967
968 return escapeHtml(text);
969 }
970
971 /**
972 * Escapes attribute value to prevent scripting attacks.
973 *
974 * @param {*} value Value to escape.
975 * @return {string} An escaped string.
976 */
977
978 function quoteAttributeValueForBrowser(value) {
979 return '"' + escapeTextForBrowser(value) + '"';
980 }
981
982 function createMarkupForRoot() {
983 return ROOT_ATTRIBUTE_NAME + '=""';
984 }
985 /**
986 * Creates markup for a property.
987 *
988 * @param {string} name
989 * @param {*} value
990 * @return {?string} Markup string, or null if the property was invalid.
991 */
992
993 function createMarkupForProperty(name, value) {
994 var propertyInfo = getPropertyInfo(name);
995
996 if (name !== 'style' && shouldIgnoreAttribute(name, propertyInfo, false)) {
997 return '';
998 }
999
1000 if (shouldRemoveAttribute(name, value, propertyInfo, false)) {
1001 return '';
1002 }
1003
1004 if (propertyInfo !== null) {
1005 var attributeName = propertyInfo.attributeName;
1006 var type = propertyInfo.type;
1007
1008 if (type === BOOLEAN || type === OVERLOADED_BOOLEAN && value === true) {
1009 return attributeName + '=""';
1010 } else {
1011 if (propertyInfo.sanitizeURL) {
1012 value = '' + value;
1013 sanitizeURL(value);
1014 }
1015
1016 return attributeName + '=' + quoteAttributeValueForBrowser(value);
1017 }
1018 } else if (isAttributeNameSafe(name)) {
1019 return name + '=' + quoteAttributeValueForBrowser(value);
1020 }
1021
1022 return '';
1023 }
1024 /**
1025 * Creates markup for a custom property.
1026 *
1027 * @param {string} name
1028 * @param {*} value
1029 * @return {string} Markup string, or empty string if the property was invalid.
1030 */
1031
1032 function createMarkupForCustomAttribute(name, value) {
1033 if (!isAttributeNameSafe(name) || value == null) {
1034 return '';
1035 }
1036
1037 return name + '=' + quoteAttributeValueForBrowser(value);
1038 }
1039
1040 /**
1041 * inlined Object.is polyfill to avoid requiring consumers ship their own
1042 * https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/is
1043 */
1044 function is(x, y) {
1045 return x === y && (x !== 0 || 1 / x === 1 / y) || x !== x && y !== y // eslint-disable-line no-self-compare
1046 ;
1047 }
1048
1049 var objectIs = typeof Object.is === 'function' ? Object.is : is;
1050
1051 var currentlyRenderingComponent = null;
1052 var firstWorkInProgressHook = null;
1053 var workInProgressHook = null; // Whether the work-in-progress hook is a re-rendered hook
1054
1055 var isReRender = false; // Whether an update was scheduled during the currently executing render pass.
1056
1057 var didScheduleRenderPhaseUpdate = false; // Lazily created map of render-phase updates
1058
1059 var renderPhaseUpdates = null; // Counter to prevent infinite loops.
1060
1061 var numberOfReRenders = 0;
1062 var RE_RENDER_LIMIT = 25;
1063 var isInHookUserCodeInDev = false; // In DEV, this is the name of the currently executing primitive hook
1064
1065 var currentHookNameInDev;
1066
1067 function resolveCurrentlyRenderingComponent() {
1068 if (!(currentlyRenderingComponent !== null)) {
1069 {
1070 throw Error( "Invalid hook call. Hooks can only be called inside of the body of a function component. This could happen for one of the following reasons:\n1. You might have mismatching versions of React and the renderer (such as React DOM)\n2. You might be breaking the Rules of Hooks\n3. You might have more than one copy of React in the same app\nSee https://fb.me/react-invalid-hook-call for tips about how to debug and fix this problem." );
1071 }
1072 }
1073
1074 {
1075 if (isInHookUserCodeInDev) {
1076 error('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');
1077 }
1078 }
1079
1080 return currentlyRenderingComponent;
1081 }
1082
1083 function areHookInputsEqual(nextDeps, prevDeps) {
1084 if (prevDeps === null) {
1085 {
1086 error('%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);
1087 }
1088
1089 return false;
1090 }
1091
1092 {
1093 // Don't bother comparing lengths in prod because these arrays should be
1094 // passed inline.
1095 if (nextDeps.length !== prevDeps.length) {
1096 error('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(', ') + "]");
1097 }
1098 }
1099
1100 for (var i = 0; i < prevDeps.length && i < nextDeps.length; i++) {
1101 if (objectIs(nextDeps[i], prevDeps[i])) {
1102 continue;
1103 }
1104
1105 return false;
1106 }
1107
1108 return true;
1109 }
1110
1111 function createHook() {
1112 if (numberOfReRenders > 0) {
1113 {
1114 {
1115 throw Error( "Rendered more hooks than during the previous render" );
1116 }
1117 }
1118 }
1119
1120 return {
1121 memoizedState: null,
1122 queue: null,
1123 next: null
1124 };
1125 }
1126
1127 function createWorkInProgressHook() {
1128 if (workInProgressHook === null) {
1129 // This is the first hook in the list
1130 if (firstWorkInProgressHook === null) {
1131 isReRender = false;
1132 firstWorkInProgressHook = workInProgressHook = createHook();
1133 } else {
1134 // There's already a work-in-progress. Reuse it.
1135 isReRender = true;
1136 workInProgressHook = firstWorkInProgressHook;
1137 }
1138 } else {
1139 if (workInProgressHook.next === null) {
1140 isReRender = false; // Append to the end of the list
1141
1142 workInProgressHook = workInProgressHook.next = createHook();
1143 } else {
1144 // There's already a work-in-progress. Reuse it.
1145 isReRender = true;
1146 workInProgressHook = workInProgressHook.next;
1147 }
1148 }
1149
1150 return workInProgressHook;
1151 }
1152
1153 function prepareToUseHooks(componentIdentity) {
1154 currentlyRenderingComponent = componentIdentity;
1155
1156 {
1157 isInHookUserCodeInDev = false;
1158 } // The following should have already been reset
1159 // didScheduleRenderPhaseUpdate = false;
1160 // firstWorkInProgressHook = null;
1161 // numberOfReRenders = 0;
1162 // renderPhaseUpdates = null;
1163 // workInProgressHook = null;
1164
1165 }
1166 function finishHooks(Component, props, children, refOrContext) {
1167 // This must be called after every function component to prevent hooks from
1168 // being used in classes.
1169 while (didScheduleRenderPhaseUpdate) {
1170 // Updates were scheduled during the render phase. They are stored in
1171 // the `renderPhaseUpdates` map. Call the component again, reusing the
1172 // work-in-progress hooks and applying the additional updates on top. Keep
1173 // restarting until no more updates are scheduled.
1174 didScheduleRenderPhaseUpdate = false;
1175 numberOfReRenders += 1; // Start over from the beginning of the list
1176
1177 workInProgressHook = null;
1178 children = Component(props, refOrContext);
1179 }
1180
1181 currentlyRenderingComponent = null;
1182 firstWorkInProgressHook = null;
1183 numberOfReRenders = 0;
1184 renderPhaseUpdates = null;
1185 workInProgressHook = null;
1186
1187 {
1188 isInHookUserCodeInDev = false;
1189 } // These were reset above
1190 // currentlyRenderingComponent = null;
1191 // didScheduleRenderPhaseUpdate = false;
1192 // firstWorkInProgressHook = null;
1193 // numberOfReRenders = 0;
1194 // renderPhaseUpdates = null;
1195 // workInProgressHook = null;
1196
1197
1198 return children;
1199 }
1200
1201 function readContext(context, observedBits) {
1202 var threadID = currentThreadID;
1203 validateContextBounds(context, threadID);
1204
1205 {
1206 if (isInHookUserCodeInDev) {
1207 error('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().');
1208 }
1209 }
1210
1211 return context[threadID];
1212 }
1213
1214 function useContext(context, observedBits) {
1215 {
1216 currentHookNameInDev = 'useContext';
1217 }
1218
1219 resolveCurrentlyRenderingComponent();
1220 var threadID = currentThreadID;
1221 validateContextBounds(context, threadID);
1222 return context[threadID];
1223 }
1224
1225 function basicStateReducer(state, action) {
1226 // $FlowFixMe: Flow doesn't like mixed types
1227 return typeof action === 'function' ? action(state) : action;
1228 }
1229
1230 function useState(initialState) {
1231 {
1232 currentHookNameInDev = 'useState';
1233 }
1234
1235 return useReducer(basicStateReducer, // useReducer has a special case to support lazy useState initializers
1236 initialState);
1237 }
1238 function useReducer(reducer, initialArg, init) {
1239 {
1240 if (reducer !== basicStateReducer) {
1241 currentHookNameInDev = 'useReducer';
1242 }
1243 }
1244
1245 currentlyRenderingComponent = resolveCurrentlyRenderingComponent();
1246 workInProgressHook = createWorkInProgressHook();
1247
1248 if (isReRender) {
1249 // This is a re-render. Apply the new render phase updates to the previous
1250 // current hook.
1251 var queue = workInProgressHook.queue;
1252 var dispatch = queue.dispatch;
1253
1254 if (renderPhaseUpdates !== null) {
1255 // Render phase updates are stored in a map of queue -> linked list
1256 var firstRenderPhaseUpdate = renderPhaseUpdates.get(queue);
1257
1258 if (firstRenderPhaseUpdate !== undefined) {
1259 renderPhaseUpdates.delete(queue);
1260 var newState = workInProgressHook.memoizedState;
1261 var update = firstRenderPhaseUpdate;
1262
1263 do {
1264 // Process this render phase update. We don't have to check the
1265 // priority because it will always be the same as the current
1266 // render's.
1267 var action = update.action;
1268
1269 {
1270 isInHookUserCodeInDev = true;
1271 }
1272
1273 newState = reducer(newState, action);
1274
1275 {
1276 isInHookUserCodeInDev = false;
1277 }
1278
1279 update = update.next;
1280 } while (update !== null);
1281
1282 workInProgressHook.memoizedState = newState;
1283 return [newState, dispatch];
1284 }
1285 }
1286
1287 return [workInProgressHook.memoizedState, dispatch];
1288 } else {
1289 {
1290 isInHookUserCodeInDev = true;
1291 }
1292
1293 var initialState;
1294
1295 if (reducer === basicStateReducer) {
1296 // Special case for `useState`.
1297 initialState = typeof initialArg === 'function' ? initialArg() : initialArg;
1298 } else {
1299 initialState = init !== undefined ? init(initialArg) : initialArg;
1300 }
1301
1302 {
1303 isInHookUserCodeInDev = false;
1304 }
1305
1306 workInProgressHook.memoizedState = initialState;
1307
1308 var _queue = workInProgressHook.queue = {
1309 last: null,
1310 dispatch: null
1311 };
1312
1313 var _dispatch = _queue.dispatch = dispatchAction.bind(null, currentlyRenderingComponent, _queue);
1314
1315 return [workInProgressHook.memoizedState, _dispatch];
1316 }
1317 }
1318
1319 function useMemo(nextCreate, deps) {
1320 currentlyRenderingComponent = resolveCurrentlyRenderingComponent();
1321 workInProgressHook = createWorkInProgressHook();
1322 var nextDeps = deps === undefined ? null : deps;
1323
1324 if (workInProgressHook !== null) {
1325 var prevState = workInProgressHook.memoizedState;
1326
1327 if (prevState !== null) {
1328 if (nextDeps !== null) {
1329 var prevDeps = prevState[1];
1330
1331 if (areHookInputsEqual(nextDeps, prevDeps)) {
1332 return prevState[0];
1333 }
1334 }
1335 }
1336 }
1337
1338 {
1339 isInHookUserCodeInDev = true;
1340 }
1341
1342 var nextValue = nextCreate();
1343
1344 {
1345 isInHookUserCodeInDev = false;
1346 }
1347
1348 workInProgressHook.memoizedState = [nextValue, nextDeps];
1349 return nextValue;
1350 }
1351
1352 function useRef(initialValue) {
1353 currentlyRenderingComponent = resolveCurrentlyRenderingComponent();
1354 workInProgressHook = createWorkInProgressHook();
1355 var previousRef = workInProgressHook.memoizedState;
1356
1357 if (previousRef === null) {
1358 var ref = {
1359 current: initialValue
1360 };
1361
1362 {
1363 Object.seal(ref);
1364 }
1365
1366 workInProgressHook.memoizedState = ref;
1367 return ref;
1368 } else {
1369 return previousRef;
1370 }
1371 }
1372
1373 function useLayoutEffect(create, inputs) {
1374 {
1375 currentHookNameInDev = 'useLayoutEffect';
1376
1377 error('useLayoutEffect does nothing on the server, because its effect cannot ' + "be encoded into the server renderer's output format. This will lead " + 'to a mismatch between the initial, non-hydrated UI and the intended ' + 'UI. To avoid this, useLayoutEffect should only be used in ' + 'components that render exclusively on the client. ' + 'See https://fb.me/react-uselayouteffect-ssr for common fixes.');
1378 }
1379 }
1380
1381 function dispatchAction(componentIdentity, queue, action) {
1382 if (!(numberOfReRenders < RE_RENDER_LIMIT)) {
1383 {
1384 throw Error( "Too many re-renders. React limits the number of renders to prevent an infinite loop." );
1385 }
1386 }
1387
1388 if (componentIdentity === currentlyRenderingComponent) {
1389 // This is a render phase update. Stash it in a lazily-created map of
1390 // queue -> linked list of updates. After this render pass, we'll restart
1391 // and apply the stashed updates on top of the work-in-progress hook.
1392 didScheduleRenderPhaseUpdate = true;
1393 var update = {
1394 action: action,
1395 next: null
1396 };
1397
1398 if (renderPhaseUpdates === null) {
1399 renderPhaseUpdates = new Map();
1400 }
1401
1402 var firstRenderPhaseUpdate = renderPhaseUpdates.get(queue);
1403
1404 if (firstRenderPhaseUpdate === undefined) {
1405 renderPhaseUpdates.set(queue, update);
1406 } else {
1407 // Append the update to the end of the list.
1408 var lastRenderPhaseUpdate = firstRenderPhaseUpdate;
1409
1410 while (lastRenderPhaseUpdate.next !== null) {
1411 lastRenderPhaseUpdate = lastRenderPhaseUpdate.next;
1412 }
1413
1414 lastRenderPhaseUpdate.next = update;
1415 }
1416 }
1417 }
1418
1419 function useCallback(callback, deps) {
1420 // Callbacks are passed as they are in the server environment.
1421 return callback;
1422 }
1423
1424 function useResponder(responder, props) {
1425 return {
1426 props: props,
1427 responder: responder
1428 };
1429 }
1430
1431 function useDeferredValue(value, config) {
1432 resolveCurrentlyRenderingComponent();
1433 return value;
1434 }
1435
1436 function useTransition(config) {
1437 resolveCurrentlyRenderingComponent();
1438
1439 var startTransition = function (callback) {
1440 callback();
1441 };
1442
1443 return [startTransition, false];
1444 }
1445
1446 function noop() {}
1447
1448 var currentThreadID = 0;
1449 function setCurrentThreadID(threadID) {
1450 currentThreadID = threadID;
1451 }
1452 var Dispatcher = {
1453 readContext: readContext,
1454 useContext: useContext,
1455 useMemo: useMemo,
1456 useReducer: useReducer,
1457 useRef: useRef,
1458 useState: useState,
1459 useLayoutEffect: useLayoutEffect,
1460 useCallback: useCallback,
1461 // useImperativeHandle is not run in the server environment
1462 useImperativeHandle: noop,
1463 // Effects are not run in the server environment.
1464 useEffect: noop,
1465 // Debugging effect
1466 useDebugValue: noop,
1467 useResponder: useResponder,
1468 useDeferredValue: useDeferredValue,
1469 useTransition: useTransition
1470 };
1471
1472 var HTML_NAMESPACE = 'http://www.w3.org/1999/xhtml';
1473 var MATH_NAMESPACE = 'http://www.w3.org/1998/Math/MathML';
1474 var SVG_NAMESPACE = 'http://www.w3.org/2000/svg';
1475 var Namespaces = {
1476 html: HTML_NAMESPACE,
1477 mathml: MATH_NAMESPACE,
1478 svg: SVG_NAMESPACE
1479 }; // Assumes there is no parent namespace.
1480
1481 function getIntrinsicNamespace(type) {
1482 switch (type) {
1483 case 'svg':
1484 return SVG_NAMESPACE;
1485
1486 case 'math':
1487 return MATH_NAMESPACE;
1488
1489 default:
1490 return HTML_NAMESPACE;
1491 }
1492 }
1493 function getChildNamespace(parentNamespace, type) {
1494 if (parentNamespace == null || parentNamespace === HTML_NAMESPACE) {
1495 // No (or default) parent namespace: potential entry point.
1496 return getIntrinsicNamespace(type);
1497 }
1498
1499 if (parentNamespace === SVG_NAMESPACE && type === 'foreignObject') {
1500 // We're leaving SVG.
1501 return HTML_NAMESPACE;
1502 } // By default, pass namespace below.
1503
1504
1505 return parentNamespace;
1506 }
1507
1508 var ReactDebugCurrentFrame$2 = null;
1509 var ReactControlledValuePropTypes = {
1510 checkPropTypes: null
1511 };
1512
1513 {
1514 ReactDebugCurrentFrame$2 = ReactSharedInternals.ReactDebugCurrentFrame;
1515 var hasReadOnlyValue = {
1516 button: true,
1517 checkbox: true,
1518 image: true,
1519 hidden: true,
1520 radio: true,
1521 reset: true,
1522 submit: true
1523 };
1524 var propTypes = {
1525 value: function (props, propName, componentName) {
1526 if (hasReadOnlyValue[props.type] || props.onChange || props.readOnly || props.disabled || props[propName] == null || enableDeprecatedFlareAPI ) {
1527 return null;
1528 }
1529
1530 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`.');
1531 },
1532 checked: function (props, propName, componentName) {
1533 if (props.onChange || props.readOnly || props.disabled || props[propName] == null || enableDeprecatedFlareAPI ) {
1534 return null;
1535 }
1536
1537 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`.');
1538 }
1539 };
1540 /**
1541 * Provide a linked `value` attribute for controlled forms. You should not use
1542 * this outside of the ReactDOM controlled form components.
1543 */
1544
1545 ReactControlledValuePropTypes.checkPropTypes = function (tagName, props) {
1546 checkPropTypes_1(propTypes, props, 'prop', tagName, ReactDebugCurrentFrame$2.getStackAddendum);
1547 };
1548 }
1549
1550 // For HTML, certain tags should omit their close tag. We keep a whitelist for
1551 // those special-case tags.
1552 var omittedCloseTags = {
1553 area: true,
1554 base: true,
1555 br: true,
1556 col: true,
1557 embed: true,
1558 hr: true,
1559 img: true,
1560 input: true,
1561 keygen: true,
1562 link: true,
1563 meta: true,
1564 param: true,
1565 source: true,
1566 track: true,
1567 wbr: true // NOTE: menuitem's close tag should be omitted, but that causes problems.
1568
1569 };
1570
1571 // `omittedCloseTags` except that `menuitem` should still have its closing tag.
1572
1573 var voidElementTags = _assign({
1574 menuitem: true
1575 }, omittedCloseTags);
1576
1577 var HTML = '__html';
1578 var ReactDebugCurrentFrame$3 = null;
1579
1580 {
1581 ReactDebugCurrentFrame$3 = ReactSharedInternals.ReactDebugCurrentFrame;
1582 }
1583
1584 function assertValidProps(tag, props) {
1585 if (!props) {
1586 return;
1587 } // Note the use of `==` which checks for null or undefined.
1588
1589
1590 if (voidElementTags[tag]) {
1591 if (!(props.children == null && props.dangerouslySetInnerHTML == null)) {
1592 {
1593 throw Error( tag + " is a void element tag and must neither have `children` nor use `dangerouslySetInnerHTML`." + ( ReactDebugCurrentFrame$3.getStackAddendum() ) );
1594 }
1595 }
1596 }
1597
1598 if (props.dangerouslySetInnerHTML != null) {
1599 if (!(props.children == null)) {
1600 {
1601 throw Error( "Can only set one of `children` or `props.dangerouslySetInnerHTML`." );
1602 }
1603 }
1604
1605 if (!(typeof props.dangerouslySetInnerHTML === 'object' && HTML in props.dangerouslySetInnerHTML)) {
1606 {
1607 throw Error( "`props.dangerouslySetInnerHTML` must be in the form `{__html: ...}`. Please visit https://fb.me/react-invariant-dangerously-set-inner-html for more information." );
1608 }
1609 }
1610 }
1611
1612 {
1613 if (!props.suppressContentEditableWarning && props.contentEditable && props.children != null) {
1614 error('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.');
1615 }
1616 }
1617
1618 if (!(props.style == null || typeof props.style === 'object')) {
1619 {
1620 throw Error( "The `style` prop expects a mapping from style properties to values, not a string. For example, style={{marginRight: spacing + 'em'}} when using JSX." + ( ReactDebugCurrentFrame$3.getStackAddendum() ) );
1621 }
1622 }
1623 }
1624
1625 /**
1626 * CSS properties which accept numbers but are not in units of "px".
1627 */
1628 var isUnitlessNumber = {
1629 animationIterationCount: true,
1630 borderImageOutset: true,
1631 borderImageSlice: true,
1632 borderImageWidth: true,
1633 boxFlex: true,
1634 boxFlexGroup: true,
1635 boxOrdinalGroup: true,
1636 columnCount: true,
1637 columns: true,
1638 flex: true,
1639 flexGrow: true,
1640 flexPositive: true,
1641 flexShrink: true,
1642 flexNegative: true,
1643 flexOrder: true,
1644 gridArea: true,
1645 gridRow: true,
1646 gridRowEnd: true,
1647 gridRowSpan: true,
1648 gridRowStart: true,
1649 gridColumn: true,
1650 gridColumnEnd: true,
1651 gridColumnSpan: true,
1652 gridColumnStart: true,
1653 fontWeight: true,
1654 lineClamp: true,
1655 lineHeight: true,
1656 opacity: true,
1657 order: true,
1658 orphans: true,
1659 tabSize: true,
1660 widows: true,
1661 zIndex: true,
1662 zoom: true,
1663 // SVG-related properties
1664 fillOpacity: true,
1665 floodOpacity: true,
1666 stopOpacity: true,
1667 strokeDasharray: true,
1668 strokeDashoffset: true,
1669 strokeMiterlimit: true,
1670 strokeOpacity: true,
1671 strokeWidth: true
1672 };
1673 /**
1674 * @param {string} prefix vendor-specific prefix, eg: Webkit
1675 * @param {string} key style name, eg: transitionDuration
1676 * @return {string} style name prefixed with `prefix`, properly camelCased, eg:
1677 * WebkitTransitionDuration
1678 */
1679
1680 function prefixKey(prefix, key) {
1681 return prefix + key.charAt(0).toUpperCase() + key.substring(1);
1682 }
1683 /**
1684 * Support style names that may come passed in prefixed by adding permutations
1685 * of vendor prefixes.
1686 */
1687
1688
1689 var prefixes = ['Webkit', 'ms', 'Moz', 'O']; // Using Object.keys here, or else the vanilla for-in loop makes IE8 go into an
1690 // infinite loop, because it iterates over the newly added props too.
1691
1692 Object.keys(isUnitlessNumber).forEach(function (prop) {
1693 prefixes.forEach(function (prefix) {
1694 isUnitlessNumber[prefixKey(prefix, prop)] = isUnitlessNumber[prop];
1695 });
1696 });
1697
1698 /**
1699 * Convert a value into the proper css writable value. The style name `name`
1700 * should be logical (no hyphens), as specified
1701 * in `CSSProperty.isUnitlessNumber`.
1702 *
1703 * @param {string} name CSS property name such as `topMargin`.
1704 * @param {*} value CSS property value such as `10px`.
1705 * @return {string} Normalized style value with dimensions applied.
1706 */
1707
1708 function dangerousStyleValue(name, value, isCustomProperty) {
1709 // Note that we've removed escapeTextForBrowser() calls here since the
1710 // whole string will be escaped when the attribute is injected into
1711 // the markup. If you provide unsafe user data here they can inject
1712 // arbitrary CSS which may be problematic (I couldn't repro this):
1713 // https://www.owasp.org/index.php/XSS_Filter_Evasion_Cheat_Sheet
1714 // http://www.thespanner.co.uk/2007/11/26/ultimate-xss-css-injection/
1715 // This is not an XSS hole but instead a potential CSS injection issue
1716 // which has lead to a greater discussion about how we're going to
1717 // trust URLs moving forward. See #2115901
1718 var isEmpty = value == null || typeof value === 'boolean' || value === '';
1719
1720 if (isEmpty) {
1721 return '';
1722 }
1723
1724 if (!isCustomProperty && typeof value === 'number' && value !== 0 && !(isUnitlessNumber.hasOwnProperty(name) && isUnitlessNumber[name])) {
1725 return value + 'px'; // Presumes implicit 'px' suffix for unitless numbers
1726 }
1727
1728 return ('' + value).trim();
1729 }
1730
1731 var uppercasePattern = /([A-Z])/g;
1732 var msPattern = /^ms-/;
1733 /**
1734 * Hyphenates a camelcased CSS property name, for example:
1735 *
1736 * > hyphenateStyleName('backgroundColor')
1737 * < "background-color"
1738 * > hyphenateStyleName('MozTransition')
1739 * < "-moz-transition"
1740 * > hyphenateStyleName('msTransition')
1741 * < "-ms-transition"
1742 *
1743 * As Modernizr suggests (http://modernizr.com/docs/#prefixed), an `ms` prefix
1744 * is converted to `-ms-`.
1745 */
1746
1747 function hyphenateStyleName(name) {
1748 return name.replace(uppercasePattern, '-$1').toLowerCase().replace(msPattern, '-ms-');
1749 }
1750
1751 function isCustomComponent(tagName, props) {
1752 if (tagName.indexOf('-') === -1) {
1753 return typeof props.is === 'string';
1754 }
1755
1756 switch (tagName) {
1757 // These are reserved SVG and MathML elements.
1758 // We don't mind this whitelist too much because we expect it to never grow.
1759 // The alternative is to track the namespace in a few places which is convoluted.
1760 // https://w3c.github.io/webcomponents/spec/custom/#custom-elements-core-concepts
1761 case 'annotation-xml':
1762 case 'color-profile':
1763 case 'font-face':
1764 case 'font-face-src':
1765 case 'font-face-uri':
1766 case 'font-face-format':
1767 case 'font-face-name':
1768 case 'missing-glyph':
1769 return false;
1770
1771 default:
1772 return true;
1773 }
1774 }
1775
1776 var warnValidStyle = function () {};
1777
1778 {
1779 // 'msTransform' is correct, but the other prefixes should be capitalized
1780 var badVendoredStyleNamePattern = /^(?:webkit|moz|o)[A-Z]/;
1781 var msPattern$1 = /^-ms-/;
1782 var hyphenPattern = /-(.)/g; // style values shouldn't contain a semicolon
1783
1784 var badStyleValueWithSemicolonPattern = /;\s*$/;
1785 var warnedStyleNames = {};
1786 var warnedStyleValues = {};
1787 var warnedForNaNValue = false;
1788 var warnedForInfinityValue = false;
1789
1790 var camelize = function (string) {
1791 return string.replace(hyphenPattern, function (_, character) {
1792 return character.toUpperCase();
1793 });
1794 };
1795
1796 var warnHyphenatedStyleName = function (name) {
1797 if (warnedStyleNames.hasOwnProperty(name) && warnedStyleNames[name]) {
1798 return;
1799 }
1800
1801 warnedStyleNames[name] = true;
1802
1803 error('Unsupported style property %s. Did you mean %s?', name, // As Andi Smith suggests
1804 // (http://www.andismith.com/blog/2012/02/modernizr-prefixed/), an `-ms` prefix
1805 // is converted to lowercase `ms`.
1806 camelize(name.replace(msPattern$1, 'ms-')));
1807 };
1808
1809 var warnBadVendoredStyleName = function (name) {
1810 if (warnedStyleNames.hasOwnProperty(name) && warnedStyleNames[name]) {
1811 return;
1812 }
1813
1814 warnedStyleNames[name] = true;
1815
1816 error('Unsupported vendor-prefixed style property %s. Did you mean %s?', name, name.charAt(0).toUpperCase() + name.slice(1));
1817 };
1818
1819 var warnStyleValueWithSemicolon = function (name, value) {
1820 if (warnedStyleValues.hasOwnProperty(value) && warnedStyleValues[value]) {
1821 return;
1822 }
1823
1824 warnedStyleValues[value] = true;
1825
1826 error("Style property values shouldn't contain a semicolon. " + 'Try "%s: %s" instead.', name, value.replace(badStyleValueWithSemicolonPattern, ''));
1827 };
1828
1829 var warnStyleValueIsNaN = function (name, value) {
1830 if (warnedForNaNValue) {
1831 return;
1832 }
1833
1834 warnedForNaNValue = true;
1835
1836 error('`NaN` is an invalid value for the `%s` css style property.', name);
1837 };
1838
1839 var warnStyleValueIsInfinity = function (name, value) {
1840 if (warnedForInfinityValue) {
1841 return;
1842 }
1843
1844 warnedForInfinityValue = true;
1845
1846 error('`Infinity` is an invalid value for the `%s` css style property.', name);
1847 };
1848
1849 warnValidStyle = function (name, value) {
1850 if (name.indexOf('-') > -1) {
1851 warnHyphenatedStyleName(name);
1852 } else if (badVendoredStyleNamePattern.test(name)) {
1853 warnBadVendoredStyleName(name);
1854 } else if (badStyleValueWithSemicolonPattern.test(value)) {
1855 warnStyleValueWithSemicolon(name, value);
1856 }
1857
1858 if (typeof value === 'number') {
1859 if (isNaN(value)) {
1860 warnStyleValueIsNaN(name, value);
1861 } else if (!isFinite(value)) {
1862 warnStyleValueIsInfinity(name, value);
1863 }
1864 }
1865 };
1866 }
1867
1868 var warnValidStyle$1 = warnValidStyle;
1869
1870 var ariaProperties = {
1871 'aria-current': 0,
1872 // state
1873 'aria-details': 0,
1874 'aria-disabled': 0,
1875 // state
1876 'aria-hidden': 0,
1877 // state
1878 'aria-invalid': 0,
1879 // state
1880 'aria-keyshortcuts': 0,
1881 'aria-label': 0,
1882 'aria-roledescription': 0,
1883 // Widget Attributes
1884 'aria-autocomplete': 0,
1885 'aria-checked': 0,
1886 'aria-expanded': 0,
1887 'aria-haspopup': 0,
1888 'aria-level': 0,
1889 'aria-modal': 0,
1890 'aria-multiline': 0,
1891 'aria-multiselectable': 0,
1892 'aria-orientation': 0,
1893 'aria-placeholder': 0,
1894 'aria-pressed': 0,
1895 'aria-readonly': 0,
1896 'aria-required': 0,
1897 'aria-selected': 0,
1898 'aria-sort': 0,
1899 'aria-valuemax': 0,
1900 'aria-valuemin': 0,
1901 'aria-valuenow': 0,
1902 'aria-valuetext': 0,
1903 // Live Region Attributes
1904 'aria-atomic': 0,
1905 'aria-busy': 0,
1906 'aria-live': 0,
1907 'aria-relevant': 0,
1908 // Drag-and-Drop Attributes
1909 'aria-dropeffect': 0,
1910 'aria-grabbed': 0,
1911 // Relationship Attributes
1912 'aria-activedescendant': 0,
1913 'aria-colcount': 0,
1914 'aria-colindex': 0,
1915 'aria-colspan': 0,
1916 'aria-controls': 0,
1917 'aria-describedby': 0,
1918 'aria-errormessage': 0,
1919 'aria-flowto': 0,
1920 'aria-labelledby': 0,
1921 'aria-owns': 0,
1922 'aria-posinset': 0,
1923 'aria-rowcount': 0,
1924 'aria-rowindex': 0,
1925 'aria-rowspan': 0,
1926 'aria-setsize': 0
1927 };
1928
1929 var warnedProperties = {};
1930 var rARIA = new RegExp('^(aria)-[' + ATTRIBUTE_NAME_CHAR + ']*$');
1931 var rARIACamel = new RegExp('^(aria)[A-Z][' + ATTRIBUTE_NAME_CHAR + ']*$');
1932 var hasOwnProperty$1 = Object.prototype.hasOwnProperty;
1933
1934 function validateProperty(tagName, name) {
1935 {
1936 if (hasOwnProperty$1.call(warnedProperties, name) && warnedProperties[name]) {
1937 return true;
1938 }
1939
1940 if (rARIACamel.test(name)) {
1941 var ariaName = 'aria-' + name.slice(4).toLowerCase();
1942 var correctName = ariaProperties.hasOwnProperty(ariaName) ? ariaName : null; // If this is an aria-* attribute, but is not listed in the known DOM
1943 // DOM properties, then it is an invalid aria-* attribute.
1944
1945 if (correctName == null) {
1946 error('Invalid ARIA attribute `%s`. ARIA attributes follow the pattern aria-* and must be lowercase.', name);
1947
1948 warnedProperties[name] = true;
1949 return true;
1950 } // aria-* attributes should be lowercase; suggest the lowercase version.
1951
1952
1953 if (name !== correctName) {
1954 error('Invalid ARIA attribute `%s`. Did you mean `%s`?', name, correctName);
1955
1956 warnedProperties[name] = true;
1957 return true;
1958 }
1959 }
1960
1961 if (rARIA.test(name)) {
1962 var lowerCasedName = name.toLowerCase();
1963 var standardName = ariaProperties.hasOwnProperty(lowerCasedName) ? lowerCasedName : null; // If this is an aria-* attribute, but is not listed in the known DOM
1964 // DOM properties, then it is an invalid aria-* attribute.
1965
1966 if (standardName == null) {
1967 warnedProperties[name] = true;
1968 return false;
1969 } // aria-* attributes should be lowercase; suggest the lowercase version.
1970
1971
1972 if (name !== standardName) {
1973 error('Unknown ARIA attribute `%s`. Did you mean `%s`?', name, standardName);
1974
1975 warnedProperties[name] = true;
1976 return true;
1977 }
1978 }
1979 }
1980
1981 return true;
1982 }
1983
1984 function warnInvalidARIAProps(type, props) {
1985 {
1986 var invalidProps = [];
1987
1988 for (var key in props) {
1989 var isValid = validateProperty(type, key);
1990
1991 if (!isValid) {
1992 invalidProps.push(key);
1993 }
1994 }
1995
1996 var unknownPropString = invalidProps.map(function (prop) {
1997 return '`' + prop + '`';
1998 }).join(', ');
1999
2000 if (invalidProps.length === 1) {
2001 error('Invalid aria prop %s on <%s> tag. ' + 'For details, see https://fb.me/invalid-aria-prop', unknownPropString, type);
2002 } else if (invalidProps.length > 1) {
2003 error('Invalid aria props %s on <%s> tag. ' + 'For details, see https://fb.me/invalid-aria-prop', unknownPropString, type);
2004 }
2005 }
2006 }
2007
2008 function validateProperties(type, props) {
2009 if (isCustomComponent(type, props)) {
2010 return;
2011 }
2012
2013 warnInvalidARIAProps(type, props);
2014 }
2015
2016 var didWarnValueNull = false;
2017 function validateProperties$1(type, props) {
2018 {
2019 if (type !== 'input' && type !== 'textarea' && type !== 'select') {
2020 return;
2021 }
2022
2023 if (props != null && props.value === null && !didWarnValueNull) {
2024 didWarnValueNull = true;
2025
2026 if (type === 'select' && props.multiple) {
2027 error('`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);
2028 } else {
2029 error('`value` prop on `%s` should not be null. ' + 'Consider using an empty string to clear the component or `undefined` ' + 'for uncontrolled components.', type);
2030 }
2031 }
2032 }
2033 }
2034
2035 /**
2036 * Mapping from registration name to plugin module
2037 */
2038
2039 var registrationNameModules = {};
2040 /**
2041 * Mapping from lowercase registration names to the properly cased version,
2042 * used to warn in the case of missing event handlers. Available
2043 * only in true.
2044 * @type {Object}
2045 */
2046
2047 var possibleRegistrationNames = {} ; // Trust the developer to only use possibleRegistrationNames in true
2048
2049 // When adding attributes to the HTML or SVG whitelist, be sure to
2050 // also add them to this module to ensure casing and incorrect name
2051 // warnings.
2052 var possibleStandardNames = {
2053 // HTML
2054 accept: 'accept',
2055 acceptcharset: 'acceptCharset',
2056 'accept-charset': 'acceptCharset',
2057 accesskey: 'accessKey',
2058 action: 'action',
2059 allowfullscreen: 'allowFullScreen',
2060 alt: 'alt',
2061 as: 'as',
2062 async: 'async',
2063 autocapitalize: 'autoCapitalize',
2064 autocomplete: 'autoComplete',
2065 autocorrect: 'autoCorrect',
2066 autofocus: 'autoFocus',
2067 autoplay: 'autoPlay',
2068 autosave: 'autoSave',
2069 capture: 'capture',
2070 cellpadding: 'cellPadding',
2071 cellspacing: 'cellSpacing',
2072 challenge: 'challenge',
2073 charset: 'charSet',
2074 checked: 'checked',
2075 children: 'children',
2076 cite: 'cite',
2077 class: 'className',
2078 classid: 'classID',
2079 classname: 'className',
2080 cols: 'cols',
2081 colspan: 'colSpan',
2082 content: 'content',
2083 contenteditable: 'contentEditable',
2084 contextmenu: 'contextMenu',
2085 controls: 'controls',
2086 controlslist: 'controlsList',
2087 coords: 'coords',
2088 crossorigin: 'crossOrigin',
2089 dangerouslysetinnerhtml: 'dangerouslySetInnerHTML',
2090 data: 'data',
2091 datetime: 'dateTime',
2092 default: 'default',
2093 defaultchecked: 'defaultChecked',
2094 defaultvalue: 'defaultValue',
2095 defer: 'defer',
2096 dir: 'dir',
2097 disabled: 'disabled',
2098 disablepictureinpicture: 'disablePictureInPicture',
2099 download: 'download',
2100 draggable: 'draggable',
2101 enctype: 'encType',
2102 for: 'htmlFor',
2103 form: 'form',
2104 formmethod: 'formMethod',
2105 formaction: 'formAction',
2106 formenctype: 'formEncType',
2107 formnovalidate: 'formNoValidate',
2108 formtarget: 'formTarget',
2109 frameborder: 'frameBorder',
2110 headers: 'headers',
2111 height: 'height',
2112 hidden: 'hidden',
2113 high: 'high',
2114 href: 'href',
2115 hreflang: 'hrefLang',
2116 htmlfor: 'htmlFor',
2117 httpequiv: 'httpEquiv',
2118 'http-equiv': 'httpEquiv',
2119 icon: 'icon',
2120 id: 'id',
2121 innerhtml: 'innerHTML',
2122 inputmode: 'inputMode',
2123 integrity: 'integrity',
2124 is: 'is',
2125 itemid: 'itemID',
2126 itemprop: 'itemProp',
2127 itemref: 'itemRef',
2128 itemscope: 'itemScope',
2129 itemtype: 'itemType',
2130 keyparams: 'keyParams',
2131 keytype: 'keyType',
2132 kind: 'kind',
2133 label: 'label',
2134 lang: 'lang',
2135 list: 'list',
2136 loop: 'loop',
2137 low: 'low',
2138 manifest: 'manifest',
2139 marginwidth: 'marginWidth',
2140 marginheight: 'marginHeight',
2141 max: 'max',
2142 maxlength: 'maxLength',
2143 media: 'media',
2144 mediagroup: 'mediaGroup',
2145 method: 'method',
2146 min: 'min',
2147 minlength: 'minLength',
2148 multiple: 'multiple',
2149 muted: 'muted',
2150 name: 'name',
2151 nomodule: 'noModule',
2152 nonce: 'nonce',
2153 novalidate: 'noValidate',
2154 open: 'open',
2155 optimum: 'optimum',
2156 pattern: 'pattern',
2157 placeholder: 'placeholder',
2158 playsinline: 'playsInline',
2159 poster: 'poster',
2160 preload: 'preload',
2161 profile: 'profile',
2162 radiogroup: 'radioGroup',
2163 readonly: 'readOnly',
2164 referrerpolicy: 'referrerPolicy',
2165 rel: 'rel',
2166 required: 'required',
2167 reversed: 'reversed',
2168 role: 'role',
2169 rows: 'rows',
2170 rowspan: 'rowSpan',
2171 sandbox: 'sandbox',
2172 scope: 'scope',
2173 scoped: 'scoped',
2174 scrolling: 'scrolling',
2175 seamless: 'seamless',
2176 selected: 'selected',
2177 shape: 'shape',
2178 size: 'size',
2179 sizes: 'sizes',
2180 span: 'span',
2181 spellcheck: 'spellCheck',
2182 src: 'src',
2183 srcdoc: 'srcDoc',
2184 srclang: 'srcLang',
2185 srcset: 'srcSet',
2186 start: 'start',
2187 step: 'step',
2188 style: 'style',
2189 summary: 'summary',
2190 tabindex: 'tabIndex',
2191 target: 'target',
2192 title: 'title',
2193 type: 'type',
2194 usemap: 'useMap',
2195 value: 'value',
2196 width: 'width',
2197 wmode: 'wmode',
2198 wrap: 'wrap',
2199 // SVG
2200 about: 'about',
2201 accentheight: 'accentHeight',
2202 'accent-height': 'accentHeight',
2203 accumulate: 'accumulate',
2204 additive: 'additive',
2205 alignmentbaseline: 'alignmentBaseline',
2206 'alignment-baseline': 'alignmentBaseline',
2207 allowreorder: 'allowReorder',
2208 alphabetic: 'alphabetic',
2209 amplitude: 'amplitude',
2210 arabicform: 'arabicForm',
2211 'arabic-form': 'arabicForm',
2212 ascent: 'ascent',
2213 attributename: 'attributeName',
2214 attributetype: 'attributeType',
2215 autoreverse: 'autoReverse',
2216 azimuth: 'azimuth',
2217 basefrequency: 'baseFrequency',
2218 baselineshift: 'baselineShift',
2219 'baseline-shift': 'baselineShift',
2220 baseprofile: 'baseProfile',
2221 bbox: 'bbox',
2222 begin: 'begin',
2223 bias: 'bias',
2224 by: 'by',
2225 calcmode: 'calcMode',
2226 capheight: 'capHeight',
2227 'cap-height': 'capHeight',
2228 clip: 'clip',
2229 clippath: 'clipPath',
2230 'clip-path': 'clipPath',
2231 clippathunits: 'clipPathUnits',
2232 cliprule: 'clipRule',
2233 'clip-rule': 'clipRule',
2234 color: 'color',
2235 colorinterpolation: 'colorInterpolation',
2236 'color-interpolation': 'colorInterpolation',
2237 colorinterpolationfilters: 'colorInterpolationFilters',
2238 'color-interpolation-filters': 'colorInterpolationFilters',
2239 colorprofile: 'colorProfile',
2240 'color-profile': 'colorProfile',
2241 colorrendering: 'colorRendering',
2242 'color-rendering': 'colorRendering',
2243 contentscripttype: 'contentScriptType',
2244 contentstyletype: 'contentStyleType',
2245 cursor: 'cursor',
2246 cx: 'cx',
2247 cy: 'cy',
2248 d: 'd',
2249 datatype: 'datatype',
2250 decelerate: 'decelerate',
2251 descent: 'descent',
2252 diffuseconstant: 'diffuseConstant',
2253 direction: 'direction',
2254 display: 'display',
2255 divisor: 'divisor',
2256 dominantbaseline: 'dominantBaseline',
2257 'dominant-baseline': 'dominantBaseline',
2258 dur: 'dur',
2259 dx: 'dx',
2260 dy: 'dy',
2261 edgemode: 'edgeMode',
2262 elevation: 'elevation',
2263 enablebackground: 'enableBackground',
2264 'enable-background': 'enableBackground',
2265 end: 'end',
2266 exponent: 'exponent',
2267 externalresourcesrequired: 'externalResourcesRequired',
2268 fill: 'fill',
2269 fillopacity: 'fillOpacity',
2270 'fill-opacity': 'fillOpacity',
2271 fillrule: 'fillRule',
2272 'fill-rule': 'fillRule',
2273 filter: 'filter',
2274 filterres: 'filterRes',
2275 filterunits: 'filterUnits',
2276 floodopacity: 'floodOpacity',
2277 'flood-opacity': 'floodOpacity',
2278 floodcolor: 'floodColor',
2279 'flood-color': 'floodColor',
2280 focusable: 'focusable',
2281 fontfamily: 'fontFamily',
2282 'font-family': 'fontFamily',
2283 fontsize: 'fontSize',
2284 'font-size': 'fontSize',
2285 fontsizeadjust: 'fontSizeAdjust',
2286 'font-size-adjust': 'fontSizeAdjust',
2287 fontstretch: 'fontStretch',
2288 'font-stretch': 'fontStretch',
2289 fontstyle: 'fontStyle',
2290 'font-style': 'fontStyle',
2291 fontvariant: 'fontVariant',
2292 'font-variant': 'fontVariant',
2293 fontweight: 'fontWeight',
2294 'font-weight': 'fontWeight',
2295 format: 'format',
2296 from: 'from',
2297 fx: 'fx',
2298 fy: 'fy',
2299 g1: 'g1',
2300 g2: 'g2',
2301 glyphname: 'glyphName',
2302 'glyph-name': 'glyphName',
2303 glyphorientationhorizontal: 'glyphOrientationHorizontal',
2304 'glyph-orientation-horizontal': 'glyphOrientationHorizontal',
2305 glyphorientationvertical: 'glyphOrientationVertical',
2306 'glyph-orientation-vertical': 'glyphOrientationVertical',
2307 glyphref: 'glyphRef',
2308 gradienttransform: 'gradientTransform',
2309 gradientunits: 'gradientUnits',
2310 hanging: 'hanging',
2311 horizadvx: 'horizAdvX',
2312 'horiz-adv-x': 'horizAdvX',
2313 horizoriginx: 'horizOriginX',
2314 'horiz-origin-x': 'horizOriginX',
2315 ideographic: 'ideographic',
2316 imagerendering: 'imageRendering',
2317 'image-rendering': 'imageRendering',
2318 in2: 'in2',
2319 in: 'in',
2320 inlist: 'inlist',
2321 intercept: 'intercept',
2322 k1: 'k1',
2323 k2: 'k2',
2324 k3: 'k3',
2325 k4: 'k4',
2326 k: 'k',
2327 kernelmatrix: 'kernelMatrix',
2328 kernelunitlength: 'kernelUnitLength',
2329 kerning: 'kerning',
2330 keypoints: 'keyPoints',
2331 keysplines: 'keySplines',
2332 keytimes: 'keyTimes',
2333 lengthadjust: 'lengthAdjust',
2334 letterspacing: 'letterSpacing',
2335 'letter-spacing': 'letterSpacing',
2336 lightingcolor: 'lightingColor',
2337 'lighting-color': 'lightingColor',
2338 limitingconeangle: 'limitingConeAngle',
2339 local: 'local',
2340 markerend: 'markerEnd',
2341 'marker-end': 'markerEnd',
2342 markerheight: 'markerHeight',
2343 markermid: 'markerMid',
2344 'marker-mid': 'markerMid',
2345 markerstart: 'markerStart',
2346 'marker-start': 'markerStart',
2347 markerunits: 'markerUnits',
2348 markerwidth: 'markerWidth',
2349 mask: 'mask',
2350 maskcontentunits: 'maskContentUnits',
2351 maskunits: 'maskUnits',
2352 mathematical: 'mathematical',
2353 mode: 'mode',
2354 numoctaves: 'numOctaves',
2355 offset: 'offset',
2356 opacity: 'opacity',
2357 operator: 'operator',
2358 order: 'order',
2359 orient: 'orient',
2360 orientation: 'orientation',
2361 origin: 'origin',
2362 overflow: 'overflow',
2363 overlineposition: 'overlinePosition',
2364 'overline-position': 'overlinePosition',
2365 overlinethickness: 'overlineThickness',
2366 'overline-thickness': 'overlineThickness',
2367 paintorder: 'paintOrder',
2368 'paint-order': 'paintOrder',
2369 panose1: 'panose1',
2370 'panose-1': 'panose1',
2371 pathlength: 'pathLength',
2372 patterncontentunits: 'patternContentUnits',
2373 patterntransform: 'patternTransform',
2374 patternunits: 'patternUnits',
2375 pointerevents: 'pointerEvents',
2376 'pointer-events': 'pointerEvents',
2377 points: 'points',
2378 pointsatx: 'pointsAtX',
2379 pointsaty: 'pointsAtY',
2380 pointsatz: 'pointsAtZ',
2381 prefix: 'prefix',
2382 preservealpha: 'preserveAlpha',
2383 preserveaspectratio: 'preserveAspectRatio',
2384 primitiveunits: 'primitiveUnits',
2385 property: 'property',
2386 r: 'r',
2387 radius: 'radius',
2388 refx: 'refX',
2389 refy: 'refY',
2390 renderingintent: 'renderingIntent',
2391 'rendering-intent': 'renderingIntent',
2392 repeatcount: 'repeatCount',
2393 repeatdur: 'repeatDur',
2394 requiredextensions: 'requiredExtensions',
2395 requiredfeatures: 'requiredFeatures',
2396 resource: 'resource',
2397 restart: 'restart',
2398 result: 'result',
2399 results: 'results',
2400 rotate: 'rotate',
2401 rx: 'rx',
2402 ry: 'ry',
2403 scale: 'scale',
2404 security: 'security',
2405 seed: 'seed',
2406 shaperendering: 'shapeRendering',
2407 'shape-rendering': 'shapeRendering',
2408 slope: 'slope',
2409 spacing: 'spacing',
2410 specularconstant: 'specularConstant',
2411 specularexponent: 'specularExponent',
2412 speed: 'speed',
2413 spreadmethod: 'spreadMethod',
2414 startoffset: 'startOffset',
2415 stddeviation: 'stdDeviation',
2416 stemh: 'stemh',
2417 stemv: 'stemv',
2418 stitchtiles: 'stitchTiles',
2419 stopcolor: 'stopColor',
2420 'stop-color': 'stopColor',
2421 stopopacity: 'stopOpacity',
2422 'stop-opacity': 'stopOpacity',
2423 strikethroughposition: 'strikethroughPosition',
2424 'strikethrough-position': 'strikethroughPosition',
2425 strikethroughthickness: 'strikethroughThickness',
2426 'strikethrough-thickness': 'strikethroughThickness',
2427 string: 'string',
2428 stroke: 'stroke',
2429 strokedasharray: 'strokeDasharray',
2430 'stroke-dasharray': 'strokeDasharray',
2431 strokedashoffset: 'strokeDashoffset',
2432 'stroke-dashoffset': 'strokeDashoffset',
2433 strokelinecap: 'strokeLinecap',
2434 'stroke-linecap': 'strokeLinecap',
2435 strokelinejoin: 'strokeLinejoin',
2436 'stroke-linejoin': 'strokeLinejoin',
2437 strokemiterlimit: 'strokeMiterlimit',
2438 'stroke-miterlimit': 'strokeMiterlimit',
2439 strokewidth: 'strokeWidth',
2440 'stroke-width': 'strokeWidth',
2441 strokeopacity: 'strokeOpacity',
2442 'stroke-opacity': 'strokeOpacity',
2443 suppresscontenteditablewarning: 'suppressContentEditableWarning',
2444 suppresshydrationwarning: 'suppressHydrationWarning',
2445 surfacescale: 'surfaceScale',
2446 systemlanguage: 'systemLanguage',
2447 tablevalues: 'tableValues',
2448 targetx: 'targetX',
2449 targety: 'targetY',
2450 textanchor: 'textAnchor',
2451 'text-anchor': 'textAnchor',
2452 textdecoration: 'textDecoration',
2453 'text-decoration': 'textDecoration',
2454 textlength: 'textLength',
2455 textrendering: 'textRendering',
2456 'text-rendering': 'textRendering',
2457 to: 'to',
2458 transform: 'transform',
2459 typeof: 'typeof',
2460 u1: 'u1',
2461 u2: 'u2',
2462 underlineposition: 'underlinePosition',
2463 'underline-position': 'underlinePosition',
2464 underlinethickness: 'underlineThickness',
2465 'underline-thickness': 'underlineThickness',
2466 unicode: 'unicode',
2467 unicodebidi: 'unicodeBidi',
2468 'unicode-bidi': 'unicodeBidi',
2469 unicoderange: 'unicodeRange',
2470 'unicode-range': 'unicodeRange',
2471 unitsperem: 'unitsPerEm',
2472 'units-per-em': 'unitsPerEm',
2473 unselectable: 'unselectable',
2474 valphabetic: 'vAlphabetic',
2475 'v-alphabetic': 'vAlphabetic',
2476 values: 'values',
2477 vectoreffect: 'vectorEffect',
2478 'vector-effect': 'vectorEffect',
2479 version: 'version',
2480 vertadvy: 'vertAdvY',
2481 'vert-adv-y': 'vertAdvY',
2482 vertoriginx: 'vertOriginX',
2483 'vert-origin-x': 'vertOriginX',
2484 vertoriginy: 'vertOriginY',
2485 'vert-origin-y': 'vertOriginY',
2486 vhanging: 'vHanging',
2487 'v-hanging': 'vHanging',
2488 videographic: 'vIdeographic',
2489 'v-ideographic': 'vIdeographic',
2490 viewbox: 'viewBox',
2491 viewtarget: 'viewTarget',
2492 visibility: 'visibility',
2493 vmathematical: 'vMathematical',
2494 'v-mathematical': 'vMathematical',
2495 vocab: 'vocab',
2496 widths: 'widths',
2497 wordspacing: 'wordSpacing',
2498 'word-spacing': 'wordSpacing',
2499 writingmode: 'writingMode',
2500 'writing-mode': 'writingMode',
2501 x1: 'x1',
2502 x2: 'x2',
2503 x: 'x',
2504 xchannelselector: 'xChannelSelector',
2505 xheight: 'xHeight',
2506 'x-height': 'xHeight',
2507 xlinkactuate: 'xlinkActuate',
2508 'xlink:actuate': 'xlinkActuate',
2509 xlinkarcrole: 'xlinkArcrole',
2510 'xlink:arcrole': 'xlinkArcrole',
2511 xlinkhref: 'xlinkHref',
2512 'xlink:href': 'xlinkHref',
2513 xlinkrole: 'xlinkRole',
2514 'xlink:role': 'xlinkRole',
2515 xlinkshow: 'xlinkShow',
2516 'xlink:show': 'xlinkShow',
2517 xlinktitle: 'xlinkTitle',
2518 'xlink:title': 'xlinkTitle',
2519 xlinktype: 'xlinkType',
2520 'xlink:type': 'xlinkType',
2521 xmlbase: 'xmlBase',
2522 'xml:base': 'xmlBase',
2523 xmllang: 'xmlLang',
2524 'xml:lang': 'xmlLang',
2525 xmlns: 'xmlns',
2526 'xml:space': 'xmlSpace',
2527 xmlnsxlink: 'xmlnsXlink',
2528 'xmlns:xlink': 'xmlnsXlink',
2529 xmlspace: 'xmlSpace',
2530 y1: 'y1',
2531 y2: 'y2',
2532 y: 'y',
2533 ychannelselector: 'yChannelSelector',
2534 z: 'z',
2535 zoomandpan: 'zoomAndPan'
2536 };
2537
2538 var validateProperty$1 = function () {};
2539
2540 {
2541 var warnedProperties$1 = {};
2542 var _hasOwnProperty = Object.prototype.hasOwnProperty;
2543 var EVENT_NAME_REGEX = /^on./;
2544 var INVALID_EVENT_NAME_REGEX = /^on[^A-Z]/;
2545 var rARIA$1 = new RegExp('^(aria)-[' + ATTRIBUTE_NAME_CHAR + ']*$');
2546 var rARIACamel$1 = new RegExp('^(aria)[A-Z][' + ATTRIBUTE_NAME_CHAR + ']*$');
2547
2548 validateProperty$1 = function (tagName, name, value, canUseEventSystem) {
2549 if (_hasOwnProperty.call(warnedProperties$1, name) && warnedProperties$1[name]) {
2550 return true;
2551 }
2552
2553 var lowerCasedName = name.toLowerCase();
2554
2555 if (lowerCasedName === 'onfocusin' || lowerCasedName === 'onfocusout') {
2556 error('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.');
2557
2558 warnedProperties$1[name] = true;
2559 return true;
2560 } // We can't rely on the event system being injected on the server.
2561
2562
2563 if (canUseEventSystem) {
2564 if (registrationNameModules.hasOwnProperty(name)) {
2565 return true;
2566 }
2567
2568 var registrationName = possibleRegistrationNames.hasOwnProperty(lowerCasedName) ? possibleRegistrationNames[lowerCasedName] : null;
2569
2570 if (registrationName != null) {
2571 error('Invalid event handler property `%s`. Did you mean `%s`?', name, registrationName);
2572
2573 warnedProperties$1[name] = true;
2574 return true;
2575 }
2576
2577 if (EVENT_NAME_REGEX.test(name)) {
2578 error('Unknown event handler property `%s`. It will be ignored.', name);
2579
2580 warnedProperties$1[name] = true;
2581 return true;
2582 }
2583 } else if (EVENT_NAME_REGEX.test(name)) {
2584 // If no event plugins have been injected, we are in a server environment.
2585 // So we can't tell if the event name is correct for sure, but we can filter
2586 // out known bad ones like `onclick`. We can't suggest a specific replacement though.
2587 if (INVALID_EVENT_NAME_REGEX.test(name)) {
2588 error('Invalid event handler property `%s`. ' + 'React events use the camelCase naming convention, for example `onClick`.', name);
2589 }
2590
2591 warnedProperties$1[name] = true;
2592 return true;
2593 } // Let the ARIA attribute hook validate ARIA attributes
2594
2595
2596 if (rARIA$1.test(name) || rARIACamel$1.test(name)) {
2597 return true;
2598 }
2599
2600 if (lowerCasedName === 'innerhtml') {
2601 error('Directly setting property `innerHTML` is not permitted. ' + 'For more information, lookup documentation on `dangerouslySetInnerHTML`.');
2602
2603 warnedProperties$1[name] = true;
2604 return true;
2605 }
2606
2607 if (lowerCasedName === 'aria') {
2608 error('The `aria` attribute is reserved for future use in React. ' + 'Pass individual `aria-` attributes instead.');
2609
2610 warnedProperties$1[name] = true;
2611 return true;
2612 }
2613
2614 if (lowerCasedName === 'is' && value !== null && value !== undefined && typeof value !== 'string') {
2615 error('Received a `%s` for a string attribute `is`. If this is expected, cast ' + 'the value to a string.', typeof value);
2616
2617 warnedProperties$1[name] = true;
2618 return true;
2619 }
2620
2621 if (typeof value === 'number' && isNaN(value)) {
2622 error('Received NaN for the `%s` attribute. If this is expected, cast ' + 'the value to a string.', name);
2623
2624 warnedProperties$1[name] = true;
2625 return true;
2626 }
2627
2628 var propertyInfo = getPropertyInfo(name);
2629 var isReserved = propertyInfo !== null && propertyInfo.type === RESERVED; // Known attributes should match the casing specified in the property config.
2630
2631 if (possibleStandardNames.hasOwnProperty(lowerCasedName)) {
2632 var standardName = possibleStandardNames[lowerCasedName];
2633
2634 if (standardName !== name) {
2635 error('Invalid DOM property `%s`. Did you mean `%s`?', name, standardName);
2636
2637 warnedProperties$1[name] = true;
2638 return true;
2639 }
2640 } else if (!isReserved && name !== lowerCasedName) {
2641 // Unknown attributes should have lowercase casing since that's how they
2642 // will be cased anyway with server rendering.
2643 error('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);
2644
2645 warnedProperties$1[name] = true;
2646 return true;
2647 }
2648
2649 if (typeof value === 'boolean' && shouldRemoveAttributeWithWarning(name, value, propertyInfo, false)) {
2650 if (value) {
2651 error('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);
2652 } else {
2653 error('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);
2654 }
2655
2656 warnedProperties$1[name] = true;
2657 return true;
2658 } // Now that we've validated casing, do not validate
2659 // data types for reserved props
2660
2661
2662 if (isReserved) {
2663 return true;
2664 } // Warn when a known attribute is a bad type
2665
2666
2667 if (shouldRemoveAttributeWithWarning(name, value, propertyInfo, false)) {
2668 warnedProperties$1[name] = true;
2669 return false;
2670 } // Warn when passing the strings 'false' or 'true' into a boolean prop
2671
2672
2673 if ((value === 'false' || value === 'true') && propertyInfo !== null && propertyInfo.type === BOOLEAN) {
2674 error('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);
2675
2676 warnedProperties$1[name] = true;
2677 return true;
2678 }
2679
2680 return true;
2681 };
2682 }
2683
2684 var warnUnknownProperties = function (type, props, canUseEventSystem) {
2685 {
2686 var unknownProps = [];
2687
2688 for (var key in props) {
2689 var isValid = validateProperty$1(type, key, props[key], canUseEventSystem);
2690
2691 if (!isValid) {
2692 unknownProps.push(key);
2693 }
2694 }
2695
2696 var unknownPropString = unknownProps.map(function (prop) {
2697 return '`' + prop + '`';
2698 }).join(', ');
2699
2700 if (unknownProps.length === 1) {
2701 error('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);
2702 } else if (unknownProps.length > 1) {
2703 error('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);
2704 }
2705 }
2706 };
2707
2708 function validateProperties$2(type, props, canUseEventSystem) {
2709 if (isCustomComponent(type, props)) {
2710 return;
2711 }
2712
2713 warnUnknownProperties(type, props, canUseEventSystem);
2714 }
2715
2716 var toArray = React.Children.toArray; // This is only used in DEV.
2717 // Each entry is `this.stack` from a currently executing renderer instance.
2718 // (There may be more than one because ReactDOMServer is reentrant).
2719 // Each stack is an array of frames which may contain nested stacks of elements.
2720
2721 var currentDebugStacks = [];
2722 var ReactCurrentDispatcher = ReactSharedInternals.ReactCurrentDispatcher;
2723 var ReactDebugCurrentFrame$4;
2724 var prevGetCurrentStackImpl = null;
2725
2726 var getCurrentServerStackImpl = function () {
2727 return '';
2728 };
2729
2730 var describeStackFrame = function (element) {
2731 return '';
2732 };
2733
2734 var validatePropertiesInDevelopment = function (type, props) {};
2735
2736 var pushCurrentDebugStack = function (stack) {};
2737
2738 var pushElementToDebugStack = function (element) {};
2739
2740 var popCurrentDebugStack = function () {};
2741
2742 var hasWarnedAboutUsingContextAsConsumer = false;
2743
2744 {
2745 ReactDebugCurrentFrame$4 = ReactSharedInternals.ReactDebugCurrentFrame;
2746
2747 validatePropertiesInDevelopment = function (type, props) {
2748 validateProperties(type, props);
2749 validateProperties$1(type, props);
2750 validateProperties$2(type, props,
2751 /* canUseEventSystem */
2752 false);
2753 };
2754
2755 describeStackFrame = function (element) {
2756 var source = element._source;
2757 var type = element.type;
2758 var name = getComponentName(type);
2759 var ownerName = null;
2760 return describeComponentFrame(name, source, ownerName);
2761 };
2762
2763 pushCurrentDebugStack = function (stack) {
2764 currentDebugStacks.push(stack);
2765
2766 if (currentDebugStacks.length === 1) {
2767 // We are entering a server renderer.
2768 // Remember the previous (e.g. client) global stack implementation.
2769 prevGetCurrentStackImpl = ReactDebugCurrentFrame$4.getCurrentStack;
2770 ReactDebugCurrentFrame$4.getCurrentStack = getCurrentServerStackImpl;
2771 }
2772 };
2773
2774 pushElementToDebugStack = function (element) {
2775 // For the innermost executing ReactDOMServer call,
2776 var stack = currentDebugStacks[currentDebugStacks.length - 1]; // Take the innermost executing frame (e.g. <Foo>),
2777
2778 var frame = stack[stack.length - 1]; // and record that it has one more element associated with it.
2779
2780 frame.debugElementStack.push(element); // We only need this because we tail-optimize single-element
2781 // children and directly handle them in an inner loop instead of
2782 // creating separate frames for them.
2783 };
2784
2785 popCurrentDebugStack = function () {
2786 currentDebugStacks.pop();
2787
2788 if (currentDebugStacks.length === 0) {
2789 // We are exiting the server renderer.
2790 // Restore the previous (e.g. client) global stack implementation.
2791 ReactDebugCurrentFrame$4.getCurrentStack = prevGetCurrentStackImpl;
2792 prevGetCurrentStackImpl = null;
2793 }
2794 };
2795
2796 getCurrentServerStackImpl = function () {
2797 if (currentDebugStacks.length === 0) {
2798 // Nothing is currently rendering.
2799 return '';
2800 } // ReactDOMServer is reentrant so there may be multiple calls at the same time.
2801 // Take the frames from the innermost call which is the last in the array.
2802
2803
2804 var frames = currentDebugStacks[currentDebugStacks.length - 1];
2805 var stack = ''; // Go through every frame in the stack from the innermost one.
2806
2807 for (var i = frames.length - 1; i >= 0; i--) {
2808 var frame = frames[i]; // Every frame might have more than one debug element stack entry associated with it.
2809 // This is because single-child nesting doesn't create materialized frames.
2810 // Instead it would push them through `pushElementToDebugStack()`.
2811
2812 var debugElementStack = frame.debugElementStack;
2813
2814 for (var ii = debugElementStack.length - 1; ii >= 0; ii--) {
2815 stack += describeStackFrame(debugElementStack[ii]);
2816 }
2817 }
2818
2819 return stack;
2820 };
2821 }
2822
2823 var didWarnDefaultInputValue = false;
2824 var didWarnDefaultChecked = false;
2825 var didWarnDefaultSelectValue = false;
2826 var didWarnDefaultTextareaValue = false;
2827 var didWarnInvalidOptionChildren = false;
2828 var didWarnAboutNoopUpdateForComponent = {};
2829 var didWarnAboutBadClass = {};
2830 var didWarnAboutModulePatternComponent = {};
2831 var didWarnAboutDeprecatedWillMount = {};
2832 var didWarnAboutUndefinedDerivedState = {};
2833 var didWarnAboutUninitializedState = {};
2834 var valuePropNames = ['value', 'defaultValue'];
2835 var newlineEatingTags = {
2836 listing: true,
2837 pre: true,
2838 textarea: true
2839 }; // We accept any tag to be rendered but since this gets injected into arbitrary
2840 // HTML, we want to make sure that it's a safe tag.
2841 // http://www.w3.org/TR/REC-xml/#NT-Name
2842
2843 var VALID_TAG_REGEX = /^[a-zA-Z][a-zA-Z:_\.\-\d]*$/; // Simplified subset
2844
2845 var validatedTagCache = {};
2846
2847 function validateDangerousTag(tag) {
2848 if (!validatedTagCache.hasOwnProperty(tag)) {
2849 if (!VALID_TAG_REGEX.test(tag)) {
2850 {
2851 throw Error( "Invalid tag: " + tag );
2852 }
2853 }
2854
2855 validatedTagCache[tag] = true;
2856 }
2857 }
2858
2859 var styleNameCache = {};
2860
2861 var processStyleName = function (styleName) {
2862 if (styleNameCache.hasOwnProperty(styleName)) {
2863 return styleNameCache[styleName];
2864 }
2865
2866 var result = hyphenateStyleName(styleName);
2867 styleNameCache[styleName] = result;
2868 return result;
2869 };
2870
2871 function createMarkupForStyles(styles) {
2872 var serialized = '';
2873 var delimiter = '';
2874
2875 for (var styleName in styles) {
2876 if (!styles.hasOwnProperty(styleName)) {
2877 continue;
2878 }
2879
2880 var isCustomProperty = styleName.indexOf('--') === 0;
2881 var styleValue = styles[styleName];
2882
2883 {
2884 if (!isCustomProperty) {
2885 warnValidStyle$1(styleName, styleValue);
2886 }
2887 }
2888
2889 if (styleValue != null) {
2890 serialized += delimiter + (isCustomProperty ? styleName : processStyleName(styleName)) + ':';
2891 serialized += dangerousStyleValue(styleName, styleValue, isCustomProperty);
2892 delimiter = ';';
2893 }
2894 }
2895
2896 return serialized || null;
2897 }
2898
2899 function warnNoop(publicInstance, callerName) {
2900 {
2901 var _constructor = publicInstance.constructor;
2902 var componentName = _constructor && getComponentName(_constructor) || 'ReactClass';
2903 var warningKey = componentName + '.' + callerName;
2904
2905 if (didWarnAboutNoopUpdateForComponent[warningKey]) {
2906 return;
2907 }
2908
2909 error('%s(...): Can only update a mounting component. ' + 'This usually means you called %s() outside componentWillMount() on the server. ' + 'This is a no-op.\n\nPlease check the code for the %s component.', callerName, callerName, componentName);
2910
2911 didWarnAboutNoopUpdateForComponent[warningKey] = true;
2912 }
2913 }
2914
2915 function shouldConstruct(Component) {
2916 return Component.prototype && Component.prototype.isReactComponent;
2917 }
2918
2919 function getNonChildrenInnerMarkup(props) {
2920 var innerHTML = props.dangerouslySetInnerHTML;
2921
2922 if (innerHTML != null) {
2923 if (innerHTML.__html != null) {
2924 return innerHTML.__html;
2925 }
2926 } else {
2927 var content = props.children;
2928
2929 if (typeof content === 'string' || typeof content === 'number') {
2930 return escapeTextForBrowser(content);
2931 }
2932 }
2933
2934 return null;
2935 }
2936
2937 function flattenTopLevelChildren(children) {
2938 if (!React.isValidElement(children)) {
2939 return toArray(children);
2940 }
2941
2942 var element = children;
2943
2944 if (element.type !== REACT_FRAGMENT_TYPE) {
2945 return [element];
2946 }
2947
2948 var fragmentChildren = element.props.children;
2949
2950 if (!React.isValidElement(fragmentChildren)) {
2951 return toArray(fragmentChildren);
2952 }
2953
2954 var fragmentChildElement = fragmentChildren;
2955 return [fragmentChildElement];
2956 }
2957
2958 function flattenOptionChildren(children) {
2959 if (children === undefined || children === null) {
2960 return children;
2961 }
2962
2963 var content = ''; // Flatten children and warn if they aren't strings or numbers;
2964 // invalid types are ignored.
2965
2966 React.Children.forEach(children, function (child) {
2967 if (child == null) {
2968 return;
2969 }
2970
2971 content += child;
2972
2973 {
2974 if (!didWarnInvalidOptionChildren && typeof child !== 'string' && typeof child !== 'number') {
2975 didWarnInvalidOptionChildren = true;
2976
2977 error('Only strings and numbers are supported as <option> children.');
2978 }
2979 }
2980 });
2981 return content;
2982 }
2983
2984 var hasOwnProperty$2 = Object.prototype.hasOwnProperty;
2985 var STYLE = 'style';
2986 var RESERVED_PROPS = {
2987 children: null,
2988 dangerouslySetInnerHTML: null,
2989 suppressContentEditableWarning: null,
2990 suppressHydrationWarning: null
2991 };
2992
2993 function createOpenTagMarkup(tagVerbatim, tagLowercase, props, namespace, makeStaticMarkup, isRootElement) {
2994 var ret = '<' + tagVerbatim;
2995
2996 for (var propKey in props) {
2997 if (!hasOwnProperty$2.call(props, propKey)) {
2998 continue;
2999 }
3000
3001 var propValue = props[propKey];
3002
3003 if (propValue == null) {
3004 continue;
3005 }
3006
3007 if (propKey === STYLE) {
3008 propValue = createMarkupForStyles(propValue);
3009 }
3010
3011 var markup = null;
3012
3013 if (isCustomComponent(tagLowercase, props)) {
3014 if (!RESERVED_PROPS.hasOwnProperty(propKey)) {
3015 markup = createMarkupForCustomAttribute(propKey, propValue);
3016 }
3017 } else {
3018 markup = createMarkupForProperty(propKey, propValue);
3019 }
3020
3021 if (markup) {
3022 ret += ' ' + markup;
3023 }
3024 } // For static pages, no need to put React ID and checksum. Saves lots of
3025 // bytes.
3026
3027
3028 if (makeStaticMarkup) {
3029 return ret;
3030 }
3031
3032 if (isRootElement) {
3033 ret += ' ' + createMarkupForRoot();
3034 }
3035
3036 return ret;
3037 }
3038
3039 function validateRenderResult(child, type) {
3040 if (child === undefined) {
3041 {
3042 {
3043 throw Error( (getComponentName(type) || 'Component') + "(...): Nothing was returned from render. This usually means a return statement is missing. Or, to render nothing, return null." );
3044 }
3045 }
3046 }
3047 }
3048
3049 function resolve(child, context, threadID) {
3050 while (React.isValidElement(child)) {
3051 // Safe because we just checked it's an element.
3052 var element = child;
3053 var Component = element.type;
3054
3055 {
3056 pushElementToDebugStack(element);
3057 }
3058
3059 if (typeof Component !== 'function') {
3060 break;
3061 }
3062
3063 processChild(element, Component);
3064 } // Extra closure so queue and replace can be captured properly
3065
3066
3067 function processChild(element, Component) {
3068 var isClass = shouldConstruct(Component);
3069 var publicContext = processContext(Component, context, threadID, isClass);
3070 var queue = [];
3071 var replace = false;
3072 var updater = {
3073 isMounted: function (publicInstance) {
3074 return false;
3075 },
3076 enqueueForceUpdate: function (publicInstance) {
3077 if (queue === null) {
3078 warnNoop(publicInstance, 'forceUpdate');
3079 return null;
3080 }
3081 },
3082 enqueueReplaceState: function (publicInstance, completeState) {
3083 replace = true;
3084 queue = [completeState];
3085 },
3086 enqueueSetState: function (publicInstance, currentPartialState) {
3087 if (queue === null) {
3088 warnNoop(publicInstance, 'setState');
3089 return null;
3090 }
3091
3092 queue.push(currentPartialState);
3093 }
3094 };
3095 var inst;
3096
3097 if (isClass) {
3098 inst = new Component(element.props, publicContext, updater);
3099
3100 if (typeof Component.getDerivedStateFromProps === 'function') {
3101 {
3102 if (inst.state === null || inst.state === undefined) {
3103 var componentName = getComponentName(Component) || 'Unknown';
3104
3105 if (!didWarnAboutUninitializedState[componentName]) {
3106 error('`%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, inst.state === null ? 'null' : 'undefined', componentName);
3107
3108 didWarnAboutUninitializedState[componentName] = true;
3109 }
3110 }
3111 }
3112
3113 var partialState = Component.getDerivedStateFromProps.call(null, element.props, inst.state);
3114
3115 {
3116 if (partialState === undefined) {
3117 var _componentName = getComponentName(Component) || 'Unknown';
3118
3119 if (!didWarnAboutUndefinedDerivedState[_componentName]) {
3120 error('%s.getDerivedStateFromProps(): A valid state object (or null) must be returned. ' + 'You have returned undefined.', _componentName);
3121
3122 didWarnAboutUndefinedDerivedState[_componentName] = true;
3123 }
3124 }
3125 }
3126
3127 if (partialState != null) {
3128 inst.state = _assign({}, inst.state, partialState);
3129 }
3130 }
3131 } else {
3132 {
3133 if (Component.prototype && typeof Component.prototype.render === 'function') {
3134 var _componentName2 = getComponentName(Component) || 'Unknown';
3135
3136 if (!didWarnAboutBadClass[_componentName2]) {
3137 error("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.', _componentName2, _componentName2);
3138
3139 didWarnAboutBadClass[_componentName2] = true;
3140 }
3141 }
3142 }
3143
3144 var componentIdentity = {};
3145 prepareToUseHooks(componentIdentity);
3146 inst = Component(element.props, publicContext, updater);
3147 inst = finishHooks(Component, element.props, inst, publicContext);
3148
3149 if (inst == null || inst.render == null) {
3150 child = inst;
3151 validateRenderResult(child, Component);
3152 return;
3153 }
3154
3155 {
3156 var _componentName3 = getComponentName(Component) || 'Unknown';
3157
3158 if (!didWarnAboutModulePatternComponent[_componentName3]) {
3159 error('The <%s /> component appears to be a function component that returns a class instance. ' + 'Change %s to a class that extends React.Component instead. ' + "If you can't use a class try assigning the prototype on the function as a workaround. " + "`%s.prototype = React.Component.prototype`. Don't use an arrow function since it " + 'cannot be called with `new` by React.', _componentName3, _componentName3, _componentName3);
3160
3161 didWarnAboutModulePatternComponent[_componentName3] = true;
3162 }
3163 }
3164 }
3165
3166 inst.props = element.props;
3167 inst.context = publicContext;
3168 inst.updater = updater;
3169 var initialState = inst.state;
3170
3171 if (initialState === undefined) {
3172 inst.state = initialState = null;
3173 }
3174
3175 if (typeof inst.UNSAFE_componentWillMount === 'function' || typeof inst.componentWillMount === 'function') {
3176 if (typeof inst.componentWillMount === 'function') {
3177 {
3178 if ( inst.componentWillMount.__suppressDeprecationWarning !== true) {
3179 var _componentName4 = getComponentName(Component) || 'Unknown';
3180
3181 if (!didWarnAboutDeprecatedWillMount[_componentName4]) {
3182 warn( // keep this warning in sync with ReactStrictModeWarning.js
3183 'componentWillMount has been renamed, and is not recommended for use. ' + 'See https://fb.me/react-unsafe-component-lifecycles for details.\n\n' + '* Move code from componentWillMount to componentDidMount (preferred in most cases) ' + 'or the constructor.\n' + '\nPlease update the following components: %s', _componentName4);
3184
3185 didWarnAboutDeprecatedWillMount[_componentName4] = true;
3186 }
3187 }
3188 } // In order to support react-lifecycles-compat polyfilled components,
3189 // Unsafe lifecycles should not be invoked for any component with the new gDSFP.
3190
3191
3192 if (typeof Component.getDerivedStateFromProps !== 'function') {
3193 inst.componentWillMount();
3194 }
3195 }
3196
3197 if (typeof inst.UNSAFE_componentWillMount === 'function' && typeof Component.getDerivedStateFromProps !== 'function') {
3198 // In order to support react-lifecycles-compat polyfilled components,
3199 // Unsafe lifecycles should not be invoked for any component with the new gDSFP.
3200 inst.UNSAFE_componentWillMount();
3201 }
3202
3203 if (queue.length) {
3204 var oldQueue = queue;
3205 var oldReplace = replace;
3206 queue = null;
3207 replace = false;
3208
3209 if (oldReplace && oldQueue.length === 1) {
3210 inst.state = oldQueue[0];
3211 } else {
3212 var nextState = oldReplace ? oldQueue[0] : inst.state;
3213 var dontMutate = true;
3214
3215 for (var i = oldReplace ? 1 : 0; i < oldQueue.length; i++) {
3216 var partial = oldQueue[i];
3217
3218 var _partialState = typeof partial === 'function' ? partial.call(inst, nextState, element.props, publicContext) : partial;
3219
3220 if (_partialState != null) {
3221 if (dontMutate) {
3222 dontMutate = false;
3223 nextState = _assign({}, nextState, _partialState);
3224 } else {
3225 _assign(nextState, _partialState);
3226 }
3227 }
3228 }
3229
3230 inst.state = nextState;
3231 }
3232 } else {
3233 queue = null;
3234 }
3235 }
3236
3237 child = inst.render();
3238
3239 {
3240 if (child === undefined && inst.render._isMockFunction) {
3241 // This is probably bad practice. Consider warning here and
3242 // deprecating this convenience.
3243 child = null;
3244 }
3245 }
3246
3247 validateRenderResult(child, Component);
3248 var childContext;
3249
3250 {
3251 if (typeof inst.getChildContext === 'function') {
3252 var _childContextTypes = Component.childContextTypes;
3253
3254 if (typeof _childContextTypes === 'object') {
3255 childContext = inst.getChildContext();
3256
3257 for (var contextKey in childContext) {
3258 if (!(contextKey in _childContextTypes)) {
3259 {
3260 throw Error( (getComponentName(Component) || 'Unknown') + ".getChildContext(): key \"" + contextKey + "\" is not defined in childContextTypes." );
3261 }
3262 }
3263 }
3264 } else {
3265 {
3266 error('%s.getChildContext(): childContextTypes must be defined in order to ' + 'use getChildContext().', getComponentName(Component) || 'Unknown');
3267 }
3268 }
3269 }
3270
3271 if (childContext) {
3272 context = _assign({}, context, childContext);
3273 }
3274 }
3275 }
3276
3277 return {
3278 child: child,
3279 context: context
3280 };
3281 }
3282
3283 var ReactDOMServerRenderer =
3284 /*#__PURE__*/
3285 function () {
3286 // TODO: type this more strictly:
3287 // DEV-only
3288 function ReactDOMServerRenderer(children, makeStaticMarkup) {
3289 var flatChildren = flattenTopLevelChildren(children);
3290 var topFrame = {
3291 type: null,
3292 // Assume all trees start in the HTML namespace (not totally true, but
3293 // this is what we did historically)
3294 domNamespace: Namespaces.html,
3295 children: flatChildren,
3296 childIndex: 0,
3297 context: emptyObject,
3298 footer: ''
3299 };
3300
3301 {
3302 topFrame.debugElementStack = [];
3303 }
3304
3305 this.threadID = allocThreadID();
3306 this.stack = [topFrame];
3307 this.exhausted = false;
3308 this.currentSelectValue = null;
3309 this.previousWasTextNode = false;
3310 this.makeStaticMarkup = makeStaticMarkup;
3311 this.suspenseDepth = 0; // Context (new API)
3312
3313 this.contextIndex = -1;
3314 this.contextStack = [];
3315 this.contextValueStack = [];
3316
3317 {
3318 this.contextProviderStack = [];
3319 }
3320 }
3321
3322 var _proto = ReactDOMServerRenderer.prototype;
3323
3324 _proto.destroy = function destroy() {
3325 if (!this.exhausted) {
3326 this.exhausted = true;
3327 this.clearProviders();
3328 freeThreadID(this.threadID);
3329 }
3330 }
3331 /**
3332 * Note: We use just two stacks regardless of how many context providers you have.
3333 * Providers are always popped in the reverse order to how they were pushed
3334 * so we always know on the way down which provider you'll encounter next on the way up.
3335 * On the way down, we push the current provider, and its context value *before*
3336 * we mutated it, onto the stacks. Therefore, on the way up, we always know which
3337 * provider needs to be "restored" to which value.
3338 * https://github.com/facebook/react/pull/12985#issuecomment-396301248
3339 */
3340 ;
3341
3342 _proto.pushProvider = function pushProvider(provider) {
3343 var index = ++this.contextIndex;
3344 var context = provider.type._context;
3345 var threadID = this.threadID;
3346 validateContextBounds(context, threadID);
3347 var previousValue = context[threadID]; // Remember which value to restore this context to on our way up.
3348
3349 this.contextStack[index] = context;
3350 this.contextValueStack[index] = previousValue;
3351
3352 {
3353 // Only used for push/pop mismatch warnings.
3354 this.contextProviderStack[index] = provider;
3355 } // Mutate the current value.
3356
3357
3358 context[threadID] = provider.props.value;
3359 };
3360
3361 _proto.popProvider = function popProvider(provider) {
3362 var index = this.contextIndex;
3363
3364 {
3365 if (index < 0 || provider !== this.contextProviderStack[index]) {
3366 error('Unexpected pop.');
3367 }
3368 }
3369
3370 var context = this.contextStack[index];
3371 var previousValue = this.contextValueStack[index]; // "Hide" these null assignments from Flow by using `any`
3372 // because conceptually they are deletions--as long as we
3373 // promise to never access values beyond `this.contextIndex`.
3374
3375 this.contextStack[index] = null;
3376 this.contextValueStack[index] = null;
3377
3378 {
3379 this.contextProviderStack[index] = null;
3380 }
3381
3382 this.contextIndex--; // Restore to the previous value we stored as we were walking down.
3383 // We've already verified that this context has been expanded to accommodate
3384 // this thread id, so we don't need to do it again.
3385
3386 context[this.threadID] = previousValue;
3387 };
3388
3389 _proto.clearProviders = function clearProviders() {
3390 // Restore any remaining providers on the stack to previous values
3391 for (var index = this.contextIndex; index >= 0; index--) {
3392 var context = this.contextStack[index];
3393 var previousValue = this.contextValueStack[index];
3394 context[this.threadID] = previousValue;
3395 }
3396 };
3397
3398 _proto.read = function read(bytes) {
3399 if (this.exhausted) {
3400 return null;
3401 }
3402
3403 var prevThreadID = currentThreadID;
3404 setCurrentThreadID(this.threadID);
3405 var prevDispatcher = ReactCurrentDispatcher.current;
3406 ReactCurrentDispatcher.current = Dispatcher;
3407
3408 try {
3409 // Markup generated within <Suspense> ends up buffered until we know
3410 // nothing in that boundary suspended
3411 var out = [''];
3412 var suspended = false;
3413
3414 while (out[0].length < bytes) {
3415 if (this.stack.length === 0) {
3416 this.exhausted = true;
3417 freeThreadID(this.threadID);
3418 break;
3419 }
3420
3421 var frame = this.stack[this.stack.length - 1];
3422
3423 if (suspended || frame.childIndex >= frame.children.length) {
3424 var footer = frame.footer;
3425
3426 if (footer !== '') {
3427 this.previousWasTextNode = false;
3428 }
3429
3430 this.stack.pop();
3431
3432 if (frame.type === 'select') {
3433 this.currentSelectValue = null;
3434 } else if (frame.type != null && frame.type.type != null && frame.type.type.$$typeof === REACT_PROVIDER_TYPE) {
3435 var provider = frame.type;
3436 this.popProvider(provider);
3437 } else if (frame.type === REACT_SUSPENSE_TYPE) {
3438 this.suspenseDepth--;
3439 var buffered = out.pop();
3440
3441 if (suspended) {
3442 suspended = false; // If rendering was suspended at this boundary, render the fallbackFrame
3443
3444 var fallbackFrame = frame.fallbackFrame;
3445
3446 if (!fallbackFrame) {
3447 {
3448 throw Error(true ? "ReactDOMServer did not find an internal fallback frame for Suspense. This is a bug in React. Please file an issue." : formatProdErrorMessage(303));
3449 }
3450 }
3451
3452 this.stack.push(fallbackFrame);
3453 out[this.suspenseDepth] += '<!--$!-->'; // Skip flushing output since we're switching to the fallback
3454
3455 continue;
3456 } else {
3457 out[this.suspenseDepth] += buffered;
3458 }
3459 } // Flush output
3460
3461
3462 out[this.suspenseDepth] += footer;
3463 continue;
3464 }
3465
3466 var child = frame.children[frame.childIndex++];
3467 var outBuffer = '';
3468
3469 if (true) {
3470 pushCurrentDebugStack(this.stack); // We're starting work on this frame, so reset its inner stack.
3471
3472 frame.debugElementStack.length = 0;
3473 }
3474
3475 try {
3476 outBuffer += this.render(child, frame.context, frame.domNamespace);
3477 } catch (err) {
3478 if (err != null && typeof err.then === 'function') {
3479 if (enableSuspenseServerRenderer) {
3480 if (!(this.suspenseDepth > 0)) {
3481 {
3482 throw Error(true ? "A React component suspended while rendering, but no fallback UI was specified.\n\nAdd a <Suspense fallback=...> component higher in the tree to provide a loading indicator or placeholder to display." : formatProdErrorMessage(342));
3483 }
3484 }
3485
3486 suspended = true;
3487 } else {
3488 if (!false) {
3489 {
3490 throw Error(true ? "ReactDOMServer does not yet support Suspense." : formatProdErrorMessage(294));
3491 }
3492 }
3493 }
3494 } else {
3495 throw err;
3496 }
3497 } finally {
3498 if (true) {
3499 popCurrentDebugStack();
3500 }
3501 }
3502
3503 if (out.length <= this.suspenseDepth) {
3504 out.push('');
3505 }
3506
3507 out[this.suspenseDepth] += outBuffer;
3508 }
3509
3510 return out[0];
3511 } finally {
3512 ReactCurrentDispatcher.current = prevDispatcher;
3513 setCurrentThreadID(prevThreadID);
3514 }
3515 };
3516
3517 _proto.render = function render(child, context, parentNamespace) {
3518 if (typeof child === 'string' || typeof child === 'number') {
3519 var text = '' + child;
3520
3521 if (text === '') {
3522 return '';
3523 }
3524
3525 if (this.makeStaticMarkup) {
3526 return escapeTextForBrowser(text);
3527 }
3528
3529 if (this.previousWasTextNode) {
3530 return '<!-- -->' + escapeTextForBrowser(text);
3531 }
3532
3533 this.previousWasTextNode = true;
3534 return escapeTextForBrowser(text);
3535 } else {
3536 var nextChild;
3537
3538 var _resolve = resolve(child, context, this.threadID);
3539
3540 nextChild = _resolve.child;
3541 context = _resolve.context;
3542
3543 if (nextChild === null || nextChild === false) {
3544 return '';
3545 } else if (!React.isValidElement(nextChild)) {
3546 if (nextChild != null && nextChild.$$typeof != null) {
3547 // Catch unexpected special types early.
3548 var $$typeof = nextChild.$$typeof;
3549
3550 if (!($$typeof !== REACT_PORTAL_TYPE)) {
3551 {
3552 throw Error( "Portals are not currently supported by the server renderer. Render them conditionally so that they only appear on the client render." );
3553 }
3554 } // Catch-all to prevent an infinite loop if React.Children.toArray() supports some new type.
3555
3556
3557 {
3558 {
3559 throw Error( "Unknown element-like object type: " + $$typeof.toString() + ". This is likely a bug in React. Please file an issue." );
3560 }
3561 }
3562 }
3563
3564 var nextChildren = toArray(nextChild);
3565 var frame = {
3566 type: null,
3567 domNamespace: parentNamespace,
3568 children: nextChildren,
3569 childIndex: 0,
3570 context: context,
3571 footer: ''
3572 };
3573
3574 {
3575 frame.debugElementStack = [];
3576 }
3577
3578 this.stack.push(frame);
3579 return '';
3580 } // Safe because we just checked it's an element.
3581
3582
3583 var nextElement = nextChild;
3584 var elementType = nextElement.type;
3585
3586 if (typeof elementType === 'string') {
3587 return this.renderDOM(nextElement, context, parentNamespace);
3588 }
3589
3590 switch (elementType) {
3591 case REACT_STRICT_MODE_TYPE:
3592 case REACT_CONCURRENT_MODE_TYPE:
3593 case REACT_PROFILER_TYPE:
3594 case REACT_SUSPENSE_LIST_TYPE:
3595 case REACT_FRAGMENT_TYPE:
3596 {
3597 var _nextChildren = toArray(nextChild.props.children);
3598
3599 var _frame = {
3600 type: null,
3601 domNamespace: parentNamespace,
3602 children: _nextChildren,
3603 childIndex: 0,
3604 context: context,
3605 footer: ''
3606 };
3607
3608 {
3609 _frame.debugElementStack = [];
3610 }
3611
3612 this.stack.push(_frame);
3613 return '';
3614 }
3615
3616 case REACT_SUSPENSE_TYPE:
3617 {
3618 {
3619 {
3620 {
3621 throw Error( "ReactDOMServer does not yet support Suspense." );
3622 }
3623 }
3624 }
3625 }
3626 }
3627
3628 if (typeof elementType === 'object' && elementType !== null) {
3629 switch (elementType.$$typeof) {
3630 case REACT_FORWARD_REF_TYPE:
3631 {
3632 var element = nextChild;
3633
3634 var _nextChildren4;
3635
3636 var componentIdentity = {};
3637 prepareToUseHooks(componentIdentity);
3638 _nextChildren4 = elementType.render(element.props, element.ref);
3639 _nextChildren4 = finishHooks(elementType.render, element.props, _nextChildren4, element.ref);
3640 _nextChildren4 = toArray(_nextChildren4);
3641 var _frame4 = {
3642 type: null,
3643 domNamespace: parentNamespace,
3644 children: _nextChildren4,
3645 childIndex: 0,
3646 context: context,
3647 footer: ''
3648 };
3649
3650 {
3651 _frame4.debugElementStack = [];
3652 }
3653
3654 this.stack.push(_frame4);
3655 return '';
3656 }
3657
3658 case REACT_MEMO_TYPE:
3659 {
3660 var _element = nextChild;
3661 var _nextChildren5 = [React.createElement(elementType.type, _assign({
3662 ref: _element.ref
3663 }, _element.props))];
3664 var _frame5 = {
3665 type: null,
3666 domNamespace: parentNamespace,
3667 children: _nextChildren5,
3668 childIndex: 0,
3669 context: context,
3670 footer: ''
3671 };
3672
3673 {
3674 _frame5.debugElementStack = [];
3675 }
3676
3677 this.stack.push(_frame5);
3678 return '';
3679 }
3680
3681 case REACT_PROVIDER_TYPE:
3682 {
3683 var provider = nextChild;
3684 var nextProps = provider.props;
3685
3686 var _nextChildren6 = toArray(nextProps.children);
3687
3688 var _frame6 = {
3689 type: provider,
3690 domNamespace: parentNamespace,
3691 children: _nextChildren6,
3692 childIndex: 0,
3693 context: context,
3694 footer: ''
3695 };
3696
3697 {
3698 _frame6.debugElementStack = [];
3699 }
3700
3701 this.pushProvider(provider);
3702 this.stack.push(_frame6);
3703 return '';
3704 }
3705
3706 case REACT_CONTEXT_TYPE:
3707 {
3708 var reactContext = nextChild.type; // The logic below for Context differs depending on PROD or DEV mode. In
3709 // DEV mode, we create a separate object for Context.Consumer that acts
3710 // like a proxy to Context. This proxy object adds unnecessary code in PROD
3711 // so we use the old behaviour (Context.Consumer references Context) to
3712 // reduce size and overhead. The separate object references context via
3713 // a property called "_context", which also gives us the ability to check
3714 // in DEV mode if this property exists or not and warn if it does not.
3715
3716 {
3717 if (reactContext._context === undefined) {
3718 // This may be because it's a Context (rather than a Consumer).
3719 // Or it may be because it's older React where they're the same thing.
3720 // We only want to warn if we're sure it's a new React.
3721 if (reactContext !== reactContext.Consumer) {
3722 if (!hasWarnedAboutUsingContextAsConsumer) {
3723 hasWarnedAboutUsingContextAsConsumer = true;
3724
3725 error('Rendering <Context> directly is not supported and will be removed in ' + 'a future major release. Did you mean to render <Context.Consumer> instead?');
3726 }
3727 }
3728 } else {
3729 reactContext = reactContext._context;
3730 }
3731 }
3732
3733 var _nextProps = nextChild.props;
3734 var threadID = this.threadID;
3735 validateContextBounds(reactContext, threadID);
3736 var nextValue = reactContext[threadID];
3737
3738 var _nextChildren7 = toArray(_nextProps.children(nextValue));
3739
3740 var _frame7 = {
3741 type: nextChild,
3742 domNamespace: parentNamespace,
3743 children: _nextChildren7,
3744 childIndex: 0,
3745 context: context,
3746 footer: ''
3747 };
3748
3749 {
3750 _frame7.debugElementStack = [];
3751 }
3752
3753 this.stack.push(_frame7);
3754 return '';
3755 }
3756 // eslint-disable-next-line-no-fallthrough
3757
3758 case REACT_FUNDAMENTAL_TYPE:
3759 {
3760
3761 {
3762 {
3763 throw Error( "ReactDOMServer does not yet support the fundamental API." );
3764 }
3765 }
3766 }
3767 // eslint-disable-next-line-no-fallthrough
3768
3769 case REACT_LAZY_TYPE:
3770 {
3771 var _element2 = nextChild;
3772 var lazyComponent = nextChild.type; // Attempt to initialize lazy component regardless of whether the
3773 // suspense server-side renderer is enabled so synchronously
3774 // resolved constructors are supported.
3775
3776 initializeLazyComponentType(lazyComponent);
3777
3778 switch (lazyComponent._status) {
3779 case Resolved:
3780 {
3781 var _nextChildren9 = [React.createElement(lazyComponent._result, _assign({
3782 ref: _element2.ref
3783 }, _element2.props))];
3784 var _frame9 = {
3785 type: null,
3786 domNamespace: parentNamespace,
3787 children: _nextChildren9,
3788 childIndex: 0,
3789 context: context,
3790 footer: ''
3791 };
3792
3793 {
3794 _frame9.debugElementStack = [];
3795 }
3796
3797 this.stack.push(_frame9);
3798 return '';
3799 }
3800
3801 case Rejected:
3802 throw lazyComponent._result;
3803
3804 case Pending:
3805 default:
3806 {
3807 {
3808 throw Error( "ReactDOMServer does not yet support lazy-loaded components." );
3809 }
3810 }
3811
3812 }
3813 }
3814 // eslint-disable-next-line-no-fallthrough
3815
3816 case REACT_SCOPE_TYPE:
3817 {
3818
3819 {
3820 {
3821 throw Error( "ReactDOMServer does not yet support scope components." );
3822 }
3823 }
3824 }
3825 }
3826 }
3827
3828 var info = '';
3829
3830 {
3831 var owner = nextElement._owner;
3832
3833 if (elementType === undefined || typeof elementType === 'object' && elementType !== null && Object.keys(elementType).length === 0) {
3834 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.';
3835 }
3836
3837 var ownerName = owner ? getComponentName(owner) : null;
3838
3839 if (ownerName) {
3840 info += '\n\nCheck the render method of `' + ownerName + '`.';
3841 }
3842 }
3843
3844 {
3845 {
3846 throw Error( "Element type is invalid: expected a string (for built-in components) or a class/function (for composite components) but got: " + (elementType == null ? elementType : typeof elementType) + "." + info );
3847 }
3848 }
3849 }
3850 };
3851
3852 _proto.renderDOM = function renderDOM(element, context, parentNamespace) {
3853 var tag = element.type.toLowerCase();
3854 var namespace = parentNamespace;
3855
3856 if (parentNamespace === Namespaces.html) {
3857 namespace = getIntrinsicNamespace(tag);
3858 }
3859
3860 {
3861 if (namespace === Namespaces.html) {
3862 // Should this check be gated by parent namespace? Not sure we want to
3863 // allow <SVG> or <mATH>.
3864 if (tag !== element.type) {
3865 error('<%s /> is using incorrect casing. ' + 'Use PascalCase for React components, ' + 'or lowercase for HTML elements.', element.type);
3866 }
3867 }
3868 }
3869
3870 validateDangerousTag(tag);
3871 var props = element.props;
3872
3873 if (tag === 'input') {
3874 {
3875 ReactControlledValuePropTypes.checkPropTypes('input', props);
3876
3877 if (props.checked !== undefined && props.defaultChecked !== undefined && !didWarnDefaultChecked) {
3878 error('%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', 'A component', props.type);
3879
3880 didWarnDefaultChecked = true;
3881 }
3882
3883 if (props.value !== undefined && props.defaultValue !== undefined && !didWarnDefaultInputValue) {
3884 error('%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', 'A component', props.type);
3885
3886 didWarnDefaultInputValue = true;
3887 }
3888 }
3889
3890 props = _assign({
3891 type: undefined
3892 }, props, {
3893 defaultChecked: undefined,
3894 defaultValue: undefined,
3895 value: props.value != null ? props.value : props.defaultValue,
3896 checked: props.checked != null ? props.checked : props.defaultChecked
3897 });
3898 } else if (tag === 'textarea') {
3899 {
3900 ReactControlledValuePropTypes.checkPropTypes('textarea', props);
3901
3902 if (props.value !== undefined && props.defaultValue !== undefined && !didWarnDefaultTextareaValue) {
3903 error('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');
3904
3905 didWarnDefaultTextareaValue = true;
3906 }
3907 }
3908
3909 var initialValue = props.value;
3910
3911 if (initialValue == null) {
3912 var defaultValue = props.defaultValue; // TODO (yungsters): Remove support for children content in <textarea>.
3913
3914 var textareaChildren = props.children;
3915
3916 if (textareaChildren != null) {
3917 {
3918 error('Use the `defaultValue` or `value` props instead of setting ' + 'children on <textarea>.');
3919 }
3920
3921 if (!(defaultValue == null)) {
3922 {
3923 throw Error( "If you supply `defaultValue` on a <textarea>, do not pass children." );
3924 }
3925 }
3926
3927 if (Array.isArray(textareaChildren)) {
3928 if (!(textareaChildren.length <= 1)) {
3929 {
3930 throw Error( "<textarea> can only have at most one child." );
3931 }
3932 }
3933
3934 textareaChildren = textareaChildren[0];
3935 }
3936
3937 defaultValue = '' + textareaChildren;
3938 }
3939
3940 if (defaultValue == null) {
3941 defaultValue = '';
3942 }
3943
3944 initialValue = defaultValue;
3945 }
3946
3947 props = _assign({}, props, {
3948 value: undefined,
3949 children: '' + initialValue
3950 });
3951 } else if (tag === 'select') {
3952 {
3953 ReactControlledValuePropTypes.checkPropTypes('select', props);
3954
3955 for (var i = 0; i < valuePropNames.length; i++) {
3956 var propName = valuePropNames[i];
3957
3958 if (props[propName] == null) {
3959 continue;
3960 }
3961
3962 var isArray = Array.isArray(props[propName]);
3963
3964 if (props.multiple && !isArray) {
3965 error('The `%s` prop supplied to <select> must be an array if ' + '`multiple` is true.', propName);
3966 } else if (!props.multiple && isArray) {
3967 error('The `%s` prop supplied to <select> must be a scalar ' + 'value if `multiple` is false.', propName);
3968 }
3969 }
3970
3971 if (props.value !== undefined && props.defaultValue !== undefined && !didWarnDefaultSelectValue) {
3972 error('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');
3973
3974 didWarnDefaultSelectValue = true;
3975 }
3976 }
3977
3978 this.currentSelectValue = props.value != null ? props.value : props.defaultValue;
3979 props = _assign({}, props, {
3980 value: undefined
3981 });
3982 } else if (tag === 'option') {
3983 var selected = null;
3984 var selectValue = this.currentSelectValue;
3985 var optionChildren = flattenOptionChildren(props.children);
3986
3987 if (selectValue != null) {
3988 var value;
3989
3990 if (props.value != null) {
3991 value = props.value + '';
3992 } else {
3993 value = optionChildren;
3994 }
3995
3996 selected = false;
3997
3998 if (Array.isArray(selectValue)) {
3999 // multiple
4000 for (var j = 0; j < selectValue.length; j++) {
4001 if ('' + selectValue[j] === value) {
4002 selected = true;
4003 break;
4004 }
4005 }
4006 } else {
4007 selected = '' + selectValue === value;
4008 }
4009
4010 props = _assign({
4011 selected: undefined,
4012 children: undefined
4013 }, props, {
4014 selected: selected,
4015 children: optionChildren
4016 });
4017 }
4018 }
4019
4020 {
4021 validatePropertiesInDevelopment(tag, props);
4022 }
4023
4024 assertValidProps(tag, props);
4025 var out = createOpenTagMarkup(element.type, tag, props, namespace, this.makeStaticMarkup, this.stack.length === 1);
4026 var footer = '';
4027
4028 if (omittedCloseTags.hasOwnProperty(tag)) {
4029 out += '/>';
4030 } else {
4031 out += '>';
4032 footer = '</' + element.type + '>';
4033 }
4034
4035 var children;
4036 var innerMarkup = getNonChildrenInnerMarkup(props);
4037
4038 if (innerMarkup != null) {
4039 children = [];
4040
4041 if (newlineEatingTags.hasOwnProperty(tag) && innerMarkup.charAt(0) === '\n') {
4042 // text/html ignores the first character in these tags if it's a newline
4043 // Prefer to break application/xml over text/html (for now) by adding
4044 // a newline specifically to get eaten by the parser. (Alternately for
4045 // textareas, replacing "^\n" with "\r\n" doesn't get eaten, and the first
4046 // \r is normalized out by HTMLTextAreaElement#value.)
4047 // See: <http://www.w3.org/TR/html-polyglot/#newlines-in-textarea-and-pre>
4048 // See: <http://www.w3.org/TR/html5/syntax.html#element-restrictions>
4049 // See: <http://www.w3.org/TR/html5/syntax.html#newlines>
4050 // See: Parsing of "textarea" "listing" and "pre" elements
4051 // from <http://www.w3.org/TR/html5/syntax.html#parsing-main-inbody>
4052 out += '\n';
4053 }
4054
4055 out += innerMarkup;
4056 } else {
4057 children = toArray(props.children);
4058 }
4059
4060 var frame = {
4061 domNamespace: getChildNamespace(parentNamespace, element.type),
4062 type: tag,
4063 children: children,
4064 childIndex: 0,
4065 context: context,
4066 footer: footer
4067 };
4068
4069 {
4070 frame.debugElementStack = [];
4071 }
4072
4073 this.stack.push(frame);
4074 this.previousWasTextNode = false;
4075 return out;
4076 };
4077
4078 return ReactDOMServerRenderer;
4079 }();
4080
4081 /**
4082 * Render a ReactElement to its initial HTML. This should only be used on the
4083 * server.
4084 * See https://reactjs.org/docs/react-dom-server.html#rendertostring
4085 */
4086
4087 function renderToString(element) {
4088 var renderer = new ReactDOMServerRenderer(element, false);
4089
4090 try {
4091 var markup = renderer.read(Infinity);
4092 return markup;
4093 } finally {
4094 renderer.destroy();
4095 }
4096 }
4097 /**
4098 * Similar to renderToString, except this doesn't create extra DOM attributes
4099 * such as data-react-id that React uses internally.
4100 * See https://reactjs.org/docs/react-dom-server.html#rendertostaticmarkup
4101 */
4102
4103 function renderToStaticMarkup(element) {
4104 var renderer = new ReactDOMServerRenderer(element, true);
4105
4106 try {
4107 var markup = renderer.read(Infinity);
4108 return markup;
4109 } finally {
4110 renderer.destroy();
4111 }
4112 }
4113
4114 function renderToNodeStream() {
4115 {
4116 {
4117 throw Error( "ReactDOMServer.renderToNodeStream(): The streaming API is not available in the browser. Use ReactDOMServer.renderToString() instead." );
4118 }
4119 }
4120 }
4121
4122 function renderToStaticNodeStream() {
4123 {
4124 {
4125 throw Error( "ReactDOMServer.renderToStaticNodeStream(): The streaming API is not available in the browser. Use ReactDOMServer.renderToStaticMarkup() instead." );
4126 }
4127 }
4128 } // Note: when changing this, also consider https://github.com/facebook/react/issues/11526
4129
4130
4131 var ReactDOMServer = {
4132 renderToString: renderToString,
4133 renderToStaticMarkup: renderToStaticMarkup,
4134 renderToNodeStream: renderToNodeStream,
4135 renderToStaticNodeStream: renderToStaticNodeStream,
4136 version: ReactVersion
4137 };
4138
4139 // TODO: decide on the top-level export form.
4140 // This is hacky but makes it work with both Rollup and Jest
4141
4142
4143 var server_browser = ReactDOMServer.default || ReactDOMServer;
4144
4145 return server_browser;
4146
4147})));