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,118 +1,118 @@
1
- /**
2
- * @fileoverview Rule to replace assignment expressions with operator assignment
3
- * @author Brandon Mills
4
- * @copyright 2014 Brandon Mills. All rights reserved.
5
- */
6
- "use strict";
7
-
8
- //------------------------------------------------------------------------------
9
- // Helpers
10
- //------------------------------------------------------------------------------
11
-
12
- /**
13
- * Checks whether an operator is commutative and has an operator assignment
14
- * shorthand form.
15
- * @param {string} operator Operator to check.
16
- * @returns {boolean} True if the operator is commutative and has a
17
- * shorthand form.
18
- */
19
- function isCommutativeOperatorWithShorthand(operator) {
20
- return ["*", "&", "^", "|"].indexOf(operator) >= 0;
21
- }
22
-
23
- /**
24
- * Checks whether an operator is not commuatative and has an operator assignment
25
- * shorthand form.
26
- * @param {string} operator Operator to check.
27
- * @returns {boolean} True if the operator is not commuatative and has
28
- * a shorthand form.
29
- */
30
- function isNonCommutativeOperatorWithShorthand(operator) {
31
- return ["+", "-", "/", "%", "<<", ">>", ">>>"].indexOf(operator) >= 0;
32
- }
33
-
34
- //------------------------------------------------------------------------------
35
- // Rule Definition
36
- //------------------------------------------------------------------------------
37
-
38
- /**
39
- * Checks whether two expressions reference the same value. For example:
40
- * a = a
41
- * a.b = a.b
42
- * a[0] = a[0]
43
- * a['b'] = a['b']
44
- * @param {ASTNode} a Left side of the comparison.
45
- * @param {ASTNode} b Right side of the comparison.
46
- * @returns {boolean} True if both sides match and reference the same value.
47
- */
48
- function same(a, b) {
49
- if (a.type !== b.type) {
50
- return false;
51
- }
52
-
53
- switch (a.type) {
54
- case "Identifier":
55
- return a.name === b.name;
56
- case "Literal":
57
- return a.value === b.value;
58
- case "MemberExpression":
59
- // x[0] = x[0]
60
- // x[y] = x[y]
61
- // x.y = x.y
62
- return same(a.object, b.object) && same(a.property, b.property);
63
- default:
64
- return false;
65
- }
66
- }
67
-
68
- module.exports = function(context) {
69
-
70
- /**
71
- * Ensures that an assignment uses the shorthand form where possible.
72
- * @param {ASTNode} node An AssignmentExpression node.
73
- * @returns {void}
74
- */
75
- function verify(node) {
76
- var expr, left, operator;
77
-
78
- if (node.operator !== "=" || node.right.type !== "BinaryExpression") {
79
- return;
80
- }
81
-
82
- left = node.left;
83
- expr = node.right;
84
- operator = expr.operator;
85
-
86
- if (isCommutativeOperatorWithShorthand(operator)) {
87
- if (same(left, expr.left) || same(left, expr.right)) {
88
- context.report(node, "Assignment can be replaced with operator assignment.");
89
- }
90
- } else if (isNonCommutativeOperatorWithShorthand(operator)) {
91
- if (same(left, expr.left)) {
92
- context.report(node, "Assignment can be replaced with operator assignment.");
93
- }
94
- }
95
- }
96
-
97
- /**
98
- * Warns if an assignment expression uses operator assignment shorthand.
99
- * @param {ASTNode} node An AssignmentExpression node.
100
- * @returns {void}
101
- */
102
- function prohibit(node) {
103
- if (node.operator !== "=") {
104
- context.report(node, "Unexpected operator assignment shorthand.");
105
- }
106
- }
107
-
108
- return {
109
- "AssignmentExpression": context.options[0] !== "never" ? verify : prohibit
110
- };
111
-
112
- };
113
-
114
- module.exports.schema = [
115
- {
116
- "enum": ["always", "never"]
117
- }
118
- ];
1
+ /**
2
+ * @fileoverview Rule to replace assignment expressions with operator assignment
3
+ * @author Brandon Mills
4
+ * @copyright 2014 Brandon Mills. All rights reserved.
5
+ */
6
+ "use strict";
7
+
8
+ //------------------------------------------------------------------------------
9
+ // Helpers
10
+ //------------------------------------------------------------------------------
11
+
12
+ /**
13
+ * Checks whether an operator is commutative and has an operator assignment
14
+ * shorthand form.
15
+ * @param {string} operator Operator to check.
16
+ * @returns {boolean} True if the operator is commutative and has a
17
+ * shorthand form.
18
+ */
19
+ function isCommutativeOperatorWithShorthand(operator) {
20
+ return ["*", "&", "^", "|"].indexOf(operator) >= 0;
21
+ }
22
+
23
+ /**
24
+ * Checks whether an operator is not commuatative and has an operator assignment
25
+ * shorthand form.
26
+ * @param {string} operator Operator to check.
27
+ * @returns {boolean} True if the operator is not commuatative and has
28
+ * a shorthand form.
29
+ */
30
+ function isNonCommutativeOperatorWithShorthand(operator) {
31
+ return ["+", "-", "/", "%", "<<", ">>", ">>>"].indexOf(operator) >= 0;
32
+ }
33
+
34
+ //------------------------------------------------------------------------------
35
+ // Rule Definition
36
+ //------------------------------------------------------------------------------
37
+
38
+ /**
39
+ * Checks whether two expressions reference the same value. For example:
40
+ * a = a
41
+ * a.b = a.b
42
+ * a[0] = a[0]
43
+ * a['b'] = a['b']
44
+ * @param {ASTNode} a Left side of the comparison.
45
+ * @param {ASTNode} b Right side of the comparison.
46
+ * @returns {boolean} True if both sides match and reference the same value.
47
+ */
48
+ function same(a, b) {
49
+ if (a.type !== b.type) {
50
+ return false;
51
+ }
52
+
53
+ switch (a.type) {
54
+ case "Identifier":
55
+ return a.name === b.name;
56
+ case "Literal":
57
+ return a.value === b.value;
58
+ case "MemberExpression":
59
+ // x[0] = x[0]
60
+ // x[y] = x[y]
61
+ // x.y = x.y
62
+ return same(a.object, b.object) && same(a.property, b.property);
63
+ default:
64
+ return false;
65
+ }
66
+ }
67
+
68
+ module.exports = function(context) {
69
+
70
+ /**
71
+ * Ensures that an assignment uses the shorthand form where possible.
72
+ * @param {ASTNode} node An AssignmentExpression node.
73
+ * @returns {void}
74
+ */
75
+ function verify(node) {
76
+ var expr, left, operator;
77
+
78
+ if (node.operator !== "=" || node.right.type !== "BinaryExpression") {
79
+ return;
80
+ }
81
+
82
+ left = node.left;
83
+ expr = node.right;
84
+ operator = expr.operator;
85
+
86
+ if (isCommutativeOperatorWithShorthand(operator)) {
87
+ if (same(left, expr.left) || same(left, expr.right)) {
88
+ context.report(node, "Assignment can be replaced with operator assignment.");
89
+ }
90
+ } else if (isNonCommutativeOperatorWithShorthand(operator)) {
91
+ if (same(left, expr.left)) {
92
+ context.report(node, "Assignment can be replaced with operator assignment.");
93
+ }
94
+ }
95
+ }
96
+
97
+ /**
98
+ * Warns if an assignment expression uses operator assignment shorthand.
99
+ * @param {ASTNode} node An AssignmentExpression node.
100
+ * @returns {void}
101
+ */
102
+ function prohibit(node) {
103
+ if (node.operator !== "=") {
104
+ context.report(node, "Unexpected operator assignment shorthand.");
105
+ }
106
+ }
107
+
108
+ return {
109
+ "AssignmentExpression": context.options[0] !== "never" ? verify : prohibit
110
+ };
111
+
112
+ };
113
+
114
+ module.exports.schema = [
115
+ {
116
+ "enum": ["always", "never"]
117
+ }
118
+ ];
@@ -1,114 +1,114 @@
1
- /**
2
- * @fileoverview Operator linebreak - enforces operator linebreak style of two types: after and before
3
- * @author Benoît Zugmeyer
4
- * @copyright 2015 Benoît Zugmeyer. All rights reserved.
5
- */
6
-
7
- "use strict";
8
-
9
- //------------------------------------------------------------------------------
10
- // Rule Definition
11
- //------------------------------------------------------------------------------
12
-
13
- module.exports = function(context) {
14
-
15
- var style = context.options[0] || "after";
16
-
17
- //--------------------------------------------------------------------------
18
- // Helpers
19
- //--------------------------------------------------------------------------
20
-
21
- /**
22
- * Checks whether two tokens are on the same line.
23
- * @param {ASTNode} left The leftmost token.
24
- * @param {ASTNode} right The rightmost token.
25
- * @returns {boolean} True if the tokens are on the same line, false if not.
26
- * @private
27
- */
28
- function isSameLine(left, right) {
29
- return left.loc.end.line === right.loc.start.line;
30
- }
31
-
32
- /**
33
- * Checks the operator placement
34
- * @param {ASTNode} node The binary operator node to check
35
- * @private
36
- * @returns {void}
37
- */
38
- function validateBinaryExpression(node) {
39
- var leftToken = context.getLastToken(node.left || node.id);
40
- var operatorToken = context.getTokenAfter(leftToken);
41
-
42
- // When the left part of a binary expression is a single expression wrapped in
43
- // parentheses (ex: `(a) + b`), leftToken will be the last token of the expression
44
- // and operatorToken will be the closing parenthesis.
45
- // The leftToken should be the last closing parenthesis, and the operatorToken
46
- // should be the token right after that.
47
- while (operatorToken.value === ")") {
48
- leftToken = operatorToken;
49
- operatorToken = context.getTokenAfter(operatorToken);
50
- }
51
-
52
- var rightToken = context.getTokenAfter(operatorToken);
53
- var operator = operatorToken.value;
54
-
55
- // if single line
56
- if (isSameLine(leftToken, operatorToken) &&
57
- isSameLine(operatorToken, rightToken)) {
58
-
59
- return;
60
-
61
- } else if (!isSameLine(leftToken, operatorToken) &&
62
- !isSameLine(operatorToken, rightToken)) {
63
-
64
- // lone operator
65
- context.report(node, {
66
- line: operatorToken.loc.end.line,
67
- column: operatorToken.loc.end.column
68
- }, "Bad line breaking before and after '" + operator + "'.");
69
-
70
- } else if (style === "before" && isSameLine(leftToken, operatorToken)) {
71
-
72
- context.report(node, {
73
- line: operatorToken.loc.end.line,
74
- column: operatorToken.loc.end.column
75
- }, "'" + operator + "' should be placed at the beginning of the line.");
76
-
77
- } else if (style === "after" && isSameLine(operatorToken, rightToken)) {
78
-
79
- context.report(node, {
80
- line: operatorToken.loc.end.line,
81
- column: operatorToken.loc.end.column
82
- }, "'" + operator + "' should be placed at the end of the line.");
83
-
84
- } else if (style === "none") {
85
-
86
- context.report(node, {
87
- line: operatorToken.loc.end.line,
88
- column: operatorToken.loc.end.column
89
- }, "There should be no line break before or after '" + operator + "'");
90
-
91
- }
92
- }
93
-
94
- //--------------------------------------------------------------------------
95
- // Public
96
- //--------------------------------------------------------------------------
97
-
98
- return {
99
- "BinaryExpression": validateBinaryExpression,
100
- "LogicalExpression": validateBinaryExpression,
101
- "AssignmentExpression": validateBinaryExpression,
102
- "VariableDeclarator": function (node) {
103
- if (node.init) {
104
- validateBinaryExpression(node);
105
- }
106
- }
107
- };
108
- };
109
-
110
- module.exports.schema = [
111
- {
112
- "enum": ["after", "before", "none"]
113
- }
114
- ];
1
+ /**
2
+ * @fileoverview Operator linebreak - enforces operator linebreak style of two types: after and before
3
+ * @author Benoît Zugmeyer
4
+ * @copyright 2015 Benoît Zugmeyer. All rights reserved.
5
+ */
6
+
7
+ "use strict";
8
+
9
+ //------------------------------------------------------------------------------
10
+ // Rule Definition
11
+ //------------------------------------------------------------------------------
12
+
13
+ module.exports = function(context) {
14
+
15
+ var style = context.options[0] || "after";
16
+
17
+ //--------------------------------------------------------------------------
18
+ // Helpers
19
+ //--------------------------------------------------------------------------
20
+
21
+ /**
22
+ * Checks whether two tokens are on the same line.
23
+ * @param {ASTNode} left The leftmost token.
24
+ * @param {ASTNode} right The rightmost token.
25
+ * @returns {boolean} True if the tokens are on the same line, false if not.
26
+ * @private
27
+ */
28
+ function isSameLine(left, right) {
29
+ return left.loc.end.line === right.loc.start.line;
30
+ }
31
+
32
+ /**
33
+ * Checks the operator placement
34
+ * @param {ASTNode} node The binary operator node to check
35
+ * @private
36
+ * @returns {void}
37
+ */
38
+ function validateBinaryExpression(node) {
39
+ var leftToken = context.getLastToken(node.left || node.id);
40
+ var operatorToken = context.getTokenAfter(leftToken);
41
+
42
+ // When the left part of a binary expression is a single expression wrapped in
43
+ // parentheses (ex: `(a) + b`), leftToken will be the last token of the expression
44
+ // and operatorToken will be the closing parenthesis.
45
+ // The leftToken should be the last closing parenthesis, and the operatorToken
46
+ // should be the token right after that.
47
+ while (operatorToken.value === ")") {
48
+ leftToken = operatorToken;
49
+ operatorToken = context.getTokenAfter(operatorToken);
50
+ }
51
+
52
+ var rightToken = context.getTokenAfter(operatorToken);
53
+ var operator = operatorToken.value;
54
+
55
+ // if single line
56
+ if (isSameLine(leftToken, operatorToken) &&
57
+ isSameLine(operatorToken, rightToken)) {
58
+
59
+ return;
60
+
61
+ } else if (!isSameLine(leftToken, operatorToken) &&
62
+ !isSameLine(operatorToken, rightToken)) {
63
+
64
+ // lone operator
65
+ context.report(node, {
66
+ line: operatorToken.loc.end.line,
67
+ column: operatorToken.loc.end.column
68
+ }, "Bad line breaking before and after '" + operator + "'.");
69
+
70
+ } else if (style === "before" && isSameLine(leftToken, operatorToken)) {
71
+
72
+ context.report(node, {
73
+ line: operatorToken.loc.end.line,
74
+ column: operatorToken.loc.end.column
75
+ }, "'" + operator + "' should be placed at the beginning of the line.");
76
+
77
+ } else if (style === "after" && isSameLine(operatorToken, rightToken)) {
78
+
79
+ context.report(node, {
80
+ line: operatorToken.loc.end.line,
81
+ column: operatorToken.loc.end.column
82
+ }, "'" + operator + "' should be placed at the end of the line.");
83
+
84
+ } else if (style === "none") {
85
+
86
+ context.report(node, {
87
+ line: operatorToken.loc.end.line,
88
+ column: operatorToken.loc.end.column
89
+ }, "There should be no line break before or after '" + operator + "'");
90
+
91
+ }
92
+ }
93
+
94
+ //--------------------------------------------------------------------------
95
+ // Public
96
+ //--------------------------------------------------------------------------
97
+
98
+ return {
99
+ "BinaryExpression": validateBinaryExpression,
100
+ "LogicalExpression": validateBinaryExpression,
101
+ "AssignmentExpression": validateBinaryExpression,
102
+ "VariableDeclarator": function (node) {
103
+ if (node.init) {
104
+ validateBinaryExpression(node);
105
+ }
106
+ }
107
+ };
108
+ };
109
+
110
+ module.exports.schema = [
111
+ {
112
+ "enum": ["after", "before", "none"]
113
+ }
114
+ ];
@@ -1,98 +1,98 @@
1
- /**
2
- * @fileoverview A rule to ensure blank lines within blocks.
3
- * @author Mathias Schreck <https://github.com/lo1tuma>
4
- * @copyright 2014 Mathias Schreck. All rights reserved.
5
- */
6
-
7
- "use strict";
8
-
9
- //------------------------------------------------------------------------------
10
- // Rule Definition
11
- //------------------------------------------------------------------------------
12
-
13
- module.exports = function (context) {
14
- var requirePadding = context.options[0] !== "never";
15
-
16
- var ALWAYS_MESSAGE = "Block must be padded by blank lines.",
17
- NEVER_MESSAGE = "Block must not be padded by blank lines.";
18
-
19
- /**
20
- * Checks if the given non empty block node has a blank line before its first child node.
21
- * @param {ASTNode} node The AST node of a BlockStatement.
22
- * @returns {boolean} Whether or not the block starts with a blank line.
23
- */
24
- function isBlockTopPadded(node) {
25
- var blockStart = node.loc.start.line,
26
- first = node.body[0],
27
- firstLine = first.loc.start.line,
28
- expectedFirstLine = blockStart + 2,
29
- leadingComments = context.getComments(first).leading;
30
-
31
- if (leadingComments.length > 0) {
32
- firstLine = leadingComments[0].loc.start.line;
33
- }
34
-
35
- return expectedFirstLine <= firstLine;
36
- }
37
-
38
- /**
39
- * Checks if the given non empty block node has a blank line after its last child node.
40
- * @param {ASTNode} node The AST node of a BlockStatement.
41
- * @returns {boolean} Whether or not the block ends with a blank line.
42
- */
43
- function isBlockBottomPadded(node) {
44
- var blockEnd = node.loc.end.line,
45
- last = node.body[node.body.length - 1],
46
- lastLine = context.getLastToken(last).loc.end.line,
47
- expectedLastLine = blockEnd - 2,
48
- trailingComments = context.getComments(last).trailing;
49
-
50
- if (trailingComments.length > 0) {
51
- lastLine = trailingComments[trailingComments.length - 1].loc.end.line;
52
- }
53
-
54
- return lastLine <= expectedLastLine;
55
- }
56
-
57
- /**
58
- * Checks the given BlockStatement node to be padded if the block is not empty.
59
- * @param {ASTNode} node The AST node of a BlockStatement.
60
- * @returns {void} undefined.
61
- */
62
- function checkPadding(node) {
63
- if (node.body.length > 0) {
64
-
65
- var blockHasTopPadding = isBlockTopPadded(node),
66
- blockHasBottomPadding = isBlockBottomPadded(node);
67
-
68
- if (requirePadding) {
69
- if (!blockHasTopPadding) {
70
- context.report(node, ALWAYS_MESSAGE);
71
- }
72
-
73
- if (!blockHasBottomPadding) {
74
- context.report(node, node.loc.end, ALWAYS_MESSAGE);
75
- }
76
- } else {
77
- if (blockHasTopPadding) {
78
- context.report(node, NEVER_MESSAGE);
79
- }
80
-
81
- if (blockHasBottomPadding) {
82
- context.report(node, node.loc.end, NEVER_MESSAGE);
83
- }
84
- }
85
- }
86
- }
87
-
88
- return {
89
- "BlockStatement": checkPadding
90
- };
91
-
92
- };
93
-
94
- module.exports.schema = [
95
- {
96
- "enum": ["always", "never"]
97
- }
98
- ];
1
+ /**
2
+ * @fileoverview A rule to ensure blank lines within blocks.
3
+ * @author Mathias Schreck <https://github.com/lo1tuma>
4
+ * @copyright 2014 Mathias Schreck. All rights reserved.
5
+ */
6
+
7
+ "use strict";
8
+
9
+ //------------------------------------------------------------------------------
10
+ // Rule Definition
11
+ //------------------------------------------------------------------------------
12
+
13
+ module.exports = function (context) {
14
+ var requirePadding = context.options[0] !== "never";
15
+
16
+ var ALWAYS_MESSAGE = "Block must be padded by blank lines.",
17
+ NEVER_MESSAGE = "Block must not be padded by blank lines.";
18
+
19
+ /**
20
+ * Checks if the given non empty block node has a blank line before its first child node.
21
+ * @param {ASTNode} node The AST node of a BlockStatement.
22
+ * @returns {boolean} Whether or not the block starts with a blank line.
23
+ */
24
+ function isBlockTopPadded(node) {
25
+ var blockStart = node.loc.start.line,
26
+ first = node.body[0],
27
+ firstLine = first.loc.start.line,
28
+ expectedFirstLine = blockStart + 2,
29
+ leadingComments = context.getComments(first).leading;
30
+
31
+ if (leadingComments.length > 0) {
32
+ firstLine = leadingComments[0].loc.start.line;
33
+ }
34
+
35
+ return expectedFirstLine <= firstLine;
36
+ }
37
+
38
+ /**
39
+ * Checks if the given non empty block node has a blank line after its last child node.
40
+ * @param {ASTNode} node The AST node of a BlockStatement.
41
+ * @returns {boolean} Whether or not the block ends with a blank line.
42
+ */
43
+ function isBlockBottomPadded(node) {
44
+ var blockEnd = node.loc.end.line,
45
+ last = node.body[node.body.length - 1],
46
+ lastLine = context.getLastToken(last).loc.end.line,
47
+ expectedLastLine = blockEnd - 2,
48
+ trailingComments = context.getComments(last).trailing;
49
+
50
+ if (trailingComments.length > 0) {
51
+ lastLine = trailingComments[trailingComments.length - 1].loc.end.line;
52
+ }
53
+
54
+ return lastLine <= expectedLastLine;
55
+ }
56
+
57
+ /**
58
+ * Checks the given BlockStatement node to be padded if the block is not empty.
59
+ * @param {ASTNode} node The AST node of a BlockStatement.
60
+ * @returns {void} undefined.
61
+ */
62
+ function checkPadding(node) {
63
+ if (node.body.length > 0) {
64
+
65
+ var blockHasTopPadding = isBlockTopPadded(node),
66
+ blockHasBottomPadding = isBlockBottomPadded(node);
67
+
68
+ if (requirePadding) {
69
+ if (!blockHasTopPadding) {
70
+ context.report(node, ALWAYS_MESSAGE);
71
+ }
72
+
73
+ if (!blockHasBottomPadding) {
74
+ context.report(node, node.loc.end, ALWAYS_MESSAGE);
75
+ }
76
+ } else {
77
+ if (blockHasTopPadding) {
78
+ context.report(node, NEVER_MESSAGE);
79
+ }
80
+
81
+ if (blockHasBottomPadding) {
82
+ context.report(node, node.loc.end, NEVER_MESSAGE);
83
+ }
84
+ }
85
+ }
86
+ }
87
+
88
+ return {
89
+ "BlockStatement": checkPadding
90
+ };
91
+
92
+ };
93
+
94
+ module.exports.schema = [
95
+ {
96
+ "enum": ["always", "never"]
97
+ }
98
+ ];