UNPKG

4.2 kBJavaScriptView Raw
1/**
2 * Copyright (c) 2013-present, Facebook, Inc.
3 *
4 * This source code is licensed under the MIT license found in the
5 * LICENSE file in the root directory of this source tree.
6 *
7 */
8
9'use strict';
10
11var DOMProperty = require('./DOMProperty');
12var EventPluginRegistry = require('./EventPluginRegistry');
13var ReactComponentTreeHook = require('react/lib/ReactComponentTreeHook');
14
15var warning = require('fbjs/lib/warning');
16
17if (process.env.NODE_ENV !== 'production') {
18 var reactProps = {
19 children: true,
20 dangerouslySetInnerHTML: true,
21 key: true,
22 ref: true,
23
24 autoFocus: true,
25 defaultValue: true,
26 valueLink: true,
27 defaultChecked: true,
28 checkedLink: true,
29 innerHTML: true,
30 suppressContentEditableWarning: true,
31 onFocusIn: true,
32 onFocusOut: true
33 };
34 var warnedProperties = {};
35
36 var validateProperty = function (tagName, name, debugID) {
37 if (DOMProperty.properties.hasOwnProperty(name) || DOMProperty.isCustomAttribute(name)) {
38 return true;
39 }
40 if (reactProps.hasOwnProperty(name) && reactProps[name] || warnedProperties.hasOwnProperty(name) && warnedProperties[name]) {
41 return true;
42 }
43 if (EventPluginRegistry.registrationNameModules.hasOwnProperty(name)) {
44 return true;
45 }
46 warnedProperties[name] = true;
47 var lowerCasedName = name.toLowerCase();
48
49 // data-* attributes should be lowercase; suggest the lowercase version
50 var standardName = DOMProperty.isCustomAttribute(lowerCasedName) ? lowerCasedName : DOMProperty.getPossibleStandardName.hasOwnProperty(lowerCasedName) ? DOMProperty.getPossibleStandardName[lowerCasedName] : null;
51
52 var registrationName = EventPluginRegistry.possibleRegistrationNames.hasOwnProperty(lowerCasedName) ? EventPluginRegistry.possibleRegistrationNames[lowerCasedName] : null;
53
54 if (standardName != null) {
55 process.env.NODE_ENV !== 'production' ? warning(false, 'Unknown DOM property %s. Did you mean %s?%s', name, standardName, ReactComponentTreeHook.getStackAddendumByID(debugID)) : void 0;
56 return true;
57 } else if (registrationName != null) {
58 process.env.NODE_ENV !== 'production' ? warning(false, 'Unknown event handler property %s. Did you mean `%s`?%s', name, registrationName, ReactComponentTreeHook.getStackAddendumByID(debugID)) : void 0;
59 return true;
60 } else {
61 // We were unable to guess which prop the user intended.
62 // It is likely that the user was just blindly spreading/forwarding props
63 // Components should be careful to only render valid props/attributes.
64 // Warning will be invoked in warnUnknownProperties to allow grouping.
65 return false;
66 }
67 };
68}
69
70var warnUnknownProperties = function (debugID, element) {
71 var unknownProps = [];
72 for (var key in element.props) {
73 var isValid = validateProperty(element.type, key, debugID);
74 if (!isValid) {
75 unknownProps.push(key);
76 }
77 }
78
79 var unknownPropString = unknownProps.map(function (prop) {
80 return '`' + prop + '`';
81 }).join(', ');
82
83 if (unknownProps.length === 1) {
84 process.env.NODE_ENV !== 'production' ? warning(false, 'Unknown prop %s on <%s> tag. Remove this prop from the element. ' + 'For details, see https://fb.me/react-unknown-prop%s', unknownPropString, element.type, ReactComponentTreeHook.getStackAddendumByID(debugID)) : void 0;
85 } else if (unknownProps.length > 1) {
86 process.env.NODE_ENV !== 'production' ? warning(false, 'Unknown props %s on <%s> tag. Remove these props from the element. ' + 'For details, see https://fb.me/react-unknown-prop%s', unknownPropString, element.type, ReactComponentTreeHook.getStackAddendumByID(debugID)) : void 0;
87 }
88};
89
90function handleElement(debugID, element) {
91 if (element == null || typeof element.type !== 'string') {
92 return;
93 }
94 if (element.type.indexOf('-') >= 0 || element.props.is) {
95 return;
96 }
97 warnUnknownProperties(debugID, element);
98}
99
100var ReactDOMUnknownPropertyHook = {
101 onBeforeMountComponent: function (debugID, element) {
102 handleElement(debugID, element);
103 },
104 onBeforeUpdateComponent: function (debugID, element) {
105 handleElement(debugID, element);
106 }
107};
108
109module.exports = ReactDOMUnknownPropertyHook;
\No newline at end of file