eslint 8.2.0 → 8.5.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 (304) hide show
  1. package/README.md +7 -11
  2. package/conf/globals.js +144 -0
  3. package/lib/cli.js +1 -1
  4. package/lib/config/default-config.js +11 -2
  5. package/lib/config/flat-config-array.js +2 -2
  6. package/lib/config/flat-config-helpers.js +67 -0
  7. package/lib/config/flat-config-schema.js +13 -8
  8. package/lib/config/rule-validator.js +28 -27
  9. package/lib/eslint/eslint.js +11 -3
  10. package/lib/linter/code-path-analysis/code-path-analyzer.js +6 -1
  11. package/lib/linter/code-path-analysis/code-path.js +1 -1
  12. package/lib/linter/linter.js +457 -45
  13. package/lib/options.js +6 -6
  14. package/lib/rule-tester/rule-tester.js +14 -0
  15. package/lib/rules/accessor-pairs.js +1 -0
  16. package/lib/rules/array-bracket-newline.js +1 -0
  17. package/lib/rules/array-bracket-spacing.js +1 -0
  18. package/lib/rules/array-callback-return.js +1 -0
  19. package/lib/rules/array-element-newline.js +1 -0
  20. package/lib/rules/arrow-body-style.js +1 -0
  21. package/lib/rules/arrow-parens.js +1 -0
  22. package/lib/rules/arrow-spacing.js +1 -0
  23. package/lib/rules/block-scoped-var.js +3 -0
  24. package/lib/rules/block-spacing.js +11 -3
  25. package/lib/rules/brace-style.js +7 -0
  26. package/lib/rules/callback-return.js +1 -0
  27. package/lib/rules/camelcase.js +1 -0
  28. package/lib/rules/capitalized-comments.js +1 -0
  29. package/lib/rules/class-methods-use-this.js +11 -1
  30. package/lib/rules/comma-dangle.js +1 -0
  31. package/lib/rules/comma-spacing.js +1 -0
  32. package/lib/rules/comma-style.js +1 -0
  33. package/lib/rules/complexity.js +15 -6
  34. package/lib/rules/computed-property-spacing.js +1 -0
  35. package/lib/rules/consistent-return.js +1 -0
  36. package/lib/rules/consistent-this.js +1 -0
  37. package/lib/rules/constructor-super.js +1 -0
  38. package/lib/rules/curly.js +1 -0
  39. package/lib/rules/default-case-last.js +1 -0
  40. package/lib/rules/default-case.js +1 -0
  41. package/lib/rules/default-param-last.js +1 -0
  42. package/lib/rules/dot-location.js +1 -0
  43. package/lib/rules/dot-notation.js +1 -0
  44. package/lib/rules/eol-last.js +1 -0
  45. package/lib/rules/eqeqeq.js +1 -0
  46. package/lib/rules/for-direction.js +1 -0
  47. package/lib/rules/func-call-spacing.js +1 -0
  48. package/lib/rules/func-name-matching.js +1 -0
  49. package/lib/rules/func-names.js +1 -0
  50. package/lib/rules/func-style.js +1 -0
  51. package/lib/rules/function-call-argument-newline.js +1 -0
  52. package/lib/rules/function-paren-newline.js +1 -0
  53. package/lib/rules/generator-star-spacing.js +1 -0
  54. package/lib/rules/getter-return.js +1 -0
  55. package/lib/rules/global-require.js +1 -0
  56. package/lib/rules/grouped-accessor-pairs.js +1 -0
  57. package/lib/rules/guard-for-in.js +1 -0
  58. package/lib/rules/handle-callback-err.js +1 -0
  59. package/lib/rules/id-blacklist.js +1 -0
  60. package/lib/rules/id-denylist.js +1 -0
  61. package/lib/rules/id-length.js +1 -0
  62. package/lib/rules/id-match.js +24 -0
  63. package/lib/rules/implicit-arrow-linebreak.js +1 -0
  64. package/lib/rules/indent-legacy.js +1 -0
  65. package/lib/rules/indent.js +22 -0
  66. package/lib/rules/index.js +1 -0
  67. package/lib/rules/init-declarations.js +1 -0
  68. package/lib/rules/jsx-quotes.js +1 -0
  69. package/lib/rules/key-spacing.js +1 -0
  70. package/lib/rules/keyword-spacing.js +2 -0
  71. package/lib/rules/line-comment-position.js +1 -0
  72. package/lib/rules/linebreak-style.js +1 -0
  73. package/lib/rules/lines-around-comment.js +55 -7
  74. package/lib/rules/lines-around-directive.js +1 -0
  75. package/lib/rules/lines-between-class-members.js +1 -0
  76. package/lib/rules/max-classes-per-file.js +1 -0
  77. package/lib/rules/max-depth.js +3 -0
  78. package/lib/rules/max-len.js +1 -0
  79. package/lib/rules/max-lines-per-function.js +1 -0
  80. package/lib/rules/max-lines.js +1 -0
  81. package/lib/rules/max-nested-callbacks.js +1 -0
  82. package/lib/rules/max-params.js +1 -0
  83. package/lib/rules/max-statements-per-line.js +1 -0
  84. package/lib/rules/max-statements.js +11 -0
  85. package/lib/rules/multiline-comment-style.js +1 -0
  86. package/lib/rules/multiline-ternary.js +1 -0
  87. package/lib/rules/new-cap.js +1 -0
  88. package/lib/rules/new-parens.js +1 -0
  89. package/lib/rules/newline-after-var.js +1 -0
  90. package/lib/rules/newline-before-return.js +1 -0
  91. package/lib/rules/newline-per-chained-call.js +1 -0
  92. package/lib/rules/no-alert.js +1 -0
  93. package/lib/rules/no-array-constructor.js +1 -0
  94. package/lib/rules/no-async-promise-executor.js +1 -0
  95. package/lib/rules/no-await-in-loop.js +1 -0
  96. package/lib/rules/no-bitwise.js +1 -0
  97. package/lib/rules/no-buffer-constructor.js +1 -0
  98. package/lib/rules/no-caller.js +1 -0
  99. package/lib/rules/no-case-declarations.js +1 -0
  100. package/lib/rules/no-catch-shadow.js +1 -0
  101. package/lib/rules/no-class-assign.js +1 -0
  102. package/lib/rules/no-compare-neg-zero.js +1 -0
  103. package/lib/rules/no-cond-assign.js +1 -0
  104. package/lib/rules/no-confusing-arrow.js +1 -0
  105. package/lib/rules/no-console.js +1 -0
  106. package/lib/rules/no-const-assign.js +1 -0
  107. package/lib/rules/no-constant-condition.js +4 -1
  108. package/lib/rules/no-constructor-return.js +1 -0
  109. package/lib/rules/no-continue.js +1 -0
  110. package/lib/rules/no-control-regex.js +1 -0
  111. package/lib/rules/no-debugger.js +1 -0
  112. package/lib/rules/no-delete-var.js +1 -0
  113. package/lib/rules/no-div-regex.js +1 -0
  114. package/lib/rules/no-dupe-args.js +1 -0
  115. package/lib/rules/no-dupe-class-members.js +1 -0
  116. package/lib/rules/no-dupe-else-if.js +1 -0
  117. package/lib/rules/no-dupe-keys.js +1 -0
  118. package/lib/rules/no-duplicate-case.js +1 -0
  119. package/lib/rules/no-duplicate-imports.js +1 -0
  120. package/lib/rules/no-else-return.js +1 -0
  121. package/lib/rules/no-empty-character-class.js +1 -0
  122. package/lib/rules/no-empty-function.js +1 -0
  123. package/lib/rules/no-empty-pattern.js +1 -0
  124. package/lib/rules/no-empty.js +1 -0
  125. package/lib/rules/no-eq-null.js +1 -0
  126. package/lib/rules/no-eval.js +3 -0
  127. package/lib/rules/no-ex-assign.js +1 -0
  128. package/lib/rules/no-extend-native.js +1 -0
  129. package/lib/rules/no-extra-bind.js +1 -0
  130. package/lib/rules/no-extra-boolean-cast.js +1 -0
  131. package/lib/rules/no-extra-label.js +1 -0
  132. package/lib/rules/no-extra-parens.js +1 -0
  133. package/lib/rules/no-extra-semi.js +2 -1
  134. package/lib/rules/no-fallthrough.js +1 -0
  135. package/lib/rules/no-floating-decimal.js +1 -0
  136. package/lib/rules/no-func-assign.js +1 -0
  137. package/lib/rules/no-global-assign.js +1 -0
  138. package/lib/rules/no-implicit-coercion.js +1 -0
  139. package/lib/rules/no-implicit-globals.js +1 -0
  140. package/lib/rules/no-implied-eval.js +1 -0
  141. package/lib/rules/no-import-assign.js +1 -0
  142. package/lib/rules/no-inline-comments.js +1 -0
  143. package/lib/rules/no-inner-declarations.js +27 -4
  144. package/lib/rules/no-invalid-regexp.js +1 -0
  145. package/lib/rules/no-invalid-this.js +5 -0
  146. package/lib/rules/no-irregular-whitespace.js +1 -0
  147. package/lib/rules/no-iterator.js +1 -0
  148. package/lib/rules/no-label-var.js +1 -0
  149. package/lib/rules/no-labels.js +1 -0
  150. package/lib/rules/no-lone-blocks.js +9 -2
  151. package/lib/rules/no-lonely-if.js +1 -0
  152. package/lib/rules/no-loop-func.js +1 -0
  153. package/lib/rules/no-loss-of-precision.js +1 -0
  154. package/lib/rules/no-magic-numbers.js +1 -0
  155. package/lib/rules/no-misleading-character-class.js +1 -0
  156. package/lib/rules/no-mixed-operators.js +1 -0
  157. package/lib/rules/no-mixed-requires.js +1 -0
  158. package/lib/rules/no-mixed-spaces-and-tabs.js +1 -0
  159. package/lib/rules/no-multi-assign.js +1 -0
  160. package/lib/rules/no-multi-spaces.js +1 -0
  161. package/lib/rules/no-multi-str.js +1 -0
  162. package/lib/rules/no-multiple-empty-lines.js +1 -0
  163. package/lib/rules/no-native-reassign.js +1 -0
  164. package/lib/rules/no-negated-condition.js +1 -0
  165. package/lib/rules/no-negated-in-lhs.js +1 -0
  166. package/lib/rules/no-nested-ternary.js +1 -0
  167. package/lib/rules/no-new-func.js +1 -0
  168. package/lib/rules/no-new-object.js +1 -0
  169. package/lib/rules/no-new-require.js +1 -0
  170. package/lib/rules/no-new-symbol.js +1 -0
  171. package/lib/rules/no-new-wrappers.js +1 -0
  172. package/lib/rules/no-new.js +1 -0
  173. package/lib/rules/no-nonoctal-decimal-escape.js +1 -0
  174. package/lib/rules/no-obj-calls.js +1 -0
  175. package/lib/rules/no-octal-escape.js +1 -0
  176. package/lib/rules/no-octal.js +1 -0
  177. package/lib/rules/no-param-reassign.js +1 -0
  178. package/lib/rules/no-path-concat.js +1 -0
  179. package/lib/rules/no-plusplus.js +1 -0
  180. package/lib/rules/no-process-env.js +1 -0
  181. package/lib/rules/no-process-exit.js +1 -0
  182. package/lib/rules/no-promise-executor-return.js +1 -0
  183. package/lib/rules/no-proto.js +1 -0
  184. package/lib/rules/no-prototype-builtins.js +1 -0
  185. package/lib/rules/no-redeclare.js +3 -0
  186. package/lib/rules/no-regex-spaces.js +1 -0
  187. package/lib/rules/no-restricted-exports.js +1 -0
  188. package/lib/rules/no-restricted-globals.js +1 -0
  189. package/lib/rules/no-restricted-imports.js +1 -0
  190. package/lib/rules/no-restricted-modules.js +1 -0
  191. package/lib/rules/no-restricted-properties.js +1 -0
  192. package/lib/rules/no-restricted-syntax.js +1 -0
  193. package/lib/rules/no-return-assign.js +1 -0
  194. package/lib/rules/no-return-await.js +1 -0
  195. package/lib/rules/no-script-url.js +1 -0
  196. package/lib/rules/no-self-assign.js +1 -0
  197. package/lib/rules/no-self-compare.js +1 -0
  198. package/lib/rules/no-sequences.js +1 -0
  199. package/lib/rules/no-setter-return.js +1 -0
  200. package/lib/rules/no-shadow-restricted-names.js +1 -0
  201. package/lib/rules/no-shadow.js +1 -0
  202. package/lib/rules/no-spaced-func.js +1 -0
  203. package/lib/rules/no-sparse-arrays.js +1 -0
  204. package/lib/rules/no-sync.js +1 -0
  205. package/lib/rules/no-tabs.js +1 -0
  206. package/lib/rules/no-template-curly-in-string.js +1 -0
  207. package/lib/rules/no-ternary.js +1 -0
  208. package/lib/rules/no-this-before-super.js +1 -0
  209. package/lib/rules/no-throw-literal.js +1 -0
  210. package/lib/rules/no-trailing-spaces.js +1 -0
  211. package/lib/rules/no-undef-init.js +1 -0
  212. package/lib/rules/no-undef.js +1 -0
  213. package/lib/rules/no-undefined.js +1 -0
  214. package/lib/rules/no-underscore-dangle.js +1 -0
  215. package/lib/rules/no-unexpected-multiline.js +1 -0
  216. package/lib/rules/no-unmodified-loop-condition.js +1 -0
  217. package/lib/rules/no-unneeded-ternary.js +1 -0
  218. package/lib/rules/no-unreachable-loop.js +1 -0
  219. package/lib/rules/no-unreachable.js +1 -0
  220. package/lib/rules/no-unsafe-finally.js +1 -0
  221. package/lib/rules/no-unsafe-negation.js +1 -0
  222. package/lib/rules/no-unsafe-optional-chaining.js +1 -0
  223. package/lib/rules/no-unused-expressions.js +7 -0
  224. package/lib/rules/no-unused-labels.js +1 -0
  225. package/lib/rules/no-unused-private-class-members.js +1 -0
  226. package/lib/rules/no-unused-vars.js +1 -0
  227. package/lib/rules/no-use-before-define.js +33 -9
  228. package/lib/rules/no-useless-backreference.js +1 -0
  229. package/lib/rules/no-useless-call.js +1 -0
  230. package/lib/rules/no-useless-catch.js +1 -0
  231. package/lib/rules/no-useless-computed-key.js +1 -0
  232. package/lib/rules/no-useless-concat.js +1 -0
  233. package/lib/rules/no-useless-constructor.js +1 -0
  234. package/lib/rules/no-useless-escape.js +1 -0
  235. package/lib/rules/no-useless-rename.js +1 -0
  236. package/lib/rules/no-useless-return.js +1 -0
  237. package/lib/rules/no-var.js +1 -0
  238. package/lib/rules/no-void.js +1 -0
  239. package/lib/rules/no-warning-comments.js +1 -0
  240. package/lib/rules/no-whitespace-before-property.js +1 -0
  241. package/lib/rules/no-with.js +1 -0
  242. package/lib/rules/nonblock-statement-body-position.js +1 -0
  243. package/lib/rules/object-curly-newline.js +1 -0
  244. package/lib/rules/object-curly-spacing.js +1 -0
  245. package/lib/rules/object-property-newline.js +1 -0
  246. package/lib/rules/object-shorthand.js +1 -0
  247. package/lib/rules/one-var-declaration-per-line.js +1 -0
  248. package/lib/rules/one-var.js +6 -1
  249. package/lib/rules/operator-assignment.js +1 -0
  250. package/lib/rules/operator-linebreak.js +1 -0
  251. package/lib/rules/padded-blocks.js +9 -0
  252. package/lib/rules/padding-line-between-statements.js +3 -0
  253. package/lib/rules/prefer-arrow-callback.js +1 -0
  254. package/lib/rules/prefer-const.js +2 -1
  255. package/lib/rules/prefer-destructuring.js +1 -0
  256. package/lib/rules/prefer-exponentiation-operator.js +1 -0
  257. package/lib/rules/prefer-named-capture-group.js +1 -0
  258. package/lib/rules/prefer-numeric-literals.js +1 -0
  259. package/lib/rules/prefer-object-has-own.js +112 -0
  260. package/lib/rules/prefer-object-spread.js +1 -0
  261. package/lib/rules/prefer-promise-reject-errors.js +1 -0
  262. package/lib/rules/prefer-reflect.js +1 -0
  263. package/lib/rules/prefer-regex-literals.js +218 -1
  264. package/lib/rules/prefer-rest-params.js +1 -0
  265. package/lib/rules/prefer-spread.js +1 -0
  266. package/lib/rules/prefer-template.js +2 -1
  267. package/lib/rules/quote-props.js +1 -0
  268. package/lib/rules/quotes.js +1 -0
  269. package/lib/rules/radix.js +1 -0
  270. package/lib/rules/require-atomic-updates.js +15 -2
  271. package/lib/rules/require-await.js +1 -0
  272. package/lib/rules/require-jsdoc.js +1 -0
  273. package/lib/rules/require-unicode-regexp.js +1 -0
  274. package/lib/rules/require-yield.js +1 -0
  275. package/lib/rules/rest-spread-spacing.js +1 -0
  276. package/lib/rules/semi-spacing.js +1 -0
  277. package/lib/rules/semi-style.js +9 -2
  278. package/lib/rules/semi.js +19 -9
  279. package/lib/rules/sort-imports.js +1 -0
  280. package/lib/rules/sort-keys.js +1 -0
  281. package/lib/rules/sort-vars.js +1 -0
  282. package/lib/rules/space-before-blocks.js +1 -0
  283. package/lib/rules/space-before-function-paren.js +1 -0
  284. package/lib/rules/space-in-parens.js +1 -0
  285. package/lib/rules/space-infix-ops.js +1 -0
  286. package/lib/rules/space-unary-ops.js +1 -0
  287. package/lib/rules/spaced-comment.js +1 -0
  288. package/lib/rules/strict.js +1 -0
  289. package/lib/rules/switch-colon-spacing.js +1 -0
  290. package/lib/rules/symbol-description.js +1 -0
  291. package/lib/rules/template-curly-spacing.js +1 -0
  292. package/lib/rules/template-tag-spacing.js +1 -0
  293. package/lib/rules/unicode-bom.js +1 -0
  294. package/lib/rules/use-isnan.js +1 -0
  295. package/lib/rules/utils/ast-utils.js +15 -3
  296. package/lib/rules/valid-jsdoc.js +1 -0
  297. package/lib/rules/valid-typeof.js +1 -0
  298. package/lib/rules/vars-on-top.js +26 -12
  299. package/lib/rules/wrap-iife.js +1 -0
  300. package/lib/rules/wrap-regex.js +1 -0
  301. package/lib/rules/yield-star-spacing.js +1 -0
  302. package/lib/rules/yoda.js +1 -0
  303. package/lib/shared/types.js +10 -0
  304. package/package.json +8 -8
