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
@@ -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: "enforce consistent brace style for all control statements",
21
23
  category: "Best Practices",
@@ -12,6 +12,8 @@ const DEFAULT_COMMENT_PATTERN = /^no default$/i;
12
12
 
13
13
  module.exports = {
14
14
  meta: {
15
+ type: "suggestion",
16
+
15
17
  docs: {
16
18
  description: "require `default` cases in `switch` statements",
17
19
  category: "Best Practices",
@@ -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 newlines before and after dots",
18
20
  category: "Best Practices",
@@ -19,6 +19,8 @@ const keywords = require("../util/keywords");
19
19
 
20
20
  module.exports = {
21
21
  meta: {
22
+ type: "suggestion",
23
+
22
24
  docs: {
23
25
  description: "enforce dot notation whenever possible",
24
26
  category: "Best Practices",
@@ -16,18 +16,23 @@ const lodash = require("lodash");
16
16
 
17
17
  module.exports = {
18
18
  meta: {
19
+ type: "layout",
20
+
19
21
  docs: {
20
22
  description: "require or disallow newline at the end of files",
21
23
  category: "Stylistic Issues",
22
24
  recommended: false,
23
25
  url: "https://eslint.org/docs/rules/eol-last"
24
26
  },
27
+
25
28
  fixable: "whitespace",
29
+
26
30
  schema: [
27
31
  {
28
32
  enum: ["always", "never", "unix", "windows"]
29
33
  }
30
34
  ],
35
+
31
36
  messages: {
32
37
  missing: "Newline required at end of file but not found.",
33
38
  unexpected: "Newline not allowed at end of file."
@@ -17,6 +17,8 @@ const astUtils = require("../util/ast-utils");
17
17
 
18
18
  module.exports = {
19
19
  meta: {
20
+ type: "suggestion",
21
+
20
22
  docs: {
21
23
  description: "require the use of `===` and `!==`",
22
24
  category: "Best Practices",
@@ -11,14 +11,18 @@
11
11
 
12
12
  module.exports = {
13
13
  meta: {
14
+ type: "problem",
15
+
14
16
  docs: {
15
17
  description: "enforce \"for\" loop update clause moving the counter in the right direction.",
16
18
  category: "Possible Errors",
17
19
  recommended: true,
18
20
  url: "https://eslint.org/docs/rules/for-direction"
19
21
  },
22
+
20
23
  fixable: null,
21
24
  schema: [],
25
+
22
26
  messages: {
23
27
  incorrectDirection: "The update clause in this loop moves the variable in the wrong direction."
24
28
  }
@@ -17,6 +17,8 @@ const astUtils = require("../util/ast-utils");
17
17
 
18
18
  module.exports = {
19
19
  meta: {
20
+ type: "layout",
21
+
20
22
  docs: {
21
23
  description: "require or disallow spacing between function identifiers and their invocations",
22
24
  category: "Stylistic Issues",
@@ -25,6 +27,7 @@ module.exports = {
25
27
  },
26
28
 
27
29
  fixable: "whitespace",
30
+
28
31
  schema: {
29
32
  anyOf: [
30
33
  {
@@ -58,6 +61,7 @@ module.exports = {
58
61
  }
59
62
  ]
60
63
  },
64
+
61
65
  messages: {
62
66
  unexpected: "Unexpected newline between function name and paren.",
63
67
  missing: "Missing space between function name and paren."
@@ -70,6 +70,8 @@ const optionsObject = {
70
70
 
71
71
  module.exports = {
72
72
  meta: {
73
+ type: "suggestion",
74
+
73
75
  docs: {
74
76
  description: "require function names to match the name of the variable or property to which they are assigned",
75
77
  category: "Stylistic Issues",
@@ -88,6 +90,7 @@ module.exports = {
88
90
  items: [optionsObject]
89
91
  }]
90
92
  },
93
+
91
94
  messages: {
92
95
  matchProperty: "Function name `{{funcName}}` should match property name `{{name}}`",
93
96
  matchVariable: "Function name `{{funcName}}` should match variable name `{{name}}`",
@@ -26,6 +26,8 @@ function isFunctionName(variable) {
26
26
 
27
27
  module.exports = {
28
28
  meta: {
29
+ type: "suggestion",
30
+
29
31
  docs: {
30
32
  description: "require or disallow named `function` expressions",
31
33
  category: "Stylistic Issues",
@@ -58,6 +60,7 @@ module.exports = {
58
60
  }
59
61
  ]
60
62
  },
63
+
61
64
  messages: {
62
65
  unnamed: "Unexpected unnamed {{name}}.",
63
66
  named: "Unexpected named {{name}}."
@@ -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 consistent use of either `function` declarations or expressions",
15
17
  category: "Stylistic Issues",
@@ -31,6 +33,7 @@ module.exports = {
31
33
  additionalProperties: false
32
34
  }
33
35
  ],
36
+
34
37
  messages: {
35
38
  expression: "Expected a function expression.",
36
39
  declaration: "Expected a function declaration."
@@ -16,13 +16,17 @@ 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 line breaks inside function parentheses",
21
23
  category: "Stylistic Issues",
22
24
  recommended: false,
23
25
  url: "https://eslint.org/docs/rules/function-paren-newline"
24
26
  },
27
+
25
28
  fixable: "whitespace",
29
+
26
30
  schema: [
27
31
  {
28
32
  oneOf: [
@@ -42,6 +46,7 @@ module.exports = {
42
46
  ]
43
47
  }
44
48
  ],
49
+
45
50
  messages: {
46
51
  expectedBefore: "Expected newline before ')'.",
47
52
  expectedAfter: "Expected newline after '('.",
@@ -27,6 +27,8 @@ const OVERRIDE_SCHEMA = {
27
27
 
28
28
  module.exports = {
29
29
  meta: {
30
+ type: "layout",
31
+
30
32
  docs: {
31
33
  description: "enforce consistent spacing around `*` operators in generator functions",
32
34
  category: "ECMAScript 6",
@@ -56,6 +58,7 @@ module.exports = {
56
58
  ]
57
59
  }
58
60
  ],
61
+
59
62
  messages: {
60
63
  missingBefore: "Missing space before *.",
61
64
  missingAfter: "Missing space after *.",
@@ -44,13 +44,17 @@ function getId(node) {
44
44
 
45
45
  module.exports = {
46
46
  meta: {
47
+ type: "problem",
48
+
47
49
  docs: {
48
50
  description: "enforce `return` statements in getters",
49
51
  category: "Possible Errors",
50
52
  recommended: true,
51
53
  url: "https://eslint.org/docs/rules/getter-return"
52
54
  },
55
+
53
56
  fixable: null,
57
+
54
58
  schema: [
55
59
  {
56
60
  type: "object",
@@ -62,6 +66,7 @@ module.exports = {
62
66
  additionalProperties: false
63
67
  }
64
68
  ],
69
+
65
70
  messages: {
66
71
  expected: "Expected to return a value in {{name}}.",
67
72
  expectedAlways: "Expected {{name}} to always return a value."
@@ -48,6 +48,8 @@ function isShadowed(scope, node) {
48
48
 
49
49
  module.exports = {
50
50
  meta: {
51
+ type: "suggestion",
52
+
51
53
  docs: {
52
54
  description: "require `require()` calls to be placed at top-level module scope",
53
55
  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: "require `for-in` loops to include an `if` statement",
16
18
  category: "Best Practices",
@@ -11,6 +11,8 @@
11
11
 
12
12
  module.exports = {
13
13
  meta: {
14
+ type: "suggestion",
15
+
14
16
  docs: {
15
17
  description: "require error handling in callbacks",
16
18
  category: "Node.js and CommonJS",
@@ -12,6 +12,8 @@
12
12
 
13
13
  module.exports = {
14
14
  meta: {
15
+ type: "suggestion",
16
+
15
17
  docs: {
16
18
  description: "disallow specified identifiers",
17
19
  category: "Stylistic Issues",
@@ -12,6 +12,8 @@
12
12
 
13
13
  module.exports = {
14
14
  meta: {
15
+ type: "suggestion",
16
+
15
17
  docs: {
16
18
  description: "enforce minimum and maximum identifier lengths",
17
19
  category: "Stylistic Issues",
@@ -11,6 +11,8 @@
11
11
 
12
12
  module.exports = {
13
13
  meta: {
14
+ type: "suggestion",
15
+
14
16
  docs: {
15
17
  description: "require identifiers to match a specified regular expression",
16
18
  category: "Stylistic Issues",
@@ -27,6 +29,12 @@ module.exports = {
27
29
  properties: {
28
30
  properties: {
29
31
  type: "boolean"
32
+ },
33
+ onlyDeclarations: {
34
+ type: "boolean"
35
+ },
36
+ ignoreDestructuring: {
37
+ type: "boolean"
30
38
  }
31
39
  }
32
40
  }
@@ -36,15 +44,25 @@ module.exports = {
36
44
  create(context) {
37
45
 
38
46
  //--------------------------------------------------------------------------
39
- // Helpers
47
+ // Options
40
48
  //--------------------------------------------------------------------------
41
-
42
49
  const pattern = context.options[0] || "^.+$",
43
50
  regexp = new RegExp(pattern);
44
51
 
45
52
  const options = context.options[1] || {},
46
53
  properties = !!options.properties,
47
- onlyDeclarations = !!options.onlyDeclarations;
54
+ onlyDeclarations = !!options.onlyDeclarations,
55
+ ignoreDestructuring = !!options.ignoreDestructuring;
56
+
57
+ //--------------------------------------------------------------------------
58
+ // Helpers
59
+ //--------------------------------------------------------------------------
60
+
61
+ // contains reported nodes to avoid reporting twice on destructuring with shorthand notation
62
+ const reported = new Map();
63
+ const ALLOWED_PARENT_TYPES = new Set(["CallExpression", "NewExpression"]);
64
+ const DECLARATION_TYPES = new Set(["FunctionDeclaration", "VariableDeclarator"]);
65
+ const IMPORT_TYPES = new Set(["ImportSpecifier", "ImportNamespaceSpecifier", "ImportDefaultSpecifier"]);
48
66
 
49
67
  /**
50
68
  * Checks if a string matches the provided pattern
@@ -56,6 +74,26 @@ module.exports = {
56
74
  return !regexp.test(name);
57
75
  }
58
76
 
77
+ /**
78
+ * Checks if a parent of a node is an ObjectPattern.
79
+ * @param {ASTNode} node The node to check.
80
+ * @returns {boolean} if the node is inside an ObjectPattern
81
+ * @private
82
+ */
83
+ function isInsideObjectPattern(node) {
84
+ let { parent } = node;
85
+
86
+ while (parent) {
87
+ if (parent.type === "ObjectPattern") {
88
+ return true;
89
+ }
90
+
91
+ parent = parent.parent;
92
+ }
93
+
94
+ return false;
95
+ }
96
+
59
97
  /**
60
98
  * Verifies if we should report an error or not based on the effective
61
99
  * parent node and the identifier name.
@@ -64,9 +102,8 @@ module.exports = {
64
102
  * @returns {boolean} whether an error should be reported or not
65
103
  */
66
104
  function shouldReport(effectiveParent, name) {
67
- return effectiveParent.type !== "CallExpression" &&
68
- effectiveParent.type !== "NewExpression" &&
69
- isInvalid(name);
105
+ return (!onlyDeclarations || DECLARATION_TYPES.has(effectiveParent.type)) &&
106
+ !ALLOWED_PARENT_TYPES.has(effectiveParent.type) && isInvalid(name);
70
107
  }
71
108
 
72
109
  /**
@@ -76,14 +113,17 @@ module.exports = {
76
113
  * @private
77
114
  */
78
115
  function report(node) {
79
- context.report({
80
- node,
81
- message: "Identifier '{{name}}' does not match the pattern '{{pattern}}'.",
82
- data: {
83
- name: node.name,
84
- pattern
85
- }
86
- });
116
+ if (!reported.has(node)) {
117
+ context.report({
118
+ node,
119
+ message: "Identifier '{{name}}' does not match the pattern '{{pattern}}'.",
120
+ data: {
121
+ name: node.name,
122
+ pattern
123
+ }
124
+ });
125
+ reported.set(node, true);
126
+ }
87
127
  }
88
128
 
89
129
  return {
@@ -106,36 +146,70 @@ module.exports = {
106
146
  report(node);
107
147
  }
108
148
 
109
- // Report AssignmentExpressions only if they are the left side of the assignment
149
+ // Report AssignmentExpressions left side's assigned variable id
110
150
  } else if (effectiveParent.type === "AssignmentExpression" &&
111
- (effectiveParent.right.type !== "MemberExpression" ||
112
151
  effectiveParent.left.type === "MemberExpression" &&
113
- effectiveParent.left.property.name === name)) {
152
+ effectiveParent.left.property.name === node.name) {
153
+ if (isInvalid(name)) {
154
+ report(node);
155
+ }
156
+
157
+ // Report AssignmentExpressions only if they are the left side of the assignment
158
+ } else if (effectiveParent.type === "AssignmentExpression" && effectiveParent.right.type !== "MemberExpression") {
114
159
  if (isInvalid(name)) {
115
160
  report(node);
116
161
  }
117
162
  }
118
163
 
119
- } else if (parent.type === "Property") {
164
+ /*
165
+ * Properties have their own rules, and
166
+ * AssignmentPattern nodes can be treated like Properties:
167
+ * e.g.: const { no_camelcased = false } = bar;
168
+ */
169
+ } else if (parent.type === "Property" || parent.type === "AssignmentPattern") {
170
+
171
+ if (parent.parent && parent.parent.type === "ObjectPattern") {
172
+ if (parent.shorthand && parent.value.left && isInvalid(name)) {
173
+
174
+ report(node);
175
+ }
176
+
177
+ const assignmentKeyEqualsValue = parent.key.name === parent.value.name;
120
178
 
121
- if (!properties || parent.key.name !== name) {
179
+ // prevent checking righthand side of destructured object
180
+ if (!assignmentKeyEqualsValue && parent.key === node) {
181
+ return;
182
+ }
183
+
184
+ const valueIsInvalid = parent.value.name && isInvalid(name);
185
+
186
+ // ignore destructuring if the option is set, unless a new identifier is created
187
+ if (valueIsInvalid && !(assignmentKeyEqualsValue && ignoreDestructuring)) {
188
+ report(node);
189
+ }
190
+ }
191
+
192
+ // never check properties or always ignore destructuring
193
+ if (!properties || (ignoreDestructuring && isInsideObjectPattern(node))) {
122
194
  return;
123
195
  }
124
196
 
125
- if (shouldReport(effectiveParent, name)) {
197
+ // don't check right hand side of AssignmentExpression to prevent duplicate warnings
198
+ if (parent.right !== node && shouldReport(effectiveParent, name)) {
126
199
  report(node);
127
200
  }
128
201
 
129
- } else {
130
- const isDeclaration = effectiveParent.type === "FunctionDeclaration" || effectiveParent.type === "VariableDeclarator";
202
+ // Check if it's an import specifier
203
+ } else if (IMPORT_TYPES.has(parent.type)) {
131
204
 
132
- if (onlyDeclarations && !isDeclaration) {
133
- return;
134
- }
135
-
136
- if (shouldReport(effectiveParent, name)) {
205
+ // Report only if the local imported identifier is invalid
206
+ if (parent.local && parent.local.name === node.name && isInvalid(name)) {
137
207
  report(node);
138
208
  }
209
+
210
+ // Report anything that is invalid that isn't a CallExpression
211
+ } else if (shouldReport(effectiveParent, name)) {
212
+ report(node);
139
213
  }
140
214
  }
141
215
 
@@ -9,13 +9,17 @@
9
9
  //------------------------------------------------------------------------------
10
10
  module.exports = {
11
11
  meta: {
12
+ type: "layout",
13
+
12
14
  docs: {
13
15
  description: "enforce the location of arrow function bodies",
14
16
  category: "Stylistic Issues",
15
17
  recommended: false,
16
18
  url: "https://eslint.org/docs/rules/implicit-arrow-linebreak"
17
19
  },
20
+
18
21
  fixable: "whitespace",
22
+
19
23
  schema: [
20
24
  {
21
25
  enum: ["beside", "below"]
@@ -21,16 +21,19 @@ const astUtils = require("../util/ast-utils");
21
21
  /* istanbul ignore next: this rule has known coverage issues, but it's deprecated and shouldn't be updated in the future anyway. */
22
22
  module.exports = {
23
23
  meta: {
24
+ type: "layout",
25
+
24
26
  docs: {
25
27
  description: "enforce consistent indentation",
26
28
  category: "Stylistic Issues",
27
29
  recommended: false,
28
- replacedBy: ["indent"],
29
30
  url: "https://eslint.org/docs/rules/indent-legacy"
30
31
  },
31
32
 
32
33
  deprecated: true,
33
34
 
35
+ replacedBy: ["indent"],
36
+
34
37
  fixable: "whitespace",
35
38
 
36
39
  schema: [
@@ -490,6 +490,8 @@ const ELEMENT_LIST_SCHEMA = {
490
490
 
491
491
  module.exports = {
492
492
  meta: {
493
+ type: "layout",
494
+
493
495
  docs: {
494
496
  description: "enforce consistent indentation",
495
497
  category: "Stylistic Issues",
@@ -44,6 +44,8 @@ function isInitialized(node) {
44
44
 
45
45
  module.exports = {
46
46
  meta: {
47
+ type: "suggestion",
48
+
47
49
  docs: {
48
50
  description: "require or disallow initialization in variable declarations",
49
51
  category: "Variables",
@@ -38,6 +38,8 @@ const QUOTE_SETTINGS = {
38
38
 
39
39
  module.exports = {
40
40
  meta: {
41
+ type: "layout",
42
+
41
43
  docs: {
42
44
  description: "enforce the consistent use of either double or single quotes in JSX attributes",
43
45
  category: "Stylistic Issues",
@@ -128,6 +128,8 @@ const messages = {
128
128
 
129
129
  module.exports = {
130
130
  meta: {
131
+ type: "layout",
132
+
131
133
  docs: {
132
134
  description: "enforce consistent spacing between keys and values in object literal properties",
133
135
  category: "Stylistic Issues",
@@ -360,10 +362,9 @@ module.exports = {
360
362
  */
361
363
  function isKeyValueProperty(property) {
362
364
  return !(
363
- property.method ||
365
+ (property.method ||
364
366
  property.shorthand ||
365
- property.kind !== "init" ||
366
- property.type !== "Property" // Could be "ExperimentalSpreadProperty" or "SpreadElement"
367
+ property.kind !== "init" || property.type !== "Property") // Could be "ExperimentalSpreadProperty" or "SpreadElement"
367
368
  );
368
369
  }
369
370
 
@@ -65,6 +65,8 @@ function isCloseParenOfTemplate(token) {
65
65
 
66
66
  module.exports = {
67
67
  meta: {
68
+ type: "layout",
69
+
68
70
  docs: {
69
71
  description: "enforce consistent spacing before and after keywords",
70
72
  category: "Stylistic Issues",
@@ -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 position of line comments",
17
19
  category: "Stylistic Issues",
@@ -17,6 +17,8 @@ const astUtils = require("../util/ast-utils");
17
17
 
18
18
  module.exports = {
19
19
  meta: {
20
+ type: "layout",
21
+
20
22
  docs: {
21
23
  description: "enforce consistent linebreak style",
22
24
  category: "Stylistic Issues",
@@ -52,6 +52,8 @@ function getCommentLineNums(comments) {
52
52
 
53
53
  module.exports = {
54
54
  meta: {
55
+ type: "layout",
56
+
55
57
  docs: {
56
58
  description: "require empty lines around comments",
57
59
  category: "Stylistic Issues",
@@ -14,13 +14,15 @@ const astUtils = require("../util/ast-utils");
14
14
 
15
15
  module.exports = {
16
16
  meta: {
17
+ type: "layout",
18
+
17
19
  docs: {
18
20
  description: "require or disallow newlines around directives",
19
21
  category: "Stylistic Issues",
20
22
  recommended: false,
21
- replacedBy: ["padding-line-between-statements"],
22
23
  url: "https://eslint.org/docs/rules/lines-around-directive"
23
24
  },
25
+
24
26
  schema: [{
25
27
  oneOf: [
26
28
  {
@@ -41,8 +43,10 @@ module.exports = {
41
43
  }
42
44
  ]
43
45
  }],
46
+
44
47
  fixable: "whitespace",
45
- deprecated: true
48
+ deprecated: true,
49
+ replacedBy: ["padding-line-between-statements"]
46
50
  },
47
51
 
48
52
  create(context) {
@@ -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: "require or disallow an empty line between class members",
17
19
  category: "Stylistic Issues",