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
package/lib/rules/comma-style.js
CHANGED
@@ -1,195 +1,195 @@
|
|
1
|
-
/**
|
2
|
-
* @fileoverview Comma style - enforces comma styles of two types: last and first
|
3
|
-
* @author Vignesh Anand aka vegetableman
|
4
|
-
* @copyright 2014 Vignesh Anand. All rights reserved.
|
5
|
-
* @copyright 2015 Evan Simmons. All rights reserved.
|
6
|
-
*/
|
7
|
-
|
8
|
-
"use strict";
|
9
|
-
|
10
|
-
//------------------------------------------------------------------------------
|
11
|
-
// Rule Definition
|
12
|
-
//------------------------------------------------------------------------------
|
13
|
-
|
14
|
-
module.exports = function(context) {
|
15
|
-
|
16
|
-
var style = context.options[0] || "last",
|
17
|
-
exceptions = {};
|
18
|
-
|
19
|
-
if (context.options.length === 2 && context.options[1].hasOwnProperty("exceptions")) {
|
20
|
-
exceptions = context.options[1].exceptions;
|
21
|
-
}
|
22
|
-
|
23
|
-
//--------------------------------------------------------------------------
|
24
|
-
// Helpers
|
25
|
-
//--------------------------------------------------------------------------
|
26
|
-
|
27
|
-
/**
|
28
|
-
* Checks whether two tokens are on the same line.
|
29
|
-
* @param {ASTNode} left The leftmost token.
|
30
|
-
* @param {ASTNode} right The rightmost token.
|
31
|
-
* @returns {boolean} True if the tokens are on the same line, false if not.
|
32
|
-
* @private
|
33
|
-
*/
|
34
|
-
function isSameLine(left, right) {
|
35
|
-
return left.loc.end.line === right.loc.start.line;
|
36
|
-
}
|
37
|
-
|
38
|
-
/**
|
39
|
-
* Determines if a given token is a comma operator.
|
40
|
-
* @param {ASTNode} token The token to check.
|
41
|
-
* @returns {boolean} True if the token is a comma, false if not.
|
42
|
-
* @private
|
43
|
-
*/
|
44
|
-
function isComma(token) {
|
45
|
-
return !!token && (token.type === "Punctuator") && (token.value === ",");
|
46
|
-
}
|
47
|
-
|
48
|
-
/**
|
49
|
-
* Validates the spacing around single items in lists.
|
50
|
-
* @param {Token} previousItemToken The last token from the previous item.
|
51
|
-
* @param {Token} commaToken The token representing the comma.
|
52
|
-
* @param {Token} currentItemToken The first token of the current item.
|
53
|
-
* @param {Token} reportItem The item to use when reporting an error.
|
54
|
-
* @returns {void}
|
55
|
-
* @private
|
56
|
-
*/
|
57
|
-
function validateCommaItemSpacing(previousItemToken, commaToken, currentItemToken, reportItem) {
|
58
|
-
|
59
|
-
// if single line
|
60
|
-
if (isSameLine(commaToken, currentItemToken) &&
|
61
|
-
isSameLine(previousItemToken, commaToken)) {
|
62
|
-
|
63
|
-
return;
|
64
|
-
|
65
|
-
} else if (!isSameLine(commaToken, currentItemToken) &&
|
66
|
-
!isSameLine(previousItemToken, commaToken)) {
|
67
|
-
|
68
|
-
// lone comma
|
69
|
-
context.report(reportItem, {
|
70
|
-
line: commaToken.loc.end.line,
|
71
|
-
column: commaToken.loc.start.column
|
72
|
-
}, "Bad line breaking before and after ','.");
|
73
|
-
|
74
|
-
} else if (style === "first" && !isSameLine(commaToken, currentItemToken)) {
|
75
|
-
|
76
|
-
context.report(reportItem, "',' should be placed first.");
|
77
|
-
|
78
|
-
} else if (style === "last" && isSameLine(commaToken, currentItemToken)) {
|
79
|
-
|
80
|
-
context.report(reportItem, {
|
81
|
-
line: commaToken.loc.end.line,
|
82
|
-
column: commaToken.loc.end.column
|
83
|
-
}, "',' should be placed last.");
|
84
|
-
}
|
85
|
-
}
|
86
|
-
|
87
|
-
/**
|
88
|
-
* Checks the comma placement with regards to a declaration/property/element
|
89
|
-
* @param {ASTNode} node The binary expression node to check
|
90
|
-
* @param {string} property The property of the node containing child nodes.
|
91
|
-
* @private
|
92
|
-
* @returns {void}
|
93
|
-
*/
|
94
|
-
function validateComma(node, property) {
|
95
|
-
var items = node[property],
|
96
|
-
arrayLiteral = (node.type === "ArrayExpression"),
|
97
|
-
previousItemToken;
|
98
|
-
|
99
|
-
if (items.length > 1 || arrayLiteral) {
|
100
|
-
|
101
|
-
// seed as opening [
|
102
|
-
previousItemToken = context.getFirstToken(node);
|
103
|
-
|
104
|
-
items.forEach(function(item) {
|
105
|
-
var commaToken = item ? context.getTokenBefore(item) : previousItemToken,
|
106
|
-
currentItemToken = item ? context.getFirstToken(item) : context.getTokenAfter(commaToken),
|
107
|
-
reportItem = item || currentItemToken;
|
108
|
-
|
109
|
-
/*
|
110
|
-
* This works by comparing three token locations:
|
111
|
-
* - previousItemToken is the last token of the previous item
|
112
|
-
* - commaToken is the location of the comma before the current item
|
113
|
-
* - currentItemToken is the first token of the current item
|
114
|
-
*
|
115
|
-
* These values get switched around if item is undefined.
|
116
|
-
* previousItemToken will refer to the last token not belonging
|
117
|
-
* to the current item, which could be a comma or an opening
|
118
|
-
* square bracket. currentItemToken could be a comma.
|
119
|
-
*
|
120
|
-
* All comparisons are done based on these tokens directly, so
|
121
|
-
* they are always valid regardless of an undefined item.
|
122
|
-
*/
|
123
|
-
if (isComma(commaToken)) {
|
124
|
-
validateCommaItemSpacing(previousItemToken, commaToken,
|
125
|
-
currentItemToken, reportItem);
|
126
|
-
}
|
127
|
-
|
128
|
-
previousItemToken = item ? context.getLastToken(item) : previousItemToken;
|
129
|
-
});
|
130
|
-
|
131
|
-
/*
|
132
|
-
* Special case for array literals that have empty last items, such
|
133
|
-
* as [ 1, 2, ]. These arrays only have two items show up in the
|
134
|
-
* AST, so we need to look at the token to verify that there's no
|
135
|
-
* dangling comma.
|
136
|
-
*/
|
137
|
-
if (arrayLiteral) {
|
138
|
-
|
139
|
-
var lastToken = context.getLastToken(node),
|
140
|
-
nextToLastToken = context.getTokenBefore(lastToken);
|
141
|
-
|
142
|
-
if (isComma(nextToLastToken)) {
|
143
|
-
validateCommaItemSpacing(
|
144
|
-
context.getTokenBefore(nextToLastToken),
|
145
|
-
nextToLastToken,
|
146
|
-
lastToken,
|
147
|
-
lastToken
|
148
|
-
);
|
149
|
-
}
|
150
|
-
}
|
151
|
-
}
|
152
|
-
}
|
153
|
-
|
154
|
-
//--------------------------------------------------------------------------
|
155
|
-
// Public
|
156
|
-
//--------------------------------------------------------------------------
|
157
|
-
|
158
|
-
var nodes = {};
|
159
|
-
|
160
|
-
if (!exceptions.VariableDeclaration) {
|
161
|
-
nodes.VariableDeclaration = function(node) {
|
162
|
-
validateComma(node, "declarations");
|
163
|
-
};
|
164
|
-
}
|
165
|
-
if (!exceptions.ObjectExpression) {
|
166
|
-
nodes.ObjectExpression = function(node) {
|
167
|
-
validateComma(node, "properties");
|
168
|
-
};
|
169
|
-
}
|
170
|
-
if (!exceptions.ArrayExpression) {
|
171
|
-
nodes.ArrayExpression = function(node) {
|
172
|
-
validateComma(node, "elements");
|
173
|
-
};
|
174
|
-
}
|
175
|
-
|
176
|
-
return nodes;
|
177
|
-
};
|
178
|
-
|
179
|
-
module.exports.schema = [
|
180
|
-
{
|
181
|
-
"enum": ["first", "last"]
|
182
|
-
},
|
183
|
-
{
|
184
|
-
"type": "object",
|
185
|
-
"properties": {
|
186
|
-
"exceptions": {
|
187
|
-
"type": "object",
|
188
|
-
"additionalProperties": {
|
189
|
-
"type": "boolean"
|
190
|
-
}
|
191
|
-
}
|
192
|
-
},
|
193
|
-
"additionalProperties": false
|
194
|
-
}
|
195
|
-
];
|
1
|
+
/**
|
2
|
+
* @fileoverview Comma style - enforces comma styles of two types: last and first
|
3
|
+
* @author Vignesh Anand aka vegetableman
|
4
|
+
* @copyright 2014 Vignesh Anand. All rights reserved.
|
5
|
+
* @copyright 2015 Evan Simmons. All rights reserved.
|
6
|
+
*/
|
7
|
+
|
8
|
+
"use strict";
|
9
|
+
|
10
|
+
//------------------------------------------------------------------------------
|
11
|
+
// Rule Definition
|
12
|
+
//------------------------------------------------------------------------------
|
13
|
+
|
14
|
+
module.exports = function(context) {
|
15
|
+
|
16
|
+
var style = context.options[0] || "last",
|
17
|
+
exceptions = {};
|
18
|
+
|
19
|
+
if (context.options.length === 2 && context.options[1].hasOwnProperty("exceptions")) {
|
20
|
+
exceptions = context.options[1].exceptions;
|
21
|
+
}
|
22
|
+
|
23
|
+
//--------------------------------------------------------------------------
|
24
|
+
// Helpers
|
25
|
+
//--------------------------------------------------------------------------
|
26
|
+
|
27
|
+
/**
|
28
|
+
* Checks whether two tokens are on the same line.
|
29
|
+
* @param {ASTNode} left The leftmost token.
|
30
|
+
* @param {ASTNode} right The rightmost token.
|
31
|
+
* @returns {boolean} True if the tokens are on the same line, false if not.
|
32
|
+
* @private
|
33
|
+
*/
|
34
|
+
function isSameLine(left, right) {
|
35
|
+
return left.loc.end.line === right.loc.start.line;
|
36
|
+
}
|
37
|
+
|
38
|
+
/**
|
39
|
+
* Determines if a given token is a comma operator.
|
40
|
+
* @param {ASTNode} token The token to check.
|
41
|
+
* @returns {boolean} True if the token is a comma, false if not.
|
42
|
+
* @private
|
43
|
+
*/
|
44
|
+
function isComma(token) {
|
45
|
+
return !!token && (token.type === "Punctuator") && (token.value === ",");
|
46
|
+
}
|
47
|
+
|
48
|
+
/**
|
49
|
+
* Validates the spacing around single items in lists.
|
50
|
+
* @param {Token} previousItemToken The last token from the previous item.
|
51
|
+
* @param {Token} commaToken The token representing the comma.
|
52
|
+
* @param {Token} currentItemToken The first token of the current item.
|
53
|
+
* @param {Token} reportItem The item to use when reporting an error.
|
54
|
+
* @returns {void}
|
55
|
+
* @private
|
56
|
+
*/
|
57
|
+
function validateCommaItemSpacing(previousItemToken, commaToken, currentItemToken, reportItem) {
|
58
|
+
|
59
|
+
// if single line
|
60
|
+
if (isSameLine(commaToken, currentItemToken) &&
|
61
|
+
isSameLine(previousItemToken, commaToken)) {
|
62
|
+
|
63
|
+
return;
|
64
|
+
|
65
|
+
} else if (!isSameLine(commaToken, currentItemToken) &&
|
66
|
+
!isSameLine(previousItemToken, commaToken)) {
|
67
|
+
|
68
|
+
// lone comma
|
69
|
+
context.report(reportItem, {
|
70
|
+
line: commaToken.loc.end.line,
|
71
|
+
column: commaToken.loc.start.column
|
72
|
+
}, "Bad line breaking before and after ','.");
|
73
|
+
|
74
|
+
} else if (style === "first" && !isSameLine(commaToken, currentItemToken)) {
|
75
|
+
|
76
|
+
context.report(reportItem, "',' should be placed first.");
|
77
|
+
|
78
|
+
} else if (style === "last" && isSameLine(commaToken, currentItemToken)) {
|
79
|
+
|
80
|
+
context.report(reportItem, {
|
81
|
+
line: commaToken.loc.end.line,
|
82
|
+
column: commaToken.loc.end.column
|
83
|
+
}, "',' should be placed last.");
|
84
|
+
}
|
85
|
+
}
|
86
|
+
|
87
|
+
/**
|
88
|
+
* Checks the comma placement with regards to a declaration/property/element
|
89
|
+
* @param {ASTNode} node The binary expression node to check
|
90
|
+
* @param {string} property The property of the node containing child nodes.
|
91
|
+
* @private
|
92
|
+
* @returns {void}
|
93
|
+
*/
|
94
|
+
function validateComma(node, property) {
|
95
|
+
var items = node[property],
|
96
|
+
arrayLiteral = (node.type === "ArrayExpression"),
|
97
|
+
previousItemToken;
|
98
|
+
|
99
|
+
if (items.length > 1 || arrayLiteral) {
|
100
|
+
|
101
|
+
// seed as opening [
|
102
|
+
previousItemToken = context.getFirstToken(node);
|
103
|
+
|
104
|
+
items.forEach(function(item) {
|
105
|
+
var commaToken = item ? context.getTokenBefore(item) : previousItemToken,
|
106
|
+
currentItemToken = item ? context.getFirstToken(item) : context.getTokenAfter(commaToken),
|
107
|
+
reportItem = item || currentItemToken;
|
108
|
+
|
109
|
+
/*
|
110
|
+
* This works by comparing three token locations:
|
111
|
+
* - previousItemToken is the last token of the previous item
|
112
|
+
* - commaToken is the location of the comma before the current item
|
113
|
+
* - currentItemToken is the first token of the current item
|
114
|
+
*
|
115
|
+
* These values get switched around if item is undefined.
|
116
|
+
* previousItemToken will refer to the last token not belonging
|
117
|
+
* to the current item, which could be a comma or an opening
|
118
|
+
* square bracket. currentItemToken could be a comma.
|
119
|
+
*
|
120
|
+
* All comparisons are done based on these tokens directly, so
|
121
|
+
* they are always valid regardless of an undefined item.
|
122
|
+
*/
|
123
|
+
if (isComma(commaToken)) {
|
124
|
+
validateCommaItemSpacing(previousItemToken, commaToken,
|
125
|
+
currentItemToken, reportItem);
|
126
|
+
}
|
127
|
+
|
128
|
+
previousItemToken = item ? context.getLastToken(item) : previousItemToken;
|
129
|
+
});
|
130
|
+
|
131
|
+
/*
|
132
|
+
* Special case for array literals that have empty last items, such
|
133
|
+
* as [ 1, 2, ]. These arrays only have two items show up in the
|
134
|
+
* AST, so we need to look at the token to verify that there's no
|
135
|
+
* dangling comma.
|
136
|
+
*/
|
137
|
+
if (arrayLiteral) {
|
138
|
+
|
139
|
+
var lastToken = context.getLastToken(node),
|
140
|
+
nextToLastToken = context.getTokenBefore(lastToken);
|
141
|
+
|
142
|
+
if (isComma(nextToLastToken)) {
|
143
|
+
validateCommaItemSpacing(
|
144
|
+
context.getTokenBefore(nextToLastToken),
|
145
|
+
nextToLastToken,
|
146
|
+
lastToken,
|
147
|
+
lastToken
|
148
|
+
);
|
149
|
+
}
|
150
|
+
}
|
151
|
+
}
|
152
|
+
}
|
153
|
+
|
154
|
+
//--------------------------------------------------------------------------
|
155
|
+
// Public
|
156
|
+
//--------------------------------------------------------------------------
|
157
|
+
|
158
|
+
var nodes = {};
|
159
|
+
|
160
|
+
if (!exceptions.VariableDeclaration) {
|
161
|
+
nodes.VariableDeclaration = function(node) {
|
162
|
+
validateComma(node, "declarations");
|
163
|
+
};
|
164
|
+
}
|
165
|
+
if (!exceptions.ObjectExpression) {
|
166
|
+
nodes.ObjectExpression = function(node) {
|
167
|
+
validateComma(node, "properties");
|
168
|
+
};
|
169
|
+
}
|
170
|
+
if (!exceptions.ArrayExpression) {
|
171
|
+
nodes.ArrayExpression = function(node) {
|
172
|
+
validateComma(node, "elements");
|
173
|
+
};
|
174
|
+
}
|
175
|
+
|
176
|
+
return nodes;
|
177
|
+
};
|
178
|
+
|
179
|
+
module.exports.schema = [
|
180
|
+
{
|
181
|
+
"enum": ["first", "last"]
|
182
|
+
},
|
183
|
+
{
|
184
|
+
"type": "object",
|
185
|
+
"properties": {
|
186
|
+
"exceptions": {
|
187
|
+
"type": "object",
|
188
|
+
"additionalProperties": {
|
189
|
+
"type": "boolean"
|
190
|
+
}
|
191
|
+
}
|
192
|
+
},
|
193
|
+
"additionalProperties": false
|
194
|
+
}
|
195
|
+
];
|
package/lib/rules/complexity.js
CHANGED
@@ -1,94 +1,94 @@
|
|
1
|
-
/**
|
2
|
-
* @fileoverview Counts the cyclomatic complexity of each function of the script. See http://en.wikipedia.org/wiki/Cyclomatic_complexity.
|
3
|
-
* Counts the number of if, conditional, for, whilte, try, switch/case,
|
4
|
-
* @author Patrick Brosset
|
5
|
-
*/
|
6
|
-
|
7
|
-
"use strict";
|
8
|
-
|
9
|
-
//------------------------------------------------------------------------------
|
10
|
-
// Rule Definition
|
11
|
-
//------------------------------------------------------------------------------
|
12
|
-
|
13
|
-
module.exports = function(context) {
|
14
|
-
|
15
|
-
var THRESHOLD = context.options[0];
|
16
|
-
|
17
|
-
//--------------------------------------------------------------------------
|
18
|
-
// Helpers
|
19
|
-
//--------------------------------------------------------------------------
|
20
|
-
|
21
|
-
// Using a stack to store complexity (handling nested functions)
|
22
|
-
var fns = [];
|
23
|
-
|
24
|
-
// When parsing a new function, store it in our function stack
|
25
|
-
function startFunction() {
|
26
|
-
fns.push(1);
|
27
|
-
}
|
28
|
-
|
29
|
-
function endFunction(node) {
|
30
|
-
var complexity = fns.pop(),
|
31
|
-
name = "anonymous";
|
32
|
-
|
33
|
-
if (node.id) {
|
34
|
-
name = node.id.name;
|
35
|
-
} else if (node.parent.type === "MethodDefinition") {
|
36
|
-
name = node.parent.key.name;
|
37
|
-
}
|
38
|
-
|
39
|
-
if (complexity > THRESHOLD) {
|
40
|
-
context.report(node, "Function '{{name}}' has a complexity of {{complexity}}.", { name: name, complexity: complexity });
|
41
|
-
}
|
42
|
-
}
|
43
|
-
|
44
|
-
function increaseComplexity() {
|
45
|
-
if (fns.length) {
|
46
|
-
fns[fns.length - 1] ++;
|
47
|
-
}
|
48
|
-
}
|
49
|
-
|
50
|
-
function increaseSwitchComplexity(node) {
|
51
|
-
// Avoiding `default`
|
52
|
-
if (node.test) {
|
53
|
-
increaseComplexity(node);
|
54
|
-
}
|
55
|
-
}
|
56
|
-
|
57
|
-
function increaseLogicalComplexity(node) {
|
58
|
-
// Avoiding &&
|
59
|
-
if (node.operator === "||") {
|
60
|
-
increaseComplexity(node);
|
61
|
-
}
|
62
|
-
}
|
63
|
-
|
64
|
-
//--------------------------------------------------------------------------
|
65
|
-
// Public API
|
66
|
-
//--------------------------------------------------------------------------
|
67
|
-
|
68
|
-
return {
|
69
|
-
"FunctionDeclaration": startFunction,
|
70
|
-
"FunctionExpression": startFunction,
|
71
|
-
"ArrowFunctionExpression": startFunction,
|
72
|
-
"FunctionDeclaration:exit": endFunction,
|
73
|
-
"FunctionExpression:exit": endFunction,
|
74
|
-
"ArrowFunctionExpression:exit": endFunction,
|
75
|
-
|
76
|
-
"CatchClause": increaseComplexity,
|
77
|
-
"ConditionalExpression": increaseComplexity,
|
78
|
-
"LogicalExpression": increaseLogicalComplexity,
|
79
|
-
"ForStatement": increaseComplexity,
|
80
|
-
"ForInStatement": increaseComplexity,
|
81
|
-
"ForOfStatement": increaseComplexity,
|
82
|
-
"IfStatement": increaseComplexity,
|
83
|
-
"SwitchCase": increaseSwitchComplexity,
|
84
|
-
"WhileStatement": increaseComplexity,
|
85
|
-
"DoWhileStatement": increaseComplexity
|
86
|
-
};
|
87
|
-
|
88
|
-
};
|
89
|
-
|
90
|
-
module.exports.schema = [
|
91
|
-
{
|
92
|
-
"type": "integer"
|
93
|
-
}
|
94
|
-
];
|
1
|
+
/**
|
2
|
+
* @fileoverview Counts the cyclomatic complexity of each function of the script. See http://en.wikipedia.org/wiki/Cyclomatic_complexity.
|
3
|
+
* Counts the number of if, conditional, for, whilte, try, switch/case,
|
4
|
+
* @author Patrick Brosset
|
5
|
+
*/
|
6
|
+
|
7
|
+
"use strict";
|
8
|
+
|
9
|
+
//------------------------------------------------------------------------------
|
10
|
+
// Rule Definition
|
11
|
+
//------------------------------------------------------------------------------
|
12
|
+
|
13
|
+
module.exports = function(context) {
|
14
|
+
|
15
|
+
var THRESHOLD = context.options[0];
|
16
|
+
|
17
|
+
//--------------------------------------------------------------------------
|
18
|
+
// Helpers
|
19
|
+
//--------------------------------------------------------------------------
|
20
|
+
|
21
|
+
// Using a stack to store complexity (handling nested functions)
|
22
|
+
var fns = [];
|
23
|
+
|
24
|
+
// When parsing a new function, store it in our function stack
|
25
|
+
function startFunction() {
|
26
|
+
fns.push(1);
|
27
|
+
}
|
28
|
+
|
29
|
+
function endFunction(node) {
|
30
|
+
var complexity = fns.pop(),
|
31
|
+
name = "anonymous";
|
32
|
+
|
33
|
+
if (node.id) {
|
34
|
+
name = node.id.name;
|
35
|
+
} else if (node.parent.type === "MethodDefinition") {
|
36
|
+
name = node.parent.key.name;
|
37
|
+
}
|
38
|
+
|
39
|
+
if (complexity > THRESHOLD) {
|
40
|
+
context.report(node, "Function '{{name}}' has a complexity of {{complexity}}.", { name: name, complexity: complexity });
|
41
|
+
}
|
42
|
+
}
|
43
|
+
|
44
|
+
function increaseComplexity() {
|
45
|
+
if (fns.length) {
|
46
|
+
fns[fns.length - 1] ++;
|
47
|
+
}
|
48
|
+
}
|
49
|
+
|
50
|
+
function increaseSwitchComplexity(node) {
|
51
|
+
// Avoiding `default`
|
52
|
+
if (node.test) {
|
53
|
+
increaseComplexity(node);
|
54
|
+
}
|
55
|
+
}
|
56
|
+
|
57
|
+
function increaseLogicalComplexity(node) {
|
58
|
+
// Avoiding &&
|
59
|
+
if (node.operator === "||") {
|
60
|
+
increaseComplexity(node);
|
61
|
+
}
|
62
|
+
}
|
63
|
+
|
64
|
+
//--------------------------------------------------------------------------
|
65
|
+
// Public API
|
66
|
+
//--------------------------------------------------------------------------
|
67
|
+
|
68
|
+
return {
|
69
|
+
"FunctionDeclaration": startFunction,
|
70
|
+
"FunctionExpression": startFunction,
|
71
|
+
"ArrowFunctionExpression": startFunction,
|
72
|
+
"FunctionDeclaration:exit": endFunction,
|
73
|
+
"FunctionExpression:exit": endFunction,
|
74
|
+
"ArrowFunctionExpression:exit": endFunction,
|
75
|
+
|
76
|
+
"CatchClause": increaseComplexity,
|
77
|
+
"ConditionalExpression": increaseComplexity,
|
78
|
+
"LogicalExpression": increaseLogicalComplexity,
|
79
|
+
"ForStatement": increaseComplexity,
|
80
|
+
"ForInStatement": increaseComplexity,
|
81
|
+
"ForOfStatement": increaseComplexity,
|
82
|
+
"IfStatement": increaseComplexity,
|
83
|
+
"SwitchCase": increaseSwitchComplexity,
|
84
|
+
"WhileStatement": increaseComplexity,
|
85
|
+
"DoWhileStatement": increaseComplexity
|
86
|
+
};
|
87
|
+
|
88
|
+
};
|
89
|
+
|
90
|
+
module.exports.schema = [
|
91
|
+
{
|
92
|
+
"type": "integer"
|
93
|
+
}
|
94
|
+
];
|