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,195 +1,195 @@
1
- /**
2
- * @fileoverview Comma style - enforces comma styles of two types: last and first
3
- * @author Vignesh Anand aka vegetableman
4
- * @copyright 2014 Vignesh Anand. All rights reserved.
5
- * @copyright 2015 Evan Simmons. All rights reserved.
6
- */
7
-
8
- "use strict";
9
-
10
- //------------------------------------------------------------------------------
11
- // Rule Definition
12
- //------------------------------------------------------------------------------
13
-
14
- module.exports = function(context) {
15
-
16
- var style = context.options[0] || "last",
17
- exceptions = {};
18
-
19
- if (context.options.length === 2 && context.options[1].hasOwnProperty("exceptions")) {
20
- exceptions = context.options[1].exceptions;
21
- }
22
-
23
- //--------------------------------------------------------------------------
24
- // Helpers
25
- //--------------------------------------------------------------------------
26
-
27
- /**
28
- * Checks whether two tokens are on the same line.
29
- * @param {ASTNode} left The leftmost token.
30
- * @param {ASTNode} right The rightmost token.
31
- * @returns {boolean} True if the tokens are on the same line, false if not.
32
- * @private
33
- */
34
- function isSameLine(left, right) {
35
- return left.loc.end.line === right.loc.start.line;
36
- }
37
-
38
- /**
39
- * Determines if a given token is a comma operator.
40
- * @param {ASTNode} token The token to check.
41
- * @returns {boolean} True if the token is a comma, false if not.
42
- * @private
43
- */
44
- function isComma(token) {
45
- return !!token && (token.type === "Punctuator") && (token.value === ",");
46
- }
47
-
48
- /**
49
- * Validates the spacing around single items in lists.
50
- * @param {Token} previousItemToken The last token from the previous item.
51
- * @param {Token} commaToken The token representing the comma.
52
- * @param {Token} currentItemToken The first token of the current item.
53
- * @param {Token} reportItem The item to use when reporting an error.
54
- * @returns {void}
55
- * @private
56
- */
57
- function validateCommaItemSpacing(previousItemToken, commaToken, currentItemToken, reportItem) {
58
-
59
- // if single line
60
- if (isSameLine(commaToken, currentItemToken) &&
61
- isSameLine(previousItemToken, commaToken)) {
62
-
63
- return;
64
-
65
- } else if (!isSameLine(commaToken, currentItemToken) &&
66
- !isSameLine(previousItemToken, commaToken)) {
67
-
68
- // lone comma
69
- context.report(reportItem, {
70
- line: commaToken.loc.end.line,
71
- column: commaToken.loc.start.column
72
- }, "Bad line breaking before and after ','.");
73
-
74
- } else if (style === "first" && !isSameLine(commaToken, currentItemToken)) {
75
-
76
- context.report(reportItem, "',' should be placed first.");
77
-
78
- } else if (style === "last" && isSameLine(commaToken, currentItemToken)) {
79
-
80
- context.report(reportItem, {
81
- line: commaToken.loc.end.line,
82
- column: commaToken.loc.end.column
83
- }, "',' should be placed last.");
84
- }
85
- }
86
-
87
- /**
88
- * Checks the comma placement with regards to a declaration/property/element
89
- * @param {ASTNode} node The binary expression node to check
90
- * @param {string} property The property of the node containing child nodes.
91
- * @private
92
- * @returns {void}
93
- */
94
- function validateComma(node, property) {
95
- var items = node[property],
96
- arrayLiteral = (node.type === "ArrayExpression"),
97
- previousItemToken;
98
-
99
- if (items.length > 1 || arrayLiteral) {
100
-
101
- // seed as opening [
102
- previousItemToken = context.getFirstToken(node);
103
-
104
- items.forEach(function(item) {
105
- var commaToken = item ? context.getTokenBefore(item) : previousItemToken,
106
- currentItemToken = item ? context.getFirstToken(item) : context.getTokenAfter(commaToken),
107
- reportItem = item || currentItemToken;
108
-
109
- /*
110
- * This works by comparing three token locations:
111
- * - previousItemToken is the last token of the previous item
112
- * - commaToken is the location of the comma before the current item
113
- * - currentItemToken is the first token of the current item
114
- *
115
- * These values get switched around if item is undefined.
116
- * previousItemToken will refer to the last token not belonging
117
- * to the current item, which could be a comma or an opening
118
- * square bracket. currentItemToken could be a comma.
119
- *
120
- * All comparisons are done based on these tokens directly, so
121
- * they are always valid regardless of an undefined item.
122
- */
123
- if (isComma(commaToken)) {
124
- validateCommaItemSpacing(previousItemToken, commaToken,
125
- currentItemToken, reportItem);
126
- }
127
-
128
- previousItemToken = item ? context.getLastToken(item) : previousItemToken;
129
- });
130
-
131
- /*
132
- * Special case for array literals that have empty last items, such
133
- * as [ 1, 2, ]. These arrays only have two items show up in the
134
- * AST, so we need to look at the token to verify that there's no
135
- * dangling comma.
136
- */
137
- if (arrayLiteral) {
138
-
139
- var lastToken = context.getLastToken(node),
140
- nextToLastToken = context.getTokenBefore(lastToken);
141
-
142
- if (isComma(nextToLastToken)) {
143
- validateCommaItemSpacing(
144
- context.getTokenBefore(nextToLastToken),
145
- nextToLastToken,
146
- lastToken,
147
- lastToken
148
- );
149
- }
150
- }
151
- }
152
- }
153
-
154
- //--------------------------------------------------------------------------
155
- // Public
156
- //--------------------------------------------------------------------------
157
-
158
- var nodes = {};
159
-
160
- if (!exceptions.VariableDeclaration) {
161
- nodes.VariableDeclaration = function(node) {
162
- validateComma(node, "declarations");
163
- };
164
- }
165
- if (!exceptions.ObjectExpression) {
166
- nodes.ObjectExpression = function(node) {
167
- validateComma(node, "properties");
168
- };
169
- }
170
- if (!exceptions.ArrayExpression) {
171
- nodes.ArrayExpression = function(node) {
172
- validateComma(node, "elements");
173
- };
174
- }
175
-
176
- return nodes;
177
- };
178
-
179
- module.exports.schema = [
180
- {
181
- "enum": ["first", "last"]
182
- },
183
- {
184
- "type": "object",
185
- "properties": {
186
- "exceptions": {
187
- "type": "object",
188
- "additionalProperties": {
189
- "type": "boolean"
190
- }
191
- }
192
- },
193
- "additionalProperties": false
194
- }
195
- ];
1
+ /**
2
+ * @fileoverview Comma style - enforces comma styles of two types: last and first
3
+ * @author Vignesh Anand aka vegetableman
4
+ * @copyright 2014 Vignesh Anand. All rights reserved.
5
+ * @copyright 2015 Evan Simmons. All rights reserved.
6
+ */
7
+
8
+ "use strict";
9
+
10
+ //------------------------------------------------------------------------------
11
+ // Rule Definition
12
+ //------------------------------------------------------------------------------
13
+
14
+ module.exports = function(context) {
15
+
16
+ var style = context.options[0] || "last",
17
+ exceptions = {};
18
+
19
+ if (context.options.length === 2 && context.options[1].hasOwnProperty("exceptions")) {
20
+ exceptions = context.options[1].exceptions;
21
+ }
22
+
23
+ //--------------------------------------------------------------------------
24
+ // Helpers
25
+ //--------------------------------------------------------------------------
26
+
27
+ /**
28
+ * Checks whether two tokens are on the same line.
29
+ * @param {ASTNode} left The leftmost token.
30
+ * @param {ASTNode} right The rightmost token.
31
+ * @returns {boolean} True if the tokens are on the same line, false if not.
32
+ * @private
33
+ */
34
+ function isSameLine(left, right) {
35
+ return left.loc.end.line === right.loc.start.line;
36
+ }
37
+
38
+ /**
39
+ * Determines if a given token is a comma operator.
40
+ * @param {ASTNode} token The token to check.
41
+ * @returns {boolean} True if the token is a comma, false if not.
42
+ * @private
43
+ */
44
+ function isComma(token) {
45
+ return !!token && (token.type === "Punctuator") && (token.value === ",");
46
+ }
47
+
48
+ /**
49
+ * Validates the spacing around single items in lists.
50
+ * @param {Token} previousItemToken The last token from the previous item.
51
+ * @param {Token} commaToken The token representing the comma.
52
+ * @param {Token} currentItemToken The first token of the current item.
53
+ * @param {Token} reportItem The item to use when reporting an error.
54
+ * @returns {void}
55
+ * @private
56
+ */
57
+ function validateCommaItemSpacing(previousItemToken, commaToken, currentItemToken, reportItem) {
58
+
59
+ // if single line
60
+ if (isSameLine(commaToken, currentItemToken) &&
61
+ isSameLine(previousItemToken, commaToken)) {
62
+
63
+ return;
64
+
65
+ } else if (!isSameLine(commaToken, currentItemToken) &&
66
+ !isSameLine(previousItemToken, commaToken)) {
67
+
68
+ // lone comma
69
+ context.report(reportItem, {
70
+ line: commaToken.loc.end.line,
71
+ column: commaToken.loc.start.column
72
+ }, "Bad line breaking before and after ','.");
73
+
74
+ } else if (style === "first" && !isSameLine(commaToken, currentItemToken)) {
75
+
76
+ context.report(reportItem, "',' should be placed first.");
77
+
78
+ } else if (style === "last" && isSameLine(commaToken, currentItemToken)) {
79
+
80
+ context.report(reportItem, {
81
+ line: commaToken.loc.end.line,
82
+ column: commaToken.loc.end.column
83
+ }, "',' should be placed last.");
84
+ }
85
+ }
86
+
87
+ /**
88
+ * Checks the comma placement with regards to a declaration/property/element
89
+ * @param {ASTNode} node The binary expression node to check
90
+ * @param {string} property The property of the node containing child nodes.
91
+ * @private
92
+ * @returns {void}
93
+ */
94
+ function validateComma(node, property) {
95
+ var items = node[property],
96
+ arrayLiteral = (node.type === "ArrayExpression"),
97
+ previousItemToken;
98
+
99
+ if (items.length > 1 || arrayLiteral) {
100
+
101
+ // seed as opening [
102
+ previousItemToken = context.getFirstToken(node);
103
+
104
+ items.forEach(function(item) {
105
+ var commaToken = item ? context.getTokenBefore(item) : previousItemToken,
106
+ currentItemToken = item ? context.getFirstToken(item) : context.getTokenAfter(commaToken),
107
+ reportItem = item || currentItemToken;
108
+
109
+ /*
110
+ * This works by comparing three token locations:
111
+ * - previousItemToken is the last token of the previous item
112
+ * - commaToken is the location of the comma before the current item
113
+ * - currentItemToken is the first token of the current item
114
+ *
115
+ * These values get switched around if item is undefined.
116
+ * previousItemToken will refer to the last token not belonging
117
+ * to the current item, which could be a comma or an opening
118
+ * square bracket. currentItemToken could be a comma.
119
+ *
120
+ * All comparisons are done based on these tokens directly, so
121
+ * they are always valid regardless of an undefined item.
122
+ */
123
+ if (isComma(commaToken)) {
124
+ validateCommaItemSpacing(previousItemToken, commaToken,
125
+ currentItemToken, reportItem);
126
+ }
127
+
128
+ previousItemToken = item ? context.getLastToken(item) : previousItemToken;
129
+ });
130
+
131
+ /*
132
+ * Special case for array literals that have empty last items, such
133
+ * as [ 1, 2, ]. These arrays only have two items show up in the
134
+ * AST, so we need to look at the token to verify that there's no
135
+ * dangling comma.
136
+ */
137
+ if (arrayLiteral) {
138
+
139
+ var lastToken = context.getLastToken(node),
140
+ nextToLastToken = context.getTokenBefore(lastToken);
141
+
142
+ if (isComma(nextToLastToken)) {
143
+ validateCommaItemSpacing(
144
+ context.getTokenBefore(nextToLastToken),
145
+ nextToLastToken,
146
+ lastToken,
147
+ lastToken
148
+ );
149
+ }
150
+ }
151
+ }
152
+ }
153
+
154
+ //--------------------------------------------------------------------------
155
+ // Public
156
+ //--------------------------------------------------------------------------
157
+
158
+ var nodes = {};
159
+
160
+ if (!exceptions.VariableDeclaration) {
161
+ nodes.VariableDeclaration = function(node) {
162
+ validateComma(node, "declarations");
163
+ };
164
+ }
165
+ if (!exceptions.ObjectExpression) {
166
+ nodes.ObjectExpression = function(node) {
167
+ validateComma(node, "properties");
168
+ };
169
+ }
170
+ if (!exceptions.ArrayExpression) {
171
+ nodes.ArrayExpression = function(node) {
172
+ validateComma(node, "elements");
173
+ };
174
+ }
175
+
176
+ return nodes;
177
+ };
178
+
179
+ module.exports.schema = [
180
+ {
181
+ "enum": ["first", "last"]
182
+ },
183
+ {
184
+ "type": "object",
185
+ "properties": {
186
+ "exceptions": {
187
+ "type": "object",
188
+ "additionalProperties": {
189
+ "type": "boolean"
190
+ }
191
+ }
192
+ },
193
+ "additionalProperties": false
194
+ }
195
+ ];
@@ -1,94 +1,94 @@
1
- /**
2
- * @fileoverview Counts the cyclomatic complexity of each function of the script. See http://en.wikipedia.org/wiki/Cyclomatic_complexity.
3
- * Counts the number of if, conditional, for, whilte, try, switch/case,
4
- * @author Patrick Brosset
5
- */
6
-
7
- "use strict";
8
-
9
- //------------------------------------------------------------------------------
10
- // Rule Definition
11
- //------------------------------------------------------------------------------
12
-
13
- module.exports = function(context) {
14
-
15
- var THRESHOLD = context.options[0];
16
-
17
- //--------------------------------------------------------------------------
18
- // Helpers
19
- //--------------------------------------------------------------------------
20
-
21
- // Using a stack to store complexity (handling nested functions)
22
- var fns = [];
23
-
24
- // When parsing a new function, store it in our function stack
25
- function startFunction() {
26
- fns.push(1);
27
- }
28
-
29
- function endFunction(node) {
30
- var complexity = fns.pop(),
31
- name = "anonymous";
32
-
33
- if (node.id) {
34
- name = node.id.name;
35
- } else if (node.parent.type === "MethodDefinition") {
36
- name = node.parent.key.name;
37
- }
38
-
39
- if (complexity > THRESHOLD) {
40
- context.report(node, "Function '{{name}}' has a complexity of {{complexity}}.", { name: name, complexity: complexity });
41
- }
42
- }
43
-
44
- function increaseComplexity() {
45
- if (fns.length) {
46
- fns[fns.length - 1] ++;
47
- }
48
- }
49
-
50
- function increaseSwitchComplexity(node) {
51
- // Avoiding `default`
52
- if (node.test) {
53
- increaseComplexity(node);
54
- }
55
- }
56
-
57
- function increaseLogicalComplexity(node) {
58
- // Avoiding &&
59
- if (node.operator === "||") {
60
- increaseComplexity(node);
61
- }
62
- }
63
-
64
- //--------------------------------------------------------------------------
65
- // Public API
66
- //--------------------------------------------------------------------------
67
-
68
- return {
69
- "FunctionDeclaration": startFunction,
70
- "FunctionExpression": startFunction,
71
- "ArrowFunctionExpression": startFunction,
72
- "FunctionDeclaration:exit": endFunction,
73
- "FunctionExpression:exit": endFunction,
74
- "ArrowFunctionExpression:exit": endFunction,
75
-
76
- "CatchClause": increaseComplexity,
77
- "ConditionalExpression": increaseComplexity,
78
- "LogicalExpression": increaseLogicalComplexity,
79
- "ForStatement": increaseComplexity,
80
- "ForInStatement": increaseComplexity,
81
- "ForOfStatement": increaseComplexity,
82
- "IfStatement": increaseComplexity,
83
- "SwitchCase": increaseSwitchComplexity,
84
- "WhileStatement": increaseComplexity,
85
- "DoWhileStatement": increaseComplexity
86
- };
87
-
88
- };
89
-
90
- module.exports.schema = [
91
- {
92
- "type": "integer"
93
- }
94
- ];
1
+ /**
2
+ * @fileoverview Counts the cyclomatic complexity of each function of the script. See http://en.wikipedia.org/wiki/Cyclomatic_complexity.
3
+ * Counts the number of if, conditional, for, whilte, try, switch/case,
4
+ * @author Patrick Brosset
5
+ */
6
+
7
+ "use strict";
8
+
9
+ //------------------------------------------------------------------------------
10
+ // Rule Definition
11
+ //------------------------------------------------------------------------------
12
+
13
+ module.exports = function(context) {
14
+
15
+ var THRESHOLD = context.options[0];
16
+
17
+ //--------------------------------------------------------------------------
18
+ // Helpers
19
+ //--------------------------------------------------------------------------
20
+
21
+ // Using a stack to store complexity (handling nested functions)
22
+ var fns = [];
23
+
24
+ // When parsing a new function, store it in our function stack
25
+ function startFunction() {
26
+ fns.push(1);
27
+ }
28
+
29
+ function endFunction(node) {
30
+ var complexity = fns.pop(),
31
+ name = "anonymous";
32
+
33
+ if (node.id) {
34
+ name = node.id.name;
35
+ } else if (node.parent.type === "MethodDefinition") {
36
+ name = node.parent.key.name;
37
+ }
38
+
39
+ if (complexity > THRESHOLD) {
40
+ context.report(node, "Function '{{name}}' has a complexity of {{complexity}}.", { name: name, complexity: complexity });
41
+ }
42
+ }
43
+
44
+ function increaseComplexity() {
45
+ if (fns.length) {
46
+ fns[fns.length - 1] ++;
47
+ }
48
+ }
49
+
50
+ function increaseSwitchComplexity(node) {
51
+ // Avoiding `default`
52
+ if (node.test) {
53
+ increaseComplexity(node);
54
+ }
55
+ }
56
+
57
+ function increaseLogicalComplexity(node) {
58
+ // Avoiding &&
59
+ if (node.operator === "||") {
60
+ increaseComplexity(node);
61
+ }
62
+ }
63
+
64
+ //--------------------------------------------------------------------------
65
+ // Public API
66
+ //--------------------------------------------------------------------------
67
+
68
+ return {
69
+ "FunctionDeclaration": startFunction,
70
+ "FunctionExpression": startFunction,
71
+ "ArrowFunctionExpression": startFunction,
72
+ "FunctionDeclaration:exit": endFunction,
73
+ "FunctionExpression:exit": endFunction,
74
+ "ArrowFunctionExpression:exit": endFunction,
75
+
76
+ "CatchClause": increaseComplexity,
77
+ "ConditionalExpression": increaseComplexity,
78
+ "LogicalExpression": increaseLogicalComplexity,
79
+ "ForStatement": increaseComplexity,
80
+ "ForInStatement": increaseComplexity,
81
+ "ForOfStatement": increaseComplexity,
82
+ "IfStatement": increaseComplexity,
83
+ "SwitchCase": increaseSwitchComplexity,
84
+ "WhileStatement": increaseComplexity,
85
+ "DoWhileStatement": increaseComplexity
86
+ };
87
+
88
+ };
89
+
90
+ module.exports.schema = [
91
+ {
92
+ "type": "integer"
93
+ }
94
+ ];