eslint-plugin-unicorn 67.0.0 → 69.0.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 (192) hide show
  1. package/index.js +4 -0
  2. package/package.json +8 -3
  3. package/readme.md +165 -16
  4. package/rules/ast/is-empty-node.js +1 -5
  5. package/rules/ast/is-empty-object-expression.js +2 -2
  6. package/rules/better-dom-traversing.js +17 -8
  7. package/rules/class-reference-in-static-methods.js +14 -2
  8. package/rules/comment-content.js +136 -18
  9. package/rules/consistent-assert.js +1 -1
  10. package/rules/consistent-boolean-name.js +44 -5
  11. package/rules/consistent-compound-words.js +7 -5
  12. package/rules/consistent-conditional-object-spread.js +360 -0
  13. package/rules/consistent-destructuring.js +5 -0
  14. package/rules/consistent-existence-index-check.js +1 -1
  15. package/rules/consistent-json-file-read.js +4 -16
  16. package/rules/consistent-optional-chaining.js +3 -20
  17. package/rules/consistent-tuple-labels.js +49 -0
  18. package/rules/custom-error-definition.js +26 -7
  19. package/rules/default-export-style.js +569 -0
  20. package/rules/expiring-todo-comments.js +1 -1
  21. package/rules/explicit-length-check.js +7 -32
  22. package/rules/import-style.js +8 -6
  23. package/rules/index.js +50 -1
  24. package/rules/logical-assignment-operators.js +17 -4
  25. package/rules/{prevent-abbreviations.js → name-replacements.js} +11 -9
  26. package/rules/new-for-builtins.js +39 -5
  27. package/rules/no-accessor-recursion.js +7 -0
  28. package/rules/no-accidental-bitwise-operator.js +97 -0
  29. package/rules/no-array-callback-reference.js +1 -7
  30. package/rules/no-array-concat-in-loop.js +45 -0
  31. package/rules/no-array-front-mutation.js +64 -0
  32. package/rules/no-array-sort-for-min-max.js +225 -0
  33. package/rules/no-array-splice.js +78 -64
  34. package/rules/no-boolean-sort-comparator.js +215 -0
  35. package/rules/no-break-in-nested-loop.js +33 -0
  36. package/rules/no-chained-comparison.js +116 -0
  37. package/rules/no-collection-bracket-access.js +165 -0
  38. package/rules/no-computed-property-existence-check.js +6 -0
  39. package/rules/no-confusing-array-splice.js +2 -21
  40. package/rules/no-confusing-array-with.js +2 -20
  41. package/rules/no-constant-zero-expression.js +91 -0
  42. package/rules/no-declarations-before-early-exit.js +29 -36
  43. package/rules/no-double-comparison.js +117 -0
  44. package/rules/no-duplicate-if-branches.js +143 -0
  45. package/rules/no-duplicate-logical-operands.js +151 -0
  46. package/rules/no-for-each.js +11 -12
  47. package/rules/no-for-loop.js +3 -15
  48. package/rules/no-impossible-length-comparison.js +166 -0
  49. package/rules/no-incorrect-query-selector.js +8 -4
  50. package/rules/no-incorrect-template-string-interpolation.js +106 -43
  51. package/rules/no-instanceof-builtins.js +73 -14
  52. package/rules/no-invalid-argument-count.js +110 -54
  53. package/rules/no-invalid-character-comparison.js +121 -0
  54. package/rules/no-invalid-fetch-options.js +3 -1
  55. package/rules/no-invalid-well-known-symbol-methods.js +205 -0
  56. package/rules/no-keyword-prefix.js +14 -4
  57. package/rules/no-late-current-target-access.js +13 -107
  58. package/rules/no-late-event-control.js +127 -0
  59. package/rules/no-loop-iterable-mutation.js +541 -0
  60. package/rules/no-manually-wrapped-comments.js +10 -2
  61. package/rules/no-misrefactored-assignment.js +102 -0
  62. package/rules/no-named-default.js +35 -2
  63. package/rules/no-nonstandard-builtin-properties.js +1383 -0
  64. package/rules/no-object-methods-with-collections.js +4 -289
  65. package/rules/no-process-exit.js +16 -12
  66. package/rules/no-redundant-comparison.js +5 -12
  67. package/rules/no-return-array-push.js +20 -5
  68. package/rules/no-selector-as-dom-name.js +150 -0
  69. package/rules/no-thenable.js +27 -11
  70. package/rules/no-top-level-side-effects.js +8 -1
  71. package/rules/no-uncalled-method.js +2 -8
  72. package/rules/no-undeclared-class-members.js +8 -6
  73. package/rules/no-unnecessary-boolean-comparison.js +131 -0
  74. package/rules/no-unnecessary-global-this.js +36 -1
  75. package/rules/no-unnecessary-splice.js +15 -20
  76. package/rules/no-unreadable-for-of-expression.js +2 -1
  77. package/rules/no-unreadable-object-destructuring.js +15 -0
  78. package/rules/no-unsafe-property-key.js +10 -15
  79. package/rules/no-unsafe-string-replacement.js +31 -0
  80. package/rules/no-unused-array-method-return.js +11 -2
  81. package/rules/no-unused-properties.js +4 -3
  82. package/rules/no-useless-boolean-cast.js +58 -1
  83. package/rules/no-useless-coercion.js +71 -15
  84. package/rules/no-useless-compound-assignment.js +110 -0
  85. package/rules/no-useless-concat.js +27 -3
  86. package/rules/no-useless-delete-check.js +353 -0
  87. package/rules/no-useless-else.js +27 -62
  88. package/rules/no-useless-error-capture-stack-trace.js +1 -1
  89. package/rules/no-useless-fallback-in-spread.js +7 -118
  90. package/rules/no-useless-iterator-to-array.js +165 -115
  91. package/rules/no-useless-logical-operand.js +248 -0
  92. package/rules/no-useless-undefined.js +11 -28
  93. package/rules/no-xor-as-exponentiation.js +59 -0
  94. package/rules/prefer-abort-signal-timeout.js +395 -0
  95. package/rules/prefer-aggregate-error.js +478 -0
  96. package/rules/prefer-array-find.js +95 -5
  97. package/rules/prefer-array-flat-map.js +9 -21
  98. package/rules/prefer-array-flat.js +1 -24
  99. package/rules/prefer-array-from-async.js +273 -0
  100. package/rules/prefer-array-iterable-methods.js +157 -0
  101. package/rules/prefer-array-some.js +56 -31
  102. package/rules/prefer-at.js +6 -30
  103. package/rules/prefer-await.js +29 -0
  104. package/rules/prefer-boolean-return.js +224 -0
  105. package/rules/prefer-code-point.js +58 -8
  106. package/rules/prefer-continue.js +377 -0
  107. package/rules/prefer-default-parameters.js +10 -6
  108. package/rules/prefer-dispose.js +1 -5
  109. package/rules/prefer-dom-node-replace-children.js +353 -0
  110. package/rules/prefer-early-return.js +160 -30
  111. package/rules/prefer-else-if.js +50 -53
  112. package/rules/prefer-error-is-error.js +181 -0
  113. package/rules/prefer-event-target.js +3 -13
  114. package/rules/prefer-flat-math-min-max.js +103 -0
  115. package/rules/prefer-global-this.js +1 -1
  116. package/rules/prefer-has-check.js +1 -4
  117. package/rules/prefer-hoisting-branch-code.js +424 -0
  118. package/rules/prefer-identifier-import-export-specifiers.js +6 -11
  119. package/rules/prefer-includes-over-repeated-comparisons.js +5 -1
  120. package/rules/prefer-includes.js +6 -0
  121. package/rules/prefer-iterator-concat.js +21 -1
  122. package/rules/prefer-logical-operator-over-ternary.js +12 -20
  123. package/rules/prefer-math-constants.js +103 -0
  124. package/rules/prefer-math-min-max.js +1 -5
  125. package/rules/prefer-minimal-ternary.js +41 -13
  126. package/rules/prefer-modern-dom-apis.js +1 -45
  127. package/rules/prefer-node-protocol.js +1 -0
  128. package/rules/prefer-number-properties.js +2 -5
  129. package/rules/prefer-object-from-entries.js +6 -1
  130. package/rules/prefer-object-iterable-methods.js +36 -11
  131. package/rules/prefer-observer-apis.js +498 -0
  132. package/rules/prefer-optional-catch-binding.js +30 -24
  133. package/rules/prefer-private-class-fields.js +2 -8
  134. package/rules/prefer-promise-try.js +238 -0
  135. package/rules/prefer-promise-with-resolvers.js +248 -0
  136. package/rules/prefer-query-selector.js +79 -17
  137. package/rules/prefer-queue-microtask.js +7 -9
  138. package/rules/prefer-regexp-escape.js +263 -0
  139. package/rules/prefer-set-methods.js +337 -0
  140. package/rules/prefer-set-size.js +10 -2
  141. package/rules/prefer-short-arrow-method.js +3 -3
  142. package/rules/prefer-single-replace.js +218 -0
  143. package/rules/prefer-spread.js +14 -21
  144. package/rules/prefer-string-replace-all.js +5 -0
  145. package/rules/prefer-structured-clone.js +2 -2
  146. package/rules/prefer-switch.js +1 -0
  147. package/rules/prefer-ternary.js +4 -2
  148. package/rules/prefer-toggle-attribute.js +293 -0
  149. package/rules/prefer-type-literal-last.js +22 -54
  150. package/rules/prefer-unary-minus.js +103 -0
  151. package/rules/prefer-url-can-parse.js +308 -0
  152. package/rules/prefer-url-search-parameters.js +411 -0
  153. package/rules/prefer-while-loop-condition.js +252 -0
  154. package/rules/require-passive-events.js +11 -4
  155. package/rules/require-proxy-trap-boolean-return.js +40 -126
  156. package/rules/rule/to-eslint-listener.js +5 -3
  157. package/rules/shared/array-concat-in-loop.js +151 -0
  158. package/rules/shared/identifier-checks.js +4 -16
  159. package/rules/shared/late-event-handler.js +82 -0
  160. package/rules/shared/{abbreviations.js → name-replacements.js} +63 -0
  161. package/rules/shared/no-array-mutate-rule.js +19 -2
  162. package/rules/shared/regexp-escape.js +81 -0
  163. package/rules/shared/splice-replacements.js +1 -18
  164. package/rules/string-content.js +11 -4
  165. package/rules/template-indent.js +2 -8
  166. package/rules/throw-new-error.js +7 -0
  167. package/rules/utils/block-scope.js +42 -0
  168. package/rules/utils/builtin-collection-type.js +267 -0
  169. package/rules/utils/builtins.js +50 -1
  170. package/rules/utils/comments.js +16 -0
  171. package/rules/utils/comparison.js +17 -0
  172. package/rules/utils/contains-suspension-point.js +35 -0
  173. package/rules/utils/get-const-variable-initializer.js +31 -0
  174. package/rules/utils/global-reference-tracker.js +14 -1
  175. package/rules/utils/has-optional-chain-element.js +36 -4
  176. package/rules/utils/index.js +38 -2
  177. package/rules/utils/is-boolean.js +26 -1
  178. package/rules/utils/is-event.js +127 -0
  179. package/rules/utils/is-function-self-used-inside.js +1 -5
  180. package/rules/utils/is-weak-map.js +21 -0
  181. package/rules/utils/is-weak-set.js +21 -0
  182. package/rules/utils/length-or-size.js +53 -0
  183. package/rules/utils/member-expression.js +18 -0
  184. package/rules/utils/needs-semicolon.js +1 -5
  185. package/rules/utils/numeric.js +20 -0
  186. package/rules/utils/should-add-parentheses-to-logical-expression-child.js +8 -14
  187. package/rules/utils/should-add-parentheses-to-member-expression-object.js +1 -5
  188. package/rules/utils/should-add-parentheses-to-unary-expression.js +8 -2
  189. package/rules/utils/should-report-replace-children-receiver.js +210 -0
  190. package/rules/utils/track-branch-exits.js +79 -0
  191. package/rules/utils/type-helpers.js +166 -8
  192. package/rules/utils/types.js +22 -0