package/README.md CHANGED
@@ -47,19 +47,19 @@ Prerequisites: [Node.js](https://nodejs.org/) (`^12.22.0`, `^14.17.0`, or `>=16.
47
47
 
48
48
  You can install ESLint using npm:
49
49
 
50
- ```
50
+ ```sh
51
51
  $ npm install eslint --save-dev
52
52
  ```
53
53
 
54
54
  You should then set up a configuration file:
55
55
 
56
- ```
56
+ ```sh
57
57
  $ ./node_modules/.bin/eslint --init
58
58
  ```
59
59
 
60
60
  After that, you can run ESLint on any file or directory like this:
61
61
 
62
- ```
62
+ ```sh
63
63
  $ ./node_modules/.bin/eslint yourfile.js
64
64
  ```
65
65
 
@@ -206,6 +206,7 @@ This means:
206
206
  These folks keep the project moving and are resources for help.
207
207
 
208
208
  <!-- NOTE: This section is autogenerated. Do not manually edit.-->
209
+
209
210
  <!--teamstart-->
210
211
 
211
212
  ### Technical Steering Committee (TSC)
@@ -229,7 +230,6 @@ Milos Djermanovic
229
230
  </a>
230
231
  </td></tr></tbody></table>
231
232
 
232
-
233
233
  ### Reviewers
234
234
 
235
235
  The people who review and implement new features.
@@ -246,9 +246,6 @@ Toru Nagashima
246
246
  </a>
247
247
  </td></tr></tbody></table>
248
248
 
249
-
250
-
251
-
252
249
  ### Committers
253
250
 
254
251
  The people who review and fix bugs and help triage issues.
@@ -285,7 +282,6 @@ Nitin Kumar
285
282
  </a>
286
283
  </td></tr></tbody></table>
287
284
 
288
-
289
285
  <!--teamend-->
290
286
 
291
287
  ## <a name="sponsors"></a>Sponsors
@@ -295,10 +291,10 @@ The following companies, organizations, and individuals support ESLint's ongoing
295
291
  <!-- NOTE: This section is autogenerated. Do not manually edit.-->
296
292
  <!--sponsorsstart-->
297
293
  <h3>Platinum Sponsors</h3>
298
- <p><a href="https://automattic.com"><img src="https://images.opencollective.com/photomatt/d0ef3e1/logo.png" alt="Automattic" height="undefined"></a></p><h3>Gold Sponsors</h3>
299
- <p><a href="https://nx.dev"><img src="https://images.opencollective.com/nx/0efbe42/logo.png" alt="Nx (by Nrwl)" height="96"></a> <a href="https://google.com/chrome"><img src="https://images.opencollective.com/chrome/dc55bd4/logo.png" alt="Chrome's Web Framework & Tools Performance Fund" height="96"></a> <a href="https://www.salesforce.com"><img src="https://images.opencollective.com/salesforce/ca8f997/logo.png" alt="Salesforce" height="96"></a> <a href="https://www.airbnb.com/"><img src="https://images.opencollective.com/airbnb/d327d66/logo.png" alt="Airbnb" height="96"></a> <a href="https://coinbase.com"><img src="https://avatars.githubusercontent.com/u/1885080?v=4" alt="Coinbase" height="96"></a> <a href="https://americanexpress.io"><img src="https://avatars.githubusercontent.com/u/3853301?v=4" alt="American Express" height="96"></a> <a href="https://substack.com/"><img src="https://avatars.githubusercontent.com/u/53023767?v=4" alt="Substack" height="96"></a></p><h3>Silver Sponsors</h3>
294
+ <p><a href="https://automattic.com"><img src="https://images.opencollective.com/automattic/d0ef3e1/logo.png" alt="Automattic" height="undefined"></a></p><h3>Gold Sponsors</h3>
295
+ <p><a href="https://contra.com"><img src="https://images.opencollective.com/contra1/c70f93f/logo.png" alt="Contra" height="96"></a> <a href="https://nx.dev"><img src="https://images.opencollective.com/nx/0efbe42/logo.png" alt="Nx (by Nrwl)" height="96"></a> <a href="https://google.com/chrome"><img src="https://images.opencollective.com/chrome/dc55bd4/logo.png" alt="Chrome's Web Framework & Tools Performance Fund" height="96"></a> <a href="https://www.salesforce.com"><img src="https://images.opencollective.com/salesforce/ca8f997/logo.png" alt="Salesforce" height="96"></a> <a href="https://www.airbnb.com/"><img src="https://images.opencollective.com/airbnb/d327d66/logo.png" alt="Airbnb" height="96"></a> <a href="https://coinbase.com"><img src="https://avatars.githubusercontent.com/u/1885080?v=4" alt="Coinbase" height="96"></a> <a href="https://americanexpress.io"><img src="https://avatars.githubusercontent.com/u/3853301?v=4" alt="American Express" height="96"></a> <a href="https://substack.com/"><img src="https://avatars.githubusercontent.com/u/53023767?v=4" alt="Substack" height="96"></a></p><h3>Silver Sponsors</h3>
300
296
  <p><a href="https://liftoff.io/"><img src="https://images.opencollective.com/liftoff/5c4fa84/logo.png" alt="Liftoff" height="64"></a></p><h3>Bronze Sponsors</h3>
301
- <p><a href="https://launchdarkly.com"><img src="https://images.opencollective.com/launchdarkly/574bb9e/logo.png" alt="launchdarkly" height="32"></a> <a href="https://troypoint.com"><img src="https://images.opencollective.com/troypoint/080f96f/avatar.png" alt="TROYPOINT" height="32"></a> <a href="https://www.crosswordsolver.org/anagram-solver/"><img src="https://images.opencollective.com/anagram-solver/2666271/logo.png" alt="Anagram Solver" height="32"></a> <a href="https://www.vpsserver.com"><img src="https://images.opencollective.com/vpsservercom/logo.png" alt="VPS Server" height="32"></a> <a href="https://icons8.com"><img src="https://images.opencollective.com/icons8/7fa1641/logo.png" alt="Icons8: free icons, photos, illustrations, and music" height="32"></a> <a href="https://discord.com"><img src="https://images.opencollective.com/discordapp/f9645d9/logo.png" alt="Discord" height="32"></a> <a href="https://themeisle.com"><img src="https://images.opencollective.com/themeisle/d5592fe/logo.png" alt="ThemeIsle" height="32"></a> <a href="https://www.firesticktricks.com"><img src="https://images.opencollective.com/fire-stick-tricks/b8fbe2c/logo.png" alt="Fire Stick Tricks" height="32"></a> <a href="https://www.practiceignition.com"><img src="https://avatars.githubusercontent.com/u/5753491?v=4" alt="Practice Ignition" height="32"></a></p>
297
+ <p><a href="https://sumatosoft.com/"><img src="https://images.opencollective.com/sumatosoft1/cab6013/logo.png" alt="SumatoSoft" height="32"></a> <a href="https://www.crosswordsolver.org/anagram-solver/"><img src="https://images.opencollective.com/anagram-solver/2666271/logo.png" alt="Anagram Solver" height="32"></a> <a href="https://www.vpsserver.com"><img src="https://images.opencollective.com/vpsservercom/logo.png" alt="VPS Server" height="32"></a> <a href="https://icons8.com"><img src="https://images.opencollective.com/icons8/7fa1641/logo.png" alt="Icons8: free icons, photos, illustrations, and music" height="32"></a> <a href="https://discord.com"><img src="https://images.opencollective.com/discordapp/f9645d9/logo.png" alt="Discord" height="32"></a> <a href="https://themeisle.com"><img src="https://images.opencollective.com/themeisle/d5592fe/logo.png" alt="ThemeIsle" height="32"></a> <a href="https://www.firesticktricks.com"><img src="https://images.opencollective.com/fire-stick-tricks/b8fbe2c/logo.png" alt="Fire Stick Tricks" height="32"></a> <a href="https://www.practiceignition.com"><img src="https://avatars.githubusercontent.com/u/5753491?v=4" alt="Practice Ignition" height="32"></a></p>
302
298
  <!--sponsorsend-->
303
299
 
304
300
  ## <a name="technology-sponsors"></a>Technology Sponsors
@@ -0,0 +1,144 @@
1
+ /**
2
+ * @fileoverview Globals for ecmaVersion/sourceType
3
+ * @author Nicholas C. Zakas
4
+ */
5
+
6
+ "use strict";
7
+
8
+ //-----------------------------------------------------------------------------
9
+ // Globals
10
+ //-----------------------------------------------------------------------------
11
+
12
+ const commonjs = {
13
+ exports: true,
14
+ global: false,
15
+ module: false,
16
+ require: false
17
+ };
18
+
19
+ const es3 = {
20
+ Array: false,
21
+ Boolean: false,
22
+ constructor: false,
23
+ Date: false,
24
+ decodeURI: false,
25
+ decodeURIComponent: false,
26
+ encodeURI: false,
27
+ encodeURIComponent: false,
28
+ Error: false,
29
+ escape: false,
30
+ eval: false,
31
+ EvalError: false,
32
+ Function: false,
33
+ hasOwnProperty: false,
34
+ Infinity: false,
35
+ isFinite: false,
36
+ isNaN: false,
37
+ isPrototypeOf: false,
38
+ Math: false,
39
+ NaN: false,
40
+ Number: false,
41
+ Object: false,
42
+ parseFloat: false,
43
+ parseInt: false,
44
+ propertyIsEnumerable: false,
45
+ RangeError: false,
46
+ ReferenceError: false,
47
+ RegExp: false,
48
+ String: false,
49
+ SyntaxError: false,
50
+ toLocaleString: false,
51
+ toString: false,
52
+ TypeError: false,
53
+ undefined: false,
54
+ unescape: false,
55
+ URIError: false,
56
+ valueOf: false
57
+ };
58
+
59
+ const es5 = {
60
+ ...es3,
61
+ JSON: false
62
+ };
63
+
64
+ const es2015 = {
65
+ ...es5,
66
+ ArrayBuffer: false,
67
+ DataView: false,
68
+ Float32Array: false,
69
+ Float64Array: false,
70
+ Int16Array: false,
71
+ Int32Array: false,
72
+ Int8Array: false,
73
+ Map: false,
74
+ Promise: false,
75
+ Proxy: false,
76
+ Reflect: false,
77
+ Set: false,
78
+ Symbol: false,
79
+ Uint16Array: false,
80
+ Uint32Array: false,
81
+ Uint8Array: false,
82
+ Uint8ClampedArray: false,
83
+ WeakMap: false,
84
+ WeakSet: false
85
+ };
86
+
87
+ // no new globals in ES2016
88
+ const es2016 = {
89
+ ...es2015
90
+ };
91
+
92
+ const es2017 = {
93
+ ...es2016,
94
+ Atomics: false,
95
+ SharedArrayBuffer: false
96
+ };
97
+
98
+ // no new globals in ES2018
99
+ const es2018 = {
100
+ ...es2017
101
+ };
102
+
103
+ // no new globals in ES2019
104
+ const es2019 = {
105
+ ...es2018
106
+ };
107
+
108
+ const es2020 = {
109
+ ...es2019,
110
+ BigInt: false,
111
+ BigInt64Array: false,
112
+ BigUint64Array: false,
113
+ globalThis: false
114
+ };
115
+
116
+ const es2021 = {
117
+ ...es2020,
118
+ AggregateError: false,
119
+ FinalizationRegistry: false,
120
+ WeakRef: false
121
+ };
122
+
123
+ const es2022 = {
124
+ ...es2021
125
+ };
126
+
127
+
128
+ //-----------------------------------------------------------------------------
129
+ // Exports
130
+ //-----------------------------------------------------------------------------
131
+
132
+ module.exports = {
133
+ commonjs,
134
+ es3,
135
+ es5,
136
+ es2015,
137
+ es2016,
138
+ es2017,
139
+ es2018,
140
+ es2019,
141
+ es2020,
142
+ es2021,
143
+ es2022
144
+ };
package/lib/cli.js CHANGED
@@ -178,7 +178,7 @@ async function printResults(engine, results, format, outputFile) {
178
178
  return false;
179
179
  }
180
180
 
181
- const output = formatter.format(results);
181
+ const output = await formatter.format(results);
182
182
 
183
183
  if (output) {
184
184
  if (outputFile) {
@@ -26,7 +26,7 @@ exports.defaultConfig = [
26
26
 
27
27
  /*
28
28
  * Because we try to delay loading rules until absolutely
29
- * necessary, a proxy allows us to hook into the lazy-loading
29
+ * necessary, a proxy allows us to hook into the lazy-loading
30
30
  * aspect of the rules map while still keeping all of the
31
31
  * relevant configuration inside of the config array.
32
32
  */
@@ -46,7 +46,16 @@ exports.defaultConfig = [
46
46
  ".git/**"
47
47
  ],
48
48
  languageOptions: {
49
- parser: "@/espree"
49
+ ecmaVersion: "latest",
50
+ sourceType: "module",
51
+ parser: "@/espree",
52
+ parserOptions: {}
53
+ }
54
+ },
55
+ {
56
+ files: ["**/*.cjs"],
57
+ languageOptions: {
58
+ sourceType: "commonjs"
50
59
  }
51
60
  }
52
61
  ];
@@ -52,13 +52,13 @@ class FlatConfigArray extends ConfigArray {
52
52
  * @param {{basePath: string, baseConfig: FlatConfig}} options The options
53
53
  * to use for the config array instance.
54
54
  */
55
- constructor(configs, { basePath, baseConfig = defaultConfig }) {
55
+ constructor(configs, { basePath, baseConfig = defaultConfig } = {}) {
56
56
  super(configs, {
57
57
  basePath,
58
58
  schema: flatConfigSchema
59
59
  });
60
60
 
61
- this.unshift(baseConfig);
61
+ this.unshift(...baseConfig);
62
62
  }
63
63
 
64
64
  /* eslint-disable class-methods-use-this -- Desired as instance method */
@@ -0,0 +1,67 @@
1
+ /**
2
+ * @fileoverview Shared functions to work with configs.
3
+ * @author Nicholas C. Zakas
4
+ */
5
+
6
+ "use strict";
7
+
8
+ //-----------------------------------------------------------------------------
9
+ // Functions
10
+ //-----------------------------------------------------------------------------
11
+
12
+ /**
13
+ * Parses a ruleId into its plugin and rule parts.
14
+ * @param {string} ruleId The rule ID to parse.
15
+ * @returns {{pluginName:string,ruleName:string}} The plugin and rule
16
+ * parts of the ruleId;
17
+ */
18
+ function parseRuleId(ruleId) {
19
+ let pluginName, ruleName;
20
+
21
+ // distinguish between core rules and plugin rules
22
+ if (ruleId.includes("/")) {
23
+ pluginName = ruleId.slice(0, ruleId.lastIndexOf("/"));
24
+ ruleName = ruleId.slice(pluginName.length + 1);
25
+ } else {
26
+ pluginName = "@";
27
+ ruleName = ruleId;
28
+ }
29
+
30
+ return {
31
+ pluginName,
32
+ ruleName
33
+ };
34
+ }
35
+
36
+ /**
37
+ * Retrieves a rule instance from a given config based on the ruleId.
38
+ * @param {string} ruleId The rule ID to look for.
39
+ * @param {FlatConfig} config The config to search.
40
+ * @returns {import("../shared/types").Rule|undefined} The rule if found
41
+ * or undefined if not.
42
+ */
43
+ function getRuleFromConfig(ruleId, config) {
44
+
45
+ const { pluginName, ruleName } = parseRuleId(ruleId);
46
+
47
+ const plugin = config.plugins && config.plugins[pluginName];
48
+ let rule = plugin && plugin.rules && plugin.rules[ruleName];
49
+
50
+ // normalize function rules into objects
51
+ if (rule && typeof rule === "function") {
52
+ rule = {
53
+ create: rule
54
+ };
55
+ }
56
+
57
+ return rule;
58
+ }
59
+
60
+ //-----------------------------------------------------------------------------
61
+ // Exports
62
+ //-----------------------------------------------------------------------------
63
+
64
+ module.exports = {
65
+ parseRuleId,
66
+ getRuleFromConfig
67
+ };
@@ -195,13 +195,6 @@ function assertIsObjectOrString(value) {
195
195
  // Low-Level Schemas
196
196
  //-----------------------------------------------------------------------------
197
197
 
198
-
199
- /** @type {ObjectPropertySchema} */
200
- const numberSchema = {
201
- merge: "replace",
202
- validate: "number"
203
- };
204
-
205
198
  /** @type {ObjectPropertySchema} */
206
199
  const booleanSchema = {
207
200
  merge: "replace",
@@ -415,6 +408,18 @@ const rulesSchema = {
415
408
  }
416
409
  };
417
410
 
411
+ /** @type {ObjectPropertySchema} */
412
+ const ecmaVersionSchema = {
413
+ merge: "replace",
414
+ validate(value) {
415
+ if (typeof value === "number" || value === "latest") {
416
+ return;
417
+ }
418
+
419
+ throw new TypeError("Expected a number or \"latest\".");
420
+ }
421
+ };
422
+
418
423
  /** @type {ObjectPropertySchema} */
419
424
  const sourceTypeSchema = {
420
425
  merge: "replace",
@@ -439,7 +444,7 @@ exports.flatConfigSchema = {
439
444
  },
440
445
  languageOptions: {
441
446
  schema: {
442
- ecmaVersion: numberSchema,
447
+ ecmaVersion: ecmaVersionSchema,
443
448
  sourceType: sourceTypeSchema,
444
449
  globals: globalsSchema,
445
450
  parser: parserSchema,
@@ -10,52 +10,49 @@
10
10
  //-----------------------------------------------------------------------------
11
11
 
12
12
  const ajv = require("../shared/ajv")();
13
+ const { parseRuleId, getRuleFromConfig } = require("./flat-config-helpers");
14
+ const ruleReplacements = require("../../conf/replacements.json");
13
15
 
14
16
  //-----------------------------------------------------------------------------
15
17
  // Helpers
16
18
  //-----------------------------------------------------------------------------
17
19
 
18
20
  /**
19
- * Finds a rule with the given ID in the given config.
20
- * @param {string} ruleId The ID of the rule to find.
21
+ * Throws a helpful error when a rule cannot be found.
22
+ * @param {Object} ruleId The rule identifier.
23
+ * @param {string} ruleId.pluginName The ID of the rule to find.
24
+ * @param {string} ruleId.ruleName The ID of the rule to find.
21
25
  * @param {Object} config The config to search in.
22
26
  * @throws {TypeError} For missing plugin or rule.
23
- * @returns {{create: Function, schema: (Array|null)}} THe rule object.
27
+ * @returns {void}
24
28
  */
25
- function findRuleDefinition(ruleId, config) {
26
- const ruleIdParts = ruleId.split("/");
27
- let pluginName, ruleName;
28
-
29
- // built-in rule
30
- if (ruleIdParts.length === 1) {
31
- pluginName = "@";
32
- ruleName = ruleIdParts[0];
33
- } else {
34
- ruleName = ruleIdParts.pop();
35
- pluginName = ruleIdParts.join("/");
36
- }
29
+ function throwRuleNotFoundError({ pluginName, ruleName }, config) {
30
+
31
+ const ruleId = pluginName === "@" ? ruleName : `${pluginName}/${ruleName}`;
37
32
 
38
33
  const errorMessageHeader = `Key "rules": Key "${ruleId}"`;
39
34
  let errorMessage = `${errorMessageHeader}: Could not find plugin "${pluginName}".`;
40
35
 
41
36
  // if the plugin exists then we need to check if the rule exists
42
37
  if (config.plugins && config.plugins[pluginName]) {
38
+ const replacementRuleName = ruleReplacements.rules[ruleName];
43
39
 
44
- const plugin = config.plugins[pluginName];
40
+ if (pluginName === "@" && replacementRuleName) {
45
41
 
46
- // first check for exact rule match
47
- if (plugin.rules && plugin.rules[ruleName]) {
48
- return config.plugins[pluginName].rules[ruleName];
49
- }
42
+ errorMessage = `${errorMessageHeader}: Rule "${ruleName}" was removed and replaced by "${replacementRuleName}".`;
43
+
44
+ } else {
50
45
 
51
- errorMessage = `${errorMessageHeader}: Could not find "${ruleName}" in plugin "${pluginName}".`;
46
+ errorMessage = `${errorMessageHeader}: Could not find "${ruleName}" in plugin "${pluginName}".`;
52
47
 
53
- // otherwise, let's see if we can find the rule name elsewhere
54
- for (const [otherPluginName, otherPlugin] of Object.entries(config.plugins)) {
55
- if (otherPlugin.rules && otherPlugin.rules[ruleName]) {
56
- errorMessage += ` Did you mean "${otherPluginName}/${ruleName}"?`;
57
- break;
48
+ // otherwise, let's see if we can find the rule name elsewhere
49
+ for (const [otherPluginName, otherPlugin] of Object.entries(config.plugins)) {
50
+ if (otherPlugin.rules && otherPlugin.rules[ruleName]) {
51
+ errorMessage += ` Did you mean "${otherPluginName}/${ruleName}"?`;
52
+ break;
53
+ }
58
54
  }
55
+
59
56
  }
60
57
 
61
58
  // falls through to throw error
@@ -154,7 +151,11 @@ class RuleValidator {
154
151
  continue;
155
152
  }
156
153
 
157
- const rule = findRuleDefinition(ruleId, config);
154
+ const rule = getRuleFromConfig(ruleId, config);
155
+
156
+ if (!rule) {
157
+ throwRuleNotFoundError(parseRuleId(ruleId), config);
158
+ }
158
159
 
159
160
  // Precompile and cache validator the first time
160
161
  if (!this.validators.has(rule)) {
@@ -34,7 +34,12 @@ const { version } = require("../../package.json");
34
34
  /** @typedef {import("../shared/types").LintMessage} LintMessage */
35
35
  /** @typedef {import("../shared/types").Plugin} Plugin */
36
36
  /** @typedef {import("../shared/types").Rule} Rule */
37
- /** @typedef {import("./load-formatter").Formatter} Formatter */
37
+
38
+ /**
39
+ * The main formatter object.
40
+ * @typedef Formatter
41
+ * @property {function(LintResult[]): string | Promise<string>} format format function.
42
+ */
38
43
 
39
44
  /**
40
45
  * The options with which to configure the ESLint instance.
@@ -617,7 +622,7 @@ class ESLint {
617
622
  throw new Error("'name' must be a string");
618
623
  }
619
624
 
620
- const { cliEngine } = privateMembersMap.get(this);
625
+ const { cliEngine, options } = privateMembersMap.get(this);
621
626
  const formatter = cliEngine.getFormatter(name);
622
627
 
623
628
  if (typeof formatter !== "function") {
@@ -629,7 +634,7 @@ class ESLint {
629
634
  /**
630
635
  * The main formatter method.
631
636
  * @param {LintResults[]} results The lint results to format.
632
- * @returns {string} The formatted lint results.
637
+ * @returns {string | Promise<string>} The formatted lint results.
633
638
  */
634
639
  format(results) {
635
640
  let rulesMeta = null;
@@ -637,6 +642,9 @@ class ESLint {
637
642
  results.sort(compareResultsByFilePath);
638
643
 
639
644
  return formatter(results, {
645
+ get cwd() {
646
+ return options.cwd;
647
+ },
640
648
  get rulesMeta() {
641
649
  if (!rulesMeta) {
642
650
  rulesMeta = createRulesMeta(cliEngine.getRules());
@@ -461,6 +461,10 @@ function processCodePathToEnter(analyzer, node) {
461
461
  startCodePath("function");
462
462
  break;
463
463
 
464
+ case "StaticBlock":
465
+ startCodePath("class-static-block");
466
+ break;
467
+
464
468
  case "ChainExpression":
465
469
  state.pushChainContext();
466
470
  break;
@@ -706,7 +710,8 @@ function postprocess(analyzer, node) {
706
710
  case "Program":
707
711
  case "FunctionDeclaration":
708
712
  case "FunctionExpression":
709
- case "ArrowFunctionExpression": {
713
+ case "ArrowFunctionExpression":
714
+ case "StaticBlock": {
710
715
  endCodePath();
711
716
  break;
712
717
  }
@@ -40,7 +40,7 @@ class CodePath {
40
40
 
41
41
  /**
42
42
  * The reason that this code path was started. May be "program",
43
- * "function", or "class-field-initializer".
43
+ * "function", "class-field-initializer", or "class-static-block".
44
44
  * @type {string}
45
45
  */
46
46
  this.origin = origin;