Skip to content
This repository was archived by the owner on Mar 23, 2024. It is now read-only.

Commit b8969d4

Browse files
seanpdoylemarkelog
authored andcommitted
New rule: requireEnhancedObjectLiterals
When `{ requireEnhancedObjectLiterals: true }`, assert that all object declarations use the new [ES6 enhanced object literals][babel]. [babel]: http://babeljs.io/docs/learn-es2015/#enhanced-object-literals Closes gh-1985
1 parent bc6f960 commit b8969d4

3 files changed

Lines changed: 154 additions & 1 deletion

File tree

lib/config/configuration.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -949,7 +949,7 @@ Configuration.prototype.registerDefaultRules = function() {
949949
this.registerRule(require('../rules/disallow-identical-destructuring-names'));
950950
this.registerRule(require('../rules/require-spaces-in-generator'));
951951
this.registerRule(require('../rules/require-object-destructuring'));
952-
952+
this.registerRule(require('../rules/require-enhanced-object-literals'));
953953
/* ES6 only (end) */
954954

955955
this.registerRule(require('../rules/require-curly-braces'));
Lines changed: 79 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,79 @@
1+
/**
2+
* Requires declaring objects via ES6 enhanced object literals
3+
*
4+
* Type: `Boolean`
5+
*
6+
* Values: true
7+
*
8+
* Version: `ES6`
9+
*
10+
* #### Example
11+
*
12+
* ```js
13+
* "requireEnhancedObjectLiterals": true
14+
* ```
15+
*
16+
* ##### Valid
17+
*
18+
* ```js
19+
* var bar = true;
20+
* var obj = {
21+
* foo() { },
22+
* bar
23+
* };
24+
* ```
25+
*
26+
* ##### Invalid
27+
*
28+
* ```js
29+
* var bar = true;
30+
* var obj = {
31+
* foo: function() { },
32+
* bar: bar
33+
* };
34+
* ```
35+
*/
36+
37+
var assert = require('assert');
38+
39+
module.exports = function() { };
40+
41+
module.exports.prototype = {
42+
configure: function(option) {
43+
assert(option === true, this.getOptionName() + ' requires a true value');
44+
},
45+
46+
getOptionName: function() {
47+
return 'requireEnhancedObjectLiterals';
48+
},
49+
50+
check: function(file, errors) {
51+
file.iterateNodesByType('Property', function(node) {
52+
// node.key.name is used when the property key is an unquoted identifier
53+
// node.key.value is used when the property key is a quoted string
54+
var propertyName = node.key.name || node.key.value;
55+
var valueName = node.value.name;
56+
var shorthand = node.shorthand;
57+
58+
// check for non-shorthand properties
59+
if (propertyName && propertyName === valueName && !shorthand) {
60+
errors.add(
61+
'Property assignment should use enhanced object literal function.\n' +
62+
' `{ propName: propName }` is not allowed.',
63+
node.loc.start
64+
);
65+
}
66+
67+
// check for non-method function properties
68+
var valueType = node.value.type;
69+
var valueIsMethod = node.method;
70+
if (valueType === 'FunctionExpression' && !valueIsMethod) {
71+
errors.add(
72+
'Property assignment should use enhanced object literal function.\n' +
73+
' `{ funcName: function() {} }` is not allowed.',
74+
node.loc.start
75+
);
76+
}
77+
});
78+
}
79+
};
Lines changed: 74 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,74 @@
1+
var Checker = require('../../../lib/checker');
2+
var expect = require('chai').expect;
3+
4+
describe('rules/require-enhanced-object-literals', function() {
5+
describe('when { requireEnhancedObjectLiterals: true }', function() {
6+
it('disallows declaring functions as values', function() {
7+
var checker = buildChecker({ requireEnhancedObjectLiterals: true });
8+
9+
expect(checker.checkString('var obj = { foo: function() { } }')).
10+
to.have.one.validation.error.from('requireEnhancedObjectLiterals');
11+
});
12+
13+
it('disallows declaring values keyed by the variable name', function() {
14+
var checker = buildChecker({ requireEnhancedObjectLiterals: true });
15+
var code = 'var foo;\n' +
16+
'var obj = { foo: foo };';
17+
18+
expect(checker.checkString(code)).
19+
to.have.one.validation.error.from('requireEnhancedObjectLiterals');
20+
});
21+
22+
it('allows declaring functions as values', function() {
23+
var checker = buildChecker({ requireEnhancedObjectLiterals: true });
24+
25+
expect(checker.checkString('var obj = { foo() { } }')).to.have.no.errors();
26+
});
27+
28+
it('allows declaring values keyed by the variable name', function() {
29+
var checker = buildChecker({ requireEnhancedObjectLiterals: true });
30+
var code = 'var foo;\n' +
31+
'var obj = { foo };';
32+
33+
expect(checker.checkString(code)).to.have.no.errors();
34+
});
35+
});
36+
37+
describe('when { requireEnhancedObjectLiterals: false }', function() {
38+
it('allows declaring functions as values', function() {
39+
var checker = buildChecker({ requireEnhancedObjectLiterals: false });
40+
41+
expect(checker.checkString('var obj = { foo: function() { } }')).to.no.errors();
42+
});
43+
44+
it('allows declaring values keyed by the variable name', function() {
45+
var checker = buildChecker({ requireEnhancedObjectLiterals: false });
46+
var code = 'var foo;\n' +
47+
'var obj = { foo: foo };';
48+
49+
expect(checker.checkString(code)).to.have.no.errors();
50+
});
51+
52+
it('allows declaring functions as values', function() {
53+
var checker = buildChecker({ requireEnhancedObjectLiterals: false });
54+
55+
expect(checker.checkString('var obj = { foo() { } }')).to.have.no.errors();
56+
});
57+
58+
it('allows declaring values keyed by the variable name', function() {
59+
var checker = buildChecker({ requireEnhancedObjectLiterals: false });
60+
var code = 'var foo;\n' +
61+
'var obj = { foo };';
62+
63+
expect(checker.checkString(code)).to.have.no.errors();
64+
});
65+
});
66+
67+
function buildChecker(rules) {
68+
var checker = new Checker();
69+
checker.registerDefaultRules();
70+
checker.configure(rules);
71+
72+
return checker;
73+
}
74+
});

0 commit comments

Comments
 (0)