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,44 +1,44 @@
1
- /**
2
- * @fileoverview Rule to forbid mixing LF and LFCR line breaks.
3
- * @author Erik Mueller
4
- * @copyright 2015 Varun Verma. All rights reserverd.
5
- * @copyright 2015 James Whitney. All rights reserved.
6
- * @copyright 2015 Erik Mueller. All rights reserved.
7
- */
8
-
9
- "use strict";
10
-
11
- //------------------------------------------------------------------------------
12
- // Rule Definition
13
- //------------------------------------------------------------------------------
14
-
15
- module.exports = function (context) {
16
- var EXPECTED_LF_MSG = "Expected linebreaks to be 'LF' but found 'CRLF'.",
17
- EXPECTED_CRLF_MSG = "Expected linebreaks to be 'CRLF' but found 'LF'.";
18
-
19
- return {
20
- "Program": function checkForlinebreakStyle(node) {
21
- var linebreakStyle = context.options[0] || "unix",
22
- expectedLF = linebreakStyle === "unix",
23
- linebreaks = context.getSource().match(/\r\n|\r|\n|\u2028|\u2029/g),
24
- lineOfError = -1;
25
-
26
- if (linebreaks !== null) {
27
- lineOfError = linebreaks.indexOf(expectedLF ? "\r\n" : "\n");
28
- }
29
-
30
- if (lineOfError !== -1) {
31
- context.report(node, {
32
- line: lineOfError + 1,
33
- column: context.getSourceLines()[lineOfError].length
34
- }, expectedLF ? EXPECTED_LF_MSG : EXPECTED_CRLF_MSG);
35
- }
36
- }
37
- };
38
- };
39
-
40
- module.exports.schema = [
41
- {
42
- "enum": ["unix", "windows"]
43
- }
44
- ];
1
+ /**
2
+ * @fileoverview Rule to forbid mixing LF and LFCR line breaks.
3
+ * @author Erik Mueller
4
+ * @copyright 2015 Varun Verma. All rights reserverd.
5
+ * @copyright 2015 James Whitney. All rights reserved.
6
+ * @copyright 2015 Erik Mueller. All rights reserved.
7
+ */
8
+
9
+ "use strict";
10
+
11
+ //------------------------------------------------------------------------------
12
+ // Rule Definition
13
+ //------------------------------------------------------------------------------
14
+
15
+ module.exports = function (context) {
16
+ var EXPECTED_LF_MSG = "Expected linebreaks to be 'LF' but found 'CRLF'.",
17
+ EXPECTED_CRLF_MSG = "Expected linebreaks to be 'CRLF' but found 'LF'.";
18
+
19
+ return {
20
+ "Program": function checkForlinebreakStyle(node) {
21
+ var linebreakStyle = context.options[0] || "unix",
22
+ expectedLF = linebreakStyle === "unix",
23
+ linebreaks = context.getSource().match(/\r\n|\r|\n|\u2028|\u2029/g),
24
+ lineOfError = -1;
25
+
26
+ if (linebreaks !== null) {
27
+ lineOfError = linebreaks.indexOf(expectedLF ? "\r\n" : "\n");
28
+ }
29
+
30
+ if (lineOfError !== -1) {
31
+ context.report(node, {
32
+ line: lineOfError + 1,
33
+ column: context.getSourceLines()[lineOfError].length
34
+ }, expectedLF ? EXPECTED_LF_MSG : EXPECTED_CRLF_MSG);
35
+ }
36
+ }
37
+ };
38
+ };
39
+
40
+ module.exports.schema = [
41
+ {
42
+ "enum": ["unix", "windows"]
43
+ }
44
+ ];
@@ -1,160 +1,228 @@
1
- /**
2
- * @fileoverview Enforces empty lines around comments.
3
- * @author Jamund Ferguson
4
- * @copyright 2015 Jamund Ferguson. All rights reserved.
5
- */
6
- "use strict";
7
-
8
- /**
9
- * Return an array with with any line numbers that are empty.
10
- * @param {Array} lines An array of each line of the file.
11
- * @returns {Array} An array of line numbers.
12
- */
13
- function getEmptyLineNums(lines) {
14
- var emptyLines = lines.map(function(line, i) {
15
- return {
16
- code: line.trim(),
17
- num: i + 1
18
- };
19
- }).filter(function(line) {
20
- return !line.code;
21
- }).map(function(line) {
22
- return line.num;
23
- });
24
- return emptyLines;
25
- }
26
-
27
- /**
28
- * Return an array with with any line numbers that contain comments.
29
- * @param {Array} comments An array of comment nodes.
30
- * @returns {Array} An array of line numbers.
31
- */
32
- function getCommentLineNums(comments) {
33
- var lines = [];
34
- comments.forEach(function (token) {
35
- var start = token.loc.start.line;
36
- var end = token.loc.end.line;
37
- lines.push(start, end);
38
- });
39
- return lines;
40
- }
41
-
42
- /**
43
- * Determines if a value is an array.
44
- * @param {number} val The value we wish to check for in the array..
45
- * @param {Array} array An array.
46
- * @returns {boolean} True if the value is in the array..
47
- */
48
- function contains(val, array) {
49
- return array.indexOf(val) > -1;
50
- }
51
-
52
- //------------------------------------------------------------------------------
53
- // Rule Definition
54
- //------------------------------------------------------------------------------
55
-
56
- module.exports = function(context) {
57
-
58
- var options = context.options[0] || {};
59
- options.beforeLineComment = options.beforeLineComment || false;
60
- options.afterLineComment = options.afterLineComment || false;
61
- options.beforeBlockComment = options.beforeBlockComment || false;
62
- options.afterBlockComment = typeof options.afterBlockComment !== "undefined" ? options.afterBlockComment : true;
63
-
64
- /**
65
- * Returns whether or not comments are not on lines starting with or ending with code
66
- * @param {ASTNode} node The comment node to check.
67
- * @returns {boolean} True if the comment is not alone.
68
- */
69
- function codeAroundComment(node) {
70
-
71
- var lines = context.getSourceLines();
72
-
73
- // Get the whole line and cut it off at the start of the comment
74
- var startLine = lines[node.loc.start.line - 1];
75
- var endLine = lines[node.loc.end.line - 1];
76
-
77
- var preamble = startLine.slice(0, node.loc.start.column).trim();
78
-
79
- // Also check after the comment
80
- var postamble = endLine.slice(node.loc.end.column).trim();
81
-
82
- // Should be false if there was only whitespace around the comment
83
- return !!(preamble || postamble);
84
- }
85
-
86
- /**
87
- * Checks if a comment node has lines around it (ignores inline comments)
88
- * @param {ASTNode} node The Comment node.
89
- * @param {Object} opts Options to determine the newline.
90
- * @param {Boolean} opts.after Should have a newline after this line.
91
- * @param {Boolean} opts.before Should have a newline before this line.
92
- * @returns {void}
93
- */
94
- function checkForEmptyLine(node, opts) {
95
-
96
- var lines = context.getSourceLines(),
97
- numLines = lines.length + 1,
98
- comments = context.getAllComments(),
99
- commentLines = getCommentLineNums(comments),
100
- emptyLines = getEmptyLineNums(lines),
101
- commentAndEmptyLines = commentLines.concat(emptyLines);
102
-
103
- var after = opts.after,
104
- before = opts.before;
105
-
106
- var prevLineNum = node.loc.start.line - 1,
107
- nextLineNum = node.loc.end.line + 1,
108
- commentIsNotAlone = codeAroundComment(node);
109
-
110
- // ignore top of the file and bottom of the file
111
- if (prevLineNum < 1) {
112
- before = false;
113
- }
114
- if (nextLineNum >= numLines) {
115
- after = false;
116
- }
117
-
118
- // we ignore all inline comments
119
- if (commentIsNotAlone) {
120
- return;
121
- }
122
-
123
- // check for newline before
124
- if (before && !contains(prevLineNum, commentAndEmptyLines)) {
125
- context.report(node, "Expected line before comment.");
126
- }
127
-
128
- // check for newline after
129
- if (after && !contains(nextLineNum, commentAndEmptyLines)) {
130
- context.report(node, "Expected line after comment.");
131
- }
132
-
133
- }
134
-
135
- //--------------------------------------------------------------------------
136
- // Public
137
- //--------------------------------------------------------------------------
138
-
139
- return {
140
-
141
- "LineComment": function(node) {
142
- if (options.beforeLineComment || options.afterLineComment) {
143
- checkForEmptyLine(node, {
144
- after: options.afterLineComment,
145
- before: options.beforeLineComment
146
- });
147
- }
148
- },
149
-
150
- "BlockComment": function(node) {
151
- if (options.beforeBlockComment || options.afterBlockComment) {
152
- checkForEmptyLine(node, {
153
- after: options.afterBlockComment,
154
- before: options.beforeBlockComment
155
- });
156
- }
157
- }
158
-
159
- };
160
- };
1
+ /**
2
+ * @fileoverview Enforces empty lines around comments.
3
+ * @author Jamund Ferguson
4
+ * @copyright 2015 Mathieu M-Gosselin. All rights reserved.
5
+ * @copyright 2015 Jamund Ferguson. All rights reserved.
6
+ * @copyright 2015 Gyandeep Singh. All rights reserved.
7
+ */
8
+ "use strict";
9
+
10
+ /**
11
+ * Return an array with with any line numbers that are empty.
12
+ * @param {Array} lines An array of each line of the file.
13
+ * @returns {Array} An array of line numbers.
14
+ */
15
+ function getEmptyLineNums(lines) {
16
+ var emptyLines = lines.map(function(line, i) {
17
+ return {
18
+ code: line.trim(),
19
+ num: i + 1
20
+ };
21
+ }).filter(function(line) {
22
+ return !line.code;
23
+ }).map(function(line) {
24
+ return line.num;
25
+ });
26
+ return emptyLines;
27
+ }
28
+
29
+ /**
30
+ * Return an array with with any line numbers that contain comments.
31
+ * @param {Array} comments An array of comment nodes.
32
+ * @returns {Array} An array of line numbers.
33
+ */
34
+ function getCommentLineNums(comments) {
35
+ var lines = [];
36
+ comments.forEach(function (token) {
37
+ var start = token.loc.start.line;
38
+ var end = token.loc.end.line;
39
+ lines.push(start, end);
40
+ });
41
+ return lines;
42
+ }
43
+
44
+ /**
45
+ * Determines if a value is an array.
46
+ * @param {number} val The value we wish to check for in the array..
47
+ * @param {Array} array An array.
48
+ * @returns {boolean} True if the value is in the array..
49
+ */
50
+ function contains(val, array) {
51
+ return array.indexOf(val) > -1;
52
+ }
53
+
54
+ //------------------------------------------------------------------------------
55
+ // Rule Definition
56
+ //------------------------------------------------------------------------------
57
+
58
+ module.exports = function(context) {
59
+
60
+ var options = context.options[0] || {};
61
+ options.beforeLineComment = options.beforeLineComment || false;
62
+ options.afterLineComment = options.afterLineComment || false;
63
+ options.beforeBlockComment = typeof options.beforeBlockComment !== "undefined" ? options.beforeBlockComment : true;
64
+ options.afterBlockComment = options.afterBlockComment || false;
65
+ options.allowBlockStart = options.allowBlockStart || false;
66
+ options.allowBlockEnd = options.allowBlockEnd || false;
67
+
68
+ /**
69
+ * Returns whether or not comments are not on lines starting with or ending with code
70
+ * @param {ASTNode} node The comment node to check.
71
+ * @returns {boolean} True if the comment is not alone.
72
+ */
73
+ function codeAroundComment(node) {
74
+
75
+ var lines = context.getSourceLines();
76
+
77
+ // Get the whole line and cut it off at the start of the comment
78
+ var startLine = lines[node.loc.start.line - 1];
79
+ var endLine = lines[node.loc.end.line - 1];
80
+
81
+ var preamble = startLine.slice(0, node.loc.start.column).trim();
82
+
83
+ // Also check after the comment
84
+ var postamble = endLine.slice(node.loc.end.column).trim();
85
+
86
+ // Should be false if there was only whitespace around the comment
87
+ return !!(preamble || postamble);
88
+ }
89
+
90
+ /**
91
+ * Returns whether or not comments are at the block start or not.
92
+ * @param {ASTNode} node The Comment node.
93
+ * @returns {boolean} True if the comment is at block start.
94
+ */
95
+ function isCommentAtBlockStart(node) {
96
+ var ancestors = context.getAncestors();
97
+ var parent;
98
+
99
+ if (ancestors.length) {
100
+ parent = ancestors.pop();
101
+ }
102
+
103
+ return parent && (parent.type === "ClassBody" || parent.type === "BlockStatement" || (parent.body && parent.body.type === "BlockStatement")) &&
104
+ node.loc.start.line - parent.loc.start.line === 1;
105
+ }
106
+
107
+ /**
108
+ * Returns whether or not comments are at the block end or not.
109
+ * @param {ASTNode} node The Comment node.
110
+ * @returns {boolean} True if the comment is at block end.
111
+ */
112
+ function isCommentAtBlockEnd(node) {
113
+ var ancestors = context.getAncestors();
114
+ var parent;
115
+
116
+ if (ancestors.length) {
117
+ parent = ancestors.pop();
118
+ }
119
+
120
+ return parent && (parent.type === "ClassBody" || parent.type === "BlockStatement" || (parent.body && parent.body.type === "BlockStatement")) &&
121
+ parent.loc.end.line - node.loc.end.line === 1;
122
+ }
123
+
124
+ /**
125
+ * Checks if a comment node has lines around it (ignores inline comments)
126
+ * @param {ASTNode} node The Comment node.
127
+ * @param {Object} opts Options to determine the newline.
128
+ * @param {Boolean} opts.after Should have a newline after this line.
129
+ * @param {Boolean} opts.before Should have a newline before this line.
130
+ * @returns {void}
131
+ */
132
+ function checkForEmptyLine(node, opts) {
133
+
134
+ var lines = context.getSourceLines(),
135
+ numLines = lines.length + 1,
136
+ comments = context.getAllComments(),
137
+ commentLines = getCommentLineNums(comments),
138
+ emptyLines = getEmptyLineNums(lines),
139
+ commentAndEmptyLines = commentLines.concat(emptyLines);
140
+
141
+ var after = opts.after,
142
+ before = opts.before;
143
+
144
+ var prevLineNum = node.loc.start.line - 1,
145
+ nextLineNum = node.loc.end.line + 1,
146
+ commentIsNotAlone = codeAroundComment(node);
147
+
148
+ var blockStartAllowed = options.allowBlockStart && isCommentAtBlockStart(node),
149
+ blockEndAllowed = options.allowBlockEnd && isCommentAtBlockEnd(node);
150
+
151
+ // ignore top of the file and bottom of the file
152
+ if (prevLineNum < 1) {
153
+ before = false;
154
+ }
155
+ if (nextLineNum >= numLines) {
156
+ after = false;
157
+ }
158
+
159
+ // we ignore all inline comments
160
+ if (commentIsNotAlone) {
161
+ return;
162
+ }
163
+
164
+ // check for newline before
165
+ if (!blockStartAllowed && before && !contains(prevLineNum, commentAndEmptyLines)) {
166
+ context.report(node, "Expected line before comment.");
167
+ }
168
+
169
+ // check for newline after
170
+ if (!blockEndAllowed && after && !contains(nextLineNum, commentAndEmptyLines)) {
171
+ context.report(node, "Expected line after comment.");
172
+ }
173
+
174
+ }
175
+
176
+ //--------------------------------------------------------------------------
177
+ // Public
178
+ //--------------------------------------------------------------------------
179
+
180
+ return {
181
+
182
+ "LineComment": function(node) {
183
+ if (options.beforeLineComment || options.afterLineComment) {
184
+ checkForEmptyLine(node, {
185
+ after: options.afterLineComment,
186
+ before: options.beforeLineComment
187
+ });
188
+ }
189
+ },
190
+
191
+ "BlockComment": function(node) {
192
+ if (options.beforeBlockComment || options.afterBlockComment) {
193
+ checkForEmptyLine(node, {
194
+ after: options.afterBlockComment,
195
+ before: options.beforeBlockComment
196
+ });
197
+ }
198
+ }
199
+
200
+ };
201
+ };
202
+
203
+ module.exports.schema = [
204
+ {
205
+ "type": "object",
206
+ "properties": {
207
+ "beforeBlockComment": {
208
+ "type": "boolean"
209
+ },
210
+ "afterBlockComment": {
211
+ "type": "boolean"
212
+ },
213
+ "beforeLineComment": {
214
+ "type": "boolean"
215
+ },
216
+ "afterLineComment": {
217
+ "type": "boolean"
218
+ },
219
+ "allowBlockStart": {
220
+ "type": "boolean"
221
+ },
222
+ "allowBlockEnd": {
223
+ "type": "boolean"
224
+ }
225
+ },
226
+ "additionalProperties": false
227
+ }
228
+ ];
@@ -1,89 +1,89 @@
1
- /**
2
- * @fileoverview A rule to set the maximum depth block can be nested in a function.
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
- var functionStack = [],
20
- maxDepth = context.options[0] || 4;
21
-
22
- function startFunction() {
23
- functionStack.push(0);
24
- }
25
-
26
- function endFunction() {
27
- functionStack.pop();
28
- }
29
-
30
- function pushBlock(node) {
31
- var len = ++functionStack[functionStack.length - 1];
32
-
33
- if (len > maxDepth) {
34
- context.report(node, "Blocks are nested too deeply ({{depth}}).",
35
- { depth: len });
36
- }
37
- }
38
-
39
- function popBlock() {
40
- functionStack[functionStack.length - 1]--;
41
- }
42
-
43
- //--------------------------------------------------------------------------
44
- // Public API
45
- //--------------------------------------------------------------------------
46
-
47
- return {
48
- "Program": startFunction,
49
- "FunctionDeclaration": startFunction,
50
- "FunctionExpression": startFunction,
51
- "ArrowFunctionExpression": startFunction,
52
-
53
- "IfStatement": function(node) {
54
- if (node.parent.type !== "IfStatement") {
55
- pushBlock(node);
56
- }
57
- },
58
- "SwitchStatement": pushBlock,
59
- "TryStatement": pushBlock,
60
- "DoWhileStatement": pushBlock,
61
- "WhileStatement": pushBlock,
62
- "WithStatement": pushBlock,
63
- "ForStatement": pushBlock,
64
- "ForInStatement": pushBlock,
65
- "ForOfStatement": pushBlock,
66
-
67
- "IfStatement:exit": popBlock,
68
- "SwitchStatement:exit": popBlock,
69
- "TryStatement:exit": popBlock,
70
- "DoWhileStatement:exit": popBlock,
71
- "WhileStatement:exit": popBlock,
72
- "WithStatement:exit": popBlock,
73
- "ForStatement:exit": popBlock,
74
- "ForInStatement:exit": popBlock,
75
- "ForOfStatement:exit": popBlock,
76
-
77
- "FunctionDeclaration:exit": endFunction,
78
- "FunctionExpression:exit": endFunction,
79
- "ArrowFunctionExpression:exit": endFunction,
80
- "Program:exit": endFunction
81
- };
82
-
83
- };
84
-
85
- module.exports.schema = [
86
- {
87
- "type": "integer"
88
- }
89
- ];
1
+ /**
2
+ * @fileoverview A rule to set the maximum depth block can be nested in a function.
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
+ var functionStack = [],
20
+ maxDepth = context.options[0] || 4;
21
+
22
+ function startFunction() {
23
+ functionStack.push(0);
24
+ }
25
+
26
+ function endFunction() {
27
+ functionStack.pop();
28
+ }
29
+
30
+ function pushBlock(node) {
31
+ var len = ++functionStack[functionStack.length - 1];
32
+
33
+ if (len > maxDepth) {
34
+ context.report(node, "Blocks are nested too deeply ({{depth}}).",
35
+ { depth: len });
36
+ }
37
+ }
38
+
39
+ function popBlock() {
40
+ functionStack[functionStack.length - 1]--;
41
+ }
42
+
43
+ //--------------------------------------------------------------------------
44
+ // Public API
45
+ //--------------------------------------------------------------------------
46
+
47
+ return {
48
+ "Program": startFunction,
49
+ "FunctionDeclaration": startFunction,
50
+ "FunctionExpression": startFunction,
51
+ "ArrowFunctionExpression": startFunction,
52
+
53
+ "IfStatement": function(node) {
54
+ if (node.parent.type !== "IfStatement") {
55
+ pushBlock(node);
56
+ }
57
+ },
58
+ "SwitchStatement": pushBlock,
59
+ "TryStatement": pushBlock,
60
+ "DoWhileStatement": pushBlock,
61
+ "WhileStatement": pushBlock,
62
+ "WithStatement": pushBlock,
63
+ "ForStatement": pushBlock,
64
+ "ForInStatement": pushBlock,
65
+ "ForOfStatement": pushBlock,
66
+
67
+ "IfStatement:exit": popBlock,
68
+ "SwitchStatement:exit": popBlock,
69
+ "TryStatement:exit": popBlock,
70
+ "DoWhileStatement:exit": popBlock,
71
+ "WhileStatement:exit": popBlock,
72
+ "WithStatement:exit": popBlock,
73
+ "ForStatement:exit": popBlock,
74
+ "ForInStatement:exit": popBlock,
75
+ "ForOfStatement:exit": popBlock,
76
+
77
+ "FunctionDeclaration:exit": endFunction,
78
+ "FunctionExpression:exit": endFunction,
79
+ "ArrowFunctionExpression:exit": endFunction,
80
+ "Program:exit": endFunction
81
+ };
82
+
83
+ };
84
+
85
+ module.exports.schema = [
86
+ {
87
+ "type": "integer"
88
+ }
89
+ ];