Skip to content

Commit edb98f6

Browse files
alexlafrosciabrzpegasus
authored andcommitted
Disallowing accessing Ember properties directly
Make referencing Ember and Ember Data properties directly illegal. **Bad:** ```js import Ember from 'ember'; export default Ember.Component.extend({ ... }); ``` **Good:** ```js import Ember from 'ember'; const { Component } = Ember; export default Component.extend({ ... }); ``` Closes #31
1 parent b7dbf1c commit edb98f6

File tree

8 files changed

+59
-1
lines changed

8 files changed

+59
-1
lines changed

lib/jscsrc.json

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@
1212
"disallowCoreView": true,
1313
"disallowEmberTryCatch": true,
1414
"disallowEmberRequired": true,
15+
"disallowDirectPropertyAccess": ["Ember", "DS"],
1516
"disallowAtEachLeafNode": true,
1617
"disallowArrayComputed": true,
1718
"disallowReduceComputed": true,
Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,39 @@
1+
var assert = require('assert');
2+
3+
function DisallowDirectPropertyAccess() { }
4+
5+
DisallowDirectPropertyAccess.prototype = {
6+
configure: function(values) {
7+
assert(
8+
Array.isArray(values),
9+
this.getOptionName() + ' option requires an array'
10+
);
11+
this._invalidNames = {};
12+
for (var i = 0, l = values.length; i < l; i++) {
13+
this._invalidNames[values[i]] = true;
14+
}
15+
},
16+
17+
getOptionName: function() {
18+
return 'disallowDirectPropertyAccess';
19+
},
20+
21+
check: function(file, errors) {
22+
var invalidObjectNames = this._invalidNames;
23+
file.iterateNodesByType('MemberExpression', function(node) {
24+
if (node.parentNode.type === 'AssignmentExpression') {
25+
// Avoid throwing the error if we're assigning to a property
26+
return;
27+
}
28+
var objectName = node.object.name;
29+
if (Object.prototype.hasOwnProperty.call(invalidObjectNames, objectName)) {
30+
var propertyName = node.property.name;
31+
errors.add(
32+
'Avoid accessing ' + objectName + '.' + propertyName + ' directly',
33+
node.loc.start);
34+
}
35+
});
36+
}
37+
};
38+
39+
module.exports = DisallowDirectPropertyAccess;
Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
import DS from 'ember-data';
2+
3+
export default DS.Model.extend({});
Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
import Ember from 'ember';
2+
3+
export default Ember.Component.extend({});
Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
Ember.MODEL_FACTORY_INJECTIONS = true;
2+
DS.SOME_PROPERTY = true;
Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
import DS from 'ember-data';
2+
3+
const { Model } = DS;
4+
5+
export default Model.extend({});
Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
import Ember from 'ember';
2+
3+
const { Component } = Ember;
4+
5+
export default Component.extend({});

tests/fixtures/rules/require-spread/good/super.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
let Blah = Ember.Object.extend({
1+
let Blah = Foo.extend({
22
init() {
33
this._super(...arguments); // normal usage
44

0 commit comments

Comments
 (0)