@less-unsound/eslint-plugin 0.0.1

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 (338) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +112 -0
  3. package/dist/cjs/index.js +355 -0
  4. package/dist/cjs/package.json +3 -0
  5. package/dist/cjs/rules/no-accidental-mutation.js +100 -0
  6. package/dist/cjs/rules/no-ambient-dom-globals.js +181 -0
  7. package/dist/cjs/rules/no-any.js +27 -0
  8. package/dist/cjs/rules/no-arguments-object.js +122 -0
  9. package/dist/cjs/rules/no-as-type-assertion.js +44 -0
  10. package/dist/cjs/rules/no-bigint.js +74 -0
  11. package/dist/cjs/rules/no-boolean-literal-compare.js +37 -0
  12. package/dist/cjs/rules/no-broad-types.js +50 -0
  13. package/dist/cjs/rules/no-buffer.js +146 -0
  14. package/dist/cjs/rules/no-class.js +39 -0
  15. package/dist/cjs/rules/no-comma-operator.js +27 -0
  16. package/dist/cjs/rules/no-conditional-type.js +27 -0
  17. package/dist/cjs/rules/no-default-parameter.js +71 -0
  18. package/dist/cjs/rules/no-enum.js +27 -0
  19. package/dist/cjs/rules/no-eval.js +33 -0
  20. package/dist/cjs/rules/no-export-default.js +45 -0
  21. package/dist/cjs/rules/no-for-in.js +27 -0
  22. package/dist/cjs/rules/no-for-let.js +39 -0
  23. package/dist/cjs/rules/no-function-constructor.js +84 -0
  24. package/dist/cjs/rules/no-function-keyword.js +48 -0
  25. package/dist/cjs/rules/no-generic-parameter-bounds.js +34 -0
  26. package/dist/cjs/rules/no-getter-setter.js +48 -0
  27. package/dist/cjs/rules/no-global-context.js +134 -0
  28. package/dist/cjs/rules/no-import-code-extension.js +70 -0
  29. package/dist/cjs/rules/no-import-rename.js +45 -0
  30. package/dist/cjs/rules/no-import-type.js +27 -0
  31. package/dist/cjs/rules/no-in-operator.js +27 -0
  32. package/dist/cjs/rules/no-indexed-access-type.js +27 -0
  33. package/dist/cjs/rules/no-indexed-object-type.js +53 -0
  34. package/dist/cjs/rules/no-inheritance.js +65 -0
  35. package/dist/cjs/rules/no-inline-tagged-object.js +95 -0
  36. package/dist/cjs/rules/no-intersection-type.js +27 -0
  37. package/dist/cjs/rules/no-json-static-method.js +158 -0
  38. package/dist/cjs/rules/no-keyof.js +27 -0
  39. package/dist/cjs/rules/no-let.js +45 -0
  40. package/dist/cjs/rules/no-mapped-object-type.js +27 -0
  41. package/dist/cjs/rules/no-never.js +27 -0
  42. package/dist/cjs/rules/no-non-null-assertion.js +27 -0
  43. package/dist/cjs/rules/no-null.js +36 -0
  44. package/dist/cjs/rules/no-object-as-map.js +138 -0
  45. package/dist/cjs/rules/no-object-spread.js +27 -0
  46. package/dist/cjs/rules/no-object-stringification-hook.js +101 -0
  47. package/dist/cjs/rules/no-optional-parameter.js +104 -0
  48. package/dist/cjs/rules/no-optional-property.js +30 -0
  49. package/dist/cjs/rules/no-overload.js +110 -0
  50. package/dist/cjs/rules/no-param-assign.js +94 -0
  51. package/dist/cjs/rules/no-prototype-access.js +79 -0
  52. package/dist/cjs/rules/no-proxy-reflect.js +112 -0
  53. package/dist/cjs/rules/no-reexport-outside-entrypoint.js +46 -0
  54. package/dist/cjs/rules/no-regular-expression.js +93 -0
  55. package/dist/cjs/rules/no-require.js +162 -0
  56. package/dist/cjs/rules/no-rest-parameter.js +38 -0
  57. package/dist/cjs/rules/no-switch.js +27 -0
  58. package/dist/cjs/rules/no-symbol.js +33 -0
  59. package/dist/cjs/rules/no-try-catch.js +30 -0
  60. package/dist/cjs/rules/no-ts-comment-directive.js +39 -0
  61. package/dist/cjs/rules/no-tuple.js +27 -0
  62. package/dist/cjs/rules/no-type-guard.js +27 -0
  63. package/dist/cjs/rules/no-typeof-operator.js +27 -0
  64. package/dist/cjs/rules/no-typeof-type.js +27 -0
  65. package/dist/cjs/rules/no-undefined-type.js +27 -0
  66. package/dist/cjs/rules/no-unknown.js +27 -0
  67. package/dist/cjs/rules/no-untagged-object-union.js +150 -0
  68. package/dist/cjs/rules/no-utility-type.js +57 -0
  69. package/dist/cjs/rules/no-var.js +27 -0
  70. package/dist/cjs/rules/no-void-operator.js +27 -0
  71. package/dist/cjs/rules/no-while.js +33 -0
  72. package/dist/cjs/rules/require-boolean-prefix.js +179 -0
  73. package/dist/cjs/rules/require-disjoint-union.js +228 -0
  74. package/dist/cjs/rules/require-function-verb.js +293 -0
  75. package/dist/cjs/rules/require-identifier-case.js +197 -0
  76. package/dist/cjs/rules/require-kebab-case-filename.js +45 -0
  77. package/dist/cjs/rules/require-named-union-branch.js +34 -0
  78. package/dist/cjs/rules/require-readonly-array.js +49 -0
  79. package/dist/cjs/rules/require-readonly-collections.js +37 -0
  80. package/dist/cjs/rules/require-readonly-object-fields.js +32 -0
  81. package/dist/cjs/rules/require-readonly-tuple.js +33 -0
  82. package/dist/cjs/rules/require-return-type.js +85 -0
  83. package/dist/cjs/rules/require-string-template-expression.js +55 -0
  84. package/dist/cjs/utils/create-rule.js +6 -0
  85. package/dist/cjs/utils/package-entrypoint.js +69 -0
  86. package/dist/cjs/utils/readonly.js +18 -0
  87. package/dist/cjs/utils/string-case.js +12 -0
  88. package/dist/cjs/utils/type-reference.js +35 -0
  89. package/dist/esm/index.d.ts +3568 -0
  90. package/dist/esm/index.js +352 -0
  91. package/dist/esm/rules/no-accidental-mutation.d.ts +3 -0
  92. package/dist/esm/rules/no-accidental-mutation.js +97 -0
  93. package/dist/esm/rules/no-ambient-dom-globals.d.ts +3 -0
  94. package/dist/esm/rules/no-ambient-dom-globals.js +178 -0
  95. package/dist/esm/rules/no-any.d.ts +3 -0
  96. package/dist/esm/rules/no-any.js +24 -0
  97. package/dist/esm/rules/no-arguments-object.d.ts +3 -0
  98. package/dist/esm/rules/no-arguments-object.js +119 -0
  99. package/dist/esm/rules/no-as-type-assertion.d.ts +3 -0
  100. package/dist/esm/rules/no-as-type-assertion.js +41 -0
  101. package/dist/esm/rules/no-bigint.d.ts +3 -0
  102. package/dist/esm/rules/no-bigint.js +71 -0
  103. package/dist/esm/rules/no-boolean-literal-compare.d.ts +3 -0
  104. package/dist/esm/rules/no-boolean-literal-compare.js +34 -0
  105. package/dist/esm/rules/no-broad-types.d.ts +3 -0
  106. package/dist/esm/rules/no-broad-types.js +47 -0
  107. package/dist/esm/rules/no-buffer.d.ts +3 -0
  108. package/dist/esm/rules/no-buffer.js +143 -0
  109. package/dist/esm/rules/no-class.d.ts +3 -0
  110. package/dist/esm/rules/no-class.js +36 -0
  111. package/dist/esm/rules/no-comma-operator.d.ts +3 -0
  112. package/dist/esm/rules/no-comma-operator.js +24 -0
  113. package/dist/esm/rules/no-conditional-type.d.ts +3 -0
  114. package/dist/esm/rules/no-conditional-type.js +24 -0
  115. package/dist/esm/rules/no-default-parameter.d.ts +3 -0
  116. package/dist/esm/rules/no-default-parameter.js +68 -0
  117. package/dist/esm/rules/no-enum.d.ts +3 -0
  118. package/dist/esm/rules/no-enum.js +24 -0
  119. package/dist/esm/rules/no-eval.d.ts +3 -0
  120. package/dist/esm/rules/no-eval.js +30 -0
  121. package/dist/esm/rules/no-export-default.d.ts +3 -0
  122. package/dist/esm/rules/no-export-default.js +42 -0
  123. package/dist/esm/rules/no-for-in.d.ts +3 -0
  124. package/dist/esm/rules/no-for-in.js +24 -0
  125. package/dist/esm/rules/no-for-let.d.ts +3 -0
  126. package/dist/esm/rules/no-for-let.js +36 -0
  127. package/dist/esm/rules/no-function-constructor.d.ts +3 -0
  128. package/dist/esm/rules/no-function-constructor.js +81 -0
  129. package/dist/esm/rules/no-function-keyword.d.ts +3 -0
  130. package/dist/esm/rules/no-function-keyword.js +45 -0
  131. package/dist/esm/rules/no-generic-parameter-bounds.d.ts +3 -0
  132. package/dist/esm/rules/no-generic-parameter-bounds.js +31 -0
  133. package/dist/esm/rules/no-getter-setter.d.ts +3 -0
  134. package/dist/esm/rules/no-getter-setter.js +45 -0
  135. package/dist/esm/rules/no-global-context.d.ts +3 -0
  136. package/dist/esm/rules/no-global-context.js +131 -0
  137. package/dist/esm/rules/no-import-code-extension.d.ts +4 -0
  138. package/dist/esm/rules/no-import-code-extension.js +67 -0
  139. package/dist/esm/rules/no-import-rename.d.ts +3 -0
  140. package/dist/esm/rules/no-import-rename.js +42 -0
  141. package/dist/esm/rules/no-import-type.d.ts +3 -0
  142. package/dist/esm/rules/no-import-type.js +24 -0
  143. package/dist/esm/rules/no-in-operator.d.ts +3 -0
  144. package/dist/esm/rules/no-in-operator.js +24 -0
  145. package/dist/esm/rules/no-indexed-access-type.d.ts +3 -0
  146. package/dist/esm/rules/no-indexed-access-type.js +24 -0
  147. package/dist/esm/rules/no-indexed-object-type.d.ts +3 -0
  148. package/dist/esm/rules/no-indexed-object-type.js +50 -0
  149. package/dist/esm/rules/no-inheritance.d.ts +3 -0
  150. package/dist/esm/rules/no-inheritance.js +62 -0
  151. package/dist/esm/rules/no-inline-tagged-object.d.ts +5 -0
  152. package/dist/esm/rules/no-inline-tagged-object.js +92 -0
  153. package/dist/esm/rules/no-intersection-type.d.ts +3 -0
  154. package/dist/esm/rules/no-intersection-type.js +24 -0
  155. package/dist/esm/rules/no-json-static-method.d.ts +3 -0
  156. package/dist/esm/rules/no-json-static-method.js +155 -0
  157. package/dist/esm/rules/no-keyof.d.ts +3 -0
  158. package/dist/esm/rules/no-keyof.js +24 -0
  159. package/dist/esm/rules/no-let.d.ts +3 -0
  160. package/dist/esm/rules/no-let.js +42 -0
  161. package/dist/esm/rules/no-mapped-object-type.d.ts +3 -0
  162. package/dist/esm/rules/no-mapped-object-type.js +24 -0
  163. package/dist/esm/rules/no-never.d.ts +3 -0
  164. package/dist/esm/rules/no-never.js +24 -0
  165. package/dist/esm/rules/no-non-null-assertion.d.ts +3 -0
  166. package/dist/esm/rules/no-non-null-assertion.js +24 -0
  167. package/dist/esm/rules/no-null.d.ts +3 -0
  168. package/dist/esm/rules/no-null.js +33 -0
  169. package/dist/esm/rules/no-object-as-map.d.ts +3 -0
  170. package/dist/esm/rules/no-object-as-map.js +135 -0
  171. package/dist/esm/rules/no-object-spread.d.ts +3 -0
  172. package/dist/esm/rules/no-object-spread.js +24 -0
  173. package/dist/esm/rules/no-object-stringification-hook.d.ts +3 -0
  174. package/dist/esm/rules/no-object-stringification-hook.js +98 -0
  175. package/dist/esm/rules/no-optional-parameter.d.ts +3 -0
  176. package/dist/esm/rules/no-optional-parameter.js +101 -0
  177. package/dist/esm/rules/no-optional-property.d.ts +3 -0
  178. package/dist/esm/rules/no-optional-property.js +27 -0
  179. package/dist/esm/rules/no-overload.d.ts +3 -0
  180. package/dist/esm/rules/no-overload.js +107 -0
  181. package/dist/esm/rules/no-param-assign.d.ts +3 -0
  182. package/dist/esm/rules/no-param-assign.js +91 -0
  183. package/dist/esm/rules/no-prototype-access.d.ts +3 -0
  184. package/dist/esm/rules/no-prototype-access.js +76 -0
  185. package/dist/esm/rules/no-proxy-reflect.d.ts +3 -0
  186. package/dist/esm/rules/no-proxy-reflect.js +109 -0
  187. package/dist/esm/rules/no-reexport-outside-entrypoint.d.ts +3 -0
  188. package/dist/esm/rules/no-reexport-outside-entrypoint.js +43 -0
  189. package/dist/esm/rules/no-regular-expression.d.ts +3 -0
  190. package/dist/esm/rules/no-regular-expression.js +90 -0
  191. package/dist/esm/rules/no-require.d.ts +3 -0
  192. package/dist/esm/rules/no-require.js +159 -0
  193. package/dist/esm/rules/no-rest-parameter.d.ts +3 -0
  194. package/dist/esm/rules/no-rest-parameter.js +35 -0
  195. package/dist/esm/rules/no-switch.d.ts +3 -0
  196. package/dist/esm/rules/no-switch.js +24 -0
  197. package/dist/esm/rules/no-symbol.d.ts +3 -0
  198. package/dist/esm/rules/no-symbol.js +30 -0
  199. package/dist/esm/rules/no-try-catch.d.ts +3 -0
  200. package/dist/esm/rules/no-try-catch.js +27 -0
  201. package/dist/esm/rules/no-ts-comment-directive.d.ts +3 -0
  202. package/dist/esm/rules/no-ts-comment-directive.js +36 -0
  203. package/dist/esm/rules/no-tuple.d.ts +3 -0
  204. package/dist/esm/rules/no-tuple.js +24 -0
  205. package/dist/esm/rules/no-type-guard.d.ts +3 -0
  206. package/dist/esm/rules/no-type-guard.js +24 -0
  207. package/dist/esm/rules/no-typeof-operator.d.ts +3 -0
  208. package/dist/esm/rules/no-typeof-operator.js +24 -0
  209. package/dist/esm/rules/no-typeof-type.d.ts +3 -0
  210. package/dist/esm/rules/no-typeof-type.js +24 -0
  211. package/dist/esm/rules/no-undefined-type.d.ts +3 -0
  212. package/dist/esm/rules/no-undefined-type.js +24 -0
  213. package/dist/esm/rules/no-unknown.d.ts +3 -0
  214. package/dist/esm/rules/no-unknown.js +24 -0
  215. package/dist/esm/rules/no-untagged-object-union.d.ts +3 -0
  216. package/dist/esm/rules/no-untagged-object-union.js +147 -0
  217. package/dist/esm/rules/no-utility-type.d.ts +3 -0
  218. package/dist/esm/rules/no-utility-type.js +54 -0
  219. package/dist/esm/rules/no-var.d.ts +3 -0
  220. package/dist/esm/rules/no-var.js +24 -0
  221. package/dist/esm/rules/no-void-operator.d.ts +3 -0
  222. package/dist/esm/rules/no-void-operator.js +24 -0
  223. package/dist/esm/rules/no-while.d.ts +3 -0
  224. package/dist/esm/rules/no-while.js +30 -0
  225. package/dist/esm/rules/require-boolean-prefix.d.ts +4 -0
  226. package/dist/esm/rules/require-boolean-prefix.js +176 -0
  227. package/dist/esm/rules/require-disjoint-union.d.ts +5 -0
  228. package/dist/esm/rules/require-disjoint-union.js +225 -0
  229. package/dist/esm/rules/require-function-verb.d.ts +4 -0
  230. package/dist/esm/rules/require-function-verb.js +290 -0
  231. package/dist/esm/rules/require-identifier-case.d.ts +4 -0
  232. package/dist/esm/rules/require-identifier-case.js +194 -0
  233. package/dist/esm/rules/require-kebab-case-filename.d.ts +4 -0
  234. package/dist/esm/rules/require-kebab-case-filename.js +42 -0
  235. package/dist/esm/rules/require-named-union-branch.d.ts +3 -0
  236. package/dist/esm/rules/require-named-union-branch.js +31 -0
  237. package/dist/esm/rules/require-readonly-array.d.ts +3 -0
  238. package/dist/esm/rules/require-readonly-array.js +46 -0
  239. package/dist/esm/rules/require-readonly-collections.d.ts +3 -0
  240. package/dist/esm/rules/require-readonly-collections.js +34 -0
  241. package/dist/esm/rules/require-readonly-object-fields.d.ts +3 -0
  242. package/dist/esm/rules/require-readonly-object-fields.js +29 -0
  243. package/dist/esm/rules/require-readonly-tuple.d.ts +3 -0
  244. package/dist/esm/rules/require-readonly-tuple.js +30 -0
  245. package/dist/esm/rules/require-return-type.d.ts +4 -0
  246. package/dist/esm/rules/require-return-type.js +79 -0
  247. package/dist/esm/rules/require-string-template-expression.d.ts +4 -0
  248. package/dist/esm/rules/require-string-template-expression.js +52 -0
  249. package/dist/esm/utils/create-rule.d.ts +4 -0
  250. package/dist/esm/utils/create-rule.js +3 -0
  251. package/dist/esm/utils/package-entrypoint.d.ts +2 -0
  252. package/dist/esm/utils/package-entrypoint.js +64 -0
  253. package/dist/esm/utils/readonly.d.ts +2 -0
  254. package/dist/esm/utils/readonly.js +14 -0
  255. package/dist/esm/utils/string-case.d.ts +3 -0
  256. package/dist/esm/utils/string-case.js +6 -0
  257. package/dist/esm/utils/type-reference.d.ts +2 -0
  258. package/dist/esm/utils/type-reference.js +31 -0
  259. package/docs/rules/no-accidental-mutation.md +39 -0
  260. package/docs/rules/no-ambient-dom-globals.md +37 -0
  261. package/docs/rules/no-any.md +23 -0
  262. package/docs/rules/no-arguments-object.md +35 -0
  263. package/docs/rules/no-as-type-assertion.md +26 -0
  264. package/docs/rules/no-bigint.md +31 -0
  265. package/docs/rules/no-boolean-literal-compare.md +31 -0
  266. package/docs/rules/no-broad-types.md +27 -0
  267. package/docs/rules/no-buffer.md +31 -0
  268. package/docs/rules/no-class.md +56 -0
  269. package/docs/rules/no-comma-operator.md +31 -0
  270. package/docs/rules/no-conditional-type.md +23 -0
  271. package/docs/rules/no-default-parameter.md +43 -0
  272. package/docs/rules/no-enum.md +31 -0
  273. package/docs/rules/no-eval.md +27 -0
  274. package/docs/rules/no-export-default.md +28 -0
  275. package/docs/rules/no-for-in.md +23 -0
  276. package/docs/rules/no-for-let.md +31 -0
  277. package/docs/rules/no-function-constructor.md +27 -0
  278. package/docs/rules/no-function-keyword.md +37 -0
  279. package/docs/rules/no-generic-parameter-bounds.md +25 -0
  280. package/docs/rules/no-getter-setter.md +55 -0
  281. package/docs/rules/no-global-context.md +50 -0
  282. package/docs/rules/no-import-code-extension.md +39 -0
  283. package/docs/rules/no-import-rename.md +31 -0
  284. package/docs/rules/no-import-type.md +25 -0
  285. package/docs/rules/no-in-operator.md +23 -0
  286. package/docs/rules/no-indexed-access-type.md +33 -0
  287. package/docs/rules/no-indexed-object-type.md +23 -0
  288. package/docs/rules/no-inheritance.md +31 -0
  289. package/docs/rules/no-inline-tagged-object.md +41 -0
  290. package/docs/rules/no-intersection-type.md +23 -0
  291. package/docs/rules/no-json-static-method.md +46 -0
  292. package/docs/rules/no-keyof.md +35 -0
  293. package/docs/rules/no-let.md +31 -0
  294. package/docs/rules/no-mapped-object-type.md +23 -0
  295. package/docs/rules/no-never.md +35 -0
  296. package/docs/rules/no-non-null-assertion.md +23 -0
  297. package/docs/rules/no-null.md +31 -0
  298. package/docs/rules/no-object-as-map.md +49 -0
  299. package/docs/rules/no-object-spread.md +31 -0
  300. package/docs/rules/no-object-stringification-hook.md +49 -0
  301. package/docs/rules/no-optional-parameter.md +39 -0
  302. package/docs/rules/no-optional-property.md +33 -0
  303. package/docs/rules/no-overload.md +29 -0
  304. package/docs/rules/no-param-assign.md +30 -0
  305. package/docs/rules/no-prototype-access.md +43 -0
  306. package/docs/rules/no-proxy-reflect.md +39 -0
  307. package/docs/rules/no-reexport-outside-entrypoint.md +35 -0
  308. package/docs/rules/no-regular-expression.md +36 -0
  309. package/docs/rules/no-require.md +29 -0
  310. package/docs/rules/no-rest-parameter.md +23 -0
  311. package/docs/rules/no-switch.md +32 -0
  312. package/docs/rules/no-symbol.md +31 -0
  313. package/docs/rules/no-try-catch.md +37 -0
  314. package/docs/rules/no-ts-comment-directive.md +25 -0
  315. package/docs/rules/no-tuple.md +29 -0
  316. package/docs/rules/no-type-guard.md +23 -0
  317. package/docs/rules/no-typeof-operator.md +23 -0
  318. package/docs/rules/no-typeof-type.md +23 -0
  319. package/docs/rules/no-undefined-type.md +30 -0
  320. package/docs/rules/no-unknown.md +23 -0
  321. package/docs/rules/no-untagged-object-union.md +25 -0
  322. package/docs/rules/no-utility-type.md +35 -0
  323. package/docs/rules/no-var.md +27 -0
  324. package/docs/rules/no-void-operator.md +27 -0
  325. package/docs/rules/no-while.md +33 -0
  326. package/docs/rules/require-boolean-prefix.md +31 -0
  327. package/docs/rules/require-disjoint-union.md +58 -0
  328. package/docs/rules/require-function-verb.md +83 -0
  329. package/docs/rules/require-identifier-case.md +54 -0
  330. package/docs/rules/require-kebab-case-filename.md +37 -0
  331. package/docs/rules/require-named-union-branch.md +35 -0
  332. package/docs/rules/require-readonly-array.md +35 -0
  333. package/docs/rules/require-readonly-collections.md +35 -0
  334. package/docs/rules/require-readonly-object-fields.md +46 -0
  335. package/docs/rules/require-readonly-tuple.md +27 -0
  336. package/docs/rules/require-return-type.md +37 -0
  337. package/docs/rules/require-string-template-expression.md +38 -0
  338. package/package.json +70 -0
