-
Notifications
You must be signed in to change notification settings - Fork 8
/
no-event-shorthand.js
90 lines (83 loc) · 1.61 KB
/
no-event-shorthand.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
'use strict';
const utils = require( '../utils.js' );
const ajaxEvents = [
'ajaxComplete',
'ajaxError',
'ajaxSend',
'ajaxStart',
'ajaxStop',
'ajaxSuccess'
];
const rule = utils.createCollectionMethodRule(
[
// Browser
'error',
// Can't disallow 'load' as it conflicts with Ajax load.
// Use no-load-shorthand rule instead.
// TODO: Share the logic of no-load-shorthand with this rule.
'resize',
'scroll',
'unload',
// Form
'blur',
'change',
'focus',
'focusin',
'focusout',
'select',
'submit',
// Keyboard
'keydown',
'keypress',
'keyup',
// Mouse
'click',
'contextmenu',
'dblclick',
'hover',
'mousedown',
'mouseenter',
'mouseleave',
'mousemove',
'mouseout',
'mouseover',
'mouseup'
].concat( ajaxEvents ),
( node ) => node === true ?
'Use the `allowAjaxEvents` option to allow `ajax*` methods. Prefer `.on` or `.trigger`' :
`Prefer .on or .trigger to .${ node.callee.property.name }`,
{
fixable: 'code',
fix: utils.eventShorthandFixer
}
);
rule.meta.schema = [
{
type: 'object',
properties: {
allowAjaxEvents: {
type: 'boolean'
}
},
additionalProperties: false
}
];
const parentCreate = rule.create;
rule.create = ( context ) => {
const rules = parentCreate( context );
return {
'CallExpression:exit': ( node ) => {
if (
node.callee.type === 'MemberExpression' &&
context.options[ 0 ] && context.options[ 0 ].allowAjaxEvents
) {
const name = node.callee.property.name;
if ( ajaxEvents.includes( name ) ) {
return;
}
}
return rules[ 'CallExpression:exit' ]( node );
}
};
};
module.exports = rule;