3253 lines
104 KiB
JavaScript
3253 lines
104 KiB
JavaScript
/** @license React v16.0.0
|
|
* react-dom-server.node.development.js
|
|
*
|
|
* Copyright (c) 2013-present, Facebook, Inc.
|
|
*
|
|
* This source code is licensed under the MIT license found in the
|
|
* LICENSE file in the root directory of this source tree.
|
|
*/
|
|
'use strict';
|
|
|
|
|
|
if (process.env.NODE_ENV !== "production") {
|
|
(function() {
|
|
|
|
'use strict';
|
|
|
|
var objectAssign$1 = require('object-assign');
|
|
var invariant = require('fbjs/lib/invariant');
|
|
var require$$0 = require('fbjs/lib/warning');
|
|
var react = require('react');
|
|
var emptyFunction = require('fbjs/lib/emptyFunction');
|
|
var propTypes = require('prop-types');
|
|
var emptyObject = require('fbjs/lib/emptyObject');
|
|
var hyphenateStyleName = require('fbjs/lib/hyphenateStyleName');
|
|
var memoizeStringOnly = require('fbjs/lib/memoizeStringOnly');
|
|
var checkPropTypes = require('prop-types/checkPropTypes');
|
|
var camelizeStyleName = require('fbjs/lib/camelizeStyleName');
|
|
var stream = require('stream');
|
|
|
|
/**
|
|
* Copyright (c) 2013-present, Facebook, Inc.
|
|
*
|
|
* This source code is licensed under the MIT license found in the
|
|
* LICENSE file in the root directory of this source tree.
|
|
*
|
|
* @providesModule reactProdInvariant
|
|
*
|
|
*/
|
|
|
|
/**
|
|
* Copyright (c) 2013-present, Facebook, Inc.
|
|
*
|
|
* This source code is licensed under the MIT license found in the
|
|
* LICENSE file in the root directory of this source tree.
|
|
*
|
|
* @providesModule DOMNamespaces
|
|
*/
|
|
|
|
var HTML_NAMESPACE = 'http://www.w3.org/1999/xhtml';
|
|
var MATH_NAMESPACE = 'http://www.w3.org/1998/Math/MathML';
|
|
var SVG_NAMESPACE = 'http://www.w3.org/2000/svg';
|
|
|
|
var Namespaces$1 = {
|
|
html: HTML_NAMESPACE,
|
|
mathml: MATH_NAMESPACE,
|
|
svg: SVG_NAMESPACE
|
|
};
|
|
|
|
// Assumes there is no parent namespace.
|
|
function getIntrinsicNamespace$1(type) {
|
|
switch (type) {
|
|
case 'svg':
|
|
return SVG_NAMESPACE;
|
|
case 'math':
|
|
return MATH_NAMESPACE;
|
|
default:
|
|
return HTML_NAMESPACE;
|
|
}
|
|
}
|
|
|
|
function getChildNamespace$1(parentNamespace, type) {
|
|
if (parentNamespace == null || parentNamespace === HTML_NAMESPACE) {
|
|
// No (or default) parent namespace: potential entry point.
|
|
return getIntrinsicNamespace$1(type);
|
|
}
|
|
if (parentNamespace === SVG_NAMESPACE && type === 'foreignObject') {
|
|
// We're leaving SVG.
|
|
return HTML_NAMESPACE;
|
|
}
|
|
// By default, pass namespace below.
|
|
return parentNamespace;
|
|
}
|
|
|
|
var Namespaces_1 = Namespaces$1;
|
|
var getIntrinsicNamespace_1 = getIntrinsicNamespace$1;
|
|
var getChildNamespace_1 = getChildNamespace$1;
|
|
|
|
var DOMNamespaces = {
|
|
Namespaces: Namespaces_1,
|
|
getIntrinsicNamespace: getIntrinsicNamespace_1,
|
|
getChildNamespace: getChildNamespace_1
|
|
};
|
|
|
|
// These attributes should be all lowercase to allow for
|
|
// case insensitive checks
|
|
var RESERVED_PROPS$1 = {
|
|
children: true,
|
|
dangerouslySetInnerHTML: true,
|
|
autoFocus: true,
|
|
defaultValue: true,
|
|
defaultChecked: true,
|
|
innerHTML: true,
|
|
suppressContentEditableWarning: true,
|
|
style: true
|
|
};
|
|
|
|
function checkMask(value, bitmask) {
|
|
return (value & bitmask) === bitmask;
|
|
}
|
|
|
|
var DOMPropertyInjection = {
|
|
/**
|
|
* Mapping from normalized, camelcased property names to a configuration that
|
|
* specifies how the associated DOM property should be accessed or rendered.
|
|
*/
|
|
MUST_USE_PROPERTY: 0x1,
|
|
HAS_BOOLEAN_VALUE: 0x4,
|
|
HAS_NUMERIC_VALUE: 0x8,
|
|
HAS_POSITIVE_NUMERIC_VALUE: 0x10 | 0x8,
|
|
HAS_OVERLOADED_BOOLEAN_VALUE: 0x20,
|
|
HAS_STRING_BOOLEAN_VALUE: 0x40,
|
|
|
|
/**
|
|
* Inject some specialized knowledge about the DOM. This takes a config object
|
|
* with the following properties:
|
|
*
|
|
* Properties: object mapping DOM property name to one of the
|
|
* DOMPropertyInjection constants or null. If your attribute isn't in here,
|
|
* it won't get written to the DOM.
|
|
*
|
|
* DOMAttributeNames: object mapping React attribute name to the DOM
|
|
* attribute name. Attribute names not specified use the **lowercase**
|
|
* normalized name.
|
|
*
|
|
* DOMAttributeNamespaces: object mapping React attribute name to the DOM
|
|
* attribute namespace URL. (Attribute names not specified use no namespace.)
|
|
*
|
|
* DOMPropertyNames: similar to DOMAttributeNames but for DOM properties.
|
|
* Property names not specified use the normalized name.
|
|
*
|
|
* DOMMutationMethods: Properties that require special mutation methods. If
|
|
* `value` is undefined, the mutation method should unset the property.
|
|
*
|
|
* @param {object} domPropertyConfig the config as described above.
|
|
*/
|
|
injectDOMPropertyConfig: function (domPropertyConfig) {
|
|
var Injection = DOMPropertyInjection;
|
|
var Properties = domPropertyConfig.Properties || {};
|
|
var DOMAttributeNamespaces = domPropertyConfig.DOMAttributeNamespaces || {};
|
|
var DOMAttributeNames = domPropertyConfig.DOMAttributeNames || {};
|
|
var DOMMutationMethods = domPropertyConfig.DOMMutationMethods || {};
|
|
|
|
for (var propName in Properties) {
|
|
!!DOMProperty.properties.hasOwnProperty(propName) ? invariant(false, 'injectDOMPropertyConfig(...): You\'re trying to inject DOM property \'%s\' which has already been injected. You may be accidentally injecting the same DOM property config twice, or you may be injecting two configs that have conflicting property names.', propName) : void 0;
|
|
|
|
var lowerCased = propName.toLowerCase();
|
|
var propConfig = Properties[propName];
|
|
|
|
var propertyInfo = {
|
|
attributeName: lowerCased,
|
|
attributeNamespace: null,
|
|
propertyName: propName,
|
|
mutationMethod: null,
|
|
|
|
mustUseProperty: checkMask(propConfig, Injection.MUST_USE_PROPERTY),
|
|
hasBooleanValue: checkMask(propConfig, Injection.HAS_BOOLEAN_VALUE),
|
|
hasNumericValue: checkMask(propConfig, Injection.HAS_NUMERIC_VALUE),
|
|
hasPositiveNumericValue: checkMask(propConfig, Injection.HAS_POSITIVE_NUMERIC_VALUE),
|
|
hasOverloadedBooleanValue: checkMask(propConfig, Injection.HAS_OVERLOADED_BOOLEAN_VALUE),
|
|
hasStringBooleanValue: checkMask(propConfig, Injection.HAS_STRING_BOOLEAN_VALUE)
|
|
};
|
|
!(propertyInfo.hasBooleanValue + propertyInfo.hasNumericValue + propertyInfo.hasOverloadedBooleanValue <= 1) ? invariant(false, 'DOMProperty: Value can be one of boolean, overloaded boolean, or numeric value, but not a combination: %s', propName) : void 0;
|
|
|
|
if (DOMAttributeNames.hasOwnProperty(propName)) {
|
|
var attributeName = DOMAttributeNames[propName];
|
|
|
|
propertyInfo.attributeName = attributeName;
|
|
}
|
|
|
|
if (DOMAttributeNamespaces.hasOwnProperty(propName)) {
|
|
propertyInfo.attributeNamespace = DOMAttributeNamespaces[propName];
|
|
}
|
|
|
|
if (DOMMutationMethods.hasOwnProperty(propName)) {
|
|
propertyInfo.mutationMethod = DOMMutationMethods[propName];
|
|
}
|
|
|
|
// Downcase references to whitelist properties to check for membership
|
|
// without case-sensitivity. This allows the whitelist to pick up
|
|
// `allowfullscreen`, which should be written using the property configuration
|
|
// for `allowFullscreen`
|
|
DOMProperty.properties[propName] = propertyInfo;
|
|
}
|
|
}
|
|
};
|
|
|
|
/* eslint-disable max-len */
|
|
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';
|
|
/* eslint-enable max-len */
|
|
|
|
/**
|
|
* DOMProperty exports lookup objects that can be used like functions:
|
|
*
|
|
* > DOMProperty.isValid['id']
|
|
* true
|
|
* > DOMProperty.isValid['foobar']
|
|
* undefined
|
|
*
|
|
* Although this may be confusing, it performs better in general.
|
|
*
|
|
* @see http://jsperf.com/key-exists
|
|
* @see http://jsperf.com/key-missing
|
|
*/
|
|
var DOMProperty = {
|
|
ID_ATTRIBUTE_NAME: 'data-reactid',
|
|
ROOT_ATTRIBUTE_NAME: 'data-reactroot',
|
|
|
|
ATTRIBUTE_NAME_START_CHAR: ATTRIBUTE_NAME_START_CHAR,
|
|
ATTRIBUTE_NAME_CHAR: ATTRIBUTE_NAME_START_CHAR + '\\-.0-9\\u00B7\\u0300-\\u036F\\u203F-\\u2040',
|
|
|
|
/**
|
|
* Map from property "standard name" to an object with info about how to set
|
|
* the property in the DOM. Each object contains:
|
|
*
|
|
* attributeName:
|
|
* Used when rendering markup or with `*Attribute()`.
|
|
* attributeNamespace
|
|
* propertyName:
|
|
* Used on DOM node instances. (This includes properties that mutate due to
|
|
* external factors.)
|
|
* mutationMethod:
|
|
* If non-null, used instead of the property or `setAttribute()` after
|
|
* initial render.
|
|
* mustUseProperty:
|
|
* Whether the property must be accessed and mutated as an object property.
|
|
* hasBooleanValue:
|
|
* Whether the property should be removed when set to a falsey value.
|
|
* hasNumericValue:
|
|
* Whether the property must be numeric or parse as a numeric and should be
|
|
* removed when set to a falsey value.
|
|
* hasPositiveNumericValue:
|
|
* Whether the property must be positive numeric or parse as a positive
|
|
* numeric and should be removed when set to a falsey value.
|
|
* hasOverloadedBooleanValue:
|
|
* Whether the property can be used as a flag as well as with a value.
|
|
* Removed when strictly equal to false; present without a value when
|
|
* strictly equal to true; present with a value otherwise.
|
|
*/
|
|
properties: {},
|
|
|
|
/**
|
|
* Checks whether a property name is a writeable attribute.
|
|
* @method
|
|
*/
|
|
shouldSetAttribute: function (name, value) {
|
|
if (DOMProperty.isReservedProp(name)) {
|
|
return false;
|
|
}
|
|
if ((name[0] === 'o' || name[0] === 'O') && (name[1] === 'n' || name[1] === 'N')) {
|
|
return false;
|
|
}
|
|
if (value === null) {
|
|
return true;
|
|
}
|
|
switch (typeof value) {
|
|
case 'boolean':
|
|
return DOMProperty.shouldAttributeAcceptBooleanValue(name);
|
|
case 'undefined':
|
|
case 'number':
|
|
case 'string':
|
|
case 'object':
|
|
return true;
|
|
default:
|
|
// function, symbol
|
|
return false;
|
|
}
|
|
},
|
|
|
|
getPropertyInfo: function (name) {
|
|
return DOMProperty.properties.hasOwnProperty(name) ? DOMProperty.properties[name] : null;
|
|
},
|
|
shouldAttributeAcceptBooleanValue: function (name) {
|
|
if (DOMProperty.isReservedProp(name)) {
|
|
return true;
|
|
}
|
|
var propertyInfo = DOMProperty.getPropertyInfo(name);
|
|
if (propertyInfo) {
|
|
return propertyInfo.hasBooleanValue || propertyInfo.hasStringBooleanValue || propertyInfo.hasOverloadedBooleanValue;
|
|
}
|
|
var prefix = name.toLowerCase().slice(0, 5);
|
|
return prefix === 'data-' || prefix === 'aria-';
|
|
},
|
|
|
|
|
|
/**
|
|
* Checks to see if a property name is within the list of properties
|
|
* reserved for internal React operations. These properties should
|
|
* not be set on an HTML element.
|
|
*
|
|
* @private
|
|
* @param {string} name
|
|
* @return {boolean} If the name is within reserved props
|
|
*/
|
|
isReservedProp: function (name) {
|
|
return RESERVED_PROPS$1.hasOwnProperty(name);
|
|
},
|
|
|
|
|
|
injection: DOMPropertyInjection
|
|
};
|
|
|
|
var DOMProperty_1 = DOMProperty;
|
|
|
|
/**
|
|
* Copyright (c) 2016-present, Facebook, Inc.
|
|
*
|
|
* This source code is licensed under the MIT license found in the
|
|
* LICENSE file in the root directory of this source tree.
|
|
*
|
|
* Based on the escape-html library, which is used under the MIT License below:
|
|
*
|
|
* Copyright (c) 2012-2013 TJ Holowaychuk
|
|
* Copyright (c) 2015 Andreas Lubbe
|
|
* Copyright (c) 2015 Tiancheng "Timothy" Gu
|
|
*
|
|
* Permission is hereby granted, free of charge, to any person obtaining
|
|
* a copy of this software and associated documentation files (the
|
|
* 'Software'), to deal in the Software without restriction, including
|
|
* without limitation the rights to use, copy, modify, merge, publish,
|
|
* distribute, sublicense, and/or sell copies of the Software, and to
|
|
* permit persons to whom the Software is furnished to do so, subject to
|
|
* the following conditions:
|
|
*
|
|
* The above copyright notice and this permission notice shall be
|
|
* included in all copies or substantial portions of the Software.
|
|
*
|
|
* THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND,
|
|
* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
|
* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
|
|
* IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
|
|
* CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
|
|
* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
|
|
* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
|
*
|
|
* @providesModule escapeTextContentForBrowser
|
|
*/
|
|
|
|
// code copied and modified from escape-html
|
|
/**
|
|
* Module variables.
|
|
* @private
|
|
*/
|
|
|
|
var matchHtmlRegExp = /["'&<>]/;
|
|
|
|
/**
|
|
* Escape special characters in the given string of html.
|
|
*
|
|
* @param {string} string The string to escape for inserting into HTML
|
|
* @return {string}
|
|
* @public
|
|
*/
|
|
|
|
function escapeHtml(string) {
|
|
var str = '' + string;
|
|
var match = matchHtmlRegExp.exec(str);
|
|
|
|
if (!match) {
|
|
return str;
|
|
}
|
|
|
|
var escape;
|
|
var html = '';
|
|
var index = 0;
|
|
var lastIndex = 0;
|
|
|
|
for (index = match.index; index < str.length; index++) {
|
|
switch (str.charCodeAt(index)) {
|
|
case 34:
|
|
// "
|
|
escape = '"';
|
|
break;
|
|
case 38:
|
|
// &
|
|
escape = '&';
|
|
break;
|
|
case 39:
|
|
// '
|
|
escape = '''; // modified from escape-html; used to be '''
|
|
break;
|
|
case 60:
|
|
// <
|
|
escape = '<';
|
|
break;
|
|
case 62:
|
|
// >
|
|
escape = '>';
|
|
break;
|
|
default:
|
|
continue;
|
|
}
|
|
|
|
if (lastIndex !== index) {
|
|
html += str.substring(lastIndex, index);
|
|
}
|
|
|
|
lastIndex = index + 1;
|
|
html += escape;
|
|
}
|
|
|
|
return lastIndex !== index ? html + str.substring(lastIndex, index) : html;
|
|
}
|
|
// end code copied and modified from escape-html
|
|
|
|
/**
|
|
* Escapes text to prevent scripting attacks.
|
|
*
|
|
* @param {*} text Text value to escape.
|
|
* @return {string} An escaped string.
|
|
*/
|
|
function escapeTextContentForBrowser(text) {
|
|
if (typeof text === 'boolean' || typeof text === 'number') {
|
|
// this shortcircuit helps perf for types that we know will never have
|
|
// special characters, especially given that this function is used often
|
|
// for numeric dom ids.
|
|
return '' + text;
|
|
}
|
|
return escapeHtml(text);
|
|
}
|
|
|
|
var escapeTextContentForBrowser_1 = escapeTextContentForBrowser;
|
|
|
|
/**
|
|
* Escapes attribute value to prevent scripting attacks.
|
|
*
|
|
* @param {*} value Value to escape.
|
|
* @return {string} An escaped string.
|
|
*/
|
|
function quoteAttributeValueForBrowser(value) {
|
|
return '"' + escapeTextContentForBrowser_1(value) + '"';
|
|
}
|
|
|
|
var quoteAttributeValueForBrowser_1 = quoteAttributeValueForBrowser;
|
|
|
|
{
|
|
var warning$1 = require$$0;
|
|
}
|
|
|
|
// isAttributeNameSafe() is currently duplicated in DOMPropertyOperations.
|
|
// TODO: Find a better place for this.
|
|
var VALID_ATTRIBUTE_NAME_REGEX = new RegExp('^[' + DOMProperty_1.ATTRIBUTE_NAME_START_CHAR + '][' + DOMProperty_1.ATTRIBUTE_NAME_CHAR + ']*$');
|
|
var illegalAttributeNameCache = {};
|
|
var validatedAttributeNameCache = {};
|
|
function isAttributeNameSafe(attributeName) {
|
|
if (validatedAttributeNameCache.hasOwnProperty(attributeName)) {
|
|
return true;
|
|
}
|
|
if (illegalAttributeNameCache.hasOwnProperty(attributeName)) {
|
|
return false;
|
|
}
|
|
if (VALID_ATTRIBUTE_NAME_REGEX.test(attributeName)) {
|
|
validatedAttributeNameCache[attributeName] = true;
|
|
return true;
|
|
}
|
|
illegalAttributeNameCache[attributeName] = true;
|
|
{
|
|
warning$1(false, 'Invalid attribute name: `%s`', attributeName);
|
|
}
|
|
return false;
|
|
}
|
|
|
|
// shouldIgnoreValue() is currently duplicated in DOMPropertyOperations.
|
|
// TODO: Find a better place for this.
|
|
function shouldIgnoreValue(propertyInfo, value) {
|
|
return value == null || propertyInfo.hasBooleanValue && !value || propertyInfo.hasNumericValue && isNaN(value) || propertyInfo.hasPositiveNumericValue && value < 1 || propertyInfo.hasOverloadedBooleanValue && value === false;
|
|
}
|
|
|
|
/**
|
|
* Operations for dealing with DOM properties.
|
|
*/
|
|
var DOMMarkupOperations = {
|
|
/**
|
|
* Creates markup for the ID property.
|
|
*
|
|
* @param {string} id Unescaped ID.
|
|
* @return {string} Markup string.
|
|
*/
|
|
createMarkupForID: function (id) {
|
|
return DOMProperty_1.ID_ATTRIBUTE_NAME + '=' + quoteAttributeValueForBrowser_1(id);
|
|
},
|
|
|
|
createMarkupForRoot: function () {
|
|
return DOMProperty_1.ROOT_ATTRIBUTE_NAME + '=""';
|
|
},
|
|
|
|
/**
|
|
* Creates markup for a property.
|
|
*
|
|
* @param {string} name
|
|
* @param {*} value
|
|
* @return {?string} Markup string, or null if the property was invalid.
|
|
*/
|
|
createMarkupForProperty: function (name, value) {
|
|
var propertyInfo = DOMProperty_1.getPropertyInfo(name);
|
|
if (propertyInfo) {
|
|
if (shouldIgnoreValue(propertyInfo, value)) {
|
|
return '';
|
|
}
|
|
var attributeName = propertyInfo.attributeName;
|
|
if (propertyInfo.hasBooleanValue || propertyInfo.hasOverloadedBooleanValue && value === true) {
|
|
return attributeName + '=""';
|
|
} else if (typeof value !== 'boolean' || DOMProperty_1.shouldAttributeAcceptBooleanValue(name)) {
|
|
return attributeName + '=' + quoteAttributeValueForBrowser_1(value);
|
|
}
|
|
} else if (DOMProperty_1.shouldSetAttribute(name, value)) {
|
|
if (value == null) {
|
|
return '';
|
|
}
|
|
return name + '=' + quoteAttributeValueForBrowser_1(value);
|
|
}
|
|
return null;
|
|
},
|
|
|
|
/**
|
|
* Creates markup for a custom property.
|
|
*
|
|
* @param {string} name
|
|
* @param {*} value
|
|
* @return {string} Markup string, or empty string if the property was invalid.
|
|
*/
|
|
createMarkupForCustomAttribute: function (name, value) {
|
|
if (!isAttributeNameSafe(name) || value == null) {
|
|
return '';
|
|
}
|
|
return name + '=' + quoteAttributeValueForBrowser_1(value);
|
|
}
|
|
};
|
|
|
|
var DOMMarkupOperations_1 = DOMMarkupOperations;
|
|
|
|
var ReactControlledValuePropTypes = {
|
|
checkPropTypes: null
|
|
};
|
|
|
|
{
|
|
var warning$2 = require$$0;
|
|
var emptyFunction$1 = emptyFunction;
|
|
var PropTypes = propTypes;
|
|
var ReactPropTypesSecret = 'SECRET_DO_NOT_PASS_THIS_OR_YOU_WILL_BE_FIRED';
|
|
|
|
ReactControlledValuePropTypes.checkPropTypes = emptyFunction$1;
|
|
var hasReadOnlyValue = {
|
|
button: true,
|
|
checkbox: true,
|
|
image: true,
|
|
hidden: true,
|
|
radio: true,
|
|
reset: true,
|
|
submit: true
|
|
};
|
|
|
|
var propTypes$1 = {
|
|
value: function (props, propName, componentName) {
|
|
if (!props[propName] || hasReadOnlyValue[props.type] || props.onChange || props.readOnly || props.disabled) {
|
|
return null;
|
|
}
|
|
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`.');
|
|
},
|
|
checked: function (props, propName, componentName) {
|
|
if (!props[propName] || props.onChange || props.readOnly || props.disabled) {
|
|
return null;
|
|
}
|
|
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`.');
|
|
},
|
|
onChange: PropTypes.func
|
|
};
|
|
|
|
var loggedTypeFailures = {};
|
|
|
|
/**
|
|
* Provide a linked `value` attribute for controlled forms. You should not use
|
|
* this outside of the ReactDOM controlled form components.
|
|
*/
|
|
ReactControlledValuePropTypes.checkPropTypes = function (tagName, props, getStack) {
|
|
for (var propName in propTypes$1) {
|
|
if (propTypes$1.hasOwnProperty(propName)) {
|
|
var error = propTypes$1[propName](props, propName, tagName, 'prop', null, ReactPropTypesSecret);
|
|
}
|
|
if (error instanceof Error && !(error.message in loggedTypeFailures)) {
|
|
// Only monitor this failure once because there tends to be a lot of the
|
|
// same error.
|
|
loggedTypeFailures[error.message] = true;
|
|
|
|
warning$2(false, 'Failed form propType: %s%s', error.message, getStack());
|
|
}
|
|
}
|
|
};
|
|
}
|
|
|
|
var ReactControlledValuePropTypes_1 = ReactControlledValuePropTypes;
|
|
|
|
/**
|
|
* Copyright (c) 2013-present, Facebook, Inc.
|
|
*
|
|
* This source code is licensed under the MIT license found in the
|
|
* LICENSE file in the root directory of this source tree.
|
|
*
|
|
* @providesModule omittedCloseTags
|
|
*/
|
|
|
|
// For HTML, certain tags should omit their close tag. We keep a whitelist for
|
|
// those special-case tags.
|
|
|
|
var omittedCloseTags = {
|
|
area: true,
|
|
base: true,
|
|
br: true,
|
|
col: true,
|
|
embed: true,
|
|
hr: true,
|
|
img: true,
|
|
input: true,
|
|
keygen: true,
|
|
link: true,
|
|
meta: true,
|
|
param: true,
|
|
source: true,
|
|
track: true,
|
|
wbr: true
|
|
};
|
|
|
|
var omittedCloseTags_1 = omittedCloseTags;
|
|
|
|
// For HTML, certain tags cannot have children. This has the same purpose as
|
|
// `omittedCloseTags` except that `menuitem` should still have its closing tag.
|
|
|
|
var voidElementTags = objectAssign$1({
|
|
menuitem: true
|
|
}, omittedCloseTags_1);
|
|
|
|
var voidElementTags_1 = voidElementTags;
|
|
|
|
{
|
|
var warning$3 = require$$0;
|
|
}
|
|
|
|
var HTML = '__html';
|
|
|
|
function getDeclarationErrorAddendum(getCurrentOwnerName) {
|
|
{
|
|
var ownerName = getCurrentOwnerName();
|
|
if (ownerName) {
|
|
// TODO: also report the stack.
|
|
return '\n\nThis DOM node was rendered by `' + ownerName + '`.';
|
|
}
|
|
}
|
|
return '';
|
|
}
|
|
|
|
function assertValidProps(tag, props, getCurrentOwnerName) {
|
|
if (!props) {
|
|
return;
|
|
}
|
|
// Note the use of `==` which checks for null or undefined.
|
|
if (voidElementTags_1[tag]) {
|
|
!(props.children == null && props.dangerouslySetInnerHTML == null) ? invariant(false, '%s is a void element tag and must neither have `children` nor use `dangerouslySetInnerHTML`.%s', tag, getDeclarationErrorAddendum(getCurrentOwnerName)) : void 0;
|
|
}
|
|
if (props.dangerouslySetInnerHTML != null) {
|
|
!(props.children == null) ? invariant(false, 'Can only set one of `children` or `props.dangerouslySetInnerHTML`.') : void 0;
|
|
!(typeof props.dangerouslySetInnerHTML === 'object' && HTML in props.dangerouslySetInnerHTML) ? invariant(false, '`props.dangerouslySetInnerHTML` must be in the form `{__html: ...}`. Please visit https://fb.me/react-invariant-dangerously-set-inner-html for more information.') : void 0;
|
|
}
|
|
{
|
|
warning$3(props.suppressContentEditableWarning || !props.contentEditable || props.children == null, '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.');
|
|
}
|
|
!(props.style == null || typeof props.style === 'object') ? invariant(false, 'The `style` prop expects a mapping from style properties to values, not a string. For example, style={{marginRight: spacing + \'em\'}} when using JSX.%s', getDeclarationErrorAddendum(getCurrentOwnerName)) : void 0;
|
|
}
|
|
|
|
var assertValidProps_1 = assertValidProps;
|
|
|
|
/**
|
|
* Copyright (c) 2013-present, Facebook, Inc.
|
|
*
|
|
* This source code is licensed under the MIT license found in the
|
|
* LICENSE file in the root directory of this source tree.
|
|
*
|
|
* @providesModule CSSProperty
|
|
*/
|
|
|
|
/**
|
|
* CSS properties which accept numbers but are not in units of "px".
|
|
*/
|
|
|
|
var isUnitlessNumber$1 = {
|
|
animationIterationCount: true,
|
|
borderImageOutset: true,
|
|
borderImageSlice: true,
|
|
borderImageWidth: true,
|
|
boxFlex: true,
|
|
boxFlexGroup: true,
|
|
boxOrdinalGroup: true,
|
|
columnCount: true,
|
|
columns: true,
|
|
flex: true,
|
|
flexGrow: true,
|
|
flexPositive: true,
|
|
flexShrink: true,
|
|
flexNegative: true,
|
|
flexOrder: true,
|
|
gridRow: true,
|
|
gridRowEnd: true,
|
|
gridRowSpan: true,
|
|
gridRowStart: true,
|
|
gridColumn: true,
|
|
gridColumnEnd: true,
|
|
gridColumnSpan: true,
|
|
gridColumnStart: true,
|
|
fontWeight: true,
|
|
lineClamp: true,
|
|
lineHeight: true,
|
|
opacity: true,
|
|
order: true,
|
|
orphans: true,
|
|
tabSize: true,
|
|
widows: true,
|
|
zIndex: true,
|
|
zoom: true,
|
|
|
|
// SVG-related properties
|
|
fillOpacity: true,
|
|
floodOpacity: true,
|
|
stopOpacity: true,
|
|
strokeDasharray: true,
|
|
strokeDashoffset: true,
|
|
strokeMiterlimit: true,
|
|
strokeOpacity: true,
|
|
strokeWidth: true
|
|
};
|
|
|
|
/**
|
|
* @param {string} prefix vendor-specific prefix, eg: Webkit
|
|
* @param {string} key style name, eg: transitionDuration
|
|
* @return {string} style name prefixed with `prefix`, properly camelCased, eg:
|
|
* WebkitTransitionDuration
|
|
*/
|
|
function prefixKey(prefix, key) {
|
|
return prefix + key.charAt(0).toUpperCase() + key.substring(1);
|
|
}
|
|
|
|
/**
|
|
* Support style names that may come passed in prefixed by adding permutations
|
|
* of vendor prefixes.
|
|
*/
|
|
var prefixes = ['Webkit', 'ms', 'Moz', 'O'];
|
|
|
|
// Using Object.keys here, or else the vanilla for-in loop makes IE8 go into an
|
|
// infinite loop, because it iterates over the newly added props too.
|
|
Object.keys(isUnitlessNumber$1).forEach(function (prop) {
|
|
prefixes.forEach(function (prefix) {
|
|
isUnitlessNumber$1[prefixKey(prefix, prop)] = isUnitlessNumber$1[prop];
|
|
});
|
|
});
|
|
|
|
/**
|
|
* Most style properties can be unset by doing .style[prop] = '' but IE8
|
|
* doesn't like doing that with shorthand properties so for the properties that
|
|
* IE8 breaks on, which are listed here, we instead unset each of the
|
|
* individual properties. See http://bugs.jquery.com/ticket/12385.
|
|
* The 4-value 'clock' properties like margin, padding, border-width seem to
|
|
* behave without any problems. Curiously, list-style works too without any
|
|
* special prodding.
|
|
*/
|
|
var shorthandPropertyExpansions = {
|
|
background: {
|
|
backgroundAttachment: true,
|
|
backgroundColor: true,
|
|
backgroundImage: true,
|
|
backgroundPositionX: true,
|
|
backgroundPositionY: true,
|
|
backgroundRepeat: true
|
|
},
|
|
backgroundPosition: {
|
|
backgroundPositionX: true,
|
|
backgroundPositionY: true
|
|
},
|
|
border: {
|
|
borderWidth: true,
|
|
borderStyle: true,
|
|
borderColor: true
|
|
},
|
|
borderBottom: {
|
|
borderBottomWidth: true,
|
|
borderBottomStyle: true,
|
|
borderBottomColor: true
|
|
},
|
|
borderLeft: {
|
|
borderLeftWidth: true,
|
|
borderLeftStyle: true,
|
|
borderLeftColor: true
|
|
},
|
|
borderRight: {
|
|
borderRightWidth: true,
|
|
borderRightStyle: true,
|
|
borderRightColor: true
|
|
},
|
|
borderTop: {
|
|
borderTopWidth: true,
|
|
borderTopStyle: true,
|
|
borderTopColor: true
|
|
},
|
|
font: {
|
|
fontStyle: true,
|
|
fontVariant: true,
|
|
fontWeight: true,
|
|
fontSize: true,
|
|
lineHeight: true,
|
|
fontFamily: true
|
|
},
|
|
outline: {
|
|
outlineWidth: true,
|
|
outlineStyle: true,
|
|
outlineColor: true
|
|
}
|
|
};
|
|
|
|
var CSSProperty = {
|
|
isUnitlessNumber: isUnitlessNumber$1,
|
|
shorthandPropertyExpansions: shorthandPropertyExpansions
|
|
};
|
|
|
|
var CSSProperty_1 = CSSProperty;
|
|
|
|
var isUnitlessNumber = CSSProperty_1.isUnitlessNumber;
|
|
|
|
/**
|
|
* Convert a value into the proper css writable value. The style name `name`
|
|
* should be logical (no hyphens), as specified
|
|
* in `CSSProperty.isUnitlessNumber`.
|
|
*
|
|
* @param {string} name CSS property name such as `topMargin`.
|
|
* @param {*} value CSS property value such as `10px`.
|
|
* @return {string} Normalized style value with dimensions applied.
|
|
*/
|
|
function dangerousStyleValue(name, value, isCustomProperty) {
|
|
// Note that we've removed escapeTextForBrowser() calls here since the
|
|
// whole string will be escaped when the attribute is injected into
|
|
// the markup. If you provide unsafe user data here they can inject
|
|
// arbitrary CSS which may be problematic (I couldn't repro this):
|
|
// https://www.owasp.org/index.php/XSS_Filter_Evasion_Cheat_Sheet
|
|
// http://www.thespanner.co.uk/2007/11/26/ultimate-xss-css-injection/
|
|
// This is not an XSS hole but instead a potential CSS injection issue
|
|
// which has lead to a greater discussion about how we're going to
|
|
// trust URLs moving forward. See #2115901
|
|
|
|
var isEmpty = value == null || typeof value === 'boolean' || value === '';
|
|
if (isEmpty) {
|
|
return '';
|
|
}
|
|
|
|
if (!isCustomProperty && typeof value === 'number' && value !== 0 && !(isUnitlessNumber.hasOwnProperty(name) && isUnitlessNumber[name])) {
|
|
return value + 'px'; // Presumes implicit 'px' suffix for unitless numbers
|
|
}
|
|
|
|
return ('' + value).trim();
|
|
}
|
|
|
|
var dangerousStyleValue_1 = dangerousStyleValue;
|
|
|
|
/**
|
|
* Copyright (c) 2013-present, Facebook, Inc.
|
|
*
|
|
* This source code is licensed under the MIT license found in the
|
|
* LICENSE file in the root directory of this source tree.
|
|
*
|
|
* @providesModule isCustomComponent
|
|
*
|
|
*/
|
|
|
|
function isCustomComponent(tagName, props) {
|
|
if (tagName.indexOf('-') === -1) {
|
|
return typeof props.is === 'string';
|
|
}
|
|
switch (tagName) {
|
|
// These are reserved SVG and MathML elements.
|
|
// We don't mind this whitelist too much because we expect it to never grow.
|
|
// The alternative is to track the namespace in a few places which is convoluted.
|
|
// https://w3c.github.io/webcomponents/spec/custom/#custom-elements-core-concepts
|
|
case 'annotation-xml':
|
|
case 'color-profile':
|
|
case 'font-face':
|
|
case 'font-face-src':
|
|
case 'font-face-uri':
|
|
case 'font-face-format':
|
|
case 'font-face-name':
|
|
case 'missing-glyph':
|
|
return false;
|
|
default:
|
|
return true;
|
|
}
|
|
}
|
|
|
|
var isCustomComponent_1 = isCustomComponent;
|
|
|
|
/**
|
|
* Copyright (c) 2013-present, Facebook, Inc.
|
|
*
|
|
* This source code is licensed under the MIT license found in the
|
|
* LICENSE file in the root directory of this source tree.
|
|
*
|
|
* @providesModule getComponentName
|
|
*
|
|
*/
|
|
|
|
function getComponentName$2(instanceOrFiber) {
|
|
if (typeof instanceOrFiber.getName === 'function') {
|
|
// Stack reconciler
|
|
var instance = instanceOrFiber;
|
|
return instance.getName();
|
|
}
|
|
if (typeof instanceOrFiber.tag === 'number') {
|
|
// Fiber reconciler
|
|
var fiber = instanceOrFiber;
|
|
var type = fiber.type;
|
|
|
|
if (typeof type === 'string') {
|
|
return type;
|
|
}
|
|
if (typeof type === 'function') {
|
|
return type.displayName || type.name;
|
|
}
|
|
}
|
|
return null;
|
|
}
|
|
|
|
var getComponentName_1 = getComponentName$2;
|
|
|
|
var ReactInternals = react.__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED;
|
|
|
|
var ReactGlobalSharedState = {
|
|
ReactCurrentOwner: ReactInternals.ReactCurrentOwner
|
|
};
|
|
|
|
{
|
|
objectAssign$1(ReactGlobalSharedState, {
|
|
ReactComponentTreeHook: ReactInternals.ReactComponentTreeHook,
|
|
ReactDebugCurrentFrame: ReactInternals.ReactDebugCurrentFrame
|
|
});
|
|
}
|
|
|
|
var ReactGlobalSharedState_1 = ReactGlobalSharedState;
|
|
|
|
/**
|
|
* Copyright (c) 2013-present, Facebook, Inc.
|
|
*
|
|
* This source code is licensed under the MIT license found in the
|
|
* LICENSE file in the root directory of this source tree.
|
|
*
|
|
* @providesModule ReactTypeOfWork
|
|
*
|
|
*/
|
|
|
|
var ReactTypeOfWork = {
|
|
IndeterminateComponent: 0, // Before we know whether it is functional or class
|
|
FunctionalComponent: 1,
|
|
ClassComponent: 2,
|
|
HostRoot: 3, // Root of a host tree. Could be nested inside another node.
|
|
HostPortal: 4, // A subtree. Could be an entry point to a different renderer.
|
|
HostComponent: 5,
|
|
HostText: 6,
|
|
CoroutineComponent: 7,
|
|
CoroutineHandlerPhase: 8,
|
|
YieldComponent: 9,
|
|
Fragment: 10
|
|
};
|
|
|
|
/**
|
|
* Copyright (c) 2016-present, Facebook, Inc.
|
|
*
|
|
* This source code is licensed under the MIT license found in the
|
|
* LICENSE file in the root directory of this source tree.
|
|
*
|
|
*
|
|
* @providesModule describeComponentFrame
|
|
*/
|
|
|
|
var describeComponentFrame$1 = function (name, source, ownerName) {
|
|
return '\n in ' + (name || 'Unknown') + (source ? ' (at ' + source.fileName.replace(/^.*[\\\/]/, '') + ':' + source.lineNumber + ')' : ownerName ? ' (created by ' + ownerName + ')' : '');
|
|
};
|
|
|
|
var IndeterminateComponent = ReactTypeOfWork.IndeterminateComponent;
|
|
var FunctionalComponent = ReactTypeOfWork.FunctionalComponent;
|
|
var ClassComponent = ReactTypeOfWork.ClassComponent;
|
|
var HostComponent = ReactTypeOfWork.HostComponent;
|
|
|
|
|
|
|
|
|
|
function describeFiber(fiber) {
|
|
switch (fiber.tag) {
|
|
case IndeterminateComponent:
|
|
case FunctionalComponent:
|
|
case ClassComponent:
|
|
case HostComponent:
|
|
var owner = fiber._debugOwner;
|
|
var source = fiber._debugSource;
|
|
var name = getComponentName_1(fiber);
|
|
var ownerName = null;
|
|
if (owner) {
|
|
ownerName = getComponentName_1(owner);
|
|
}
|
|
return describeComponentFrame$1(name, source, ownerName);
|
|
default:
|
|
return '';
|
|
}
|
|
}
|
|
|
|
// This function can only be called with a work-in-progress fiber and
|
|
// only during begin or complete phase. Do not call it under any other
|
|
// circumstances.
|
|
function getStackAddendumByWorkInProgressFiber$1(workInProgress) {
|
|
var info = '';
|
|
var node = workInProgress;
|
|
do {
|
|
info += describeFiber(node);
|
|
// Otherwise this return pointer might point to the wrong tree:
|
|
node = node['return'];
|
|
} while (node);
|
|
return info;
|
|
}
|
|
|
|
var ReactFiberComponentTreeHook = {
|
|
getStackAddendumByWorkInProgressFiber: getStackAddendumByWorkInProgressFiber$1
|
|
};
|
|
|
|
var ReactDebugCurrentFrame$1 = ReactGlobalSharedState_1.ReactDebugCurrentFrame;
|
|
|
|
{
|
|
var getComponentName$3 = getComponentName_1;
|
|
|
|
var _require2$1 = ReactFiberComponentTreeHook,
|
|
getStackAddendumByWorkInProgressFiber = _require2$1.getStackAddendumByWorkInProgressFiber;
|
|
}
|
|
|
|
function getCurrentFiberOwnerName$1() {
|
|
{
|
|
var fiber = ReactDebugCurrentFiber.current;
|
|
if (fiber === null) {
|
|
return null;
|
|
}
|
|
if (fiber._debugOwner != null) {
|
|
return getComponentName$3(fiber._debugOwner);
|
|
}
|
|
}
|
|
return null;
|
|
}
|
|
|
|
function getCurrentFiberStackAddendum() {
|
|
{
|
|
var fiber = ReactDebugCurrentFiber.current;
|
|
if (fiber === null) {
|
|
return null;
|
|
}
|
|
// Safe because if current fiber exists, we are reconciling,
|
|
// and it is guaranteed to be the work-in-progress version.
|
|
return getStackAddendumByWorkInProgressFiber(fiber);
|
|
}
|
|
return null;
|
|
}
|
|
|
|
function resetCurrentFiber() {
|
|
ReactDebugCurrentFrame$1.getCurrentStack = null;
|
|
ReactDebugCurrentFiber.current = null;
|
|
ReactDebugCurrentFiber.phase = null;
|
|
}
|
|
|
|
function setCurrentFiber(fiber, phase) {
|
|
ReactDebugCurrentFrame$1.getCurrentStack = getCurrentFiberStackAddendum;
|
|
ReactDebugCurrentFiber.current = fiber;
|
|
ReactDebugCurrentFiber.phase = phase;
|
|
}
|
|
|
|
var ReactDebugCurrentFiber = {
|
|
current: null,
|
|
phase: null,
|
|
resetCurrentFiber: resetCurrentFiber,
|
|
setCurrentFiber: setCurrentFiber,
|
|
getCurrentFiberOwnerName: getCurrentFiberOwnerName$1,
|
|
getCurrentFiberStackAddendum: getCurrentFiberStackAddendum
|
|
};
|
|
|
|
var ReactDebugCurrentFiber_1 = ReactDebugCurrentFiber;
|
|
|
|
var warnValidStyle$1 = emptyFunction;
|
|
|
|
{
|
|
var camelizeStyleName$1 = camelizeStyleName;
|
|
var getComponentName$1 = getComponentName_1;
|
|
var warning$4 = require$$0;
|
|
|
|
var _require = ReactDebugCurrentFiber_1,
|
|
getCurrentFiberOwnerName = _require.getCurrentFiberOwnerName;
|
|
|
|
// 'msTransform' is correct, but the other prefixes should be capitalized
|
|
|
|
|
|
var badVendoredStyleNamePattern = /^(?:webkit|moz|o)[A-Z]/;
|
|
|
|
// style values shouldn't contain a semicolon
|
|
var badStyleValueWithSemicolonPattern = /;\s*$/;
|
|
|
|
var warnedStyleNames = {};
|
|
var warnedStyleValues = {};
|
|
var warnedForNaNValue = false;
|
|
var warnedForInfinityValue = false;
|
|
|
|
var warnHyphenatedStyleName = function (name, owner) {
|
|
if (warnedStyleNames.hasOwnProperty(name) && warnedStyleNames[name]) {
|
|
return;
|
|
}
|
|
|
|
warnedStyleNames[name] = true;
|
|
warning$4(false, 'Unsupported style property %s. Did you mean %s?%s', name, camelizeStyleName$1(name), checkRenderMessage(owner));
|
|
};
|
|
|
|
var warnBadVendoredStyleName = function (name, owner) {
|
|
if (warnedStyleNames.hasOwnProperty(name) && warnedStyleNames[name]) {
|
|
return;
|
|
}
|
|
|
|
warnedStyleNames[name] = true;
|
|
warning$4(false, 'Unsupported vendor-prefixed style property %s. Did you mean %s?%s', name, name.charAt(0).toUpperCase() + name.slice(1), checkRenderMessage(owner));
|
|
};
|
|
|
|
var warnStyleValueWithSemicolon = function (name, value, owner) {
|
|
if (warnedStyleValues.hasOwnProperty(value) && warnedStyleValues[value]) {
|
|
return;
|
|
}
|
|
|
|
warnedStyleValues[value] = true;
|
|
warning$4(false, "Style property values shouldn't contain a semicolon.%s " + 'Try "%s: %s" instead.', checkRenderMessage(owner), name, value.replace(badStyleValueWithSemicolonPattern, ''));
|
|
};
|
|
|
|
var warnStyleValueIsNaN = function (name, value, owner) {
|
|
if (warnedForNaNValue) {
|
|
return;
|
|
}
|
|
|
|
warnedForNaNValue = true;
|
|
warning$4(false, '`NaN` is an invalid value for the `%s` css style property.%s', name, checkRenderMessage(owner));
|
|
};
|
|
|
|
var warnStyleValueIsInfinity = function (name, value, owner) {
|
|
if (warnedForInfinityValue) {
|
|
return;
|
|
}
|
|
|
|
warnedForInfinityValue = true;
|
|
warning$4(false, '`Infinity` is an invalid value for the `%s` css style property.%s', name, checkRenderMessage(owner));
|
|
};
|
|
|
|
var checkRenderMessage = function (owner) {
|
|
var ownerName;
|
|
if (owner != null) {
|
|
// Stack passes the owner manually all the way to CSSPropertyOperations.
|
|
ownerName = getComponentName$1(owner);
|
|
} else {
|
|
// Fiber doesn't pass it but uses ReactDebugCurrentFiber to track it.
|
|
// It is only enabled in development and tracks host components too.
|
|
ownerName = getCurrentFiberOwnerName();
|
|
// TODO: also report the stack.
|
|
}
|
|
if (ownerName) {
|
|
return '\n\nCheck the render method of `' + ownerName + '`.';
|
|
}
|
|
return '';
|
|
};
|
|
|
|
warnValidStyle$1 = function (name, value, component) {
|
|
var owner;
|
|
if (component) {
|
|
// TODO: this only works with Stack. Seems like we need to add unit tests?
|
|
owner = component._currentElement._owner;
|
|
}
|
|
if (name.indexOf('-') > -1) {
|
|
warnHyphenatedStyleName(name, owner);
|
|
} else if (badVendoredStyleNamePattern.test(name)) {
|
|
warnBadVendoredStyleName(name, owner);
|
|
} else if (badStyleValueWithSemicolonPattern.test(value)) {
|
|
warnStyleValueWithSemicolon(name, value, owner);
|
|
}
|
|
|
|
if (typeof value === 'number') {
|
|
if (isNaN(value)) {
|
|
warnStyleValueIsNaN(name, value, owner);
|
|
} else if (!isFinite(value)) {
|
|
warnStyleValueIsInfinity(name, value, owner);
|
|
}
|
|
}
|
|
};
|
|
}
|
|
|
|
var warnValidStyle_1 = warnValidStyle$1;
|
|
|
|
/**
|
|
* Copyright (c) 2013-present, Facebook, Inc.
|
|
*
|
|
* This source code is licensed under the MIT license found in the
|
|
* LICENSE file in the root directory of this source tree.
|
|
*
|
|
* @providesModule validAriaProperties
|
|
*/
|
|
|
|
var ariaProperties = {
|
|
'aria-current': 0, // state
|
|
'aria-details': 0,
|
|
'aria-disabled': 0, // state
|
|
'aria-hidden': 0, // state
|
|
'aria-invalid': 0, // state
|
|
'aria-keyshortcuts': 0,
|
|
'aria-label': 0,
|
|
'aria-roledescription': 0,
|
|
// Widget Attributes
|
|
'aria-autocomplete': 0,
|
|
'aria-checked': 0,
|
|
'aria-expanded': 0,
|
|
'aria-haspopup': 0,
|
|
'aria-level': 0,
|
|
'aria-modal': 0,
|
|
'aria-multiline': 0,
|
|
'aria-multiselectable': 0,
|
|
'aria-orientation': 0,
|
|
'aria-placeholder': 0,
|
|
'aria-pressed': 0,
|
|
'aria-readonly': 0,
|
|
'aria-required': 0,
|
|
'aria-selected': 0,
|
|
'aria-sort': 0,
|
|
'aria-valuemax': 0,
|
|
'aria-valuemin': 0,
|
|
'aria-valuenow': 0,
|
|
'aria-valuetext': 0,
|
|
// Live Region Attributes
|
|
'aria-atomic': 0,
|
|
'aria-busy': 0,
|
|
'aria-live': 0,
|
|
'aria-relevant': 0,
|
|
// Drag-and-Drop Attributes
|
|
'aria-dropeffect': 0,
|
|
'aria-grabbed': 0,
|
|
// Relationship Attributes
|
|
'aria-activedescendant': 0,
|
|
'aria-colcount': 0,
|
|
'aria-colindex': 0,
|
|
'aria-colspan': 0,
|
|
'aria-controls': 0,
|
|
'aria-describedby': 0,
|
|
'aria-errormessage': 0,
|
|
'aria-flowto': 0,
|
|
'aria-labelledby': 0,
|
|
'aria-owns': 0,
|
|
'aria-posinset': 0,
|
|
'aria-rowcount': 0,
|
|
'aria-rowindex': 0,
|
|
'aria-rowspan': 0,
|
|
'aria-setsize': 0
|
|
};
|
|
|
|
var validAriaProperties$1 = ariaProperties;
|
|
|
|
var warnedProperties = {};
|
|
var rARIA = new RegExp('^(aria)-[' + DOMProperty_1.ATTRIBUTE_NAME_CHAR + ']*$');
|
|
var rARIACamel = new RegExp('^(aria)[A-Z][' + DOMProperty_1.ATTRIBUTE_NAME_CHAR + ']*$');
|
|
|
|
var hasOwnProperty = Object.prototype.hasOwnProperty;
|
|
|
|
{
|
|
var warning$5 = require$$0;
|
|
|
|
var _require$1 = ReactGlobalSharedState_1,
|
|
ReactComponentTreeHook = _require$1.ReactComponentTreeHook,
|
|
ReactDebugCurrentFrame$2 = _require$1.ReactDebugCurrentFrame;
|
|
|
|
var getStackAddendumByID = ReactComponentTreeHook.getStackAddendumByID;
|
|
|
|
|
|
var validAriaProperties = validAriaProperties$1;
|
|
}
|
|
|
|
function getStackAddendum$1(debugID) {
|
|
if (debugID != null) {
|
|
// This can only happen on Stack
|
|
return getStackAddendumByID(debugID);
|
|
} else {
|
|
// This can only happen on Fiber / Server
|
|
var stack = ReactDebugCurrentFrame$2.getStackAddendum();
|
|
return stack != null ? stack : '';
|
|
}
|
|
}
|
|
|
|
function validateProperty(tagName, name, debugID) {
|
|
if (hasOwnProperty.call(warnedProperties, name) && warnedProperties[name]) {
|
|
return true;
|
|
}
|
|
|
|
if (rARIACamel.test(name)) {
|
|
var ariaName = 'aria-' + name.slice(4).toLowerCase();
|
|
var correctName = validAriaProperties.hasOwnProperty(ariaName) ? ariaName : null;
|
|
|
|
// If this is an aria-* attribute, but is not listed in the known DOM
|
|
// DOM properties, then it is an invalid aria-* attribute.
|
|
if (correctName == null) {
|
|
warning$5(false, 'Invalid ARIA attribute `%s`. ARIA attributes follow the pattern aria-* and must be lowercase.%s', name, getStackAddendum$1(debugID));
|
|
warnedProperties[name] = true;
|
|
return true;
|
|
}
|
|
// aria-* attributes should be lowercase; suggest the lowercase version.
|
|
if (name !== correctName) {
|
|
warning$5(false, 'Invalid ARIA attribute `%s`. Did you mean `%s`?%s', name, correctName, getStackAddendum$1(debugID));
|
|
warnedProperties[name] = true;
|
|
return true;
|
|
}
|
|
}
|
|
|
|
if (rARIA.test(name)) {
|
|
var lowerCasedName = name.toLowerCase();
|
|
var standardName = validAriaProperties.hasOwnProperty(lowerCasedName) ? lowerCasedName : null;
|
|
|
|
// If this is an aria-* attribute, but is not listed in the known DOM
|
|
// DOM properties, then it is an invalid aria-* attribute.
|
|
if (standardName == null) {
|
|
warnedProperties[name] = true;
|
|
return false;
|
|
}
|
|
// aria-* attributes should be lowercase; suggest the lowercase version.
|
|
if (name !== standardName) {
|
|
warning$5(false, 'Unknown ARIA attribute `%s`. Did you mean `%s`?%s', name, standardName, getStackAddendum$1(debugID));
|
|
warnedProperties[name] = true;
|
|
return true;
|
|
}
|
|
}
|
|
|
|
return true;
|
|
}
|
|
|
|
function warnInvalidARIAProps(type, props, debugID) {
|
|
var invalidProps = [];
|
|
|
|
for (var key in props) {
|
|
var isValid = validateProperty(type, key, debugID);
|
|
if (!isValid) {
|
|
invalidProps.push(key);
|
|
}
|
|
}
|
|
|
|
var unknownPropString = invalidProps.map(function (prop) {
|
|
return '`' + prop + '`';
|
|
}).join(', ');
|
|
|
|
if (invalidProps.length === 1) {
|
|
warning$5(false, 'Invalid aria prop %s on <%s> tag. ' + 'For details, see https://fb.me/invalid-aria-prop%s', unknownPropString, type, getStackAddendum$1(debugID));
|
|
} else if (invalidProps.length > 1) {
|
|
warning$5(false, 'Invalid aria props %s on <%s> tag. ' + 'For details, see https://fb.me/invalid-aria-prop%s', unknownPropString, type, getStackAddendum$1(debugID));
|
|
}
|
|
}
|
|
|
|
function validateProperties(type, props, debugID /* Stack only */) {
|
|
if (isCustomComponent_1(type, props)) {
|
|
return;
|
|
}
|
|
warnInvalidARIAProps(type, props, debugID);
|
|
}
|
|
|
|
var ReactDOMInvalidARIAHook = {
|
|
// Fiber
|
|
validateProperties: validateProperties,
|
|
// Stack
|
|
onBeforeMountComponent: function (debugID, element) {
|
|
if (true && element != null && typeof element.type === 'string') {
|
|
validateProperties(element.type, element.props, debugID);
|
|
}
|
|
},
|
|
onBeforeUpdateComponent: function (debugID, element) {
|
|
if (true && element != null && typeof element.type === 'string') {
|
|
validateProperties(element.type, element.props, debugID);
|
|
}
|
|
}
|
|
};
|
|
|
|
var ReactDOMInvalidARIAHook_1 = ReactDOMInvalidARIAHook;
|
|
|
|
{
|
|
var warning$6 = require$$0;
|
|
|
|
var _require$2 = ReactGlobalSharedState_1,
|
|
ReactComponentTreeHook$1 = _require$2.ReactComponentTreeHook,
|
|
ReactDebugCurrentFrame$3 = _require$2.ReactDebugCurrentFrame;
|
|
|
|
var getStackAddendumByID$1 = ReactComponentTreeHook$1.getStackAddendumByID;
|
|
}
|
|
|
|
var didWarnValueNull = false;
|
|
|
|
function getStackAddendum$2(debugID) {
|
|
if (debugID != null) {
|
|
// This can only happen on Stack
|
|
return getStackAddendumByID$1(debugID);
|
|
} else {
|
|
// This can only happen on Fiber / Server
|
|
var stack = ReactDebugCurrentFrame$3.getStackAddendum();
|
|
return stack != null ? stack : '';
|
|
}
|
|
}
|
|
|
|
function validateProperties$1(type, props, debugID /* Stack only */) {
|
|
if (type !== 'input' && type !== 'textarea' && type !== 'select') {
|
|
return;
|
|
}
|
|
if (props != null && props.value === null && !didWarnValueNull) {
|
|
warning$6(false, '`value` prop on `%s` should not be null. ' + 'Consider using the empty string to clear the component or `undefined` ' + 'for uncontrolled components.%s', type, getStackAddendum$2(debugID));
|
|
|
|
didWarnValueNull = true;
|
|
}
|
|
}
|
|
|
|
var ReactDOMNullInputValuePropHook = {
|
|
// Fiber
|
|
validateProperties: validateProperties$1,
|
|
// Stack
|
|
onBeforeMountComponent: function (debugID, element) {
|
|
if (true && element != null && typeof element.type === 'string') {
|
|
validateProperties$1(element.type, element.props, debugID);
|
|
}
|
|
},
|
|
onBeforeUpdateComponent: function (debugID, element) {
|
|
if (true && element != null && typeof element.type === 'string') {
|
|
validateProperties$1(element.type, element.props, debugID);
|
|
}
|
|
}
|
|
};
|
|
|
|
var ReactDOMNullInputValuePropHook_1 = ReactDOMNullInputValuePropHook;
|
|
|
|
/**
|
|
* Injectable ordering of event plugins.
|
|
*/
|
|
var eventPluginOrder = null;
|
|
|
|
/**
|
|
* Injectable mapping from names to event plugin modules.
|
|
*/
|
|
var namesToPlugins = {};
|
|
|
|
/**
|
|
* Recomputes the plugin list using the injected plugins and plugin ordering.
|
|
*
|
|
* @private
|
|
*/
|
|
function recomputePluginOrdering() {
|
|
if (!eventPluginOrder) {
|
|
// Wait until an `eventPluginOrder` is injected.
|
|
return;
|
|
}
|
|
for (var pluginName in namesToPlugins) {
|
|
var pluginModule = namesToPlugins[pluginName];
|
|
var pluginIndex = eventPluginOrder.indexOf(pluginName);
|
|
!(pluginIndex > -1) ? invariant(false, 'EventPluginRegistry: Cannot inject event plugins that do not exist in the plugin ordering, `%s`.', pluginName) : void 0;
|
|
if (EventPluginRegistry.plugins[pluginIndex]) {
|
|
continue;
|
|
}
|
|
!pluginModule.extractEvents ? invariant(false, 'EventPluginRegistry: Event plugins must implement an `extractEvents` method, but `%s` does not.', pluginName) : void 0;
|
|
EventPluginRegistry.plugins[pluginIndex] = pluginModule;
|
|
var publishedEvents = pluginModule.eventTypes;
|
|
for (var eventName in publishedEvents) {
|
|
!publishEventForPlugin(publishedEvents[eventName], pluginModule, eventName) ? invariant(false, 'EventPluginRegistry: Failed to publish event `%s` for plugin `%s`.', eventName, pluginName) : void 0;
|
|
}
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Publishes an event so that it can be dispatched by the supplied plugin.
|
|
*
|
|
* @param {object} dispatchConfig Dispatch configuration for the event.
|
|
* @param {object} PluginModule Plugin publishing the event.
|
|
* @return {boolean} True if the event was successfully published.
|
|
* @private
|
|
*/
|
|
function publishEventForPlugin(dispatchConfig, pluginModule, eventName) {
|
|
!!EventPluginRegistry.eventNameDispatchConfigs.hasOwnProperty(eventName) ? invariant(false, 'EventPluginHub: More than one plugin attempted to publish the same event name, `%s`.', eventName) : void 0;
|
|
EventPluginRegistry.eventNameDispatchConfigs[eventName] = dispatchConfig;
|
|
|
|
var phasedRegistrationNames = dispatchConfig.phasedRegistrationNames;
|
|
if (phasedRegistrationNames) {
|
|
for (var phaseName in phasedRegistrationNames) {
|
|
if (phasedRegistrationNames.hasOwnProperty(phaseName)) {
|
|
var phasedRegistrationName = phasedRegistrationNames[phaseName];
|
|
publishRegistrationName(phasedRegistrationName, pluginModule, eventName);
|
|
}
|
|
}
|
|
return true;
|
|
} else if (dispatchConfig.registrationName) {
|
|
publishRegistrationName(dispatchConfig.registrationName, pluginModule, eventName);
|
|
return true;
|
|
}
|
|
return false;
|
|
}
|
|
|
|
/**
|
|
* Publishes a registration name that is used to identify dispatched events.
|
|
*
|
|
* @param {string} registrationName Registration name to add.
|
|
* @param {object} PluginModule Plugin publishing the event.
|
|
* @private
|
|
*/
|
|
function publishRegistrationName(registrationName, pluginModule, eventName) {
|
|
!!EventPluginRegistry.registrationNameModules[registrationName] ? invariant(false, 'EventPluginHub: More than one plugin attempted to publish the same registration name, `%s`.', registrationName) : void 0;
|
|
EventPluginRegistry.registrationNameModules[registrationName] = pluginModule;
|
|
EventPluginRegistry.registrationNameDependencies[registrationName] = pluginModule.eventTypes[eventName].dependencies;
|
|
|
|
{
|
|
var lowerCasedName = registrationName.toLowerCase();
|
|
EventPluginRegistry.possibleRegistrationNames[lowerCasedName] = registrationName;
|
|
|
|
if (registrationName === 'onDoubleClick') {
|
|
EventPluginRegistry.possibleRegistrationNames.ondblclick = registrationName;
|
|
}
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Registers plugins so that they can extract and dispatch events.
|
|
*
|
|
* @see {EventPluginHub}
|
|
*/
|
|
var EventPluginRegistry = {
|
|
/**
|
|
* Ordered list of injected plugins.
|
|
*/
|
|
plugins: [],
|
|
|
|
/**
|
|
* Mapping from event name to dispatch config
|
|
*/
|
|
eventNameDispatchConfigs: {},
|
|
|
|
/**
|
|
* Mapping from registration name to plugin module
|
|
*/
|
|
registrationNameModules: {},
|
|
|
|
/**
|
|
* Mapping from registration name to event name
|
|
*/
|
|
registrationNameDependencies: {},
|
|
|
|
/**
|
|
* Mapping from lowercase registration names to the properly cased version,
|
|
* used to warn in the case of missing event handlers. Available
|
|
* only in true.
|
|
* @type {Object}
|
|
*/
|
|
possibleRegistrationNames: {},
|
|
// Trust the developer to only use possibleRegistrationNames in true
|
|
|
|
/**
|
|
* Injects an ordering of plugins (by plugin name). This allows the ordering
|
|
* to be decoupled from injection of the actual plugins so that ordering is
|
|
* always deterministic regardless of packaging, on-the-fly injection, etc.
|
|
*
|
|
* @param {array} InjectedEventPluginOrder
|
|
* @internal
|
|
* @see {EventPluginHub.injection.injectEventPluginOrder}
|
|
*/
|
|
injectEventPluginOrder: function (injectedEventPluginOrder) {
|
|
!!eventPluginOrder ? invariant(false, 'EventPluginRegistry: Cannot inject event plugin ordering more than once. You are likely trying to load more than one copy of React.') : void 0;
|
|
// Clone the ordering so it cannot be dynamically mutated.
|
|
eventPluginOrder = Array.prototype.slice.call(injectedEventPluginOrder);
|
|
recomputePluginOrdering();
|
|
},
|
|
|
|
/**
|
|
* Injects plugins to be used by `EventPluginHub`. The plugin names must be
|
|
* in the ordering injected by `injectEventPluginOrder`.
|
|
*
|
|
* Plugins can be injected as part of page initialization or on-the-fly.
|
|
*
|
|
* @param {object} injectedNamesToPlugins Map from names to plugin modules.
|
|
* @internal
|
|
* @see {EventPluginHub.injection.injectEventPluginsByName}
|
|
*/
|
|
injectEventPluginsByName: function (injectedNamesToPlugins) {
|
|
var isOrderingDirty = false;
|
|
for (var pluginName in injectedNamesToPlugins) {
|
|
if (!injectedNamesToPlugins.hasOwnProperty(pluginName)) {
|
|
continue;
|
|
}
|
|
var pluginModule = injectedNamesToPlugins[pluginName];
|
|
if (!namesToPlugins.hasOwnProperty(pluginName) || namesToPlugins[pluginName] !== pluginModule) {
|
|
!!namesToPlugins[pluginName] ? invariant(false, 'EventPluginRegistry: Cannot inject two different event plugins using the same name, `%s`.', pluginName) : void 0;
|
|
namesToPlugins[pluginName] = pluginModule;
|
|
isOrderingDirty = true;
|
|
}
|
|
}
|
|
if (isOrderingDirty) {
|
|
recomputePluginOrdering();
|
|
}
|
|
}
|
|
};
|
|
|
|
var EventPluginRegistry_1 = EventPluginRegistry;
|
|
|
|
/**
|
|
* Copyright (c) 2013-present, Facebook, Inc.
|
|
*
|
|
* This source code is licensed under the MIT license found in the
|
|
* LICENSE file in the root directory of this source tree.
|
|
*
|
|
* @providesModule possibleStandardNames
|
|
*/
|
|
|
|
// When adding attributes to the HTML or SVG whitelist, be sure to
|
|
// also add them to this module to ensure casing and incorrect name
|
|
// warnings.
|
|
var possibleStandardNames$1 = {
|
|
// HTML
|
|
accept: 'accept',
|
|
acceptcharset: 'acceptCharset',
|
|
'accept-charset': 'acceptCharset',
|
|
accesskey: 'accessKey',
|
|
action: 'action',
|
|
allowfullscreen: 'allowFullScreen',
|
|
allowtransparency: 'allowTransparency',
|
|
alt: 'alt',
|
|
as: 'as',
|
|
async: 'async',
|
|
autocapitalize: 'autoCapitalize',
|
|
autocomplete: 'autoComplete',
|
|
autocorrect: 'autoCorrect',
|
|
autofocus: 'autoFocus',
|
|
autoplay: 'autoPlay',
|
|
autosave: 'autoSave',
|
|
capture: 'capture',
|
|
cellpadding: 'cellPadding',
|
|
cellspacing: 'cellSpacing',
|
|
challenge: 'challenge',
|
|
charset: 'charSet',
|
|
checked: 'checked',
|
|
children: 'children',
|
|
cite: 'cite',
|
|
'class': 'className',
|
|
classid: 'classID',
|
|
classname: 'className',
|
|
cols: 'cols',
|
|
colspan: 'colSpan',
|
|
content: 'content',
|
|
contenteditable: 'contentEditable',
|
|
contextmenu: 'contextMenu',
|
|
controls: 'controls',
|
|
controlslist: 'controlsList',
|
|
coords: 'coords',
|
|
crossorigin: 'crossOrigin',
|
|
dangerouslysetinnerhtml: 'dangerouslySetInnerHTML',
|
|
data: 'data',
|
|
datetime: 'dateTime',
|
|
'default': 'default',
|
|
defaultchecked: 'defaultChecked',
|
|
defaultvalue: 'defaultValue',
|
|
defer: 'defer',
|
|
dir: 'dir',
|
|
disabled: 'disabled',
|
|
download: 'download',
|
|
draggable: 'draggable',
|
|
enctype: 'encType',
|
|
'for': 'htmlFor',
|
|
form: 'form',
|
|
formmethod: 'formMethod',
|
|
formaction: 'formAction',
|
|
formenctype: 'formEncType',
|
|
formnovalidate: 'formNoValidate',
|
|
formtarget: 'formTarget',
|
|
frameborder: 'frameBorder',
|
|
headers: 'headers',
|
|
height: 'height',
|
|
hidden: 'hidden',
|
|
high: 'high',
|
|
href: 'href',
|
|
hreflang: 'hrefLang',
|
|
htmlfor: 'htmlFor',
|
|
httpequiv: 'httpEquiv',
|
|
'http-equiv': 'httpEquiv',
|
|
icon: 'icon',
|
|
id: 'id',
|
|
innerhtml: 'innerHTML',
|
|
inputmode: 'inputMode',
|
|
integrity: 'integrity',
|
|
is: 'is',
|
|
itemid: 'itemID',
|
|
itemprop: 'itemProp',
|
|
itemref: 'itemRef',
|
|
itemscope: 'itemScope',
|
|
itemtype: 'itemType',
|
|
keyparams: 'keyParams',
|
|
keytype: 'keyType',
|
|
kind: 'kind',
|
|
label: 'label',
|
|
lang: 'lang',
|
|
list: 'list',
|
|
loop: 'loop',
|
|
low: 'low',
|
|
manifest: 'manifest',
|
|
marginwidth: 'marginWidth',
|
|
marginheight: 'marginHeight',
|
|
max: 'max',
|
|
maxlength: 'maxLength',
|
|
media: 'media',
|
|
mediagroup: 'mediaGroup',
|
|
method: 'method',
|
|
min: 'min',
|
|
minlength: 'minLength',
|
|
multiple: 'multiple',
|
|
muted: 'muted',
|
|
name: 'name',
|
|
nonce: 'nonce',
|
|
novalidate: 'noValidate',
|
|
open: 'open',
|
|
optimum: 'optimum',
|
|
pattern: 'pattern',
|
|
placeholder: 'placeholder',
|
|
playsinline: 'playsInline',
|
|
poster: 'poster',
|
|
preload: 'preload',
|
|
profile: 'profile',
|
|
radiogroup: 'radioGroup',
|
|
readonly: 'readOnly',
|
|
referrerpolicy: 'referrerPolicy',
|
|
rel: 'rel',
|
|
required: 'required',
|
|
reversed: 'reversed',
|
|
role: 'role',
|
|
rows: 'rows',
|
|
rowspan: 'rowSpan',
|
|
sandbox: 'sandbox',
|
|
scope: 'scope',
|
|
scoped: 'scoped',
|
|
scrolling: 'scrolling',
|
|
seamless: 'seamless',
|
|
selected: 'selected',
|
|
shape: 'shape',
|
|
size: 'size',
|
|
sizes: 'sizes',
|
|
span: 'span',
|
|
spellcheck: 'spellCheck',
|
|
src: 'src',
|
|
srcdoc: 'srcDoc',
|
|
srclang: 'srcLang',
|
|
srcset: 'srcSet',
|
|
start: 'start',
|
|
step: 'step',
|
|
style: 'style',
|
|
summary: 'summary',
|
|
tabindex: 'tabIndex',
|
|
target: 'target',
|
|
title: 'title',
|
|
type: 'type',
|
|
usemap: 'useMap',
|
|
value: 'value',
|
|
width: 'width',
|
|
wmode: 'wmode',
|
|
wrap: 'wrap',
|
|
|
|
// SVG
|
|
about: 'about',
|
|
accentheight: 'accentHeight',
|
|
'accent-height': 'accentHeight',
|
|
accumulate: 'accumulate',
|
|
additive: 'additive',
|
|
alignmentbaseline: 'alignmentBaseline',
|
|
'alignment-baseline': 'alignmentBaseline',
|
|
allowreorder: 'allowReorder',
|
|
alphabetic: 'alphabetic',
|
|
amplitude: 'amplitude',
|
|
arabicform: 'arabicForm',
|
|
'arabic-form': 'arabicForm',
|
|
ascent: 'ascent',
|
|
attributename: 'attributeName',
|
|
attributetype: 'attributeType',
|
|
autoreverse: 'autoReverse',
|
|
azimuth: 'azimuth',
|
|
basefrequency: 'baseFrequency',
|
|
baselineshift: 'baselineShift',
|
|
'baseline-shift': 'baselineShift',
|
|
baseprofile: 'baseProfile',
|
|
bbox: 'bbox',
|
|
begin: 'begin',
|
|
bias: 'bias',
|
|
by: 'by',
|
|
calcmode: 'calcMode',
|
|
capheight: 'capHeight',
|
|
'cap-height': 'capHeight',
|
|
clip: 'clip',
|
|
clippath: 'clipPath',
|
|
'clip-path': 'clipPath',
|
|
clippathunits: 'clipPathUnits',
|
|
cliprule: 'clipRule',
|
|
'clip-rule': 'clipRule',
|
|
color: 'color',
|
|
colorinterpolation: 'colorInterpolation',
|
|
'color-interpolation': 'colorInterpolation',
|
|
colorinterpolationfilters: 'colorInterpolationFilters',
|
|
'color-interpolation-filters': 'colorInterpolationFilters',
|
|
colorprofile: 'colorProfile',
|
|
'color-profile': 'colorProfile',
|
|
colorrendering: 'colorRendering',
|
|
'color-rendering': 'colorRendering',
|
|
contentscripttype: 'contentScriptType',
|
|
contentstyletype: 'contentStyleType',
|
|
cursor: 'cursor',
|
|
cx: 'cx',
|
|
cy: 'cy',
|
|
d: 'd',
|
|
datatype: 'datatype',
|
|
decelerate: 'decelerate',
|
|
descent: 'descent',
|
|
diffuseconstant: 'diffuseConstant',
|
|
direction: 'direction',
|
|
display: 'display',
|
|
divisor: 'divisor',
|
|
dominantbaseline: 'dominantBaseline',
|
|
'dominant-baseline': 'dominantBaseline',
|
|
dur: 'dur',
|
|
dx: 'dx',
|
|
dy: 'dy',
|
|
edgemode: 'edgeMode',
|
|
elevation: 'elevation',
|
|
enablebackground: 'enableBackground',
|
|
'enable-background': 'enableBackground',
|
|
end: 'end',
|
|
exponent: 'exponent',
|
|
externalresourcesrequired: 'externalResourcesRequired',
|
|
fill: 'fill',
|
|
fillopacity: 'fillOpacity',
|
|
'fill-opacity': 'fillOpacity',
|
|
fillrule: 'fillRule',
|
|
'fill-rule': 'fillRule',
|
|
filter: 'filter',
|
|
filterres: 'filterRes',
|
|
filterunits: 'filterUnits',
|
|
floodopacity: 'floodOpacity',
|
|
'flood-opacity': 'floodOpacity',
|
|
floodcolor: 'floodColor',
|
|
'flood-color': 'floodColor',
|
|
focusable: 'focusable',
|
|
fontfamily: 'fontFamily',
|
|
'font-family': 'fontFamily',
|
|
fontsize: 'fontSize',
|
|
'font-size': 'fontSize',
|
|
fontsizeadjust: 'fontSizeAdjust',
|
|
'font-size-adjust': 'fontSizeAdjust',
|
|
fontstretch: 'fontStretch',
|
|
'font-stretch': 'fontStretch',
|
|
fontstyle: 'fontStyle',
|
|
'font-style': 'fontStyle',
|
|
fontvariant: 'fontVariant',
|
|
'font-variant': 'fontVariant',
|
|
fontweight: 'fontWeight',
|
|
'font-weight': 'fontWeight',
|
|
format: 'format',
|
|
from: 'from',
|
|
fx: 'fx',
|
|
fy: 'fy',
|
|
g1: 'g1',
|
|
g2: 'g2',
|
|
glyphname: 'glyphName',
|
|
'glyph-name': 'glyphName',
|
|
glyphorientationhorizontal: 'glyphOrientationHorizontal',
|
|
'glyph-orientation-horizontal': 'glyphOrientationHorizontal',
|
|
glyphorientationvertical: 'glyphOrientationVertical',
|
|
'glyph-orientation-vertical': 'glyphOrientationVertical',
|
|
glyphref: 'glyphRef',
|
|
gradienttransform: 'gradientTransform',
|
|
gradientunits: 'gradientUnits',
|
|
hanging: 'hanging',
|
|
horizadvx: 'horizAdvX',
|
|
'horiz-adv-x': 'horizAdvX',
|
|
horizoriginx: 'horizOriginX',
|
|
'horiz-origin-x': 'horizOriginX',
|
|
ideographic: 'ideographic',
|
|
imagerendering: 'imageRendering',
|
|
'image-rendering': 'imageRendering',
|
|
in2: 'in2',
|
|
'in': 'in',
|
|
inlist: 'inlist',
|
|
intercept: 'intercept',
|
|
k1: 'k1',
|
|
k2: 'k2',
|
|
k3: 'k3',
|
|
k4: 'k4',
|
|
k: 'k',
|
|
kernelmatrix: 'kernelMatrix',
|
|
kernelunitlength: 'kernelUnitLength',
|
|
kerning: 'kerning',
|
|
keypoints: 'keyPoints',
|
|
keysplines: 'keySplines',
|
|
keytimes: 'keyTimes',
|
|
lengthadjust: 'lengthAdjust',
|
|
letterspacing: 'letterSpacing',
|
|
'letter-spacing': 'letterSpacing',
|
|
lightingcolor: 'lightingColor',
|
|
'lighting-color': 'lightingColor',
|
|
limitingconeangle: 'limitingConeAngle',
|
|
local: 'local',
|
|
markerend: 'markerEnd',
|
|
'marker-end': 'markerEnd',
|
|
markerheight: 'markerHeight',
|
|
markermid: 'markerMid',
|
|
'marker-mid': 'markerMid',
|
|
markerstart: 'markerStart',
|
|
'marker-start': 'markerStart',
|
|
markerunits: 'markerUnits',
|
|
markerwidth: 'markerWidth',
|
|
mask: 'mask',
|
|
maskcontentunits: 'maskContentUnits',
|
|
maskunits: 'maskUnits',
|
|
mathematical: 'mathematical',
|
|
mode: 'mode',
|
|
numoctaves: 'numOctaves',
|
|
offset: 'offset',
|
|
opacity: 'opacity',
|
|
operator: 'operator',
|
|
order: 'order',
|
|
orient: 'orient',
|
|
orientation: 'orientation',
|
|
origin: 'origin',
|
|
overflow: 'overflow',
|
|
overlineposition: 'overlinePosition',
|
|
'overline-position': 'overlinePosition',
|
|
overlinethickness: 'overlineThickness',
|
|
'overline-thickness': 'overlineThickness',
|
|
paintorder: 'paintOrder',
|
|
'paint-order': 'paintOrder',
|
|
panose1: 'panose1',
|
|
'panose-1': 'panose1',
|
|
pathlength: 'pathLength',
|
|
patterncontentunits: 'patternContentUnits',
|
|
patterntransform: 'patternTransform',
|
|
patternunits: 'patternUnits',
|
|
pointerevents: 'pointerEvents',
|
|
'pointer-events': 'pointerEvents',
|
|
points: 'points',
|
|
pointsatx: 'pointsAtX',
|
|
pointsaty: 'pointsAtY',
|
|
pointsatz: 'pointsAtZ',
|
|
prefix: 'prefix',
|
|
preservealpha: 'preserveAlpha',
|
|
preserveaspectratio: 'preserveAspectRatio',
|
|
primitiveunits: 'primitiveUnits',
|
|
property: 'property',
|
|
r: 'r',
|
|
radius: 'radius',
|
|
refx: 'refX',
|
|
refy: 'refY',
|
|
renderingintent: 'renderingIntent',
|
|
'rendering-intent': 'renderingIntent',
|
|
repeatcount: 'repeatCount',
|
|
repeatdur: 'repeatDur',
|
|
requiredextensions: 'requiredExtensions',
|
|
requiredfeatures: 'requiredFeatures',
|
|
resource: 'resource',
|
|
restart: 'restart',
|
|
result: 'result',
|
|
results: 'results',
|
|
rotate: 'rotate',
|
|
rx: 'rx',
|
|
ry: 'ry',
|
|
scale: 'scale',
|
|
security: 'security',
|
|
seed: 'seed',
|
|
shaperendering: 'shapeRendering',
|
|
'shape-rendering': 'shapeRendering',
|
|
slope: 'slope',
|
|
spacing: 'spacing',
|
|
specularconstant: 'specularConstant',
|
|
specularexponent: 'specularExponent',
|
|
speed: 'speed',
|
|
spreadmethod: 'spreadMethod',
|
|
startoffset: 'startOffset',
|
|
stddeviation: 'stdDeviation',
|
|
stemh: 'stemh',
|
|
stemv: 'stemv',
|
|
stitchtiles: 'stitchTiles',
|
|
stopcolor: 'stopColor',
|
|
'stop-color': 'stopColor',
|
|
stopopacity: 'stopOpacity',
|
|
'stop-opacity': 'stopOpacity',
|
|
strikethroughposition: 'strikethroughPosition',
|
|
'strikethrough-position': 'strikethroughPosition',
|
|
strikethroughthickness: 'strikethroughThickness',
|
|
'strikethrough-thickness': 'strikethroughThickness',
|
|
string: 'string',
|
|
stroke: 'stroke',
|
|
strokedasharray: 'strokeDasharray',
|
|
'stroke-dasharray': 'strokeDasharray',
|
|
strokedashoffset: 'strokeDashoffset',
|
|
'stroke-dashoffset': 'strokeDashoffset',
|
|
strokelinecap: 'strokeLinecap',
|
|
'stroke-linecap': 'strokeLinecap',
|
|
strokelinejoin: 'strokeLinejoin',
|
|
'stroke-linejoin': 'strokeLinejoin',
|
|
strokemiterlimit: 'strokeMiterlimit',
|
|
'stroke-miterlimit': 'strokeMiterlimit',
|
|
strokewidth: 'strokeWidth',
|
|
'stroke-width': 'strokeWidth',
|
|
strokeopacity: 'strokeOpacity',
|
|
'stroke-opacity': 'strokeOpacity',
|
|
suppresscontenteditablewarning: 'suppressContentEditableWarning',
|
|
surfacescale: 'surfaceScale',
|
|
systemlanguage: 'systemLanguage',
|
|
tablevalues: 'tableValues',
|
|
targetx: 'targetX',
|
|
targety: 'targetY',
|
|
textanchor: 'textAnchor',
|
|
'text-anchor': 'textAnchor',
|
|
textdecoration: 'textDecoration',
|
|
'text-decoration': 'textDecoration',
|
|
textlength: 'textLength',
|
|
textrendering: 'textRendering',
|
|
'text-rendering': 'textRendering',
|
|
to: 'to',
|
|
transform: 'transform',
|
|
'typeof': 'typeof',
|
|
u1: 'u1',
|
|
u2: 'u2',
|
|
underlineposition: 'underlinePosition',
|
|
'underline-position': 'underlinePosition',
|
|
underlinethickness: 'underlineThickness',
|
|
'underline-thickness': 'underlineThickness',
|
|
unicode: 'unicode',
|
|
unicodebidi: 'unicodeBidi',
|
|
'unicode-bidi': 'unicodeBidi',
|
|
unicoderange: 'unicodeRange',
|
|
'unicode-range': 'unicodeRange',
|
|
unitsperem: 'unitsPerEm',
|
|
'units-per-em': 'unitsPerEm',
|
|
unselectable: 'unselectable',
|
|
valphabetic: 'vAlphabetic',
|
|
'v-alphabetic': 'vAlphabetic',
|
|
values: 'values',
|
|
vectoreffect: 'vectorEffect',
|
|
'vector-effect': 'vectorEffect',
|
|
version: 'version',
|
|
vertadvy: 'vertAdvY',
|
|
'vert-adv-y': 'vertAdvY',
|
|
vertoriginx: 'vertOriginX',
|
|
'vert-origin-x': 'vertOriginX',
|
|
vertoriginy: 'vertOriginY',
|
|
'vert-origin-y': 'vertOriginY',
|
|
vhanging: 'vHanging',
|
|
'v-hanging': 'vHanging',
|
|
videographic: 'vIdeographic',
|
|
'v-ideographic': 'vIdeographic',
|
|
viewbox: 'viewBox',
|
|
viewtarget: 'viewTarget',
|
|
visibility: 'visibility',
|
|
vmathematical: 'vMathematical',
|
|
'v-mathematical': 'vMathematical',
|
|
vocab: 'vocab',
|
|
widths: 'widths',
|
|
wordspacing: 'wordSpacing',
|
|
'word-spacing': 'wordSpacing',
|
|
writingmode: 'writingMode',
|
|
'writing-mode': 'writingMode',
|
|
x1: 'x1',
|
|
x2: 'x2',
|
|
x: 'x',
|
|
xchannelselector: 'xChannelSelector',
|
|
xheight: 'xHeight',
|
|
'x-height': 'xHeight',
|
|
xlinkactuate: 'xlinkActuate',
|
|
'xlink:actuate': 'xlinkActuate',
|
|
xlinkarcrole: 'xlinkArcrole',
|
|
'xlink:arcrole': 'xlinkArcrole',
|
|
xlinkhref: 'xlinkHref',
|
|
'xlink:href': 'xlinkHref',
|
|
xlinkrole: 'xlinkRole',
|
|
'xlink:role': 'xlinkRole',
|
|
xlinkshow: 'xlinkShow',
|
|
'xlink:show': 'xlinkShow',
|
|
xlinktitle: 'xlinkTitle',
|
|
'xlink:title': 'xlinkTitle',
|
|
xlinktype: 'xlinkType',
|
|
'xlink:type': 'xlinkType',
|
|
xmlbase: 'xmlBase',
|
|
'xml:base': 'xmlBase',
|
|
xmllang: 'xmlLang',
|
|
'xml:lang': 'xmlLang',
|
|
xmlns: 'xmlns',
|
|
'xml:space': 'xmlSpace',
|
|
xmlnsxlink: 'xmlnsXlink',
|
|
'xmlns:xlink': 'xmlnsXlink',
|
|
xmlspace: 'xmlSpace',
|
|
y1: 'y1',
|
|
y2: 'y2',
|
|
y: 'y',
|
|
ychannelselector: 'yChannelSelector',
|
|
z: 'z',
|
|
zoomandpan: 'zoomAndPan'
|
|
};
|
|
|
|
var possibleStandardNames_1 = possibleStandardNames$1;
|
|
|
|
{
|
|
var warning$7 = require$$0;
|
|
|
|
var _require$3 = ReactGlobalSharedState_1,
|
|
ReactComponentTreeHook$2 = _require$3.ReactComponentTreeHook,
|
|
ReactDebugCurrentFrame$4 = _require$3.ReactDebugCurrentFrame;
|
|
|
|
var getStackAddendumByID$2 = ReactComponentTreeHook$2.getStackAddendumByID;
|
|
}
|
|
|
|
function getStackAddendum$3(debugID) {
|
|
if (debugID != null) {
|
|
// This can only happen on Stack
|
|
return getStackAddendumByID$2(debugID);
|
|
} else {
|
|
// This can only happen on Fiber / Server
|
|
var stack = ReactDebugCurrentFrame$4.getStackAddendum();
|
|
return stack != null ? stack : '';
|
|
}
|
|
}
|
|
|
|
{
|
|
var warnedProperties$1 = {};
|
|
var hasOwnProperty$1 = Object.prototype.hasOwnProperty;
|
|
var EVENT_NAME_REGEX = /^on[A-Z]/;
|
|
var rARIA$1 = new RegExp('^(aria)-[' + DOMProperty_1.ATTRIBUTE_NAME_CHAR + ']*$');
|
|
var rARIACamel$1 = new RegExp('^(aria)[A-Z][' + DOMProperty_1.ATTRIBUTE_NAME_CHAR + ']*$');
|
|
var possibleStandardNames = possibleStandardNames_1;
|
|
|
|
var validateProperty$1 = function (tagName, name, value, debugID) {
|
|
if (hasOwnProperty$1.call(warnedProperties$1, name) && warnedProperties$1[name]) {
|
|
return true;
|
|
}
|
|
|
|
if (EventPluginRegistry_1.registrationNameModules.hasOwnProperty(name)) {
|
|
return true;
|
|
}
|
|
|
|
if (EventPluginRegistry_1.plugins.length === 0 && EVENT_NAME_REGEX.test(name)) {
|
|
// If no event plugins have been injected, we might be in a server environment.
|
|
// Don't check events in this case.
|
|
return true;
|
|
}
|
|
|
|
var lowerCasedName = name.toLowerCase();
|
|
var registrationName = EventPluginRegistry_1.possibleRegistrationNames.hasOwnProperty(lowerCasedName) ? EventPluginRegistry_1.possibleRegistrationNames[lowerCasedName] : null;
|
|
|
|
if (registrationName != null) {
|
|
warning$7(false, 'Invalid event handler property `%s`. Did you mean `%s`?%s', name, registrationName, getStackAddendum$3(debugID));
|
|
warnedProperties$1[name] = true;
|
|
return true;
|
|
}
|
|
|
|
if (lowerCasedName.indexOf('on') === 0) {
|
|
warning$7(false, 'Unknown event handler property `%s`. It will be ignored.%s', name, getStackAddendum$3(debugID));
|
|
warnedProperties$1[name] = true;
|
|
return true;
|
|
}
|
|
|
|
// Let the ARIA attribute hook validate ARIA attributes
|
|
if (rARIA$1.test(name) || rARIACamel$1.test(name)) {
|
|
return true;
|
|
}
|
|
|
|
if (lowerCasedName === 'onfocusin' || lowerCasedName === 'onfocusout') {
|
|
warning$7(false, 'React uses onFocus and onBlur instead of onFocusIn and onFocusOut. ' + 'All React events are normalized to bubble, so onFocusIn and onFocusOut ' + 'are not needed/supported by React.');
|
|
warnedProperties$1[name] = true;
|
|
return true;
|
|
}
|
|
|
|
if (lowerCasedName === 'innerhtml') {
|
|
warning$7(false, 'Directly setting property `innerHTML` is not permitted. ' + 'For more information, lookup documentation on `dangerouslySetInnerHTML`.');
|
|
warnedProperties$1[name] = true;
|
|
return true;
|
|
}
|
|
|
|
if (lowerCasedName === 'aria') {
|
|
warning$7(false, 'The `aria` attribute is reserved for future use in React. ' + 'Pass individual `aria-` attributes instead.');
|
|
warnedProperties$1[name] = true;
|
|
return true;
|
|
}
|
|
|
|
if (lowerCasedName === 'is' && value !== null && value !== undefined && typeof value !== 'string') {
|
|
warning$7(false, 'Received a `%s` for string attribute `is`. If this is expected, cast ' + 'the value to a string.%s', typeof value, getStackAddendum$3(debugID));
|
|
warnedProperties$1[name] = true;
|
|
return true;
|
|
}
|
|
|
|
if (typeof value === 'number' && isNaN(value)) {
|
|
warning$7(false, 'Received NaN for numeric attribute `%s`. If this is expected, cast ' + 'the value to a string.%s', name, getStackAddendum$3(debugID));
|
|
warnedProperties$1[name] = true;
|
|
return true;
|
|
}
|
|
|
|
var isReserved = DOMProperty_1.isReservedProp(name);
|
|
|
|
// Known attributes should match the casing specified in the property config.
|
|
if (possibleStandardNames.hasOwnProperty(lowerCasedName)) {
|
|
var standardName = possibleStandardNames[lowerCasedName];
|
|
if (standardName !== name) {
|
|
warning$7(false, 'Invalid DOM property `%s`. Did you mean `%s`?%s', name, standardName, getStackAddendum$3(debugID));
|
|
warnedProperties$1[name] = true;
|
|
return true;
|
|
}
|
|
} else if (!isReserved && name !== lowerCasedName) {
|
|
// Unknown attributes should have lowercase casing since that's how they
|
|
// will be cased anyway with server rendering.
|
|
warning$7(false, 'React does not recognize the `%s` prop on a DOM element. If you ' + 'intentionally want it to appear in the DOM as a custom ' + 'attribute, spell it as lowercase `%s` instead. ' + 'If you accidentally passed it from a parent component, remove ' + 'it from the DOM element.%s', name, lowerCasedName, getStackAddendum$3(debugID));
|
|
warnedProperties$1[name] = true;
|
|
return true;
|
|
}
|
|
|
|
if (typeof value === 'boolean') {
|
|
warning$7(DOMProperty_1.shouldAttributeAcceptBooleanValue(name), 'Received `%s` for non-boolean attribute `%s`. If this is expected, cast ' + 'the value to a string.%s', value, name, getStackAddendum$3(debugID));
|
|
warnedProperties$1[name] = true;
|
|
return true;
|
|
}
|
|
|
|
// Now that we've validated casing, do not validate
|
|
// data types for reserved props
|
|
if (isReserved) {
|
|
return true;
|
|
}
|
|
|
|
// Warn when a known attribute is a bad type
|
|
if (!DOMProperty_1.shouldSetAttribute(name, value)) {
|
|
warnedProperties$1[name] = true;
|
|
return false;
|
|
}
|
|
|
|
return true;
|
|
};
|
|
}
|
|
|
|
var warnUnknownProperties = function (type, props, debugID) {
|
|
var unknownProps = [];
|
|
for (var key in props) {
|
|
var isValid = validateProperty$1(type, key, props[key], debugID);
|
|
if (!isValid) {
|
|
unknownProps.push(key);
|
|
}
|
|
}
|
|
|
|
var unknownPropString = unknownProps.map(function (prop) {
|
|
return '`' + prop + '`';
|
|
}).join(', ');
|
|
if (unknownProps.length === 1) {
|
|
warning$7(false, 'Invalid value for prop %s on <%s> tag. Either remove it from the element, ' + 'or pass a string or number value to keep it in the DOM. ' + 'For details, see https://fb.me/react-attribute-behavior%s', unknownPropString, type, getStackAddendum$3(debugID));
|
|
} else if (unknownProps.length > 1) {
|
|
warning$7(false, 'Invalid values for props %s on <%s> tag. Either remove them from the element, ' + 'or pass a string or number value to keep them in the DOM. ' + 'For details, see https://fb.me/react-attribute-behavior%s', unknownPropString, type, getStackAddendum$3(debugID));
|
|
}
|
|
};
|
|
|
|
function validateProperties$2(type, props, debugID /* Stack only */) {
|
|
if (isCustomComponent_1(type, props)) {
|
|
return;
|
|
}
|
|
warnUnknownProperties(type, props, debugID);
|
|
}
|
|
|
|
var ReactDOMUnknownPropertyHook = {
|
|
// Fiber
|
|
validateProperties: validateProperties$2,
|
|
// Stack
|
|
onBeforeMountComponent: function (debugID, element) {
|
|
if (true && element != null && typeof element.type === 'string') {
|
|
validateProperties$2(element.type, element.props, debugID);
|
|
}
|
|
},
|
|
onBeforeUpdateComponent: function (debugID, element) {
|
|
if (true && element != null && typeof element.type === 'string') {
|
|
validateProperties$2(element.type, element.props, debugID);
|
|
}
|
|
}
|
|
};
|
|
|
|
var ReactDOMUnknownPropertyHook_1 = ReactDOMUnknownPropertyHook;
|
|
|
|
function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
|
|
|
|
var Namespaces = DOMNamespaces.Namespaces;
|
|
var getIntrinsicNamespace = DOMNamespaces.getIntrinsicNamespace;
|
|
var getChildNamespace = DOMNamespaces.getChildNamespace;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
var toArray = react.Children.toArray;
|
|
|
|
{
|
|
var warning = require$$0;
|
|
var checkPropTypes$1 = checkPropTypes;
|
|
var warnValidStyle = warnValidStyle_1;
|
|
|
|
var _require2 = ReactDOMInvalidARIAHook_1,
|
|
validateARIAProperties = _require2.validateProperties;
|
|
|
|
var _require3 = ReactDOMNullInputValuePropHook_1,
|
|
validateInputProperties = _require3.validateProperties;
|
|
|
|
var _require4 = ReactDOMUnknownPropertyHook_1,
|
|
validateUnknownProperties = _require4.validateProperties;
|
|
|
|
var validatePropertiesInDevelopment = function (type, props) {
|
|
validateARIAProperties(type, props);
|
|
validateInputProperties(type, props);
|
|
validateUnknownProperties(type, props);
|
|
};
|
|
|
|
var describeComponentFrame = describeComponentFrame$1;
|
|
var describeStackFrame = function (element) {
|
|
var source = element._source;
|
|
var type = element.type;
|
|
var name = getComponentName(type);
|
|
var ownerName = null;
|
|
return describeComponentFrame(name, source, ownerName);
|
|
};
|
|
|
|
var _require5 = ReactGlobalSharedState_1,
|
|
ReactDebugCurrentFrame = _require5.ReactDebugCurrentFrame;
|
|
|
|
var currentDebugStack = null;
|
|
var currentDebugElementStack = null;
|
|
var setCurrentDebugStack = function (stack) {
|
|
currentDebugElementStack = stack[stack.length - 1].debugElementStack;
|
|
// We are about to enter a new composite stack, reset the array.
|
|
currentDebugElementStack.length = 0;
|
|
currentDebugStack = stack;
|
|
ReactDebugCurrentFrame.getCurrentStack = getStackAddendum;
|
|
};
|
|
var pushElementToDebugStack = function (element) {
|
|
if (currentDebugElementStack !== null) {
|
|
currentDebugElementStack.push(element);
|
|
}
|
|
};
|
|
var resetCurrentDebugStack = function () {
|
|
currentDebugElementStack = null;
|
|
currentDebugStack = null;
|
|
ReactDebugCurrentFrame.getCurrentStack = null;
|
|
};
|
|
var getStackAddendum = function () {
|
|
if (currentDebugStack === null) {
|
|
return null;
|
|
}
|
|
var stack = '';
|
|
var debugStack = currentDebugStack;
|
|
for (var i = debugStack.length - 1; i >= 0; i--) {
|
|
var debugElementStack = debugStack[i].debugElementStack;
|
|
for (var ii = debugElementStack.length - 1; ii >= 0; ii--) {
|
|
stack += describeStackFrame(debugElementStack[ii]);
|
|
}
|
|
}
|
|
return stack;
|
|
};
|
|
}
|
|
|
|
var didWarnDefaultInputValue = false;
|
|
var didWarnDefaultChecked = false;
|
|
var didWarnDefaultSelectValue = false;
|
|
var didWarnDefaultTextareaValue = false;
|
|
var didWarnInvalidOptionChildren = false;
|
|
var valuePropNames = ['value', 'defaultValue'];
|
|
var newlineEatingTags = {
|
|
listing: true,
|
|
pre: true,
|
|
textarea: true
|
|
};
|
|
|
|
function getComponentName(type) {
|
|
return typeof type === 'string' ? type : typeof type === 'function' ? type.displayName || type.name : null;
|
|
}
|
|
|
|
// We accept any tag to be rendered but since this gets injected into arbitrary
|
|
// HTML, we want to make sure that it's a safe tag.
|
|
// http://www.w3.org/TR/REC-xml/#NT-Name
|
|
var VALID_TAG_REGEX = /^[a-zA-Z][a-zA-Z:_\.\-\d]*$/; // Simplified subset
|
|
var validatedTagCache = {};
|
|
function validateDangerousTag(tag) {
|
|
if (!validatedTagCache.hasOwnProperty(tag)) {
|
|
!VALID_TAG_REGEX.test(tag) ? invariant(false, 'Invalid tag: %s', tag) : void 0;
|
|
validatedTagCache[tag] = true;
|
|
}
|
|
}
|
|
|
|
var processStyleName = memoizeStringOnly(function (styleName) {
|
|
return hyphenateStyleName(styleName);
|
|
});
|
|
|
|
function createMarkupForStyles(styles, component) {
|
|
var serialized = '';
|
|
var delimiter = '';
|
|
for (var styleName in styles) {
|
|
if (!styles.hasOwnProperty(styleName)) {
|
|
continue;
|
|
}
|
|
var isCustomProperty = styleName.indexOf('--') === 0;
|
|
var styleValue = styles[styleName];
|
|
{
|
|
if (!isCustomProperty) {
|
|
warnValidStyle(styleName, styleValue, component);
|
|
}
|
|
}
|
|
if (styleValue != null) {
|
|
serialized += delimiter + processStyleName(styleName) + ':';
|
|
serialized += dangerousStyleValue_1(styleName, styleValue, isCustomProperty);
|
|
|
|
delimiter = ';';
|
|
}
|
|
}
|
|
return serialized || null;
|
|
}
|
|
|
|
function warnNoop(publicInstance, callerName) {
|
|
{
|
|
var constructor = publicInstance.constructor;
|
|
warning(false, '%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, constructor && getComponentName(constructor) || 'ReactClass');
|
|
}
|
|
}
|
|
|
|
function shouldConstruct(Component) {
|
|
return Component.prototype && Component.prototype.isReactComponent;
|
|
}
|
|
|
|
function getNonChildrenInnerMarkup(props) {
|
|
var innerHTML = props.dangerouslySetInnerHTML;
|
|
if (innerHTML != null) {
|
|
if (innerHTML.__html != null) {
|
|
return innerHTML.__html;
|
|
}
|
|
} else {
|
|
var content = props.children;
|
|
if (typeof content === 'string' || typeof content === 'number') {
|
|
return escapeTextContentForBrowser_1(content);
|
|
}
|
|
}
|
|
return null;
|
|
}
|
|
|
|
function flattenOptionChildren(children) {
|
|
var content = '';
|
|
// Flatten children and warn if they aren't strings or numbers;
|
|
// invalid types are ignored.
|
|
react.Children.forEach(children, function (child) {
|
|
if (child == null) {
|
|
return;
|
|
}
|
|
if (typeof child === 'string' || typeof child === 'number') {
|
|
content += child;
|
|
} else {
|
|
{
|
|
if (!didWarnInvalidOptionChildren) {
|
|
didWarnInvalidOptionChildren = true;
|
|
warning(false, 'Only strings and numbers are supported as <option> children.');
|
|
}
|
|
}
|
|
}
|
|
});
|
|
return content;
|
|
}
|
|
|
|
function maskContext(type, context) {
|
|
var contextTypes = type.contextTypes;
|
|
if (!contextTypes) {
|
|
return emptyObject;
|
|
}
|
|
var maskedContext = {};
|
|
for (var contextName in contextTypes) {
|
|
maskedContext[contextName] = context[contextName];
|
|
}
|
|
return maskedContext;
|
|
}
|
|
|
|
function checkContextTypes(typeSpecs, values, location) {
|
|
{
|
|
checkPropTypes$1(typeSpecs, values, location, 'Component', getStackAddendum);
|
|
}
|
|
}
|
|
|
|
function processContext(type, context) {
|
|
var maskedContext = maskContext(type, context);
|
|
{
|
|
if (type.contextTypes) {
|
|
checkContextTypes(type.contextTypes, maskedContext, 'context');
|
|
}
|
|
}
|
|
return maskedContext;
|
|
}
|
|
|
|
var STYLE = 'style';
|
|
var RESERVED_PROPS = {
|
|
children: null,
|
|
dangerouslySetInnerHTML: null,
|
|
suppressContentEditableWarning: null
|
|
};
|
|
|
|
function createOpenTagMarkup(tagVerbatim, tagLowercase, props, namespace, makeStaticMarkup, isRootElement, instForDebug) {
|
|
var ret = '<' + tagVerbatim;
|
|
|
|
for (var propKey in props) {
|
|
if (!props.hasOwnProperty(propKey)) {
|
|
continue;
|
|
}
|
|
var propValue = props[propKey];
|
|
if (propValue == null) {
|
|
continue;
|
|
}
|
|
if (propKey === STYLE) {
|
|
propValue = createMarkupForStyles(propValue, instForDebug);
|
|
}
|
|
var markup = null;
|
|
if (isCustomComponent_1(tagLowercase, props)) {
|
|
if (!RESERVED_PROPS.hasOwnProperty(propKey)) {
|
|
markup = DOMMarkupOperations_1.createMarkupForCustomAttribute(propKey, propValue);
|
|
}
|
|
} else {
|
|
markup = DOMMarkupOperations_1.createMarkupForProperty(propKey, propValue);
|
|
}
|
|
if (markup) {
|
|
ret += ' ' + markup;
|
|
}
|
|
}
|
|
|
|
// For static pages, no need to put React ID and checksum. Saves lots of
|
|
// bytes.
|
|
if (makeStaticMarkup) {
|
|
return ret;
|
|
}
|
|
|
|
if (isRootElement) {
|
|
ret += ' ' + DOMMarkupOperations_1.createMarkupForRoot();
|
|
}
|
|
return ret;
|
|
}
|
|
|
|
function validateRenderResult(child, type) {
|
|
if (child === undefined) {
|
|
invariant(false, '%s(...): Nothing was returned from render. This usually means a return statement is missing. Or, to render nothing, return null.', getComponentName(type) || 'Component');
|
|
}
|
|
}
|
|
|
|
function resolve(child, context) {
|
|
while (react.isValidElement(child)) {
|
|
{
|
|
pushElementToDebugStack(child);
|
|
}
|
|
var Component = child.type;
|
|
if (typeof Component !== 'function') {
|
|
break;
|
|
}
|
|
var publicContext = processContext(Component, context);
|
|
var inst;
|
|
var queue = [];
|
|
var replace = false;
|
|
var updater = {
|
|
isMounted: function (publicInstance) {
|
|
return false;
|
|
},
|
|
enqueueForceUpdate: function (publicInstance) {
|
|
if (queue === null) {
|
|
warnNoop(publicInstance, 'forceUpdate');
|
|
return null;
|
|
}
|
|
},
|
|
enqueueReplaceState: function (publicInstance, completeState) {
|
|
replace = true;
|
|
queue = [completeState];
|
|
},
|
|
enqueueSetState: function (publicInstance, partialState) {
|
|
if (queue === null) {
|
|
warnNoop(publicInstance, 'setState');
|
|
return null;
|
|
}
|
|
queue.push(partialState);
|
|
}
|
|
};
|
|
|
|
if (shouldConstruct(Component)) {
|
|
inst = new Component(child.props, publicContext, updater);
|
|
} else {
|
|
inst = Component(child.props, publicContext, updater);
|
|
if (inst == null || inst.render == null) {
|
|
child = inst;
|
|
validateRenderResult(child, Component);
|
|
continue;
|
|
}
|
|
}
|
|
|
|
inst.props = child.props;
|
|
inst.context = publicContext;
|
|
inst.updater = updater;
|
|
|
|
var initialState = inst.state;
|
|
if (initialState === undefined) {
|
|
inst.state = initialState = null;
|
|
}
|
|
if (inst.componentWillMount) {
|
|
inst.componentWillMount();
|
|
if (queue.length) {
|
|
var oldQueue = queue;
|
|
var oldReplace = replace;
|
|
queue = null;
|
|
replace = false;
|
|
|
|
if (oldReplace && oldQueue.length === 1) {
|
|
inst.state = oldQueue[0];
|
|
} else {
|
|
var nextState = oldReplace ? oldQueue[0] : inst.state;
|
|
var dontMutate = true;
|
|
for (var i = oldReplace ? 1 : 0; i < oldQueue.length; i++) {
|
|
var partial = oldQueue[i];
|
|
var partialState = typeof partial === 'function' ? partial.call(inst, nextState, child.props, publicContext) : partial;
|
|
if (partialState) {
|
|
if (dontMutate) {
|
|
dontMutate = false;
|
|
nextState = objectAssign$1({}, nextState, partialState);
|
|
} else {
|
|
objectAssign$1(nextState, partialState);
|
|
}
|
|
}
|
|
}
|
|
inst.state = nextState;
|
|
}
|
|
} else {
|
|
queue = null;
|
|
}
|
|
}
|
|
child = inst.render();
|
|
|
|
{
|
|
if (child === undefined && inst.render._isMockFunction) {
|
|
// This is probably bad practice. Consider warning here and
|
|
// deprecating this convenience.
|
|
child = null;
|
|
}
|
|
}
|
|
validateRenderResult(child, Component);
|
|
|
|
var childContext;
|
|
if (typeof inst.getChildContext === 'function') {
|
|
var childContextTypes = Component.childContextTypes;
|
|
!(typeof childContextTypes === 'object') ? invariant(false, '%s.getChildContext(): childContextTypes must be defined in order to use getChildContext().', getComponentName(Component) || 'Unknown') : void 0;
|
|
childContext = inst.getChildContext();
|
|
for (var contextKey in childContext) {
|
|
!(contextKey in childContextTypes) ? invariant(false, '%s.getChildContext(): key "%s" is not defined in childContextTypes.', getComponentName(Component) || 'Unknown', contextKey) : void 0;
|
|
}
|
|
}
|
|
if (childContext) {
|
|
context = objectAssign$1({}, context, childContext);
|
|
}
|
|
}
|
|
return { child: child, context: context };
|
|
}
|
|
|
|
var ReactDOMServerRenderer = function () {
|
|
function ReactDOMServerRenderer(element, makeStaticMarkup) {
|
|
_classCallCheck(this, ReactDOMServerRenderer);
|
|
|
|
var children = react.isValidElement(element) ? [element] : toArray(element);
|
|
var topFrame = {
|
|
// Assume all trees start in the HTML namespace (not totally true, but
|
|
// this is what we did historically)
|
|
domNamespace: Namespaces.html,
|
|
children: children,
|
|
childIndex: 0,
|
|
context: emptyObject,
|
|
footer: ''
|
|
};
|
|
{
|
|
topFrame.debugElementStack = [];
|
|
}
|
|
this.stack = [topFrame];
|
|
this.exhausted = false;
|
|
this.currentSelectValue = null;
|
|
this.previousWasTextNode = false;
|
|
this.makeStaticMarkup = makeStaticMarkup;
|
|
}
|
|
|
|
ReactDOMServerRenderer.prototype.read = function read(bytes) {
|
|
if (this.exhausted) {
|
|
return null;
|
|
}
|
|
|
|
var out = '';
|
|
while (out.length < bytes) {
|
|
if (this.stack.length === 0) {
|
|
this.exhausted = true;
|
|
break;
|
|
}
|
|
var frame = this.stack[this.stack.length - 1];
|
|
if (frame.childIndex >= frame.children.length) {
|
|
out += frame.footer;
|
|
this.previousWasTextNode = false;
|
|
this.stack.pop();
|
|
if (frame.tag === 'select') {
|
|
this.currentSelectValue = null;
|
|
}
|
|
continue;
|
|
}
|
|
var child = frame.children[frame.childIndex++];
|
|
{
|
|
setCurrentDebugStack(this.stack);
|
|
}
|
|
out += this.render(child, frame.context, frame.domNamespace);
|
|
{
|
|
// TODO: Handle reentrant server render calls. This doesn't.
|
|
resetCurrentDebugStack();
|
|
}
|
|
}
|
|
return out;
|
|
};
|
|
|
|
ReactDOMServerRenderer.prototype.render = function render(child, context, parentNamespace) {
|
|
if (typeof child === 'string' || typeof child === 'number') {
|
|
var text = '' + child;
|
|
if (text === '') {
|
|
return '';
|
|
}
|
|
if (this.makeStaticMarkup) {
|
|
return escapeTextContentForBrowser_1(text);
|
|
}
|
|
if (this.previousWasTextNode) {
|
|
return '<!-- -->' + escapeTextContentForBrowser_1(text);
|
|
}
|
|
this.previousWasTextNode = true;
|
|
return escapeTextContentForBrowser_1(text);
|
|
} else {
|
|
var _resolve = resolve(child, context);
|
|
|
|
child = _resolve.child;
|
|
context = _resolve.context;
|
|
|
|
if (child === null || child === false) {
|
|
return '';
|
|
} else {
|
|
if (react.isValidElement(child)) {
|
|
return this.renderDOM(child, context, parentNamespace);
|
|
} else {
|
|
var children = toArray(child);
|
|
var frame = {
|
|
domNamespace: parentNamespace,
|
|
children: children,
|
|
childIndex: 0,
|
|
context: context,
|
|
footer: ''
|
|
};
|
|
{
|
|
frame.debugElementStack = [];
|
|
}
|
|
this.stack.push(frame);
|
|
return '';
|
|
}
|
|
}
|
|
}
|
|
};
|
|
|
|
ReactDOMServerRenderer.prototype.renderDOM = function renderDOM(element, context, parentNamespace) {
|
|
var tag = element.type.toLowerCase();
|
|
|
|
var namespace = parentNamespace;
|
|
if (parentNamespace === Namespaces.html) {
|
|
namespace = getIntrinsicNamespace(tag);
|
|
}
|
|
|
|
{
|
|
if (namespace === Namespaces.html) {
|
|
// Should this check be gated by parent namespace? Not sure we want to
|
|
// allow <SVG> or <mATH>.
|
|
warning(tag === element.type, '<%s /> is using uppercase HTML. Always use lowercase HTML tags ' + 'in React.', element.type);
|
|
}
|
|
}
|
|
|
|
validateDangerousTag(tag);
|
|
|
|
var props = element.props;
|
|
if (tag === 'input') {
|
|
{
|
|
ReactControlledValuePropTypes_1.checkPropTypes('input', props, function () {
|
|
return '';
|
|
});
|
|
|
|
if (props.checked !== undefined && props.defaultChecked !== undefined && !didWarnDefaultChecked) {
|
|
warning(false, '%s contains an input of type %s with both checked and defaultChecked props. ' + 'Input elements must be either controlled or uncontrolled ' + '(specify either the checked prop, or the defaultChecked prop, but not ' + 'both). Decide between using a controlled or uncontrolled input ' + 'element and remove one of these props. More info: ' + 'https://fb.me/react-controlled-components', 'A component', props.type);
|
|
didWarnDefaultChecked = true;
|
|
}
|
|
if (props.value !== undefined && props.defaultValue !== undefined && !didWarnDefaultInputValue) {
|
|
warning(false, '%s contains an input of type %s with both value and defaultValue props. ' + 'Input elements must be either controlled or uncontrolled ' + '(specify either the value prop, or the defaultValue prop, but not ' + 'both). Decide between using a controlled or uncontrolled input ' + 'element and remove one of these props. More info: ' + 'https://fb.me/react-controlled-components', 'A component', props.type);
|
|
didWarnDefaultInputValue = true;
|
|
}
|
|
}
|
|
|
|
props = objectAssign$1({
|
|
type: undefined
|
|
}, props, {
|
|
defaultChecked: undefined,
|
|
defaultValue: undefined,
|
|
value: props.value != null ? props.value : props.defaultValue,
|
|
checked: props.checked != null ? props.checked : props.defaultChecked
|
|
});
|
|
} else if (tag === 'textarea') {
|
|
{
|
|
ReactControlledValuePropTypes_1.checkPropTypes('textarea', props, function () {
|
|
return '';
|
|
});
|
|
if (props.value !== undefined && props.defaultValue !== undefined && !didWarnDefaultTextareaValue) {
|
|
warning(false, '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');
|
|
didWarnDefaultTextareaValue = true;
|
|
}
|
|
}
|
|
|
|
var initialValue = props.value;
|
|
if (initialValue == null) {
|
|
var defaultValue = props.defaultValue;
|
|
// TODO (yungsters): Remove support for children content in <textarea>.
|
|
var textareaChildren = props.children;
|
|
if (textareaChildren != null) {
|
|
{
|
|
warning(false, 'Use the `defaultValue` or `value` props instead of setting ' + 'children on <textarea>.');
|
|
}
|
|
!(defaultValue == null) ? invariant(false, 'If you supply `defaultValue` on a <textarea>, do not pass children.') : void 0;
|
|
if (Array.isArray(textareaChildren)) {
|
|
!(textareaChildren.length <= 1) ? invariant(false, '<textarea> can only have at most one child.') : void 0;
|
|
textareaChildren = textareaChildren[0];
|
|
}
|
|
|
|
defaultValue = '' + textareaChildren;
|
|
}
|
|
if (defaultValue == null) {
|
|
defaultValue = '';
|
|
}
|
|
initialValue = defaultValue;
|
|
}
|
|
|
|
props = objectAssign$1({}, props, {
|
|
value: undefined,
|
|
children: '' + initialValue
|
|
});
|
|
} else if (tag === 'select') {
|
|
{
|
|
ReactControlledValuePropTypes_1.checkPropTypes('select', props, function () {
|
|
return '';
|
|
});
|
|
|
|
for (var i = 0; i < valuePropNames.length; i++) {
|
|
var propName = valuePropNames[i];
|
|
if (props[propName] == null) {
|
|
continue;
|
|
}
|
|
var isArray = Array.isArray(props[propName]);
|
|
if (props.multiple && !isArray) {
|
|
warning(false, 'The `%s` prop supplied to <select> must be an array if ' + '`multiple` is true.%s', propName, '');
|
|
} else if (!props.multiple && isArray) {
|
|
warning(false, 'The `%s` prop supplied to <select> must be a scalar ' + 'value if `multiple` is false.%s', propName, '');
|
|
}
|
|
}
|
|
|
|
if (props.value !== undefined && props.defaultValue !== undefined && !didWarnDefaultSelectValue) {
|
|
warning(false, 'Select elements must be either controlled or uncontrolled ' + '(specify either the value prop, or the defaultValue prop, but not ' + 'both). Decide between using a controlled or uncontrolled select ' + 'element and remove one of these props. More info: ' + 'https://fb.me/react-controlled-components');
|
|
didWarnDefaultSelectValue = true;
|
|
}
|
|
}
|
|
this.currentSelectValue = props.value != null ? props.value : props.defaultValue;
|
|
props = objectAssign$1({}, props, {
|
|
value: undefined
|
|
});
|
|
} else if (tag === 'option') {
|
|
var selected = null;
|
|
var selectValue = this.currentSelectValue;
|
|
var optionChildren = flattenOptionChildren(props.children);
|
|
if (selectValue != null) {
|
|
var value;
|
|
if (props.value != null) {
|
|
value = props.value + '';
|
|
} else {
|
|
value = optionChildren;
|
|
}
|
|
selected = false;
|
|
if (Array.isArray(selectValue)) {
|
|
// multiple
|
|
for (var j = 0; j < selectValue.length; j++) {
|
|
if ('' + selectValue[j] === value) {
|
|
selected = true;
|
|
break;
|
|
}
|
|
}
|
|
} else {
|
|
selected = '' + selectValue === value;
|
|
}
|
|
|
|
props = objectAssign$1({
|
|
selected: undefined,
|
|
children: undefined
|
|
}, props, {
|
|
selected: selected,
|
|
children: optionChildren
|
|
});
|
|
}
|
|
}
|
|
|
|
{
|
|
validatePropertiesInDevelopment(tag, props);
|
|
}
|
|
|
|
assertValidProps_1(tag, props);
|
|
|
|
var out = createOpenTagMarkup(element.type, tag, props, namespace, this.makeStaticMarkup, this.stack.length === 1, null);
|
|
var footer = '';
|
|
if (omittedCloseTags_1.hasOwnProperty(tag)) {
|
|
out += '/>';
|
|
} else {
|
|
out += '>';
|
|
footer = '</' + element.type + '>';
|
|
}
|
|
var children;
|
|
var innerMarkup = getNonChildrenInnerMarkup(props);
|
|
if (innerMarkup != null) {
|
|
children = [];
|
|
if (newlineEatingTags[tag] && innerMarkup.charAt(0) === '\n') {
|
|
// text/html ignores the first character in these tags if it's a newline
|
|
// Prefer to break application/xml over text/html (for now) by adding
|
|
// a newline specifically to get eaten by the parser. (Alternately for
|
|
// textareas, replacing "^\n" with "\r\n" doesn't get eaten, and the first
|
|
// \r is normalized out by HTMLTextAreaElement#value.)
|
|
// See: <http://www.w3.org/TR/html-polyglot/#newlines-in-textarea-and-pre>
|
|
// See: <http://www.w3.org/TR/html5/syntax.html#element-restrictions>
|
|
// See: <http://www.w3.org/TR/html5/syntax.html#newlines>
|
|
// See: Parsing of "textarea" "listing" and "pre" elements
|
|
// from <http://www.w3.org/TR/html5/syntax.html#parsing-main-inbody>
|
|
out += '\n';
|
|
}
|
|
out += innerMarkup;
|
|
} else {
|
|
children = toArray(props.children);
|
|
}
|
|
var frame = {
|
|
domNamespace: getChildNamespace(parentNamespace, element.type),
|
|
tag: tag,
|
|
children: children,
|
|
childIndex: 0,
|
|
context: context,
|
|
footer: footer
|
|
};
|
|
{
|
|
frame.debugElementStack = [];
|
|
}
|
|
this.stack.push(frame);
|
|
return out;
|
|
};
|
|
|
|
return ReactDOMServerRenderer;
|
|
}();
|
|
|
|
var ReactPartialRenderer = ReactDOMServerRenderer;
|
|
|
|
/**
|
|
* Render a ReactElement to its initial HTML. This should only be used on the
|
|
* server.
|
|
* See https://facebook.github.io/react/docs/react-dom-server.html#rendertostring
|
|
*/
|
|
function renderToString(element) {
|
|
var renderer = new ReactPartialRenderer(element, false);
|
|
var markup = renderer.read(Infinity);
|
|
return markup;
|
|
}
|
|
|
|
/**
|
|
* Similar to renderToString, except this doesn't create extra DOM attributes
|
|
* such as data-react-id that React uses internally.
|
|
* See https://facebook.github.io/react/docs/react-dom-server.html#rendertostaticmarkup
|
|
*/
|
|
function renderToStaticMarkup(element) {
|
|
var renderer = new ReactPartialRenderer(element, true);
|
|
var markup = renderer.read(Infinity);
|
|
return markup;
|
|
}
|
|
|
|
var ReactDOMStringRenderer = {
|
|
renderToString: renderToString,
|
|
renderToStaticMarkup: renderToStaticMarkup
|
|
};
|
|
|
|
function _classCallCheck$1(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
|
|
|
|
function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; }
|
|
|
|
function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }
|
|
|
|
|
|
var Readable = stream.Readable;
|
|
|
|
// This is a Readable Node.js stream which wraps the ReactDOMPartialRenderer.
|
|
|
|
var ReactMarkupReadableStream = function (_Readable) {
|
|
_inherits(ReactMarkupReadableStream, _Readable);
|
|
|
|
function ReactMarkupReadableStream(element, makeStaticMarkup) {
|
|
_classCallCheck$1(this, ReactMarkupReadableStream);
|
|
|
|
var _this = _possibleConstructorReturn(this, _Readable.call(this, {}));
|
|
// Calls the stream.Readable(options) constructor. Consider exposing built-in
|
|
// features like highWaterMark in the future.
|
|
|
|
|
|
_this.partialRenderer = new ReactPartialRenderer(element, makeStaticMarkup);
|
|
return _this;
|
|
}
|
|
|
|
ReactMarkupReadableStream.prototype._read = function _read(size) {
|
|
try {
|
|
this.push(this.partialRenderer.read(size));
|
|
} catch (err) {
|
|
this.emit('error', err);
|
|
}
|
|
};
|
|
|
|
return ReactMarkupReadableStream;
|
|
}(Readable);
|
|
/**
|
|
* Render a ReactElement to its initial HTML. This should only be used on the
|
|
* server.
|
|
* See https://facebook.github.io/react/docs/react-dom-stream.html#rendertonodestream
|
|
*/
|
|
|
|
|
|
function renderToNodeStream(element) {
|
|
return new ReactMarkupReadableStream(element, false);
|
|
}
|
|
|
|
/**
|
|
* Similar to renderToNodeStream, except this doesn't create extra DOM attributes
|
|
* such as data-react-id that React uses internally.
|
|
* See https://facebook.github.io/react/docs/react-dom-stream.html#rendertostaticnodestream
|
|
*/
|
|
function renderToStaticNodeStream(element) {
|
|
return new ReactMarkupReadableStream(element, true);
|
|
}
|
|
|
|
var ReactDOMNodeStreamRenderer = {
|
|
renderToNodeStream: renderToNodeStream,
|
|
renderToStaticNodeStream: renderToStaticNodeStream
|
|
};
|
|
|
|
/**
|
|
* Copyright (c) 2013-present, Facebook, Inc.
|
|
*
|
|
* This source code is licensed under the MIT license found in the
|
|
* LICENSE file in the root directory of this source tree.
|
|
*
|
|
* @providesModule ReactVersion
|
|
*/
|
|
|
|
var ReactVersion = '16.0.0';
|
|
|
|
var MUST_USE_PROPERTY = DOMProperty_1.injection.MUST_USE_PROPERTY;
|
|
var HAS_BOOLEAN_VALUE = DOMProperty_1.injection.HAS_BOOLEAN_VALUE;
|
|
var HAS_NUMERIC_VALUE = DOMProperty_1.injection.HAS_NUMERIC_VALUE;
|
|
var HAS_POSITIVE_NUMERIC_VALUE = DOMProperty_1.injection.HAS_POSITIVE_NUMERIC_VALUE;
|
|
var HAS_OVERLOADED_BOOLEAN_VALUE = DOMProperty_1.injection.HAS_OVERLOADED_BOOLEAN_VALUE;
|
|
var HAS_STRING_BOOLEAN_VALUE = DOMProperty_1.injection.HAS_STRING_BOOLEAN_VALUE;
|
|
|
|
var HTMLDOMPropertyConfig = {
|
|
// When adding attributes to this list, be sure to also add them to
|
|
// the `possibleStandardNames` module to ensure casing and incorrect
|
|
// name warnings.
|
|
Properties: {
|
|
allowFullScreen: HAS_BOOLEAN_VALUE,
|
|
// IE only true/false iFrame attribute
|
|
// https://msdn.microsoft.com/en-us/library/ms533072(v=vs.85).aspx
|
|
allowTransparency: HAS_STRING_BOOLEAN_VALUE,
|
|
// specifies target context for links with `preload` type
|
|
async: HAS_BOOLEAN_VALUE,
|
|
// autoFocus is polyfilled/normalized by AutoFocusUtils
|
|
// autoFocus: HAS_BOOLEAN_VALUE,
|
|
autoPlay: HAS_BOOLEAN_VALUE,
|
|
capture: HAS_BOOLEAN_VALUE,
|
|
checked: MUST_USE_PROPERTY | HAS_BOOLEAN_VALUE,
|
|
cols: HAS_POSITIVE_NUMERIC_VALUE,
|
|
contentEditable: HAS_STRING_BOOLEAN_VALUE,
|
|
controls: HAS_BOOLEAN_VALUE,
|
|
'default': HAS_BOOLEAN_VALUE,
|
|
defer: HAS_BOOLEAN_VALUE,
|
|
disabled: HAS_BOOLEAN_VALUE,
|
|
download: HAS_OVERLOADED_BOOLEAN_VALUE,
|
|
draggable: HAS_STRING_BOOLEAN_VALUE,
|
|
formNoValidate: HAS_BOOLEAN_VALUE,
|
|
hidden: HAS_BOOLEAN_VALUE,
|
|
loop: HAS_BOOLEAN_VALUE,
|
|
// Caution; `option.selected` is not updated if `select.multiple` is
|
|
// disabled with `removeAttribute`.
|
|
multiple: MUST_USE_PROPERTY | HAS_BOOLEAN_VALUE,
|
|
muted: MUST_USE_PROPERTY | HAS_BOOLEAN_VALUE,
|
|
noValidate: HAS_BOOLEAN_VALUE,
|
|
open: HAS_BOOLEAN_VALUE,
|
|
playsInline: HAS_BOOLEAN_VALUE,
|
|
readOnly: HAS_BOOLEAN_VALUE,
|
|
required: HAS_BOOLEAN_VALUE,
|
|
reversed: HAS_BOOLEAN_VALUE,
|
|
rows: HAS_POSITIVE_NUMERIC_VALUE,
|
|
rowSpan: HAS_NUMERIC_VALUE,
|
|
scoped: HAS_BOOLEAN_VALUE,
|
|
seamless: HAS_BOOLEAN_VALUE,
|
|
selected: MUST_USE_PROPERTY | HAS_BOOLEAN_VALUE,
|
|
size: HAS_POSITIVE_NUMERIC_VALUE,
|
|
start: HAS_NUMERIC_VALUE,
|
|
// support for projecting regular DOM Elements via V1 named slots ( shadow dom )
|
|
span: HAS_POSITIVE_NUMERIC_VALUE,
|
|
spellCheck: HAS_STRING_BOOLEAN_VALUE,
|
|
// Style must be explicitly set in the attribute list. React components
|
|
// expect a style object
|
|
style: 0,
|
|
// itemScope is for for Microdata support.
|
|
// See http://schema.org/docs/gs.html
|
|
itemScope: HAS_BOOLEAN_VALUE,
|
|
// These attributes must stay in the white-list because they have
|
|
// different attribute names (see DOMAttributeNames below)
|
|
acceptCharset: 0,
|
|
className: 0,
|
|
htmlFor: 0,
|
|
httpEquiv: 0,
|
|
// Attributes with mutation methods must be specified in the whitelist
|
|
// Set the string boolean flag to allow the behavior
|
|
value: HAS_STRING_BOOLEAN_VALUE
|
|
},
|
|
DOMAttributeNames: {
|
|
acceptCharset: 'accept-charset',
|
|
className: 'class',
|
|
htmlFor: 'for',
|
|
httpEquiv: 'http-equiv'
|
|
},
|
|
DOMMutationMethods: {
|
|
value: function (node, value) {
|
|
if (value == null) {
|
|
return node.removeAttribute('value');
|
|
}
|
|
|
|
// Number inputs get special treatment due to some edge cases in
|
|
// Chrome. Let everything else assign the value attribute as normal.
|
|
// https://github.com/facebook/react/issues/7253#issuecomment-236074326
|
|
if (node.type !== 'number' || node.hasAttribute('value') === false) {
|
|
node.setAttribute('value', '' + value);
|
|
} else if (node.validity && !node.validity.badInput && node.ownerDocument.activeElement !== node) {
|
|
// Don't assign an attribute if validation reports bad
|
|
// input. Chrome will clear the value. Additionally, don't
|
|
// operate on inputs that have focus, otherwise Chrome might
|
|
// strip off trailing decimal places and cause the user's
|
|
// cursor position to jump to the beginning of the input.
|
|
//
|
|
// In ReactDOMInput, we have an onBlur event that will trigger
|
|
// this function again when focus is lost.
|
|
node.setAttribute('value', '' + value);
|
|
}
|
|
}
|
|
}
|
|
};
|
|
|
|
var HTMLDOMPropertyConfig_1 = HTMLDOMPropertyConfig;
|
|
|
|
var HAS_STRING_BOOLEAN_VALUE$1 = DOMProperty_1.injection.HAS_STRING_BOOLEAN_VALUE;
|
|
|
|
|
|
var NS = {
|
|
xlink: 'http://www.w3.org/1999/xlink',
|
|
xml: 'http://www.w3.org/XML/1998/namespace'
|
|
};
|
|
|
|
/**
|
|
* This is a list of all SVG attributes that need special casing,
|
|
* namespacing, or boolean value assignment.
|
|
*
|
|
* When adding attributes to this list, be sure to also add them to
|
|
* the `possibleStandardNames` module to ensure casing and incorrect
|
|
* name warnings.
|
|
*
|
|
* SVG Attributes List:
|
|
* https://www.w3.org/TR/SVG/attindex.html
|
|
* SMIL Spec:
|
|
* https://www.w3.org/TR/smil
|
|
*/
|
|
var ATTRS = ['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', 'x-height', 'xlink:actuate', 'xlink:arcrole', 'xlink:href', 'xlink:role', 'xlink:show', 'xlink:title', 'xlink:type', 'xml:base', 'xmlns:xlink', 'xml:lang', 'xml:space'];
|
|
|
|
var SVGDOMPropertyConfig = {
|
|
Properties: {
|
|
autoReverse: HAS_STRING_BOOLEAN_VALUE$1,
|
|
externalResourcesRequired: HAS_STRING_BOOLEAN_VALUE$1,
|
|
preserveAlpha: HAS_STRING_BOOLEAN_VALUE$1
|
|
},
|
|
DOMAttributeNames: {
|
|
autoReverse: 'autoReverse',
|
|
externalResourcesRequired: 'externalResourcesRequired',
|
|
preserveAlpha: 'preserveAlpha'
|
|
},
|
|
DOMAttributeNamespaces: {
|
|
xlinkActuate: NS.xlink,
|
|
xlinkArcrole: NS.xlink,
|
|
xlinkHref: NS.xlink,
|
|
xlinkRole: NS.xlink,
|
|
xlinkShow: NS.xlink,
|
|
xlinkTitle: NS.xlink,
|
|
xlinkType: NS.xlink,
|
|
xmlBase: NS.xml,
|
|
xmlLang: NS.xml,
|
|
xmlSpace: NS.xml
|
|
}
|
|
};
|
|
|
|
var CAMELIZE = /[\-\:]([a-z])/g;
|
|
var capitalize = function (token) {
|
|
return token[1].toUpperCase();
|
|
};
|
|
|
|
ATTRS.forEach(function (original) {
|
|
var reactName = original.replace(CAMELIZE, capitalize);
|
|
|
|
SVGDOMPropertyConfig.Properties[reactName] = 0;
|
|
SVGDOMPropertyConfig.DOMAttributeNames[reactName] = original;
|
|
});
|
|
|
|
var SVGDOMPropertyConfig_1 = SVGDOMPropertyConfig;
|
|
|
|
DOMProperty_1.injection.injectDOMPropertyConfig(HTMLDOMPropertyConfig_1);
|
|
DOMProperty_1.injection.injectDOMPropertyConfig(SVGDOMPropertyConfig_1);
|
|
|
|
var ReactDOMServerNodeEntry = {
|
|
renderToString: ReactDOMStringRenderer.renderToString,
|
|
renderToStaticMarkup: ReactDOMStringRenderer.renderToStaticMarkup,
|
|
renderToNodeStream: ReactDOMNodeStreamRenderer.renderToNodeStream,
|
|
renderToStaticNodeStream: ReactDOMNodeStreamRenderer.renderToStaticNodeStream,
|
|
version: ReactVersion
|
|
};
|
|
|
|
module.exports = ReactDOMServerNodeEntry;
|
|
|
|
})();
|
|
}
|