package/LICENSE ADDED
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2026 less-unsound contributors
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
package/README.md ADDED
@@ -0,0 +1,112 @@
1
+ # Less Unsound ESLint Plugin
2
+
3
+ Enforce less unsound TypeScript subset.
4
+
5
+ ## Install
6
+
7
+ ```sh
8
+ pnpm add -D @less-unsound/eslint-plugin eslint typescript @typescript-eslint/parser
9
+ ```
10
+
11
+ ## How to use
12
+
13
+ Some of these rules are overly restrictive, and it's intentional. If you have to break them, the plan is:
14
+
15
+ - create a separate file, or even a package, that will be a sandbox for this unsafe feature use;
16
+ - make the code as minimal and abstract as possible, so that it can be reused in all similar places;
17
+ - put that code into a sandbox file, and `eslint-ignore` this problem there;
18
+ - make sure to put an explanation, why you had to do this:
19
+ - for bugs in TypeScript, find or create GitHub issue and link it;
20
+ - for bugs in EcmaScript design, write why they're impossible to type properly at all;
21
+ - thoroughly cover this code with tests
22
+ - for type helpers, make sure that arbitrary types make them work the way you intended;
23
+ - for runtime helpers, write positive/negative tests, use red/green TDD to ensure tests actually fail if you implement it in a different way, try to add property-based tests with `fast-check` and compute coverage if the fix is sufficiently large.
24
+
25
+ ### Example 1
26
+
27
+ `["a", "b"].includes(x)` doesn't narrow `x` to `'a' | 'b'`. Instead of multiple `x as ('a' | 'b')` over the whole codebase, we can define a wrapper once in `sandbox/array.ts`:
28
+
29
+ ```typescript
30
+ // `extends string` is usually a bad idea, but `key is K` is an even worse idea
31
+ export const includes = <const K extends string>(
32
+ keys: readonly K[],
33
+ key: string,
34
+ ): key is K => {
35
+ // we have to do this, otherwise, the next line will complain that `key` isn't `K`
36
+ const keys1: readonly string[] = keys;
37
+ return keys1.includes(key);
38
+ };
39
+ ```
40
+
41
+ ### Example 2
42
+
43
+ ```typescript
44
+ export const object = <T>(children: { [K in keyof T]: Foo<T[K]> }): Foo<T> => { ... };
45
+ ```
46
+
47
+ - There is no way to type this properly, because, unlike real types, mapped object types have neither proper introduction nor elimination forms.
48
+ - Even though the implementation looks correct, it's overly broad: `T` might be a `number` as well. Possibly a `<T extends object>` would make it better, but most likely it will lead to even more problems.
49
+ - Worse, it might work as you expected when `object({ ... })` call is allowed to infer type of `T`, but will fail in a horrible way if someone does `object</* unexpected type */>({ ... })`.
50
+ - In fact, this whole exception from the rules for `object` might lead to huge problems, because its correctness might rely on the field order in objects, which is not guaranteed by EcmaScript standard.
51
+
52
+ Probably, a better approach would be a builder that adds fields one by one:
53
+
54
+ ```typescript
55
+ export const Point = object
56
+ .add('x', number)
57
+ .add('y', number)
58
+ .end;
59
+ ```
60
+
61
+ which is barely, but typeable without exceptions.
62
+
63
+ TL/DR: you must absolutely know what you're doing when you add exceptions.
64
+
65
+ ## Usage
66
+
67
+ ```ts
68
+ import { configs } from "@less-unsound/eslint-plugin";
69
+
70
+ export default [configs.recommended];
71
+ ```
72
+
73
+ Manual flat-config usage:
74
+
75
+ ```ts
76
+ import { plugin } from "@less-unsound/eslint-plugin";
77
+
78
+ export default [
79
+ {
80
+ plugins: {
81
+ "@less-unsound": plugin
82
+ },
83
+ rules: {
84
+ "@less-unsound/no-let": "error",
85
+ "@less-unsound/no-any": "error",
86
+ "@less-unsound/no-switch": "warn"
87
+ }
88
+ }
89
+ ];
90
+ ```
91
+
92
+ ## Exports
93
+
94
+ - `plugin`
95
+ - `rules`
96
+ - `configs.mutability`
97
+ - `configs.naming`
98
+ - `configs.oop`
99
+ - `configs.syntax`
100
+ - `configs.types`
101
+ - `configs.recommended`
102
+
103
+ ## Rule Groups
104
+
105
+ - `configs.mutability`: mutability rules and readonly requirements
106
+ - `configs.naming`: identifier, boolean, filename, and function naming rules
107
+ - `configs.oop`: class, inheritance, proxy, prototype, and similar object-model rules
108
+ - `configs.syntax`: runtime and syntax rules
109
+ - `configs.types`: type-system rules
110
+ - `configs.recommended`: the default combined rule set
111
+
112
+ Per-rule documentation lives in [docs/rules](./docs/rules).
@@ -0,0 +1,355 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.configs = exports.recommendedConfig = exports.syntaxConfig = exports.typesConfig = exports.namingConfig = exports.oopConfig = exports.mutabilityConfig = exports.plugin = exports.rules = void 0;
4
+ const no_for_let_js_1 = require("./rules/no-for-let.js");
5
+ const no_accidental_mutation_js_1 = require("./rules/no-accidental-mutation.js");
6
+ const no_ambient_dom_globals_js_1 = require("./rules/no-ambient-dom-globals.js");
7
+ const no_arguments_object_js_1 = require("./rules/no-arguments-object.js");
8
+ const no_any_js_1 = require("./rules/no-any.js");
9
+ const no_as_type_assertion_js_1 = require("./rules/no-as-type-assertion.js");
10
+ const no_bigint_js_1 = require("./rules/no-bigint.js");
11
+ const no_boolean_literal_compare_js_1 = require("./rules/no-boolean-literal-compare.js");
12
+ const no_buffer_js_1 = require("./rules/no-buffer.js");
13
+ const no_broad_types_js_1 = require("./rules/no-broad-types.js");
14
+ const no_class_js_1 = require("./rules/no-class.js");
15
+ const no_comma_operator_js_1 = require("./rules/no-comma-operator.js");
16
+ const no_conditional_type_js_1 = require("./rules/no-conditional-type.js");
17
+ const no_default_parameter_js_1 = require("./rules/no-default-parameter.js");
18
+ const no_eval_js_1 = require("./rules/no-eval.js");
19
+ const no_enum_js_1 = require("./rules/no-enum.js");
20
+ const no_export_default_js_1 = require("./rules/no-export-default.js");
21
+ const no_for_in_js_1 = require("./rules/no-for-in.js");
22
+ const no_function_constructor_js_1 = require("./rules/no-function-constructor.js");
23
+ const no_generic_parameter_bounds_js_1 = require("./rules/no-generic-parameter-bounds.js");
24
+ const no_function_keyword_js_1 = require("./rules/no-function-keyword.js");
25
+ const no_getter_setter_js_1 = require("./rules/no-getter-setter.js");
26
+ const no_global_context_js_1 = require("./rules/no-global-context.js");
27
+ const no_in_operator_js_1 = require("./rules/no-in-operator.js");
28
+ const no_indexed_object_type_js_1 = require("./rules/no-indexed-object-type.js");
29
+ const no_indexed_access_type_js_1 = require("./rules/no-indexed-access-type.js");
30
+ const no_import_code_extension_js_1 = require("./rules/no-import-code-extension.js");
31
+ const no_import_rename_js_1 = require("./rules/no-import-rename.js");
32
+ const no_import_type_js_1 = require("./rules/no-import-type.js");
33
+ const no_inheritance_js_1 = require("./rules/no-inheritance.js");
34
+ const no_inline_tagged_object_js_1 = require("./rules/no-inline-tagged-object.js");
35
+ const no_intersection_type_js_1 = require("./rules/no-intersection-type.js");
36
+ const no_json_static_method_js_1 = require("./rules/no-json-static-method.js");
37
+ const no_keyof_js_1 = require("./rules/no-keyof.js");
38
+ const no_let_js_1 = require("./rules/no-let.js");
39
+ const no_mapped_object_type_js_1 = require("./rules/no-mapped-object-type.js");
40
+ const no_never_js_1 = require("./rules/no-never.js");
41
+ const no_non_null_assertion_js_1 = require("./rules/no-non-null-assertion.js");
42
+ const no_null_js_1 = require("./rules/no-null.js");
43
+ const no_object_as_map_js_1 = require("./rules/no-object-as-map.js");
44
+ const no_object_spread_js_1 = require("./rules/no-object-spread.js");
45
+ const no_object_stringification_hook_js_1 = require("./rules/no-object-stringification-hook.js");
46
+ const no_optional_parameter_js_1 = require("./rules/no-optional-parameter.js");
47
+ const no_optional_property_js_1 = require("./rules/no-optional-property.js");
48
+ const no_overload_js_1 = require("./rules/no-overload.js");
49
+ const no_param_assign_js_1 = require("./rules/no-param-assign.js");
50
+ const no_prototype_access_js_1 = require("./rules/no-prototype-access.js");
51
+ const no_proxy_reflect_js_1 = require("./rules/no-proxy-reflect.js");
52
+ const no_require_js_1 = require("./rules/no-require.js");
53
+ const no_regular_expression_js_1 = require("./rules/no-regular-expression.js");
54
+ const no_reexport_outside_entrypoint_js_1 = require("./rules/no-reexport-outside-entrypoint.js");
55
+ const no_rest_parameter_js_1 = require("./rules/no-rest-parameter.js");
56
+ const no_symbol_js_1 = require("./rules/no-symbol.js");
57
+ const no_switch_js_1 = require("./rules/no-switch.js");
58
+ const no_try_catch_js_1 = require("./rules/no-try-catch.js");
59
+ const no_ts_comment_directive_js_1 = require("./rules/no-ts-comment-directive.js");
60
+ const no_tuple_js_1 = require("./rules/no-tuple.js");
61
+ const no_type_guard_js_1 = require("./rules/no-type-guard.js");
62
+ const no_typeof_operator_js_1 = require("./rules/no-typeof-operator.js");
63
+ const no_typeof_type_js_1 = require("./rules/no-typeof-type.js");
64
+ const no_undefined_type_js_1 = require("./rules/no-undefined-type.js");
65
+ const no_unknown_js_1 = require("./rules/no-unknown.js");
66
+ const no_untagged_object_union_js_1 = require("./rules/no-untagged-object-union.js");
67
+ const no_utility_type_js_1 = require("./rules/no-utility-type.js");
68
+ const no_var_js_1 = require("./rules/no-var.js");
69
+ const no_void_operator_js_1 = require("./rules/no-void-operator.js");
70
+ const no_while_js_1 = require("./rules/no-while.js");
71
+ const require_disjoint_union_js_1 = require("./rules/require-disjoint-union.js");
72
+ const require_boolean_prefix_js_1 = require("./rules/require-boolean-prefix.js");
73
+ const require_function_verb_js_1 = require("./rules/require-function-verb.js");
74
+ const require_identifier_case_js_1 = require("./rules/require-identifier-case.js");
75
+ const require_kebab_case_filename_js_1 = require("./rules/require-kebab-case-filename.js");
76
+ const require_named_union_branch_js_1 = require("./rules/require-named-union-branch.js");
77
+ const require_readonly_array_js_1 = require("./rules/require-readonly-array.js");
78
+ const require_readonly_collections_js_1 = require("./rules/require-readonly-collections.js");
79
+ const require_readonly_object_fields_js_1 = require("./rules/require-readonly-object-fields.js");
80
+ const require_return_type_js_1 = require("./rules/require-return-type.js");
81
+ const require_string_template_expression_js_1 = require("./rules/require-string-template-expression.js");
82
+ const require_readonly_tuple_js_1 = require("./rules/require-readonly-tuple.js");
83
+ exports.rules = Object.freeze({
84
+ "no-for-let": no_for_let_js_1.noForLetRule,
85
+ "no-accidental-mutation": no_accidental_mutation_js_1.noAccidentalMutationRule,
86
+ "no-ambient-dom-globals": no_ambient_dom_globals_js_1.noAmbientDomGlobalsRule,
87
+ "no-arguments-object": no_arguments_object_js_1.noArgumentsObjectRule,
88
+ "no-any": no_any_js_1.noAnyRule,
89
+ "no-as-type-assertion": no_as_type_assertion_js_1.noAsTypeAssertionRule,
90
+ "no-bigint": no_bigint_js_1.noBigintRule,
91
+ "no-boolean-literal-compare": no_boolean_literal_compare_js_1.noBooleanLiteralCompareRule,
92
+ "no-buffer": no_buffer_js_1.noBufferRule,
93
+ "no-broad-types": no_broad_types_js_1.noBroadTypesRule,
94
+ "no-class": no_class_js_1.noClassRule,
95
+ "no-comma-operator": no_comma_operator_js_1.noCommaOperatorRule,
96
+ "no-conditional-type": no_conditional_type_js_1.noConditionalTypeRule,
97
+ "no-default-parameter": no_default_parameter_js_1.noDefaultParameterRule,
98
+ "no-eval": no_eval_js_1.noEvalRule,
99
+ "no-enum": no_enum_js_1.noEnumRule,
100
+ "no-export-default": no_export_default_js_1.noExportDefaultRule,
101
+ "no-for-in": no_for_in_js_1.noForInRule,
102
+ "no-function-constructor": no_function_constructor_js_1.noFunctionConstructorRule,
103
+ "no-generic-parameter-bounds": no_generic_parameter_bounds_js_1.noGenericParameterBoundsRule,
104
+ "no-function-keyword": no_function_keyword_js_1.noFunctionKeywordRule,
105
+ "no-getter-setter": no_getter_setter_js_1.noGetterSetterRule,
106
+ "no-global-context": no_global_context_js_1.noGlobalContextRule,
107
+ "no-in-operator": no_in_operator_js_1.noInOperatorRule,
108
+ "no-indexed-access-type": no_indexed_access_type_js_1.noIndexedAccessTypeRule,
109
+ "no-indexed-object-type": no_indexed_object_type_js_1.noIndexedObjectTypeRule,
110
+ "no-import-code-extension": no_import_code_extension_js_1.noImportCodeExtensionRule,
111
+ "no-import-rename": no_import_rename_js_1.noImportRenameRule,
112
+ "no-import-type": no_import_type_js_1.noImportTypeRule,
113
+ "no-inheritance": no_inheritance_js_1.noInheritanceRule,
114
+ "no-inline-tagged-object": no_inline_tagged_object_js_1.noInlineTaggedObjectRule,
115
+ "no-intersection-type": no_intersection_type_js_1.noIntersectionTypeRule,
116
+ "no-json-static-method": no_json_static_method_js_1.noJsonStaticMethodRule,
117
+ "no-keyof": no_keyof_js_1.noKeyofRule,
118
+ "no-let": no_let_js_1.noLetRule,
119
+ "no-mapped-object-type": no_mapped_object_type_js_1.noMappedObjectTypeRule,
120
+ "no-never": no_never_js_1.noNeverRule,
121
+ "no-non-null-assertion": no_non_null_assertion_js_1.noNonNullAssertionRule,
122
+ "no-null": no_null_js_1.noNullRule,
123
+ "no-object-as-map": no_object_as_map_js_1.noObjectAsMapRule,
124
+ "no-object-spread": no_object_spread_js_1.noObjectSpreadRule,
125
+ "no-object-stringification-hook": no_object_stringification_hook_js_1.noObjectStringificationHookRule,
126
+ "no-optional-parameter": no_optional_parameter_js_1.noOptionalParameterRule,
127
+ "no-optional-property": no_optional_property_js_1.noOptionalPropertyRule,
128
+ "no-overload": no_overload_js_1.noOverloadRule,
129
+ "no-param-assign": no_param_assign_js_1.noParamAssignRule,
130
+ "no-prototype-access": no_prototype_access_js_1.noPrototypeAccessRule,
131
+ "no-proxy-reflect": no_proxy_reflect_js_1.noProxyReflectRule,
132
+ "no-require": no_require_js_1.noRequireRule,
133
+ "no-reexport-outside-entrypoint": no_reexport_outside_entrypoint_js_1.noReexportOutsideEntrypointRule,
134
+ "no-regular-expression": no_regular_expression_js_1.noRegularExpressionRule,
135
+ "no-rest-parameter": no_rest_parameter_js_1.noRestParameterRule,
136
+ "no-symbol": no_symbol_js_1.noSymbolRule,
137
+ "no-switch": no_switch_js_1.noSwitchRule,
138
+ "no-try-catch": no_try_catch_js_1.noTryCatchRule,
139
+ "no-ts-comment-directive": no_ts_comment_directive_js_1.noTsCommentDirectiveRule,
140
+ "no-tuple": no_tuple_js_1.noTupleRule,
141
+ "no-type-guard": no_type_guard_js_1.noTypeGuardRule,
142
+ "no-typeof-operator": no_typeof_operator_js_1.noTypeofOperatorRule,
143
+ "no-typeof-type": no_typeof_type_js_1.noTypeofTypeRule,
144
+ "no-undefined-type": no_undefined_type_js_1.noUndefinedTypeRule,
145
+ "no-unknown": no_unknown_js_1.noUnknownRule,
146
+ "no-untagged-object-union": no_untagged_object_union_js_1.noUntaggedObjectUnionRule,
147
+ "no-utility-type": no_utility_type_js_1.noUtilityTypeRule,
148
+ "no-var": no_var_js_1.noVarRule,
149
+ "no-void-operator": no_void_operator_js_1.noVoidOperatorRule,
150
+ "no-while": no_while_js_1.noWhileRule,
151
+ "require-disjoint-union": require_disjoint_union_js_1.requireDisjointUnionRule,
152
+ "require-boolean-prefix": require_boolean_prefix_js_1.requireBooleanPrefixRule,
153
+ "require-function-verb": require_function_verb_js_1.requireFunctionVerbRule,
154
+ "require-identifier-case": require_identifier_case_js_1.requireIdentifierCaseRule,
155
+ "require-kebab-case-filename": require_kebab_case_filename_js_1.requireKebabCaseFilenameRule,
156
+ "require-named-union-branch": require_named_union_branch_js_1.requireNamedUnionBranchRule,
157
+ "require-readonly-array": require_readonly_array_js_1.requireReadonlyArrayRule,
158
+ "require-readonly-collections": require_readonly_collections_js_1.requireReadonlyCollectionsRule,
159
+ "require-readonly-object-fields": require_readonly_object_fields_js_1.requireReadonlyObjectFieldsRule,
160
+ "require-return-type": require_return_type_js_1.requireReturnTypeRule,
161
+ "require-string-template-expression": require_string_template_expression_js_1.requireStringTemplateExpressionRule,
162
+ "require-readonly-tuple": require_readonly_tuple_js_1.requireReadonlyTupleRule
163
+ });
164
+ const namespace = "@less-unsound";
165
+ const packageName = "@less-unsound/eslint-plugin";
166
+ exports.plugin = Object.freeze({
167
+ meta: Object.freeze({
168
+ name: packageName,
169
+ version: "0.0.1"
170
+ }),
171
+ rules: exports.rules
172
+ });
173
+ const createConfig = (entries) => {
174
+ const namespacedRules = Object.fromEntries(entries.map(([name, level]) => [namespace + "/" + name, level]));
175
+ return Object.freeze({
176
+ plugins: Object.freeze({
177
+ [namespace]: exports.plugin
178
+ }),
179
+ rules: Object.freeze(namespacedRules)
180
+ });
181
+ };
182
+ exports.mutabilityConfig = createConfig([
183
+ ["no-for-let", "error"],
184
+ ["no-accidental-mutation", "error"],
185
+ ["no-let", "error"],
186
+ ["no-param-assign", "error"],
187
+ ["no-var", "error"],
188
+ ["require-readonly-array", "error"],
189
+ ["require-readonly-collections", "error"],
190
+ ["require-readonly-object-fields", "error"],
191
+ ["require-readonly-tuple", "error"]
192
+ ]);
193
+ exports.oopConfig = createConfig([
194
+ ["no-class", "error"],
195
+ ["no-getter-setter", "error"],
196
+ ["no-global-context", "error"],
197
+ ["no-inheritance", "error"],
198
+ ["no-object-stringification-hook", "error"],
199
+ ["no-prototype-access", "error"],
200
+ ["no-proxy-reflect", "error"]
201
+ ]);
202
+ exports.namingConfig = createConfig([
203
+ ["require-boolean-prefix", "error"],
204
+ ["require-function-verb", "error"],
205
+ ["require-identifier-case", "error"],
206
+ ["require-kebab-case-filename", "error"]
207
+ ]);
208
+ exports.typesConfig = createConfig([
209
+ ["no-any", "error"],
210
+ ["no-as-type-assertion", "error"],
211
+ ["no-broad-types", "error"],
212
+ ["no-conditional-type", "error"],
213
+ ["no-generic-parameter-bounds", "error"],
214
+ ["no-in-operator", "error"],
215
+ ["no-indexed-access-type", "error"],
216
+ ["no-indexed-object-type", "error"],
217
+ ["no-import-type", "error"],
218
+ ["no-intersection-type", "error"],
219
+ ["no-keyof", "error"],
220
+ ["no-mapped-object-type", "error"],
221
+ ["no-never", "warn"],
222
+ ["no-non-null-assertion", "error"],
223
+ ["no-tuple", "error"],
224
+ ["no-optional-property", "error"],
225
+ ["no-symbol", "error"],
226
+ ["no-overload", "error"],
227
+ ["no-ts-comment-directive", "error"],
228
+ ["no-type-guard", "error"],
229
+ ["no-typeof-operator", "error"],
230
+ ["no-typeof-type", "error"],
231
+ ["no-undefined-type", "warn"],
232
+ ["no-unknown", "error"],
233
+ ["no-utility-type", "error"],
234
+ ["require-disjoint-union", "error"],
235
+ ["require-named-union-branch", "error"],
236
+ ["require-return-type", "error"]
237
+ ]);
238
+ exports.syntaxConfig = createConfig([
239
+ ["no-ambient-dom-globals", "error"],
240
+ ["no-arguments-object", "error"],
241
+ ["no-default-parameter", "error"],
242
+ ["no-eval", "error"],
243
+ ["no-enum", "error"],
244
+ ["no-export-default", "error"],
245
+ ["no-for-in", "error"],
246
+ ["no-function-constructor", "error"],
247
+ ["no-function-keyword", "error"],
248
+ ["no-boolean-literal-compare", "error"],
249
+ ["no-buffer", "error"],
250
+ ["no-comma-operator", "error"],
251
+ ["no-inline-tagged-object", "error"],
252
+ ["no-json-static-method", "error"],
253
+ ["no-import-code-extension", "error"],
254
+ ["no-import-rename", "error"],
255
+ ["no-null", "error"],
256
+ ["no-object-as-map", "error"],
257
+ ["no-object-spread", "error"],
258
+ ["no-optional-parameter", "error"],
259
+ ["no-reexport-outside-entrypoint", "error"],
260
+ ["no-require", "error"],
261
+ ["no-regular-expression", "error"],
262
+ ["no-rest-parameter", "error"],
263
+ ["no-try-catch", "error"],
264
+ ["no-void-operator", "error"],
265
+ ["no-while", "error"],
266
+ ["require-string-template-expression", "error"]
267
+ ]);
268
+ exports.recommendedConfig = createConfig([
269
+ ["no-for-let", "error"],
270
+ ["no-any", "error"],
271
+ ["no-as-type-assertion", "error"],
272
+ ["no-accidental-mutation", "error"],
273
+ ["no-ambient-dom-globals", "error"],
274
+ ["no-arguments-object", "error"],
275
+ ["no-bigint", "warn"],
276
+ ["no-boolean-literal-compare", "error"],
277
+ ["no-buffer", "error"],
278
+ ["no-broad-types", "error"],
279
+ ["no-class", "error"],
280
+ ["no-comma-operator", "error"],
281
+ ["no-conditional-type", "error"],
282
+ ["no-default-parameter", "error"],
283
+ ["no-eval", "error"],
284
+ ["no-enum", "error"],
285
+ ["no-export-default", "error"],
286
+ ["no-for-in", "error"],
287
+ ["no-function-constructor", "error"],
288
+ ["no-function-keyword", "error"],
289
+ ["no-inline-tagged-object", "error"],
290
+ ["no-generic-parameter-bounds", "error"],
291
+ ["no-getter-setter", "error"],
292
+ ["no-global-context", "error"],
293
+ ["no-in-operator", "error"],
294
+ ["no-indexed-access-type", "error"],
295
+ ["no-indexed-object-type", "error"],
296
+ ["no-import-code-extension", "error"],
297
+ ["no-import-rename", "error"],
298
+ ["no-import-type", "error"],
299
+ ["no-inheritance", "error"],
300
+ ["no-intersection-type", "error"],
301
+ ["no-json-static-method", "error"],
302
+ ["no-keyof", "error"],
303
+ ["no-let", "error"],
304
+ ["no-mapped-object-type", "error"],
305
+ ["no-never", "warn"],
306
+ ["no-non-null-assertion", "error"],
307
+ ["no-null", "error"],
308
+ ["no-object-as-map", "error"],
309
+ ["no-object-spread", "error"],
310
+ ["no-object-stringification-hook", "error"],
311
+ ["no-optional-parameter", "error"],
312
+ ["no-optional-property", "error"],
313
+ ["no-overload", "error"],
314
+ ["no-param-assign", "error"],
315
+ ["no-prototype-access", "error"],
316
+ ["no-proxy-reflect", "error"],
317
+ ["no-reexport-outside-entrypoint", "error"],
318
+ ["no-require", "error"],
319
+ ["no-regular-expression", "error"],
320
+ ["no-rest-parameter", "error"],
321
+ ["no-symbol", "error"],
322
+ ["no-switch", "warn"],
323
+ ["no-try-catch", "error"],
324
+ ["no-ts-comment-directive", "error"],
325
+ ["no-tuple", "error"],
326
+ ["no-type-guard", "error"],
327
+ ["no-typeof-operator", "error"],
328
+ ["no-typeof-type", "error"],
329
+ ["no-undefined-type", "warn"],
330
+ ["no-unknown", "error"],
331
+ ["no-utility-type", "error"],
332
+ ["no-var", "error"],
333
+ ["no-void-operator", "error"],
334
+ ["no-while", "error"],
335
+ ["require-boolean-prefix", "error"],
336
+ ["require-disjoint-union", "error"],
337
+ ["require-function-verb", "error"],
338
+ ["require-identifier-case", "error"],
339
+ ["require-kebab-case-filename", "error"],
340
+ ["require-named-union-branch", "error"],
341
+ ["require-readonly-array", "error"],
342
+ ["require-readonly-collections", "error"],
343
+ ["require-readonly-object-fields", "error"],
344
+ ["require-return-type", "error"],
345
+ ["require-string-template-expression", "error"],
346
+ ["require-readonly-tuple", "off"]
347
+ ]);
348
+ exports.configs = Object.freeze({
349
+ mutability: exports.mutabilityConfig,
350
+ naming: exports.namingConfig,
351
+ oop: exports.oopConfig,
352
+ recommended: exports.recommendedConfig,
353
+ syntax: exports.syntaxConfig,
354
+ types: exports.typesConfig
355
+ });
@@ -0,0 +1,3 @@
1
+ {
2
+ "type": "commonjs"
3
+ }
@@ -0,0 +1,100 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.noAccidentalMutationRule = void 0;
4
+ const utils_1 = require("@typescript-eslint/utils");
5
+ const create_rule_js_1 = require("../utils/create-rule.js");
6
+ const freshArrayMethods = new Set([
7
+ "concat",
8
+ "filter",
9
+ "flat",
10
+ "flatMap",
11
+ "map",
12
+ "slice",
13
+ "toReversed",
14
+ "toSorted",
15
+ "toSpliced"
16
+ ]);
17
+ const mutatingMethods = new Set(["reverse", "sort", "splice"]);
18
+ const messageIds = Object.freeze({
19
+ forbiddenAccidentalMutation: "Accidental array mutation is not allowed on non-fresh arrays unless mutability is required for performance."
20
+ });
21
+ const getMemberName = (node) => {
22
+ if (node.computed) {
23
+ return undefined;
24
+ }
25
+ if (node.property.type !== utils_1.AST_NODE_TYPES.Identifier) {
26
+ return undefined;
27
+ }
28
+ return node.property.name;
29
+ };
30
+ const isArrayFactoryCall = (node) => {
31
+ if (node.callee.type !== utils_1.AST_NODE_TYPES.MemberExpression) {
32
+ return false;
33
+ }
34
+ const memberName = getMemberName(node.callee);
35
+ if (memberName !== "from" && memberName !== "of") {
36
+ return false;
37
+ }
38
+ if (node.callee.object.type !== utils_1.AST_NODE_TYPES.Identifier) {
39
+ return false;
40
+ }
41
+ return node.callee.object.name === "Array";
42
+ };
43
+ const isFreshArrayExpression = (node) => {
44
+ if (node.type === utils_1.AST_NODE_TYPES.ArrayExpression) {
45
+ return true;
46
+ }
47
+ if (node.type === utils_1.AST_NODE_TYPES.NewExpression) {
48
+ if (node.callee.type !== utils_1.AST_NODE_TYPES.Identifier) {
49
+ return false;
50
+ }
51
+ return node.callee.name === "Array";
52
+ }
53
+ if (node.type !== utils_1.AST_NODE_TYPES.CallExpression) {
54
+ return false;
55
+ }
56
+ if (isArrayFactoryCall(node)) {
57
+ return true;
58
+ }
59
+ if (node.callee.type !== utils_1.AST_NODE_TYPES.MemberExpression) {
60
+ return false;
61
+ }
62
+ const memberName = getMemberName(node.callee);
63
+ if (memberName === undefined) {
64
+ return false;
65
+ }
66
+ return freshArrayMethods.has(memberName);
67
+ };
68
+ exports.noAccidentalMutationRule = (0, create_rule_js_1.createRule)({
69
+ name: "no-accidental-mutation",
70
+ meta: {
71
+ type: "problem",
72
+ docs: {
73
+ description: "Disallow in-place `.sort()`, `.reverse()`, and `.splice()` on non-fresh arrays unless mutability is required for performance."
74
+ },
75
+ schema: [],
76
+ messages: messageIds
77
+ },
78
+ defaultOptions: [],
79
+ create: (context) => ({
80
+ CallExpression: (node) => {
81
+ if (node.callee.type !== utils_1.AST_NODE_TYPES.MemberExpression) {
82
+ return;
83
+ }
84
+ const memberName = getMemberName(node.callee);
85
+ if (memberName === undefined) {
86
+ return;
87
+ }
88
+ if (!mutatingMethods.has(memberName)) {
89
+ return;
90
+ }
91
+ if (isFreshArrayExpression(node.callee.object)) {
92
+ return;
93
+ }
94
+ context.report({
95
+ node,
96
+ messageId: "forbiddenAccidentalMutation"
97
+ });
98
+ }
99
+ })
100
+ });