Skip to content

Commit ba4bed9

Browse files
Add closure-actions rule
1 parent c2d9b18 commit ba4bed9

File tree

3 files changed

+65
-0
lines changed

3 files changed

+65
-0
lines changed

config/recommended.js

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -83,6 +83,7 @@ module.exports = {
8383

8484
// Ember Suave and Netguru Rules
8585
'ship-shape/avoid-leaking-state-in-components': 'error',
86+
'ship-shape/closure-actions': 'error',
8687
'ship-shape/no-direct-property-access': 'error',
8788
'ship-shape/no-empty-attrs': 'error',
8889
'ship-shape/no-observers': 'error',

lib/rules/closure-actions.js

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
'use strict';
2+
3+
var utils = require('../../lib/utils/utils');
4+
5+
//------------------------------------------------------------------------------
6+
// Components - Closure actions
7+
//------------------------------------------------------------------------------
8+
9+
module.exports = function(context) {
10+
11+
var message = 'Use closure actions, unless you need bubbling';
12+
13+
var report = function(node) {
14+
context.report(node, message);
15+
};
16+
17+
return {
18+
MemberExpression: function(node) {
19+
var isSendAction = utils.isThisExpression(node.object) &&
20+
utils.isIdentifier(node.property) &&
21+
node.property.name === 'sendAction';
22+
23+
if (isSendAction) {
24+
report(node);
25+
}
26+
}
27+
};
28+
29+
};

tests/lib/rules/closure-actions.js

Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,35 @@
1+
'use strict';
2+
3+
// ------------------------------------------------------------------------------
4+
// Requirements
5+
// ------------------------------------------------------------------------------
6+
7+
var rule = require('../../../lib/rules/closure-actions');
8+
var RuleTester = require('eslint').RuleTester;
9+
10+
// ------------------------------------------------------------------------------
11+
// Tests
12+
// ------------------------------------------------------------------------------
13+
14+
var eslintTester = new RuleTester();
15+
eslintTester.run('closure-actions', rule, {
16+
valid: [
17+
{
18+
code: 'export default Component.extend();',
19+
parserOptions: {ecmaVersion: 6, sourceType: "module"},
20+
},
21+
{
22+
code: 'export default Component.extend({actions: {pushLever() {this.attr.boom();}}});',
23+
parserOptions: {ecmaVersion: 6, sourceType: "module"},
24+
}
25+
],
26+
invalid: [
27+
{
28+
code: 'export default Component.extend({actions: {pushLever() {this.sendAction("detonate");}}});',
29+
parserOptions: {ecmaVersion: 6, sourceType: "module"},
30+
errors: [{
31+
message: 'Use closure actions, unless you need bubbling',
32+
}],
33+
}
34+
]
35+
});

0 commit comments

Comments
 (0)