forked from eslint/eslint
-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
New: Add no-whitespace-before-property rule (fixes eslint#1086)
- Loading branch information
1 parent
8974fd6
commit fb34aa3
Showing
5 changed files
with
359 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,70 @@ | ||
# Disallow whitespace before properties (no-whitespace-before-property) | ||
|
||
JavaScript allows whitespace between objects and their properties. However, inconsistent spacing can make code harder to read and can lead to errors. | ||
|
||
```js | ||
foo. bar | ||
|
||
foo . bar | ||
|
||
foo [bar] | ||
``` | ||
|
||
## Rule Details | ||
|
||
This rule disallows whitespace around dot or brackets before properties of objects if they are on the same line. It does not alert for whitespace when the object and property are on separate lines, as it is common to add newlines to longer chains of properties to improve readability: | ||
|
||
```js | ||
foo | ||
.bar() | ||
.baz() | ||
.qux() | ||
``` | ||
|
||
The following patterns are considered problems when this rule is turned on: | ||
|
||
```js | ||
/*eslint no-whitespace-before-property: 2*/ | ||
|
||
foo [bar] | ||
|
||
foo. bar | ||
|
||
foo .bar | ||
|
||
foo. bar. baz | ||
|
||
foo. bar() | ||
.baz() | ||
|
||
foo | ||
.bar(). baz() | ||
``` | ||
|
||
And the following patterns are not considered problems: | ||
|
||
```js | ||
/*eslint no-whitespace-before-property: 2*/ | ||
|
||
foo.bar | ||
|
||
foo[bar] | ||
|
||
foo.bar.baz | ||
|
||
foo | ||
.bar().baz() | ||
|
||
foo | ||
.bar() | ||
.baz() | ||
|
||
foo. | ||
bar(). | ||
baz() | ||
``` | ||
|
||
## When Not To Use It | ||
|
||
Turn this rule off if you do not care about allowing whitespace around dot or brackets before properties of objects if they are on the same line. | ||
|
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,43 @@ | ||
/** | ||
* @fileoverview Rule to disallow whitespace before properties | ||
* @author Kai Cataldo | ||
* @copyright 2015 Kai Cataldo. All rights reserved. | ||
* See LICENSE file in root directory for full license. | ||
*/ | ||
"use strict"; | ||
|
||
var astUtils = require("../ast-utils"); | ||
|
||
//------------------------------------------------------------------------------ | ||
// Rule Definition | ||
//------------------------------------------------------------------------------ | ||
|
||
module.exports = function(context) { | ||
var sourceCode = context.getSourceCode(); | ||
|
||
//-------------------------------------------------------------------------- | ||
// Public | ||
//-------------------------------------------------------------------------- | ||
|
||
return { | ||
MemberExpression: function(node) { | ||
var obj = node.object; | ||
var prop = node.property; | ||
|
||
if (astUtils.isTokenOnSameLine(obj, prop)) { | ||
if (sourceCode.isSpaceBetweenTokens(obj, prop)) { | ||
context.report({ | ||
node: node, | ||
message: "Unexpected whitespace before property \"{{ propName }}\".", | ||
data: { | ||
propName: prop.name | ||
} | ||
}); | ||
} | ||
} | ||
} | ||
}; | ||
}; | ||
|
||
module.exports.schema = []; | ||
|
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,244 @@ | ||
/** | ||
* @fileoverview Rule to disallow whitespace before properties | ||
* @author Kai Cataldo | ||
* @copyright 2015 Kai Cataldo. All rights reserved. | ||
* See LICENSE file in root directory for full license. | ||
*/ | ||
"use strict"; | ||
|
||
//------------------------------------------------------------------------------ | ||
// Requirements | ||
//------------------------------------------------------------------------------ | ||
|
||
var rule = require("../../../lib/rules/no-whitespace-before-property"), | ||
RuleTester = require("../../../lib/testers/rule-tester"); | ||
|
||
//------------------------------------------------------------------------------ | ||
// Tests | ||
//------------------------------------------------------------------------------ | ||
|
||
var ruleTester = new RuleTester(); | ||
|
||
ruleTester.run("no-whitespace-before-property", rule, { | ||
|
||
valid: [ | ||
"foo.bar", | ||
"foo.bar()", | ||
"foo[bar]", | ||
"foo\n.bar", | ||
"foo.\nbar", | ||
"foo\n.bar()", | ||
"foo.\nbar()", | ||
"foo\n[bar]", | ||
"foo.\n bar", | ||
"foo\n. bar", | ||
"foo.\n bar()", | ||
"foo\n. bar()", | ||
"foo\n [bar]", | ||
"foo.\n\tbar", | ||
"foo\n.\tbar", | ||
"foo.\n\tbar()", | ||
"foo\n.\tbar()", | ||
"foo\n\t[bar]", | ||
"foo.bar.baz", | ||
"foo\n.bar\n.baz", | ||
"foo.\nbar.\nbaz", | ||
"foo.bar().baz()", | ||
"foo\n.bar()\n.baz()", | ||
"foo.\nbar().\nbaz()", | ||
"foo\n.bar\n[baz]", | ||
"foo\n .bar\n .baz", | ||
"foo.\n bar.\n baz", | ||
"foo\n .bar()\n .baz()", | ||
"foo.\n bar().\n baz()", | ||
"foo\n .bar\n [baz]", | ||
"foo\n\t.bar\n\t.baz", | ||
"foo.\n\tbar.\n\tbaz", | ||
"foo\n\t.bar()\n\t.baz()", | ||
"foo.\n\tbar().\n\tbaz()", | ||
"foo\n\t.bar\n\t[baz]" | ||
], | ||
|
||
invalid: [ | ||
{ | ||
code: "foo. bar", | ||
errors: ["Unexpected whitespace before property \"bar\"."] | ||
}, | ||
{ | ||
code: "foo .bar", | ||
errors: ["Unexpected whitespace before property \"bar\"."] | ||
}, | ||
{ | ||
code: "foo [bar]", | ||
errors: ["Unexpected whitespace before property \"bar\"."] | ||
}, | ||
{ | ||
code: "foo. bar. baz", | ||
errors: ["Unexpected whitespace before property \"baz\".", "Unexpected whitespace before property \"bar\"."] | ||
}, | ||
{ | ||
code: "foo .bar. baz", | ||
errors: ["Unexpected whitespace before property \"baz\".", "Unexpected whitespace before property \"bar\"."] | ||
}, | ||
{ | ||
code: "foo [bar] [baz]", | ||
errors: ["Unexpected whitespace before property \"baz\".", "Unexpected whitespace before property \"bar\"."] | ||
}, | ||
{ | ||
code: "foo [bar][baz]", | ||
errors: ["Unexpected whitespace before property \"bar\"."] | ||
}, | ||
{ | ||
code: "foo[bar] [baz]", | ||
errors: ["Unexpected whitespace before property \"baz\"."] | ||
}, | ||
{ | ||
code: "foo.bar [baz]", | ||
errors: ["Unexpected whitespace before property \"baz\"."] | ||
}, | ||
{ | ||
code: "foo. bar[baz]", | ||
errors: ["Unexpected whitespace before property \"bar\"."] | ||
}, | ||
{ | ||
code: "foo[bar]. baz", | ||
errors: ["Unexpected whitespace before property \"baz\"."] | ||
}, | ||
|
||
// tabs | ||
{ | ||
code: "foo\t.bar", | ||
errors: ["Unexpected whitespace before property \"bar\"."] | ||
}, | ||
{ | ||
code: "foo.\tbar", | ||
errors: ["Unexpected whitespace before property \"bar\"."] | ||
}, | ||
{ | ||
code: "foo\t.bar()", | ||
errors: ["Unexpected whitespace before property \"bar\"."] | ||
}, | ||
{ | ||
code: "foo.\tbar()", | ||
errors: ["Unexpected whitespace before property \"bar\"."] | ||
}, | ||
{ | ||
code: "foo\t[bar]", | ||
errors: ["Unexpected whitespace before property \"bar\"."] | ||
}, | ||
{ | ||
code: "foo.\tbar.\tbaz", | ||
errors: ["Unexpected whitespace before property \"baz\".", "Unexpected whitespace before property \"bar\"."] | ||
}, | ||
{ | ||
code: "foo\t.bar.\tbaz", | ||
errors: ["Unexpected whitespace before property \"baz\".", "Unexpected whitespace before property \"bar\"."] | ||
}, | ||
{ | ||
code: "foo.\tbar().\tbaz()", | ||
errors: ["Unexpected whitespace before property \"baz\".", "Unexpected whitespace before property \"bar\"."] | ||
}, | ||
{ | ||
code: "foo\t.bar().\tbaz()", | ||
errors: ["Unexpected whitespace before property \"baz\".", "Unexpected whitespace before property \"bar\"."] | ||
}, | ||
{ | ||
code: "foo\t[bar]\t[baz]", | ||
errors: ["Unexpected whitespace before property \"baz\".", "Unexpected whitespace before property \"bar\"."] | ||
}, | ||
{ | ||
code: "foo\t[bar][baz]", | ||
errors: ["Unexpected whitespace before property \"bar\"."] | ||
}, | ||
{ | ||
code: "foo[bar]\t[baz]", | ||
errors: ["Unexpected whitespace before property \"baz\"."] | ||
}, | ||
{ | ||
code: "foo.bar\t[baz]", | ||
errors: ["Unexpected whitespace before property \"baz\"."] | ||
}, | ||
{ | ||
code: "foo.\tbar[baz]", | ||
errors: ["Unexpected whitespace before property \"bar\"."] | ||
}, | ||
{ | ||
code: "foo[bar].\tbaz", | ||
errors: ["Unexpected whitespace before property \"baz\"."] | ||
}, | ||
|
||
// newlines | ||
{ | ||
code: "foo [bar]\n .baz", | ||
errors: ["Unexpected whitespace before property \"bar\"."] | ||
}, | ||
{ | ||
code: "foo. bar\n .baz", | ||
errors: ["Unexpected whitespace before property \"bar\"."] | ||
}, | ||
{ | ||
code: "foo .bar\n.baz", | ||
errors: ["Unexpected whitespace before property \"bar\"."] | ||
}, | ||
{ | ||
code: "foo.\n bar. baz", | ||
errors: ["Unexpected whitespace before property \"baz\"."] | ||
}, | ||
{ | ||
code: "foo.\nbar . baz", | ||
errors: ["Unexpected whitespace before property \"baz\"."] | ||
}, | ||
{ | ||
code: "foo. bar()\n .baz()", | ||
errors: ["Unexpected whitespace before property \"bar\"."] | ||
}, | ||
{ | ||
code: "foo .bar()\n.baz()", | ||
errors: ["Unexpected whitespace before property \"bar\"."] | ||
}, | ||
{ | ||
code: "foo.\n bar(). baz()", | ||
errors: ["Unexpected whitespace before property \"baz\"."] | ||
}, | ||
{ | ||
code: "foo.\nbar() . baz()", | ||
errors: ["Unexpected whitespace before property \"baz\"."] | ||
}, | ||
{ | ||
code: "foo\t[bar]\n\t.baz", | ||
errors: ["Unexpected whitespace before property \"bar\"."] | ||
}, | ||
{ | ||
code: "foo.\tbar\n\t.baz", | ||
errors: ["Unexpected whitespace before property \"bar\"."] | ||
}, | ||
{ | ||
code: "foo\t.bar\n.baz", | ||
errors: ["Unexpected whitespace before property \"bar\"."] | ||
}, | ||
{ | ||
code: "foo.\n\tbar.\tbaz", | ||
errors: ["Unexpected whitespace before property \"baz\"."] | ||
}, | ||
{ | ||
code: "foo.\nbar\t.\tbaz", | ||
errors: ["Unexpected whitespace before property \"baz\"."] | ||
}, | ||
{ | ||
code: "foo.\tbar()\n\t.baz()", | ||
errors: ["Unexpected whitespace before property \"bar\"."] | ||
}, | ||
{ | ||
code: "foo\t.bar()\n.baz()", | ||
errors: ["Unexpected whitespace before property \"bar\"."] | ||
}, | ||
{ | ||
code: "foo.\n\tbar().\tbaz()", | ||
errors: ["Unexpected whitespace before property \"baz\"."] | ||
}, | ||
{ | ||
code: "foo.\nbar()\t.\tbaz()", | ||
errors: ["Unexpected whitespace before property \"baz\"."] | ||
} | ||
] | ||
}); |