Skip to content

Commit ac49944

Browse files
jsphstlsljharb
authored andcommitted
[Fix] jsx-handler-names: false positive when handler name begins with number
Fixes #1686.
1 parent 153eac8 commit ac49944

File tree

2 files changed

+24
-9
lines changed

2 files changed

+24
-9
lines changed

lib/rules/jsx-handler-names.js

+2-2
Original file line numberDiff line numberDiff line change
@@ -92,7 +92,7 @@ module.exports = {
9292

9393
const EVENT_HANDLER_REGEX = !eventHandlerPrefix
9494
? null
95-
: new RegExp(`^((props\\.${eventHandlerPropPrefix || ''})|((.*\\.)?${eventHandlerPrefix}))[A-Z].*$`);
95+
: new RegExp(`^((props\\.${eventHandlerPropPrefix || ''})|((.*\\.)?${eventHandlerPrefix}))[0-9]*[A-Z].*$`);
9696
const PROP_EVENT_HANDLER_REGEX = !eventHandlerPropPrefix
9797
? null
9898
: new RegExp(`^(${eventHandlerPropPrefix}[A-Z].*|ref)$`);
@@ -138,7 +138,7 @@ module.exports = {
138138
) {
139139
context.report({
140140
node,
141-
message: `Handler function for ${propKey} prop key must begin with '${eventHandlerPrefix}'`
141+
message: `Handler function for ${propKey} prop key must be a camelCase name beginning with '${eventHandlerPrefix}' only`
142142
});
143143
} else if (
144144
propFnIsNamedCorrectly

tests/lib/rules/jsx-handler-names.js

+22-7
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,9 @@ const ruleTester = new RuleTester({parserOptions});
3030
ruleTester.run('jsx-handler-names', rule, {
3131
valid: [{
3232
code: '<TestComponent onChange={this.handleChange} />'
33+
}, {
34+
// TODO: make this an invalid test
35+
code: '<TestComponent onChange={this.handle123Change} />'
3336
}, {
3437
code: '<TestComponent onChange={this.props.onChange} />'
3538
},
@@ -148,19 +151,31 @@ ruleTester.run('jsx-handler-names', rule, {
148151

149152
invalid: [{
150153
code: '<TestComponent onChange={this.doSomethingOnChange} />',
151-
errors: [{message: 'Handler function for onChange prop key must begin with \'handle\''}]
154+
errors: [{message: 'Handler function for onChange prop key must be a camelCase name beginning with \'handle\' only'}]
152155
}, {
153156
code: '<TestComponent onChange={this.handlerChange} />',
154-
errors: [{message: 'Handler function for onChange prop key must begin with \'handle\''}]
157+
errors: [{message: 'Handler function for onChange prop key must be a camelCase name beginning with \'handle\' only'}]
158+
}, {
159+
code: '<TestComponent onChange={this.handle} />',
160+
errors: [{message: 'Handler function for onChange prop key must be a camelCase name beginning with \'handle\' only'}]
161+
}, {
162+
code: '<TestComponent onChange={this.handle2} />',
163+
errors: [{message: 'Handler function for onChange prop key must be a camelCase name beginning with \'handle\' only'}]
164+
}, {
165+
code: '<TestComponent onChange={this.handl3Change} />',
166+
errors: [{message: 'Handler function for onChange prop key must be a camelCase name beginning with \'handle\' only'}]
167+
}, {
168+
code: '<TestComponent onChange={this.handle4change} />',
169+
errors: [{message: 'Handler function for onChange prop key must be a camelCase name beginning with \'handle\' only'}]
155170
}, {
156171
code: '<TestComponent onChange={takeCareOfChange} />',
157-
errors: [{message: 'Handler function for onChange prop key must begin with \'handle\''}],
172+
errors: [{message: 'Handler function for onChange prop key must be a camelCase name beginning with \'handle\' only'}],
158173
options: [{
159174
checkLocalVariables: true
160175
}]
161176
}, {
162177
code: '<TestComponent onChange={() => this.takeCareOfChange()} />',
163-
errors: [{message: 'Handler function for onChange prop key must begin with \'handle\''}],
178+
errors: [{message: 'Handler function for onChange prop key must be a camelCase name beginning with \'handle\' only'}],
164179
options: [{
165180
checkInlineFunction: true
166181
}]
@@ -202,14 +217,14 @@ ruleTester.run('jsx-handler-names', rule, {
202217
}]
203218
}, {
204219
code: '<TestComponent onChange={this.onChange} />',
205-
errors: [{message: 'Handler function for onChange prop key must begin with \'handle\''}]
220+
errors: [{message: 'Handler function for onChange prop key must be a camelCase name beginning with \'handle\' only'}]
206221
}, {
207222
code: '<TestComponent onChange={props::onChange} />',
208223
parser: parsers.BABEL_ESLINT,
209-
errors: [{message: 'Handler function for onChange prop key must begin with \'handle\''}]
224+
errors: [{message: 'Handler function for onChange prop key must be a camelCase name beginning with \'handle\' only'}]
210225
}, {
211226
code: '<TestComponent onChange={props.foo::onChange} />',
212227
parser: parsers.BABEL_ESLINT,
213-
errors: [{message: 'Handler function for onChange prop key must begin with \'handle\''}]
228+
errors: [{message: 'Handler function for onChange prop key must be a camelCase name beginning with \'handle\' only'}]
214229
}]
215230
});

0 commit comments

Comments
 (0)