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,23 +1,70 @@
|
|
1
|
-
/**
|
2
|
-
* @fileoverview Rule to flag use of unnecessary semicolons
|
3
|
-
* @author Nicholas C. Zakas
|
4
|
-
*/
|
5
|
-
|
6
|
-
"use strict";
|
7
|
-
|
8
|
-
//------------------------------------------------------------------------------
|
9
|
-
// Rule Definition
|
10
|
-
//------------------------------------------------------------------------------
|
11
|
-
|
12
|
-
module.exports = function(context) {
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
}
|
22
|
-
|
23
|
-
|
1
|
+
/**
|
2
|
+
* @fileoverview Rule to flag use of unnecessary semicolons
|
3
|
+
* @author Nicholas C. Zakas
|
4
|
+
*/
|
5
|
+
|
6
|
+
"use strict";
|
7
|
+
|
8
|
+
//------------------------------------------------------------------------------
|
9
|
+
// Rule Definition
|
10
|
+
//------------------------------------------------------------------------------
|
11
|
+
|
12
|
+
module.exports = function(context) {
|
13
|
+
|
14
|
+
/**
|
15
|
+
* Reports an unnecessary semicolon error.
|
16
|
+
* @param {Node|Token} nodeOrToken - A node or a token to be reported.
|
17
|
+
* @returns {void}
|
18
|
+
*/
|
19
|
+
function report(nodeOrToken) {
|
20
|
+
context.report(nodeOrToken, "Unnecessary semicolon.");
|
21
|
+
}
|
22
|
+
|
23
|
+
/**
|
24
|
+
* Checks for a part of a class body.
|
25
|
+
* This checks tokens from a specified token to a next MethodDefinition or the end of class body.
|
26
|
+
*
|
27
|
+
* @param {Token} firstToken - The first token to check.
|
28
|
+
* @returns {void}
|
29
|
+
*/
|
30
|
+
function checkForPartOfClassBody(firstToken) {
|
31
|
+
for (var token = firstToken;
|
32
|
+
token.type === "Punctuator" && token.value !== "}";
|
33
|
+
token = context.getTokenAfter(token)
|
34
|
+
) {
|
35
|
+
if (token.value === ";") {
|
36
|
+
report(token);
|
37
|
+
}
|
38
|
+
}
|
39
|
+
}
|
40
|
+
|
41
|
+
return {
|
42
|
+
/**
|
43
|
+
* Reports this empty statement.
|
44
|
+
* @param {Node} node - A EmptyStatement node to be reported.
|
45
|
+
* @returns {void}
|
46
|
+
*/
|
47
|
+
"EmptyStatement": report,
|
48
|
+
|
49
|
+
/**
|
50
|
+
* Checks tokens from the head of this class body to the first MethodDefinition or the end of this class body.
|
51
|
+
* @param {Node} node - A ClassBody node to check.
|
52
|
+
* @returns {void}
|
53
|
+
*/
|
54
|
+
"ClassBody": function(node) {
|
55
|
+
checkForPartOfClassBody(context.getFirstToken(node, 1)); // 0 is `{`.
|
56
|
+
},
|
57
|
+
|
58
|
+
/**
|
59
|
+
* Checks tokens from this MethodDefinition to the next MethodDefinition or the end of this class body.
|
60
|
+
* @param {Node} node - A MethodDefinition node of the start point.
|
61
|
+
* @returns {void}
|
62
|
+
*/
|
63
|
+
"MethodDefinition": function(node) {
|
64
|
+
checkForPartOfClassBody(context.getTokenAfter(node));
|
65
|
+
}
|
66
|
+
};
|
67
|
+
|
68
|
+
};
|
69
|
+
|
70
|
+
module.exports.schema = [];
|
@@ -1,86 +1,86 @@
|
|
1
|
-
/**
|
2
|
-
* @fileoverview Rule to flag unnecessary strict directives.
|
3
|
-
* @author Ian Christian Myers
|
4
|
-
* @copyright 2014 Ian Christian Myers. All rights reserved.
|
5
|
-
*/
|
6
|
-
"use strict";
|
7
|
-
|
8
|
-
//------------------------------------------------------------------------------
|
9
|
-
// Rule Definition
|
10
|
-
//------------------------------------------------------------------------------
|
11
|
-
|
12
|
-
module.exports = function(context) {
|
13
|
-
|
14
|
-
function directives(block) {
|
15
|
-
var ds = [], body = block.body, e, i, l;
|
16
|
-
|
17
|
-
if (body) {
|
18
|
-
for (i = 0, l = body.length; i < l; ++i) {
|
19
|
-
e = body[i];
|
20
|
-
|
21
|
-
if (
|
22
|
-
e.type === "ExpressionStatement" &&
|
23
|
-
e.expression.type === "Literal" &&
|
24
|
-
typeof e.expression.value === "string"
|
25
|
-
) {
|
26
|
-
ds.push(e.expression);
|
27
|
-
} else {
|
28
|
-
break;
|
29
|
-
}
|
30
|
-
}
|
31
|
-
}
|
32
|
-
|
33
|
-
return ds;
|
34
|
-
}
|
35
|
-
|
36
|
-
function isStrict(directive) {
|
37
|
-
return directive.value === "use strict";
|
38
|
-
}
|
39
|
-
|
40
|
-
function checkForUnnecessaryUseStrict(node) {
|
41
|
-
var useStrictDirectives = directives(node).filter(isStrict),
|
42
|
-
scope,
|
43
|
-
upper;
|
44
|
-
|
45
|
-
switch (useStrictDirectives.length) {
|
46
|
-
case 0:
|
47
|
-
break;
|
48
|
-
|
49
|
-
case 1:
|
50
|
-
scope = context.getScope();
|
51
|
-
upper = scope.upper;
|
52
|
-
|
53
|
-
if (upper && upper.functionExpressionScope) {
|
54
|
-
upper = upper.upper;
|
55
|
-
}
|
56
|
-
|
57
|
-
if (upper && upper.isStrict) {
|
58
|
-
context.report(useStrictDirectives[0], "Unnecessary 'use strict'.");
|
59
|
-
}
|
60
|
-
break;
|
61
|
-
|
62
|
-
default:
|
63
|
-
context.report(useStrictDirectives[1], "Multiple 'use strict' directives.");
|
64
|
-
}
|
65
|
-
}
|
66
|
-
|
67
|
-
return {
|
68
|
-
|
69
|
-
"Program": checkForUnnecessaryUseStrict,
|
70
|
-
|
71
|
-
"ArrowFunctionExpression": function(node) {
|
72
|
-
checkForUnnecessaryUseStrict(node.body);
|
73
|
-
},
|
74
|
-
|
75
|
-
"FunctionExpression": function(node) {
|
76
|
-
checkForUnnecessaryUseStrict(node.body);
|
77
|
-
},
|
78
|
-
|
79
|
-
"FunctionDeclaration": function(node) {
|
80
|
-
checkForUnnecessaryUseStrict(node.body);
|
81
|
-
}
|
82
|
-
};
|
83
|
-
|
84
|
-
};
|
85
|
-
|
86
|
-
module.exports.schema = [];
|
1
|
+
/**
|
2
|
+
* @fileoverview Rule to flag unnecessary strict directives.
|
3
|
+
* @author Ian Christian Myers
|
4
|
+
* @copyright 2014 Ian Christian Myers. All rights reserved.
|
5
|
+
*/
|
6
|
+
"use strict";
|
7
|
+
|
8
|
+
//------------------------------------------------------------------------------
|
9
|
+
// Rule Definition
|
10
|
+
//------------------------------------------------------------------------------
|
11
|
+
|
12
|
+
module.exports = function(context) {
|
13
|
+
|
14
|
+
function directives(block) {
|
15
|
+
var ds = [], body = block.body, e, i, l;
|
16
|
+
|
17
|
+
if (body) {
|
18
|
+
for (i = 0, l = body.length; i < l; ++i) {
|
19
|
+
e = body[i];
|
20
|
+
|
21
|
+
if (
|
22
|
+
e.type === "ExpressionStatement" &&
|
23
|
+
e.expression.type === "Literal" &&
|
24
|
+
typeof e.expression.value === "string"
|
25
|
+
) {
|
26
|
+
ds.push(e.expression);
|
27
|
+
} else {
|
28
|
+
break;
|
29
|
+
}
|
30
|
+
}
|
31
|
+
}
|
32
|
+
|
33
|
+
return ds;
|
34
|
+
}
|
35
|
+
|
36
|
+
function isStrict(directive) {
|
37
|
+
return directive.value === "use strict";
|
38
|
+
}
|
39
|
+
|
40
|
+
function checkForUnnecessaryUseStrict(node) {
|
41
|
+
var useStrictDirectives = directives(node).filter(isStrict),
|
42
|
+
scope,
|
43
|
+
upper;
|
44
|
+
|
45
|
+
switch (useStrictDirectives.length) {
|
46
|
+
case 0:
|
47
|
+
break;
|
48
|
+
|
49
|
+
case 1:
|
50
|
+
scope = context.getScope();
|
51
|
+
upper = scope.upper;
|
52
|
+
|
53
|
+
if (upper && upper.functionExpressionScope) {
|
54
|
+
upper = upper.upper;
|
55
|
+
}
|
56
|
+
|
57
|
+
if (upper && upper.isStrict) {
|
58
|
+
context.report(useStrictDirectives[0], "Unnecessary 'use strict'.");
|
59
|
+
}
|
60
|
+
break;
|
61
|
+
|
62
|
+
default:
|
63
|
+
context.report(useStrictDirectives[1], "Multiple 'use strict' directives.");
|
64
|
+
}
|
65
|
+
}
|
66
|
+
|
67
|
+
return {
|
68
|
+
|
69
|
+
"Program": checkForUnnecessaryUseStrict,
|
70
|
+
|
71
|
+
"ArrowFunctionExpression": function(node) {
|
72
|
+
checkForUnnecessaryUseStrict(node.body);
|
73
|
+
},
|
74
|
+
|
75
|
+
"FunctionExpression": function(node) {
|
76
|
+
checkForUnnecessaryUseStrict(node.body);
|
77
|
+
},
|
78
|
+
|
79
|
+
"FunctionDeclaration": function(node) {
|
80
|
+
checkForUnnecessaryUseStrict(node.body);
|
81
|
+
}
|
82
|
+
};
|
83
|
+
|
84
|
+
};
|
85
|
+
|
86
|
+
module.exports.schema = [];
|
@@ -1,97 +1,97 @@
|
|
1
|
-
/**
|
2
|
-
* @fileoverview Rule to flag fall-through cases in switch statements.
|
3
|
-
* @author Matt DuVall <http://mattduvall.com/>
|
4
|
-
*/
|
5
|
-
"use strict";
|
6
|
-
|
7
|
-
|
8
|
-
var FALLTHROUGH_COMMENT = /falls\sthrough/;
|
9
|
-
|
10
|
-
//------------------------------------------------------------------------------
|
11
|
-
// Rule Definition
|
12
|
-
//------------------------------------------------------------------------------
|
13
|
-
|
14
|
-
module.exports = function(context) {
|
15
|
-
|
16
|
-
var switches = [];
|
17
|
-
|
18
|
-
return {
|
19
|
-
|
20
|
-
"SwitchCase": function(node) {
|
21
|
-
|
22
|
-
var consequent = node.consequent,
|
23
|
-
switchData = switches[switches.length - 1],
|
24
|
-
i,
|
25
|
-
comments,
|
26
|
-
comment;
|
27
|
-
|
28
|
-
/*
|
29
|
-
* Some developers wrap case bodies in blocks, so if there is just one
|
30
|
-
* node and it's a block statement, check inside.
|
31
|
-
*/
|
32
|
-
if (consequent.length === 1 && consequent[0].type === "BlockStatement") {
|
33
|
-
consequent = consequent[0];
|
34
|
-
}
|
35
|
-
|
36
|
-
// checking on previous case
|
37
|
-
if (!switchData.lastCaseClosed) {
|
38
|
-
|
39
|
-
// a fall through comment will be the last trailing comment of the last case
|
40
|
-
comments = context.getComments(switchData.lastCase).trailing;
|
41
|
-
comment = comments[comments.length - 1];
|
42
|
-
|
43
|
-
// unless the user doesn't like semicolons, in which case it's first leading comment of this case
|
44
|
-
if (!comment) {
|
45
|
-
comments = context.getComments(node).leading;
|
46
|
-
comment = comments[comments.length - 1];
|
47
|
-
}
|
48
|
-
|
49
|
-
// check for comment
|
50
|
-
if (!comment || !FALLTHROUGH_COMMENT.test(comment.value)) {
|
51
|
-
|
52
|
-
context.report(switchData.lastCase,
|
53
|
-
"Expected a \"break\" statement before \"{{code}}\".",
|
54
|
-
{ code: node.test ? "case" : "default" });
|
55
|
-
}
|
56
|
-
}
|
57
|
-
|
58
|
-
// now dealing with the current case
|
59
|
-
switchData.lastCaseClosed = false;
|
60
|
-
switchData.lastCase = node;
|
61
|
-
|
62
|
-
// try to verify using statements - go backwards as a fast path for the search
|
63
|
-
if (consequent.length) {
|
64
|
-
for (i = consequent.length - 1; i >= 0; i--) {
|
65
|
-
if (/(?:Break|Continue|Return|Throw)Statement/.test(consequent[i].type)) {
|
66
|
-
switchData.lastCaseClosed = true;
|
67
|
-
break;
|
68
|
-
}
|
69
|
-
}
|
70
|
-
} else {
|
71
|
-
// the case statement has no statements, so it must logically fall through
|
72
|
-
switchData.lastCaseClosed = true;
|
73
|
-
}
|
74
|
-
|
75
|
-
/*
|
76
|
-
* Any warnings are triggered when the next SwitchCase occurs.
|
77
|
-
* There is no need to warn on the last SwitchCase, since it can't
|
78
|
-
* fall through to anything.
|
79
|
-
*/
|
80
|
-
},
|
81
|
-
|
82
|
-
"SwitchStatement": function(node) {
|
83
|
-
switches.push({
|
84
|
-
node: node,
|
85
|
-
lastCaseClosed: true,
|
86
|
-
lastCase: null
|
87
|
-
});
|
88
|
-
},
|
89
|
-
|
90
|
-
"SwitchStatement:exit": function() {
|
91
|
-
switches.pop();
|
92
|
-
}
|
93
|
-
};
|
94
|
-
|
95
|
-
};
|
96
|
-
|
97
|
-
module.exports.schema = [];
|
1
|
+
/**
|
2
|
+
* @fileoverview Rule to flag fall-through cases in switch statements.
|
3
|
+
* @author Matt DuVall <http://mattduvall.com/>
|
4
|
+
*/
|
5
|
+
"use strict";
|
6
|
+
|
7
|
+
|
8
|
+
var FALLTHROUGH_COMMENT = /falls\sthrough/;
|
9
|
+
|
10
|
+
//------------------------------------------------------------------------------
|
11
|
+
// Rule Definition
|
12
|
+
//------------------------------------------------------------------------------
|
13
|
+
|
14
|
+
module.exports = function(context) {
|
15
|
+
|
16
|
+
var switches = [];
|
17
|
+
|
18
|
+
return {
|
19
|
+
|
20
|
+
"SwitchCase": function(node) {
|
21
|
+
|
22
|
+
var consequent = node.consequent,
|
23
|
+
switchData = switches[switches.length - 1],
|
24
|
+
i,
|
25
|
+
comments,
|
26
|
+
comment;
|
27
|
+
|
28
|
+
/*
|
29
|
+
* Some developers wrap case bodies in blocks, so if there is just one
|
30
|
+
* node and it's a block statement, check inside.
|
31
|
+
*/
|
32
|
+
if (consequent.length === 1 && consequent[0].type === "BlockStatement") {
|
33
|
+
consequent = consequent[0];
|
34
|
+
}
|
35
|
+
|
36
|
+
// checking on previous case
|
37
|
+
if (!switchData.lastCaseClosed) {
|
38
|
+
|
39
|
+
// a fall through comment will be the last trailing comment of the last case
|
40
|
+
comments = context.getComments(switchData.lastCase).trailing;
|
41
|
+
comment = comments[comments.length - 1];
|
42
|
+
|
43
|
+
// unless the user doesn't like semicolons, in which case it's first leading comment of this case
|
44
|
+
if (!comment) {
|
45
|
+
comments = context.getComments(node).leading;
|
46
|
+
comment = comments[comments.length - 1];
|
47
|
+
}
|
48
|
+
|
49
|
+
// check for comment
|
50
|
+
if (!comment || !FALLTHROUGH_COMMENT.test(comment.value)) {
|
51
|
+
|
52
|
+
context.report(switchData.lastCase,
|
53
|
+
"Expected a \"break\" statement before \"{{code}}\".",
|
54
|
+
{ code: node.test ? "case" : "default" });
|
55
|
+
}
|
56
|
+
}
|
57
|
+
|
58
|
+
// now dealing with the current case
|
59
|
+
switchData.lastCaseClosed = false;
|
60
|
+
switchData.lastCase = node;
|
61
|
+
|
62
|
+
// try to verify using statements - go backwards as a fast path for the search
|
63
|
+
if (consequent.length) {
|
64
|
+
for (i = consequent.length - 1; i >= 0; i--) {
|
65
|
+
if (/(?:Break|Continue|Return|Throw)Statement/.test(consequent[i].type)) {
|
66
|
+
switchData.lastCaseClosed = true;
|
67
|
+
break;
|
68
|
+
}
|
69
|
+
}
|
70
|
+
} else {
|
71
|
+
// the case statement has no statements, so it must logically fall through
|
72
|
+
switchData.lastCaseClosed = true;
|
73
|
+
}
|
74
|
+
|
75
|
+
/*
|
76
|
+
* Any warnings are triggered when the next SwitchCase occurs.
|
77
|
+
* There is no need to warn on the last SwitchCase, since it can't
|
78
|
+
* fall through to anything.
|
79
|
+
*/
|
80
|
+
},
|
81
|
+
|
82
|
+
"SwitchStatement": function(node) {
|
83
|
+
switches.push({
|
84
|
+
node: node,
|
85
|
+
lastCaseClosed: true,
|
86
|
+
lastCase: null
|
87
|
+
});
|
88
|
+
},
|
89
|
+
|
90
|
+
"SwitchStatement:exit": function() {
|
91
|
+
switches.pop();
|
92
|
+
}
|
93
|
+
};
|
94
|
+
|
95
|
+
};
|
96
|
+
|
97
|
+
module.exports.schema = [];
|
@@ -1,30 +1,30 @@
|
|
1
|
-
/**
|
2
|
-
* @fileoverview Rule to flag use of a leading/trailing decimal point in a numeric literal
|
3
|
-
* @author James Allardice
|
4
|
-
*/
|
5
|
-
|
6
|
-
"use strict";
|
7
|
-
|
8
|
-
//------------------------------------------------------------------------------
|
9
|
-
// Rule Definition
|
10
|
-
//------------------------------------------------------------------------------
|
11
|
-
|
12
|
-
module.exports = function(context) {
|
13
|
-
|
14
|
-
return {
|
15
|
-
"Literal": function(node) {
|
16
|
-
|
17
|
-
if (typeof node.value === "number") {
|
18
|
-
if (node.raw.indexOf(".") === 0) {
|
19
|
-
context.report(node, "A leading decimal point can be confused with a dot.");
|
20
|
-
}
|
21
|
-
if (node.raw.indexOf(".") === node.raw.length - 1) {
|
22
|
-
context.report(node, "A trailing decimal point can be confused with a dot.");
|
23
|
-
}
|
24
|
-
}
|
25
|
-
}
|
26
|
-
};
|
27
|
-
|
28
|
-
};
|
29
|
-
|
30
|
-
module.exports.schema = [];
|
1
|
+
/**
|
2
|
+
* @fileoverview Rule to flag use of a leading/trailing decimal point in a numeric literal
|
3
|
+
* @author James Allardice
|
4
|
+
*/
|
5
|
+
|
6
|
+
"use strict";
|
7
|
+
|
8
|
+
//------------------------------------------------------------------------------
|
9
|
+
// Rule Definition
|
10
|
+
//------------------------------------------------------------------------------
|
11
|
+
|
12
|
+
module.exports = function(context) {
|
13
|
+
|
14
|
+
return {
|
15
|
+
"Literal": function(node) {
|
16
|
+
|
17
|
+
if (typeof node.value === "number") {
|
18
|
+
if (node.raw.indexOf(".") === 0) {
|
19
|
+
context.report(node, "A leading decimal point can be confused with a dot.");
|
20
|
+
}
|
21
|
+
if (node.raw.indexOf(".") === node.raw.length - 1) {
|
22
|
+
context.report(node, "A trailing decimal point can be confused with a dot.");
|
23
|
+
}
|
24
|
+
}
|
25
|
+
}
|
26
|
+
};
|
27
|
+
|
28
|
+
};
|
29
|
+
|
30
|
+
module.exports.schema = [];
|