package/index.js CHANGED
@@ -28,6 +28,10 @@ const deprecatedRules = createDeprecatedRules({
28
28
  message: 'Replaced by `unicorn/prefer-single-call` which covers more cases.',
29
29
  replacedBy: ['unicorn/prefer-single-call'],
30
30
  },
31
+ 'prevent-abbreviations': {
32
+ message: 'Renamed to `unicorn/name-replacements`.',
33
+ replacedBy: ['unicorn/name-replacements'],
34
+ },
31
35
  'prefer-json-parse-buffer': {
32
36
  message: 'Renamed to `unicorn/consistent-json-file-read`.',
33
37
  replacedBy: ['unicorn/consistent-json-file-read'],
package/package.json CHANGED
@@ -1,9 +1,12 @@
1
1
  {
2
2
  "name": "eslint-plugin-unicorn",
3
- "version": "67.0.0",
4
- "description": "More than 200 powerful ESLint rules",
3
+ "version": "69.0.0",
4
+ "description": "More than 300 powerful ESLint rules",
5
5
  "license": "MIT",
6
- "repository": "sindresorhus/eslint-plugin-unicorn",
6
+ "repository": {
7
+ "type": "git",
8
+ "url": "git+https://github.com/sindresorhus/eslint-plugin-unicorn.git"
9
+ },
7
10
  "funding": "https://github.com/sindresorhus/eslint-plugin-unicorn?sponsor=1",
8
11
  "author": {
9
12
  "name": "Sindre Sorhus",
@@ -110,6 +113,8 @@
110
113
  "open-editor": "^6.0.0",
111
114
  "outdent": "^0.8.0",
112
115
  "pretty-ms": "^9.3.0",
116
+ "svelte": "^5.56.3",
117
+ "svelte-eslint-parser": "^1.8.0",
113
118
  "typescript": "^6.0.3",
114
119
  "vue-eslint-parser": "^10.4.1",
115
120
  "yaml": "^2.9.0"
package/readme.md CHANGED
@@ -3,13 +3,13 @@
3
3
  <!-- markdownlint-disable-next-line no-inline-html -->
4
4
  <img src="https://cloud.githubusercontent.com/assets/170270/18659176/1cc373d0-7f33-11e6-890f-0ba35362ee7e.jpg" width="180" align="right" alt="Unicorn">
5
5
 
6
- > More than 200 powerful ESLint rules
7
-
8
- You might want to check out [XO](https://github.com/xojs/xo), which includes this plugin.
6
+ > More than 300 powerful ESLint rules
9
7
 
10
8
  Most rules target JavaScript and TypeScript, but [some also lint CSS, HTML, JSON, and Markdown](#non-javascript-files) when used with the matching ESLint language plugin.
11
9
 
12
- [**Propose or contribute a new rule ➡**](.github/contributing.md)
10
+ [**Propose a new rule ➡**](.github/contributing.md)
11
+
12
+ *We do not accept pull requests because of too much AI slop.*
13
13
 
14
14
  ## Install
15
15
 
@@ -19,6 +19,8 @@ npm install --save-dev eslint eslint-plugin-unicorn
19
19
 
20
20
  **Requires ESLint `>=10.4`, [flat config](https://eslint.org/docs/latest/use/configure/configuration-files), and [ESM](https://gist.github.com/sindresorhus/a39789f98801d908bbc7ff3ecc99d99c#how-can-i-make-my-typescript-project-output-esm).**
21
21
 
22
+ *You might want to check out [XO](https://github.com/xojs/xo), which includes this plugin.*
23
+
22
24
  ## Usage
23
25
 
24
26
  Use a [preset config](#preset-configs) or configure each rule in `eslint.config.js`.
@@ -26,17 +28,45 @@ Use a [preset config](#preset-configs) or configure each rule in `eslint.config.
26
28
  If you don't use a preset, set the same `languageOptions` as shown below.
27
29
 
28
30
  ```js
29
- import eslintPluginUnicorn from 'eslint-plugin-unicorn';
31
+ import unicorn from 'eslint-plugin-unicorn';
32
+ import {defineConfig} from 'eslint/config';
33
+ import globals from 'globals';
34
+
35
+ export default defineConfig([
36
+ {
37
+ files: ['**/*.js'],
38
+ languageOptions: {
39
+ globals: globals.builtin,
40
+ },
41
+ plugins: {
42
+ unicorn,
43
+ },
44
+ rules: {
45
+ 'unicorn/prefer-module': 'error',
46
+ 'unicorn/…': 'error',
47
+ },
48
+ },
49
+ // …
50
+ ]);
51
+ ```
52
+
53
+ For TypeScript, scope Unicorn to TypeScript files and configure a TypeScript parser for the same config object:
54
+
55
+ ```js
56
+ import typescriptEslintParser from '@typescript-eslint/parser';
57
+ import unicorn from 'eslint-plugin-unicorn';
30
58
  import {defineConfig} from 'eslint/config';
31
59
  import globals from 'globals';
32
60
 
33
61
  export default defineConfig([
34
62
  {
63
+ files: ['**/*.ts'],
35
64
  languageOptions: {
36
65
  globals: globals.builtin,
66
+ parser: typescriptEslintParser,
37
67
  },
38
68
  plugins: {
39
- unicorn: eslintPluginUnicorn,
69
+ unicorn,
40
70
  },
41
71
  rules: {
42
72
  'unicorn/prefer-module': 'error',
@@ -69,6 +99,7 @@ export default defineConfig([
69
99
  | [consistent-boolean-name](docs/rules/consistent-boolean-name.md) | Enforce consistent naming for boolean names. | ✅ | 🔧 | 💡 | |
70
100
  | [consistent-class-member-order](docs/rules/consistent-class-member-order.md) | Enforce consistent class member order. | ✅ | | 💡 | |
71
101
  | [consistent-compound-words](docs/rules/consistent-compound-words.md) | Enforce consistent spelling of compound words in identifiers. | ✅ ☑️ | | 💡 | |
102
+ | [consistent-conditional-object-spread](docs/rules/consistent-conditional-object-spread.md) | Enforce consistent conditional object spread style. | ✅ | 🔧 | | |
72
103
  | [consistent-date-clone](docs/rules/consistent-date-clone.md) | Prefer passing `Date` directly to the constructor when cloning. | ✅ ☑️ | 🔧 | | |
73
104
  | [consistent-destructuring](docs/rules/consistent-destructuring.md) | Use destructured variables over properties. | | | 💡 | |
74
105
  | [consistent-empty-array-spread](docs/rules/consistent-empty-array-spread.md) | Prefer consistent types when spreading a ternary in an array literal. | ✅ | 🔧 | | |
@@ -79,7 +110,9 @@ export default defineConfig([
79
110
  | [consistent-json-file-read](docs/rules/consistent-json-file-read.md) | Enforce consistent JSON file reads before `JSON.parse()`. | ✅ | 🔧 | | |
80
111
  | [consistent-optional-chaining](docs/rules/consistent-optional-chaining.md) | Enforce consistent optional chaining for same-base member access. | ✅ ☑️ | | 💡 | |
81
112
  | [consistent-template-literal-escape](docs/rules/consistent-template-literal-escape.md) | Enforce consistent style for escaping `${` in template literals. | ✅ | 🔧 | | |
113
+ | [consistent-tuple-labels](docs/rules/consistent-tuple-labels.md) | Enforce consistent labels on tuple type elements. | ✅ | | | |
82
114
  | [custom-error-definition](docs/rules/custom-error-definition.md) | Enforce correct `Error` subclassing. | | 🔧 | | |
115
+ | [default-export-style](docs/rules/default-export-style.md) | Enforce consistent default export declarations. | ✅ | 🔧 | 💡 | |
83
116
  | [dom-node-dataset](docs/rules/dom-node-dataset.md) | Enforce consistent style for DOM element dataset access. | ✅ ☑️ | 🔧 | | |
84
117
  | [empty-brace-spaces](docs/rules/empty-brace-spaces.md) | Enforce no spaces between braces. | ✅ | 🔧 | | |
85
118
  | [error-message](docs/rules/error-message.md) | Enforce passing a `message` value when creating a built-in error. | ✅ ☑️ | | | |
@@ -93,30 +126,42 @@ export default defineConfig([
93
126
  | [isolated-functions](docs/rules/isolated-functions.md) | Prevent usage of variables from outside the scope of isolated functions. | ✅ | | | |
94
127
  | [logical-assignment-operators](docs/rules/logical-assignment-operators.md) | Require or disallow logical assignment operator shorthand | ✅ | 🔧 | 💡 | |
95
128
  | [max-nested-calls](docs/rules/max-nested-calls.md) | Limit the depth of nested calls. | ✅ | | | |
96
- | [new-for-builtins](docs/rules/new-for-builtins.md) | Enforce the use of `new` for all builtins, except `String`, `Number`, `Boolean`, `Symbol` and `BigInt`. | ✅ ☑️ | 🔧 | 💡 | |
129
+ | [name-replacements](docs/rules/name-replacements.md) | Enforce replacements for variable, property, and filenames. | ✅ | 🔧 | 💡 | |
130
+ | [new-for-builtins](docs/rules/new-for-builtins.md) | Enforce correct use of `new` for builtin constructors. | ✅ ☑️ | 🔧 | 💡 | |
97
131
  | [no-abusive-eslint-disable](docs/rules/no-abusive-eslint-disable.md) | Enforce specifying rules to disable in `eslint-disable` comments. | ✅ ☑️ | | | |
98
132
  | [no-accessor-recursion](docs/rules/no-accessor-recursion.md) | Disallow recursive access to `this` within getters and setters. | ✅ ☑️ | | | |
133
+ | [no-accidental-bitwise-operator](docs/rules/no-accidental-bitwise-operator.md) | Disallow bitwise operators where a logical operator was likely intended. | ✅ ☑️ | | 💡 | |
99
134
  | [no-anonymous-default-export](docs/rules/no-anonymous-default-export.md) | Disallow anonymous functions and classes as the default export. | ✅ ☑️ | | 💡 | |
100
135
  | [no-array-callback-reference](docs/rules/no-array-callback-reference.md) | Prevent passing a function reference directly to iterator methods. | ✅ | | 💡 | |
136
+ | [no-array-concat-in-loop](docs/rules/no-array-concat-in-loop.md) | Disallow array accumulation with `Array#concat()` in loops. | ✅ | | | |
101
137
  | [no-array-fill-with-reference-type](docs/rules/no-array-fill-with-reference-type.md) | Disallow using reference values as `Array#fill()` values. | ✅ ☑️ | | | |
102
138
  | [no-array-from-fill](docs/rules/no-array-from-fill.md) | Disallow `.fill()` after `Array.from({length: …})`. | ✅ ☑️ | | | |
139
+ | [no-array-front-mutation](docs/rules/no-array-front-mutation.md) | Disallow front-of-array mutation. | | | | |
103
140
  | [no-array-method-this-argument](docs/rules/no-array-method-this-argument.md) | Disallow using the `this` argument in array methods. | ✅ ☑️ | 🔧 | 💡 | |
104
141
  | [no-array-reduce](docs/rules/no-array-reduce.md) | Disallow `Array#reduce()` and `Array#reduceRight()`. | ✅ | 🔧 | 💡 | |
105
142
  | [no-array-reverse](docs/rules/no-array-reverse.md) | Prefer `Array#toReversed()` over `Array#reverse()`. | ✅ ☑️ | | 💡 | |
106
143
  | [no-array-sort](docs/rules/no-array-sort.md) | Prefer `Array#toSorted()` over `Array#sort()`. | ✅ ☑️ | | 💡 | |
144
+ | [no-array-sort-for-min-max](docs/rules/no-array-sort-for-min-max.md) | Disallow sorting arrays to get the minimum or maximum value. | ✅ ☑️ | | 💡 | |
107
145
  | [no-array-splice](docs/rules/no-array-splice.md) | Prefer `Array#toSpliced()` over `Array#splice()`. | ✅ | | 💡 | |
108
146
  | [no-asterisk-prefix-in-documentation-comments](docs/rules/no-asterisk-prefix-in-documentation-comments.md) | Disallow asterisk prefixes in documentation comments. | | 🔧 | | |
109
147
  | [no-await-expression-member](docs/rules/no-await-expression-member.md) | Disallow member access from await expression. | ✅ | 🔧 | | |
110
148
  | [no-await-in-promise-methods](docs/rules/no-await-in-promise-methods.md) | Disallow using `await` in `Promise` method parameters. | ✅ ☑️ | | 💡 | |
111
149
  | [no-blob-to-file](docs/rules/no-blob-to-file.md) | Disallow unnecessary `Blob` to `File` conversion. | ✅ ☑️ | | 💡 | |
150
+ | [no-boolean-sort-comparator](docs/rules/no-boolean-sort-comparator.md) | Disallow boolean-returning sort comparators. | ✅ ☑️ | | 💡 | |
112
151
  | [no-break-in-nested-loop](docs/rules/no-break-in-nested-loop.md) | Disallow `break` and `continue` in nested loops and switches inside loops. | ✅ | | | |
113
152
  | [no-canvas-to-image](docs/rules/no-canvas-to-image.md) | Prefer drawing canvases directly instead of converting them to images. | ✅ ☑️ | | | |
153
+ | [no-chained-comparison](docs/rules/no-chained-comparison.md) | Disallow chained comparisons such as `a < b < c`. | ✅ ☑️ | | 💡 | |
154
+ | [no-collection-bracket-access](docs/rules/no-collection-bracket-access.md) | Disallow accessing `Map`, `Set`, `WeakMap`, and `WeakSet` entries with bracket notation. | ✅ ☑️ | | 💡 | |
114
155
  | [no-computed-property-existence-check](docs/rules/no-computed-property-existence-check.md) | Disallow dynamic object property existence checks. | ✅ | | 💡 | |
115
156
  | [no-confusing-array-splice](docs/rules/no-confusing-array-splice.md) | Disallow confusing uses of `Array#{splice,toSpliced}()`. | ✅ | | 💡 | |
116
157
  | [no-confusing-array-with](docs/rules/no-confusing-array-with.md) | Disallow confusing uses of `Array#with()`. | ✅ | | | |
117
158
  | [no-console-spaces](docs/rules/no-console-spaces.md) | Do not use leading/trailing space between `console.log` parameters. | ✅ ☑️ | 🔧 | | |
159
+ | [no-constant-zero-expression](docs/rules/no-constant-zero-expression.md) | Disallow arithmetic and bitwise operations that always evaluate to `0`. | ✅ ☑️ | | 💡 | |
118
160
  | [no-declarations-before-early-exit](docs/rules/no-declarations-before-early-exit.md) | Disallow declarations before conditional early exits when they are only used after the exit. | ✅ ☑️ | 🔧 | | |
119
161
  | [no-document-cookie](docs/rules/no-document-cookie.md) | Do not use `document.cookie` directly. | ✅ ☑️ | | | |
162
+ | [no-double-comparison](docs/rules/no-double-comparison.md) | Disallow two comparisons of the same operands that can be combined into one. | ✅ ☑️ | | 💡 | |
163
+ | [no-duplicate-if-branches](docs/rules/no-duplicate-if-branches.md) | Disallow duplicate adjacent branches in if chains. | ✅ | | | |
164
+ | [no-duplicate-logical-operands](docs/rules/no-duplicate-logical-operands.md) | Disallow adjacent duplicate operands in logical expressions. | ✅ ☑️ | 🔧 | 💡 | |
120
165
  | [no-duplicate-loops](docs/rules/no-duplicate-loops.md) | Disallow `.map()` and `.filter()` in `for…of` and `for await…of` loop headers. | ✅ | | | |
121
166
  | [no-duplicate-set-values](docs/rules/no-duplicate-set-values.md) | Disallow duplicate values in `Set` constructor array literals. | ✅ | | | |
122
167
  | [no-empty-file](docs/rules/no-empty-file.md) | Disallow empty files. | ✅ ☑️ | | | |
@@ -126,19 +171,25 @@ export default defineConfig([
126
171
  | [no-for-loop](docs/rules/no-for-loop.md) | Do not use a `for` loop that can be replaced with a `for-of` loop. | ✅ | 🔧 | | |
127
172
  | [no-global-object-property-assignment](docs/rules/no-global-object-property-assignment.md) | Disallow assigning properties on the global object. | ✅ ☑️ | | | |
128
173
  | [no-immediate-mutation](docs/rules/no-immediate-mutation.md) | Disallow immediate mutation after variable assignment. | ✅ | 🔧 | 💡 | |
174
+ | [no-impossible-length-comparison](docs/rules/no-impossible-length-comparison.md) | Disallow impossible comparisons against `.length` or `.size`. | ✅ ☑️ | | | |
129
175
  | [no-incorrect-query-selector](docs/rules/no-incorrect-query-selector.md) | Disallow incorrect `querySelector()` and `querySelectorAll()` usage. | ✅ | 🔧 | | |
130
- | [no-incorrect-template-string-interpolation](docs/rules/no-incorrect-template-string-interpolation.md) | Disallow incorrect template literal interpolation syntax. | ✅ ☑️ | | 💡 | |
176
+ | [no-incorrect-template-string-interpolation](docs/rules/no-incorrect-template-string-interpolation.md) | Disallow incorrect template literal interpolation syntax. | ✅ | | 💡 | |
131
177
  | [no-instanceof-builtins](docs/rules/no-instanceof-builtins.md) | Disallow `instanceof` with built-in objects | ✅ ☑️ | 🔧 | 💡 | |
132
178
  | [no-invalid-argument-count](docs/rules/no-invalid-argument-count.md) | Disallow calling functions and constructors with an invalid number of arguments. | ✅ ☑️ | | | |
179
+ | [no-invalid-character-comparison](docs/rules/no-invalid-character-comparison.md) | Disallow comparing a single character from a string to a multi-character string. | ✅ ☑️ | | | |
133
180
  | [no-invalid-fetch-options](docs/rules/no-invalid-fetch-options.md) | Disallow invalid options in `fetch()` and `new Request()`. | ✅ ☑️ | | | |
134
181
  | [no-invalid-file-input-accept](docs/rules/no-invalid-file-input-accept.md) | Disallow invalid `accept` values on file inputs. | | 🔧 | | |
135
182
  | [no-invalid-remove-event-listener](docs/rules/no-invalid-remove-event-listener.md) | Prevent calling `EventTarget#removeEventListener()` with the result of an expression. | ✅ ☑️ | | | |
183
+ | [no-invalid-well-known-symbol-methods](docs/rules/no-invalid-well-known-symbol-methods.md) | Disallow invalid implementations of well-known symbol methods. | ✅ ☑️ | 🔧 | 💡 | |
136
184
  | [no-keyword-prefix](docs/rules/no-keyword-prefix.md) | Disallow identifiers starting with `new` or `class`. | | | | |
137
185
  | [no-late-current-target-access](docs/rules/no-late-current-target-access.md) | Disallow accessing `event.currentTarget` after the synchronous event dispatch has finished. | ✅ | | | |
186
+ | [no-late-event-control](docs/rules/no-late-event-control.md) | Disallow event-control method calls after the synchronous event dispatch has finished. | ✅ | | | |
138
187
  | [no-lonely-if](docs/rules/no-lonely-if.md) | Disallow `if` statements as the only statement in `if` blocks without `else`. | ✅ ☑️ | 🔧 | | |
188
+ | [no-loop-iterable-mutation](docs/rules/no-loop-iterable-mutation.md) | Disallow mutating a loop iterable during iteration. | ✅ | | | |
139
189
  | [no-magic-array-flat-depth](docs/rules/no-magic-array-flat-depth.md) | Disallow a magic number as the `depth` argument in `Array#flat(…).` | ✅ ☑️ | | | |
140
190
  | [no-manually-wrapped-comments](docs/rules/no-manually-wrapped-comments.md) | Disallow manually wrapped comments. | | 🔧 | | |
141
191
  | [no-mismatched-map-key](docs/rules/no-mismatched-map-key.md) | Disallow checking a Map key before accessing a different key. | ✅ | | | |
192
+ | [no-misrefactored-assignment](docs/rules/no-misrefactored-assignment.md) | Disallow misrefactored compound assignments where the target is duplicated in the right-hand side. | ✅ ☑️ | | 💡 | |
142
193
  | [no-named-default](docs/rules/no-named-default.md) | Disallow named usage of default import and export. | ✅ ☑️ | 🔧 | | |
143
194
  | [no-negated-array-predicate](docs/rules/no-negated-array-predicate.md) | Disallow negated array predicate calls. | ✅ ☑️ | 🔧 | | |
144
195
  | [no-negated-comparison](docs/rules/no-negated-comparison.md) | Disallow negated comparisons. | ✅ ☑️ | 🔧 | 💡 | |
@@ -148,6 +199,7 @@ export default defineConfig([
148
199
  | [no-new-array](docs/rules/no-new-array.md) | Disallow `new Array()`. | ✅ ☑️ | 🔧 | 💡 | |
149
200
  | [no-new-buffer](docs/rules/no-new-buffer.md) | Enforce the use of `Buffer.from()` and `Buffer.alloc()` instead of the deprecated `new Buffer()`. | ✅ ☑️ | 🔧 | 💡 | |
150
201
  | [no-non-function-verb-prefix](docs/rules/no-non-function-verb-prefix.md) | Disallow non-function values with function-style verb prefixes. | ✅ | | | 💭 |
202
+ | [no-nonstandard-builtin-properties](docs/rules/no-nonstandard-builtin-properties.md) | Disallow non-standard properties on built-in objects. | ✅ ☑️ | | | |
151
203
  | [no-null](docs/rules/no-null.md) | Disallow the use of the `null` literal. | ✅ | 🔧 | 💡 | |
152
204
  | [no-object-as-default-parameter](docs/rules/no-object-as-default-parameter.md) | Disallow the use of objects as default parameters. | ✅ ☑️ | | | |
153
205
  | [no-object-methods-with-collections](docs/rules/no-object-methods-with-collections.md) | Disallow `Object` methods with `Map` or `Set`. | ✅ | | 💡 | |
@@ -155,6 +207,7 @@ export default defineConfig([
155
207
  | [no-process-exit](docs/rules/no-process-exit.md) | Disallow `process.exit()`. | ✅ ☑️ | | | |
156
208
  | [no-redundant-comparison](docs/rules/no-redundant-comparison.md) | Disallow comparisons made redundant by an equality check in the same logical AND. | ✅ ☑️ | 🔧 | 💡 | |
157
209
  | [no-return-array-push](docs/rules/no-return-array-push.md) | Disallow using the return value of `Array#push()` and `Array#unshift()`. | ✅ | | 💡 | |
210
+ | [no-selector-as-dom-name](docs/rules/no-selector-as-dom-name.md) | Disallow selector syntax in DOM names. | ✅ | 🔧 | | |
158
211
  | [no-single-promise-in-promise-methods](docs/rules/no-single-promise-in-promise-methods.md) | Disallow passing single-element arrays to `Promise` methods. | ✅ ☑️ | 🔧 | 💡 | |
159
212
  | [no-static-only-class](docs/rules/no-static-only-class.md) | Disallow classes that only have static members. | ✅ ☑️ | 🔧 | | |
160
213
  | [no-subtraction-comparison](docs/rules/no-subtraction-comparison.md) | Prefer comparing values directly over subtracting and comparing to `0`. | ✅ ☑️ | 🔧 | 💡 | |
@@ -169,6 +222,7 @@ export default defineConfig([
169
222
  | [no-unnecessary-array-flat-depth](docs/rules/no-unnecessary-array-flat-depth.md) | Disallow using `1` as the `depth` argument of `Array#flat()`. | ✅ ☑️ | 🔧 | | |
170
223
  | [no-unnecessary-array-splice-count](docs/rules/no-unnecessary-array-splice-count.md) | Disallow using `.length` or `Infinity` as the `deleteCount` or `skipCount` argument of `Array#{splice,toSpliced}()`. | ✅ ☑️ | 🔧 | | |
171
224
  | [no-unnecessary-await](docs/rules/no-unnecessary-await.md) | Disallow awaiting non-promise values. | ✅ ☑️ | 🔧 | | |
225
+ | [no-unnecessary-boolean-comparison](docs/rules/no-unnecessary-boolean-comparison.md) | Disallow unnecessary comparisons against boolean literals. | ✅ | 🔧 | | |
172
226
  | [no-unnecessary-global-this](docs/rules/no-unnecessary-global-this.md) | Disallow unnecessary `globalThis` references. | ✅ ☑️ | 🔧 | | |
173
227
  | [no-unnecessary-nested-ternary](docs/rules/no-unnecessary-nested-ternary.md) | Disallow unnecessary nested ternary expressions. | ✅ ☑️ | 🔧 | | |
174
228
  | [no-unnecessary-polyfills](docs/rules/no-unnecessary-polyfills.md) | Enforce the use of built-in methods instead of unnecessary polyfills. | ✅ ☑️ | | | |
@@ -188,13 +242,16 @@ export default defineConfig([
188
242
  | [no-useless-boolean-cast](docs/rules/no-useless-boolean-cast.md) | Disallow unnecessary `Boolean()` casts in array predicate callbacks. | ✅ ☑️ | 🔧 | | |
189
243
  | [no-useless-coercion](docs/rules/no-useless-coercion.md) | Disallow useless type coercions of values that are already of the target type. | ✅ ☑️ | 🔧 | | |
190
244
  | [no-useless-collection-argument](docs/rules/no-useless-collection-argument.md) | Disallow useless values or fallbacks in `Set`, `Map`, `WeakSet`, or `WeakMap`. | ✅ ☑️ | 🔧 | 💡 | |
245
+ | [no-useless-compound-assignment](docs/rules/no-useless-compound-assignment.md) | Disallow useless compound assignments such as `x += 0`. | ✅ ☑️ | | 💡 | |
191
246
  | [no-useless-concat](docs/rules/no-useless-concat.md) | Disallow useless concatenation of literals. | ✅ ☑️ | 🔧 | | |
192
247
  | [no-useless-continue](docs/rules/no-useless-continue.md) | Disallow useless `continue` statements. | ✅ ☑️ | 🔧 | | |
248
+ | [no-useless-delete-check](docs/rules/no-useless-delete-check.md) | Disallow unnecessary existence checks before deletion. | ✅ ☑️ | 🔧 | 💡 | |
193
249
  | [no-useless-else](docs/rules/no-useless-else.md) | Disallow `else` after a statement that exits. | ✅ | 🔧 | | |
194
250
  | [no-useless-error-capture-stack-trace](docs/rules/no-useless-error-capture-stack-trace.md) | Disallow unnecessary `Error.captureStackTrace(…)`. | ✅ ☑️ | 🔧 | | |
195
251
  | [no-useless-fallback-in-spread](docs/rules/no-useless-fallback-in-spread.md) | Disallow useless fallback when spreading in object literals. | ✅ ☑️ | 🔧 | | |
196
252
  | [no-useless-iterator-to-array](docs/rules/no-useless-iterator-to-array.md) | Disallow unnecessary `.toArray()` on iterators. | ✅ ☑️ | 🔧 | 💡 | |
197
253
  | [no-useless-length-check](docs/rules/no-useless-length-check.md) | Disallow useless array length check. | ✅ ☑️ | 🔧 | | |
254
+ | [no-useless-logical-operand](docs/rules/no-useless-logical-operand.md) | Disallow unnecessary operands in logical expressions involving boolean literals. | ✅ ☑️ | 🔧 | | |
198
255
  | [no-useless-override](docs/rules/no-useless-override.md) | Disallow useless overrides of class methods. | ✅ ☑️ | 🔧 | | |
199
256
  | [no-useless-promise-resolve-reject](docs/rules/no-useless-promise-resolve-reject.md) | Disallow returning/yielding `Promise.resolve/reject()` in async functions or promise callbacks | ✅ ☑️ | 🔧 | | |
200
257
  | [no-useless-recursion](docs/rules/no-useless-recursion.md) | Disallow simple recursive function calls that can be replaced with a loop. | ✅ | | | |
@@ -202,17 +259,22 @@ export default defineConfig([
202
259
  | [no-useless-switch-case](docs/rules/no-useless-switch-case.md) | Disallow useless case in switch statements. | ✅ ☑️ | | 💡 | |
203
260
  | [no-useless-template-literals](docs/rules/no-useless-template-literals.md) | Disallow useless template literal expressions. | ✅ ☑️ | 🔧 | 💡 | |
204
261
  | [no-useless-undefined](docs/rules/no-useless-undefined.md) | Disallow useless `undefined`. | ✅ ☑️ | 🔧 | 💡 | |
262
+ | [no-xor-as-exponentiation](docs/rules/no-xor-as-exponentiation.md) | Disallow the bitwise XOR operator where exponentiation was likely intended. | ✅ ☑️ | | 💡 | |
205
263
  | [no-zero-fractions](docs/rules/no-zero-fractions.md) | Disallow number literals with zero fractions or dangling dots. | ✅ ☑️ | 🔧 | | |
206
264
  | [number-literal-case](docs/rules/number-literal-case.md) | Enforce proper case for numeric literals. | ✅ ☑️ | 🔧 | | |
207
265
  | [numeric-separators-style](docs/rules/numeric-separators-style.md) | Enforce the style of numeric separators by correctly grouping digits. | ✅ ☑️ | 🔧 | | |
208
266
  | [operator-assignment](docs/rules/operator-assignment.md) | Require assignment operator shorthand where possible. | ✅ | 🔧 | 💡 | |
267
+ | [prefer-abort-signal-timeout](docs/rules/prefer-abort-signal-timeout.md) | Prefer `AbortSignal.timeout()` over manually aborting an `AbortController` with `setTimeout()`. | ✅ | | 💡 | |
209
268
  | [prefer-add-event-listener](docs/rules/prefer-add-event-listener.md) | Prefer `.addEventListener()` and `.removeEventListener()` over `on`-functions. | ✅ ☑️ | 🔧 | | |
210
269
  | [prefer-add-event-listener-options](docs/rules/prefer-add-event-listener-options.md) | Prefer an options object over a boolean in `.addEventListener()`. | ✅ ☑️ | 🔧 | | |
270
+ | [prefer-aggregate-error](docs/rules/prefer-aggregate-error.md) | Prefer `AggregateError` when throwing collected errors. | ✅ ☑️ | 🔧 | | |
211
271
  | [prefer-array-find](docs/rules/prefer-array-find.md) | Prefer `.find(…)` and `.findLast(…)` over the first or last element from `.filter(…)`. | ✅ ☑️ | 🔧 | 💡 | |
212
272
  | [prefer-array-flat](docs/rules/prefer-array-flat.md) | Prefer `Array#flat()` over legacy techniques to flatten arrays. | ✅ ☑️ | 🔧 | | |
213
273
  | [prefer-array-flat-map](docs/rules/prefer-array-flat-map.md) | Prefer `.flatMap(…)` over `.map(…).flat()` and `.filter(…).flatMap(…)`. | ✅ ☑️ | 🔧 | 💡 | |
274
+ | [prefer-array-from-async](docs/rules/prefer-array-from-async.md) | Prefer `Array.fromAsync()` over `for await…of` array accumulation. | ✅ | 🔧 | | |
214
275
  | [prefer-array-from-map](docs/rules/prefer-array-from-map.md) | Prefer using the `Array.from()` mapping function argument. | ✅ ☑️ | 🔧 | 💡 | |
215
276
  | [prefer-array-index-of](docs/rules/prefer-array-index-of.md) | Prefer `Array#{indexOf,lastIndexOf}()` over `Array#{findIndex,findLastIndex}()` when looking for the index of an item. | ✅ ☑️ | 🔧 | 💡 | |
277
+ | [prefer-array-iterable-methods](docs/rules/prefer-array-iterable-methods.md) | Prefer iterating an array directly or with `Array#keys()` over `Array#entries()` when the index or value is unused. | ✅ | 🔧 | | |
216
278
  | [prefer-array-last-methods](docs/rules/prefer-array-last-methods.md) | Prefer last-oriented array methods over `Array#reverse()` or `Array#toReversed()` followed by a method. | ✅ ☑️ | | 💡 | |
217
279
  | [prefer-array-slice](docs/rules/prefer-array-slice.md) | Prefer `Array#slice()` over `Array#splice()` when reading from the returned array. | ✅ | | 💡 | |
218
280
  | [prefer-array-some](docs/rules/prefer-array-some.md) | Prefer `.some(…)` over `.filter(…).length` check and `.{find,findLast,findIndex,findLastIndex}(…)`. | ✅ ☑️ | 🔧 | 💡 | |
@@ -220,9 +282,11 @@ export default defineConfig([
220
282
  | [prefer-await](docs/rules/prefer-await.md) | Prefer `await` over promise chaining. | ✅ ☑️ | | | |
221
283
  | [prefer-bigint-literals](docs/rules/prefer-bigint-literals.md) | Prefer `BigInt` literals over the constructor. | ✅ ☑️ | 🔧 | 💡 | |
222
284
  | [prefer-blob-reading-methods](docs/rules/prefer-blob-reading-methods.md) | Prefer `Blob#arrayBuffer()` over `FileReader#readAsArrayBuffer(…)` and `Blob#text()` over `FileReader#readAsText(…)`. | ✅ ☑️ | | | |
285
+ | [prefer-boolean-return](docs/rules/prefer-boolean-return.md) | Prefer directly returning boolean expressions over `if` statements. | ✅ ☑️ | 🔧 | | |
223
286
  | [prefer-class-fields](docs/rules/prefer-class-fields.md) | Prefer class field declarations over `this` assignments in constructors. | ✅ ☑️ | 🔧 | 💡 | |
224
287
  | [prefer-classlist-toggle](docs/rules/prefer-classlist-toggle.md) | Prefer using `Element#classList.toggle()` to toggle class names. | ✅ ☑️ | 🔧 | 💡 | |
225
288
  | [prefer-code-point](docs/rules/prefer-code-point.md) | Prefer `String#codePointAt(…)` over `String#charCodeAt(…)` and `String.fromCodePoint(…)` over `String.fromCharCode(…)`. | ✅ ☑️ | | 💡 | |
289
+ | [prefer-continue](docs/rules/prefer-continue.md) | Prefer early continues over whole-loop conditional wrapping. | ✅ | 🔧 | | |
226
290
  | [prefer-date-now](docs/rules/prefer-date-now.md) | Prefer `Date.now()` to get the number of milliseconds since the Unix Epoch. | ✅ ☑️ | 🔧 | | |
227
291
  | [prefer-default-parameters](docs/rules/prefer-default-parameters.md) | Prefer default parameters over reassignment. | ✅ ☑️ | | 💡 | |
228
292
  | [prefer-direct-iteration](docs/rules/prefer-direct-iteration.md) | Prefer direct iteration over default iterator method calls. | ✅ ☑️ | 🔧 | | |
@@ -230,15 +294,19 @@ export default defineConfig([
230
294
  | [prefer-dom-node-append](docs/rules/prefer-dom-node-append.md) | Prefer `Element#append()` over `Node#appendChild()`. | ✅ ☑️ | 🔧 | | |
231
295
  | [prefer-dom-node-html-methods](docs/rules/prefer-dom-node-html-methods.md) | Prefer `.getHTML()` and `.setHTML()` over `.innerHTML`. | | 🔧 | 💡 | |
232
296
  | [prefer-dom-node-remove](docs/rules/prefer-dom-node-remove.md) | Prefer `childNode.remove()` over `parentNode.removeChild(childNode)`. | ✅ ☑️ | 🔧 | 💡 | |
297
+ | [prefer-dom-node-replace-children](docs/rules/prefer-dom-node-replace-children.md) | Prefer `.replaceChildren()` when emptying DOM children. | ✅ ☑️ | 🔧 | | |
233
298
  | [prefer-dom-node-text-content](docs/rules/prefer-dom-node-text-content.md) | Prefer `.textContent` over `.innerText`. | ✅ ☑️ | | 💡 | |
234
299
  | [prefer-early-return](docs/rules/prefer-early-return.md) | Prefer early returns over full-function conditional wrapping. | ✅ ☑️ | 🔧 | 💡 | |
235
300
  | [prefer-else-if](docs/rules/prefer-else-if.md) | Prefer `else if` over adjacent `if` statements with related conditions. | ✅ | 🔧 | 💡 | |
301
+ | [prefer-error-is-error](docs/rules/prefer-error-is-error.md) | Prefer `Error.isError()` when checking for errors. | | 🔧 | | |
236
302
  | [prefer-event-target](docs/rules/prefer-event-target.md) | Prefer `EventTarget` over `EventEmitter`. | ✅ ☑️ | | | |
237
303
  | [prefer-export-from](docs/rules/prefer-export-from.md) | Prefer `export…from` when re-exporting. | ✅ | 🔧 | 💡 | |
304
+ | [prefer-flat-math-min-max](docs/rules/prefer-flat-math-min-max.md) | Prefer flat `Math.min()` and `Math.max()` calls over nested calls. | ✅ ☑️ | 🔧 | | |
238
305
  | [prefer-get-or-insert-computed](docs/rules/prefer-get-or-insert-computed.md) | Prefer `.getOrInsertComputed()` when the default value has side effects. | ✅ | 🔧 | | |
239
306
  | [prefer-global-number-constants](docs/rules/prefer-global-number-constants.md) | Prefer global numeric constants over `Number` static properties. | ✅ ☑️ | 🔧 | | |
240
307
  | [prefer-global-this](docs/rules/prefer-global-this.md) | Prefer `globalThis` over `window`, `self`, and `global`. | ✅ ☑️ | 🔧 | | |
241
308
  | [prefer-has-check](docs/rules/prefer-has-check.md) | Prefer `.has()` when checking existence. | ✅ ☑️ | 🔧 | | |
309
+ | [prefer-hoisting-branch-code](docs/rules/prefer-hoisting-branch-code.md) | Prefer moving code shared by all branches of an `if` statement out of the branches. | ✅ | 🔧 | 💡 | |
242
310
  | [prefer-https](docs/rules/prefer-https.md) | Prefer HTTPS over HTTP. | ✅ | 🔧 | | |
243
311
  | [prefer-identifier-import-export-specifiers](docs/rules/prefer-identifier-import-export-specifiers.md) | Prefer identifiers over string literals in import and export specifiers. | ✅ ☑️ | 🔧 | | |
244
312
  | [prefer-import-meta-properties](docs/rules/prefer-import-meta-properties.md) | Prefer `import.meta.{dirname,filename}` over legacy techniques for getting file paths. | | 🔧 | | |
@@ -253,6 +321,7 @@ export default defineConfig([
253
321
  | [prefer-logical-operator-over-ternary](docs/rules/prefer-logical-operator-over-ternary.md) | Prefer using a logical operator over a ternary. | ✅ ☑️ | | 💡 | |
254
322
  | [prefer-map-from-entries](docs/rules/prefer-map-from-entries.md) | Prefer `new Map()` over `Object.fromEntries()` when using the result as a map. | ✅ ☑️ | 🔧 | | |
255
323
  | [prefer-math-abs](docs/rules/prefer-math-abs.md) | Prefer `Math.abs()` over manual absolute value expressions and symmetric range checks. | ✅ ☑️ | 🔧 | | |
324
+ | [prefer-math-constants](docs/rules/prefer-math-constants.md) | Prefer `Math` constants over their approximate numeric values. | ✅ ☑️ | | 💡 | |
256
325
  | [prefer-math-min-max](docs/rules/prefer-math-min-max.md) | Prefer `Math.min()` and `Math.max()` over ternaries for simple comparisons. | ✅ ☑️ | 🔧 | | |
257
326
  | [prefer-math-trunc](docs/rules/prefer-math-trunc.md) | Prefer `Math.trunc()` for truncating numbers. | ✅ ☑️ | 🔧 | 💡 | |
258
327
  | [prefer-minimal-ternary](docs/rules/prefer-minimal-ternary.md) | Prefer moving ternaries into the minimal varying part of an expression. | ✅ ☑️ | | | |
@@ -269,24 +338,30 @@ export default defineConfig([
269
338
  | [prefer-object-destructuring-defaults](docs/rules/prefer-object-destructuring-defaults.md) | Prefer object destructuring defaults over default object literals with spread. | ✅ | | 💡 | |
270
339
  | [prefer-object-from-entries](docs/rules/prefer-object-from-entries.md) | Prefer using `Object.fromEntries(…)` to transform a list of key-value pairs into an object. | ✅ ☑️ | 🔧 | | |
271
340
  | [prefer-object-iterable-methods](docs/rules/prefer-object-iterable-methods.md) | Prefer the most specific `Object` iterable method. | ✅ ☑️ | 🔧 | | |
341
+ | [prefer-observer-apis](docs/rules/prefer-observer-apis.md) | Prefer observer APIs over resize and scroll listeners with layout reads. | ✅ | | | |
272
342
  | [prefer-optional-catch-binding](docs/rules/prefer-optional-catch-binding.md) | Prefer omitting the `catch` binding parameter. | ✅ ☑️ | 🔧 | | |
273
343
  | [prefer-path2d](docs/rules/prefer-path2d.md) | Prefer `Path2D` for repeatedly drawn canvas paths. | ✅ ☑️ | | | |
274
344
  | [prefer-private-class-fields](docs/rules/prefer-private-class-fields.md) | Prefer private class fields over the underscore-prefix convention. | ✅ | 🔧 | | |
345
+ | [prefer-promise-try](docs/rules/prefer-promise-try.md) | Prefer `Promise.try()` over promise-wrapping boilerplate. | ✅ | 🔧 | | |
346
+ | [prefer-promise-with-resolvers](docs/rules/prefer-promise-with-resolvers.md) | Prefer `Promise.withResolvers()` when extracting resolver functions from `new Promise()`. | ✅ ☑️ | 🔧 | | |
275
347
  | [prefer-prototype-methods](docs/rules/prefer-prototype-methods.md) | Prefer borrowing methods from the prototype instead of the instance. | ✅ ☑️ | 🔧 | | |
276
348
  | [prefer-query-selector](docs/rules/prefer-query-selector.md) | Prefer `.querySelector()` and `.querySelectorAll()` over older DOM query methods. | ✅ | 🔧 | | |
277
349
  | [prefer-queue-microtask](docs/rules/prefer-queue-microtask.md) | Prefer `queueMicrotask()` over `process.nextTick()`, `setImmediate()`, and `setTimeout(…, 0)`. | ✅ ☑️ | 🔧 | | |
278
350
  | [prefer-reflect-apply](docs/rules/prefer-reflect-apply.md) | Prefer `Reflect.apply()` over `Function#apply()`. | ✅ ☑️ | 🔧 | | |
351
+ | [prefer-regexp-escape](docs/rules/prefer-regexp-escape.md) | Prefer `RegExp.escape()` for escaping strings to use in regular expressions. | | 🔧 | 💡 | |
279
352
  | [prefer-regexp-test](docs/rules/prefer-regexp-test.md) | Prefer `RegExp#test()` over `String#match()`, `String#search()`, and `RegExp#exec()`. | ✅ ☑️ | 🔧 | 💡 | |
280
353
  | [prefer-response-static-json](docs/rules/prefer-response-static-json.md) | Prefer `Response.json()` over `new Response(JSON.stringify())`. | ✅ ☑️ | 🔧 | | |
281
354
  | [prefer-scoped-selector](docs/rules/prefer-scoped-selector.md) | Prefer `:scope` when using element query selector methods. | ✅ | | 💡 | |
282
355
  | [prefer-set-has](docs/rules/prefer-set-has.md) | Prefer `Set#has()` over `Array#includes()` when checking for existence or non-existence. | ✅ ☑️ | 🔧 | 💡 | |
356
+ | [prefer-set-methods](docs/rules/prefer-set-methods.md) | Prefer `Set` methods for Set operations. | ✅ | 🔧 | 💡 | |
283
357
  | [prefer-set-size](docs/rules/prefer-set-size.md) | Prefer using `Set#size` instead of `Array#length`. | ✅ ☑️ | 🔧 | | |
284
- | [prefer-short-arrow-method](docs/rules/prefer-short-arrow-method.md) | Prefer arrow function properties over methods with a single return. || 🔧 | | |
358
+ | [prefer-short-arrow-method](docs/rules/prefer-short-arrow-method.md) | Prefer arrow function properties over methods with a single return. | | 🔧 | | |
285
359
  | [prefer-simple-condition-first](docs/rules/prefer-simple-condition-first.md) | Prefer simple conditions first in logical expressions. | ✅ ☑️ | 🔧 | 💡 | |
286
360
  | [prefer-simple-sort-comparator](docs/rules/prefer-simple-sort-comparator.md) | Prefer a simple comparison function for `Array#sort()`. | ✅ ☑️ | | 💡 | |
287
361
  | [prefer-single-array-predicate](docs/rules/prefer-single-array-predicate.md) | Prefer a single `Array#some()` or `Array#every()` with a combined predicate. | ✅ ☑️ | | 💡 | |
288
362
  | [prefer-single-call](docs/rules/prefer-single-call.md) | Enforce combining multiple `Array#{push,unshift}()`, `Element#classList.{add,remove}()`, and `importScripts()` into one call. | ✅ ☑️ | 🔧 | 💡 | |
289
363
  | [prefer-single-object-destructuring](docs/rules/prefer-single-object-destructuring.md) | Prefer a single object destructuring declaration per local const source. | ✅ | 🔧 | | |
364
+ | [prefer-single-replace](docs/rules/prefer-single-replace.md) | Enforce combining multiple single-character replacements into a single `String#replaceAll()` with a regular expression. | ✅ ☑️ | 🔧 | | |
290
365
  | [prefer-smaller-scope](docs/rules/prefer-smaller-scope.md) | Prefer declaring variables in the smallest possible scope. | ✅ | 🔧 | | |
291
366
  | [prefer-split-limit](docs/rules/prefer-split-limit.md) | Prefer `String#split()` with a limit. | ✅ ☑️ | 🔧 | | |
292
367
  | [prefer-spread](docs/rules/prefer-spread.md) | Prefer the spread operator over `Array.from(…)`, `Array#concat(…)`, `Array#{slice,toSpliced}()`, and trivial `for…of` copies. | ✅ | 🔧 | 💡 | |
@@ -301,14 +376,18 @@ export default defineConfig([
301
376
  | [prefer-structured-clone](docs/rules/prefer-structured-clone.md) | Prefer using `structuredClone` to create a deep clone. | ✅ ☑️ | | 💡 | |
302
377
  | [prefer-switch](docs/rules/prefer-switch.md) | Prefer `switch` over multiple `else-if`. | ✅ ☑️ | 🔧 | | |
303
378
  | [prefer-temporal](docs/rules/prefer-temporal.md) | Prefer `Temporal` over `Date`. | | 🔧 | 💡 | |
304
- | [prefer-ternary](docs/rules/prefer-ternary.md) | Prefer ternary expressions over simple `if-else` statements that return or assign values. | ✅ ☑️ | 🔧 | 💡 | |
379
+ | [prefer-ternary](docs/rules/prefer-ternary.md) | Prefer ternary expressions over simple `if` statements that return or assign values. | ✅ ☑️ | 🔧 | 💡 | |
380
+ | [prefer-toggle-attribute](docs/rules/prefer-toggle-attribute.md) | Prefer using `Element#toggleAttribute()` to toggle attributes. | ✅ ☑️ | 🔧 | 💡 | |
305
381
  | [prefer-top-level-await](docs/rules/prefer-top-level-await.md) | Prefer top-level await over top-level promises and async function calls. | ✅ ☑️ | | 💡 | |
306
382
  | [prefer-type-error](docs/rules/prefer-type-error.md) | Enforce throwing `TypeError` in type checking conditions. | ✅ ☑️ | 🔧 | | |
307
- | [prefer-type-literal-last](docs/rules/prefer-type-literal-last.md) | Require type literals to be last in union and intersection types. | ✅ ☑️ | 🔧 | | |
383
+ | [prefer-type-literal-last](docs/rules/prefer-type-literal-last.md) | Require type literals to be last in union types. | ✅ | 🔧 | | |
308
384
  | [prefer-uint8array-base64](docs/rules/prefer-uint8array-base64.md) | Prefer `Uint8Array#toBase64()` and `Uint8Array.fromBase64()` over `atob()`, `btoa()`, and `Buffer` base64 conversions. | ✅ ☑️ | | 💡 | |
385
+ | [prefer-unary-minus](docs/rules/prefer-unary-minus.md) | Prefer the unary minus operator over multiplying or dividing by `-1`. | ✅ ☑️ | 🔧 | | |
309
386
  | [prefer-unicode-code-point-escapes](docs/rules/prefer-unicode-code-point-escapes.md) | Prefer Unicode code point escapes over legacy escape sequences. | ✅ ☑️ | 🔧 | 💡 | |
387
+ | [prefer-url-can-parse](docs/rules/prefer-url-can-parse.md) | Prefer `URL.canParse()` over constructing a `URL` in a try/catch for validation. | ✅ ☑️ | 🔧 | | |
310
388
  | [prefer-url-href](docs/rules/prefer-url-href.md) | Prefer `URL#href` over stringifying a `URL`. | ✅ ☑️ | 🔧 | | |
311
- | [prevent-abbreviations](docs/rules/prevent-abbreviations.md) | Prevent abbreviations. | ✅ | 🔧 | 💡 | |
389
+ | [prefer-url-search-parameters](docs/rules/prefer-url-search-parameters.md) | Prefer `URLSearchParams` over manually splitting query strings. | ✅ ☑️ | | 💡 | |
390
+ | [prefer-while-loop-condition](docs/rules/prefer-while-loop-condition.md) | Prefer putting the condition in the while statement. | ✅ ☑️ | 🔧 | | |
312
391
  | [relative-url-style](docs/rules/relative-url-style.md) | Enforce consistent relative URL style. | ✅ ☑️ | 🔧 | 💡 | |
313
392
  | [require-array-join-separator](docs/rules/require-array-join-separator.md) | Enforce using the separator argument with `Array#join()`. | ✅ ☑️ | 🔧 | | |
314
393
  | [require-array-sort-compare](docs/rules/require-array-sort-compare.md) | Require a compare function when calling `Array#sort()` or `Array#toSorted()`. | ✅ ☑️ | | 💡 | |
@@ -333,6 +412,74 @@ export default defineConfig([
333
412
 
334
413
  While most rules target JavaScript and TypeScript, some also lint other file types when used with the corresponding [ESLint language plugin](https://eslint.org/docs/latest/use/configure/plugins#specifying-a-language) such as [`@eslint/css`](https://github.com/eslint/css), [`@eslint/json`](https://github.com/eslint/json), [`@eslint/markdown`](https://github.com/eslint/markdown), or [`@html-eslint/eslint-plugin`](https://github.com/yeonjuan/html-eslint). Each such rule declares this with the `meta.languages` field.
335
414
 
415
+ When linting JSON, CSS, Markdown, HTML, or other non-JavaScript languages in the same ESLint config, scope Unicorn's JavaScript rule config objects with `files`. Include TypeScript/JSX extensions there only if your config already provides the matching parser/language setup for those files.
416
+
417
+ For example, keep Unicorn's JavaScript rules scoped separately, and enable only compatible Unicorn rules in each non-JavaScript language config:
418
+
419
+ ```js
420
+ import css from '@eslint/css';
421
+ import json from '@eslint/json';
422
+ import markdown from '@eslint/markdown';
423
+ import html from '@html-eslint/eslint-plugin';
424
+ import unicorn from 'eslint-plugin-unicorn';
425
+ import {defineConfig} from 'eslint/config';
426
+
427
+ export default defineConfig([
428
+ {
429
+ files: ['**/*.js'],
430
+ extends: [unicorn.configs.recommended],
431
+ },
432
+ {
433
+ files: ['**/*.json'],
434
+ plugins: {
435
+ json,
436
+ unicorn,
437
+ },
438
+ language: 'json/json',
439
+ rules: {
440
+ 'unicorn/no-empty-file': 'error',
441
+ 'unicorn/prefer-https': 'error',
442
+ },
443
+ },
444
+ {
445
+ files: ['**/*.css'],
446
+ plugins: {
447
+ css,
448
+ unicorn,
449
+ },
450
+ language: 'css/css',
451
+ rules: {
452
+ 'unicorn/prefer-https': 'error',
453
+ 'unicorn/text-encoding-identifier-case': 'error',
454
+ },
455
+ },
456
+ {
457
+ files: ['**/*.html'],
458
+ plugins: {
459
+ html,
460
+ unicorn,
461
+ },
462
+ language: 'html/html',
463
+ rules: {
464
+ 'unicorn/no-invalid-file-input-accept': 'error',
465
+ 'unicorn/prefer-https': 'error',
466
+ },
467
+ },
468
+ {
469
+ files: ['**/*.md'],
470
+ plugins: {
471
+ markdown,
472
+ unicorn,
473
+ },
474
+ language: 'markdown/commonmark',
475
+ rules: {
476
+ 'unicorn/expiring-todo-comments': 'error',
477
+ 'unicorn/prefer-https': 'error',
478
+ },
479
+ },
480
+ ]);
481
+ ```
482
+
336
483
  <!-- Do not manually modify this list. Run: `npm run fix:non-js-languages` -->
337
484
  <!-- begin auto-generated non-js languages list -->
338
485
 
@@ -370,13 +517,14 @@ See the [ESLint docs](https://eslint.org/docs/latest/use/configure/configuration
370
517
  This plugin exports a `recommended` config that enforces good practices.
371
518
 
372
519
  ```js
373
- import eslintPluginUnicorn from 'eslint-plugin-unicorn';
520
+ import unicorn from 'eslint-plugin-unicorn';
374
521
  import {defineConfig} from 'eslint/config';
375
522
 
376
523
  export default defineConfig([
377
524
  // …
378
525
  {
379
- extends: [eslintPluginUnicorn.configs.recommended],
526
+ files: ['**/*.js'],
527
+ extends: [unicorn.configs.recommended],
380
528
  rules: {
381
529
  'unicorn/prefer-module': 'warn',
382
530
  },
@@ -389,13 +537,14 @@ export default defineConfig([
389
537
  This plugin exports an `all` config that enables every rule, except deprecated ones.
390
538
 
391
539
  ```js
392
- import eslintPluginUnicorn from 'eslint-plugin-unicorn';
540
+ import unicorn from 'eslint-plugin-unicorn';
393
541
  import {defineConfig} from 'eslint/config';
394
542
 
395
543
  export default defineConfig([
396
544
  // …
397
545
  {
398
- extends: [eslintPluginUnicorn.configs.all],
546
+ files: ['**/*.js'],
547
+ extends: [unicorn.configs.all],
399
548
  rules: {
400
549
  'unicorn/prefer-module': 'warn',
401
550
  },
@@ -9,9 +9,5 @@ export default function isEmptyNode(node, additionalEmpty) {
9
9
  return true;
10
10
  }
11
11
 
12
- if (additionalEmpty?.(node)) {
13
- return true;
14
- }
15
-
16
- return false;
12
+ return Boolean(additionalEmpty?.(node));
17
13
  }
@@ -1,5 +1,5 @@
1
- const isEmptyArrayExpression = node =>
1
+ const isEmptyObjectExpression = node =>
2
2
  node.type === 'ObjectExpression'
3
3
  && node.properties.length === 0;
4
4
 
5
- export default isEmptyArrayExpression;
5
+ export default isEmptyObjectExpression;