eslint-plugin-wyrm 0.0.10 → 0.0.13

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 (234) hide show
  1. package/CHANGELOG.md +79 -0
  2. package/README.md +114 -58
  3. package/bin/wyrm.mjs +3 -0
  4. package/dist/_virtual/_rolldown/runtime.mjs +14 -0
  5. package/dist/cli.d.mts +1 -0
  6. package/dist/cli.mjs +23 -0
  7. package/dist/configs/index.d.mts +2 -1
  8. package/dist/configs/index.mjs +6 -6
  9. package/dist/index.mjs +1 -4
  10. package/dist/plugin.mjs +1 -3
  11. package/dist/rules/array-from-array.d.mts +9 -0
  12. package/dist/rules/array-from-array.mjs +56 -0
  13. package/dist/rules/as-unknown-as.d.mts +9 -0
  14. package/dist/rules/as-unknown-as.mjs +30 -0
  15. package/dist/rules/await-promise-resolve.d.mts +9 -0
  16. package/dist/rules/await-promise-resolve.mjs +41 -0
  17. package/dist/rules/boolean-coalescing.d.mts +9 -0
  18. package/dist/rules/boolean-coalescing.mjs +141 -0
  19. package/dist/rules/comment-duplicate-leading-space.d.mts +9 -0
  20. package/dist/rules/comment-duplicate-leading-space.mjs +34 -0
  21. package/dist/rules/conditional-boolean.d.mts +9 -0
  22. package/dist/rules/conditional-boolean.mjs +70 -0
  23. package/dist/rules/constant-boolean-cast.d.mts +9 -0
  24. package/dist/rules/constant-boolean-cast.mjs +203 -0
  25. package/dist/rules/de-morgan.d.mts +2 -2
  26. package/dist/rules/de-morgan.mjs +1 -3
  27. package/dist/rules/discarded-expression-statement.d.mts +14 -0
  28. package/dist/rules/discarded-expression-statement.mjs +243 -0
  29. package/dist/rules/distribute-boolean-casts.d.mts +2 -2
  30. package/dist/rules/distribute-boolean-casts.mjs +3 -3
  31. package/dist/rules/duplicate-destructuring.d.mts +2 -2
  32. package/dist/rules/duplicate-destructuring.mjs +1 -3
  33. package/dist/rules/duplicate-object-spread.d.mts +9 -0
  34. package/dist/rules/duplicate-object-spread.mjs +44 -0
  35. package/dist/rules/e.d.mts +11 -0
  36. package/dist/rules/e.mjs +87 -0
  37. package/dist/rules/empty-for.d.mts +9 -0
  38. package/dist/rules/empty-for.mjs +34 -0
  39. package/dist/rules/enum-member.d.mts +9 -0
  40. package/dist/rules/enum-member.mjs +51 -0
  41. package/dist/rules/eqeq-null.d.mts +9 -0
  42. package/dist/rules/eqeq-null.mjs +101 -0
  43. package/dist/rules/exact-string-regex.d.mts +9 -0
  44. package/dist/rules/exact-string-regex.mjs +83 -0
  45. package/dist/rules/export-using.d.mts +9 -0
  46. package/dist/rules/export-using.mjs +58 -0
  47. package/dist/rules/generic-constructor-with-hook.d.mts +11 -0
  48. package/dist/rules/generic-constructor-with-hook.mjs +103 -0
  49. package/dist/rules/idiomatic-cast.mjs +7 -10
  50. package/dist/rules/index.d.mts +112 -57
  51. package/dist/rules/index.mjs +113 -5
  52. package/dist/rules/inferable-type-predicate.d.mts +9 -0
  53. package/dist/rules/inferable-type-predicate.mjs +100 -0
  54. package/dist/rules/inner-as-const.d.mts +9 -0
  55. package/dist/rules/inner-as-const.mjs +70 -0
  56. package/dist/rules/jsx-tostring.d.mts +9 -0
  57. package/dist/rules/jsx-tostring.mjs +120 -0
  58. package/dist/rules/literal-destructuring.d.mts +9 -0
  59. package/dist/rules/literal-destructuring.mjs +102 -0
  60. package/dist/rules/named-export-with-side-effects.d.mts +11 -0
  61. package/dist/rules/named-export-with-side-effects.mjs +72 -0
  62. package/dist/rules/nested-reduce.d.mts +9 -0
  63. package/dist/rules/nested-reduce.mjs +46 -0
  64. package/dist/rules/nested-try-catch.d.mts +9 -0
  65. package/dist/rules/nested-try-catch.mjs +37 -0
  66. package/dist/rules/no-commented-out-comment.d.mts +9 -0
  67. package/dist/rules/no-commented-out-comment.mjs +31 -0
  68. package/dist/rules/no-constant-template-expression.d.mts +3 -4
  69. package/dist/rules/no-constant-template-expression.mjs +12 -9
  70. package/dist/rules/no-constructed-error-cause.d.mts +9 -0
  71. package/dist/rules/no-constructed-error-cause.mjs +75 -0
  72. package/dist/rules/no-convoluted-boolean-expressions.d.mts +9 -0
  73. package/dist/rules/no-convoluted-boolean-expressions.mjs +130 -0
  74. package/dist/rules/no-convoluted-logical-expressions.d.mts +2 -2
  75. package/dist/rules/no-convoluted-logical-expressions.mjs +1 -3
  76. package/dist/rules/no-custom-url-parsing.d.mts +2 -3
  77. package/dist/rules/no-custom-url-parsing.mjs +1 -3
  78. package/dist/rules/no-disallowed-warning-comments.d.mts +2 -2
  79. package/dist/rules/no-disallowed-warning-comments.mjs +1 -3
  80. package/dist/rules/no-duplicated-return.d.mts +2 -2
  81. package/dist/rules/no-duplicated-return.mjs +2 -3
  82. package/dist/rules/no-else-break.d.mts +2 -2
  83. package/dist/rules/no-else-break.mjs +3 -5
  84. package/dist/rules/no-else-continue.d.mts +2 -2
  85. package/dist/rules/no-else-continue.mjs +3 -5
  86. package/dist/rules/no-else-never.d.mts +9 -0
  87. package/dist/rules/no-else-never.mjs +75 -0
  88. package/dist/rules/no-else-return.d.mts +2 -3
  89. package/dist/rules/no-else-return.mjs +4 -5
  90. package/dist/rules/no-else-throw.d.mts +2 -2
  91. package/dist/rules/no-else-throw.mjs +3 -5
  92. package/dist/rules/no-empty-attribute.d.mts +3 -3
  93. package/dist/rules/no-empty-attribute.mjs +1 -3
  94. package/dist/rules/no-empty-comment.d.mts +3 -3
  95. package/dist/rules/no-empty-comment.mjs +1 -3
  96. package/dist/rules/no-empty-jsx-expression.d.mts +2 -2
  97. package/dist/rules/no-empty-jsx-expression.mjs +1 -3
  98. package/dist/rules/no-empty-literal-iteration.d.mts +2 -2
  99. package/dist/rules/no-empty-literal-iteration.mjs +1 -3
  100. package/dist/rules/no-extra-false-fallback.d.mts +2 -3
  101. package/dist/rules/no-extra-false-fallback.mjs +1 -3
  102. package/dist/rules/no-extra-nested-boolean-cast.d.mts +2 -3
  103. package/dist/rules/no-extra-nested-boolean-cast.mjs +2 -3
  104. package/dist/rules/no-first-last.d.mts +2 -2
  105. package/dist/rules/no-first-last.mjs +2 -5
  106. package/dist/rules/no-float-length-check.d.mts +2 -2
  107. package/dist/rules/no-float-length-check.mjs +1 -3
  108. package/dist/rules/no-huge-try-block.d.mts +3 -3
  109. package/dist/rules/no-huge-try-block.mjs +1 -3
  110. package/dist/rules/no-huge-useeffect.d.mts +11 -0
  111. package/dist/rules/no-huge-useeffect.mjs +52 -0
  112. package/dist/rules/no-if-length-for.d.mts +9 -0
  113. package/dist/rules/no-if-length-for.mjs +91 -0
  114. package/dist/rules/no-inline-jsdoc-tag.d.mts +3 -3
  115. package/dist/rules/no-inline-jsdoc-tag.mjs +1 -3
  116. package/dist/rules/no-invalid-date-literal.d.mts +2 -2
  117. package/dist/rules/no-invalid-date-literal.mjs +42 -19
  118. package/dist/rules/no-jsx-statement.d.mts +2 -2
  119. package/dist/rules/no-jsx-statement.mjs +1 -3
  120. package/dist/rules/no-lax-array-type.d.mts +9 -0
  121. package/dist/rules/no-lax-array-type.mjs +129 -0
  122. package/dist/rules/no-lax-return-type.d.mts +9 -0
  123. package/dist/rules/no-lax-return-type.mjs +138 -0
  124. package/dist/rules/no-mutable-literal-fill.d.mts +2 -3
  125. package/dist/rules/no-mutable-literal-fill.mjs +1 -3
  126. package/dist/rules/no-nullish-ternary.d.mts +9 -0
  127. package/dist/rules/no-nullish-ternary.mjs +121 -0
  128. package/dist/rules/no-numbered-comments.d.mts +2 -2
  129. package/dist/rules/no-numbered-comments.mjs +1 -3
  130. package/dist/rules/no-obvious-any.mjs +35 -27
  131. package/dist/rules/no-optional-type-guard-param.d.mts +2 -3
  132. package/dist/rules/no-optional-type-guard-param.mjs +1 -3
  133. package/dist/rules/no-out-of-order-comments.d.mts +2 -2
  134. package/dist/rules/no-out-of-order-comments.mjs +4 -8
  135. package/dist/rules/no-possibly-nullish-equality.d.mts +0 -1
  136. package/dist/rules/no-possibly-nullish-equality.mjs +6 -13
  137. package/dist/rules/no-redundant-function-declaration.d.mts +2 -2
  138. package/dist/rules/no-redundant-function-declaration.mjs +1 -3
  139. package/dist/rules/no-return-to-void.mjs +2 -4
  140. package/dist/rules/no-self-object-assign.d.mts +2 -2
  141. package/dist/rules/no-self-object-assign.mjs +1 -3
  142. package/dist/rules/no-sloppy-length-check.d.mts +2 -3
  143. package/dist/rules/no-sloppy-length-check.mjs +35 -37
  144. package/dist/rules/no-suspicious-jsx-semicolon.d.mts +2 -3
  145. package/dist/rules/no-suspicious-jsx-semicolon.mjs +2 -4
  146. package/dist/rules/no-ternary-return.d.mts +3 -4
  147. package/dist/rules/no-ternary-return.mjs +1 -3
  148. package/dist/rules/no-type-guard.d.mts +9 -0
  149. package/dist/rules/no-type-guard.mjs +36 -0
  150. package/dist/rules/no-unassigned-todo.d.mts +2 -2
  151. package/dist/rules/no-unassigned-todo.mjs +1 -3
  152. package/dist/rules/no-unbound-catch-error.d.mts +2 -2
  153. package/dist/rules/no-unbound-catch-error.mjs +1 -3
  154. package/dist/rules/no-unused-mutually-referential.d.mts +9 -0
  155. package/dist/rules/no-unused-mutually-referential.mjs +215 -0
  156. package/dist/rules/no-unused-param-read.d.mts +2 -2
  157. package/dist/rules/no-unused-param-read.mjs +1 -3
  158. package/dist/rules/no-useless-computed-key.d.mts +2 -2
  159. package/dist/rules/no-useless-computed-key.mjs +1 -3
  160. package/dist/rules/no-useless-iife.d.mts +2 -2
  161. package/dist/rules/no-useless-iife.mjs +2 -3
  162. package/dist/rules/no-useless-logical-fallback.d.mts +0 -1
  163. package/dist/rules/no-useless-logical-fallback.mjs +32 -24
  164. package/dist/rules/no-useless-return-undefined.mjs +11 -11
  165. package/dist/rules/no-useless-ts-check.d.mts +9 -0
  166. package/dist/rules/no-useless-ts-check.mjs +34 -0
  167. package/dist/rules/no-useless-use-strict.d.mts +2 -2
  168. package/dist/rules/no-useless-use-strict.mjs +1 -3
  169. package/dist/rules/no-useless-usememo.d.mts +2 -2
  170. package/dist/rules/no-useless-usememo.mjs +8 -6
  171. package/dist/rules/no-whitespace-property.d.mts +2 -2
  172. package/dist/rules/no-whitespace-property.mjs +1 -3
  173. package/dist/rules/nullish-object-spread.d.mts +9 -0
  174. package/dist/rules/nullish-object-spread.mjs +38 -0
  175. package/dist/rules/optional-call-expression.d.mts +2 -2
  176. package/dist/rules/optional-call-expression.mjs +20 -3
  177. package/dist/rules/prefer-array-from.d.mts +9 -0
  178. package/dist/rules/prefer-array-from.mjs +87 -0
  179. package/dist/rules/prefer-catch-method.d.mts +2 -2
  180. package/dist/rules/prefer-catch-method.mjs +9 -12
  181. package/dist/rules/prefer-early-return.d.mts +2 -2
  182. package/dist/rules/prefer-early-return.mjs +23 -20
  183. package/dist/rules/prefer-eqeq-null.d.mts +9 -0
  184. package/dist/rules/prefer-eqeq-null.mjs +122 -0
  185. package/dist/rules/prefer-finally.d.mts +9 -0
  186. package/dist/rules/prefer-finally.mjs +129 -0
  187. package/dist/rules/prefer-getorinsert.d.mts +9 -0
  188. package/dist/rules/prefer-getorinsert.mjs +180 -0
  189. package/dist/rules/prefer-has.d.mts +9 -0
  190. package/dist/rules/prefer-has.mjs +69 -0
  191. package/dist/rules/prefer-in.d.mts +9 -0
  192. package/dist/rules/prefer-in.mjs +81 -0
  193. package/dist/rules/prefer-object-keys-values.d.mts +9 -0
  194. package/dist/rules/prefer-object-keys-values.mjs +78 -0
  195. package/dist/rules/prefer-repeat.d.mts +2 -2
  196. package/dist/rules/prefer-repeat.mjs +1 -5
  197. package/dist/rules/prefer-satisfies.d.mts +9 -0
  198. package/dist/rules/prefer-satisfies.mjs +86 -0
  199. package/dist/rules/prefer-string-join.d.mts +9 -0
  200. package/dist/rules/prefer-string-join.mjs +67 -0
  201. package/dist/rules/primitive-valueof.mjs +6 -8
  202. package/dist/rules/slim-try.d.mts +9 -0
  203. package/dist/rules/slim-try.mjs +150 -0
  204. package/dist/rules/styled-button-has-type.d.mts +9 -0
  205. package/dist/rules/styled-button-has-type.mjs +82 -0
  206. package/dist/rules/styled-transient-props.d.mts +9 -0
  207. package/dist/rules/styled-transient-props.mjs +52 -0
  208. package/dist/rules/suspicious-map-length.d.mts +2 -2
  209. package/dist/rules/suspicious-map-length.mjs +1 -3
  210. package/dist/rules/template-tostring.d.mts +9 -0
  211. package/dist/rules/template-tostring.mjs +48 -0
  212. package/dist/rules/unsafe-asserted-chain.d.mts +0 -1
  213. package/dist/rules/unsafe-asserted-chain.mjs +5 -8
  214. package/dist/rules/unused-object-assign.d.mts +2 -2
  215. package/dist/rules/unused-object-assign.mjs +1 -3
  216. package/dist/rules/unused-object-freeze.d.mts +9 -0
  217. package/dist/rules/unused-object-freeze.mjs +37 -0
  218. package/dist/rules/useless-as-const.d.mts +9 -0
  219. package/dist/rules/useless-as-const.mjs +59 -0
  220. package/dist/rules/useless-assign.d.mts +11 -0
  221. package/dist/rules/useless-assign.mjs +69 -0
  222. package/dist/rules/useless-conditional-assign.d.mts +9 -0
  223. package/dist/rules/useless-conditional-assign.mjs +58 -0
  224. package/dist/rules/useless-intermediary-variable.mjs +18 -21
  225. package/dist/rules/useless-mock.d.mts +9 -0
  226. package/dist/rules/useless-mock.mjs +180 -0
  227. package/dist/rules/useless-required.d.mts +9 -0
  228. package/dist/rules/useless-required.mjs +257 -0
  229. package/dist/utils/compareTokens.mjs +1 -3
  230. package/dist/utils/createRule.mjs +1 -3
  231. package/dist/utils/negateExpression.mjs +1 -3
  232. package/dist/utils/option.mjs +5 -2
  233. package/package.json +30 -23
  234. package/dist/_virtual/rolldown_runtime.mjs +0 -20
