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,43 +1,43 @@
|
|
1
|
-
/**
|
2
|
-
* @fileoverview Rule to flag use of duplicate keys in an object.
|
3
|
-
* @author Ian Christian Myers
|
4
|
-
* @copyright 2013 Ian Christian Myers. All rights reserved.
|
5
|
-
* @copyright 2013 Nicholas C. Zakas. All rights reserved.
|
6
|
-
*/
|
7
|
-
|
8
|
-
"use strict";
|
9
|
-
|
10
|
-
//------------------------------------------------------------------------------
|
11
|
-
// Rule Definition
|
12
|
-
//------------------------------------------------------------------------------
|
13
|
-
|
14
|
-
module.exports = function(context) {
|
15
|
-
|
16
|
-
return {
|
17
|
-
|
18
|
-
"ObjectExpression": function(node) {
|
19
|
-
|
20
|
-
// Object that will be a map of properties--safe because we will
|
21
|
-
// prefix all of the keys.
|
22
|
-
var nodeProps = Object.create(null);
|
23
|
-
|
24
|
-
node.properties.forEach(function(property) {
|
25
|
-
var keyName = property.key.name || property.key.value,
|
26
|
-
key = property.kind + "-" + keyName,
|
27
|
-
checkProperty = (!property.computed || property.key.type === "Literal");
|
28
|
-
|
29
|
-
if (checkProperty) {
|
30
|
-
if (nodeProps[key]) {
|
31
|
-
context.report(node, "Duplicate key '{{key}}'.", { key: keyName });
|
32
|
-
} else {
|
33
|
-
nodeProps[key] = true;
|
34
|
-
}
|
35
|
-
}
|
36
|
-
});
|
37
|
-
|
38
|
-
}
|
39
|
-
};
|
40
|
-
|
41
|
-
};
|
42
|
-
|
43
|
-
module.exports.schema = [];
|
1
|
+
/**
|
2
|
+
* @fileoverview Rule to flag use of duplicate keys in an object.
|
3
|
+
* @author Ian Christian Myers
|
4
|
+
* @copyright 2013 Ian Christian Myers. All rights reserved.
|
5
|
+
* @copyright 2013 Nicholas C. Zakas. All rights reserved.
|
6
|
+
*/
|
7
|
+
|
8
|
+
"use strict";
|
9
|
+
|
10
|
+
//------------------------------------------------------------------------------
|
11
|
+
// Rule Definition
|
12
|
+
//------------------------------------------------------------------------------
|
13
|
+
|
14
|
+
module.exports = function(context) {
|
15
|
+
|
16
|
+
return {
|
17
|
+
|
18
|
+
"ObjectExpression": function(node) {
|
19
|
+
|
20
|
+
// Object that will be a map of properties--safe because we will
|
21
|
+
// prefix all of the keys.
|
22
|
+
var nodeProps = Object.create(null);
|
23
|
+
|
24
|
+
node.properties.forEach(function(property) {
|
25
|
+
var keyName = property.key.name || property.key.value,
|
26
|
+
key = property.kind + "-" + keyName,
|
27
|
+
checkProperty = (!property.computed || property.key.type === "Literal");
|
28
|
+
|
29
|
+
if (checkProperty) {
|
30
|
+
if (nodeProps[key]) {
|
31
|
+
context.report(node, "Duplicate key '{{key}}'.", { key: keyName });
|
32
|
+
} else {
|
33
|
+
nodeProps[key] = true;
|
34
|
+
}
|
35
|
+
}
|
36
|
+
});
|
37
|
+
|
38
|
+
}
|
39
|
+
};
|
40
|
+
|
41
|
+
};
|
42
|
+
|
43
|
+
module.exports.schema = [];
|
@@ -1,67 +1,67 @@
|
|
1
|
-
/**
|
2
|
-
* @fileoverview Rule to disallow a duplicate case label.
|
3
|
-
* @author Dieter Oberkofler
|
4
|
-
* @copyright 2015 Dieter Oberkofler. All rights reserved.
|
5
|
-
*/
|
6
|
-
|
7
|
-
"use strict";
|
8
|
-
|
9
|
-
//------------------------------------------------------------------------------
|
10
|
-
// Rule Definition
|
11
|
-
//------------------------------------------------------------------------------
|
12
|
-
|
13
|
-
module.exports = function(context) {
|
14
|
-
|
15
|
-
/**
|
16
|
-
* Get a hash value for the node
|
17
|
-
* @param {ASTNode} node The node.
|
18
|
-
* @returns {string} A hash value for the node.
|
19
|
-
* @private
|
20
|
-
*/
|
21
|
-
function getHash(node) {
|
22
|
-
if (node.type === "Literal") {
|
23
|
-
return node.type + typeof node.value + node.value;
|
24
|
-
} else if (node.type === "Identifier") {
|
25
|
-
return node.type + typeof node.name + node.name;
|
26
|
-
} else if (node.type === "MemberExpression") {
|
27
|
-
return node.type + getHash(node.object) + getHash(node.property);
|
28
|
-
} else if (node.type === "CallExpression") {
|
29
|
-
return node.type + getHash(node.callee) + node.arguments.map(getHash).join("");
|
30
|
-
} else if (node.type === "BinaryExpression") {
|
31
|
-
return node.type + getHash(node.left) + node.operator + getHash(node.right);
|
32
|
-
} else if (node.type === "ConditionalExpression") {
|
33
|
-
return node.type + getHash(node.test) + getHash(node.consequent) + getHash(node.alternate);
|
34
|
-
}
|
35
|
-
}
|
36
|
-
|
37
|
-
var switchStatement = [];
|
38
|
-
|
39
|
-
return {
|
40
|
-
|
41
|
-
"SwitchStatement": function(/*node*/) {
|
42
|
-
switchStatement.push({});
|
43
|
-
},
|
44
|
-
|
45
|
-
"SwitchStatement:exit": function(/*node*/) {
|
46
|
-
switchStatement.pop();
|
47
|
-
},
|
48
|
-
|
49
|
-
"SwitchCase": function(node) {
|
50
|
-
var currentSwitch = switchStatement[switchStatement.length - 1],
|
51
|
-
hashValue;
|
52
|
-
|
53
|
-
if (node.test) {
|
54
|
-
hashValue = getHash(node.test);
|
55
|
-
if (typeof hashValue !== "undefined" && currentSwitch.hasOwnProperty(hashValue)) {
|
56
|
-
context.report(node, "Duplicate case label.");
|
57
|
-
} else {
|
58
|
-
currentSwitch[hashValue] = true;
|
59
|
-
}
|
60
|
-
}
|
61
|
-
}
|
62
|
-
|
63
|
-
};
|
64
|
-
|
65
|
-
};
|
66
|
-
|
67
|
-
module.exports.schema = [];
|
1
|
+
/**
|
2
|
+
* @fileoverview Rule to disallow a duplicate case label.
|
3
|
+
* @author Dieter Oberkofler
|
4
|
+
* @copyright 2015 Dieter Oberkofler. All rights reserved.
|
5
|
+
*/
|
6
|
+
|
7
|
+
"use strict";
|
8
|
+
|
9
|
+
//------------------------------------------------------------------------------
|
10
|
+
// Rule Definition
|
11
|
+
//------------------------------------------------------------------------------
|
12
|
+
|
13
|
+
module.exports = function(context) {
|
14
|
+
|
15
|
+
/**
|
16
|
+
* Get a hash value for the node
|
17
|
+
* @param {ASTNode} node The node.
|
18
|
+
* @returns {string} A hash value for the node.
|
19
|
+
* @private
|
20
|
+
*/
|
21
|
+
function getHash(node) {
|
22
|
+
if (node.type === "Literal") {
|
23
|
+
return node.type + typeof node.value + node.value;
|
24
|
+
} else if (node.type === "Identifier") {
|
25
|
+
return node.type + typeof node.name + node.name;
|
26
|
+
} else if (node.type === "MemberExpression") {
|
27
|
+
return node.type + getHash(node.object) + getHash(node.property);
|
28
|
+
} else if (node.type === "CallExpression") {
|
29
|
+
return node.type + getHash(node.callee) + node.arguments.map(getHash).join("");
|
30
|
+
} else if (node.type === "BinaryExpression") {
|
31
|
+
return node.type + getHash(node.left) + node.operator + getHash(node.right);
|
32
|
+
} else if (node.type === "ConditionalExpression") {
|
33
|
+
return node.type + getHash(node.test) + getHash(node.consequent) + getHash(node.alternate);
|
34
|
+
}
|
35
|
+
}
|
36
|
+
|
37
|
+
var switchStatement = [];
|
38
|
+
|
39
|
+
return {
|
40
|
+
|
41
|
+
"SwitchStatement": function(/*node*/) {
|
42
|
+
switchStatement.push({});
|
43
|
+
},
|
44
|
+
|
45
|
+
"SwitchStatement:exit": function(/*node*/) {
|
46
|
+
switchStatement.pop();
|
47
|
+
},
|
48
|
+
|
49
|
+
"SwitchCase": function(node) {
|
50
|
+
var currentSwitch = switchStatement[switchStatement.length - 1],
|
51
|
+
hashValue;
|
52
|
+
|
53
|
+
if (node.test) {
|
54
|
+
hashValue = getHash(node.test);
|
55
|
+
if (typeof hashValue !== "undefined" && currentSwitch.hasOwnProperty(hashValue)) {
|
56
|
+
context.report(node, "Duplicate case label.");
|
57
|
+
} else {
|
58
|
+
currentSwitch[hashValue] = true;
|
59
|
+
}
|
60
|
+
}
|
61
|
+
}
|
62
|
+
|
63
|
+
};
|
64
|
+
|
65
|
+
};
|
66
|
+
|
67
|
+
module.exports.schema = [];
|
@@ -1,125 +1,125 @@
|
|
1
|
-
/**
|
2
|
-
* @fileoverview Rule to flag `else` after a `return` in `if`
|
3
|
-
* @author Ian Christian Myers
|
4
|
-
*/
|
5
|
-
|
6
|
-
"use strict";
|
7
|
-
|
8
|
-
//------------------------------------------------------------------------------
|
9
|
-
// Rule Definition
|
10
|
-
//------------------------------------------------------------------------------
|
11
|
-
|
12
|
-
module.exports = function(context) {
|
13
|
-
|
14
|
-
//--------------------------------------------------------------------------
|
15
|
-
// Helpers
|
16
|
-
//--------------------------------------------------------------------------
|
17
|
-
|
18
|
-
/**
|
19
|
-
* Display the context report if rule is violated
|
20
|
-
*
|
21
|
-
* @param {Node} node The 'else' node
|
22
|
-
* @returns {void}
|
23
|
-
*/
|
24
|
-
function displayReport(node) {
|
25
|
-
context.report(node, "Unexpected 'else' after 'return'.");
|
26
|
-
}
|
27
|
-
|
28
|
-
/**
|
29
|
-
* Check to see if the node is a ReturnStatement
|
30
|
-
*
|
31
|
-
* @param {Node} node The node being evaluated
|
32
|
-
* @returns {boolean} True if node is a return
|
33
|
-
*/
|
34
|
-
function checkForReturn(node) {
|
35
|
-
return node.type === "ReturnStatement";
|
36
|
-
}
|
37
|
-
|
38
|
-
/**
|
39
|
-
* Naive return checking, does not iterate through the whole
|
40
|
-
* BlockStatement because we make the assumption that the ReturnStatement
|
41
|
-
* will be the last node in the body of the BlockStatement.
|
42
|
-
*
|
43
|
-
* @param {Node} node The consequent/alternate node
|
44
|
-
* @returns {boolean} True if it has a return
|
45
|
-
*/
|
46
|
-
function naiveHasReturn(node) {
|
47
|
-
if (node.type === "BlockStatement") {
|
48
|
-
var body = node.body,
|
49
|
-
lastChildNode = body[body.length - 1];
|
50
|
-
|
51
|
-
return lastChildNode && checkForReturn(lastChildNode);
|
52
|
-
}
|
53
|
-
return checkForReturn(node);
|
54
|
-
}
|
55
|
-
|
56
|
-
/**
|
57
|
-
* Check to see if the node is valid for evaluation,
|
58
|
-
* meaning it has an else and not an else-if
|
59
|
-
*
|
60
|
-
* @param {Node} node The node being evaluated
|
61
|
-
* @returns {boolean} True if the node is valid
|
62
|
-
*/
|
63
|
-
function hasElse(node) {
|
64
|
-
return node.alternate && node.consequent && node.alternate.type !== "IfStatement";
|
65
|
-
}
|
66
|
-
|
67
|
-
/**
|
68
|
-
* If the consequent is an IfStatement, check to see if it has an else
|
69
|
-
* and both its consequent and alternate path return, meaning this is
|
70
|
-
* a nested case of rule violation. If-Else not considered currently.
|
71
|
-
*
|
72
|
-
* @param {Node} node The consequent node
|
73
|
-
* @returns {boolean} True if this is a nested rule violation
|
74
|
-
*/
|
75
|
-
function checkForIf(node) {
|
76
|
-
return node.type === "IfStatement" && hasElse(node) &&
|
77
|
-
naiveHasReturn(node.alternate) && naiveHasReturn(node.consequent);
|
78
|
-
}
|
79
|
-
|
80
|
-
/**
|
81
|
-
* Check the consequent/body node to make sure it is not
|
82
|
-
* a ReturnStatement or an IfStatement that returns on both
|
83
|
-
* code paths. If it is, display the context report.
|
84
|
-
*
|
85
|
-
* @param {Node} node The consequent or body node
|
86
|
-
* @param {Node} alternate The alternate node
|
87
|
-
* @returns {void}
|
88
|
-
*/
|
89
|
-
function checkForReturnOrIf(node, alternate) {
|
90
|
-
if (checkForReturn(node) || checkForIf(node)) {
|
91
|
-
displayReport(alternate);
|
92
|
-
}
|
93
|
-
}
|
94
|
-
|
95
|
-
//--------------------------------------------------------------------------
|
96
|
-
// Public API
|
97
|
-
//--------------------------------------------------------------------------
|
98
|
-
|
99
|
-
return {
|
100
|
-
|
101
|
-
"IfStatement": function (node) {
|
102
|
-
// Don't bother finding a ReturnStatement, if there's no `else`
|
103
|
-
// or if the alternate is also an if (indicating an else if).
|
104
|
-
if (hasElse(node)) {
|
105
|
-
var consequent = node.consequent,
|
106
|
-
alternate = node.alternate;
|
107
|
-
// If we have a BlockStatement, check each consequent body node.
|
108
|
-
if (consequent.type === "BlockStatement") {
|
109
|
-
var body = consequent.body;
|
110
|
-
body.forEach(function (bodyNode) {
|
111
|
-
checkForReturnOrIf(bodyNode, alternate);
|
112
|
-
});
|
113
|
-
// If not a block statement, make sure the consequent isn't a ReturnStatement
|
114
|
-
// or an IfStatement with returns on both paths
|
115
|
-
} else {
|
116
|
-
checkForReturnOrIf(consequent, alternate);
|
117
|
-
}
|
118
|
-
}
|
119
|
-
}
|
120
|
-
|
121
|
-
};
|
122
|
-
|
123
|
-
};
|
124
|
-
|
125
|
-
module.exports.schema = [];
|
1
|
+
/**
|
2
|
+
* @fileoverview Rule to flag `else` after a `return` in `if`
|
3
|
+
* @author Ian Christian Myers
|
4
|
+
*/
|
5
|
+
|
6
|
+
"use strict";
|
7
|
+
|
8
|
+
//------------------------------------------------------------------------------
|
9
|
+
// Rule Definition
|
10
|
+
//------------------------------------------------------------------------------
|
11
|
+
|
12
|
+
module.exports = function(context) {
|
13
|
+
|
14
|
+
//--------------------------------------------------------------------------
|
15
|
+
// Helpers
|
16
|
+
//--------------------------------------------------------------------------
|
17
|
+
|
18
|
+
/**
|
19
|
+
* Display the context report if rule is violated
|
20
|
+
*
|
21
|
+
* @param {Node} node The 'else' node
|
22
|
+
* @returns {void}
|
23
|
+
*/
|
24
|
+
function displayReport(node) {
|
25
|
+
context.report(node, "Unexpected 'else' after 'return'.");
|
26
|
+
}
|
27
|
+
|
28
|
+
/**
|
29
|
+
* Check to see if the node is a ReturnStatement
|
30
|
+
*
|
31
|
+
* @param {Node} node The node being evaluated
|
32
|
+
* @returns {boolean} True if node is a return
|
33
|
+
*/
|
34
|
+
function checkForReturn(node) {
|
35
|
+
return node.type === "ReturnStatement";
|
36
|
+
}
|
37
|
+
|
38
|
+
/**
|
39
|
+
* Naive return checking, does not iterate through the whole
|
40
|
+
* BlockStatement because we make the assumption that the ReturnStatement
|
41
|
+
* will be the last node in the body of the BlockStatement.
|
42
|
+
*
|
43
|
+
* @param {Node} node The consequent/alternate node
|
44
|
+
* @returns {boolean} True if it has a return
|
45
|
+
*/
|
46
|
+
function naiveHasReturn(node) {
|
47
|
+
if (node.type === "BlockStatement") {
|
48
|
+
var body = node.body,
|
49
|
+
lastChildNode = body[body.length - 1];
|
50
|
+
|
51
|
+
return lastChildNode && checkForReturn(lastChildNode);
|
52
|
+
}
|
53
|
+
return checkForReturn(node);
|
54
|
+
}
|
55
|
+
|
56
|
+
/**
|
57
|
+
* Check to see if the node is valid for evaluation,
|
58
|
+
* meaning it has an else and not an else-if
|
59
|
+
*
|
60
|
+
* @param {Node} node The node being evaluated
|
61
|
+
* @returns {boolean} True if the node is valid
|
62
|
+
*/
|
63
|
+
function hasElse(node) {
|
64
|
+
return node.alternate && node.consequent && node.alternate.type !== "IfStatement";
|
65
|
+
}
|
66
|
+
|
67
|
+
/**
|
68
|
+
* If the consequent is an IfStatement, check to see if it has an else
|
69
|
+
* and both its consequent and alternate path return, meaning this is
|
70
|
+
* a nested case of rule violation. If-Else not considered currently.
|
71
|
+
*
|
72
|
+
* @param {Node} node The consequent node
|
73
|
+
* @returns {boolean} True if this is a nested rule violation
|
74
|
+
*/
|
75
|
+
function checkForIf(node) {
|
76
|
+
return node.type === "IfStatement" && hasElse(node) &&
|
77
|
+
naiveHasReturn(node.alternate) && naiveHasReturn(node.consequent);
|
78
|
+
}
|
79
|
+
|
80
|
+
/**
|
81
|
+
* Check the consequent/body node to make sure it is not
|
82
|
+
* a ReturnStatement or an IfStatement that returns on both
|
83
|
+
* code paths. If it is, display the context report.
|
84
|
+
*
|
85
|
+
* @param {Node} node The consequent or body node
|
86
|
+
* @param {Node} alternate The alternate node
|
87
|
+
* @returns {void}
|
88
|
+
*/
|
89
|
+
function checkForReturnOrIf(node, alternate) {
|
90
|
+
if (checkForReturn(node) || checkForIf(node)) {
|
91
|
+
displayReport(alternate);
|
92
|
+
}
|
93
|
+
}
|
94
|
+
|
95
|
+
//--------------------------------------------------------------------------
|
96
|
+
// Public API
|
97
|
+
//--------------------------------------------------------------------------
|
98
|
+
|
99
|
+
return {
|
100
|
+
|
101
|
+
"IfStatement": function (node) {
|
102
|
+
// Don't bother finding a ReturnStatement, if there's no `else`
|
103
|
+
// or if the alternate is also an if (indicating an else if).
|
104
|
+
if (hasElse(node)) {
|
105
|
+
var consequent = node.consequent,
|
106
|
+
alternate = node.alternate;
|
107
|
+
// If we have a BlockStatement, check each consequent body node.
|
108
|
+
if (consequent.type === "BlockStatement") {
|
109
|
+
var body = consequent.body;
|
110
|
+
body.forEach(function (bodyNode) {
|
111
|
+
checkForReturnOrIf(bodyNode, alternate);
|
112
|
+
});
|
113
|
+
// If not a block statement, make sure the consequent isn't a ReturnStatement
|
114
|
+
// or an IfStatement with returns on both paths
|
115
|
+
} else {
|
116
|
+
checkForReturnOrIf(consequent, alternate);
|
117
|
+
}
|
118
|
+
}
|
119
|
+
}
|
120
|
+
|
121
|
+
};
|
122
|
+
|
123
|
+
};
|
124
|
+
|
125
|
+
module.exports.schema = [];
|
@@ -1,43 +1,43 @@
|
|
1
|
-
/**
|
2
|
-
* @fileoverview Rule to flag the use of empty character classes in regular expressions
|
3
|
-
* @author Ian Christian Myers
|
4
|
-
*/
|
5
|
-
|
6
|
-
"use strict";
|
7
|
-
|
8
|
-
//------------------------------------------------------------------------------
|
9
|
-
// Helpers
|
10
|
-
//------------------------------------------------------------------------------
|
11
|
-
|
12
|
-
/*
|
13
|
-
plain-English description of the following regexp:
|
14
|
-
0. `^` fix the match at the beginning of the string
|
15
|
-
1. `\/`: the `/` that begins the regexp
|
16
|
-
2. `([^\\[]|\\.|\[([^\\\]]|\\.)+\])*`: regexp contents; 0 or more of the following
|
17
|
-
2.0. `[^\\[]`: any character that's not a `\` or a `[` (anything but escape sequences and character classes)
|
18
|
-
2.1. `\\.`: an escape sequence
|
19
|
-
2.2. `\[([^\\\]]|\\.)+\]`: a character class that isn't empty
|
20
|
-
3. `\/` the `/` that ends the regexp
|
21
|
-
4. `[
|
22
|
-
5. `$`: fix the match at the end of the string
|
23
|
-
*/
|
24
|
-
var regex = /^\/([^\\[]|\\.|\[([^\\\]]|\\.)+\])*\/[
|
25
|
-
|
26
|
-
//------------------------------------------------------------------------------
|
27
|
-
// Rule Definition
|
28
|
-
//------------------------------------------------------------------------------
|
29
|
-
|
30
|
-
module.exports = function(context) {
|
31
|
-
|
32
|
-
return {
|
33
|
-
|
34
|
-
"Literal": function(node) {
|
35
|
-
var token = context.getFirstToken(node);
|
36
|
-
if (token.type === "RegularExpression" && !regex.test(token.value)) {
|
37
|
-
context.report(node, "Empty class.");
|
38
|
-
}
|
39
|
-
}
|
40
|
-
|
41
|
-
};
|
42
|
-
|
43
|
-
};
|
1
|
+
/**
|
2
|
+
* @fileoverview Rule to flag the use of empty character classes in regular expressions
|
3
|
+
* @author Ian Christian Myers
|
4
|
+
*/
|
5
|
+
|
6
|
+
"use strict";
|
7
|
+
|
8
|
+
//------------------------------------------------------------------------------
|
9
|
+
// Helpers
|
10
|
+
//------------------------------------------------------------------------------
|
11
|
+
|
12
|
+
/*
|
13
|
+
plain-English description of the following regexp:
|
14
|
+
0. `^` fix the match at the beginning of the string
|
15
|
+
1. `\/`: the `/` that begins the regexp
|
16
|
+
2. `([^\\[]|\\.|\[([^\\\]]|\\.)+\])*`: regexp contents; 0 or more of the following
|
17
|
+
2.0. `[^\\[]`: any character that's not a `\` or a `[` (anything but escape sequences and character classes)
|
18
|
+
2.1. `\\.`: an escape sequence
|
19
|
+
2.2. `\[([^\\\]]|\\.)+\]`: a character class that isn't empty
|
20
|
+
3. `\/` the `/` that ends the regexp
|
21
|
+
4. `[gimuy]*`: optional regexp flags
|
22
|
+
5. `$`: fix the match at the end of the string
|
23
|
+
*/
|
24
|
+
var regex = /^\/([^\\[]|\\.|\[([^\\\]]|\\.)+\])*\/[gimuy]*$/;
|
25
|
+
|
26
|
+
//------------------------------------------------------------------------------
|
27
|
+
// Rule Definition
|
28
|
+
//------------------------------------------------------------------------------
|
29
|
+
|
30
|
+
module.exports = function(context) {
|
31
|
+
|
32
|
+
return {
|
33
|
+
|
34
|
+
"Literal": function(node) {
|
35
|
+
var token = context.getFirstToken(node);
|
36
|
+
if (token.type === "RegularExpression" && !regex.test(token.value)) {
|
37
|
+
context.report(node, "Empty class.");
|
38
|
+
}
|
39
|
+
}
|
40
|
+
|
41
|
+
};
|
42
|
+
|
43
|
+
};
|
@@ -1,45 +1,45 @@
|
|
1
|
-
/**
|
2
|
-
* @fileoverview Rule to flag the use of empty character classes in regular expressions
|
3
|
-
* @author Ian Christian Myers
|
4
|
-
*/
|
5
|
-
|
6
|
-
"use strict";
|
7
|
-
|
8
|
-
//------------------------------------------------------------------------------
|
9
|
-
// Helpers
|
10
|
-
//------------------------------------------------------------------------------
|
11
|
-
|
12
|
-
/*
|
13
|
-
plain-English description of the following regexp:
|
14
|
-
0. `^` fix the match at the beginning of the string
|
15
|
-
1. `\/`: the `/` that begins the regexp
|
16
|
-
2. `([^\\[]|\\.|\[([^\\\]]|\\.)+\])*`: regexp contents; 0 or more of the following
|
17
|
-
2.0. `[^\\[]`: any character that's not a `\` or a `[` (anything but escape sequences and character classes)
|
18
|
-
2.1. `\\.`: an escape sequence
|
19
|
-
2.2. `\[([^\\\]]|\\.)+\]`: a character class that isn't empty
|
20
|
-
3. `\/` the `/` that ends the regexp
|
21
|
-
4. `[gimy]*`: optional regexp flags
|
22
|
-
5. `$`: fix the match at the end of the string
|
23
|
-
*/
|
24
|
-
var regex = /^\/([^\\[]|\\.|\[([^\\\]]|\\.)+\])*\/[gimy]*$/;
|
25
|
-
|
26
|
-
//------------------------------------------------------------------------------
|
27
|
-
// Rule Definition
|
28
|
-
//------------------------------------------------------------------------------
|
29
|
-
|
30
|
-
module.exports = function(context) {
|
31
|
-
|
32
|
-
return {
|
33
|
-
|
34
|
-
"Literal": function(node) {
|
35
|
-
var token = context.getFirstToken(node);
|
36
|
-
if (token.type === "RegularExpression" && !regex.test(token.value)) {
|
37
|
-
context.report(node, "Empty class.");
|
38
|
-
}
|
39
|
-
}
|
40
|
-
|
41
|
-
};
|
42
|
-
|
43
|
-
};
|
44
|
-
|
45
|
-
module.exports.schema = [];
|
1
|
+
/**
|
2
|
+
* @fileoverview Rule to flag the use of empty character classes in regular expressions
|
3
|
+
* @author Ian Christian Myers
|
4
|
+
*/
|
5
|
+
|
6
|
+
"use strict";
|
7
|
+
|
8
|
+
//------------------------------------------------------------------------------
|
9
|
+
// Helpers
|
10
|
+
//------------------------------------------------------------------------------
|
11
|
+
|
12
|
+
/*
|
13
|
+
plain-English description of the following regexp:
|
14
|
+
0. `^` fix the match at the beginning of the string
|
15
|
+
1. `\/`: the `/` that begins the regexp
|
16
|
+
2. `([^\\[]|\\.|\[([^\\\]]|\\.)+\])*`: regexp contents; 0 or more of the following
|
17
|
+
2.0. `[^\\[]`: any character that's not a `\` or a `[` (anything but escape sequences and character classes)
|
18
|
+
2.1. `\\.`: an escape sequence
|
19
|
+
2.2. `\[([^\\\]]|\\.)+\]`: a character class that isn't empty
|
20
|
+
3. `\/` the `/` that ends the regexp
|
21
|
+
4. `[gimy]*`: optional regexp flags
|
22
|
+
5. `$`: fix the match at the end of the string
|
23
|
+
*/
|
24
|
+
var regex = /^\/([^\\[]|\\.|\[([^\\\]]|\\.)+\])*\/[gimy]*$/;
|
25
|
+
|
26
|
+
//------------------------------------------------------------------------------
|
27
|
+
// Rule Definition
|
28
|
+
//------------------------------------------------------------------------------
|
29
|
+
|
30
|
+
module.exports = function(context) {
|
31
|
+
|
32
|
+
return {
|
33
|
+
|
34
|
+
"Literal": function(node) {
|
35
|
+
var token = context.getFirstToken(node);
|
36
|
+
if (token.type === "RegularExpression" && !regex.test(token.value)) {
|
37
|
+
context.report(node, "Empty class.");
|
38
|
+
}
|
39
|
+
}
|
40
|
+
|
41
|
+
};
|
42
|
+
|
43
|
+
};
|
44
|
+
|
45
|
+
module.exports.schema = [];
|