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,83 +1,83 @@
1
- /**
2
- * @fileoverview Rule to flag use of function declaration identifiers as variables.
3
- * @author Ian Christian Myers
4
- * @copyright 2013 Ian Christian Myers. All rights reserved.
5
- */
6
-
7
- "use strict";
8
-
9
- //------------------------------------------------------------------------------
10
- // Rule Definition
11
- //------------------------------------------------------------------------------
12
-
13
- module.exports = function(context) {
14
-
15
- //--------------------------------------------------------------------------
16
- // Helpers
17
- //--------------------------------------------------------------------------
18
-
19
- /*
20
- * Walk the scope chain looking for either a FunctionDeclaration or a
21
- * VariableDeclaration with the same name as left-hand side of the
22
- * AssignmentExpression. If we find the FunctionDeclaration first, then we
23
- * warn, because a FunctionDeclaration is trying to become a Variable or a
24
- * FunctionExpression. If we find a VariableDeclaration first, then we have
25
- * a legitimate shadow variable.
26
- */
27
- function checkIfIdentifierIsFunction(scope, name) {
28
- var variable,
29
- def,
30
- i,
31
- j;
32
-
33
- // Loop over all of the identifiers available in scope.
34
- for (i = 0; i < scope.variables.length; i++) {
35
- variable = scope.variables[i];
36
-
37
- // For each identifier, see if it was defined in _this_ scope.
38
- for (j = 0; j < variable.defs.length; j++) {
39
- def = variable.defs[j];
40
-
41
- // Identifier is a function and was declared in this scope
42
- if (def.type === "FunctionName" && def.name.name === name) {
43
- return true;
44
- }
45
-
46
- // Identifier is a variable and was declared in this scope. This
47
- // is a legitimate shadow variable.
48
- if (def.name && def.name.name === name) {
49
- return false;
50
- }
51
- }
52
- }
53
-
54
- // Check the upper scope.
55
- if (scope.upper) {
56
- return checkIfIdentifierIsFunction(scope.upper, name);
57
- }
58
-
59
- // We've reached the global scope and haven't found anything.
60
- return false;
61
- }
62
-
63
- //--------------------------------------------------------------------------
64
- // Public API
65
- //--------------------------------------------------------------------------
66
-
67
- return {
68
-
69
- "AssignmentExpression": function(node) {
70
- var scope = context.getScope(),
71
- name = node.left.name;
72
-
73
- if (checkIfIdentifierIsFunction(scope, name)) {
74
- context.report(node, "'{{name}}' is a function.", { name: name });
75
- }
76
-
77
- }
78
-
79
- };
80
-
81
- };
82
-
83
- module.exports.schema = [];
1
+ /**
2
+ * @fileoverview Rule to flag use of function declaration identifiers as variables.
3
+ * @author Ian Christian Myers
4
+ * @copyright 2013 Ian Christian Myers. All rights reserved.
5
+ */
6
+
7
+ "use strict";
8
+
9
+ //------------------------------------------------------------------------------
10
+ // Rule Definition
11
+ //------------------------------------------------------------------------------
12
+
13
+ module.exports = function(context) {
14
+
15
+ //--------------------------------------------------------------------------
16
+ // Helpers
17
+ //--------------------------------------------------------------------------
18
+
19
+ /*
20
+ * Walk the scope chain looking for either a FunctionDeclaration or a
21
+ * VariableDeclaration with the same name as left-hand side of the
22
+ * AssignmentExpression. If we find the FunctionDeclaration first, then we
23
+ * warn, because a FunctionDeclaration is trying to become a Variable or a
24
+ * FunctionExpression. If we find a VariableDeclaration first, then we have
25
+ * a legitimate shadow variable.
26
+ */
27
+ function checkIfIdentifierIsFunction(scope, name) {
28
+ var variable,
29
+ def,
30
+ i,
31
+ j;
32
+
33
+ // Loop over all of the identifiers available in scope.
34
+ for (i = 0; i < scope.variables.length; i++) {
35
+ variable = scope.variables[i];
36
+
37
+ // For each identifier, see if it was defined in _this_ scope.
38
+ for (j = 0; j < variable.defs.length; j++) {
39
+ def = variable.defs[j];
40
+
41
+ // Identifier is a function and was declared in this scope
42
+ if (def.type === "FunctionName" && def.name.name === name) {
43
+ return true;
44
+ }
45
+
46
+ // Identifier is a variable and was declared in this scope. This
47
+ // is a legitimate shadow variable.
48
+ if (def.name && def.name.name === name) {
49
+ return false;
50
+ }
51
+ }
52
+ }
53
+
54
+ // Check the upper scope.
55
+ if (scope.upper) {
56
+ return checkIfIdentifierIsFunction(scope.upper, name);
57
+ }
58
+
59
+ // We've reached the global scope and haven't found anything.
60
+ return false;
61
+ }
62
+
63
+ //--------------------------------------------------------------------------
64
+ // Public API
65
+ //--------------------------------------------------------------------------
66
+
67
+ return {
68
+
69
+ "AssignmentExpression": function(node) {
70
+ var scope = context.getScope(),
71
+ name = node.left.name;
72
+
73
+ if (checkIfIdentifierIsFunction(scope, name)) {
74
+ context.report(node, "'{{name}}' is a function.", { name: name });
75
+ }
76
+
77
+ }
78
+
79
+ };
80
+
81
+ };
82
+
83
+ module.exports.schema = [];
@@ -1,76 +1,76 @@
1
- /**
2
- * @fileoverview Rule to flag use of implied eval via setTimeout and setInterval
3
- * @author James Allardice
4
- * @copyright 2015 Mathias Schreck. All rights reserved.
5
- * @copyright 2013 James Allardice. All rights reserved.
6
- */
7
-
8
- "use strict";
9
-
10
- //------------------------------------------------------------------------------
11
- // Rule Definition
12
- //------------------------------------------------------------------------------
13
-
14
- module.exports = function(context) {
15
- var IMPLIED_EVAL = /set(?:Timeout|Interval)/;
16
-
17
- //--------------------------------------------------------------------------
18
- // Helpers
19
- //--------------------------------------------------------------------------
20
-
21
- /**
22
- * Checks if the first argument of a given CallExpression node is a string literal.
23
- * @param {ASTNode} node The CallExpression node the check.
24
- * @returns {boolean} True if the first argument is a string literal, false if not.
25
- */
26
- function hasStringLiteralArgument(node) {
27
- var firstArgument = node.arguments[0];
28
-
29
- return firstArgument && firstArgument.type === "Literal" && typeof firstArgument.value === "string";
30
- }
31
-
32
- /**
33
- * Checks if the given MemberExpression node is window.setTimeout or window.setInterval.
34
- * @param {ASTNode} node The MemberExpression node to check.
35
- * @returns {boolean} Whether or not the given node is window.set*.
36
- */
37
- function isSetMemberExpression(node) {
38
- var object = node.object,
39
- property = node.property,
40
- hasSetPropertyName = IMPLIED_EVAL.test(property.name) || IMPLIED_EVAL.test(property.value);
41
-
42
- return object.name === "window" && hasSetPropertyName;
43
-
44
- }
45
-
46
- /**
47
- * Determines if a node represents a call to setTimeout/setInterval with
48
- * a string argument.
49
- * @param {ASTNode} node The node to check.
50
- * @returns {boolean} True if the node matches, false if not.
51
- * @private
52
- */
53
- function isImpliedEval(node) {
54
- var isMemberExpression = (node.callee.type === "MemberExpression"),
55
- isIdentifier = (node.callee.type === "Identifier"),
56
- isSetMethod = (isIdentifier && IMPLIED_EVAL.test(node.callee.name)) ||
57
- (isMemberExpression && isSetMemberExpression(node.callee));
58
-
59
- return isSetMethod && hasStringLiteralArgument(node);
60
- }
61
-
62
- //--------------------------------------------------------------------------
63
- // Public
64
- //--------------------------------------------------------------------------
65
-
66
- return {
67
- "CallExpression": function(node) {
68
- if (isImpliedEval(node)) {
69
- context.report(node, "Implied eval. Consider passing a function instead of a string.");
70
- }
71
- }
72
- };
73
-
74
- };
75
-
76
- module.exports.schema = [];
1
+ /**
2
+ * @fileoverview Rule to flag use of implied eval via setTimeout and setInterval
3
+ * @author James Allardice
4
+ * @copyright 2015 Mathias Schreck. All rights reserved.
5
+ * @copyright 2013 James Allardice. All rights reserved.
6
+ */
7
+
8
+ "use strict";
9
+
10
+ //------------------------------------------------------------------------------
11
+ // Rule Definition
12
+ //------------------------------------------------------------------------------
13
+
14
+ module.exports = function(context) {
15
+ var IMPLIED_EVAL = /set(?:Timeout|Interval)|execScript/;
16
+
17
+ //--------------------------------------------------------------------------
18
+ // Helpers
19
+ //--------------------------------------------------------------------------
20
+
21
+ /**
22
+ * Checks if the first argument of a given CallExpression node is a string literal.
23
+ * @param {ASTNode} node The CallExpression node the check.
24
+ * @returns {boolean} True if the first argument is a string literal, false if not.
25
+ */
26
+ function hasStringLiteralArgument(node) {
27
+ var firstArgument = node.arguments[0];
28
+
29
+ return firstArgument && firstArgument.type === "Literal" && typeof firstArgument.value === "string";
30
+ }
31
+
32
+ /**
33
+ * Checks if the given MemberExpression node is window.setTimeout or window.setInterval.
34
+ * @param {ASTNode} node The MemberExpression node to check.
35
+ * @returns {boolean} Whether or not the given node is window.set*.
36
+ */
37
+ function isSetMemberExpression(node) {
38
+ var object = node.object,
39
+ property = node.property,
40
+ hasSetPropertyName = IMPLIED_EVAL.test(property.name) || IMPLIED_EVAL.test(property.value);
41
+
42
+ return object.name === "window" && hasSetPropertyName;
43
+
44
+ }
45
+
46
+ /**
47
+ * Determines if a node represents a call to setTimeout/setInterval with
48
+ * a string argument.
49
+ * @param {ASTNode} node The node to check.
50
+ * @returns {boolean} True if the node matches, false if not.
51
+ * @private
52
+ */
53
+ function isImpliedEval(node) {
54
+ var isMemberExpression = (node.callee.type === "MemberExpression"),
55
+ isIdentifier = (node.callee.type === "Identifier"),
56
+ isSetMethod = (isIdentifier && IMPLIED_EVAL.test(node.callee.name)) ||
57
+ (isMemberExpression && isSetMemberExpression(node.callee));
58
+
59
+ return isSetMethod && hasStringLiteralArgument(node);
60
+ }
61
+
62
+ //--------------------------------------------------------------------------
63
+ // Public
64
+ //--------------------------------------------------------------------------
65
+
66
+ return {
67
+ "CallExpression": function(node) {
68
+ if (isImpliedEval(node)) {
69
+ context.report(node, "Implied eval. Consider passing a function instead of a string.");
70
+ }
71
+ }
72
+ };
73
+
74
+ };
75
+
76
+ module.exports.schema = [];
@@ -1,49 +1,49 @@
1
- /**
2
- * @fileoverview Enforces or disallows inline comments.
3
- * @author Greg Cochard
4
- * @copyright 2014 Greg Cochard. All rights reserved.
5
- */
6
- "use strict";
7
-
8
- //------------------------------------------------------------------------------
9
- // Rule Definition
10
- //------------------------------------------------------------------------------
11
-
12
- module.exports = function(context) {
13
-
14
- /**
15
- * Will check that comments are not on lines starting with or ending with code
16
- * @param {ASTNode} node The comment node to check
17
- * @private
18
- * @returns {void}
19
- */
20
- function testCodeAroundComment(node) {
21
-
22
- // Get the whole line and cut it off at the start of the comment
23
- var startLine = String(context.getSourceLines()[node.loc.start.line - 1]);
24
- var endLine = String(context.getSourceLines()[node.loc.end.line - 1]);
25
-
26
- var preamble = startLine.slice(0, node.loc.start.column).trim();
27
-
28
- // Also check after the comment
29
- var postamble = endLine.slice(node.loc.end.column).trim();
30
-
31
- // Should be empty if there was only whitespace around the comment
32
- if (preamble || postamble) {
33
- context.report(node, "Unexpected comment inline with code.");
34
- }
35
- }
36
-
37
- //--------------------------------------------------------------------------
38
- // Public
39
- //--------------------------------------------------------------------------
40
-
41
- return {
42
-
43
- "LineComment": testCodeAroundComment,
44
- "BlockComment": testCodeAroundComment
45
-
46
- };
47
- };
48
-
49
- module.exports.schema = [];
1
+ /**
2
+ * @fileoverview Enforces or disallows inline comments.
3
+ * @author Greg Cochard
4
+ * @copyright 2014 Greg Cochard. All rights reserved.
5
+ */
6
+ "use strict";
7
+
8
+ //------------------------------------------------------------------------------
9
+ // Rule Definition
10
+ //------------------------------------------------------------------------------
11
+
12
+ module.exports = function(context) {
13
+
14
+ /**
15
+ * Will check that comments are not on lines starting with or ending with code
16
+ * @param {ASTNode} node The comment node to check
17
+ * @private
18
+ * @returns {void}
19
+ */
20
+ function testCodeAroundComment(node) {
21
+
22
+ // Get the whole line and cut it off at the start of the comment
23
+ var startLine = String(context.getSourceLines()[node.loc.start.line - 1]);
24
+ var endLine = String(context.getSourceLines()[node.loc.end.line - 1]);
25
+
26
+ var preamble = startLine.slice(0, node.loc.start.column).trim();
27
+
28
+ // Also check after the comment
29
+ var postamble = endLine.slice(node.loc.end.column).trim();
30
+
31
+ // Should be empty if there was only whitespace around the comment
32
+ if (preamble || postamble) {
33
+ context.report(node, "Unexpected comment inline with code.");
34
+ }
35
+ }
36
+
37
+ //--------------------------------------------------------------------------
38
+ // Public
39
+ //--------------------------------------------------------------------------
40
+
41
+ return {
42
+
43
+ "LineComment": testCodeAroundComment,
44
+ "BlockComment": testCodeAroundComment
45
+
46
+ };
47
+ };
48
+
49
+ module.exports.schema = [];
@@ -1,78 +1,78 @@
1
- /**
2
- * @fileoverview Rule to enforce declarations in program or function body root.
3
- * @author Brandon Mills
4
- * @copyright 2014 Brandon Mills. All rights reserved.
5
- */
6
-
7
- "use strict";
8
-
9
- //------------------------------------------------------------------------------
10
- // Rule Definition
11
- //------------------------------------------------------------------------------
12
-
13
- module.exports = function(context) {
14
-
15
- /**
16
- * Find the nearest Program or Function ancestor node.
17
- * @returns {Object} Ancestor's type and distance from node.
18
- */
19
- function nearestBody() {
20
- var ancestors = context.getAncestors(),
21
- ancestor = ancestors.pop(),
22
- generation = 1;
23
-
24
- while (ancestor && ["Program", "FunctionDeclaration",
25
- "FunctionExpression", "ArrowFunctionExpression"
26
- ].indexOf(ancestor.type) < 0) {
27
- generation += 1;
28
- ancestor = ancestors.pop();
29
- }
30
-
31
- return {
32
- // Type of containing ancestor
33
- type: ancestor.type,
34
- // Separation between ancestor and node
35
- distance: generation
36
- };
37
- }
38
-
39
- /**
40
- * Ensure that a given node is at a program or function body's root.
41
- * @param {ASTNode} node Declaration node to check.
42
- * @returns {void}
43
- */
44
- function check(node) {
45
- var body = nearestBody(node),
46
- valid = ((body.type === "Program" && body.distance === 1) ||
47
- body.distance === 2);
48
-
49
- if (!valid) {
50
- context.report(node, "Move {{type}} declaration to {{body}} root.",
51
- {
52
- type: (node.type === "FunctionDeclaration" ?
53
- "function" : "variable"),
54
- body: (body.type === "Program" ?
55
- "program" : "function body")
56
- }
57
- );
58
- }
59
- }
60
-
61
- return {
62
-
63
- "FunctionDeclaration": check,
64
- "VariableDeclaration": function(node) {
65
- if (context.options[0] === "both" && node.kind === "var") {
66
- check(node);
67
- }
68
- }
69
-
70
- };
71
-
72
- };
73
-
74
- module.exports.schema = [
75
- {
76
- "enum": ["functions", "both"]
77
- }
78
- ];
1
+ /**
2
+ * @fileoverview Rule to enforce declarations in program or function body root.
3
+ * @author Brandon Mills
4
+ * @copyright 2014 Brandon Mills. All rights reserved.
5
+ */
6
+
7
+ "use strict";
8
+
9
+ //------------------------------------------------------------------------------
10
+ // Rule Definition
11
+ //------------------------------------------------------------------------------
12
+
13
+ module.exports = function(context) {
14
+
15
+ /**
16
+ * Find the nearest Program or Function ancestor node.
17
+ * @returns {Object} Ancestor's type and distance from node.
18
+ */
19
+ function nearestBody() {
20
+ var ancestors = context.getAncestors(),
21
+ ancestor = ancestors.pop(),
22
+ generation = 1;
23
+
24
+ while (ancestor && ["Program", "FunctionDeclaration",
25
+ "FunctionExpression", "ArrowFunctionExpression"
26
+ ].indexOf(ancestor.type) < 0) {
27
+ generation += 1;
28
+ ancestor = ancestors.pop();
29
+ }
30
+
31
+ return {
32
+ // Type of containing ancestor
33
+ type: ancestor.type,
34
+ // Separation between ancestor and node
35
+ distance: generation
36
+ };
37
+ }
38
+
39
+ /**
40
+ * Ensure that a given node is at a program or function body's root.
41
+ * @param {ASTNode} node Declaration node to check.
42
+ * @returns {void}
43
+ */
44
+ function check(node) {
45
+ var body = nearestBody(node),
46
+ valid = ((body.type === "Program" && body.distance === 1) ||
47
+ body.distance === 2);
48
+
49
+ if (!valid) {
50
+ context.report(node, "Move {{type}} declaration to {{body}} root.",
51
+ {
52
+ type: (node.type === "FunctionDeclaration" ?
53
+ "function" : "variable"),
54
+ body: (body.type === "Program" ?
55
+ "program" : "function body")
56
+ }
57
+ );
58
+ }
59
+ }
60
+
61
+ return {
62
+
63
+ "FunctionDeclaration": check,
64
+ "VariableDeclaration": function(node) {
65
+ if (context.options[0] === "both" && node.kind === "var") {
66
+ check(node);
67
+ }
68
+ }
69
+
70
+ };
71
+
72
+ };
73
+
74
+ module.exports.schema = [
75
+ {
76
+ "enum": ["functions", "both"]
77
+ }
78
+ ];