eslint 5.8.0 → 5.9.0

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 (269) hide show
  1. package/CHANGELOG.md +18 -0
  2. package/lib/cli-engine.js +128 -31
  3. package/lib/cli.js +6 -1
  4. package/lib/options.js +5 -0
  5. package/lib/rules/accessor-pairs.js +4 -0
  6. package/lib/rules/array-bracket-newline.js +5 -0
  7. package/lib/rules/array-bracket-spacing.js +5 -0
  8. package/lib/rules/array-callback-return.js +2 -0
  9. package/lib/rules/array-element-newline.js +4 -0
  10. package/lib/rules/arrow-body-style.js +2 -0
  11. package/lib/rules/arrow-parens.js +2 -0
  12. package/lib/rules/arrow-spacing.js +2 -0
  13. package/lib/rules/block-scoped-var.js +2 -0
  14. package/lib/rules/block-spacing.js +2 -0
  15. package/lib/rules/brace-style.js +2 -0
  16. package/lib/rules/callback-return.js +2 -0
  17. package/lib/rules/camelcase.js +2 -0
  18. package/lib/rules/capitalized-comments.js +4 -0
  19. package/lib/rules/class-methods-use-this.js +3 -0
  20. package/lib/rules/comma-dangle.js +4 -0
  21. package/lib/rules/comma-spacing.js +2 -0
  22. package/lib/rules/comma-style.js +5 -0
  23. package/lib/rules/complexity.js +2 -0
  24. package/lib/rules/computed-property-spacing.js +2 -0
  25. package/lib/rules/consistent-return.js +2 -0
  26. package/lib/rules/consistent-this.js +2 -0
  27. package/lib/rules/constructor-super.js +2 -0
  28. package/lib/rules/curly.js +2 -0
  29. package/lib/rules/default-case.js +2 -0
  30. package/lib/rules/dot-location.js +2 -0
  31. package/lib/rules/dot-notation.js +2 -0
  32. package/lib/rules/eol-last.js +5 -0
  33. package/lib/rules/eqeqeq.js +2 -0
  34. package/lib/rules/for-direction.js +4 -0
  35. package/lib/rules/func-call-spacing.js +4 -0
  36. package/lib/rules/func-name-matching.js +3 -0
  37. package/lib/rules/func-names.js +3 -0
  38. package/lib/rules/func-style.js +3 -0
  39. package/lib/rules/function-paren-newline.js +5 -0
  40. package/lib/rules/generator-star-spacing.js +3 -0
  41. package/lib/rules/getter-return.js +5 -0
  42. package/lib/rules/global-require.js +2 -0
  43. package/lib/rules/guard-for-in.js +2 -0
  44. package/lib/rules/handle-callback-err.js +2 -0
  45. package/lib/rules/id-blacklist.js +2 -0
  46. package/lib/rules/id-length.js +2 -0
  47. package/lib/rules/id-match.js +101 -27
  48. package/lib/rules/implicit-arrow-linebreak.js +4 -0
  49. package/lib/rules/indent-legacy.js +4 -1
  50. package/lib/rules/indent.js +2 -0
  51. package/lib/rules/init-declarations.js +2 -0
  52. package/lib/rules/jsx-quotes.js +2 -0
  53. package/lib/rules/key-spacing.js +4 -3
  54. package/lib/rules/keyword-spacing.js +2 -0
  55. package/lib/rules/line-comment-position.js +2 -0
  56. package/lib/rules/linebreak-style.js +2 -0
  57. package/lib/rules/lines-around-comment.js +2 -0
  58. package/lib/rules/lines-around-directive.js +6 -2
  59. package/lib/rules/lines-between-class-members.js +2 -0
  60. package/lib/rules/max-classes-per-file.js +4 -0
  61. package/lib/rules/max-depth.js +2 -0
  62. package/lib/rules/max-len.js +2 -0
  63. package/lib/rules/max-lines-per-function.js +2 -0
  64. package/lib/rules/max-lines.js +2 -0
  65. package/lib/rules/max-nested-callbacks.js +2 -0
  66. package/lib/rules/max-params.js +2 -0
  67. package/lib/rules/max-statements-per-line.js +2 -0
  68. package/lib/rules/max-statements.js +2 -0
  69. package/lib/rules/multiline-comment-style.js +3 -0
  70. package/lib/rules/multiline-ternary.js +3 -0
  71. package/lib/rules/new-cap.js +2 -0
  72. package/lib/rules/new-parens.js +2 -1
  73. package/lib/rules/newline-after-var.js +5 -2
  74. package/lib/rules/newline-before-return.js +5 -2
  75. package/lib/rules/newline-per-chained-call.js +4 -0
  76. package/lib/rules/no-alert.js +2 -0
  77. package/lib/rules/no-array-constructor.js +2 -0
  78. package/lib/rules/no-async-promise-executor.js +3 -0
  79. package/lib/rules/no-await-in-loop.js +4 -0
  80. package/lib/rules/no-bitwise.js +2 -0
  81. package/lib/rules/no-buffer-constructor.js +4 -0
  82. package/lib/rules/no-caller.js +2 -0
  83. package/lib/rules/no-case-declarations.js +2 -0
  84. package/lib/rules/no-catch-shadow.js +6 -3
  85. package/lib/rules/no-class-assign.js +2 -0
  86. package/lib/rules/no-compare-neg-zero.js +4 -0
  87. package/lib/rules/no-cond-assign.js +2 -0
  88. package/lib/rules/no-confusing-arrow.js +2 -0
  89. package/lib/rules/no-console.js +2 -0
  90. package/lib/rules/no-const-assign.js +2 -0
  91. package/lib/rules/no-constant-condition.js +2 -0
  92. package/lib/rules/no-continue.js +2 -0
  93. package/lib/rules/no-control-regex.js +4 -2
  94. package/lib/rules/no-debugger.js +4 -0
  95. package/lib/rules/no-delete-var.js +2 -0
  96. package/lib/rules/no-div-regex.js +2 -0
  97. package/lib/rules/no-dupe-args.js +2 -0
  98. package/lib/rules/no-dupe-class-members.js +2 -0
  99. package/lib/rules/no-dupe-keys.js +2 -0
  100. package/lib/rules/no-duplicate-case.js +2 -0
  101. package/lib/rules/no-duplicate-imports.js +2 -0
  102. package/lib/rules/no-else-return.js +2 -0
  103. package/lib/rules/no-empty-character-class.js +2 -0
  104. package/lib/rules/no-empty-function.js +2 -0
  105. package/lib/rules/no-empty-pattern.js +2 -0
  106. package/lib/rules/no-empty.js +2 -0
  107. package/lib/rules/no-eq-null.js +2 -0
  108. package/lib/rules/no-eval.js +2 -0
  109. package/lib/rules/no-ex-assign.js +2 -0
  110. package/lib/rules/no-extend-native.js +2 -0
  111. package/lib/rules/no-extra-bind.js +2 -1
  112. package/lib/rules/no-extra-boolean-cast.js +2 -1
  113. package/lib/rules/no-extra-label.js +2 -1
  114. package/lib/rules/no-extra-parens.js +5 -6
  115. package/lib/rules/no-extra-semi.js +2 -0
  116. package/lib/rules/no-fallthrough.js +2 -0
  117. package/lib/rules/no-floating-decimal.js +2 -1
  118. package/lib/rules/no-func-assign.js +2 -0
  119. package/lib/rules/no-global-assign.js +2 -0
  120. package/lib/rules/no-implicit-coercion.js +3 -0
  121. package/lib/rules/no-implicit-globals.js +2 -0
  122. package/lib/rules/no-implied-eval.js +2 -0
  123. package/lib/rules/no-inline-comments.js +2 -0
  124. package/lib/rules/no-inner-declarations.js +2 -0
  125. package/lib/rules/no-invalid-regexp.js +2 -0
  126. package/lib/rules/no-invalid-this.js +2 -0
  127. package/lib/rules/no-irregular-whitespace.js +2 -0
  128. package/lib/rules/no-iterator.js +2 -0
  129. package/lib/rules/no-label-var.js +2 -0
  130. package/lib/rules/no-labels.js +2 -0
  131. package/lib/rules/no-lone-blocks.js +2 -0
  132. package/lib/rules/no-lonely-if.js +2 -1
  133. package/lib/rules/no-loop-func.js +2 -0
  134. package/lib/rules/no-magic-numbers.js +3 -0
  135. package/lib/rules/no-misleading-character-class.js +4 -0
  136. package/lib/rules/no-mixed-operators.js +3 -0
  137. package/lib/rules/no-mixed-requires.js +2 -0
  138. package/lib/rules/no-mixed-spaces-and-tabs.js +2 -0
  139. package/lib/rules/no-multi-assign.js +3 -0
  140. package/lib/rules/no-multi-spaces.js +2 -0
  141. package/lib/rules/no-multi-str.js +2 -0
  142. package/lib/rules/no-multiple-empty-lines.js +2 -0
  143. package/lib/rules/no-native-reassign.js +4 -1
  144. package/lib/rules/no-negated-condition.js +2 -0
  145. package/lib/rules/no-negated-in-lhs.js +5 -2
  146. package/lib/rules/no-nested-ternary.js +2 -0
  147. package/lib/rules/no-new-func.js +2 -0
  148. package/lib/rules/no-new-object.js +2 -0
  149. package/lib/rules/no-new-require.js +2 -0
  150. package/lib/rules/no-new-symbol.js +2 -0
  151. package/lib/rules/no-new-wrappers.js +2 -0
  152. package/lib/rules/no-new.js +2 -0
  153. package/lib/rules/no-obj-calls.js +2 -0
  154. package/lib/rules/no-octal-escape.js +2 -0
  155. package/lib/rules/no-octal.js +2 -0
  156. package/lib/rules/no-param-reassign.js +2 -0
  157. package/lib/rules/no-path-concat.js +2 -0
  158. package/lib/rules/no-plusplus.js +2 -0
  159. package/lib/rules/no-process-env.js +2 -0
  160. package/lib/rules/no-process-exit.js +2 -0
  161. package/lib/rules/no-proto.js +2 -0
  162. package/lib/rules/no-prototype-builtins.js +2 -0
  163. package/lib/rules/no-redeclare.js +2 -0
  164. package/lib/rules/no-regex-spaces.js +2 -1
  165. package/lib/rules/no-restricted-globals.js +2 -0
  166. package/lib/rules/no-restricted-imports.js +40 -22
  167. package/lib/rules/no-restricted-modules.js +2 -0
  168. package/lib/rules/no-restricted-properties.js +2 -0
  169. package/lib/rules/no-restricted-syntax.js +2 -0
  170. package/lib/rules/no-return-assign.js +2 -0
  171. package/lib/rules/no-return-await.js +4 -0
  172. package/lib/rules/no-script-url.js +2 -0
  173. package/lib/rules/no-self-assign.js +2 -0
  174. package/lib/rules/no-self-compare.js +2 -0
  175. package/lib/rules/no-sequences.js +2 -0
  176. package/lib/rules/no-shadow-restricted-names.js +2 -0
  177. package/lib/rules/no-shadow.js +2 -0
  178. package/lib/rules/no-spaced-func.js +4 -1
  179. package/lib/rules/no-sparse-arrays.js +2 -0
  180. package/lib/rules/no-sync.js +2 -0
  181. package/lib/rules/no-tabs.js +2 -0
  182. package/lib/rules/no-template-curly-in-string.js +2 -0
  183. package/lib/rules/no-ternary.js +2 -0
  184. package/lib/rules/no-this-before-super.js +2 -0
  185. package/lib/rules/no-throw-literal.js +2 -0
  186. package/lib/rules/no-trailing-spaces.js +2 -0
  187. package/lib/rules/no-undef-init.js +2 -1
  188. package/lib/rules/no-undef.js +2 -0
  189. package/lib/rules/no-undefined.js +2 -0
  190. package/lib/rules/no-underscore-dangle.js +2 -0
  191. package/lib/rules/no-unexpected-multiline.js +2 -0
  192. package/lib/rules/no-unmodified-loop-condition.js +2 -0
  193. package/lib/rules/no-unneeded-ternary.js +2 -0
  194. package/lib/rules/no-unreachable.js +2 -1
  195. package/lib/rules/no-unsafe-finally.js +2 -0
  196. package/lib/rules/no-unsafe-negation.js +3 -0
  197. package/lib/rules/no-unused-expressions.js +2 -0
  198. package/lib/rules/no-unused-labels.js +2 -1
  199. package/lib/rules/no-unused-vars.js +36 -12
  200. package/lib/rules/no-use-before-define.js +2 -0
  201. package/lib/rules/no-useless-call.js +2 -0
  202. package/lib/rules/no-useless-computed-key.js +2 -1
  203. package/lib/rules/no-useless-concat.js +2 -0
  204. package/lib/rules/no-useless-constructor.js +2 -0
  205. package/lib/rules/no-useless-escape.js +2 -0
  206. package/lib/rules/no-useless-rename.js +4 -0
  207. package/lib/rules/no-useless-return.js +3 -0
  208. package/lib/rules/no-var.js +2 -0
  209. package/lib/rules/no-void.js +2 -0
  210. package/lib/rules/no-warning-comments.js +2 -0
  211. package/lib/rules/no-whitespace-before-property.js +2 -0
  212. package/lib/rules/no-with.js +2 -0
  213. package/lib/rules/nonblock-statement-body-position.js +4 -0
  214. package/lib/rules/object-curly-newline.js +4 -0
  215. package/lib/rules/object-curly-spacing.js +2 -0
  216. package/lib/rules/object-property-newline.js +3 -2
  217. package/lib/rules/object-shorthand.js +2 -0
  218. package/lib/rules/one-var-declaration-per-line.js +2 -0
  219. package/lib/rules/one-var.js +2 -0
  220. package/lib/rules/operator-assignment.js +2 -0
  221. package/lib/rules/operator-linebreak.js +2 -0
  222. package/lib/rules/padded-blocks.js +2 -0
  223. package/lib/rules/padding-line-between-statements.js +4 -0
  224. package/lib/rules/prefer-arrow-callback.js +2 -0
  225. package/lib/rules/prefer-const.js +53 -7
  226. package/lib/rules/prefer-destructuring.js +3 -0
  227. package/lib/rules/prefer-numeric-literals.js +2 -1
  228. package/lib/rules/prefer-object-spread.js +4 -0
  229. package/lib/rules/prefer-promise-reject-errors.js +4 -0
  230. package/lib/rules/prefer-reflect.js +4 -1
  231. package/lib/rules/prefer-rest-params.js +2 -0
  232. package/lib/rules/prefer-spread.js +2 -1
  233. package/lib/rules/prefer-template.js +2 -1
  234. package/lib/rules/quote-props.js +2 -0
  235. package/lib/rules/quotes.js +2 -0
  236. package/lib/rules/radix.js +2 -0
  237. package/lib/rules/require-atomic-updates.js +4 -0
  238. package/lib/rules/require-await.js +3 -0
  239. package/lib/rules/require-jsdoc.js +2 -0
  240. package/lib/rules/require-unicode-regexp.js +4 -0
  241. package/lib/rules/require-yield.js +2 -0
  242. package/lib/rules/rest-spread-spacing.js +4 -0
  243. package/lib/rules/semi-spacing.js +2 -0
  244. package/lib/rules/semi-style.js +3 -0
  245. package/lib/rules/semi.js +2 -0
  246. package/lib/rules/sort-imports.js +2 -0
  247. package/lib/rules/sort-keys.js +3 -0
  248. package/lib/rules/sort-vars.js +2 -0
  249. package/lib/rules/space-before-blocks.js +46 -35
  250. package/lib/rules/space-before-function-paren.js +2 -0
  251. package/lib/rules/space-in-parens.js +2 -0
  252. package/lib/rules/space-infix-ops.js +2 -0
  253. package/lib/rules/space-unary-ops.js +2 -0
  254. package/lib/rules/spaced-comment.js +2 -0
  255. package/lib/rules/strict.js +2 -0
  256. package/lib/rules/switch-colon-spacing.js +4 -0
  257. package/lib/rules/symbol-description.js +2 -0
  258. package/lib/rules/template-curly-spacing.js +2 -0
  259. package/lib/rules/template-tag-spacing.js +2 -0
  260. package/lib/rules/unicode-bom.js +2 -0
  261. package/lib/rules/use-isnan.js +2 -0
  262. package/lib/rules/valid-jsdoc.js +2 -0
  263. package/lib/rules/valid-typeof.js +2 -0
  264. package/lib/rules/vars-on-top.js +2 -0
  265. package/lib/rules/wrap-iife.js +2 -0
  266. package/lib/rules/wrap-regex.js +3 -1
  267. package/lib/rules/yield-star-spacing.js +2 -0
  268. package/lib/rules/yoda.js +2 -0
  269. package/package.json +3 -3
