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,224 +1,224 @@
1
- /**
2
- * @fileoverview Rule to flag use of constructors without capital letters
3
- * @author Nicholas C. Zakas
4
- * @copyright 2014 Jordan Harband. All rights reserved.
5
- * @copyright 2013-2014 Nicholas C. Zakas. All rights reserved.
6
- */
7
-
8
- "use strict";
9
-
10
- var CAPS_ALLOWED = [
11
- "Array",
12
- "Boolean",
13
- "Date",
14
- "Error",
15
- "Function",
16
- "Number",
17
- "Object",
18
- "RegExp",
19
- "String",
20
- "Symbol"
21
- ];
22
-
23
- /**
24
- * Ensure that if the key is provided, it must be an array.
25
- * @param {Object} obj Object to check with `key`.
26
- * @param {string} key Object key to check on `obj`.
27
- * @param {*} fallback If obj[key] is not present, this will be returned.
28
- * @returns {string[]} Returns obj[key] if it's an Array, otherwise `fallback`
29
- */
30
- function checkArray(obj, key, fallback) {
31
- if (Object.prototype.hasOwnProperty.call(obj, key) && !Array.isArray(obj[key])) {
32
- throw new TypeError(key + ", if provided, must be an Array");
33
- }
34
- return obj[key] || fallback;
35
- }
36
-
37
- /**
38
- * A reducer function to invert an array to an Object mapping the string form of the key, to `true`.
39
- * @param {Object} map Accumulator object for the reduce.
40
- * @param {string} key Object key to set to `true`.
41
- * @returns {Object} Returns the updated Object for further reduction.
42
- */
43
- function invert(map, key) {
44
- map[key] = true;
45
- return map;
46
- }
47
-
48
- /**
49
- * Creates an object with the cap is new exceptions as its keys and true as their values.
50
- * @param {Object} config Rule configuration
51
- * @returns {Object} Object with cap is new exceptions.
52
- */
53
- function calculateCapIsNewExceptions(config) {
54
- var capIsNewExceptions = checkArray(config, "capIsNewExceptions", CAPS_ALLOWED);
55
-
56
- if (capIsNewExceptions !== CAPS_ALLOWED) {
57
- capIsNewExceptions = capIsNewExceptions.concat(CAPS_ALLOWED);
58
- }
59
-
60
- return capIsNewExceptions.reduce(invert, {});
61
- }
62
-
63
- //------------------------------------------------------------------------------
64
- // Rule Definition
65
- //------------------------------------------------------------------------------
66
-
67
- module.exports = function(context) {
68
-
69
- var config = context.options[0] || {};
70
- config.newIsCap = config.newIsCap !== false;
71
- config.capIsNew = config.capIsNew !== false;
72
-
73
- var newIsCapExceptions = checkArray(config, "newIsCapExceptions", []).reduce(invert, {});
74
-
75
- var capIsNewExceptions = calculateCapIsNewExceptions(config);
76
-
77
- var listeners = {};
78
-
79
- //--------------------------------------------------------------------------
80
- // Helpers
81
- //--------------------------------------------------------------------------
82
-
83
- /**
84
- * Get exact callee name from expression
85
- * @param {ASTNode} node CallExpression or NewExpression node
86
- * @returns {string} name
87
- */
88
- function extractNameFromExpression(node) {
89
-
90
- var name = "",
91
- property;
92
-
93
- if (node.callee.type === "MemberExpression") {
94
- property = node.callee.property;
95
-
96
- if (property.type === "Literal" && (typeof property.value === "string")) {
97
- name = property.value;
98
- } else if (property.type === "Identifier" && !node.callee.computed) {
99
- name = property.name;
100
- }
101
- } else {
102
- name = node.callee.name;
103
- }
104
- return name;
105
- }
106
-
107
- /**
108
- * Returns the capitalization state of the string -
109
- * Whether the first character is uppercase, lowercase, or non-alphabetic
110
- * @param {string} str String
111
- * @returns {string} capitalization state: "non-alpha", "lower", or "upper"
112
- */
113
- function getCap(str) {
114
- var firstChar = str.charAt(0);
115
-
116
- var firstCharLower = firstChar.toLowerCase();
117
- var firstCharUpper = firstChar.toUpperCase();
118
-
119
- if (firstCharLower === firstCharUpper) {
120
- // char has no uppercase variant, so it's non-alphabetic
121
- return "non-alpha";
122
- } else if (firstChar === firstCharLower) {
123
- return "lower";
124
- } else {
125
- return "upper";
126
- }
127
- }
128
-
129
- /**
130
- * Check if capitalization is allowed for a CallExpression
131
- * @param {Object} allowedMap Object mapping calleeName to a Boolean
132
- * @param {ASTNode} node CallExpression node
133
- * @param {string} calleeName Capitalized callee name from a CallExpression
134
- * @returns {Boolean} Returns true if the callee may be capitalized
135
- */
136
- function isCapAllowed(allowedMap, node, calleeName) {
137
- if (allowedMap[calleeName]) {
138
- return true;
139
- }
140
- if (calleeName === "UTC" && node.callee.type === "MemberExpression") {
141
- // allow if callee is Date.UTC
142
- return node.callee.object.type === "Identifier" &&
143
- node.callee.object.name === "Date";
144
- }
145
- return false;
146
- }
147
-
148
- /**
149
- * Reports the given message for the given node. The location will be the start of the property or the callee.
150
- * @param {ASTNode} node CallExpression or NewExpression node.
151
- * @param {string} message The message to report.
152
- * @returns {void}
153
- */
154
- function report(node, message) {
155
- var callee = node.callee;
156
-
157
- if (callee.type === "MemberExpression") {
158
- callee = callee.property;
159
- }
160
-
161
- context.report(node, callee.loc.start, message);
162
- }
163
-
164
- //--------------------------------------------------------------------------
165
- // Public
166
- //--------------------------------------------------------------------------
167
-
168
- if (config.newIsCap) {
169
- listeners.NewExpression = function(node) {
170
-
171
- var constructorName = extractNameFromExpression(node);
172
- if (constructorName) {
173
- var capitalization = getCap(constructorName);
174
- var isAllowed = capitalization !== "lower" || isCapAllowed(newIsCapExceptions, node, constructorName);
175
- if (!isAllowed) {
176
- report(node, "A constructor name should not start with a lowercase letter.");
177
- }
178
- }
179
- };
180
- }
181
-
182
- if (config.capIsNew) {
183
- listeners.CallExpression = function(node) {
184
-
185
- var calleeName = extractNameFromExpression(node);
186
- if (calleeName) {
187
- var capitalization = getCap(calleeName);
188
- var isAllowed = capitalization !== "upper" || isCapAllowed(capIsNewExceptions, node, calleeName);
189
- if (!isAllowed) {
190
- report(node, "A function with a name starting with an uppercase letter should only be used as a constructor.");
191
- }
192
- }
193
- };
194
- }
195
-
196
- return listeners;
197
- };
198
-
199
- module.exports.schema = [
200
- {
201
- "type": "object",
202
- "properties": {
203
- "newIsCap": {
204
- "type": "boolean"
205
- },
206
- "capIsNew": {
207
- "type": "boolean"
208
- },
209
- "newIsCapExceptions": {
210
- "type": "array",
211
- "items": {
212
- "type": "string"
213
- }
214
- },
215
- "capIsNewExceptions": {
216
- "type": "array",
217
- "items": {
218
- "type": "string"
219
- }
220
- }
221
- },
222
- "additionalProperties": false
223
- }
224
- ];
1
+ /**
2
+ * @fileoverview Rule to flag use of constructors without capital letters
3
+ * @author Nicholas C. Zakas
4
+ * @copyright 2014 Jordan Harband. All rights reserved.
5
+ * @copyright 2013-2014 Nicholas C. Zakas. All rights reserved.
6
+ */
7
+
8
+ "use strict";
9
+
10
+ var CAPS_ALLOWED = [
11
+ "Array",
12
+ "Boolean",
13
+ "Date",
14
+ "Error",
15
+ "Function",
16
+ "Number",
17
+ "Object",
18
+ "RegExp",
19
+ "String",
20
+ "Symbol"
21
+ ];
22
+
23
+ /**
24
+ * Ensure that if the key is provided, it must be an array.
25
+ * @param {Object} obj Object to check with `key`.
26
+ * @param {string} key Object key to check on `obj`.
27
+ * @param {*} fallback If obj[key] is not present, this will be returned.
28
+ * @returns {string[]} Returns obj[key] if it's an Array, otherwise `fallback`
29
+ */
30
+ function checkArray(obj, key, fallback) {
31
+ if (Object.prototype.hasOwnProperty.call(obj, key) && !Array.isArray(obj[key])) {
32
+ throw new TypeError(key + ", if provided, must be an Array");
33
+ }
34
+ return obj[key] || fallback;
35
+ }
36
+
37
+ /**
38
+ * A reducer function to invert an array to an Object mapping the string form of the key, to `true`.
39
+ * @param {Object} map Accumulator object for the reduce.
40
+ * @param {string} key Object key to set to `true`.
41
+ * @returns {Object} Returns the updated Object for further reduction.
42
+ */
43
+ function invert(map, key) {
44
+ map[key] = true;
45
+ return map;
46
+ }
47
+
48
+ /**
49
+ * Creates an object with the cap is new exceptions as its keys and true as their values.
50
+ * @param {Object} config Rule configuration
51
+ * @returns {Object} Object with cap is new exceptions.
52
+ */
53
+ function calculateCapIsNewExceptions(config) {
54
+ var capIsNewExceptions = checkArray(config, "capIsNewExceptions", CAPS_ALLOWED);
55
+
56
+ if (capIsNewExceptions !== CAPS_ALLOWED) {
57
+ capIsNewExceptions = capIsNewExceptions.concat(CAPS_ALLOWED);
58
+ }
59
+
60
+ return capIsNewExceptions.reduce(invert, {});
61
+ }
62
+
63
+ //------------------------------------------------------------------------------
64
+ // Rule Definition
65
+ //------------------------------------------------------------------------------
66
+
67
+ module.exports = function(context) {
68
+
69
+ var config = context.options[0] || {};
70
+ config.newIsCap = config.newIsCap !== false;
71
+ config.capIsNew = config.capIsNew !== false;
72
+
73
+ var newIsCapExceptions = checkArray(config, "newIsCapExceptions", []).reduce(invert, {});
74
+
75
+ var capIsNewExceptions = calculateCapIsNewExceptions(config);
76
+
77
+ var listeners = {};
78
+
79
+ //--------------------------------------------------------------------------
80
+ // Helpers
81
+ //--------------------------------------------------------------------------
82
+
83
+ /**
84
+ * Get exact callee name from expression
85
+ * @param {ASTNode} node CallExpression or NewExpression node
86
+ * @returns {string} name
87
+ */
88
+ function extractNameFromExpression(node) {
89
+
90
+ var name = "",
91
+ property;
92
+
93
+ if (node.callee.type === "MemberExpression") {
94
+ property = node.callee.property;
95
+
96
+ if (property.type === "Literal" && (typeof property.value === "string")) {
97
+ name = property.value;
98
+ } else if (property.type === "Identifier" && !node.callee.computed) {
99
+ name = property.name;
100
+ }
101
+ } else {
102
+ name = node.callee.name;
103
+ }
104
+ return name;
105
+ }
106
+
107
+ /**
108
+ * Returns the capitalization state of the string -
109
+ * Whether the first character is uppercase, lowercase, or non-alphabetic
110
+ * @param {string} str String
111
+ * @returns {string} capitalization state: "non-alpha", "lower", or "upper"
112
+ */
113
+ function getCap(str) {
114
+ var firstChar = str.charAt(0);
115
+
116
+ var firstCharLower = firstChar.toLowerCase();
117
+ var firstCharUpper = firstChar.toUpperCase();
118
+
119
+ if (firstCharLower === firstCharUpper) {
120
+ // char has no uppercase variant, so it's non-alphabetic
121
+ return "non-alpha";
122
+ } else if (firstChar === firstCharLower) {
123
+ return "lower";
124
+ } else {
125
+ return "upper";
126
+ }
127
+ }
128
+
129
+ /**
130
+ * Check if capitalization is allowed for a CallExpression
131
+ * @param {Object} allowedMap Object mapping calleeName to a Boolean
132
+ * @param {ASTNode} node CallExpression node
133
+ * @param {string} calleeName Capitalized callee name from a CallExpression
134
+ * @returns {Boolean} Returns true if the callee may be capitalized
135
+ */
136
+ function isCapAllowed(allowedMap, node, calleeName) {
137
+ if (allowedMap[calleeName]) {
138
+ return true;
139
+ }
140
+ if (calleeName === "UTC" && node.callee.type === "MemberExpression") {
141
+ // allow if callee is Date.UTC
142
+ return node.callee.object.type === "Identifier" &&
143
+ node.callee.object.name === "Date";
144
+ }
145
+ return false;
146
+ }
147
+
148
+ /**
149
+ * Reports the given message for the given node. The location will be the start of the property or the callee.
150
+ * @param {ASTNode} node CallExpression or NewExpression node.
151
+ * @param {string} message The message to report.
152
+ * @returns {void}
153
+ */
154
+ function report(node, message) {
155
+ var callee = node.callee;
156
+
157
+ if (callee.type === "MemberExpression") {
158
+ callee = callee.property;
159
+ }
160
+
161
+ context.report(node, callee.loc.start, message);
162
+ }
163
+
164
+ //--------------------------------------------------------------------------
165
+ // Public
166
+ //--------------------------------------------------------------------------
167
+
168
+ if (config.newIsCap) {
169
+ listeners.NewExpression = function(node) {
170
+
171
+ var constructorName = extractNameFromExpression(node);
172
+ if (constructorName) {
173
+ var capitalization = getCap(constructorName);
174
+ var isAllowed = capitalization !== "lower" || isCapAllowed(newIsCapExceptions, node, constructorName);
175
+ if (!isAllowed) {
176
+ report(node, "A constructor name should not start with a lowercase letter.");
177
+ }
178
+ }
179
+ };
180
+ }
181
+
182
+ if (config.capIsNew) {
183
+ listeners.CallExpression = function(node) {
184
+
185
+ var calleeName = extractNameFromExpression(node);
186
+ if (calleeName) {
187
+ var capitalization = getCap(calleeName);
188
+ var isAllowed = capitalization !== "upper" || isCapAllowed(capIsNewExceptions, node, calleeName);
189
+ if (!isAllowed) {
190
+ report(node, "A function with a name starting with an uppercase letter should only be used as a constructor.");
191
+ }
192
+ }
193
+ };
194
+ }
195
+
196
+ return listeners;
197
+ };
198
+
199
+ module.exports.schema = [
200
+ {
201
+ "type": "object",
202
+ "properties": {
203
+ "newIsCap": {
204
+ "type": "boolean"
205
+ },
206
+ "capIsNew": {
207
+ "type": "boolean"
208
+ },
209
+ "newIsCapExceptions": {
210
+ "type": "array",
211
+ "items": {
212
+ "type": "string"
213
+ }
214
+ },
215
+ "capIsNewExceptions": {
216
+ "type": "array",
217
+ "items": {
218
+ "type": "string"
219
+ }
220
+ }
221
+ },
222
+ "additionalProperties": false
223
+ }
224
+ ];
@@ -1,29 +1,29 @@
1
- /**
2
- * @fileoverview Rule to flag when using constructor without parentheses
3
- * @author Ilya Volodin
4
- */
5
-
6
- "use strict";
7
-
8
- //------------------------------------------------------------------------------
9
- // Rule Definition
10
- //------------------------------------------------------------------------------
11
-
12
- module.exports = function(context) {
13
-
14
- return {
15
-
16
- "NewExpression": function(node) {
17
- var tokens = context.getTokens(node);
18
- var prenticesTokens = tokens.filter(function(token) {
19
- return token.value === "(" || token.value === ")";
20
- });
21
- if (prenticesTokens.length < 2) {
22
- context.report(node, "Missing '()' invoking a constructor");
23
- }
24
- }
25
- };
26
-
27
- };
28
-
29
- module.exports.schema = [];
1
+ /**
2
+ * @fileoverview Rule to flag when using constructor without parentheses
3
+ * @author Ilya Volodin
4
+ */
5
+
6
+ "use strict";
7
+
8
+ //------------------------------------------------------------------------------
9
+ // Rule Definition
10
+ //------------------------------------------------------------------------------
11
+
12
+ module.exports = function(context) {
13
+
14
+ return {
15
+
16
+ "NewExpression": function(node) {
17
+ var tokens = context.getTokens(node);
18
+ var prenticesTokens = tokens.filter(function(token) {
19
+ return token.value === "(" || token.value === ")";
20
+ });
21
+ if (prenticesTokens.length < 2) {
22
+ context.report(node, "Missing '()' invoking a constructor");
23
+ }
24
+ }
25
+ };
26
+
27
+ };
28
+
29
+ module.exports.schema = [];