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/no-bitwise.js
CHANGED
@@ -1,57 +1,57 @@
|
|
1
|
-
/**
|
2
|
-
* @fileoverview Rule to flag bitwise identifiers
|
3
|
-
* @author Nicholas C. Zakas
|
4
|
-
*/
|
5
|
-
|
6
|
-
"use strict";
|
7
|
-
|
8
|
-
//------------------------------------------------------------------------------
|
9
|
-
// Rule Definition
|
10
|
-
//------------------------------------------------------------------------------
|
11
|
-
|
12
|
-
module.exports = function(context) {
|
13
|
-
|
14
|
-
var BITWISE_OPERATORS = [
|
15
|
-
"^", "|", "&", "<<", ">>", ">>>",
|
16
|
-
"^=", "|=", "&=", "<<=", ">>=", ">>>=",
|
17
|
-
"~"
|
18
|
-
];
|
19
|
-
|
20
|
-
/**
|
21
|
-
* Reports an unexpected use of a bitwise operator.
|
22
|
-
* @param {ASTNode} node Node which contains the bitwise operator.
|
23
|
-
* @returns {void}
|
24
|
-
*/
|
25
|
-
function report(node) {
|
26
|
-
context.report(node, "Unexpected use of '{{operator}}'.", { operator: node.operator });
|
27
|
-
}
|
28
|
-
|
29
|
-
/**
|
30
|
-
* Checks if the given node has a bitwise operator.
|
31
|
-
* @param {ASTNode} node The node to check.
|
32
|
-
* @returns {boolean} Whether or not the node has a bitwise operator.
|
33
|
-
*/
|
34
|
-
function hasBitwiseOperator(node) {
|
35
|
-
return BITWISE_OPERATORS.indexOf(node.operator) !== -1;
|
36
|
-
}
|
37
|
-
|
38
|
-
/**
|
39
|
-
* Report if the given node contains a bitwise operator.
|
40
|
-
* @param {ASTNode} node The node to check.
|
41
|
-
* @returns {void}
|
42
|
-
*/
|
43
|
-
function checkNodeForBitwiseOperator(node) {
|
44
|
-
if (hasBitwiseOperator(node)) {
|
45
|
-
report(node);
|
46
|
-
}
|
47
|
-
}
|
48
|
-
|
49
|
-
return {
|
50
|
-
"AssignmentExpression": checkNodeForBitwiseOperator,
|
51
|
-
"BinaryExpression": checkNodeForBitwiseOperator,
|
52
|
-
"UnaryExpression": checkNodeForBitwiseOperator
|
53
|
-
};
|
54
|
-
|
55
|
-
};
|
56
|
-
|
57
|
-
module.exports.schema = [];
|
1
|
+
/**
|
2
|
+
* @fileoverview Rule to flag bitwise identifiers
|
3
|
+
* @author Nicholas C. Zakas
|
4
|
+
*/
|
5
|
+
|
6
|
+
"use strict";
|
7
|
+
|
8
|
+
//------------------------------------------------------------------------------
|
9
|
+
// Rule Definition
|
10
|
+
//------------------------------------------------------------------------------
|
11
|
+
|
12
|
+
module.exports = function(context) {
|
13
|
+
|
14
|
+
var BITWISE_OPERATORS = [
|
15
|
+
"^", "|", "&", "<<", ">>", ">>>",
|
16
|
+
"^=", "|=", "&=", "<<=", ">>=", ">>>=",
|
17
|
+
"~"
|
18
|
+
];
|
19
|
+
|
20
|
+
/**
|
21
|
+
* Reports an unexpected use of a bitwise operator.
|
22
|
+
* @param {ASTNode} node Node which contains the bitwise operator.
|
23
|
+
* @returns {void}
|
24
|
+
*/
|
25
|
+
function report(node) {
|
26
|
+
context.report(node, "Unexpected use of '{{operator}}'.", { operator: node.operator });
|
27
|
+
}
|
28
|
+
|
29
|
+
/**
|
30
|
+
* Checks if the given node has a bitwise operator.
|
31
|
+
* @param {ASTNode} node The node to check.
|
32
|
+
* @returns {boolean} Whether or not the node has a bitwise operator.
|
33
|
+
*/
|
34
|
+
function hasBitwiseOperator(node) {
|
35
|
+
return BITWISE_OPERATORS.indexOf(node.operator) !== -1;
|
36
|
+
}
|
37
|
+
|
38
|
+
/**
|
39
|
+
* Report if the given node contains a bitwise operator.
|
40
|
+
* @param {ASTNode} node The node to check.
|
41
|
+
* @returns {void}
|
42
|
+
*/
|
43
|
+
function checkNodeForBitwiseOperator(node) {
|
44
|
+
if (hasBitwiseOperator(node)) {
|
45
|
+
report(node);
|
46
|
+
}
|
47
|
+
}
|
48
|
+
|
49
|
+
return {
|
50
|
+
"AssignmentExpression": checkNodeForBitwiseOperator,
|
51
|
+
"BinaryExpression": checkNodeForBitwiseOperator,
|
52
|
+
"UnaryExpression": checkNodeForBitwiseOperator
|
53
|
+
};
|
54
|
+
|
55
|
+
};
|
56
|
+
|
57
|
+
module.exports.schema = [];
|
package/lib/rules/no-caller.js
CHANGED
@@ -1,29 +1,29 @@
|
|
1
|
-
/**
|
2
|
-
* @fileoverview Rule to flag use of arguments.callee and arguments.caller.
|
3
|
-
* @author Nicholas C. Zakas
|
4
|
-
*/
|
5
|
-
|
6
|
-
"use strict";
|
7
|
-
|
8
|
-
//------------------------------------------------------------------------------
|
9
|
-
// Rule Definition
|
10
|
-
//------------------------------------------------------------------------------
|
11
|
-
|
12
|
-
module.exports = function(context) {
|
13
|
-
|
14
|
-
return {
|
15
|
-
|
16
|
-
"MemberExpression": function(node) {
|
17
|
-
var objectName = node.object.name,
|
18
|
-
propertyName = node.property.name;
|
19
|
-
|
20
|
-
if (objectName === "arguments" && !node.computed && propertyName && propertyName.match(/^calle[er]$/)) {
|
21
|
-
context.report(node, "Avoid arguments.{{property}}.", { property: propertyName });
|
22
|
-
}
|
23
|
-
|
24
|
-
}
|
25
|
-
};
|
26
|
-
|
27
|
-
};
|
28
|
-
|
29
|
-
module.exports.schema = [];
|
1
|
+
/**
|
2
|
+
* @fileoverview Rule to flag use of arguments.callee and arguments.caller.
|
3
|
+
* @author Nicholas C. Zakas
|
4
|
+
*/
|
5
|
+
|
6
|
+
"use strict";
|
7
|
+
|
8
|
+
//------------------------------------------------------------------------------
|
9
|
+
// Rule Definition
|
10
|
+
//------------------------------------------------------------------------------
|
11
|
+
|
12
|
+
module.exports = function(context) {
|
13
|
+
|
14
|
+
return {
|
15
|
+
|
16
|
+
"MemberExpression": function(node) {
|
17
|
+
var objectName = node.object.name,
|
18
|
+
propertyName = node.property.name;
|
19
|
+
|
20
|
+
if (objectName === "arguments" && !node.computed && propertyName && propertyName.match(/^calle[er]$/)) {
|
21
|
+
context.report(node, "Avoid arguments.{{property}}.", { property: propertyName });
|
22
|
+
}
|
23
|
+
|
24
|
+
}
|
25
|
+
};
|
26
|
+
|
27
|
+
};
|
28
|
+
|
29
|
+
module.exports.schema = [];
|
@@ -1,52 +1,52 @@
|
|
1
|
-
/**
|
2
|
-
* @fileoverview Rule to flag variable leak in CatchClauses in IE 8 and earlier
|
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
|
-
function paramIsShadowing(scope, name) {
|
19
|
-
var found = scope.variables.some(function(variable) {
|
20
|
-
return variable.name === name;
|
21
|
-
});
|
22
|
-
|
23
|
-
if (found) {
|
24
|
-
return true;
|
25
|
-
}
|
26
|
-
|
27
|
-
if (scope.upper) {
|
28
|
-
return paramIsShadowing(scope.upper, name);
|
29
|
-
}
|
30
|
-
|
31
|
-
return false;
|
32
|
-
}
|
33
|
-
|
34
|
-
//--------------------------------------------------------------------------
|
35
|
-
// Public API
|
36
|
-
//--------------------------------------------------------------------------
|
37
|
-
|
38
|
-
return {
|
39
|
-
|
40
|
-
"CatchClause": function(node) {
|
41
|
-
var scope = context.getScope();
|
42
|
-
|
43
|
-
if (paramIsShadowing(scope, node.param.name)) {
|
44
|
-
context.report(node, "Value of '{{name}}' may be overwritten in IE 8 and earlier.",
|
45
|
-
{ name: node.param.name });
|
46
|
-
}
|
47
|
-
}
|
48
|
-
};
|
49
|
-
|
50
|
-
};
|
51
|
-
|
52
|
-
module.exports.schema = [];
|
1
|
+
/**
|
2
|
+
* @fileoverview Rule to flag variable leak in CatchClauses in IE 8 and earlier
|
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
|
+
function paramIsShadowing(scope, name) {
|
19
|
+
var found = scope.variables.some(function(variable) {
|
20
|
+
return variable.name === name;
|
21
|
+
});
|
22
|
+
|
23
|
+
if (found) {
|
24
|
+
return true;
|
25
|
+
}
|
26
|
+
|
27
|
+
if (scope.upper) {
|
28
|
+
return paramIsShadowing(scope.upper, name);
|
29
|
+
}
|
30
|
+
|
31
|
+
return false;
|
32
|
+
}
|
33
|
+
|
34
|
+
//--------------------------------------------------------------------------
|
35
|
+
// Public API
|
36
|
+
//--------------------------------------------------------------------------
|
37
|
+
|
38
|
+
return {
|
39
|
+
|
40
|
+
"CatchClause": function(node) {
|
41
|
+
var scope = context.getScope();
|
42
|
+
|
43
|
+
if (paramIsShadowing(scope, node.param.name)) {
|
44
|
+
context.report(node, "Value of '{{name}}' may be overwritten in IE 8 and earlier.",
|
45
|
+
{ name: node.param.name });
|
46
|
+
}
|
47
|
+
}
|
48
|
+
};
|
49
|
+
|
50
|
+
};
|
51
|
+
|
52
|
+
module.exports.schema = [];
|
@@ -1,45 +1,45 @@
|
|
1
|
-
/**
|
2
|
-
* @fileoverview Rule to flag trailing commas in object literals.
|
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
|
-
function checkForTrailingComma(node) {
|
19
|
-
var items = node.properties || node.elements,
|
20
|
-
length = items.length,
|
21
|
-
lastItem, penultimateToken;
|
22
|
-
|
23
|
-
if (length) {
|
24
|
-
lastItem = items[length - 1];
|
25
|
-
if (lastItem) {
|
26
|
-
penultimateToken = context.getLastToken(node, 1);
|
27
|
-
if (penultimateToken.value === ",") {
|
28
|
-
context.report(lastItem, penultimateToken.loc.start, "Trailing comma.");
|
29
|
-
}
|
30
|
-
}
|
31
|
-
}
|
32
|
-
}
|
33
|
-
|
34
|
-
//--------------------------------------------------------------------------
|
35
|
-
// Public API
|
36
|
-
//--------------------------------------------------------------------------
|
37
|
-
|
38
|
-
return {
|
39
|
-
"ObjectExpression": checkForTrailingComma,
|
40
|
-
"ArrayExpression": checkForTrailingComma
|
41
|
-
};
|
42
|
-
|
43
|
-
};
|
44
|
-
|
45
|
-
module.exports.schema = [];
|
1
|
+
/**
|
2
|
+
* @fileoverview Rule to flag trailing commas in object literals.
|
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
|
+
function checkForTrailingComma(node) {
|
19
|
+
var items = node.properties || node.elements,
|
20
|
+
length = items.length,
|
21
|
+
lastItem, penultimateToken;
|
22
|
+
|
23
|
+
if (length) {
|
24
|
+
lastItem = items[length - 1];
|
25
|
+
if (lastItem) {
|
26
|
+
penultimateToken = context.getLastToken(node, 1);
|
27
|
+
if (penultimateToken.value === ",") {
|
28
|
+
context.report(lastItem, penultimateToken.loc.start, "Trailing comma.");
|
29
|
+
}
|
30
|
+
}
|
31
|
+
}
|
32
|
+
}
|
33
|
+
|
34
|
+
//--------------------------------------------------------------------------
|
35
|
+
// Public API
|
36
|
+
//--------------------------------------------------------------------------
|
37
|
+
|
38
|
+
return {
|
39
|
+
"ObjectExpression": checkForTrailingComma,
|
40
|
+
"ArrayExpression": checkForTrailingComma
|
41
|
+
};
|
42
|
+
|
43
|
+
};
|
44
|
+
|
45
|
+
module.exports.schema = [];
|
@@ -1,123 +1,123 @@
|
|
1
|
-
/**
|
2
|
-
* @fileoverview Rule to flag assignment in a conditional statement's test expression
|
3
|
-
* @author Stephen Murray <spmurrayzzz>
|
4
|
-
*/
|
5
|
-
"use strict";
|
6
|
-
|
7
|
-
var NODE_DESCRIPTIONS = {
|
8
|
-
"DoWhileStatement": "a 'do...while' statement",
|
9
|
-
"ForStatement": "a 'for' statement",
|
10
|
-
"IfStatement": "an 'if' statement",
|
11
|
-
"WhileStatement": "a 'while' statement"
|
12
|
-
};
|
13
|
-
|
14
|
-
//------------------------------------------------------------------------------
|
15
|
-
// Rule Definition
|
16
|
-
//------------------------------------------------------------------------------
|
17
|
-
|
18
|
-
module.exports = function(context) {
|
19
|
-
|
20
|
-
var prohibitAssign = (context.options[0] || "except-parens");
|
21
|
-
|
22
|
-
/**
|
23
|
-
* Check whether an AST node is the test expression for a conditional statement.
|
24
|
-
* @param {!Object} node The node to test.
|
25
|
-
* @returns {boolean} `true` if the node is the text expression for a conditional statement; otherwise, `false`.
|
26
|
-
*/
|
27
|
-
function isConditionalTestExpression(node) {
|
28
|
-
return node.parent &&
|
29
|
-
node.parent.test &&
|
30
|
-
node === node.parent.test;
|
31
|
-
}
|
32
|
-
|
33
|
-
/**
|
34
|
-
* Given an AST node, perform a bottom-up search for the first ancestor that represents a conditional statement.
|
35
|
-
* @param {!Object} node The node to use at the start of the search.
|
36
|
-
* @returns {?Object} The closest ancestor node that represents a conditional statement.
|
37
|
-
*/
|
38
|
-
function findConditionalAncestor(node) {
|
39
|
-
var currentAncestor = node;
|
40
|
-
|
41
|
-
while ((currentAncestor = currentAncestor.parent)) {
|
42
|
-
if (isConditionalTestExpression(currentAncestor)) {
|
43
|
-
return currentAncestor.parent;
|
44
|
-
}
|
45
|
-
}
|
46
|
-
|
47
|
-
return null;
|
48
|
-
}
|
49
|
-
|
50
|
-
/**
|
51
|
-
* Check whether the code represented by an AST node is enclosed in parentheses.
|
52
|
-
* @param {!Object} node The node to test.
|
53
|
-
* @returns {boolean} `true` if the code is enclosed in parentheses; otherwise, `false`.
|
54
|
-
*/
|
55
|
-
function isParenthesised(node) {
|
56
|
-
var previousToken = context.getTokenBefore(node),
|
57
|
-
nextToken = context.getTokenAfter(node);
|
58
|
-
|
59
|
-
return previousToken.value === "(" && previousToken.range[1] <= node.range[0] &&
|
60
|
-
nextToken.value === ")" && nextToken.range[0] >= node.range[1];
|
61
|
-
}
|
62
|
-
|
63
|
-
/**
|
64
|
-
* Check whether the code represented by an AST node is enclosed in two sets of parentheses.
|
65
|
-
* @param {!Object} node The node to test.
|
66
|
-
* @returns {boolean} `true` if the code is enclosed in two sets of parentheses; otherwise, `false`.
|
67
|
-
*/
|
68
|
-
function isParenthesisedTwice(node) {
|
69
|
-
var previousToken = context.getTokenBefore(node, 1),
|
70
|
-
nextToken = context.getTokenAfter(node, 1);
|
71
|
-
|
72
|
-
return isParenthesised(node) &&
|
73
|
-
previousToken.value === "(" && previousToken.range[1] <= node.range[0] &&
|
74
|
-
nextToken.value === ")" && nextToken.range[0] >= node.range[1];
|
75
|
-
}
|
76
|
-
|
77
|
-
/**
|
78
|
-
* Check a conditional statement's test expression for top-level assignments that are not enclosed in parentheses.
|
79
|
-
* @param {!Object} node The node for the conditional statement.
|
80
|
-
* @returns {void}
|
81
|
-
*/
|
82
|
-
function testForAssign(node) {
|
83
|
-
if (node.test && (node.test.type === "AssignmentExpression") && !isParenthesisedTwice(node.test)) {
|
84
|
-
// must match JSHint's error message
|
85
|
-
context.report(node, "Expected a conditional expression and instead saw an assignment.");
|
86
|
-
}
|
87
|
-
}
|
88
|
-
|
89
|
-
/**
|
90
|
-
* Check whether an assignment expression is descended from a conditional statement's test expression.
|
91
|
-
* @param {!Object} node The node for the assignment expression.
|
92
|
-
* @returns {void}
|
93
|
-
*/
|
94
|
-
function testForConditionalAncestor(node) {
|
95
|
-
var ancestor = findConditionalAncestor(node);
|
96
|
-
|
97
|
-
if (ancestor) {
|
98
|
-
context.report(ancestor, "Unexpected assignment within {{type}}.", {
|
99
|
-
type: NODE_DESCRIPTIONS[ancestor.type] || ancestor.type
|
100
|
-
});
|
101
|
-
}
|
102
|
-
}
|
103
|
-
|
104
|
-
if (prohibitAssign === "always") {
|
105
|
-
return {
|
106
|
-
"AssignmentExpression": testForConditionalAncestor
|
107
|
-
};
|
108
|
-
}
|
109
|
-
|
110
|
-
return {
|
111
|
-
"DoWhileStatement": testForAssign,
|
112
|
-
"ForStatement": testForAssign,
|
113
|
-
"IfStatement": testForAssign,
|
114
|
-
"WhileStatement": testForAssign
|
115
|
-
};
|
116
|
-
|
117
|
-
};
|
118
|
-
|
119
|
-
module.exports.schema = [
|
120
|
-
{
|
121
|
-
"enum": ["except-parens", "always"]
|
122
|
-
}
|
123
|
-
];
|
1
|
+
/**
|
2
|
+
* @fileoverview Rule to flag assignment in a conditional statement's test expression
|
3
|
+
* @author Stephen Murray <spmurrayzzz>
|
4
|
+
*/
|
5
|
+
"use strict";
|
6
|
+
|
7
|
+
var NODE_DESCRIPTIONS = {
|
8
|
+
"DoWhileStatement": "a 'do...while' statement",
|
9
|
+
"ForStatement": "a 'for' statement",
|
10
|
+
"IfStatement": "an 'if' statement",
|
11
|
+
"WhileStatement": "a 'while' statement"
|
12
|
+
};
|
13
|
+
|
14
|
+
//------------------------------------------------------------------------------
|
15
|
+
// Rule Definition
|
16
|
+
//------------------------------------------------------------------------------
|
17
|
+
|
18
|
+
module.exports = function(context) {
|
19
|
+
|
20
|
+
var prohibitAssign = (context.options[0] || "except-parens");
|
21
|
+
|
22
|
+
/**
|
23
|
+
* Check whether an AST node is the test expression for a conditional statement.
|
24
|
+
* @param {!Object} node The node to test.
|
25
|
+
* @returns {boolean} `true` if the node is the text expression for a conditional statement; otherwise, `false`.
|
26
|
+
*/
|
27
|
+
function isConditionalTestExpression(node) {
|
28
|
+
return node.parent &&
|
29
|
+
node.parent.test &&
|
30
|
+
node === node.parent.test;
|
31
|
+
}
|
32
|
+
|
33
|
+
/**
|
34
|
+
* Given an AST node, perform a bottom-up search for the first ancestor that represents a conditional statement.
|
35
|
+
* @param {!Object} node The node to use at the start of the search.
|
36
|
+
* @returns {?Object} The closest ancestor node that represents a conditional statement.
|
37
|
+
*/
|
38
|
+
function findConditionalAncestor(node) {
|
39
|
+
var currentAncestor = node;
|
40
|
+
|
41
|
+
while ((currentAncestor = currentAncestor.parent)) {
|
42
|
+
if (isConditionalTestExpression(currentAncestor)) {
|
43
|
+
return currentAncestor.parent;
|
44
|
+
}
|
45
|
+
}
|
46
|
+
|
47
|
+
return null;
|
48
|
+
}
|
49
|
+
|
50
|
+
/**
|
51
|
+
* Check whether the code represented by an AST node is enclosed in parentheses.
|
52
|
+
* @param {!Object} node The node to test.
|
53
|
+
* @returns {boolean} `true` if the code is enclosed in parentheses; otherwise, `false`.
|
54
|
+
*/
|
55
|
+
function isParenthesised(node) {
|
56
|
+
var previousToken = context.getTokenBefore(node),
|
57
|
+
nextToken = context.getTokenAfter(node);
|
58
|
+
|
59
|
+
return previousToken.value === "(" && previousToken.range[1] <= node.range[0] &&
|
60
|
+
nextToken.value === ")" && nextToken.range[0] >= node.range[1];
|
61
|
+
}
|
62
|
+
|
63
|
+
/**
|
64
|
+
* Check whether the code represented by an AST node is enclosed in two sets of parentheses.
|
65
|
+
* @param {!Object} node The node to test.
|
66
|
+
* @returns {boolean} `true` if the code is enclosed in two sets of parentheses; otherwise, `false`.
|
67
|
+
*/
|
68
|
+
function isParenthesisedTwice(node) {
|
69
|
+
var previousToken = context.getTokenBefore(node, 1),
|
70
|
+
nextToken = context.getTokenAfter(node, 1);
|
71
|
+
|
72
|
+
return isParenthesised(node) &&
|
73
|
+
previousToken.value === "(" && previousToken.range[1] <= node.range[0] &&
|
74
|
+
nextToken.value === ")" && nextToken.range[0] >= node.range[1];
|
75
|
+
}
|
76
|
+
|
77
|
+
/**
|
78
|
+
* Check a conditional statement's test expression for top-level assignments that are not enclosed in parentheses.
|
79
|
+
* @param {!Object} node The node for the conditional statement.
|
80
|
+
* @returns {void}
|
81
|
+
*/
|
82
|
+
function testForAssign(node) {
|
83
|
+
if (node.test && (node.test.type === "AssignmentExpression") && !isParenthesisedTwice(node.test)) {
|
84
|
+
// must match JSHint's error message
|
85
|
+
context.report(node, "Expected a conditional expression and instead saw an assignment.");
|
86
|
+
}
|
87
|
+
}
|
88
|
+
|
89
|
+
/**
|
90
|
+
* Check whether an assignment expression is descended from a conditional statement's test expression.
|
91
|
+
* @param {!Object} node The node for the assignment expression.
|
92
|
+
* @returns {void}
|
93
|
+
*/
|
94
|
+
function testForConditionalAncestor(node) {
|
95
|
+
var ancestor = findConditionalAncestor(node);
|
96
|
+
|
97
|
+
if (ancestor) {
|
98
|
+
context.report(ancestor, "Unexpected assignment within {{type}}.", {
|
99
|
+
type: NODE_DESCRIPTIONS[ancestor.type] || ancestor.type
|
100
|
+
});
|
101
|
+
}
|
102
|
+
}
|
103
|
+
|
104
|
+
if (prohibitAssign === "always") {
|
105
|
+
return {
|
106
|
+
"AssignmentExpression": testForConditionalAncestor
|
107
|
+
};
|
108
|
+
}
|
109
|
+
|
110
|
+
return {
|
111
|
+
"DoWhileStatement": testForAssign,
|
112
|
+
"ForStatement": testForAssign,
|
113
|
+
"IfStatement": testForAssign,
|
114
|
+
"WhileStatement": testForAssign
|
115
|
+
};
|
116
|
+
|
117
|
+
};
|
118
|
+
|
119
|
+
module.exports.schema = [
|
120
|
+
{
|
121
|
+
"enum": ["except-parens", "always"]
|
122
|
+
}
|
123
|
+
];
|
package/lib/rules/no-console.js
CHANGED
@@ -1,27 +1,27 @@
|
|
1
|
-
/**
|
2
|
-
* @fileoverview Rule to flag use of console object
|
3
|
-
* @author Nicholas C. Zakas
|
4
|
-
*/
|
5
|
-
|
6
|
-
"use strict";
|
7
|
-
|
8
|
-
//------------------------------------------------------------------------------
|
9
|
-
// Rule Definition
|
10
|
-
//------------------------------------------------------------------------------
|
11
|
-
|
12
|
-
module.exports = function(context) {
|
13
|
-
|
14
|
-
return {
|
15
|
-
|
16
|
-
"MemberExpression": function(node) {
|
17
|
-
|
18
|
-
if (node.object.name === "console") {
|
19
|
-
context.report(node, "Unexpected console statement.");
|
20
|
-
}
|
21
|
-
|
22
|
-
}
|
23
|
-
};
|
24
|
-
|
25
|
-
};
|
26
|
-
|
27
|
-
module.exports.schema = [];
|
1
|
+
/**
|
2
|
+
* @fileoverview Rule to flag use of console object
|
3
|
+
* @author Nicholas C. Zakas
|
4
|
+
*/
|
5
|
+
|
6
|
+
"use strict";
|
7
|
+
|
8
|
+
//------------------------------------------------------------------------------
|
9
|
+
// Rule Definition
|
10
|
+
//------------------------------------------------------------------------------
|
11
|
+
|
12
|
+
module.exports = function(context) {
|
13
|
+
|
14
|
+
return {
|
15
|
+
|
16
|
+
"MemberExpression": function(node) {
|
17
|
+
|
18
|
+
if (node.object.name === "console") {
|
19
|
+
context.report(node, "Unexpected console statement.");
|
20
|
+
}
|
21
|
+
|
22
|
+
}
|
23
|
+
};
|
24
|
+
|
25
|
+
};
|
26
|
+
|
27
|
+
module.exports.schema = [];
|