-
-
Notifications
You must be signed in to change notification settings - Fork 4.5k
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Merge pull request #2727 from xjamundx/computed-prop-spacing
New: computed-property-spacing (part of #2226)
- Loading branch information
Showing
5 changed files
with
557 additions
and
0 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,91 @@ | ||
# Disallow or enforce spaces inside of computed properties. (computed-property-spacing) | ||
|
||
While formatting preferences are very personal, a number of style guides require | ||
or disallow spaces between computed properties in the following situations: | ||
|
||
```js | ||
// computed properties | ||
var obj = { prop: "value" }; | ||
var a = "prop"; | ||
var x = obj[a]; | ||
|
||
// object literal computed properties (EcmaScript 6) | ||
var a = "prop"; | ||
var obj = { [a]: "value" }; | ||
``` | ||
|
||
## Rule Details | ||
|
||
This rule aims to maintain consistency around the spacing inside of computed properties. | ||
|
||
It either requires or disallows spaces between the brackets and the values inside of them. | ||
Brackets that are separated from the adjacent value by a new line are exempt from this rule. | ||
|
||
### Options | ||
|
||
There are two main options for the rule: | ||
|
||
* `"always"` enforces a space inside of computed properties | ||
* `"never"` disallows spaces inside of computed properties (default) | ||
|
||
Depending on your coding conventions, you can choose either option by specifying it in your configuration: | ||
|
||
```json | ||
"computed-property-spacing": [2, "never"] | ||
``` | ||
|
||
#### never | ||
|
||
When `"never"` is set, the following patterns are considered correct: | ||
|
||
```js | ||
obj[foo] | ||
obj['foo'] | ||
var x = {[b]: a} | ||
obj[foo[bar]] | ||
``` | ||
|
||
The following patterns will warn: | ||
|
||
```js | ||
obj[foo ] | ||
obj[ 'foo'] | ||
var x = {[ b ]: a} | ||
obj[foo[ bar ]] | ||
``` | ||
|
||
#### always | ||
|
||
When `"always"` is used, the following patterns are considered correct: | ||
|
||
```js | ||
obj[ foo ] | ||
obj[ 'foo' ] | ||
var x = {[ b ]: a} | ||
obj[ foo[ bar ] ] | ||
|
||
``` | ||
|
||
The following patterns will warn: | ||
|
||
```js | ||
obj[foo] | ||
var x = {[b]: a} | ||
obj[ foo] | ||
obj[ foo ] | ||
obj['foo' ] | ||
obj[foo[ bar ]] | ||
var x = {[ b]: a} | ||
``` | ||
|
||
## When Not To Use It | ||
|
||
You can turn this rule off if you are not concerned with the consistency of computed properties. | ||
|
||
## Related Rules | ||
|
||
* [comma-spacing](comma-spacing.md) | ||
* [space-in-parens](space-in-parens.md) | ||
* [curly-braces-spacing](curly-braces-spacing.md) | ||
* [space-in-brackets](space-in-brackets.md) (deprecated) | ||
|
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,144 @@ | ||
/** | ||
* @fileoverview Disallows or enforces spaces inside computed properties. | ||
* @author Jamund Ferguson | ||
* @copyright 2015 Jamund Ferguson. All rights reserved. | ||
*/ | ||
"use strict"; | ||
|
||
//------------------------------------------------------------------------------ | ||
// Rule Definition | ||
//------------------------------------------------------------------------------ | ||
|
||
module.exports = function(context) { | ||
var propertyNameMustBeSpaced = context.options[0] === "always"; // default is "never" | ||
|
||
//-------------------------------------------------------------------------- | ||
// Helpers | ||
//-------------------------------------------------------------------------- | ||
|
||
/** | ||
* Determines whether two adjacent tokens are have whitespace between them. | ||
* @param {Object} left - The left token object. | ||
* @param {Object} right - The right token object. | ||
* @returns {boolean} Whether or not there is space between the tokens. | ||
*/ | ||
function isSpaced(left, right) { | ||
return left.range[1] < right.range[0]; | ||
} | ||
|
||
/** | ||
* Determines whether two adjacent tokens are on the same line. | ||
* @param {Object} left - The left token object. | ||
* @param {Object} right - The right token object. | ||
* @returns {boolean} Whether or not the tokens are on the same line. | ||
*/ | ||
function isSameLine(left, right) { | ||
return left.loc.start.line === right.loc.start.line; | ||
} | ||
|
||
/** | ||
* Reports that there shouldn't be a space after the first token | ||
* @param {ASTNode} node - The node to report in the event of an error. | ||
* @param {Token} token - The token to use for the report. | ||
* @returns {void} | ||
*/ | ||
function reportNoBeginningSpace(node, token) { | ||
context.report(node, token.loc.start, | ||
"There should be no space after '" + token.value + "'"); | ||
} | ||
|
||
/** | ||
* Reports that there shouldn't be a space before the last token | ||
* @param {ASTNode} node - The node to report in the event of an error. | ||
* @param {Token} token - The token to use for the report. | ||
* @returns {void} | ||
*/ | ||
function reportNoEndingSpace(node, token) { | ||
context.report(node, token.loc.start, | ||
"There should be no space before '" + token.value + "'"); | ||
} | ||
|
||
/** | ||
* Reports that there should be a space after the first token | ||
* @param {ASTNode} node - The node to report in the event of an error. | ||
* @param {Token} token - The token to use for the report. | ||
* @returns {void} | ||
*/ | ||
function reportRequiredBeginningSpace(node, token) { | ||
context.report(node, token.loc.start, | ||
"A space is required after '" + token.value + "'"); | ||
} | ||
|
||
/** | ||
* Reports that there should be a space before the last token | ||
* @param {ASTNode} node - The node to report in the event of an error. | ||
* @param {Token} token - The token to use for the report. | ||
* @returns {void} | ||
*/ | ||
function reportRequiredEndingSpace(node, token) { | ||
context.report(node, token.loc.start, | ||
"A space is required before '" + token.value + "'"); | ||
} | ||
|
||
/** | ||
* Returns a function that checks the spacing of a node on the property name | ||
* that was passed in. | ||
* @param {String} propertyName The property on the node to check for spacing | ||
* @returns {Function} A function that will check spacing on a node | ||
*/ | ||
function checkSpacing(propertyName) { | ||
return function(node) { | ||
if (!node.computed) { | ||
return; | ||
} | ||
|
||
var property = node[propertyName]; | ||
|
||
var before = context.getTokenBefore(property), | ||
first = context.getFirstToken(property), | ||
last = context.getLastToken(property), | ||
after = context.getTokenAfter(property); | ||
|
||
if (isSameLine(before, first)) { | ||
if (propertyNameMustBeSpaced) { | ||
if (!isSpaced(before, first) && isSameLine(before, first)) { | ||
reportRequiredBeginningSpace(node, before); | ||
} | ||
} else { | ||
if (isSpaced(before, first)) { | ||
reportNoBeginningSpace(node, before); | ||
} | ||
} | ||
} | ||
|
||
if (isSameLine(last, after)) { | ||
if (propertyNameMustBeSpaced) { | ||
if (!isSpaced(last, after) && isSameLine(last, after)) { | ||
reportRequiredEndingSpace(node, after); | ||
} | ||
} else { | ||
if (isSpaced(last, after)) { | ||
reportNoEndingSpace(node, after); | ||
} | ||
} | ||
} | ||
}; | ||
} | ||
|
||
|
||
//-------------------------------------------------------------------------- | ||
// Public | ||
//-------------------------------------------------------------------------- | ||
|
||
return { | ||
Property: checkSpacing("key"), | ||
MemberExpression: checkSpacing("property") | ||
}; | ||
|
||
}; | ||
|
||
module.exports.schema = [ | ||
{ | ||
"enum": ["always", "never"] | ||
} | ||
]; |
Oops, something went wrong.