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,105 +1,105 @@
1
- /**
2
- * @fileoverview Rule to flag use of variables before they are defined
3
- * @author Ilya Volodin
4
- * @copyright 2013 Ilya Volodin. All rights reserved.
5
- */
6
-
7
- "use strict";
8
-
9
- //------------------------------------------------------------------------------
10
- // Constants
11
- //------------------------------------------------------------------------------
12
-
13
- var NO_FUNC = "nofunc";
14
-
15
- //------------------------------------------------------------------------------
16
- // Rule Definition
17
- //------------------------------------------------------------------------------
18
-
19
- module.exports = function(context) {
20
-
21
- /**
22
- * Finds variable declarations in a given scope.
23
- * @param {string} name The variable name to find.
24
- * @param {Scope} scope The scope to search in.
25
- * @returns {Object} The variable declaration object.
26
- * @private
27
- */
28
- function findDeclaration(name, scope) {
29
- // try searching in the current scope first
30
- for (var i = 0, l = scope.variables.length; i < l; i++) {
31
- if (scope.variables[i].name === name) {
32
- return scope.variables[i];
33
- }
34
- }
35
- // check if there's upper scope and call recursivly till we find the variable
36
- if (scope.upper) {
37
- return findDeclaration(name, scope.upper);
38
- }
39
- }
40
-
41
- /**
42
- * Finds and validates all variables in a given scope.
43
- * @param {Scope} scope The scope object.
44
- * @returns {void}
45
- * @private
46
- */
47
- function findVariablesInScope(scope) {
48
- var typeOption = context.options[0];
49
-
50
- function checkLocationAndReport(reference, declaration) {
51
- if (typeOption !== NO_FUNC || declaration.defs[0].type !== "FunctionName") {
52
- if (declaration.identifiers[0].range[1] > reference.identifier.range[1]) {
53
- context.report(reference.identifier, "{{a}} was used before it was defined", {a: reference.identifier.name});
54
- }
55
- }
56
- }
57
-
58
- scope.references.forEach(function(reference) {
59
- // if the reference is resolved check for declaration location
60
- // if not, it could be function invocation, try to find manually
61
- if (reference.resolved && reference.resolved.identifiers.length > 0) {
62
- checkLocationAndReport(reference, reference.resolved);
63
- } else {
64
- var declaration = findDeclaration(reference.identifier.name, scope);
65
- // if there're no identifiers, this is a global environment variable
66
- if (declaration && declaration.identifiers.length !== 0) {
67
- checkLocationAndReport(reference, declaration);
68
- }
69
- }
70
- });
71
- }
72
-
73
-
74
- /**
75
- * Validates variables inside of a node's scope.
76
- * @param {ASTNode} node The node to check.
77
- * @returns {void}
78
- * @private
79
- */
80
- function findVariables() {
81
- var scope = context.getScope();
82
- findVariablesInScope(scope);
83
- }
84
-
85
- return {
86
- "Program": function() {
87
- var scope = context.getScope();
88
- findVariablesInScope(scope);
89
-
90
- // both Node.js and Modules have an extra scope
91
- if (context.ecmaFeatures.globalReturn || context.ecmaFeatures.modules) {
92
- findVariablesInScope(scope.childScopes[0]);
93
- }
94
- },
95
- "FunctionExpression": findVariables,
96
- "FunctionDeclaration": findVariables,
97
- "ArrowFunctionExpression": findVariables
98
- };
99
- };
100
-
101
- module.exports.schema = [
102
- {
103
- "enum": ["nofunc"]
104
- }
105
- ];
1
+ /**
2
+ * @fileoverview Rule to flag use of variables before they are defined
3
+ * @author Ilya Volodin
4
+ * @copyright 2013 Ilya Volodin. All rights reserved.
5
+ */
6
+
7
+ "use strict";
8
+
9
+ //------------------------------------------------------------------------------
10
+ // Constants
11
+ //------------------------------------------------------------------------------
12
+
13
+ var NO_FUNC = "nofunc";
14
+
15
+ //------------------------------------------------------------------------------
16
+ // Rule Definition
17
+ //------------------------------------------------------------------------------
18
+
19
+ module.exports = function(context) {
20
+
21
+ /**
22
+ * Finds variable declarations in a given scope.
23
+ * @param {string} name The variable name to find.
24
+ * @param {Scope} scope The scope to search in.
25
+ * @returns {Object} The variable declaration object.
26
+ * @private
27
+ */
28
+ function findDeclaration(name, scope) {
29
+ // try searching in the current scope first
30
+ for (var i = 0, l = scope.variables.length; i < l; i++) {
31
+ if (scope.variables[i].name === name) {
32
+ return scope.variables[i];
33
+ }
34
+ }
35
+ // check if there's upper scope and call recursivly till we find the variable
36
+ if (scope.upper) {
37
+ return findDeclaration(name, scope.upper);
38
+ }
39
+ }
40
+
41
+ /**
42
+ * Finds and validates all variables in a given scope.
43
+ * @param {Scope} scope The scope object.
44
+ * @returns {void}
45
+ * @private
46
+ */
47
+ function findVariablesInScope(scope) {
48
+ var typeOption = context.options[0];
49
+
50
+ function checkLocationAndReport(reference, declaration) {
51
+ if (typeOption !== NO_FUNC || declaration.defs[0].type !== "FunctionName") {
52
+ if (declaration.identifiers[0].range[1] > reference.identifier.range[1]) {
53
+ context.report(reference.identifier, "{{a}} was used before it was defined", {a: reference.identifier.name});
54
+ }
55
+ }
56
+ }
57
+
58
+ scope.references.forEach(function(reference) {
59
+ // if the reference is resolved check for declaration location
60
+ // if not, it could be function invocation, try to find manually
61
+ if (reference.resolved && reference.resolved.identifiers.length > 0) {
62
+ checkLocationAndReport(reference, reference.resolved);
63
+ } else {
64
+ var declaration = findDeclaration(reference.identifier.name, scope);
65
+ // if there're no identifiers, this is a global environment variable
66
+ if (declaration && declaration.identifiers.length !== 0) {
67
+ checkLocationAndReport(reference, declaration);
68
+ }
69
+ }
70
+ });
71
+ }
72
+
73
+
74
+ /**
75
+ * Validates variables inside of a node's scope.
76
+ * @param {ASTNode} node The node to check.
77
+ * @returns {void}
78
+ * @private
79
+ */
80
+ function findVariables() {
81
+ var scope = context.getScope();
82
+ findVariablesInScope(scope);
83
+ }
84
+
85
+ return {
86
+ "Program": function() {
87
+ var scope = context.getScope();
88
+ findVariablesInScope(scope);
89
+
90
+ // both Node.js and Modules have an extra scope
91
+ if (context.ecmaFeatures.globalReturn || context.ecmaFeatures.modules) {
92
+ findVariablesInScope(scope.childScopes[0]);
93
+ }
94
+ },
95
+ "FunctionExpression": findVariables,
96
+ "FunctionDeclaration": findVariables,
97
+ "ArrowFunctionExpression": findVariables
98
+ };
99
+ };
100
+
101
+ module.exports.schema = [
102
+ {
103
+ "enum": ["nofunc"]
104
+ }
105
+ ];
@@ -1,26 +1,26 @@
1
- /**
2
- * @fileoverview Rule to check for the usage of var.
3
- * @author Jamund Ferguson
4
- * @copyright 2014 Jamund Ferguson. All rights reserved.
5
- */
6
-
7
- "use strict";
8
-
9
- //------------------------------------------------------------------------------
10
- // Rule Definition
11
- //------------------------------------------------------------------------------
12
-
13
- module.exports = function(context) {
14
-
15
- return {
16
- "VariableDeclaration": function (node) {
17
- if (node.kind === "var") {
18
- context.report(node, "Unexpected var, use let or const instead.");
19
- }
20
- }
21
-
22
- };
23
-
24
- };
25
-
26
- module.exports.schema = [];
1
+ /**
2
+ * @fileoverview Rule to check for the usage of var.
3
+ * @author Jamund Ferguson
4
+ * @copyright 2014 Jamund Ferguson. All rights reserved.
5
+ */
6
+
7
+ "use strict";
8
+
9
+ //------------------------------------------------------------------------------
10
+ // Rule Definition
11
+ //------------------------------------------------------------------------------
12
+
13
+ module.exports = function(context) {
14
+
15
+ return {
16
+ "VariableDeclaration": function (node) {
17
+ if (node.kind === "var") {
18
+ context.report(node, "Unexpected var, use let or const instead.");
19
+ }
20
+ }
21
+
22
+ };
23
+
24
+ };
25
+
26
+ module.exports.schema = [];
@@ -1,28 +1,28 @@
1
- /**
2
- * @fileoverview Rule to disallow use of void operator.
3
- * @author Mike Sidorov
4
- * @copyright 2014 Mike Sidorov. All rights reserved.
5
- */
6
- "use strict";
7
-
8
- //------------------------------------------------------------------------------
9
- // Rule Definition
10
- //------------------------------------------------------------------------------
11
-
12
- module.exports = function(context) {
13
-
14
- //--------------------------------------------------------------------------
15
- // Public
16
- //--------------------------------------------------------------------------
17
-
18
- return {
19
- "UnaryExpression": function(node) {
20
- if (node.operator === "void") {
21
- context.report(node, "Expected 'undefined' and instead saw 'void'.");
22
- }
23
- }
24
- };
25
-
26
- };
27
-
28
- module.exports.schema = [];
1
+ /**
2
+ * @fileoverview Rule to disallow use of void operator.
3
+ * @author Mike Sidorov
4
+ * @copyright 2014 Mike Sidorov. All rights reserved.
5
+ */
6
+ "use strict";
7
+
8
+ //------------------------------------------------------------------------------
9
+ // Rule Definition
10
+ //------------------------------------------------------------------------------
11
+
12
+ module.exports = function(context) {
13
+
14
+ //--------------------------------------------------------------------------
15
+ // Public
16
+ //--------------------------------------------------------------------------
17
+
18
+ return {
19
+ "UnaryExpression": function(node) {
20
+ if (node.operator === "void") {
21
+ context.report(node, "Expected 'undefined' and instead saw 'void'.");
22
+ }
23
+ }
24
+ };
25
+
26
+ };
27
+
28
+ module.exports.schema = [];
@@ -1,102 +1,102 @@
1
- /**
2
- * @fileoverview Rule that warns about used warning comments
3
- * @author Alexander Schmidt <https://github.com/lxanders>
4
- */
5
-
6
- "use strict";
7
-
8
- //------------------------------------------------------------------------------
9
- // Rule Definition
10
- //------------------------------------------------------------------------------
11
-
12
- module.exports = function (context) {
13
-
14
- var configuration = context.options[0] || {},
15
- warningTerms = configuration.terms || ["todo", "fixme", "xxx"],
16
- location = configuration.location || "start",
17
- warningRegExps;
18
-
19
- /**
20
- * Convert a warning term into a RegExp which will match a comment containing that whole word in the specified
21
- * location ("start" or "anywhere"). If the term starts or ends with non word characters, then the match will not
22
- * require word boundaries on that side.
23
- *
24
- * @param {String} term A term to convert to a RegExp
25
- * @returns {RegExp} The term converted to a RegExp
26
- */
27
- function convertToRegExp(term) {
28
- var escaped = term.replace(/[-\/\\$\^*+?.()|\[\]{}]/g, "\\$&"),
29
- // If the term ends in a word character (a-z0-9_), ensure a word boundary at the end, so that substrings do
30
- // not get falsely matched. eg "todo" in a string such as "mastodon".
31
- // If the term ends in a non-word character, then \b won't match on the boundary to the next non-word
32
- // character, which would likely be a space. For example `/\bFIX!\b/.test('FIX! blah') === false`.
33
- // In these cases, use no bounding match. Same applies for the prefix, handled below.
34
- suffix = /\w$/.test(term) ? "\\b" : "",
35
- prefix;
36
-
37
- if (location === "start") {
38
- // When matching at the start, ignore leading whitespace, and there's no need to worry about word boundaries
39
- prefix = "^\\s*";
40
- } else if (/^\w/.test(term)) {
41
- prefix = "\\b";
42
- } else {
43
- prefix = "";
44
- }
45
-
46
- return new RegExp(prefix + escaped + suffix, "i");
47
- }
48
-
49
- /**
50
- * Checks the specified comment for matches of the configured warning terms and returns the matches.
51
- * @param {String} comment The comment which is checked.
52
- * @returns {Array} All matched warning terms for this comment.
53
- */
54
- function commentContainsWarningTerm(comment) {
55
- var matches = [];
56
-
57
- warningRegExps.forEach(function (regex, index) {
58
- if (regex.test(comment)) {
59
- matches.push(warningTerms[index]);
60
- }
61
- });
62
-
63
- return matches;
64
- }
65
-
66
- /**
67
- * Checks the specified node for matching warning comments and reports them.
68
- * @param {ASTNode} node The AST node being checked.
69
- * @returns {void} undefined.
70
- */
71
- function checkComment(node) {
72
- var matches = commentContainsWarningTerm(node.value);
73
-
74
- matches.forEach(function (matchedTerm) {
75
- context.report(node, "Unexpected " + matchedTerm + " comment.");
76
- });
77
- }
78
-
79
- warningRegExps = warningTerms.map(convertToRegExp);
80
- return {
81
- "BlockComment": checkComment,
82
- "LineComment": checkComment
83
- };
84
- };
85
-
86
- module.exports.schema = [
87
- {
88
- "type": "object",
89
- "properties": {
90
- "terms": {
91
- "type": "array",
92
- "items": {
93
- "type": "string"
94
- }
95
- },
96
- "location": {
97
- "enum": ["start", "anywhere"]
98
- }
99
- },
100
- "additionalProperties": false
101
- }
102
- ];
1
+ /**
2
+ * @fileoverview Rule that warns about used warning comments
3
+ * @author Alexander Schmidt <https://github.com/lxanders>
4
+ */
5
+
6
+ "use strict";
7
+
8
+ //------------------------------------------------------------------------------
9
+ // Rule Definition
10
+ //------------------------------------------------------------------------------
11
+
12
+ module.exports = function (context) {
13
+
14
+ var configuration = context.options[0] || {},
15
+ warningTerms = configuration.terms || ["todo", "fixme", "xxx"],
16
+ location = configuration.location || "start",
17
+ warningRegExps;
18
+
19
+ /**
20
+ * Convert a warning term into a RegExp which will match a comment containing that whole word in the specified
21
+ * location ("start" or "anywhere"). If the term starts or ends with non word characters, then the match will not
22
+ * require word boundaries on that side.
23
+ *
24
+ * @param {String} term A term to convert to a RegExp
25
+ * @returns {RegExp} The term converted to a RegExp
26
+ */
27
+ function convertToRegExp(term) {
28
+ var escaped = term.replace(/[-\/\\$\^*+?.()|\[\]{}]/g, "\\$&"),
29
+ // If the term ends in a word character (a-z0-9_), ensure a word boundary at the end, so that substrings do
30
+ // not get falsely matched. eg "todo" in a string such as "mastodon".
31
+ // If the term ends in a non-word character, then \b won't match on the boundary to the next non-word
32
+ // character, which would likely be a space. For example `/\bFIX!\b/.test('FIX! blah') === false`.
33
+ // In these cases, use no bounding match. Same applies for the prefix, handled below.
34
+ suffix = /\w$/.test(term) ? "\\b" : "",
35
+ prefix;
36
+
37
+ if (location === "start") {
38
+ // When matching at the start, ignore leading whitespace, and there's no need to worry about word boundaries
39
+ prefix = "^\\s*";
40
+ } else if (/^\w/.test(term)) {
41
+ prefix = "\\b";
42
+ } else {
43
+ prefix = "";
44
+ }
45
+
46
+ return new RegExp(prefix + escaped + suffix, "i");
47
+ }
48
+
49
+ /**
50
+ * Checks the specified comment for matches of the configured warning terms and returns the matches.
51
+ * @param {String} comment The comment which is checked.
52
+ * @returns {Array} All matched warning terms for this comment.
53
+ */
54
+ function commentContainsWarningTerm(comment) {
55
+ var matches = [];
56
+
57
+ warningRegExps.forEach(function (regex, index) {
58
+ if (regex.test(comment)) {
59
+ matches.push(warningTerms[index]);
60
+ }
61
+ });
62
+
63
+ return matches;
64
+ }
65
+
66
+ /**
67
+ * Checks the specified node for matching warning comments and reports them.
68
+ * @param {ASTNode} node The AST node being checked.
69
+ * @returns {void} undefined.
70
+ */
71
+ function checkComment(node) {
72
+ var matches = commentContainsWarningTerm(node.value);
73
+
74
+ matches.forEach(function (matchedTerm) {
75
+ context.report(node, "Unexpected " + matchedTerm + " comment.");
76
+ });
77
+ }
78
+
79
+ warningRegExps = warningTerms.map(convertToRegExp);
80
+ return {
81
+ "BlockComment": checkComment,
82
+ "LineComment": checkComment
83
+ };
84
+ };
85
+
86
+ module.exports.schema = [
87
+ {
88
+ "type": "object",
89
+ "properties": {
90
+ "terms": {
91
+ "type": "array",
92
+ "items": {
93
+ "type": "string"
94
+ }
95
+ },
96
+ "location": {
97
+ "enum": ["start", "anywhere"]
98
+ }
99
+ },
100
+ "additionalProperties": false
101
+ }
102
+ ];
@@ -1,22 +1,22 @@
1
- /**
2
- * @fileoverview Rule to flag use of with statement
3
- * @author Nicholas C. Zakas
4
- */
5
-
6
- "use strict";
7
-
8
- //------------------------------------------------------------------------------
9
- // Rule Definition
10
- //------------------------------------------------------------------------------
11
-
12
- module.exports = function(context) {
13
-
14
- return {
15
- "WithStatement": function(node) {
16
- context.report(node, "Unexpected use of 'with' statement.");
17
- }
18
- };
19
-
20
- };
21
-
22
- module.exports.schema = [];
1
+ /**
2
+ * @fileoverview Rule to flag use of with statement
3
+ * @author Nicholas C. Zakas
4
+ */
5
+
6
+ "use strict";
7
+
8
+ //------------------------------------------------------------------------------
9
+ // Rule Definition
10
+ //------------------------------------------------------------------------------
11
+
12
+ module.exports = function(context) {
13
+
14
+ return {
15
+ "WithStatement": function(node) {
16
+ context.report(node, "Unexpected use of 'with' statement.");
17
+ }
18
+ };
19
+
20
+ };
21
+
22
+ module.exports.schema = [];