Skip to content

Commit

Permalink
Fix jsx-handler-names for stateless components (fixes #346)
Browse files Browse the repository at this point in the history
  • Loading branch information
yannickcr committed Dec 5, 2015
1 parent be3b7f3 commit 889461b
Show file tree
Hide file tree
Showing 2 changed files with 9 additions and 24 deletions.
26 changes: 2 additions & 24 deletions lib/rules/jsx-handler-names.js
Original file line number Diff line number Diff line change
Expand Up @@ -14,40 +14,18 @@ module.exports = function(context) {
var eventHandlerPrefix = configuration.eventHandlerPrefix || 'handle';
var eventHandlerPropPrefix = configuration.eventHandlerPropPrefix || 'on';

var EVENT_HANDLER_REGEX = new RegExp('^((this\.props\.' + eventHandlerPropPrefix + ')'
var EVENT_HANDLER_REGEX = new RegExp('^((props\.' + eventHandlerPropPrefix + ')'
+ '|((.*\.)?' + eventHandlerPrefix + ')).+$');
var PROP_EVENT_HANDLER_REGEX = new RegExp('^' + eventHandlerPropPrefix + '.+$');

/**
* Get full prop value for a handler, i.e. `this.props.<name>`
* @param {Object} node.value.expression for JSXAttribute
* @return {String} Full prop value
*/
function rebuildPropValue(valueNode) {
var valueNodeObject = valueNode.object;
var subObjectType = valueNodeObject.object ? valueNodeObject.object.type : '';
var propertyName = valueNodeObject.property && valueNodeObject.property.name ? valueNodeObject.property.name : '';
var propValue = valueNode.property && valueNode.property.name ? valueNode.property.name : '';

if (propertyName.length) {
propValue = propertyName + '.' + propValue;
}

if (subObjectType === 'ThisExpression') {
propValue = 'this.' + propValue;
}

return propValue;
}

return {
JSXAttribute: function(node) {
if (!node.value || !node.value.expression || !node.value.expression.object) {
return;
}

var propKey = typeof node.name === 'object' ? node.name.name : node.name;
var propValue = rebuildPropValue(node.value.expression);
var propValue = context.getSource(node.value.expression).replace(/^this\./, '');

var propIsEventHandler = PROP_EVENT_HANDLER_REGEX.test(propKey);
var propFnIsNamedCorrectly = EVENT_HANDLER_REGEX.test(propValue);
Expand Down
7 changes: 7 additions & 0 deletions tests/lib/rules/jsx-handler-names.js
Original file line number Diff line number Diff line change
Expand Up @@ -59,6 +59,13 @@ ruleTester.run('jsx-handler-names', rule, {
ecmaFeatures: {
jsx: true
}
}, {
code: [
'<TestComponent onChange={props.onChange} />'
].join('\n'),
ecmaFeatures: {
jsx: true
}
}],

invalid: [{
Expand Down

0 comments on commit 889461b

Please sign in to comment.