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.
Files changed (201) hide show
  1. package/LICENSE +20 -20
  2. package/README.md +111 -95
  3. package/bin/eslint.js +41 -41
  4. package/conf/environments.js +87 -81
  5. package/conf/eslint.json +186 -179
  6. package/lib/api.js +13 -12
  7. package/lib/cli-engine.js +441 -451
  8. package/lib/cli.js +196 -196
  9. package/lib/config-initializer.js +145 -145
  10. package/lib/config-validator.js +110 -110
  11. package/lib/config.js +428 -416
  12. package/lib/eslint.js +1072 -1073
  13. package/lib/file-finder.js +167 -167
  14. package/lib/formatters/checkstyle.js +68 -68
  15. package/lib/formatters/compact.js +53 -53
  16. package/lib/formatters/jslint-xml.js +40 -40
  17. package/lib/formatters/junit.js +63 -63
  18. package/lib/formatters/stylish.js +90 -90
  19. package/lib/formatters/tap.js +86 -86
  20. package/lib/ignored-paths.js +137 -137
  21. package/lib/load-rules.js +39 -39
  22. package/lib/options.js +132 -126
  23. package/lib/rule-context.js +107 -107
  24. package/lib/rules/accessor-pairs.js +65 -65
  25. package/lib/rules/array-bracket-spacing.js +180 -0
  26. package/lib/rules/block-scoped-var.js +339 -320
  27. package/lib/rules/brace-style.js +228 -228
  28. package/lib/rules/camelcase.js +111 -111
  29. package/lib/rules/comma-dangle.js +67 -64
  30. package/lib/rules/comma-spacing.js +191 -191
  31. package/lib/rules/comma-style.js +195 -195
  32. package/lib/rules/complexity.js +94 -94
  33. package/lib/rules/computed-property-spacing.js +144 -0
  34. package/lib/rules/consistent-return.js +75 -75
  35. package/lib/rules/consistent-this.js +119 -119
  36. package/lib/rules/constructor-super.js +108 -0
  37. package/lib/rules/curly.js +109 -109
  38. package/lib/rules/default-case.js +66 -66
  39. package/lib/rules/dot-location.js +63 -63
  40. package/lib/rules/dot-notation.js +119 -119
  41. package/lib/rules/eol-last.js +38 -38
  42. package/lib/rules/eqeqeq.js +96 -96
  43. package/lib/rules/func-names.js +45 -45
  44. package/lib/rules/func-style.js +49 -49
  45. package/lib/rules/generator-star-spacing.js +104 -87
  46. package/lib/rules/generator-star.js +76 -76
  47. package/lib/rules/global-strict.js +49 -49
  48. package/lib/rules/guard-for-in.js +32 -32
  49. package/lib/rules/handle-callback-err.js +81 -124
  50. package/lib/rules/indent.js +486 -486
  51. package/lib/rules/key-spacing.js +325 -325
  52. package/lib/rules/linebreak-style.js +44 -44
  53. package/lib/rules/lines-around-comment.js +228 -160
  54. package/lib/rules/max-depth.js +89 -89
  55. package/lib/rules/max-len.js +76 -76
  56. package/lib/rules/max-nested-callbacks.js +73 -73
  57. package/lib/rules/max-params.js +45 -45
  58. package/lib/rules/max-statements.js +61 -61
  59. package/lib/rules/new-cap.js +224 -224
  60. package/lib/rules/new-parens.js +29 -29
  61. package/lib/rules/newline-after-var.js +127 -127
  62. package/lib/rules/no-alert.js +153 -153
  63. package/lib/rules/no-array-constructor.js +31 -31
  64. package/lib/rules/no-bitwise.js +57 -57
  65. package/lib/rules/no-caller.js +29 -29
  66. package/lib/rules/no-catch-shadow.js +52 -52
  67. package/lib/rules/no-comma-dangle.js +45 -45
  68. package/lib/rules/no-cond-assign.js +123 -123
  69. package/lib/rules/no-console.js +27 -27
  70. package/lib/rules/no-constant-condition.js +73 -73
  71. package/lib/rules/no-continue.js +23 -23
  72. package/lib/rules/no-control-regex.js +58 -58
  73. package/lib/rules/no-debugger.js +22 -22
  74. package/lib/rules/no-delete-var.js +25 -25
  75. package/lib/rules/no-div-regex.js +27 -27
  76. package/lib/rules/no-dupe-args.js +89 -85
  77. package/lib/rules/no-dupe-keys.js +43 -43
  78. package/lib/rules/no-duplicate-case.js +67 -67
  79. package/lib/rules/no-else-return.js +125 -125
  80. package/lib/rules/no-empty-character-class.js +43 -43
  81. package/lib/rules/no-empty-class.js +45 -45
  82. package/lib/rules/no-empty-label.js +27 -27
  83. package/lib/rules/no-empty.js +49 -49
  84. package/lib/rules/no-eq-null.js +29 -29
  85. package/lib/rules/no-eval.js +26 -26
  86. package/lib/rules/no-ex-assign.js +42 -42
  87. package/lib/rules/no-extend-native.js +103 -103
  88. package/lib/rules/no-extra-bind.js +81 -81
  89. package/lib/rules/no-extra-boolean-cast.js +71 -71
  90. package/lib/rules/no-extra-parens.js +368 -355
  91. package/lib/rules/no-extra-semi.js +70 -23
  92. package/lib/rules/no-extra-strict.js +86 -86
  93. package/lib/rules/no-fallthrough.js +97 -97
  94. package/lib/rules/no-floating-decimal.js +30 -30
  95. package/lib/rules/no-func-assign.js +83 -83
  96. package/lib/rules/no-implied-eval.js +76 -76
  97. package/lib/rules/no-inline-comments.js +49 -49
  98. package/lib/rules/no-inner-declarations.js +78 -78
  99. package/lib/rules/no-invalid-regexp.js +53 -53
  100. package/lib/rules/no-irregular-whitespace.js +135 -135
  101. package/lib/rules/no-iterator.js +28 -28
  102. package/lib/rules/no-label-var.js +64 -64
  103. package/lib/rules/no-labels.js +44 -44
  104. package/lib/rules/no-lone-blocks.js +106 -27
  105. package/lib/rules/no-lonely-if.js +30 -30
  106. package/lib/rules/no-loop-func.js +58 -58
  107. package/lib/rules/no-mixed-requires.js +165 -165
  108. package/lib/rules/no-mixed-spaces-and-tabs.js +74 -74
  109. package/lib/rules/no-multi-spaces.js +119 -119
  110. package/lib/rules/no-multi-str.js +43 -43
  111. package/lib/rules/no-multiple-empty-lines.js +98 -98
  112. package/lib/rules/no-native-reassign.js +62 -62
  113. package/lib/rules/no-negated-in-lhs.js +25 -25
  114. package/lib/rules/no-nested-ternary.js +24 -24
  115. package/lib/rules/no-new-func.js +25 -25
  116. package/lib/rules/no-new-object.js +25 -25
  117. package/lib/rules/no-new-require.js +25 -25
  118. package/lib/rules/no-new-wrappers.js +26 -26
  119. package/lib/rules/no-new.js +27 -27
  120. package/lib/rules/no-obj-calls.js +28 -28
  121. package/lib/rules/no-octal-escape.js +39 -39
  122. package/lib/rules/no-octal.js +25 -25
  123. package/lib/rules/no-param-reassign.js +87 -87
  124. package/lib/rules/no-path-concat.js +39 -39
  125. package/lib/rules/no-plusplus.js +24 -24
  126. package/lib/rules/no-process-env.js +30 -30
  127. package/lib/rules/no-process-exit.js +33 -33
  128. package/lib/rules/no-proto.js +28 -28
  129. package/lib/rules/no-redeclare.js +68 -68
  130. package/lib/rules/no-regex-spaces.js +35 -35
  131. package/lib/rules/no-reserved-keys.js +56 -56
  132. package/lib/rules/no-restricted-modules.js +85 -85
  133. package/lib/rules/no-return-assign.js +53 -24
  134. package/lib/rules/no-script-url.js +34 -34
  135. package/lib/rules/no-self-compare.js +29 -29
  136. package/lib/rules/no-sequences.js +94 -94
  137. package/lib/rules/no-shadow-restricted-names.js +51 -51
  138. package/lib/rules/no-shadow.js +181 -136
  139. package/lib/rules/no-space-before-semi.js +98 -98
  140. package/lib/rules/no-spaced-func.js +37 -37
  141. package/lib/rules/no-sparse-arrays.js +33 -33
  142. package/lib/rules/no-sync.js +30 -30
  143. package/lib/rules/no-ternary.js +24 -24
  144. package/lib/rules/no-this-before-super.js +144 -0
  145. package/lib/rules/no-throw-literal.js +33 -33
  146. package/lib/rules/no-trailing-spaces.js +74 -63
  147. package/lib/rules/no-undef-init.js +28 -28
  148. package/lib/rules/no-undef.js +92 -92
  149. package/lib/rules/no-undefined.js +27 -27
  150. package/lib/rules/no-underscore-dangle.js +73 -73
  151. package/lib/rules/no-unexpected-multiline.js +58 -0
  152. package/lib/rules/no-unneeded-ternary.js +48 -48
  153. package/lib/rules/no-unreachable.js +98 -98
  154. package/lib/rules/no-unused-expressions.js +76 -76
  155. package/lib/rules/no-unused-vars.js +252 -250
  156. package/lib/rules/no-use-before-define.js +105 -105
  157. package/lib/rules/no-var.js +26 -26
  158. package/lib/rules/no-void.js +28 -28
  159. package/lib/rules/no-warning-comments.js +102 -102
  160. package/lib/rules/no-with.js +22 -22
  161. package/lib/rules/no-wrap-func.js +65 -65
  162. package/lib/rules/object-curly-spacing.js +231 -206
  163. package/lib/rules/object-shorthand.js +74 -73
  164. package/lib/rules/one-var.js +311 -304
  165. package/lib/rules/operator-assignment.js +118 -118
  166. package/lib/rules/operator-linebreak.js +114 -114
  167. package/lib/rules/padded-blocks.js +98 -98
  168. package/lib/rules/prefer-const.js +91 -0
  169. package/lib/rules/quote-props.js +72 -72
  170. package/lib/rules/quotes.js +92 -92
  171. package/lib/rules/radix.js +41 -41
  172. package/lib/rules/semi-spacing.js +167 -167
  173. package/lib/rules/semi.js +136 -136
  174. package/lib/rules/sort-vars.js +49 -49
  175. package/lib/rules/space-after-function-name.js +49 -49
  176. package/lib/rules/space-after-keywords.js +82 -82
  177. package/lib/rules/space-before-blocks.js +91 -91
  178. package/lib/rules/space-before-function-paren.js +139 -139
  179. package/lib/rules/space-before-function-parentheses.js +139 -139
  180. package/lib/rules/space-in-brackets.js +305 -305
  181. package/lib/rules/space-in-parens.js +281 -281
  182. package/lib/rules/space-infix-ops.js +106 -106
  183. package/lib/rules/space-return-throw-case.js +38 -38
  184. package/lib/rules/space-unary-ops.js +124 -133
  185. package/lib/rules/spaced-comment.js +143 -0
  186. package/lib/rules/spaced-line-comment.js +89 -89
  187. package/lib/rules/strict.js +242 -242
  188. package/lib/rules/use-isnan.js +26 -26
  189. package/lib/rules/valid-jsdoc.js +215 -215
  190. package/lib/rules/valid-typeof.js +42 -42
  191. package/lib/rules/vars-on-top.js +115 -115
  192. package/lib/rules/wrap-iife.js +48 -48
  193. package/lib/rules/wrap-regex.js +38 -38
  194. package/lib/rules/yoda.js +242 -225
  195. package/lib/rules.js +88 -88
  196. package/lib/timing.js +109 -109
  197. package/lib/token-store.js +201 -201
  198. package/lib/util/traverse.js +105 -105
  199. package/lib/util.js +125 -85
  200. package/package.json +6 -6
  201. package/CHANGELOG.md +0 -1638
@@ -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 = [];
@@ -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
+ ];
@@ -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 = [];