eslint 0.22.0 → 0.24.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +20 -20
- package/README.md +111 -95
- package/bin/eslint.js +41 -41
- package/conf/environments.js +87 -81
- package/conf/eslint.json +186 -179
- package/lib/api.js +13 -12
- package/lib/cli-engine.js +441 -451
- package/lib/cli.js +196 -196
- package/lib/config-initializer.js +145 -145
- package/lib/config-validator.js +110 -110
- package/lib/config.js +428 -416
- package/lib/eslint.js +1072 -1073
- package/lib/file-finder.js +167 -167
- package/lib/formatters/checkstyle.js +68 -68
- package/lib/formatters/compact.js +53 -53
- package/lib/formatters/jslint-xml.js +40 -40
- package/lib/formatters/junit.js +63 -63
- package/lib/formatters/stylish.js +90 -90
- package/lib/formatters/tap.js +86 -86
- package/lib/ignored-paths.js +137 -137
- package/lib/load-rules.js +39 -39
- package/lib/options.js +132 -126
- package/lib/rule-context.js +107 -107
- package/lib/rules/accessor-pairs.js +65 -65
- package/lib/rules/array-bracket-spacing.js +180 -0
- package/lib/rules/block-scoped-var.js +339 -320
- package/lib/rules/brace-style.js +228 -228
- package/lib/rules/camelcase.js +111 -111
- package/lib/rules/comma-dangle.js +67 -64
- package/lib/rules/comma-spacing.js +191 -191
- package/lib/rules/comma-style.js +195 -195
- package/lib/rules/complexity.js +94 -94
- package/lib/rules/computed-property-spacing.js +144 -0
- package/lib/rules/consistent-return.js +75 -75
- package/lib/rules/consistent-this.js +119 -119
- package/lib/rules/constructor-super.js +108 -0
- package/lib/rules/curly.js +109 -109
- package/lib/rules/default-case.js +66 -66
- package/lib/rules/dot-location.js +63 -63
- package/lib/rules/dot-notation.js +119 -119
- package/lib/rules/eol-last.js +38 -38
- package/lib/rules/eqeqeq.js +96 -96
- package/lib/rules/func-names.js +45 -45
- package/lib/rules/func-style.js +49 -49
- package/lib/rules/generator-star-spacing.js +104 -87
- package/lib/rules/generator-star.js +76 -76
- package/lib/rules/global-strict.js +49 -49
- package/lib/rules/guard-for-in.js +32 -32
- package/lib/rules/handle-callback-err.js +81 -124
- package/lib/rules/indent.js +486 -486
- package/lib/rules/key-spacing.js +325 -325
- package/lib/rules/linebreak-style.js +44 -44
- package/lib/rules/lines-around-comment.js +228 -160
- package/lib/rules/max-depth.js +89 -89
- package/lib/rules/max-len.js +76 -76
- package/lib/rules/max-nested-callbacks.js +73 -73
- package/lib/rules/max-params.js +45 -45
- package/lib/rules/max-statements.js +61 -61
- package/lib/rules/new-cap.js +224 -224
- package/lib/rules/new-parens.js +29 -29
- package/lib/rules/newline-after-var.js +127 -127
- package/lib/rules/no-alert.js +153 -153
- package/lib/rules/no-array-constructor.js +31 -31
- package/lib/rules/no-bitwise.js +57 -57
- package/lib/rules/no-caller.js +29 -29
- package/lib/rules/no-catch-shadow.js +52 -52
- package/lib/rules/no-comma-dangle.js +45 -45
- package/lib/rules/no-cond-assign.js +123 -123
- package/lib/rules/no-console.js +27 -27
- package/lib/rules/no-constant-condition.js +73 -73
- package/lib/rules/no-continue.js +23 -23
- package/lib/rules/no-control-regex.js +58 -58
- package/lib/rules/no-debugger.js +22 -22
- package/lib/rules/no-delete-var.js +25 -25
- package/lib/rules/no-div-regex.js +27 -27
- package/lib/rules/no-dupe-args.js +89 -85
- package/lib/rules/no-dupe-keys.js +43 -43
- package/lib/rules/no-duplicate-case.js +67 -67
- package/lib/rules/no-else-return.js +125 -125
- package/lib/rules/no-empty-character-class.js +43 -43
- package/lib/rules/no-empty-class.js +45 -45
- package/lib/rules/no-empty-label.js +27 -27
- package/lib/rules/no-empty.js +49 -49
- package/lib/rules/no-eq-null.js +29 -29
- package/lib/rules/no-eval.js +26 -26
- package/lib/rules/no-ex-assign.js +42 -42
- package/lib/rules/no-extend-native.js +103 -103
- package/lib/rules/no-extra-bind.js +81 -81
- package/lib/rules/no-extra-boolean-cast.js +71 -71
- package/lib/rules/no-extra-parens.js +368 -355
- package/lib/rules/no-extra-semi.js +70 -23
- package/lib/rules/no-extra-strict.js +86 -86
- package/lib/rules/no-fallthrough.js +97 -97
- package/lib/rules/no-floating-decimal.js +30 -30
- package/lib/rules/no-func-assign.js +83 -83
- package/lib/rules/no-implied-eval.js +76 -76
- package/lib/rules/no-inline-comments.js +49 -49
- package/lib/rules/no-inner-declarations.js +78 -78
- package/lib/rules/no-invalid-regexp.js +53 -53
- package/lib/rules/no-irregular-whitespace.js +135 -135
- package/lib/rules/no-iterator.js +28 -28
- package/lib/rules/no-label-var.js +64 -64
- package/lib/rules/no-labels.js +44 -44
- package/lib/rules/no-lone-blocks.js +106 -27
- package/lib/rules/no-lonely-if.js +30 -30
- package/lib/rules/no-loop-func.js +58 -58
- package/lib/rules/no-mixed-requires.js +165 -165
- package/lib/rules/no-mixed-spaces-and-tabs.js +74 -74
- package/lib/rules/no-multi-spaces.js +119 -119
- package/lib/rules/no-multi-str.js +43 -43
- package/lib/rules/no-multiple-empty-lines.js +98 -98
- package/lib/rules/no-native-reassign.js +62 -62
- package/lib/rules/no-negated-in-lhs.js +25 -25
- package/lib/rules/no-nested-ternary.js +24 -24
- package/lib/rules/no-new-func.js +25 -25
- package/lib/rules/no-new-object.js +25 -25
- package/lib/rules/no-new-require.js +25 -25
- package/lib/rules/no-new-wrappers.js +26 -26
- package/lib/rules/no-new.js +27 -27
- package/lib/rules/no-obj-calls.js +28 -28
- package/lib/rules/no-octal-escape.js +39 -39
- package/lib/rules/no-octal.js +25 -25
- package/lib/rules/no-param-reassign.js +87 -87
- package/lib/rules/no-path-concat.js +39 -39
- package/lib/rules/no-plusplus.js +24 -24
- package/lib/rules/no-process-env.js +30 -30
- package/lib/rules/no-process-exit.js +33 -33
- package/lib/rules/no-proto.js +28 -28
- package/lib/rules/no-redeclare.js +68 -68
- package/lib/rules/no-regex-spaces.js +35 -35
- package/lib/rules/no-reserved-keys.js +56 -56
- package/lib/rules/no-restricted-modules.js +85 -85
- package/lib/rules/no-return-assign.js +53 -24
- package/lib/rules/no-script-url.js +34 -34
- package/lib/rules/no-self-compare.js +29 -29
- package/lib/rules/no-sequences.js +94 -94
- package/lib/rules/no-shadow-restricted-names.js +51 -51
- package/lib/rules/no-shadow.js +181 -136
- package/lib/rules/no-space-before-semi.js +98 -98
- package/lib/rules/no-spaced-func.js +37 -37
- package/lib/rules/no-sparse-arrays.js +33 -33
- package/lib/rules/no-sync.js +30 -30
- package/lib/rules/no-ternary.js +24 -24
- package/lib/rules/no-this-before-super.js +144 -0
- package/lib/rules/no-throw-literal.js +33 -33
- package/lib/rules/no-trailing-spaces.js +74 -63
- package/lib/rules/no-undef-init.js +28 -28
- package/lib/rules/no-undef.js +92 -92
- package/lib/rules/no-undefined.js +27 -27
- package/lib/rules/no-underscore-dangle.js +73 -73
- package/lib/rules/no-unexpected-multiline.js +58 -0
- package/lib/rules/no-unneeded-ternary.js +48 -48
- package/lib/rules/no-unreachable.js +98 -98
- package/lib/rules/no-unused-expressions.js +76 -76
- package/lib/rules/no-unused-vars.js +252 -250
- package/lib/rules/no-use-before-define.js +105 -105
- package/lib/rules/no-var.js +26 -26
- package/lib/rules/no-void.js +28 -28
- package/lib/rules/no-warning-comments.js +102 -102
- package/lib/rules/no-with.js +22 -22
- package/lib/rules/no-wrap-func.js +65 -65
- package/lib/rules/object-curly-spacing.js +231 -206
- package/lib/rules/object-shorthand.js +74 -73
- package/lib/rules/one-var.js +311 -304
- package/lib/rules/operator-assignment.js +118 -118
- package/lib/rules/operator-linebreak.js +114 -114
- package/lib/rules/padded-blocks.js +98 -98
- package/lib/rules/prefer-const.js +91 -0
- package/lib/rules/quote-props.js +72 -72
- package/lib/rules/quotes.js +92 -92
- package/lib/rules/radix.js +41 -41
- package/lib/rules/semi-spacing.js +167 -167
- package/lib/rules/semi.js +136 -136
- package/lib/rules/sort-vars.js +49 -49
- package/lib/rules/space-after-function-name.js +49 -49
- package/lib/rules/space-after-keywords.js +82 -82
- package/lib/rules/space-before-blocks.js +91 -91
- package/lib/rules/space-before-function-paren.js +139 -139
- package/lib/rules/space-before-function-parentheses.js +139 -139
- package/lib/rules/space-in-brackets.js +305 -305
- package/lib/rules/space-in-parens.js +281 -281
- package/lib/rules/space-infix-ops.js +106 -106
- package/lib/rules/space-return-throw-case.js +38 -38
- package/lib/rules/space-unary-ops.js +124 -133
- package/lib/rules/spaced-comment.js +143 -0
- package/lib/rules/spaced-line-comment.js +89 -89
- package/lib/rules/strict.js +242 -242
- package/lib/rules/use-isnan.js +26 -26
- package/lib/rules/valid-jsdoc.js +215 -215
- package/lib/rules/valid-typeof.js +42 -42
- package/lib/rules/vars-on-top.js +115 -115
- package/lib/rules/wrap-iife.js +48 -48
- package/lib/rules/wrap-regex.js +38 -38
- package/lib/rules/yoda.js +242 -225
- package/lib/rules.js +88 -88
- package/lib/timing.js +109 -109
- package/lib/token-store.js +201 -201
- package/lib/util/traverse.js +105 -105
- package/lib/util.js +125 -85
- package/package.json +6 -6
- package/CHANGELOG.md +0 -1638
@@ -1,118 +1,118 @@
|
|
1
|
-
/**
|
2
|
-
* @fileoverview Rule to replace assignment expressions with operator assignment
|
3
|
-
* @author Brandon Mills
|
4
|
-
* @copyright 2014 Brandon Mills. All rights reserved.
|
5
|
-
*/
|
6
|
-
"use strict";
|
7
|
-
|
8
|
-
//------------------------------------------------------------------------------
|
9
|
-
// Helpers
|
10
|
-
//------------------------------------------------------------------------------
|
11
|
-
|
12
|
-
/**
|
13
|
-
* Checks whether an operator is commutative and has an operator assignment
|
14
|
-
* shorthand form.
|
15
|
-
* @param {string} operator Operator to check.
|
16
|
-
* @returns {boolean} True if the operator is commutative and has a
|
17
|
-
* shorthand form.
|
18
|
-
*/
|
19
|
-
function isCommutativeOperatorWithShorthand(operator) {
|
20
|
-
return ["*", "&", "^", "|"].indexOf(operator) >= 0;
|
21
|
-
}
|
22
|
-
|
23
|
-
/**
|
24
|
-
* Checks whether an operator is not commuatative and has an operator assignment
|
25
|
-
* shorthand form.
|
26
|
-
* @param {string} operator Operator to check.
|
27
|
-
* @returns {boolean} True if the operator is not commuatative and has
|
28
|
-
* a shorthand form.
|
29
|
-
*/
|
30
|
-
function isNonCommutativeOperatorWithShorthand(operator) {
|
31
|
-
return ["+", "-", "/", "%", "<<", ">>", ">>>"].indexOf(operator) >= 0;
|
32
|
-
}
|
33
|
-
|
34
|
-
//------------------------------------------------------------------------------
|
35
|
-
// Rule Definition
|
36
|
-
//------------------------------------------------------------------------------
|
37
|
-
|
38
|
-
/**
|
39
|
-
* Checks whether two expressions reference the same value. For example:
|
40
|
-
* a = a
|
41
|
-
* a.b = a.b
|
42
|
-
* a[0] = a[0]
|
43
|
-
* a['b'] = a['b']
|
44
|
-
* @param {ASTNode} a Left side of the comparison.
|
45
|
-
* @param {ASTNode} b Right side of the comparison.
|
46
|
-
* @returns {boolean} True if both sides match and reference the same value.
|
47
|
-
*/
|
48
|
-
function same(a, b) {
|
49
|
-
if (a.type !== b.type) {
|
50
|
-
return false;
|
51
|
-
}
|
52
|
-
|
53
|
-
switch (a.type) {
|
54
|
-
case "Identifier":
|
55
|
-
return a.name === b.name;
|
56
|
-
case "Literal":
|
57
|
-
return a.value === b.value;
|
58
|
-
case "MemberExpression":
|
59
|
-
// x[0] = x[0]
|
60
|
-
// x[y] = x[y]
|
61
|
-
// x.y = x.y
|
62
|
-
return same(a.object, b.object) && same(a.property, b.property);
|
63
|
-
default:
|
64
|
-
return false;
|
65
|
-
}
|
66
|
-
}
|
67
|
-
|
68
|
-
module.exports = function(context) {
|
69
|
-
|
70
|
-
/**
|
71
|
-
* Ensures that an assignment uses the shorthand form where possible.
|
72
|
-
* @param {ASTNode} node An AssignmentExpression node.
|
73
|
-
* @returns {void}
|
74
|
-
*/
|
75
|
-
function verify(node) {
|
76
|
-
var expr, left, operator;
|
77
|
-
|
78
|
-
if (node.operator !== "=" || node.right.type !== "BinaryExpression") {
|
79
|
-
return;
|
80
|
-
}
|
81
|
-
|
82
|
-
left = node.left;
|
83
|
-
expr = node.right;
|
84
|
-
operator = expr.operator;
|
85
|
-
|
86
|
-
if (isCommutativeOperatorWithShorthand(operator)) {
|
87
|
-
if (same(left, expr.left) || same(left, expr.right)) {
|
88
|
-
context.report(node, "Assignment can be replaced with operator assignment.");
|
89
|
-
}
|
90
|
-
} else if (isNonCommutativeOperatorWithShorthand(operator)) {
|
91
|
-
if (same(left, expr.left)) {
|
92
|
-
context.report(node, "Assignment can be replaced with operator assignment.");
|
93
|
-
}
|
94
|
-
}
|
95
|
-
}
|
96
|
-
|
97
|
-
/**
|
98
|
-
* Warns if an assignment expression uses operator assignment shorthand.
|
99
|
-
* @param {ASTNode} node An AssignmentExpression node.
|
100
|
-
* @returns {void}
|
101
|
-
*/
|
102
|
-
function prohibit(node) {
|
103
|
-
if (node.operator !== "=") {
|
104
|
-
context.report(node, "Unexpected operator assignment shorthand.");
|
105
|
-
}
|
106
|
-
}
|
107
|
-
|
108
|
-
return {
|
109
|
-
"AssignmentExpression": context.options[0] !== "never" ? verify : prohibit
|
110
|
-
};
|
111
|
-
|
112
|
-
};
|
113
|
-
|
114
|
-
module.exports.schema = [
|
115
|
-
{
|
116
|
-
"enum": ["always", "never"]
|
117
|
-
}
|
118
|
-
];
|
1
|
+
/**
|
2
|
+
* @fileoverview Rule to replace assignment expressions with operator assignment
|
3
|
+
* @author Brandon Mills
|
4
|
+
* @copyright 2014 Brandon Mills. All rights reserved.
|
5
|
+
*/
|
6
|
+
"use strict";
|
7
|
+
|
8
|
+
//------------------------------------------------------------------------------
|
9
|
+
// Helpers
|
10
|
+
//------------------------------------------------------------------------------
|
11
|
+
|
12
|
+
/**
|
13
|
+
* Checks whether an operator is commutative and has an operator assignment
|
14
|
+
* shorthand form.
|
15
|
+
* @param {string} operator Operator to check.
|
16
|
+
* @returns {boolean} True if the operator is commutative and has a
|
17
|
+
* shorthand form.
|
18
|
+
*/
|
19
|
+
function isCommutativeOperatorWithShorthand(operator) {
|
20
|
+
return ["*", "&", "^", "|"].indexOf(operator) >= 0;
|
21
|
+
}
|
22
|
+
|
23
|
+
/**
|
24
|
+
* Checks whether an operator is not commuatative and has an operator assignment
|
25
|
+
* shorthand form.
|
26
|
+
* @param {string} operator Operator to check.
|
27
|
+
* @returns {boolean} True if the operator is not commuatative and has
|
28
|
+
* a shorthand form.
|
29
|
+
*/
|
30
|
+
function isNonCommutativeOperatorWithShorthand(operator) {
|
31
|
+
return ["+", "-", "/", "%", "<<", ">>", ">>>"].indexOf(operator) >= 0;
|
32
|
+
}
|
33
|
+
|
34
|
+
//------------------------------------------------------------------------------
|
35
|
+
// Rule Definition
|
36
|
+
//------------------------------------------------------------------------------
|
37
|
+
|
38
|
+
/**
|
39
|
+
* Checks whether two expressions reference the same value. For example:
|
40
|
+
* a = a
|
41
|
+
* a.b = a.b
|
42
|
+
* a[0] = a[0]
|
43
|
+
* a['b'] = a['b']
|
44
|
+
* @param {ASTNode} a Left side of the comparison.
|
45
|
+
* @param {ASTNode} b Right side of the comparison.
|
46
|
+
* @returns {boolean} True if both sides match and reference the same value.
|
47
|
+
*/
|
48
|
+
function same(a, b) {
|
49
|
+
if (a.type !== b.type) {
|
50
|
+
return false;
|
51
|
+
}
|
52
|
+
|
53
|
+
switch (a.type) {
|
54
|
+
case "Identifier":
|
55
|
+
return a.name === b.name;
|
56
|
+
case "Literal":
|
57
|
+
return a.value === b.value;
|
58
|
+
case "MemberExpression":
|
59
|
+
// x[0] = x[0]
|
60
|
+
// x[y] = x[y]
|
61
|
+
// x.y = x.y
|
62
|
+
return same(a.object, b.object) && same(a.property, b.property);
|
63
|
+
default:
|
64
|
+
return false;
|
65
|
+
}
|
66
|
+
}
|
67
|
+
|
68
|
+
module.exports = function(context) {
|
69
|
+
|
70
|
+
/**
|
71
|
+
* Ensures that an assignment uses the shorthand form where possible.
|
72
|
+
* @param {ASTNode} node An AssignmentExpression node.
|
73
|
+
* @returns {void}
|
74
|
+
*/
|
75
|
+
function verify(node) {
|
76
|
+
var expr, left, operator;
|
77
|
+
|
78
|
+
if (node.operator !== "=" || node.right.type !== "BinaryExpression") {
|
79
|
+
return;
|
80
|
+
}
|
81
|
+
|
82
|
+
left = node.left;
|
83
|
+
expr = node.right;
|
84
|
+
operator = expr.operator;
|
85
|
+
|
86
|
+
if (isCommutativeOperatorWithShorthand(operator)) {
|
87
|
+
if (same(left, expr.left) || same(left, expr.right)) {
|
88
|
+
context.report(node, "Assignment can be replaced with operator assignment.");
|
89
|
+
}
|
90
|
+
} else if (isNonCommutativeOperatorWithShorthand(operator)) {
|
91
|
+
if (same(left, expr.left)) {
|
92
|
+
context.report(node, "Assignment can be replaced with operator assignment.");
|
93
|
+
}
|
94
|
+
}
|
95
|
+
}
|
96
|
+
|
97
|
+
/**
|
98
|
+
* Warns if an assignment expression uses operator assignment shorthand.
|
99
|
+
* @param {ASTNode} node An AssignmentExpression node.
|
100
|
+
* @returns {void}
|
101
|
+
*/
|
102
|
+
function prohibit(node) {
|
103
|
+
if (node.operator !== "=") {
|
104
|
+
context.report(node, "Unexpected operator assignment shorthand.");
|
105
|
+
}
|
106
|
+
}
|
107
|
+
|
108
|
+
return {
|
109
|
+
"AssignmentExpression": context.options[0] !== "never" ? verify : prohibit
|
110
|
+
};
|
111
|
+
|
112
|
+
};
|
113
|
+
|
114
|
+
module.exports.schema = [
|
115
|
+
{
|
116
|
+
"enum": ["always", "never"]
|
117
|
+
}
|
118
|
+
];
|
@@ -1,114 +1,114 @@
|
|
1
|
-
/**
|
2
|
-
* @fileoverview Operator linebreak - enforces operator linebreak style of two types: after and before
|
3
|
-
* @author Benoît Zugmeyer
|
4
|
-
* @copyright 2015 Benoît Zugmeyer. All rights reserved.
|
5
|
-
*/
|
6
|
-
|
7
|
-
"use strict";
|
8
|
-
|
9
|
-
//------------------------------------------------------------------------------
|
10
|
-
// Rule Definition
|
11
|
-
//------------------------------------------------------------------------------
|
12
|
-
|
13
|
-
module.exports = function(context) {
|
14
|
-
|
15
|
-
var style = context.options[0] || "after";
|
16
|
-
|
17
|
-
//--------------------------------------------------------------------------
|
18
|
-
// Helpers
|
19
|
-
//--------------------------------------------------------------------------
|
20
|
-
|
21
|
-
/**
|
22
|
-
* Checks whether two tokens are on the same line.
|
23
|
-
* @param {ASTNode} left The leftmost token.
|
24
|
-
* @param {ASTNode} right The rightmost token.
|
25
|
-
* @returns {boolean} True if the tokens are on the same line, false if not.
|
26
|
-
* @private
|
27
|
-
*/
|
28
|
-
function isSameLine(left, right) {
|
29
|
-
return left.loc.end.line === right.loc.start.line;
|
30
|
-
}
|
31
|
-
|
32
|
-
/**
|
33
|
-
* Checks the operator placement
|
34
|
-
* @param {ASTNode} node The binary operator node to check
|
35
|
-
* @private
|
36
|
-
* @returns {void}
|
37
|
-
*/
|
38
|
-
function validateBinaryExpression(node) {
|
39
|
-
var leftToken = context.getLastToken(node.left || node.id);
|
40
|
-
var operatorToken = context.getTokenAfter(leftToken);
|
41
|
-
|
42
|
-
// When the left part of a binary expression is a single expression wrapped in
|
43
|
-
// parentheses (ex: `(a) + b`), leftToken will be the last token of the expression
|
44
|
-
// and operatorToken will be the closing parenthesis.
|
45
|
-
// The leftToken should be the last closing parenthesis, and the operatorToken
|
46
|
-
// should be the token right after that.
|
47
|
-
while (operatorToken.value === ")") {
|
48
|
-
leftToken = operatorToken;
|
49
|
-
operatorToken = context.getTokenAfter(operatorToken);
|
50
|
-
}
|
51
|
-
|
52
|
-
var rightToken = context.getTokenAfter(operatorToken);
|
53
|
-
var operator = operatorToken.value;
|
54
|
-
|
55
|
-
// if single line
|
56
|
-
if (isSameLine(leftToken, operatorToken) &&
|
57
|
-
isSameLine(operatorToken, rightToken)) {
|
58
|
-
|
59
|
-
return;
|
60
|
-
|
61
|
-
} else if (!isSameLine(leftToken, operatorToken) &&
|
62
|
-
!isSameLine(operatorToken, rightToken)) {
|
63
|
-
|
64
|
-
// lone operator
|
65
|
-
context.report(node, {
|
66
|
-
line: operatorToken.loc.end.line,
|
67
|
-
column: operatorToken.loc.end.column
|
68
|
-
}, "Bad line breaking before and after '" + operator + "'.");
|
69
|
-
|
70
|
-
} else if (style === "before" && isSameLine(leftToken, operatorToken)) {
|
71
|
-
|
72
|
-
context.report(node, {
|
73
|
-
line: operatorToken.loc.end.line,
|
74
|
-
column: operatorToken.loc.end.column
|
75
|
-
}, "'" + operator + "' should be placed at the beginning of the line.");
|
76
|
-
|
77
|
-
} else if (style === "after" && isSameLine(operatorToken, rightToken)) {
|
78
|
-
|
79
|
-
context.report(node, {
|
80
|
-
line: operatorToken.loc.end.line,
|
81
|
-
column: operatorToken.loc.end.column
|
82
|
-
}, "'" + operator + "' should be placed at the end of the line.");
|
83
|
-
|
84
|
-
} else if (style === "none") {
|
85
|
-
|
86
|
-
context.report(node, {
|
87
|
-
line: operatorToken.loc.end.line,
|
88
|
-
column: operatorToken.loc.end.column
|
89
|
-
}, "There should be no line break before or after '" + operator + "'");
|
90
|
-
|
91
|
-
}
|
92
|
-
}
|
93
|
-
|
94
|
-
//--------------------------------------------------------------------------
|
95
|
-
// Public
|
96
|
-
//--------------------------------------------------------------------------
|
97
|
-
|
98
|
-
return {
|
99
|
-
"BinaryExpression": validateBinaryExpression,
|
100
|
-
"LogicalExpression": validateBinaryExpression,
|
101
|
-
"AssignmentExpression": validateBinaryExpression,
|
102
|
-
"VariableDeclarator": function (node) {
|
103
|
-
if (node.init) {
|
104
|
-
validateBinaryExpression(node);
|
105
|
-
}
|
106
|
-
}
|
107
|
-
};
|
108
|
-
};
|
109
|
-
|
110
|
-
module.exports.schema = [
|
111
|
-
{
|
112
|
-
"enum": ["after", "before", "none"]
|
113
|
-
}
|
114
|
-
];
|
1
|
+
/**
|
2
|
+
* @fileoverview Operator linebreak - enforces operator linebreak style of two types: after and before
|
3
|
+
* @author Benoît Zugmeyer
|
4
|
+
* @copyright 2015 Benoît Zugmeyer. All rights reserved.
|
5
|
+
*/
|
6
|
+
|
7
|
+
"use strict";
|
8
|
+
|
9
|
+
//------------------------------------------------------------------------------
|
10
|
+
// Rule Definition
|
11
|
+
//------------------------------------------------------------------------------
|
12
|
+
|
13
|
+
module.exports = function(context) {
|
14
|
+
|
15
|
+
var style = context.options[0] || "after";
|
16
|
+
|
17
|
+
//--------------------------------------------------------------------------
|
18
|
+
// Helpers
|
19
|
+
//--------------------------------------------------------------------------
|
20
|
+
|
21
|
+
/**
|
22
|
+
* Checks whether two tokens are on the same line.
|
23
|
+
* @param {ASTNode} left The leftmost token.
|
24
|
+
* @param {ASTNode} right The rightmost token.
|
25
|
+
* @returns {boolean} True if the tokens are on the same line, false if not.
|
26
|
+
* @private
|
27
|
+
*/
|
28
|
+
function isSameLine(left, right) {
|
29
|
+
return left.loc.end.line === right.loc.start.line;
|
30
|
+
}
|
31
|
+
|
32
|
+
/**
|
33
|
+
* Checks the operator placement
|
34
|
+
* @param {ASTNode} node The binary operator node to check
|
35
|
+
* @private
|
36
|
+
* @returns {void}
|
37
|
+
*/
|
38
|
+
function validateBinaryExpression(node) {
|
39
|
+
var leftToken = context.getLastToken(node.left || node.id);
|
40
|
+
var operatorToken = context.getTokenAfter(leftToken);
|
41
|
+
|
42
|
+
// When the left part of a binary expression is a single expression wrapped in
|
43
|
+
// parentheses (ex: `(a) + b`), leftToken will be the last token of the expression
|
44
|
+
// and operatorToken will be the closing parenthesis.
|
45
|
+
// The leftToken should be the last closing parenthesis, and the operatorToken
|
46
|
+
// should be the token right after that.
|
47
|
+
while (operatorToken.value === ")") {
|
48
|
+
leftToken = operatorToken;
|
49
|
+
operatorToken = context.getTokenAfter(operatorToken);
|
50
|
+
}
|
51
|
+
|
52
|
+
var rightToken = context.getTokenAfter(operatorToken);
|
53
|
+
var operator = operatorToken.value;
|
54
|
+
|
55
|
+
// if single line
|
56
|
+
if (isSameLine(leftToken, operatorToken) &&
|
57
|
+
isSameLine(operatorToken, rightToken)) {
|
58
|
+
|
59
|
+
return;
|
60
|
+
|
61
|
+
} else if (!isSameLine(leftToken, operatorToken) &&
|
62
|
+
!isSameLine(operatorToken, rightToken)) {
|
63
|
+
|
64
|
+
// lone operator
|
65
|
+
context.report(node, {
|
66
|
+
line: operatorToken.loc.end.line,
|
67
|
+
column: operatorToken.loc.end.column
|
68
|
+
}, "Bad line breaking before and after '" + operator + "'.");
|
69
|
+
|
70
|
+
} else if (style === "before" && isSameLine(leftToken, operatorToken)) {
|
71
|
+
|
72
|
+
context.report(node, {
|
73
|
+
line: operatorToken.loc.end.line,
|
74
|
+
column: operatorToken.loc.end.column
|
75
|
+
}, "'" + operator + "' should be placed at the beginning of the line.");
|
76
|
+
|
77
|
+
} else if (style === "after" && isSameLine(operatorToken, rightToken)) {
|
78
|
+
|
79
|
+
context.report(node, {
|
80
|
+
line: operatorToken.loc.end.line,
|
81
|
+
column: operatorToken.loc.end.column
|
82
|
+
}, "'" + operator + "' should be placed at the end of the line.");
|
83
|
+
|
84
|
+
} else if (style === "none") {
|
85
|
+
|
86
|
+
context.report(node, {
|
87
|
+
line: operatorToken.loc.end.line,
|
88
|
+
column: operatorToken.loc.end.column
|
89
|
+
}, "There should be no line break before or after '" + operator + "'");
|
90
|
+
|
91
|
+
}
|
92
|
+
}
|
93
|
+
|
94
|
+
//--------------------------------------------------------------------------
|
95
|
+
// Public
|
96
|
+
//--------------------------------------------------------------------------
|
97
|
+
|
98
|
+
return {
|
99
|
+
"BinaryExpression": validateBinaryExpression,
|
100
|
+
"LogicalExpression": validateBinaryExpression,
|
101
|
+
"AssignmentExpression": validateBinaryExpression,
|
102
|
+
"VariableDeclarator": function (node) {
|
103
|
+
if (node.init) {
|
104
|
+
validateBinaryExpression(node);
|
105
|
+
}
|
106
|
+
}
|
107
|
+
};
|
108
|
+
};
|
109
|
+
|
110
|
+
module.exports.schema = [
|
111
|
+
{
|
112
|
+
"enum": ["after", "before", "none"]
|
113
|
+
}
|
114
|
+
];
|
@@ -1,98 +1,98 @@
|
|
1
|
-
/**
|
2
|
-
* @fileoverview A rule to ensure blank lines within blocks.
|
3
|
-
* @author Mathias Schreck <https://github.com/lo1tuma>
|
4
|
-
* @copyright 2014 Mathias Schreck. All rights reserved.
|
5
|
-
*/
|
6
|
-
|
7
|
-
"use strict";
|
8
|
-
|
9
|
-
//------------------------------------------------------------------------------
|
10
|
-
// Rule Definition
|
11
|
-
//------------------------------------------------------------------------------
|
12
|
-
|
13
|
-
module.exports = function (context) {
|
14
|
-
var requirePadding = context.options[0] !== "never";
|
15
|
-
|
16
|
-
var ALWAYS_MESSAGE = "Block must be padded by blank lines.",
|
17
|
-
NEVER_MESSAGE = "Block must not be padded by blank lines.";
|
18
|
-
|
19
|
-
/**
|
20
|
-
* Checks if the given non empty block node has a blank line before its first child node.
|
21
|
-
* @param {ASTNode} node The AST node of a BlockStatement.
|
22
|
-
* @returns {boolean} Whether or not the block starts with a blank line.
|
23
|
-
*/
|
24
|
-
function isBlockTopPadded(node) {
|
25
|
-
var blockStart = node.loc.start.line,
|
26
|
-
first = node.body[0],
|
27
|
-
firstLine = first.loc.start.line,
|
28
|
-
expectedFirstLine = blockStart + 2,
|
29
|
-
leadingComments = context.getComments(first).leading;
|
30
|
-
|
31
|
-
if (leadingComments.length > 0) {
|
32
|
-
firstLine = leadingComments[0].loc.start.line;
|
33
|
-
}
|
34
|
-
|
35
|
-
return expectedFirstLine <= firstLine;
|
36
|
-
}
|
37
|
-
|
38
|
-
/**
|
39
|
-
* Checks if the given non empty block node has a blank line after its last child node.
|
40
|
-
* @param {ASTNode} node The AST node of a BlockStatement.
|
41
|
-
* @returns {boolean} Whether or not the block ends with a blank line.
|
42
|
-
*/
|
43
|
-
function isBlockBottomPadded(node) {
|
44
|
-
var blockEnd = node.loc.end.line,
|
45
|
-
last = node.body[node.body.length - 1],
|
46
|
-
lastLine = context.getLastToken(last).loc.end.line,
|
47
|
-
expectedLastLine = blockEnd - 2,
|
48
|
-
trailingComments = context.getComments(last).trailing;
|
49
|
-
|
50
|
-
if (trailingComments.length > 0) {
|
51
|
-
lastLine = trailingComments[trailingComments.length - 1].loc.end.line;
|
52
|
-
}
|
53
|
-
|
54
|
-
return lastLine <= expectedLastLine;
|
55
|
-
}
|
56
|
-
|
57
|
-
/**
|
58
|
-
* Checks the given BlockStatement node to be padded if the block is not empty.
|
59
|
-
* @param {ASTNode} node The AST node of a BlockStatement.
|
60
|
-
* @returns {void} undefined.
|
61
|
-
*/
|
62
|
-
function checkPadding(node) {
|
63
|
-
if (node.body.length > 0) {
|
64
|
-
|
65
|
-
var blockHasTopPadding = isBlockTopPadded(node),
|
66
|
-
blockHasBottomPadding = isBlockBottomPadded(node);
|
67
|
-
|
68
|
-
if (requirePadding) {
|
69
|
-
if (!blockHasTopPadding) {
|
70
|
-
context.report(node, ALWAYS_MESSAGE);
|
71
|
-
}
|
72
|
-
|
73
|
-
if (!blockHasBottomPadding) {
|
74
|
-
context.report(node, node.loc.end, ALWAYS_MESSAGE);
|
75
|
-
}
|
76
|
-
} else {
|
77
|
-
if (blockHasTopPadding) {
|
78
|
-
context.report(node, NEVER_MESSAGE);
|
79
|
-
}
|
80
|
-
|
81
|
-
if (blockHasBottomPadding) {
|
82
|
-
context.report(node, node.loc.end, NEVER_MESSAGE);
|
83
|
-
}
|
84
|
-
}
|
85
|
-
}
|
86
|
-
}
|
87
|
-
|
88
|
-
return {
|
89
|
-
"BlockStatement": checkPadding
|
90
|
-
};
|
91
|
-
|
92
|
-
};
|
93
|
-
|
94
|
-
module.exports.schema = [
|
95
|
-
{
|
96
|
-
"enum": ["always", "never"]
|
97
|
-
}
|
98
|
-
];
|
1
|
+
/**
|
2
|
+
* @fileoverview A rule to ensure blank lines within blocks.
|
3
|
+
* @author Mathias Schreck <https://github.com/lo1tuma>
|
4
|
+
* @copyright 2014 Mathias Schreck. All rights reserved.
|
5
|
+
*/
|
6
|
+
|
7
|
+
"use strict";
|
8
|
+
|
9
|
+
//------------------------------------------------------------------------------
|
10
|
+
// Rule Definition
|
11
|
+
//------------------------------------------------------------------------------
|
12
|
+
|
13
|
+
module.exports = function (context) {
|
14
|
+
var requirePadding = context.options[0] !== "never";
|
15
|
+
|
16
|
+
var ALWAYS_MESSAGE = "Block must be padded by blank lines.",
|
17
|
+
NEVER_MESSAGE = "Block must not be padded by blank lines.";
|
18
|
+
|
19
|
+
/**
|
20
|
+
* Checks if the given non empty block node has a blank line before its first child node.
|
21
|
+
* @param {ASTNode} node The AST node of a BlockStatement.
|
22
|
+
* @returns {boolean} Whether or not the block starts with a blank line.
|
23
|
+
*/
|
24
|
+
function isBlockTopPadded(node) {
|
25
|
+
var blockStart = node.loc.start.line,
|
26
|
+
first = node.body[0],
|
27
|
+
firstLine = first.loc.start.line,
|
28
|
+
expectedFirstLine = blockStart + 2,
|
29
|
+
leadingComments = context.getComments(first).leading;
|
30
|
+
|
31
|
+
if (leadingComments.length > 0) {
|
32
|
+
firstLine = leadingComments[0].loc.start.line;
|
33
|
+
}
|
34
|
+
|
35
|
+
return expectedFirstLine <= firstLine;
|
36
|
+
}
|
37
|
+
|
38
|
+
/**
|
39
|
+
* Checks if the given non empty block node has a blank line after its last child node.
|
40
|
+
* @param {ASTNode} node The AST node of a BlockStatement.
|
41
|
+
* @returns {boolean} Whether or not the block ends with a blank line.
|
42
|
+
*/
|
43
|
+
function isBlockBottomPadded(node) {
|
44
|
+
var blockEnd = node.loc.end.line,
|
45
|
+
last = node.body[node.body.length - 1],
|
46
|
+
lastLine = context.getLastToken(last).loc.end.line,
|
47
|
+
expectedLastLine = blockEnd - 2,
|
48
|
+
trailingComments = context.getComments(last).trailing;
|
49
|
+
|
50
|
+
if (trailingComments.length > 0) {
|
51
|
+
lastLine = trailingComments[trailingComments.length - 1].loc.end.line;
|
52
|
+
}
|
53
|
+
|
54
|
+
return lastLine <= expectedLastLine;
|
55
|
+
}
|
56
|
+
|
57
|
+
/**
|
58
|
+
* Checks the given BlockStatement node to be padded if the block is not empty.
|
59
|
+
* @param {ASTNode} node The AST node of a BlockStatement.
|
60
|
+
* @returns {void} undefined.
|
61
|
+
*/
|
62
|
+
function checkPadding(node) {
|
63
|
+
if (node.body.length > 0) {
|
64
|
+
|
65
|
+
var blockHasTopPadding = isBlockTopPadded(node),
|
66
|
+
blockHasBottomPadding = isBlockBottomPadded(node);
|
67
|
+
|
68
|
+
if (requirePadding) {
|
69
|
+
if (!blockHasTopPadding) {
|
70
|
+
context.report(node, ALWAYS_MESSAGE);
|
71
|
+
}
|
72
|
+
|
73
|
+
if (!blockHasBottomPadding) {
|
74
|
+
context.report(node, node.loc.end, ALWAYS_MESSAGE);
|
75
|
+
}
|
76
|
+
} else {
|
77
|
+
if (blockHasTopPadding) {
|
78
|
+
context.report(node, NEVER_MESSAGE);
|
79
|
+
}
|
80
|
+
|
81
|
+
if (blockHasBottomPadding) {
|
82
|
+
context.report(node, node.loc.end, NEVER_MESSAGE);
|
83
|
+
}
|
84
|
+
}
|
85
|
+
}
|
86
|
+
}
|
87
|
+
|
88
|
+
return {
|
89
|
+
"BlockStatement": checkPadding
|
90
|
+
};
|
91
|
+
|
92
|
+
};
|
93
|
+
|
94
|
+
module.exports.schema = [
|
95
|
+
{
|
96
|
+
"enum": ["always", "never"]
|
97
|
+
}
|
98
|
+
];
|