Skip to content

Commit

Permalink
Fix for facebook#6062 : Show source line number on unknown property w…
Browse files Browse the repository at this point in the history
…arning
  • Loading branch information
troydemonbreun committed Apr 1, 2016
1 parent 599582c commit b587f4d
Show file tree
Hide file tree
Showing 5 changed files with 45 additions and 11 deletions.
1 change: 1 addition & 0 deletions scripts/jest/preprocessor.js
Original file line number Diff line number Diff line change
Expand Up @@ -28,6 +28,7 @@ var pathToBabelrc = path.join(__dirname, '..', '..', '.babelrc');
var babelOptions = {
plugins: [
[babelPluginModules, { map: moduleMap }],
'transform-react-jsx-source',
],
retainLines: true,
};
Expand Down
4 changes: 4 additions & 0 deletions src/renderers/dom/shared/ReactDOMComponent.js
Original file line number Diff line number Diff line change
Expand Up @@ -29,6 +29,7 @@ var ReactDOMButton = require('ReactDOMButton');
var ReactDOMComponentFlags = require('ReactDOMComponentFlags');
var ReactDOMComponentTree = require('ReactDOMComponentTree');
var ReactDOMInput = require('ReactDOMInput');
var ReactDOMInstrumentation = require('ReactDOMInstrumentation');
var ReactDOMOption = require('ReactDOMOption');
var ReactDOMSelect = require('ReactDOMSelect');
var ReactDOMTextarea = require('ReactDOMTextarea');
Expand Down Expand Up @@ -651,6 +652,9 @@ ReactDOMComponent.Mixin = {
markup = DOMPropertyOperations.createMarkupForCustomAttribute(propKey, propValue);
}
} else {
if (__DEV__) {
ReactDOMInstrumentation.debugTool.onCreateMarkupForProperty(propKey, propValue, this._currentElement);
}
markup = DOMPropertyOperations.createMarkupForProperty(propKey, propValue);
}
if (markup) {
Expand Down
4 changes: 2 additions & 2 deletions src/renderers/dom/shared/ReactDOMDebugTool.js
Original file line number Diff line number Diff line change
Expand Up @@ -50,8 +50,8 @@ var ReactDOMDebugTool = {
}
}
},
onCreateMarkupForProperty(name, value) {
emitEvent('onCreateMarkupForProperty', name, value);
onCreateMarkupForProperty(name, value, element) {
emitEvent('onCreateMarkupForProperty', name, value, element);
},
onSetValueForProperty(node, name, value) {
emitEvent('onSetValueForProperty', node, name, value);
Expand Down
9 changes: 9 additions & 0 deletions src/renderers/dom/shared/__tests__/ReactDOMComponent-test.js
Original file line number Diff line number Diff line change
Expand Up @@ -1246,5 +1246,14 @@ describe('ReactDOMComponent', function() {
ReactTestUtils.renderIntoDocument(<div onFocusOut={() => {}} />);
expect(console.error.argsForCall.length).toBe(2);
});

it('gives source code refs for unknown property warnings', function() {
spyOn(console, 'error');
ReactDOMServer.renderToString(<input type="text" onclick="1"/>);
ReactDOMServer.renderToString(<div class="muffins"/>);
expect(console.error.argsForCall.length).toBe(2);
expect(console.error.argsForCall[0][0]).toMatch(/.*\(.*:\d+\)/);
expect(console.error.argsForCall[1][0]).toMatch(/.*\(.*:\d+\)/);
});
});
});
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,7 @@

var DOMProperty = require('DOMProperty');
var EventPluginRegistry = require('EventPluginRegistry');
var ReactDOMComponentTree = require('ReactDOMComponentTree');

var warning = require('warning');

Expand All @@ -25,7 +26,7 @@ if (__DEV__) {
};
var warnedProperties = {};

var warnUnknownProperty = function(name) {
var warnUnknownProperty = function(name, source) {
if (DOMProperty.properties.hasOwnProperty(name) || DOMProperty.isCustomAttribute(name)) {
return;
}
Expand All @@ -50,9 +51,10 @@ if (__DEV__) {
// logging too much when using transferPropsTo.
warning(
standardName == null,
'Unknown DOM property %s. Did you mean %s?',
'Unknown DOM property %s. Did you mean %s? %s',
name,
standardName
standardName,
formatSource(source)
);

var registrationName = (
Expand All @@ -65,23 +67,41 @@ if (__DEV__) {

warning(
registrationName == null,
'Unknown event handler property %s. Did you mean `%s`?',
'Unknown event handler property %s. Did you mean `%s`? %s',
name,
registrationName
registrationName,
formatSource(source)
);
};

var formatSource = function(source) {
return source ? `(${source.fileName.replace(/^.*[\\\/]/, '')}:${source.lineNumber})` : '';
};
}

var ReactDOMUnknownPropertyDevtool = {
onCreateMarkupForProperty(name, value) {
warnUnknownProperty(name);
onCreateMarkupForProperty(name, value, element) {
warnUnknownProperty(name, getSourceFromElement(element));
},
onSetValueForProperty(node, name, value) {
warnUnknownProperty(name);
warnUnknownProperty(name, getSourceFromNode(node));
},
onDeleteValueForProperty(node, name) {
warnUnknownProperty(name);
warnUnknownProperty(name, getSourceFromNode(node));
},
};

var getSourceFromNode = function(node) {
var instance = ReactDOMComponentTree.getInstanceFromNode(node);
if (instance) {
return getSourceFromElement(instance._currentElement);
}
};

var getSourceFromElement = function(element) {
if (element) {
return element._source;
}
};

module.exports = ReactDOMUnknownPropertyDevtool;

0 comments on commit b587f4d

Please sign in to comment.