package/CHANGELOG.md CHANGED
@@ -1,3 +1,21 @@
1
+ v5.9.0 - November 9, 2018
2
+
3
+ * 9436712 Fix: Unused recursive function expressions (fixes #10982) (#11032) (Sergei Startsev)
4
+ * c832cd5 Update: add `ignoreDestructuring` option to `id-match` rule (#10554) (一名宅。)
5
+ * 54687a8 Fix: prefer-const autofix multiline assignment (fixes #10582) (#10987) (Scott Stern)
6
+ * ae2b61d Update: "off" options for "space-before-blocks" (refs #10906) (#10907) (Sophie Kirschner)
7
+ * 57f357e Docs: Update require-await docs with exception (fixes #9540) (#11063) (Nicholas C. Zakas)
8
+ * 79a2797 Update: no-restricted-imports to check re-export (fixes #9678) (#11064) (Nicholas C. Zakas)
9
+ * 3dd7493 Docs: update ecmaVersion to include 2019/10 values (#11059) (Vse Mozhet Byt)
10
+ * 607635d Upgrade: eslint-plugin-node & eslint-plugin (#11067) (薛定谔的猫)
11
+ * dcc6233 Fix: Ignore empty statements in no-unreachable (fixes #9081) (#11058) (Nicholas C. Zakas)
12
+ * 7ad86de New: Add --fix-type option to CLI (fixes #10855) (#10912) (Nicholas C. Zakas)
13
+ * 0800b20 Chore: fix invalid super() calls in tests (#11054) (Teddy Katz)
14
+ * 4fe3287 Docs: Cross-reference two rules (refs #11041) (#11042) (Paul Melnikow)
15
+ * 5525eb6 Fix: rule deprecation warnings did not consider all rules (#11044) (Teddy Katz)
16
+ * 44d37ca Docs: Update steps for adding new TSC member (#11038) (Nicholas C. Zakas)
17
+ * 802e926 Update: Warn for deprecation in Node output (fixes #7443) (#10953) (Colin Chang)
18
+
1
19
  v5.8.0 - October 26, 2018
2
20
 
3
21
  * 9152417 Fix: deprecation warning in RuleTester using Node v11 (#11009) (Teddy Katz)
package/lib/cli-engine.js CHANGED
@@ -19,8 +19,10 @@ const fs = require("fs"),
19
19
  path = require("path"),
20
20
  defaultOptions = require("../conf/default-cli-options"),
21
21
  Linter = require("./linter"),
22
+ lodash = require("lodash"),
22
23
  IgnoredPaths = require("./ignored-paths"),
23
24
  Config = require("./config"),
25
+ ConfigOps = require("./config/config-ops"),
24
26
  LintResultCache = require("./util/lint-result-cache"),
25
27
  globUtils = require("./util/glob-utils"),
26
28
  validator = require("./config/config-validator"),
@@ -31,6 +33,7 @@ const fs = require("fs"),
31
33
 
32
34
  const debug = require("debug")("eslint:cli-engine");
33
35
  const resolver = new ModuleResolver();
36
+ const validFixTypes = new Set(["problem", "suggestion", "layout"]);
34
37
 
35
38
  //------------------------------------------------------------------------------
36
39
  // Typedefs
@@ -48,6 +51,7 @@ const resolver = new ModuleResolver();
48
51
  * @property {string[]} envs An array of environments to load.
49
52
  * @property {string[]} extensions An array of file extensions to check.
50
53
  * @property {boolean|Function} fix Execute in autofix mode. If a function, should return a boolean.
54
+ * @property {string[]} fixTypes Array of rule types to apply fixes for.
51
55
  * @property {string[]} globals An array of global variables to declare.
52
56
  * @property {boolean} ignore False disables use of .eslintignore.
53
57
  * @property {string} ignorePath The ignore file to use instead of .eslintignore.
@@ -84,6 +88,21 @@ const resolver = new ModuleResolver();
84
88
  // Helpers
85
89
  //------------------------------------------------------------------------------
86
90
 
91
+ /**
92
+ * Determines if each fix type in an array is supported by ESLint and throws
93
+ * an error if not.
94
+ * @param {string[]} fixTypes An array of fix types to check.
95
+ * @returns {void}
96
+ * @throws {Error} If an invalid fix type is found.
97
+ */
98
+ function validateFixTypes(fixTypes) {
99
+ for (const fixType of fixTypes) {
100
+ if (!validFixTypes.has(fixType)) {
101
+ throw new Error(`Invalid fix type "${fixType}" found.`);
102
+ }
103
+ }
104
+ }
105
+
87
106
  /**
88
107
  * It will calculate the error and warning count for collection of messages per file
89
108
  * @param {Object[]} messages - Collection of messages
@@ -142,7 +161,7 @@ function calculateStatsPerRun(results) {
142
161
  * @param {boolean} allowInlineConfig Allow/ignore comments that change config.
143
162
  * @param {boolean} reportUnusedDisableDirectives Allow/ignore comments that change config.
144
163
  * @param {Linter} linter Linter context
145
- * @returns {LintResult} The results for linting on this text.
164
+ * @returns {{rules: LintResult, config: Object}} The results for linting on this text and the fully-resolved config for it.
146
165
  * @private
147
166
  */
148
167
  function processText(text, configHelper, filename, fix, allowInlineConfig, reportUnusedDisableDirectives, linter) {
@@ -174,7 +193,6 @@ function processText(text, configHelper, filename, fix, allowInlineConfig, repor
174
193
  }
175
194
 
176
195
  const autofixingEnabled = typeof fix !== "undefined" && (!processor || processor.supportsAutofix);
177
-
178
196
  const fixedResult = linter.verifyAndFix(text, config, {
179
197
  filename: effectiveFilename,
180
198
  allowInlineConfig,
@@ -183,7 +201,6 @@ function processText(text, configHelper, filename, fix, allowInlineConfig, repor
183
201
  preprocess: processor && (rawText => processor.preprocess(rawText, effectiveFilename)),
184
202
  postprocess: processor && (problemLists => processor.postprocess(problemLists, effectiveFilename))
185
203
  });
186
-
187
204
  const stats = calculateStatsPerFile(fixedResult.messages);
188
205
 
189
206
  const result = {
@@ -203,7 +220,7 @@ function processText(text, configHelper, filename, fix, allowInlineConfig, repor
203
220
  result.source = text;
204
221
  }
205
222
 
206
- return result;
223
+ return { result, config };
207
224
  }
208
225
 
209
226
  /**
@@ -213,24 +230,22 @@ function processText(text, configHelper, filename, fix, allowInlineConfig, repor
213
230
  * @param {Object} configHelper The configuration options for ESLint.
214
231
  * @param {Object} options The CLIEngine options object.
215
232
  * @param {Linter} linter Linter context
216
- * @returns {LintResult} The results for linting on this file.
233
+ * @returns {{rules: LintResult, config: Object}} The results for linting on this text and the fully-resolved config for it.
217
234
  * @private
218
235
  */
219
236
  function processFile(filename, configHelper, options, linter) {
220
237
 
221
- const text = fs.readFileSync(path.resolve(filename), "utf8"),
222
- result = processText(
223
- text,
224
- configHelper,
225
- filename,
226
- options.fix,
227
- options.allowInlineConfig,
228
- options.reportUnusedDisableDirectives,
229
- linter
230
- );
231
-
232
- return result;
233
-
238
+ const text = fs.readFileSync(path.resolve(filename), "utf8");
239
+
240
+ return processText(
241
+ text,
242
+ configHelper,
243
+ filename,
244
+ options.fix,
245
+ options.allowInlineConfig,
246
+ options.reportUnusedDisableDirectives,
247
+ linter
248
+ );
234
249
  }
235
250
 
236
251
  /**
@@ -272,6 +287,33 @@ function createIgnoreResult(filePath, baseDir) {
272
287
  };
273
288
  }
274
289
 
290
+ /**
291
+ * Produces rule warnings (i.e. deprecation) from configured rules
292
+ * @param {(Array<string>|Set<string>)} usedRules - Rules configured
293
+ * @param {Map} loadedRules - Map of loaded rules
294
+ * @returns {Array<Object>} Contains rule warnings
295
+ * @private
296
+ */
297
+ function createRuleDeprecationWarnings(usedRules, loadedRules) {
298
+ const usedDeprecatedRules = [];
299
+
300
+ usedRules.forEach(name => {
301
+ const loadedRule = loadedRules.get(name);
302
+
303
+ if (loadedRule && loadedRule.meta && loadedRule.meta.deprecated) {
304
+ const deprecatedRule = { ruleId: name };
305
+ const replacedBy = lodash.get(loadedRule, "meta.replacedBy", []);
306
+
307
+ if (replacedBy.every(newRule => lodash.isString(newRule))) {
308
+ deprecatedRule.replacedBy = replacedBy;
309
+ }
310
+
311
+ usedDeprecatedRules.push(deprecatedRule);
312
+ }
313
+ });
314
+
315
+ return usedDeprecatedRules;
316
+ }
275
317
 
276
318
  /**
277
319
  * Checks if the given message is an error message.
@@ -429,6 +471,33 @@ class CLIEngine {
429
471
  */
430
472
  this._lintResultCache = new LintResultCache(cacheFile, this.config);
431
473
  }
474
+
475
+ // setup special filter for fixes
476
+ if (this.options.fix && this.options.fixTypes && this.options.fixTypes.length > 0) {
477
+
478
+ debug(`Using fix types ${this.options.fixTypes}`);
479
+
480
+ // throw an error if any invalid fix types are found
481
+ validateFixTypes(this.options.fixTypes);
482
+
483
+ // convert to Set for faster lookup
484
+ const fixTypes = new Set(this.options.fixTypes);
485
+
486
+ // save original value of options.fix in case it's a function
487
+ const originalFix = (typeof this.options.fix === "function")
488
+ ? this.options.fix : () => this.options.fix;
489
+
490
+ // create a cache of rules (but don't populate until needed)
491
+ this._rulesCache = null;
492
+
493
+ this.options.fix = lintResult => {
494
+ const rule = this._rulesCache.get(lintResult.ruleId);
495
+ const matches = rule.meta && fixTypes.has(rule.meta.type);
496
+
497
+ return matches && originalFix(lintResult);
498
+ };
499
+ }
500
+
432
501
  }
433
502
 
434
503
  getRules() {
@@ -511,6 +580,7 @@ class CLIEngine {
511
580
 
512
581
  const startTime = Date.now();
513
582
  const fileList = globUtils.listFilesToProcess(patterns, options);
583
+ const allUsedRules = new Set();
514
584
  const results = fileList.map(fileInfo => {
515
585
  if (fileInfo.ignored) {
516
586
  return createIgnoreResult(fileInfo.filename, options.cwd);
@@ -532,9 +602,20 @@ class CLIEngine {
532
602
  }
533
603
  }
534
604
 
605
+ // if there's a cache, populate it
606
+ if ("_rulesCache" in this) {
607
+ this._rulesCache = this.getRules();
608
+ }
609
+
535
610
  debug(`Processing ${fileInfo.filename}`);
536
611
 
537
- return processFile(fileInfo.filename, configHelper, options, this.linter);
612
+ const { result, config } = processFile(fileInfo.filename, configHelper, options, this.linter);
613
+
614
+ Object.keys(config.rules)
615
+ .filter(ruleId => ConfigOps.getRuleSeverity(config.rules[ruleId]))
616
+ .forEach(ruleId => allUsedRules.add(ruleId));
617
+
618
+ return result;
538
619
  });
539
620
 
540
621
  if (options.cache) {
@@ -555,6 +636,8 @@ class CLIEngine {
555
636
 
556
637
  const stats = calculateStatsPerRun(results);
557
638
 
639
+ const usedDeprecatedRules = createRuleDeprecationWarnings(allUsedRules, this.getRules());
640
+
558
641
  debug(`Linting complete in: ${Date.now() - startTime}ms`);
559
642
 
560
643
  return {
@@ -562,7 +645,8 @@ class CLIEngine {
562
645
  errorCount: stats.errorCount,
563
646
  warningCount: stats.warningCount,
564
647
  fixableErrorCount: stats.fixableErrorCount,
565
- fixableWarningCount: stats.fixableWarningCount
648
+ fixableWarningCount: stats.fixableWarningCount,
649
+ usedDeprecatedRules
566
650
  };
567
651
  }
568
652
 
@@ -585,22 +669,34 @@ class CLIEngine {
585
669
  const resolvedFilename = filename && !path.isAbsolute(filename)
586
670
  ? path.resolve(options.cwd, filename)
587
671
  : filename;
672
+ let usedDeprecatedRules;
588
673
 
589
674
  if (resolvedFilename && ignoredPaths.contains(resolvedFilename)) {
590
675
  if (warnIgnored) {
591
676
  results.push(createIgnoreResult(resolvedFilename, options.cwd));
592
677
  }
678
+ usedDeprecatedRules = [];
593
679
  } else {
594
- results.push(
595
- processText(
596
- text,
597
- configHelper,
598
- resolvedFilename,
599
- options.fix,
600
- options.allowInlineConfig,
601
- options.reportUnusedDisableDirectives,
602
- this.linter
603
- )
680
+
681
+ // if there's a cache, populate it
682
+ if ("_rulesCache" in this) {
683
+ this._rulesCache = this.getRules();
684
+ }
685
+
686
+ const { result, config } = processText(
687
+ text,
688
+ configHelper,
689
+ resolvedFilename,
690
+ options.fix,
691
+ options.allowInlineConfig,
692
+ options.reportUnusedDisableDirectives,
693
+ this.linter
694
+ );
695
+
696
+ results.push(result);
697
+ usedDeprecatedRules = createRuleDeprecationWarnings(
698
+ Object.keys(config.rules).filter(rule => ConfigOps.getRuleSeverity(config.rules[rule])),
699
+ this.getRules()
604
700
  );
605
701
  }
606
702
 
@@ -611,7 +707,8 @@ class CLIEngine {
611
707
  errorCount: stats.errorCount,
612
708
  warningCount: stats.warningCount,
613
709
  fixableErrorCount: stats.fixableErrorCount,
614
- fixableWarningCount: stats.fixableWarningCount
710
+ fixableWarningCount: stats.fixableWarningCount,
711
+ usedDeprecatedRules
615
712
  };
616
713
  }
617
714
 
package/lib/cli.js CHANGED
@@ -64,6 +64,7 @@ function translateOptions(cliOptions) {
64
64
  cacheFile: cliOptions.cacheFile,
65
65
  cacheLocation: cliOptions.cacheLocation,
66
66
  fix: (cliOptions.fix || cliOptions.fixDryRun) && (cliOptions.quiet ? quietFixPredicate : true),
67
+ fixTypes: cliOptions.fixType,
67
68
  allowInlineConfig: cliOptions.inlineConfig,
68
69
  reportUnusedDisableDirectives: cliOptions.reportUnusedDisableDirectives
69
70
  };
@@ -187,8 +188,12 @@ const cli = {
187
188
  return 2;
188
189
  }
189
190
 
190
- const engine = new CLIEngine(translateOptions(currentOptions));
191
+ if (currentOptions.fixType && !currentOptions.fix && !currentOptions.fixDryRun) {
192
+ log.error("The --fix-type option requires either --fix or --fix-dry-run.");
193
+ return 2;
194
+ }
191
195
 
196
+ const engine = new CLIEngine(translateOptions(currentOptions));
192
197
  const report = useStdin ? engine.executeOnText(text, currentOptions.stdinFilename, true) : engine.executeOnFiles(files);
193
198
 
194
199
  if (currentOptions.fix) {
package/lib/options.js CHANGED
@@ -97,6 +97,11 @@ module.exports = optionator({
97
97
  default: false,
98
98
  description: "Automatically fix problems without saving the changes to the file system"
99
99
  },
100
+ {
101
+ option: "fix-type",
102
+ type: "Array",
103
+ description: "Specify the types of fixes to apply (problem, suggestion, layout)"
104
+ },
100
105
  {
101
106
  heading: "Ignoring files"
102
107
  },
@@ -72,12 +72,15 @@ function isPropertyDescriptor(node) {
72
72
 
73
73
  module.exports = {
74
74
  meta: {
75
+ type: "suggestion",
76
+
75
77
  docs: {
76
78
  description: "enforce getter and setter pairs in objects",
77
79
  category: "Best Practices",
78
80
  recommended: false,
79
81
  url: "https://eslint.org/docs/rules/accessor-pairs"
80
82
  },
83
+
81
84
  schema: [{
82
85
  type: "object",
83
86
  properties: {
@@ -90,6 +93,7 @@ module.exports = {
90
93
  },
91
94
  additionalProperties: false
92
95
  }],
96
+
93
97
  messages: {
94
98
  getter: "Getter is not present.",
95
99
  setter: "Setter is not present."
@@ -13,13 +13,17 @@ const astUtils = require("../util/ast-utils");
13
13
 
14
14
  module.exports = {
15
15
  meta: {
16
+ type: "layout",
17
+
16
18
  docs: {
17
19
  description: "enforce linebreaks after opening and before closing array brackets",
18
20
  category: "Stylistic Issues",
19
21
  recommended: false,
20
22
  url: "https://eslint.org/docs/rules/array-bracket-newline"
21
23
  },
24
+
22
25
  fixable: "whitespace",
26
+
23
27
  schema: [
24
28
  {
25
29
  oneOf: [
@@ -42,6 +46,7 @@ module.exports = {
42
46
  ]
43
47
  }
44
48
  ],
49
+
45
50
  messages: {
46
51
  unexpectedOpeningLinebreak: "There should be no linebreak after '['.",
47
52
  unexpectedClosingLinebreak: "There should be no linebreak before ']'.",
@@ -12,13 +12,17 @@ const astUtils = require("../util/ast-utils");
12
12
 
13
13
  module.exports = {
14
14
  meta: {
15
+ type: "layout",
16
+
15
17
  docs: {
16
18
  description: "enforce consistent spacing inside array brackets",
17
19
  category: "Stylistic Issues",
18
20
  recommended: false,
19
21
  url: "https://eslint.org/docs/rules/array-bracket-spacing"
20
22
  },
23
+
21
24
  fixable: "whitespace",
25
+
22
26
  schema: [
23
27
  {
24
28
  enum: ["always", "never"]
@@ -39,6 +43,7 @@ module.exports = {
39
43
  additionalProperties: false
40
44
  }
41
45
  ],
46
+
42
47
  messages: {
43
48
  unexpectedSpaceAfter: "There should be no space after '{{tokenValue}}'.",
44
49
  unexpectedSpaceBefore: "There should be no space before '{{tokenValue}}'.",
@@ -141,6 +141,8 @@ function isCallbackOfArrayMethod(node) {
141
141
 
142
142
  module.exports = {
143
143
  meta: {
144
+ type: "problem",
145
+
144
146
  docs: {
145
147
  description: "enforce `return` statements in callbacks of array methods",
146
148
  category: "Best Practices",
@@ -13,13 +13,17 @@ const astUtils = require("../util/ast-utils");
13
13
 
14
14
  module.exports = {
15
15
  meta: {
16
+ type: "layout",
17
+
16
18
  docs: {
17
19
  description: "enforce line breaks after each array element",
18
20
  category: "Stylistic Issues",
19
21
  recommended: false,
20
22
  url: "https://eslint.org/docs/rules/array-element-newline"
21
23
  },
24
+
22
25
  fixable: "whitespace",
26
+
23
27
  schema: [
24
28
  {
25
29
  oneOf: [
@@ -16,6 +16,8 @@ const astUtils = require("../util/ast-utils");
16
16
 
17
17
  module.exports = {
18
18
  meta: {
19
+ type: "suggestion",
20
+
19
21
  docs: {
20
22
  description: "require braces around arrow function bodies",
21
23
  category: "ECMAScript 6",
@@ -16,6 +16,8 @@ const astUtils = require("../util/ast-utils");
16
16
 
17
17
  module.exports = {
18
18
  meta: {
19
+ type: "layout",
20
+
19
21
  docs: {
20
22
  description: "require parentheses around arrow function arguments",
21
23
  category: "ECMAScript 6",
@@ -16,6 +16,8 @@ const astUtils = require("../util/ast-utils");
16
16
 
17
17
  module.exports = {
18
18
  meta: {
19
+ type: "layout",
20
+
19
21
  docs: {
20
22
  description: "enforce consistent spacing before and after the arrow in arrow functions",
21
23
  category: "ECMAScript 6",
@@ -10,6 +10,8 @@
10
10
 
11
11
  module.exports = {
12
12
  meta: {
13
+ type: "suggestion",
14
+
13
15
  docs: {
14
16
  description: "enforce the use of variables within the scope they are defined",
15
17
  category: "Best Practices",
@@ -13,6 +13,8 @@ const util = require("../util/ast-utils");
13
13
 
14
14
  module.exports = {
15
15
  meta: {
16
+ type: "layout",
17
+
16
18
  docs: {
17
19
  description: "disallow or enforce spaces inside of blocks after opening block and before closing block",
18
20
  category: "Stylistic Issues",
@@ -13,6 +13,8 @@ const astUtils = require("../util/ast-utils");
13
13
 
14
14
  module.exports = {
15
15
  meta: {
16
+ type: "layout",
17
+
16
18
  docs: {
17
19
  description: "enforce consistent brace style for blocks",
18
20
  category: "Stylistic Issues",
@@ -10,6 +10,8 @@
10
10
 
11
11
  module.exports = {
12
12
  meta: {
13
+ type: "suggestion",
14
+
13
15
  docs: {
14
16
  description: "require `return` statements after callbacks",
15
17
  category: "Node.js and CommonJS",
@@ -11,6 +11,8 @@
11
11
 
12
12
  module.exports = {
13
13
  meta: {
14
+ type: "suggestion",
15
+
14
16
  docs: {
15
17
  description: "enforce camelcase naming convention",
16
18
  category: "Stylistic Issues",
@@ -108,13 +108,17 @@ function createRegExpForIgnorePatterns(normalizedOptions) {
108
108
 
109
109
  module.exports = {
110
110
  meta: {
111
+ type: "suggestion",
112
+
111
113
  docs: {
112
114
  description: "enforce or disallow capitalization of the first letter of a comment",
113
115
  category: "Stylistic Issues",
114
116
  recommended: false,
115
117
  url: "https://eslint.org/docs/rules/capitalized-comments"
116
118
  },
119
+
117
120
  fixable: "code",
121
+
118
122
  schema: [
119
123
  { enum: ["always", "never"] },
120
124
  {
@@ -11,12 +11,15 @@
11
11
 
12
12
  module.exports = {
13
13
  meta: {
14
+ type: "suggestion",
15
+
14
16
  docs: {
15
17
  description: "enforce that class methods utilize `this`",
16
18
  category: "Best Practices",
17
19
  recommended: false,
18
20
  url: "https://eslint.org/docs/rules/class-methods-use-this"
19
21
  },
22
+
20
23
  schema: [{
21
24
  type: "object",
22
25
  properties: {
@@ -76,13 +76,17 @@ function normalizeOptions(optionValue) {
76
76
 
77
77
  module.exports = {
78
78
  meta: {
79
+ type: "layout",
80
+
79
81
  docs: {
80
82
  description: "require or disallow trailing commas",
81
83
  category: "Stylistic Issues",
82
84
  recommended: false,
83
85
  url: "https://eslint.org/docs/rules/comma-dangle"
84
86
  },
87
+
85
88
  fixable: "code",
89
+
86
90
  schema: {
87
91
  definitions: {
88
92
  value: {
@@ -12,6 +12,8 @@ const astUtils = require("../util/ast-utils");
12
12
 
13
13
  module.exports = {
14
14
  meta: {
15
+ type: "layout",
16
+
15
17
  docs: {
16
18
  description: "enforce consistent spacing before and after commas",
17
19
  category: "Stylistic Issues",
@@ -13,13 +13,17 @@ const astUtils = require("../util/ast-utils");
13
13
 
14
14
  module.exports = {
15
15
  meta: {
16
+ type: "layout",
17
+
16
18
  docs: {
17
19
  description: "enforce consistent comma style",
18
20
  category: "Stylistic Issues",
19
21
  recommended: false,
20
22
  url: "https://eslint.org/docs/rules/comma-style"
21
23
  },
24
+
22
25
  fixable: "code",
26
+
23
27
  schema: [
24
28
  {
25
29
  enum: ["first", "last"]
@@ -37,6 +41,7 @@ module.exports = {
37
41
  additionalProperties: false
38
42
  }
39
43
  ],
44
+
40
45
  messages: {
41
46
  unexpectedLineBeforeAndAfterComma: "Bad line breaking before and after ','.",
42
47
  expectedCommaFirst: "',' should be placed first.",
@@ -20,6 +20,8 @@ const astUtils = require("../util/ast-utils");
20
20
 
21
21
  module.exports = {
22
22
  meta: {
23
+ type: "suggestion",
24
+
23
25
  docs: {
24
26
  description: "enforce a maximum cyclomatic complexity allowed in a program",
25
27
  category: "Best Practices",
@@ -12,6 +12,8 @@ const astUtils = require("../util/ast-utils");
12
12
 
13
13
  module.exports = {
14
14
  meta: {
15
+ type: "layout",
16
+
15
17
  docs: {
16
18
  description: "enforce consistent spacing inside computed property brackets",
17
19
  category: "Stylistic Issues",
@@ -53,6 +53,8 @@ function isClassConstructor(node) {
53
53
 
54
54
  module.exports = {
55
55
  meta: {
56
+ type: "suggestion",
57
+
56
58
  docs: {
57
59
  description: "require `return` statements to either always or never specify values",
58
60
  category: "Best Practices",
@@ -10,6 +10,8 @@
10
10
 
11
11
  module.exports = {
12
12
  meta: {
13
+ type: "suggestion",
14
+
13
15
  docs: {
14
16
  description: "enforce consistent naming when capturing the current execution context",
15
17
  category: "Stylistic Issues",
@@ -92,6 +92,8 @@ function isPossibleConstructor(node) {
92
92
 
93
93
  module.exports = {
94
94
  meta: {
95
+ type: "problem",
96
+
95
97
  docs: {
96
98
  description: "require `super()` calls in constructors",
97
99
  category: "ECMAScript 6",