package/CHANGELOG.md CHANGED
@@ -1,5 +1,84 @@
1
1
  # Changelog
2
2
 
3
+ ## [0.0.13](https://github.com/mchevestrier/eslint-plugin-wyrm/compare/eslint-plugin-wyrm-v0.0.12...eslint-plugin-wyrm-v0.0.13) (2026-05-16)
4
+
5
+
6
+ ### Features
7
+
8
+ * **deps-dev:** bump eslint from 10.2.0 to 10.2.1 in the eslint group across 1 directory ([#127](https://github.com/mchevestrier/eslint-plugin-wyrm/issues/127)) ([7a37012](https://github.com/mchevestrier/eslint-plugin-wyrm/commit/7a370129b3b568f95218a535a8a73ce8ca28bb62))
9
+
10
+ ## [0.0.12](https://github.com/mchevestrier/eslint-plugin-wyrm/compare/eslint-plugin-wyrm-v0.0.11...eslint-plugin-wyrm-v0.0.12) (2026-04-25)
11
+
12
+
13
+ ### Features
14
+
15
+ * add rule array-from-array ([ef60aae](https://github.com/mchevestrier/eslint-plugin-wyrm/commit/ef60aaea2c78a62a49d14bcb141c4d0557a547ba))
16
+ * add rule as-unknown-as ([e42706d](https://github.com/mchevestrier/eslint-plugin-wyrm/commit/e42706df38007019125d916167fc90d9f0fdadd8))
17
+ * add rule await-promise-resolve ([785f660](https://github.com/mchevestrier/eslint-plugin-wyrm/commit/785f6604311cc10b5ca24e4dfb7f3ade9e2bc701))
18
+ * add rule boolean-coalescing ([50f06fa](https://github.com/mchevestrier/eslint-plugin-wyrm/commit/50f06fae378e45264c19ff2a6d1737b141fa4a3f))
19
+ * add rule comment-duplicate-leading-space ([1bb890d](https://github.com/mchevestrier/eslint-plugin-wyrm/commit/1bb890db225796a2edf6a3f2ff5f78fd2b9fa7e2))
20
+ * add rule conditional-boolean ([8553b6c](https://github.com/mchevestrier/eslint-plugin-wyrm/commit/8553b6c3e6ed03b7c72b0c62bdbfc8371e86be50))
21
+ * add rule constant-boolean-cast ([d70a070](https://github.com/mchevestrier/eslint-plugin-wyrm/commit/d70a0701c1e260571f0c5c01e71e35975f3638ff))
22
+ * add rule discarded-expression-statement ([2e66aea](https://github.com/mchevestrier/eslint-plugin-wyrm/commit/2e66aea2fb0d7e37759a0d9ee999105c9b68aefa))
23
+ * add rule duplicate-object-spread ([8ca1b99](https://github.com/mchevestrier/eslint-plugin-wyrm/commit/8ca1b99e60efbeb0f4e10b6f4ccead805803ae7f))
24
+ * add rule empty-for ([54cd12b](https://github.com/mchevestrier/eslint-plugin-wyrm/commit/54cd12b23d14438628bfa523c69028d617bc8920))
25
+ * add rule enum-member ([3c55272](https://github.com/mchevestrier/eslint-plugin-wyrm/commit/3c55272b2847c74d71feb6f52f71a508d823ada2))
26
+ * add rule inferable-type-predicate ([c9e3d11](https://github.com/mchevestrier/eslint-plugin-wyrm/commit/c9e3d11ce2042d81e699c17592059629cc60cd95))
27
+ * add rule inner-as-const ([5ace0a7](https://github.com/mchevestrier/eslint-plugin-wyrm/commit/5ace0a7ad402ada0a25e3200301abcf0a4bc7e3e))
28
+ * add rule literal-destructuring ([5f787f0](https://github.com/mchevestrier/eslint-plugin-wyrm/commit/5f787f0e1d189945082574b4f996c17bf258fdbb))
29
+ * add rule nested-reduce ([f4e5faa](https://github.com/mchevestrier/eslint-plugin-wyrm/commit/f4e5faa1dc3f711b065d4415a164c9f481298409))
30
+ * add rule nested-try-catch ([de2479d](https://github.com/mchevestrier/eslint-plugin-wyrm/commit/de2479dd8b54b1053143b6978c744f96da2d5a2f))
31
+ * add rule no-convoluted-boolean-expressions ([cf78d68](https://github.com/mchevestrier/eslint-plugin-wyrm/commit/cf78d68eaf46b6562d264d58d76e390e03137c8c))
32
+ * add rule no-else-never ([0802142](https://github.com/mchevestrier/eslint-plugin-wyrm/commit/08021423aad858c6c59dc505c935804247a5623e))
33
+ * add rule no-nullish-ternary ([ba05a7d](https://github.com/mchevestrier/eslint-plugin-wyrm/commit/ba05a7d0b605fc827b39ce6268d7de91ad1545ce))
34
+ * add rule no-type-guard ([0f086cf](https://github.com/mchevestrier/eslint-plugin-wyrm/commit/0f086cfe474b41a5932cf9b74201307512c566f2))
35
+ * add rule prefer-array-from ([4b0c805](https://github.com/mchevestrier/eslint-plugin-wyrm/commit/4b0c805098f9dfb64fcef7e9e8de9684c8fbf8ed))
36
+ * add rule prefer-in ([a1a3b79](https://github.com/mchevestrier/eslint-plugin-wyrm/commit/a1a3b79cb473bfcadd97e6f3f73a72a9862a0277))
37
+ * add rule prefer-satisfies ([1c843a0](https://github.com/mchevestrier/eslint-plugin-wyrm/commit/1c843a0112583c1c249952b2b6b97e7c43b1a719))
38
+ * add rule prefer-string-join ([a1e9290](https://github.com/mchevestrier/eslint-plugin-wyrm/commit/a1e9290e9b82b31a0aa357dd5b3613019ef54ba8))
39
+ * add rule styled-button-has-type ([787d3e4](https://github.com/mchevestrier/eslint-plugin-wyrm/commit/787d3e485abdbf7c6bc01dfd206471de4c05a3a0))
40
+ * add rule styled-transient-props ([3b22364](https://github.com/mchevestrier/eslint-plugin-wyrm/commit/3b22364b240d0e6fbc10074cd94c3090571d968a))
41
+ * add rule unused-object-freeze ([b44f495](https://github.com/mchevestrier/eslint-plugin-wyrm/commit/b44f49582a9b09777ed52a235464221a4d0fbb45))
42
+ * add rule useless-as-const ([81a7b90](https://github.com/mchevestrier/eslint-plugin-wyrm/commit/81a7b90b6ba74e8c4e26da1151d907411a375926))
43
+ * add rule useless-assign ([4c7d2b4](https://github.com/mchevestrier/eslint-plugin-wyrm/commit/4c7d2b40d9cfc5c8bdba0599763fab8cfe00e41b))
44
+ * add rule useless-conditional-assign ([f6cffc5](https://github.com/mchevestrier/eslint-plugin-wyrm/commit/f6cffc53eab48e2f6d001a0b2e31668d2c7389b6))
45
+ * add rule useless-mock ([8b56fc7](https://github.com/mchevestrier/eslint-plugin-wyrm/commit/8b56fc77144b008a25fe0e70841bd289a460492b))
46
+ * add rules eqeq-null & prefer-eqeq-null ([40bd271](https://github.com/mchevestrier/eslint-plugin-wyrm/commit/40bd2718917f390dcdd156ab2e4ec204af4d498c))
47
+ * add rules jsx-tostring & template-tostring ([5077794](https://github.com/mchevestrier/eslint-plugin-wyrm/commit/50777944943609a888848357e36adea708422b3d))
48
+ * npx eslint-plugin-wyrm ([b836ad4](https://github.com/mchevestrier/eslint-plugin-wyrm/commit/b836ad47d955ad2e136b12004550ad25221e2844))
49
+
50
+
51
+ ### Bug Fixes
52
+
53
+ * improve e rule ([5ae6ead](https://github.com/mchevestrier/eslint-plugin-wyrm/commit/5ae6ead4d5814b612472b580bf658d66e76b741f))
54
+ * improve no-out-of-order-comments rule ([d295589](https://github.com/mchevestrier/eslint-plugin-wyrm/commit/d29558959f839db965fa9d22596b4353e92f7571))
55
+
56
+ ## [0.0.11](https://github.com/mchevestrier/eslint-plugin-wyrm/compare/eslint-plugin-wyrm-v0.0.10...eslint-plugin-wyrm-v0.0.11) (2026-02-26)
57
+
58
+
59
+ ### Features
60
+
61
+ * add prefer-has ([7ec4ac0](https://github.com/mchevestrier/eslint-plugin-wyrm/commit/7ec4ac098582925ffb5cd5f60d98f6eb49877c51))
62
+ * add rule e ([4138e48](https://github.com/mchevestrier/eslint-plugin-wyrm/commit/4138e482609b39c7137a15f1c547bcb93735635d))
63
+ * add rule exact-string-regex ([cee8e77](https://github.com/mchevestrier/eslint-plugin-wyrm/commit/cee8e77e27de3a5d2e89f1c0cb864b3325fb88a8))
64
+ * add rule export-using ([dcf583d](https://github.com/mchevestrier/eslint-plugin-wyrm/commit/dcf583dd4406967ed4abd47a44b5e1dc22ef0341))
65
+ * add rule generic-constructor-with-hook ([adb3aa7](https://github.com/mchevestrier/eslint-plugin-wyrm/commit/adb3aa7661e2c813ec85f553de3c36ca8cc8430a))
66
+ * add rule named-export-with-side-effects ([e31db0e](https://github.com/mchevestrier/eslint-plugin-wyrm/commit/e31db0ea8f9e356726a68de77e8d0629bf3fb3f5))
67
+ * add rule no-commented-out-comment ([106a564](https://github.com/mchevestrier/eslint-plugin-wyrm/commit/106a564e15d8cc2d0fda318f3da6f1be09346207))
68
+ * add rule no-constructed-error-cause ([634f808](https://github.com/mchevestrier/eslint-plugin-wyrm/commit/634f8085f864497d8fd1fdf26acefed0b051120d))
69
+ * add rule no-huge-useeffect ([afca71b](https://github.com/mchevestrier/eslint-plugin-wyrm/commit/afca71b340229b7f2d9b5cca5ad6f57bfe3a468a))
70
+ * add rule no-if-length-for ([1a40623](https://github.com/mchevestrier/eslint-plugin-wyrm/commit/1a40623a03efd5dba7a076889e022d8c84184059))
71
+ * add rule no-lax-array-type ([095f1f2](https://github.com/mchevestrier/eslint-plugin-wyrm/commit/095f1f26f283083a1037821c35c9f177de3d78e0))
72
+ * add rule no-lax-return-type ([a34ac88](https://github.com/mchevestrier/eslint-plugin-wyrm/commit/a34ac88220d6c18af23aaa8db5b0c49b3cd08fe5))
73
+ * add rule no-unused-mutually-referential ([dec8d1c](https://github.com/mchevestrier/eslint-plugin-wyrm/commit/dec8d1c87e6e5aac8be795e22ee5e310f1569513))
74
+ * add rule no-useless-ts-check ([ae7aed5](https://github.com/mchevestrier/eslint-plugin-wyrm/commit/ae7aed598e2505b2f79d028b504a8cdd4dffbcbf))
75
+ * add rule nullish-object-spread ([377eafd](https://github.com/mchevestrier/eslint-plugin-wyrm/commit/377eafd11ab55522d3de885523c5f844b33b4a88))
76
+ * add rule prefer-finally ([33286b5](https://github.com/mchevestrier/eslint-plugin-wyrm/commit/33286b569ee809a82a921125d1043e204d0e19a6))
77
+ * add rule prefer-getorinsert ([adf46a1](https://github.com/mchevestrier/eslint-plugin-wyrm/commit/adf46a139e6774c2ea189c9318a5bf654db5839f))
78
+ * add rule prefer-object-keys-values ([eb973f6](https://github.com/mchevestrier/eslint-plugin-wyrm/commit/eb973f66d3d1340267b271b0768d8f7cae54d8ef))
79
+ * add rule slim-try ([c3ebfcf](https://github.com/mchevestrier/eslint-plugin-wyrm/commit/c3ebfcf07cb534040baaeb4aaa140b4896592e94))
80
+ * add rule useless-required ([51dd82a](https://github.com/mchevestrier/eslint-plugin-wyrm/commit/51dd82a72c80ca8c83573ae1f6f621da6a24ad50))
81
+
3
82
  ## [0.0.10](https://github.com/mchevestrier/eslint-plugin-wyrm/compare/eslint-plugin-wyrm-v0.0.9...eslint-plugin-wyrm-v0.0.10) (2026-01-31)
4
83
 
5
84
 
package/README.md CHANGED
@@ -3,6 +3,7 @@
3
3
  [![npm version](https://img.shields.io/npm/v/eslint-plugin-wyrm.svg?color=7f52af&labelColor=26272b)](https://www.npmjs.com/package/eslint-plugin-wyrm)
4
4
  [![GitHub release](https://img.shields.io/github/v/release/mchevestrier/eslint-plugin-wyrm?color=7f52af&labelColor=26272b)](https://github.com/mchevestrier/eslint-plugin-wyrm/releases/latest)
5
5
  [![GitHub License](https://img.shields.io/badge/license-MIT-232428.svg?color=7f52af&labelColor=26272b)](https://github.com/mchevestrier/eslint-plugin-wyrm/blob/master/LICENSE.md)
6
+ [![Mutation testing badge](https://img.shields.io/endpoint?style=flat&labelColor=26272b&url=https%3A%2F%2Fbadge-api.stryker-mutator.io%2Fgithub.com%2Fmchevestrier%2Feslint-plugin-wyrm%2Fmaster)](https://dashboard.stryker-mutator.io/reports/github.com/mchevestrier/eslint-plugin-wyrm/master)
6
7
 
7
8
  ## Installation
8
9
 
@@ -49,63 +50,118 @@ export default defineConfig([
49
50
  💡 Manually fixable by [editor suggestions](https://eslint.org/docs/latest/use/core-concepts#rule-suggestions).\
50
51
  💭 Requires [type information](https://typescript-eslint.io/linting/typed-linting).
51
52
 
52
- | Name                              | Description | 💼 | 🔧 | 💡 | 💭 |
53
- | :------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | :---------------------------------------------------------------------------- | :---------- | :-- | :-- | :-- |
54
- | [de-morgan](https://github.com/mchevestrier/eslint-plugin-wyrm/blob/master/packages/eslint-plugin-wyrm/docs/rules/de-morgan.md) | Enforce using De Morgan's law to simplify negated logical expressions | 🟩 ✅ 🟪 ☑️ | 🔧 | | |
55
- | [distribute-boolean-casts](https://github.com/mchevestrier/eslint-plugin-wyrm/blob/master/packages/eslint-plugin-wyrm/docs/rules/distribute-boolean-casts.md) | Enforce that boolean casts are distributed over logical expressions | 🟪 ☑️ | 🔧 | | |
56
- | [duplicate-destructuring](https://github.com/mchevestrier/eslint-plugin-wyrm/blob/master/packages/eslint-plugin-wyrm/docs/rules/duplicate-destructuring.md) | Forbid duplicate keys in object destructuring patterns | 🟩 ✅ 🟪 ☑️ | | | |
57
- | [idiomatic-cast](https://github.com/mchevestrier/eslint-plugin-wyrm/blob/master/packages/eslint-plugin-wyrm/docs/rules/idiomatic-cast.md) | Enforce idiomatic ways to cast values | ☑️ | 🔧 | | 💭 |
58
- | [no-constant-template-expression](https://github.com/mchevestrier/eslint-plugin-wyrm/blob/master/packages/eslint-plugin-wyrm/docs/rules/no-constant-template-expression.md) | Disallow constant string expressions in template literals | ☑️ | | 💡 | 💭 |
59
- | [no-convoluted-logical-expressions](https://github.com/mchevestrier/eslint-plugin-wyrm/blob/master/packages/eslint-plugin-wyrm/docs/rules/no-convoluted-logical-expressions.md) | Forbid simplifiable logical expressions | 🟩 ✅ 🟪 ☑️ | 🔧 | | |
60
- | [no-custom-url-parsing](https://github.com/mchevestrier/eslint-plugin-wyrm/blob/master/packages/eslint-plugin-wyrm/docs/rules/no-custom-url-parsing.md) | Forbid parsing or building URLs by hand | 🟪 ☑️ | | | |
61
- | [no-disallowed-warning-comments](https://github.com/mchevestrier/eslint-plugin-wyrm/blob/master/packages/eslint-plugin-wyrm/docs/rules/no-disallowed-warning-comments.md) | Forbid disallowed comments like FIXME, XXX, HACK | 🟪 ☑️ | | | |
62
- | [no-duplicated-return](https://github.com/mchevestrier/eslint-plugin-wyrm/blob/master/packages/eslint-plugin-wyrm/docs/rules/no-duplicated-return.md) | Forbid duplicated branches with early returns | 🟩 ✅ 🟪 ☑️ | | | |
63
- | [no-else-break](https://github.com/mchevestrier/eslint-plugin-wyrm/blob/master/packages/eslint-plugin-wyrm/docs/rules/no-else-break.md) | Forbid unnecessary `else` block after a `break` statement | 🟩 ✅ 🟪 ☑️ | 🔧 | | |
64
- | [no-else-continue](https://github.com/mchevestrier/eslint-plugin-wyrm/blob/master/packages/eslint-plugin-wyrm/docs/rules/no-else-continue.md) | Forbid unnecessary `else` block after a `continue` statement | 🟩 ✅ 🟪 ☑️ | 🔧 | | |
65
- | [no-else-return](https://github.com/mchevestrier/eslint-plugin-wyrm/blob/master/packages/eslint-plugin-wyrm/docs/rules/no-else-return.md) | Forbid unnecessary `else` block after a `return` statement | 🟩 ✅ 🟪 ☑️ | 🔧 | | |
66
- | [no-else-throw](https://github.com/mchevestrier/eslint-plugin-wyrm/blob/master/packages/eslint-plugin-wyrm/docs/rules/no-else-throw.md) | Forbid unnecessary `else` block after a `throw` statement | 🟩 ✅ 🟪 ☑️ | 🔧 | | |
67
- | [no-empty-attribute](https://github.com/mchevestrier/eslint-plugin-wyrm/blob/master/packages/eslint-plugin-wyrm/docs/rules/no-empty-attribute.md) | Forbid some empty JSX attributes | 🟪 ☑️ | | | |
68
- | [no-empty-comment](https://github.com/mchevestrier/eslint-plugin-wyrm/blob/master/packages/eslint-plugin-wyrm/docs/rules/no-empty-comment.md) | Forbid empty comments | 🟪 ☑️ | | | |
69
- | [no-empty-jsx-expression](https://github.com/mchevestrier/eslint-plugin-wyrm/blob/master/packages/eslint-plugin-wyrm/docs/rules/no-empty-jsx-expression.md) | Forbid empty JSX expression containers | 🟩 🟪 ☑️ | | | |
70
- | [no-empty-literal-iteration](https://github.com/mchevestrier/eslint-plugin-wyrm/blob/master/packages/eslint-plugin-wyrm/docs/rules/no-empty-literal-iteration.md) | Forbid iterating over empty literals | 🟩 ✅ 🟪 ☑️ | | | |
71
- | [no-extra-false-fallback](https://github.com/mchevestrier/eslint-plugin-wyrm/blob/master/packages/eslint-plugin-wyrm/docs/rules/no-extra-false-fallback.md) | Forbid extra `?? false` in conditions and predicates | 🟪 ☑️ | | 💡 | |
72
- | [no-extra-nested-boolean-cast](https://github.com/mchevestrier/eslint-plugin-wyrm/blob/master/packages/eslint-plugin-wyrm/docs/rules/no-extra-nested-boolean-cast.md) | Forbid extra boolean casts in conditions and predicates | 🟪 ☑️ | | | |
73
- | [no-first-last](https://github.com/mchevestrier/eslint-plugin-wyrm/blob/master/packages/eslint-plugin-wyrm/docs/rules/no-first-last.md) | Forbid confusing naming for "first" or "last" | 🟩 ✅ 🟪 ☑️ | 🔧 | | |
74
- | [no-float-length-check](https://github.com/mchevestrier/eslint-plugin-wyrm/blob/master/packages/eslint-plugin-wyrm/docs/rules/no-float-length-check.md) | Forbid comparing a length to a floating point number | 🟩 ✅ 🟪 ☑️ | | | |
75
- | [no-huge-try-block](https://github.com/mchevestrier/eslint-plugin-wyrm/blob/master/packages/eslint-plugin-wyrm/docs/rules/no-huge-try-block.md) | Forbid huge try/catch blocks | 🟪 ☑️ | | | |
76
- | [no-inline-jsdoc-tag](https://github.com/mchevestrier/eslint-plugin-wyrm/blob/master/packages/eslint-plugin-wyrm/docs/rules/no-inline-jsdoc-tag.md) | Forbid JSDoc tags in code comments | 🟪 ☑️ | | | |
77
- | [no-invalid-date-literal](https://github.com/mchevestrier/eslint-plugin-wyrm/blob/master/packages/eslint-plugin-wyrm/docs/rules/no-invalid-date-literal.md) | Disallow invalid date literals | 🟩 ✅ 🟪 ☑️ | | | |
78
- | [no-jsx-statement](https://github.com/mchevestrier/eslint-plugin-wyrm/blob/master/packages/eslint-plugin-wyrm/docs/rules/no-jsx-statement.md) | Forbid JSX expression statements | 🟩 ✅ 🟪 ☑️ | | | |
79
- | [no-mutable-literal-fill](https://github.com/mchevestrier/eslint-plugin-wyrm/blob/master/packages/eslint-plugin-wyrm/docs/rules/no-mutable-literal-fill.md) | Forbid using mutable literals to fill arrays | 🟩 ✅ 🟪 ☑️ | | | |
80
- | [no-numbered-comments](https://github.com/mchevestrier/eslint-plugin-wyrm/blob/master/packages/eslint-plugin-wyrm/docs/rules/no-numbered-comments.md) | Forbid numbered comments | | | | |
81
- | [no-obvious-any](https://github.com/mchevestrier/eslint-plugin-wyrm/blob/master/packages/eslint-plugin-wyrm/docs/rules/no-obvious-any.md) | Forbid using `any` when a stricter type can be trivially inferred | ☑️ | 🔧 | | 💭 |
82
- | [no-optional-type-guard-param](https://github.com/mchevestrier/eslint-plugin-wyrm/blob/master/packages/eslint-plugin-wyrm/docs/rules/no-optional-type-guard-param.md) | Forbid optional parameters in type guards | 🟩 ✅ 🟪 ☑️ | | | |
83
- | [no-out-of-order-comments](https://github.com/mchevestrier/eslint-plugin-wyrm/blob/master/packages/eslint-plugin-wyrm/docs/rules/no-out-of-order-comments.md) | Forbid out of order numbered comments | 🟩 ✅ 🟪 ☑️ | | | |
84
- | [no-possibly-nullish-equality](https://github.com/mchevestrier/eslint-plugin-wyrm/blob/master/packages/eslint-plugin-wyrm/docs/rules/no-possibly-nullish-equality.md) | Forbid checking the equality of possibly nullish values | ☑️ | 🔧 | | 💭 |
85
- | [no-redundant-function-declaration](https://github.com/mchevestrier/eslint-plugin-wyrm/blob/master/packages/eslint-plugin-wyrm/docs/rules/no-redundant-function-declaration.md) | Forbid redundant function declarations | 🟩 ✅ 🟪 ☑️ | 🔧 | | |
86
- | [no-return-to-void](https://github.com/mchevestrier/eslint-plugin-wyrm/blob/master/packages/eslint-plugin-wyrm/docs/rules/no-return-to-void.md) | Forbid returning values in void-returning callbacks | ☑️ | | | 💭 |
87
- | [no-self-object-assign](https://github.com/mchevestrier/eslint-plugin-wyrm/blob/master/packages/eslint-plugin-wyrm/docs/rules/no-self-object-assign.md) | Forbid using `Object.assign()` with the same object as both target and source | 🟩 ✅ 🟪 ☑️ | | | |
88
- | [no-sloppy-length-check](https://github.com/mchevestrier/eslint-plugin-wyrm/blob/master/packages/eslint-plugin-wyrm/docs/rules/no-sloppy-length-check.md) | Forbid sloppy collection size checks | 🟩 ✅ 🟪 ☑️ | | | |
89
- | [no-suspicious-jsx-semicolon](https://github.com/mchevestrier/eslint-plugin-wyrm/blob/master/packages/eslint-plugin-wyrm/docs/rules/no-suspicious-jsx-semicolon.md) | Forbid suspicious semicolons in JSX | 🟩 ✅ 🟪 ☑️ | | | |
90
- | [no-ternary-return](https://github.com/mchevestrier/eslint-plugin-wyrm/blob/master/packages/eslint-plugin-wyrm/docs/rules/no-ternary-return.md) | Disallow ternary conditions in return statements | 🟪 ☑️ | 🔧 | | |
91
- | [no-unassigned-todo](https://github.com/mchevestrier/eslint-plugin-wyrm/blob/master/packages/eslint-plugin-wyrm/docs/rules/no-unassigned-todo.md) | Forbid unassigned TODO comments | 🟪 ☑️ | | | |
92
- | [no-unbound-catch-error](https://github.com/mchevestrier/eslint-plugin-wyrm/blob/master/packages/eslint-plugin-wyrm/docs/rules/no-unbound-catch-error.md) | Forbid `catch` clauses with unbound errors | 🟪 ☑️ | | | |
93
- | [no-unused-param-read](https://github.com/mchevestrier/eslint-plugin-wyrm/blob/master/packages/eslint-plugin-wyrm/docs/rules/no-unused-param-read.md) | Forbid referencing parameters marked as unused with a leading underscore | 🟪 ☑️ | | | |
94
- | [no-useless-computed-key](https://github.com/mchevestrier/eslint-plugin-wyrm/blob/master/packages/eslint-plugin-wyrm/docs/rules/no-useless-computed-key.md) | Forbid useless computed keys | 🟪 ☑️ | 🔧 | | |
95
- | [no-useless-iife](https://github.com/mchevestrier/eslint-plugin-wyrm/blob/master/packages/eslint-plugin-wyrm/docs/rules/no-useless-iife.md) | Forbid useless IIFEs | 🟩 ✅ 🟪 ☑️ | | 💡 | |
96
- | [no-useless-logical-fallback](https://github.com/mchevestrier/eslint-plugin-wyrm/blob/master/packages/eslint-plugin-wyrm/docs/rules/no-useless-logical-fallback.md) | Forbid useless fallback values for logical expressions | ✅ ☑️ | | 💡 | 💭 |
97
- | [no-useless-return-undefined](https://github.com/mchevestrier/eslint-plugin-wyrm/blob/master/packages/eslint-plugin-wyrm/docs/rules/no-useless-return-undefined.md) | Forbid returning `undefined` in void-returning callbacks | ☑️ | | | 💭 |
98
- | [no-useless-use-strict](https://github.com/mchevestrier/eslint-plugin-wyrm/blob/master/packages/eslint-plugin-wyrm/docs/rules/no-useless-use-strict.md) | Forbid useless "use strict" directives. | 🟪 ☑️ | | | |
99
- | [no-useless-usememo](https://github.com/mchevestrier/eslint-plugin-wyrm/blob/master/packages/eslint-plugin-wyrm/docs/rules/no-useless-usememo.md) | Forbid useless `useMemo()` | 🟪 ☑️ | | | |
100
- | [no-whitespace-property](https://github.com/mchevestrier/eslint-plugin-wyrm/blob/master/packages/eslint-plugin-wyrm/docs/rules/no-whitespace-property.md) | Forbid leading or trailing whitespace in object keys | 🟪 ☑️ | | | |
101
- | [optional-call-expression](https://github.com/mchevestrier/eslint-plugin-wyrm/blob/master/packages/eslint-plugin-wyrm/docs/rules/optional-call-expression.md) | Enforce using optional call expression syntax | 🟩 ✅ 🟪 ☑️ | 🔧 | | |
102
- | [prefer-catch-method](https://github.com/mchevestrier/eslint-plugin-wyrm/blob/master/packages/eslint-plugin-wyrm/docs/rules/prefer-catch-method.md) | Enforce usage of `Promise.prototype.catch()` when it improves readability | 🟩 ✅ 🟪 ☑️ | | 💡 | |
103
- | [prefer-early-return](https://github.com/mchevestrier/eslint-plugin-wyrm/blob/master/packages/eslint-plugin-wyrm/docs/rules/prefer-early-return.md) | Require early returns when possible | 🟪 ☑️ | 🔧 | | |
104
- | [prefer-repeat](https://github.com/mchevestrier/eslint-plugin-wyrm/blob/master/packages/eslint-plugin-wyrm/docs/rules/prefer-repeat.md) | Enforce usage of `String.prototype.repeat` | 🟩 ✅ 🟪 ☑️ | | 💡 | |
105
- | [primitive-valueof](https://github.com/mchevestrier/eslint-plugin-wyrm/blob/master/packages/eslint-plugin-wyrm/docs/rules/primitive-valueof.md) | Forbid calling `.valueOf()` on a primitive | ☑️ | 🔧 | | 💭 |
106
- | [suspicious-map-length](https://github.com/mchevestrier/eslint-plugin-wyrm/blob/master/packages/eslint-plugin-wyrm/docs/rules/suspicious-map-length.md) | Disallow suspicious use of `.map().length` | 🟩 ✅ 🟪 ☑️ | | 💡 | |
107
- | [unsafe-asserted-chain](https://github.com/mchevestrier/eslint-plugin-wyrm/blob/master/packages/eslint-plugin-wyrm/docs/rules/unsafe-asserted-chain.md) | Disallow unsafe type assertions on optional chained expressions | ☑️ | | | 💭 |
108
- | [unused-object-assign](https://github.com/mchevestrier/eslint-plugin-wyrm/blob/master/packages/eslint-plugin-wyrm/docs/rules/unused-object-assign.md) | Disallow unused `Object.assign()` expressions | 🟩 🟪 ☑️ | | | |
109
- | [useless-intermediary-variable](https://github.com/mchevestrier/eslint-plugin-wyrm/blob/master/packages/eslint-plugin-wyrm/docs/rules/useless-intermediary-variable.md) | Disallow unnecessary intermediary variables | 🟪 ☑️ | | 💡 | |
53
+ | Name                              | Description | 💼 | 🔧 | 💡 | 💭 |
54
+ | :------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | :---------------------------------------------------------------------------------------------------- | :---------- | :-- | :-- | :-- |
55
+ | [array-from-array](https://github.com/mchevestrier/eslint-plugin-wyrm/blob/master/packages/eslint-plugin-wyrm/docs/rules/array-from-array.md) | Forbid calling `Array.from` on arrays | ☑️ | 🔧 | | 💭 |
56
+ | [as-unknown-as](https://github.com/mchevestrier/eslint-plugin-wyrm/blob/master/packages/eslint-plugin-wyrm/docs/rules/as-unknown-as.md) | Forbid `as unknown as` | 🟪 ☑️ | | | |
57
+ | [await-promise-resolve](https://github.com/mchevestrier/eslint-plugin-wyrm/blob/master/packages/eslint-plugin-wyrm/docs/rules/await-promise-resolve.md) | Forbid `await Promise.resolve()` | 🟩 ✅ 🟪 ☑️ | 🔧 | | |
58
+ | [boolean-coalescing](https://github.com/mchevestrier/eslint-plugin-wyrm/blob/master/packages/eslint-plugin-wyrm/docs/rules/boolean-coalescing.md) | Prefer distributing boolean casts over nullish coalescing expressions | ☑️ | 🔧 | | 💭 |
59
+ | [comment-duplicate-leading-space](https://github.com/mchevestrier/eslint-plugin-wyrm/blob/master/packages/eslint-plugin-wyrm/docs/rules/comment-duplicate-leading-space.md) | Forbid duplicate leading space in comments | 🟩 ✅ 🟪 ☑️ | 🔧 | | |
60
+ | [conditional-boolean](https://github.com/mchevestrier/eslint-plugin-wyrm/blob/master/packages/eslint-plugin-wyrm/docs/rules/conditional-boolean.md) | Forbid if/else branches where the only difference is a boolean literal | 🟩 ✅ 🟪 ☑️ | 🔧 | | |
61
+ | [constant-boolean-cast](https://github.com/mchevestrier/eslint-plugin-wyrm/blob/master/packages/eslint-plugin-wyrm/docs/rules/constant-boolean-cast.md) | Forbid boolean casts on values with constant truthiness | ☑️ | | 💡 | 💭 |
62
+ | [de-morgan](https://github.com/mchevestrier/eslint-plugin-wyrm/blob/master/packages/eslint-plugin-wyrm/docs/rules/de-morgan.md) | Enforce using De Morgan's law to simplify negated logical expressions | 🟩 ✅ 🟪 ☑️ | 🔧 | | |
63
+ | [discarded-expression-statement](https://github.com/mchevestrier/eslint-plugin-wyrm/blob/master/packages/eslint-plugin-wyrm/docs/rules/discarded-expression-statement.md) | Forbid discarding the result of expression statements | | | | 💭 |
64
+ | [distribute-boolean-casts](https://github.com/mchevestrier/eslint-plugin-wyrm/blob/master/packages/eslint-plugin-wyrm/docs/rules/distribute-boolean-casts.md) | Enforce that boolean casts are distributed over logical expressions | 🟪 ☑️ | 🔧 | | |
65
+ | [duplicate-destructuring](https://github.com/mchevestrier/eslint-plugin-wyrm/blob/master/packages/eslint-plugin-wyrm/docs/rules/duplicate-destructuring.md) | Forbid duplicate keys in object destructuring patterns | 🟩 ✅ 🟪 ☑️ | | | |
66
+ | [duplicate-object-spread](https://github.com/mchevestrier/eslint-plugin-wyrm/blob/master/packages/eslint-plugin-wyrm/docs/rules/duplicate-object-spread.md) | Forbid duplicate spread elements in object literals | 🟩 ✅ 🟪 ☑️ | 🔧 | | |
67
+ | [e](https://github.com/mchevestrier/eslint-plugin-wyrm/blob/master/packages/eslint-plugin-wyrm/docs/rules/e.md) | Forbid using `e` as a parameter name | 🟪 ☑️ | | 💡 | |
68
+ | [empty-for](https://github.com/mchevestrier/eslint-plugin-wyrm/blob/master/packages/eslint-plugin-wyrm/docs/rules/empty-for.md) | Forbid using `for (;;)` | 🟩 ✅ 🟪 ☑️ | 🔧 | | |
69
+ | [enum-member](https://github.com/mchevestrier/eslint-plugin-wyrm/blob/master/packages/eslint-plugin-wyrm/docs/rules/enum-member.md) | Prefer enum members to literals asserted as enum | ☑️ | 🔧 | | 💭 |
70
+ | [eqeq-null](https://github.com/mchevestrier/eslint-plugin-wyrm/blob/master/packages/eslint-plugin-wyrm/docs/rules/eqeq-null.md) | Forbid using `x == null` when equivalent to `x === null` | ☑️ | 🔧 | | 💭 |
71
+ | [exact-string-regex](https://github.com/mchevestrier/eslint-plugin-wyrm/blob/master/packages/eslint-plugin-wyrm/docs/rules/exact-string-regex.md) | Forbid using a RegEx when string equality would suffice | 🟩 ✅ 🟪 ☑️ | | 💡 | |
72
+ | [export-using](https://github.com/mchevestrier/eslint-plugin-wyrm/blob/master/packages/eslint-plugin-wyrm/docs/rules/export-using.md) | Forbid exporting variables declared with `using` or `await using` | 🟩 ✅ 🟪 ☑️ | | | |
73
+ | [generic-constructor-with-hook](https://github.com/mchevestrier/eslint-plugin-wyrm/blob/master/packages/eslint-plugin-wyrm/docs/rules/generic-constructor-with-hook.md) | Forbid specifying the type arguments on the hook instead of on the generic class | 🟪 ☑️ | 🔧 | | |
74
+ | [idiomatic-cast](https://github.com/mchevestrier/eslint-plugin-wyrm/blob/master/packages/eslint-plugin-wyrm/docs/rules/idiomatic-cast.md) | Enforce idiomatic ways to cast values | ☑️ | 🔧 | | 💭 |
75
+ | [inferable-type-predicate](https://github.com/mchevestrier/eslint-plugin-wyrm/blob/master/packages/eslint-plugin-wyrm/docs/rules/inferable-type-predicate.md) | Forbid inferable type predicates | ☑️ | 🔧 | | 💭 |
76
+ | [inner-as-const](https://github.com/mchevestrier/eslint-plugin-wyrm/blob/master/packages/eslint-plugin-wyrm/docs/rules/inner-as-const.md) | Enforce setting `as const` on the outermost object/array literal only | 🟪 ☑️ | 🔧 | | |
77
+ | [jsx-tostring](https://github.com/mchevestrier/eslint-plugin-wyrm/blob/master/packages/eslint-plugin-wyrm/docs/rules/jsx-tostring.md) | Forbid calling `.toString()` inside JSX expressions containers | ☑️ | 🔧 | | 💭 |
78
+ | [literal-destructuring](https://github.com/mchevestrier/eslint-plugin-wyrm/blob/master/packages/eslint-plugin-wyrm/docs/rules/literal-destructuring.md) | Forbid variable declaration by destructuring object or array literals | 🟪 ☑️ | 🔧 | | |
79
+ | [named-export-with-side-effects](https://github.com/mchevestrier/eslint-plugin-wyrm/blob/master/packages/eslint-plugin-wyrm/docs/rules/named-export-with-side-effects.md) | Forbid named exports in files with side effects | 🟩 ✅ 🟪 ☑️ | | | |
80
+ | [nested-reduce](https://github.com/mchevestrier/eslint-plugin-wyrm/blob/master/packages/eslint-plugin-wyrm/docs/rules/nested-reduce.md) | Forbid nested `reduce` calls | 🟪 ☑️ | | | |
81
+ | [nested-try-catch](https://github.com/mchevestrier/eslint-plugin-wyrm/blob/master/packages/eslint-plugin-wyrm/docs/rules/nested-try-catch.md) | Forbid nested try/catch statements | 🟪 ☑️ | | | |
82
+ | [no-commented-out-comment](https://github.com/mchevestrier/eslint-plugin-wyrm/blob/master/packages/eslint-plugin-wyrm/docs/rules/no-commented-out-comment.md) | Forbid commented out comments | 🟩 🟪 ☑️ | | | |
83
+ | [no-constant-template-expression](https://github.com/mchevestrier/eslint-plugin-wyrm/blob/master/packages/eslint-plugin-wyrm/docs/rules/no-constant-template-expression.md) | Disallow constant string expressions in template literals | ☑️ | | 💡 | 💭 |
84
+ | [no-constructed-error-cause](https://github.com/mchevestrier/eslint-plugin-wyrm/blob/master/packages/eslint-plugin-wyrm/docs/rules/no-constructed-error-cause.md) | Forbid using `Error.cause` with constructed objects | 🟪 ☑️ | | | |
85
+ | [no-convoluted-boolean-expressions](https://github.com/mchevestrier/eslint-plugin-wyrm/blob/master/packages/eslint-plugin-wyrm/docs/rules/no-convoluted-boolean-expressions.md) | Forbid simplifiable logical expressions with boolean types | ☑️ | 🔧 | | 💭 |
86
+ | [no-convoluted-logical-expressions](https://github.com/mchevestrier/eslint-plugin-wyrm/blob/master/packages/eslint-plugin-wyrm/docs/rules/no-convoluted-logical-expressions.md) | Forbid simplifiable logical expressions | 🟩 ✅ 🟪 ☑️ | 🔧 | | |
87
+ | [no-custom-url-parsing](https://github.com/mchevestrier/eslint-plugin-wyrm/blob/master/packages/eslint-plugin-wyrm/docs/rules/no-custom-url-parsing.md) | Forbid parsing or building URLs by hand | 🟪 ☑️ | | | |
88
+ | [no-disallowed-warning-comments](https://github.com/mchevestrier/eslint-plugin-wyrm/blob/master/packages/eslint-plugin-wyrm/docs/rules/no-disallowed-warning-comments.md) | Forbid disallowed comments like FIXME, XXX, HACK | 🟪 ☑️ | | | |
89
+ | [no-duplicated-return](https://github.com/mchevestrier/eslint-plugin-wyrm/blob/master/packages/eslint-plugin-wyrm/docs/rules/no-duplicated-return.md) | Forbid duplicated branches with early returns | 🟩 ✅ 🟪 ☑️ | | | |
90
+ | [no-else-break](https://github.com/mchevestrier/eslint-plugin-wyrm/blob/master/packages/eslint-plugin-wyrm/docs/rules/no-else-break.md) | Forbid unnecessary `else` block after a `break` statement | 🟩 ✅ 🟪 ☑️ | 🔧 | | |
91
+ | [no-else-continue](https://github.com/mchevestrier/eslint-plugin-wyrm/blob/master/packages/eslint-plugin-wyrm/docs/rules/no-else-continue.md) | Forbid unnecessary `else` block after a `continue` statement | 🟩 ✅ 🟪 ☑️ | 🔧 | | |
92
+ | [no-else-never](https://github.com/mchevestrier/eslint-plugin-wyrm/blob/master/packages/eslint-plugin-wyrm/docs/rules/no-else-never.md) | Forbid unnecessary `else` block after an expression that never returns | ☑️ | 🔧 | | 💭 |
93
+ | [no-else-return](https://github.com/mchevestrier/eslint-plugin-wyrm/blob/master/packages/eslint-plugin-wyrm/docs/rules/no-else-return.md) | Forbid unnecessary `else` block after a `return` statement | 🟩 ✅ 🟪 ☑️ | 🔧 | | |
94
+ | [no-else-throw](https://github.com/mchevestrier/eslint-plugin-wyrm/blob/master/packages/eslint-plugin-wyrm/docs/rules/no-else-throw.md) | Forbid unnecessary `else` block after a `throw` statement | 🟩 ✅ 🟪 ☑️ | 🔧 | | |
95
+ | [no-empty-attribute](https://github.com/mchevestrier/eslint-plugin-wyrm/blob/master/packages/eslint-plugin-wyrm/docs/rules/no-empty-attribute.md) | Forbid some empty JSX attributes | 🟪 ☑️ | | | |
96
+ | [no-empty-comment](https://github.com/mchevestrier/eslint-plugin-wyrm/blob/master/packages/eslint-plugin-wyrm/docs/rules/no-empty-comment.md) | Forbid empty comments | 🟪 ☑️ | | | |
97
+ | [no-empty-jsx-expression](https://github.com/mchevestrier/eslint-plugin-wyrm/blob/master/packages/eslint-plugin-wyrm/docs/rules/no-empty-jsx-expression.md) | Forbid empty JSX expression containers | 🟩🟪 ☑️ | | | |
98
+ | [no-empty-literal-iteration](https://github.com/mchevestrier/eslint-plugin-wyrm/blob/master/packages/eslint-plugin-wyrm/docs/rules/no-empty-literal-iteration.md) | Forbid iterating over empty literals | 🟩 ✅ 🟪 ☑️ | | | |
99
+ | [no-extra-false-fallback](https://github.com/mchevestrier/eslint-plugin-wyrm/blob/master/packages/eslint-plugin-wyrm/docs/rules/no-extra-false-fallback.md) | Forbid extra `?? false` in conditions and predicates | 🟪 ☑️ | | 💡 | |
100
+ | [no-extra-nested-boolean-cast](https://github.com/mchevestrier/eslint-plugin-wyrm/blob/master/packages/eslint-plugin-wyrm/docs/rules/no-extra-nested-boolean-cast.md) | Forbid extra boolean casts in conditions and predicates | 🟪 ☑️ | | | |
101
+ | [no-first-last](https://github.com/mchevestrier/eslint-plugin-wyrm/blob/master/packages/eslint-plugin-wyrm/docs/rules/no-first-last.md) | Forbid confusing naming for "first" or "last" | 🟩 ✅ 🟪 ☑️ | | | |
102
+ | [no-float-length-check](https://github.com/mchevestrier/eslint-plugin-wyrm/blob/master/packages/eslint-plugin-wyrm/docs/rules/no-float-length-check.md) | Forbid comparing a length to a floating point number | 🟩 ✅ 🟪 ☑️ | | | |
103
+ | [no-huge-try-block](https://github.com/mchevestrier/eslint-plugin-wyrm/blob/master/packages/eslint-plugin-wyrm/docs/rules/no-huge-try-block.md) | Forbid huge try/catch blocks | 🟪 ☑️ | | | |
104
+ | [no-huge-useeffect](https://github.com/mchevestrier/eslint-plugin-wyrm/blob/master/packages/eslint-plugin-wyrm/docs/rules/no-huge-useeffect.md) | Forbid huge `useEffect` functions | 🟪 ☑️ | | | |
105
+ | [no-if-length-for](https://github.com/mchevestrier/eslint-plugin-wyrm/blob/master/packages/eslint-plugin-wyrm/docs/rules/no-if-length-for.md) | Forbid redundant condition for positive length before a loop | 🟩 ✅ 🟪 ☑️ | 🔧 | | |
106
+ | [no-inline-jsdoc-tag](https://github.com/mchevestrier/eslint-plugin-wyrm/blob/master/packages/eslint-plugin-wyrm/docs/rules/no-inline-jsdoc-tag.md) | Forbid JSDoc tags in code comments | 🟪 ☑️ | | | |
107
+ | [no-invalid-date-literal](https://github.com/mchevestrier/eslint-plugin-wyrm/blob/master/packages/eslint-plugin-wyrm/docs/rules/no-invalid-date-literal.md) | Disallow invalid date literals | 🟩 ✅ 🟪 ☑️ | | | |
108
+ | [no-jsx-statement](https://github.com/mchevestrier/eslint-plugin-wyrm/blob/master/packages/eslint-plugin-wyrm/docs/rules/no-jsx-statement.md) | Forbid JSX expression statements | 🟩 🟪 ☑️ | | | |
109
+ | [no-lax-array-type](https://github.com/mchevestrier/eslint-plugin-wyrm/blob/master/packages/eslint-plugin-wyrm/docs/rules/no-lax-array-type.md) | Forbid declaring array types that are wider than the types of the actual elements | ☑️ | | 💡 | 💭 |
110
+ | [no-lax-return-type](https://github.com/mchevestrier/eslint-plugin-wyrm/blob/master/packages/eslint-plugin-wyrm/docs/rules/no-lax-return-type.md) | Forbid declaring function return types that are wider than the types of the actual return values | ☑️ | | 💡 | 💭 |
111
+ | [no-mutable-literal-fill](https://github.com/mchevestrier/eslint-plugin-wyrm/blob/master/packages/eslint-plugin-wyrm/docs/rules/no-mutable-literal-fill.md) | Forbid using mutable literals to fill arrays | 🟩 ✅ 🟪 ☑️ | | | |
112
+ | [no-nullish-ternary](https://github.com/mchevestrier/eslint-plugin-wyrm/blob/master/packages/eslint-plugin-wyrm/docs/rules/no-nullish-ternary.md) | Forbid ternary conditions that can be replaced by optional chains | 🟩 ✅ 🟪 ☑️ | 🔧 | | |
113
+ | [no-numbered-comments](https://github.com/mchevestrier/eslint-plugin-wyrm/blob/master/packages/eslint-plugin-wyrm/docs/rules/no-numbered-comments.md) | Forbid numbered comments | | | | |
114
+ | [no-obvious-any](https://github.com/mchevestrier/eslint-plugin-wyrm/blob/master/packages/eslint-plugin-wyrm/docs/rules/no-obvious-any.md) | Forbid using `any` when a stricter type can be trivially inferred | ☑️ | 🔧 | | 💭 |
115
+ | [no-optional-type-guard-param](https://github.com/mchevestrier/eslint-plugin-wyrm/blob/master/packages/eslint-plugin-wyrm/docs/rules/no-optional-type-guard-param.md) | Forbid optional parameters in type guards | 🟩 ✅ 🟪 ☑️ | | | |
116
+ | [no-out-of-order-comments](https://github.com/mchevestrier/eslint-plugin-wyrm/blob/master/packages/eslint-plugin-wyrm/docs/rules/no-out-of-order-comments.md) | Forbid out of order numbered comments | 🟩 ✅ 🟪 ☑️ | | | |
117
+ | [no-possibly-nullish-equality](https://github.com/mchevestrier/eslint-plugin-wyrm/blob/master/packages/eslint-plugin-wyrm/docs/rules/no-possibly-nullish-equality.md) | Forbid checking the equality of possibly nullish values | ☑️ | | | 💭 |
118
+ | [no-redundant-function-declaration](https://github.com/mchevestrier/eslint-plugin-wyrm/blob/master/packages/eslint-plugin-wyrm/docs/rules/no-redundant-function-declaration.md) | Forbid redundant function declarations | 🟩 ✅ 🟪 ☑️ | 🔧 | | |
119
+ | [no-return-to-void](https://github.com/mchevestrier/eslint-plugin-wyrm/blob/master/packages/eslint-plugin-wyrm/docs/rules/no-return-to-void.md) | Forbid returning values in void-returning callbacks | ☑️ | | | 💭 |
120
+ | [no-self-object-assign](https://github.com/mchevestrier/eslint-plugin-wyrm/blob/master/packages/eslint-plugin-wyrm/docs/rules/no-self-object-assign.md) | Forbid using `Object.assign()` with the same object as both target and source | 🟩 ✅ 🟪 ☑️ | | | |
121
+ | [no-sloppy-length-check](https://github.com/mchevestrier/eslint-plugin-wyrm/blob/master/packages/eslint-plugin-wyrm/docs/rules/no-sloppy-length-check.md) | Forbid sloppy collection size checks | 🟩 ✅ 🟪 ☑️ | | | |
122
+ | [no-suspicious-jsx-semicolon](https://github.com/mchevestrier/eslint-plugin-wyrm/blob/master/packages/eslint-plugin-wyrm/docs/rules/no-suspicious-jsx-semicolon.md) | Forbid suspicious semicolons in JSX | 🟩 ✅ 🟪 ☑️ | | | |
123
+ | [no-ternary-return](https://github.com/mchevestrier/eslint-plugin-wyrm/blob/master/packages/eslint-plugin-wyrm/docs/rules/no-ternary-return.md) | Disallow ternary conditions in return statements | 🟪 ☑️ | 🔧 | | |
124
+ | [no-type-guard](https://github.com/mchevestrier/eslint-plugin-wyrm/blob/master/packages/eslint-plugin-wyrm/docs/rules/no-type-guard.md) | Forbid type guards | | | | |
125
+ | [no-unassigned-todo](https://github.com/mchevestrier/eslint-plugin-wyrm/blob/master/packages/eslint-plugin-wyrm/docs/rules/no-unassigned-todo.md) | Forbid unassigned TODO comments | 🟪 ☑️ | | | |
126
+ | [no-unbound-catch-error](https://github.com/mchevestrier/eslint-plugin-wyrm/blob/master/packages/eslint-plugin-wyrm/docs/rules/no-unbound-catch-error.md) | Forbid `catch` clauses with unbound errors | 🟪 ☑️ | | | |
127
+ | [no-unused-mutually-referential](https://github.com/mchevestrier/eslint-plugin-wyrm/blob/master/packages/eslint-plugin-wyrm/docs/rules/no-unused-mutually-referential.md) | Forbid unused functions, even if mutually referential | 🟪 ☑️ | | | |
128
+ | [no-unused-param-read](https://github.com/mchevestrier/eslint-plugin-wyrm/blob/master/packages/eslint-plugin-wyrm/docs/rules/no-unused-param-read.md) | Forbid referencing parameters marked as unused with a leading underscore | 🟪 ☑️ | | | |
129
+ | [no-useless-computed-key](https://github.com/mchevestrier/eslint-plugin-wyrm/blob/master/packages/eslint-plugin-wyrm/docs/rules/no-useless-computed-key.md) | Forbid useless computed keys | 🟪 ☑️ | 🔧 | | |
130
+ | [no-useless-iife](https://github.com/mchevestrier/eslint-plugin-wyrm/blob/master/packages/eslint-plugin-wyrm/docs/rules/no-useless-iife.md) | Forbid useless IIFEs | 🟩 ✅ 🟪 ☑️ | | 💡 | |
131
+ | [no-useless-logical-fallback](https://github.com/mchevestrier/eslint-plugin-wyrm/blob/master/packages/eslint-plugin-wyrm/docs/rules/no-useless-logical-fallback.md) | Forbid useless fallback values for logical expressions | ✅ ☑️ | | 💡 | 💭 |
132
+ | [no-useless-return-undefined](https://github.com/mchevestrier/eslint-plugin-wyrm/blob/master/packages/eslint-plugin-wyrm/docs/rules/no-useless-return-undefined.md) | Forbid returning `undefined` in void-returning callbacks | ☑️ | | | 💭 |
133
+ | [no-useless-ts-check](https://github.com/mchevestrier/eslint-plugin-wyrm/blob/master/packages/eslint-plugin-wyrm/docs/rules/no-useless-ts-check.md) | Forbid useless `@ts-check` comments in TypeScript files | 🟩 ✅ 🟪 ☑️ | | | |
134
+ | [no-useless-use-strict](https://github.com/mchevestrier/eslint-plugin-wyrm/blob/master/packages/eslint-plugin-wyrm/docs/rules/no-useless-use-strict.md) | Forbid useless "use strict" directives. | 🟪 ☑️ | | | |
135
+ | [no-useless-usememo](https://github.com/mchevestrier/eslint-plugin-wyrm/blob/master/packages/eslint-plugin-wyrm/docs/rules/no-useless-usememo.md) | Forbid useless `useMemo()` | 🟪 ☑️ | | | |
136
+ | [no-whitespace-property](https://github.com/mchevestrier/eslint-plugin-wyrm/blob/master/packages/eslint-plugin-wyrm/docs/rules/no-whitespace-property.md) | Forbid leading or trailing whitespace in object keys | 🟪 ☑️ | | | |
137
+ | [nullish-object-spread](https://github.com/mchevestrier/eslint-plugin-wyrm/blob/master/packages/eslint-plugin-wyrm/docs/rules/nullish-object-spread.md) | Forbid useless fallback for nullish values in object spread | 🟪 ☑️ | | | |
138
+ | [optional-call-expression](https://github.com/mchevestrier/eslint-plugin-wyrm/blob/master/packages/eslint-plugin-wyrm/docs/rules/optional-call-expression.md) | Enforce using optional call expression syntax | 🟩 ✅ 🟪 ☑️ | 🔧 | | |
139
+ | [prefer-array-from](https://github.com/mchevestrier/eslint-plugin-wyrm/blob/master/packages/eslint-plugin-wyrm/docs/rules/prefer-array-from.md) | Enforce using `Array.from` or `Array.fromAsync` over iterative accumulation | 🟩 ✅ 🟪 ☑️ | 🔧 | | |
140
+ | [prefer-catch-method](https://github.com/mchevestrier/eslint-plugin-wyrm/blob/master/packages/eslint-plugin-wyrm/docs/rules/prefer-catch-method.md) | Enforce usage of `Promise.prototype.catch()` when it improves readability | 🟩 ✅ 🟪 ☑️ | | 💡 | |
141
+ | [prefer-early-return](https://github.com/mchevestrier/eslint-plugin-wyrm/blob/master/packages/eslint-plugin-wyrm/docs/rules/prefer-early-return.md) | Require early returns when possible | 🟪 ☑️ | 🔧 | | |
142
+ | [prefer-eqeq-null](https://github.com/mchevestrier/eslint-plugin-wyrm/blob/master/packages/eslint-plugin-wyrm/docs/rules/prefer-eqeq-null.md) | Enforce using `x == null` instead of `x === null \|\| x === undefined` | 🟪 ☑️ | 🔧 | | |
143
+ | [prefer-finally](https://github.com/mchevestrier/eslint-plugin-wyrm/blob/master/packages/eslint-plugin-wyrm/docs/rules/prefer-finally.md) | Enforce using `finally` rather than duplicating code in `try` and `catch` blocks | 🟪 ☑️ | | 💡 | |
144
+ | [prefer-getorinsert](https://github.com/mchevestrier/eslint-plugin-wyrm/blob/master/packages/eslint-plugin-wyrm/docs/rules/prefer-getorinsert.md) | Enforce using `Map#getOrInsert` | 🟪 ☑️ | | 💡 | |
145
+ | [prefer-has](https://github.com/mchevestrier/eslint-plugin-wyrm/blob/master/packages/eslint-plugin-wyrm/docs/rules/prefer-has.md) | Enforce using `Map#has` and `Set#has` | 🟪 ☑️ | 🔧 | | |
146
+ | [prefer-in](https://github.com/mchevestrier/eslint-plugin-wyrm/blob/master/packages/eslint-plugin-wyrm/docs/rules/prefer-in.md) | Prefer `in` to `Object.hasOwn()` and `Object.prototype.hasOwnProperty.call()` | 🟪 ☑️ | | 💡 | |
147
+ | [prefer-object-keys-values](https://github.com/mchevestrier/eslint-plugin-wyrm/blob/master/packages/eslint-plugin-wyrm/docs/rules/prefer-object-keys-values.md) | Enforce using `Object.keys()` and `Object.values()` rather than `Object.entries()` | 🟪 ☑️ | | 💡 | |
148
+ | [prefer-repeat](https://github.com/mchevestrier/eslint-plugin-wyrm/blob/master/packages/eslint-plugin-wyrm/docs/rules/prefer-repeat.md) | Enforce usage of `String.prototype.repeat` | 🟩 ✅ 🟪 ☑️ | | 💡 | |
149
+ | [prefer-satisfies](https://github.com/mchevestrier/eslint-plugin-wyrm/blob/master/packages/eslint-plugin-wyrm/docs/rules/prefer-satisfies.md) | Prefer `satisfies` to type assertions | ☑️ | | 💡 | 💭 |
150
+ | [prefer-string-join](https://github.com/mchevestrier/eslint-plugin-wyrm/blob/master/packages/eslint-plugin-wyrm/docs/rules/prefer-string-join.md) | Enforce usage of `String.prototype.join` | 🟩 ✅ 🟪 ☑️ | 🔧 | | |
151
+ | [primitive-valueof](https://github.com/mchevestrier/eslint-plugin-wyrm/blob/master/packages/eslint-plugin-wyrm/docs/rules/primitive-valueof.md) | Forbid calling `.valueOf()` on a primitive | ✅ ☑️ | 🔧 | | 💭 |
152
+ | [slim-try](https://github.com/mchevestrier/eslint-plugin-wyrm/blob/master/packages/eslint-plugin-wyrm/docs/rules/slim-try.md) | Enforce moving safe statements out of `try` blocks | 🟪 ☑️ | 🔧 | | |
153
+ | [styled-button-has-type](https://github.com/mchevestrier/eslint-plugin-wyrm/blob/master/packages/eslint-plugin-wyrm/docs/rules/styled-button-has-type.md) | Disallow usage of `styled.button` without an explicit `type` attribute. | 🟩 ✅ 🟪 ☑️ | | | |
154
+ | [styled-transient-props](https://github.com/mchevestrier/eslint-plugin-wyrm/blob/master/packages/eslint-plugin-wyrm/docs/rules/styled-transient-props.md) | Enforce using transient props in styled components to avoid polluting DOM elements with unknown props | 🟩 ✅ 🟪 ☑️ | | | |
155
+ | [suspicious-map-length](https://github.com/mchevestrier/eslint-plugin-wyrm/blob/master/packages/eslint-plugin-wyrm/docs/rules/suspicious-map-length.md) | Disallow suspicious use of `.map().length` | 🟩 ✅ 🟪 ☑️ | | 💡 | |
156
+ | [template-tostring](https://github.com/mchevestrier/eslint-plugin-wyrm/blob/master/packages/eslint-plugin-wyrm/docs/rules/template-tostring.md) | Forbid calling `.toString()` inside template expressions | 🟪 ☑️ | 🔧 | | |
157
+ | [unsafe-asserted-chain](https://github.com/mchevestrier/eslint-plugin-wyrm/blob/master/packages/eslint-plugin-wyrm/docs/rules/unsafe-asserted-chain.md) | Disallow unsafe type assertions on optional chained expressions | ☑️ | | | 💭 |
158
+ | [unused-object-assign](https://github.com/mchevestrier/eslint-plugin-wyrm/blob/master/packages/eslint-plugin-wyrm/docs/rules/unused-object-assign.md) | Disallow unused `Object.assign()` expressions | 🟩 ✅ 🟪 ☑️ | | | |
159
+ | [unused-object-freeze](https://github.com/mchevestrier/eslint-plugin-wyrm/blob/master/packages/eslint-plugin-wyrm/docs/rules/unused-object-freeze.md) | Disallow unused `Object.freeze()` expressions | 🟩 ✅ 🟪 ☑️ | | | |
160
+ | [useless-as-const](https://github.com/mchevestrier/eslint-plugin-wyrm/blob/master/packages/eslint-plugin-wyrm/docs/rules/useless-as-const.md) | Forbid useless `as const` assertions | 🟪 ☑️ | | 💡 | |
161
+ | [useless-assign](https://github.com/mchevestrier/eslint-plugin-wyrm/blob/master/packages/eslint-plugin-wyrm/docs/rules/useless-assign.md) | Enforce directly returning a value instead of assigning it first to a variable | 🟪 ☑️ | 🔧 | | |
162
+ | [useless-conditional-assign](https://github.com/mchevestrier/eslint-plugin-wyrm/blob/master/packages/eslint-plugin-wyrm/docs/rules/useless-conditional-assign.md) | Enforce directly returning a value instead of conditionally assigning it first to a variable | 🟩 ✅ 🟪 ☑️ | 🔧 | | |
163
+ | [useless-intermediary-variable](https://github.com/mchevestrier/eslint-plugin-wyrm/blob/master/packages/eslint-plugin-wyrm/docs/rules/useless-intermediary-variable.md) | Disallow unnecessary intermediary variables | 🟪 ☑️ | | 💡 | |
164
+ | [useless-mock](https://github.com/mchevestrier/eslint-plugin-wyrm/blob/master/packages/eslint-plugin-wyrm/docs/rules/useless-mock.md) | Forbid useless mocks in tests | 🟪 ☑️ | | | |
165
+ | [useless-required](https://github.com/mchevestrier/eslint-plugin-wyrm/blob/master/packages/eslint-plugin-wyrm/docs/rules/useless-required.md) | Forbid unnecessary use of `Required<T>` and `Partial<T>` | ☑️ | | 💡 | 💭 |
110
166
 
111
167
  <!-- end auto-generated rules list -->
package/bin/wyrm.mjs ADDED
@@ -0,0 +1,3 @@
1
+ #!/usr/bin/env node
2
+
3
+ import '../dist/cli.mjs';
@@ -0,0 +1,14 @@
1
+ import "node:module";
2
+ //#region \0rolldown/runtime.js
3
+ var __defProp = Object.defineProperty;
4
+ var __exportAll = (all, no_symbols) => {
5
+ let target = {};
6
+ for (var name in all) __defProp(target, name, {
7
+ get: all[name],
8
+ enumerable: true
9
+ });
10
+ if (!no_symbols) __defProp(target, Symbol.toStringTag, { value: "Module" });
11
+ return target;
12
+ };
13
+ //#endregion
14
+ export { __exportAll };
package/dist/cli.d.mts ADDED
@@ -0,0 +1 @@
1
+ export { };
package/dist/cli.mjs ADDED
@@ -0,0 +1,23 @@
1
+ import plugin from "./index.mjs";
2
+ import { ESLint } from "eslint";
3
+ import { defineConfig } from "eslint/config";
4
+ //#region lib/cli.ts
5
+ await main();
6
+ async function main() {
7
+ const eslint = new ESLint({ baseConfig: defineConfig([
8
+ plugin.configs.strictTypeChecked,
9
+ { rules: {
10
+ "wyrm/no-unassigned-todo": "off",
11
+ "wyrm/discarded-expression-statement": "error"
12
+ } },
13
+ {
14
+ files: ["**/*.md", "**/package.json"],
15
+ extends: [plugin.configs.disableTypeChecked]
16
+ }
17
+ ]) });
18
+ const results = await eslint.lintFiles(["."]);
19
+ const resultText = (await eslint.loadFormatter("stylish")).format(results);
20
+ console.log(resultText);
21
+ }
22
+ //#endregion
23
+ export {};
@@ -2,7 +2,7 @@ import { FlatConfig } from "@typescript-eslint/utils/ts-eslint";
2
2
 
3
3
  //#region lib/configs/index.d.ts
4
4
  declare namespace index_d_exports {
5
- export { all, recommended, recommendedTypeChecked, recommendedTypeCheckedOnly, strict, strictOnly, strictTypeChecked, strictTypeCheckedOnly };
5
+ export { all, disableTypeChecked, recommended, recommendedTypeChecked, recommendedTypeCheckedOnly, strict, strictOnly, strictTypeChecked, strictTypeCheckedOnly };
6
6
  }
7
7
  type Config = FlatConfig.Config;
8
8
  declare const all: Config;
@@ -13,5 +13,6 @@ declare const recommendedTypeCheckedOnly: Config;
13
13
  declare const recommendedTypeChecked: Config;
14
14
  declare const strictTypeCheckedOnly: Config;
15
15
  declare const strictTypeChecked: Config;
16
+ declare const disableTypeChecked: Config;
16
17
  //#endregion
17
18
  export { index_d_exports };
@@ -1,10 +1,10 @@
1
- import { __exportAll } from "../_virtual/rolldown_runtime.mjs";
1
+ import { __exportAll } from "../_virtual/_rolldown/runtime.mjs";
2
2
  import { rules_exports } from "../rules/index.mjs";
3
3
  import { plugin } from "../plugin.mjs";
4
-
5
4
  //#region lib/configs/index.ts
6
5
  var configs_exports = /* @__PURE__ */ __exportAll({
7
6
  all: () => all,
7
+ disableTypeChecked: () => disableTypeChecked,
8
8
  recommended: () => recommended,
9
9
  recommendedTypeChecked: () => recommendedTypeChecked,
10
10
  recommendedTypeCheckedOnly: () => recommendedTypeCheckedOnly,
@@ -16,8 +16,8 @@ var configs_exports = /* @__PURE__ */ __exportAll({
16
16
  const baseConfig = { plugins: { get wyrm() {
17
17
  return plugin;
18
18
  } } };
19
- function createConfigWithRules(initialRules, configName, pred) {
20
- const filteredRules = Object.entries(initialRules).filter(([, rule]) => pred(rule)).map(([ruleName]) => [`wyrm/${ruleName}`, "error"]);
19
+ function createConfigWithRules(initialRules, configName, pred, ruleValue = "error") {
20
+ const filteredRules = Object.entries(initialRules).filter(([, rule]) => pred(rule)).map(([ruleName]) => [`wyrm/${ruleName}`, ruleValue]);
21
21
  const rules = Object.fromEntries(filteredRules);
22
22
  return {
23
23
  ...baseConfig,
@@ -71,6 +71,6 @@ const strictTypeChecked = {
71
71
  ...strictTypeCheckedOnly.rules
72
72
  }
73
73
  };
74
-
74
+ const disableTypeChecked = createConfigWithRules(rules_exports, "disableTypeChecked", (rule) => !!rule.meta.docs?.requiresTypeChecking, "off");
75
75
  //#endregion
76
- export { configs_exports };
76
+ export { configs_exports };
package/dist/index.mjs CHANGED
@@ -1,12 +1,9 @@
1
1
  import { rules_exports } from "./rules/index.mjs";
2
2
  import { configs_exports } from "./configs/index.mjs";
3
-
4
3
  //#region lib/index.ts
5
4
  const plugin = {
6
5
  rules: rules_exports,
7
6
  configs: configs_exports
8
7
  };
9
- var lib_default = plugin;
10
-
11
8
  //#endregion
12
- export { lib_default as default };
9
+ export { plugin as default };
package/dist/plugin.mjs CHANGED
@@ -1,6 +1,5 @@
1
1
  import { rules_exports } from "./rules/index.mjs";
2
2
  import { createRequire } from "node:module";
3
-
4
3
  //#region lib/plugin.ts
5
4
  const { name, version } = createRequire(import.meta.url)("../package.json");
6
5
  const plugin = {
@@ -10,6 +9,5 @@ const plugin = {
10
9
  },
11
10
  rules: rules_exports
12
11
  };
13
-
14
12
  //#endregion
15
- export { plugin };
13
+ export { plugin };
@@ -0,0 +1,9 @@
1
+ import { WyrmPluginDocs } from "../utils/createRule.mjs";
2
+ import { ESLintUtils } from "@typescript-eslint/utils";
3
+
4
+ //#region lib/rules/array-from-array.d.ts
5
+ declare const _default: ESLintUtils.RuleModule<"noArrayFromArray", [], WyrmPluginDocs, ESLintUtils.RuleListener> & {
6
+ name: string;
7
+ };
8
+ //#endregion
9
+ export { _default };
@@ -0,0 +1,56 @@
1
+ import { createRule } from "../utils/createRule.mjs";
2
+ import path from "node:path";
3
+ import { AST_NODE_TYPES, ESLintUtils } from "@typescript-eslint/utils";
4
+ //#region lib/rules/array-from-array.ts
5
+ const { name } = path.parse(import.meta.filename);
6
+ var array_from_array_default = createRule({
7
+ name,
8
+ meta: {
9
+ type: "suggestion",
10
+ docs: {
11
+ description: "Forbid calling `Array.from` on arrays",
12
+ strict: true,
13
+ requiresTypeChecking: true
14
+ },
15
+ fixable: "code",
16
+ schema: [],
17
+ messages: { noArrayFromArray: "`Array.from` should only be used on iterables. Use spread syntax to copy plain arrays." }
18
+ },
19
+ defaultOptions: [],
20
+ create(context) {
21
+ let services;
22
+ function getServices() {
23
+ services ??= ESLintUtils.getParserServices(context);
24
+ return services;
25
+ }
26
+ let checker;
27
+ function getChecker() {
28
+ checker ??= getServices().program.getTypeChecker();
29
+ return checker;
30
+ }
31
+ return { CallExpression(node) {
32
+ if (node.callee.type !== AST_NODE_TYPES.MemberExpression) return;
33
+ if (node.callee.object.type !== AST_NODE_TYPES.Identifier) return;
34
+ if (node.callee.property.type !== AST_NODE_TYPES.Identifier) return;
35
+ if (node.callee.object.name !== "Array") return;
36
+ if (node.callee.property.name !== "from") return;
37
+ const [arg1, arg2] = node.arguments;
38
+ if (!arg1) return;
39
+ const type = getServices().getTypeAtLocation(arg1);
40
+ if (!(getChecker().isArrayType(type) || getChecker().isTupleType(type))) return;
41
+ const arg1Txt = context.sourceCode.getText(arg1);
42
+ const arrTxt = arg2 ? arg1Txt : `[...${arg1Txt}]`;
43
+ const mapFnTxt = context.sourceCode.getText(arg2);
44
+ const mapTxt = arg2 ? `.map(${mapFnTxt})` : "";
45
+ context.report({
46
+ node,
47
+ messageId: "noArrayFromArray",
48
+ fix(fixer) {
49
+ return fixer.replaceText(node, `${arrTxt}${mapTxt}`);
50
+ }
51
+ });
52
+ } };
53
+ }
54
+ });
55
+ //#endregion
56
+ export { array_from_array_default as default };