eslint-config-typed 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (490) hide show
  1. package/LICENSE +201 -0
  2. package/README.md +6 -0
  3. package/dist/configs/cypress.d.mts +3 -0
  4. package/dist/configs/cypress.d.mts.map +1 -0
  5. package/dist/configs/cypress.mjs +28 -0
  6. package/dist/configs/cypress.mjs.map +1 -0
  7. package/dist/configs/index.d.mts +12 -0
  8. package/dist/configs/index.d.mts.map +1 -0
  9. package/dist/configs/index.mjs +12 -0
  10. package/dist/configs/index.mjs.map +1 -0
  11. package/dist/configs/jest.d.mts +3 -0
  12. package/dist/configs/jest.d.mts.map +1 -0
  13. package/dist/configs/jest.mjs +24 -0
  14. package/dist/configs/jest.mjs.map +1 -0
  15. package/dist/configs/playwright.d.mts +3 -0
  16. package/dist/configs/playwright.d.mts.map +1 -0
  17. package/dist/configs/playwright.mjs +29 -0
  18. package/dist/configs/playwright.mjs.map +1 -0
  19. package/dist/configs/plugins.d.mts +3 -0
  20. package/dist/configs/plugins.d.mts.map +1 -0
  21. package/dist/configs/plugins.mjs +81 -0
  22. package/dist/configs/plugins.mjs.map +1 -0
  23. package/dist/configs/preact.d.mts +3 -0
  24. package/dist/configs/preact.d.mts.map +1 -0
  25. package/dist/configs/preact.mjs +17 -0
  26. package/dist/configs/preact.mjs.map +1 -0
  27. package/dist/configs/react-base.d.mts +3 -0
  28. package/dist/configs/react-base.d.mts.map +1 -0
  29. package/dist/configs/react-base.mjs +38 -0
  30. package/dist/configs/react-base.mjs.map +1 -0
  31. package/dist/configs/react.d.mts +3 -0
  32. package/dist/configs/react.d.mts.map +1 -0
  33. package/dist/configs/react.mjs +16 -0
  34. package/dist/configs/react.mjs.map +1 -0
  35. package/dist/configs/testing-library.d.mts +3 -0
  36. package/dist/configs/testing-library.d.mts.map +1 -0
  37. package/dist/configs/testing-library.mjs +22 -0
  38. package/dist/configs/testing-library.mjs.map +1 -0
  39. package/dist/configs/typescript-without-rules.d.mts +6 -0
  40. package/dist/configs/typescript-without-rules.d.mts.map +1 -0
  41. package/dist/configs/typescript-without-rules.mjs +89 -0
  42. package/dist/configs/typescript-without-rules.mjs.map +1 -0
  43. package/dist/configs/typescript.d.mts +8 -0
  44. package/dist/configs/typescript.d.mts.map +1 -0
  45. package/dist/configs/typescript.mjs +80 -0
  46. package/dist/configs/typescript.mjs.map +1 -0
  47. package/dist/configs/vitest.d.mts +3 -0
  48. package/dist/configs/vitest.d.mts.map +1 -0
  49. package/dist/configs/vitest.mjs +20 -0
  50. package/dist/configs/vitest.mjs.map +1 -0
  51. package/dist/custom-rules/custom.d.mts +3 -0
  52. package/dist/custom-rules/custom.d.mts.map +1 -0
  53. package/dist/custom-rules/custom.mjs +10 -0
  54. package/dist/custom-rules/custom.mjs.map +1 -0
  55. package/dist/custom-rules/index.d.mts +3 -0
  56. package/dist/custom-rules/index.d.mts.map +1 -0
  57. package/dist/custom-rules/index.mjs +3 -0
  58. package/dist/custom-rules/index.mjs.map +1 -0
  59. package/dist/custom-rules/no-restricted-syntax2.d.mts +3 -0
  60. package/dist/custom-rules/no-restricted-syntax2.d.mts.map +1 -0
  61. package/dist/custom-rules/no-restricted-syntax2.mjs +61 -0
  62. package/dist/custom-rules/no-restricted-syntax2.mjs.map +1 -0
  63. package/dist/globals.d.mts +3 -0
  64. package/dist/index.d.mts +6 -0
  65. package/dist/index.d.mts.map +1 -0
  66. package/dist/index.mjs +58 -0
  67. package/dist/index.mjs.map +1 -0
  68. package/dist/plugins/index.d.mts +3 -0
  69. package/dist/plugins/index.d.mts.map +1 -0
  70. package/dist/plugins/index.mjs +23 -0
  71. package/dist/plugins/index.mjs.map +1 -0
  72. package/dist/plugins/total-functions/index.d.mts +3 -0
  73. package/dist/plugins/total-functions/index.d.mts.map +1 -0
  74. package/dist/plugins/total-functions/index.mjs +20 -0
  75. package/dist/plugins/total-functions/index.mjs.map +1 -0
  76. package/dist/plugins/total-functions/plugin.d.mts +3 -0
  77. package/dist/plugins/total-functions/plugin.d.mts.map +1 -0
  78. package/dist/plugins/total-functions/plugin.mjs +26 -0
  79. package/dist/plugins/total-functions/plugin.mjs.map +1 -0
  80. package/dist/plugins/total-functions/rules/common.d.mts +16 -0
  81. package/dist/plugins/total-functions/rules/common.d.mts.map +1 -0
  82. package/dist/plugins/total-functions/rules/common.mjs +49 -0
  83. package/dist/plugins/total-functions/rules/common.mjs.map +1 -0
  84. package/dist/plugins/total-functions/rules/fp-ts.d.mts +9 -0
  85. package/dist/plugins/total-functions/rules/fp-ts.d.mts.map +1 -0
  86. package/dist/plugins/total-functions/rules/fp-ts.mjs +42 -0
  87. package/dist/plugins/total-functions/rules/fp-ts.mjs.map +1 -0
  88. package/dist/plugins/total-functions/rules/index.d.mts +19 -0
  89. package/dist/plugins/total-functions/rules/index.d.mts.map +1 -0
  90. package/dist/plugins/total-functions/rules/index.mjs +19 -0
  91. package/dist/plugins/total-functions/rules/index.mjs.map +1 -0
  92. package/dist/plugins/total-functions/rules/no-enums.d.mts +3 -0
  93. package/dist/plugins/total-functions/rules/no-enums.d.mts.map +1 -0
  94. package/dist/plugins/total-functions/rules/no-enums.mjs +28 -0
  95. package/dist/plugins/total-functions/rules/no-enums.mjs.map +1 -0
  96. package/dist/plugins/total-functions/rules/no-hidden-type-assertions.d.mts +4 -0
  97. package/dist/plugins/total-functions/rules/no-hidden-type-assertions.d.mts.map +1 -0
  98. package/dist/plugins/total-functions/rules/no-hidden-type-assertions.mjs +133 -0
  99. package/dist/plugins/total-functions/rules/no-hidden-type-assertions.mjs.map +1 -0
  100. package/dist/plugins/total-functions/rules/no-nested-fp-ts-effects.d.mts +4 -0
  101. package/dist/plugins/total-functions/rules/no-nested-fp-ts-effects.d.mts.map +1 -0
  102. package/dist/plugins/total-functions/rules/no-nested-fp-ts-effects.mjs +53 -0
  103. package/dist/plugins/total-functions/rules/no-nested-fp-ts-effects.mjs.map +1 -0
  104. package/dist/plugins/total-functions/rules/no-partial-array-reduce.d.mts +4 -0
  105. package/dist/plugins/total-functions/rules/no-partial-array-reduce.d.mts.map +1 -0
  106. package/dist/plugins/total-functions/rules/no-partial-array-reduce.mjs +91 -0
  107. package/dist/plugins/total-functions/rules/no-partial-array-reduce.mjs.map +1 -0
  108. package/dist/plugins/total-functions/rules/no-partial-division.d.mts +4 -0
  109. package/dist/plugins/total-functions/rules/no-partial-division.d.mts.map +1 -0
  110. package/dist/plugins/total-functions/rules/no-partial-division.mjs +78 -0
  111. package/dist/plugins/total-functions/rules/no-partial-division.mjs.map +1 -0
  112. package/dist/plugins/total-functions/rules/no-partial-string-normalize.d.mts +4 -0
  113. package/dist/plugins/total-functions/rules/no-partial-string-normalize.d.mts.map +1 -0
  114. package/dist/plugins/total-functions/rules/no-partial-string-normalize.mjs +94 -0
  115. package/dist/plugins/total-functions/rules/no-partial-string-normalize.mjs.map +1 -0
  116. package/dist/plugins/total-functions/rules/no-partial-url-constructor.d.mts +4 -0
  117. package/dist/plugins/total-functions/rules/no-partial-url-constructor.d.mts.map +1 -0
  118. package/dist/plugins/total-functions/rules/no-partial-url-constructor.mjs +84 -0
  119. package/dist/plugins/total-functions/rules/no-partial-url-constructor.mjs.map +1 -0
  120. package/dist/plugins/total-functions/rules/no-premature-fp-ts-effects.d.mts +4 -0
  121. package/dist/plugins/total-functions/rules/no-premature-fp-ts-effects.d.mts.map +1 -0
  122. package/dist/plugins/total-functions/rules/no-premature-fp-ts-effects.mjs +44 -0
  123. package/dist/plugins/total-functions/rules/no-premature-fp-ts-effects.mjs.map +1 -0
  124. package/dist/plugins/total-functions/rules/no-unsafe-enum-assignment.d.mts +3 -0
  125. package/dist/plugins/total-functions/rules/no-unsafe-enum-assignment.d.mts.map +1 -0
  126. package/dist/plugins/total-functions/rules/no-unsafe-enum-assignment.mjs +20 -0
  127. package/dist/plugins/total-functions/rules/no-unsafe-enum-assignment.mjs.map +1 -0
  128. package/dist/plugins/total-functions/rules/no-unsafe-mutable-readonly-assignment.d.mts +3 -0
  129. package/dist/plugins/total-functions/rules/no-unsafe-mutable-readonly-assignment.d.mts.map +1 -0
  130. package/dist/plugins/total-functions/rules/no-unsafe-mutable-readonly-assignment.mjs +59 -0
  131. package/dist/plugins/total-functions/rules/no-unsafe-mutable-readonly-assignment.mjs.map +1 -0
  132. package/dist/plugins/total-functions/rules/no-unsafe-optional-property-assignment.d.mts +3 -0
  133. package/dist/plugins/total-functions/rules/no-unsafe-optional-property-assignment.d.mts.map +1 -0
  134. package/dist/plugins/total-functions/rules/no-unsafe-optional-property-assignment.mjs +20 -0
  135. package/dist/plugins/total-functions/rules/no-unsafe-optional-property-assignment.mjs.map +1 -0
  136. package/dist/plugins/total-functions/rules/no-unsafe-readonly-mutable-assignment.d.mts +3 -0
  137. package/dist/plugins/total-functions/rules/no-unsafe-readonly-mutable-assignment.d.mts.map +1 -0
  138. package/dist/plugins/total-functions/rules/no-unsafe-readonly-mutable-assignment.mjs +59 -0
  139. package/dist/plugins/total-functions/rules/no-unsafe-readonly-mutable-assignment.mjs.map +1 -0
  140. package/dist/plugins/total-functions/rules/no-unsafe-type-assertion.d.mts +4 -0
  141. package/dist/plugins/total-functions/rules/no-unsafe-type-assertion.d.mts.map +1 -0
  142. package/dist/plugins/total-functions/rules/no-unsafe-type-assertion.mjs +53 -0
  143. package/dist/plugins/total-functions/rules/no-unsafe-type-assertion.mjs.map +1 -0
  144. package/dist/plugins/total-functions/rules/require-strict-mode.d.mts +4 -0
  145. package/dist/plugins/total-functions/rules/require-strict-mode.d.mts.map +1 -0
  146. package/dist/plugins/total-functions/rules/require-strict-mode.mjs +59 -0
  147. package/dist/plugins/total-functions/rules/require-strict-mode.mjs.map +1 -0
  148. package/dist/plugins/total-functions/rules/rules.d.mts +15 -0
  149. package/dist/plugins/total-functions/rules/rules.d.mts.map +1 -0
  150. package/dist/plugins/total-functions/rules/rules.mjs +30 -0
  151. package/dist/plugins/total-functions/rules/rules.mjs.map +1 -0
  152. package/dist/plugins/total-functions/rules/unsafe-assignment-rule.d.mts +5 -0
  153. package/dist/plugins/total-functions/rules/unsafe-assignment-rule.d.mts.map +1 -0
  154. package/dist/plugins/total-functions/rules/unsafe-assignment-rule.mjs +234 -0
  155. package/dist/plugins/total-functions/rules/unsafe-assignment-rule.mjs.map +1 -0
  156. package/dist/plugins/tree-shakable/index.d.mts +3 -0
  157. package/dist/plugins/tree-shakable/index.d.mts.map +1 -0
  158. package/dist/plugins/tree-shakable/index.mjs +4 -0
  159. package/dist/plugins/tree-shakable/index.mjs.map +1 -0
  160. package/dist/plugins/tree-shakable/plugin.d.mts +3 -0
  161. package/dist/plugins/tree-shakable/plugin.d.mts.map +1 -0
  162. package/dist/plugins/tree-shakable/plugin.mjs +10 -0
  163. package/dist/plugins/tree-shakable/plugin.mjs.map +1 -0
  164. package/dist/plugins/tree-shakable/rules/import-star.d.mts +5 -0
  165. package/dist/plugins/tree-shakable/rules/import-star.d.mts.map +1 -0
  166. package/dist/plugins/tree-shakable/rules/import-star.mjs +249 -0
  167. package/dist/plugins/tree-shakable/rules/import-star.mjs.map +1 -0
  168. package/dist/plugins/tree-shakable/rules/index.d.mts +3 -0
  169. package/dist/plugins/tree-shakable/rules/index.d.mts.map +1 -0
  170. package/dist/plugins/tree-shakable/rules/index.mjs +3 -0
  171. package/dist/plugins/tree-shakable/rules/index.mjs.map +1 -0
  172. package/dist/plugins/tree-shakable/rules/rules.d.mts +4 -0
  173. package/dist/plugins/tree-shakable/rules/rules.d.mts.map +1 -0
  174. package/dist/plugins/tree-shakable/rules/rules.mjs +8 -0
  175. package/dist/plugins/tree-shakable/rules/rules.mjs.map +1 -0
  176. package/dist/rules/eslint-array-func-rules.d.mts +3 -0
  177. package/dist/rules/eslint-array-func-rules.d.mts.map +1 -0
  178. package/dist/rules/eslint-array-func-rules.mjs +11 -0
  179. package/dist/rules/eslint-array-func-rules.mjs.map +1 -0
  180. package/dist/rules/eslint-cypress-rules.d.mts +3 -0
  181. package/dist/rules/eslint-cypress-rules.d.mts.map +1 -0
  182. package/dist/rules/eslint-cypress-rules.mjs +15 -0
  183. package/dist/rules/eslint-cypress-rules.mjs.map +1 -0
  184. package/dist/rules/eslint-functional-rules.d.mts +7 -0
  185. package/dist/rules/eslint-functional-rules.d.mts.map +1 -0
  186. package/dist/rules/eslint-functional-rules.mjs +133 -0
  187. package/dist/rules/eslint-functional-rules.mjs.map +1 -0
  188. package/dist/rules/eslint-import-rules.d.mts +3 -0
  189. package/dist/rules/eslint-import-rules.d.mts.map +1 -0
  190. package/dist/rules/eslint-import-rules.mjs +112 -0
  191. package/dist/rules/eslint-import-rules.mjs.map +1 -0
  192. package/dist/rules/eslint-jest-rules.d.mts +3 -0
  193. package/dist/rules/eslint-jest-rules.d.mts.map +1 -0
  194. package/dist/rules/eslint-jest-rules.mjs +82 -0
  195. package/dist/rules/eslint-jest-rules.mjs.map +1 -0
  196. package/dist/rules/eslint-jsx-a11y-rules.d.mts +4 -0
  197. package/dist/rules/eslint-jsx-a11y-rules.d.mts.map +1 -0
  198. package/dist/rules/eslint-jsx-a11y-rules.mjs +167 -0
  199. package/dist/rules/eslint-jsx-a11y-rules.mjs.map +1 -0
  200. package/dist/rules/eslint-playwright-rules.d.mts +3 -0
  201. package/dist/rules/eslint-playwright-rules.d.mts.map +1 -0
  202. package/dist/rules/eslint-playwright-rules.mjs +62 -0
  203. package/dist/rules/eslint-playwright-rules.mjs.map +1 -0
  204. package/dist/rules/eslint-plugin-rules.d.mts +3 -0
  205. package/dist/rules/eslint-plugin-rules.d.mts.map +1 -0
  206. package/dist/rules/eslint-plugin-rules.mjs +36 -0
  207. package/dist/rules/eslint-plugin-rules.mjs.map +1 -0
  208. package/dist/rules/eslint-prefer-arrow-functions-rules.d.mts +3 -0
  209. package/dist/rules/eslint-prefer-arrow-functions-rules.d.mts.map +1 -0
  210. package/dist/rules/eslint-prefer-arrow-functions-rules.mjs +17 -0
  211. package/dist/rules/eslint-prefer-arrow-functions-rules.mjs.map +1 -0
  212. package/dist/rules/eslint-promise-rules.d.mts +3 -0
  213. package/dist/rules/eslint-promise-rules.d.mts.map +1 -0
  214. package/dist/rules/eslint-promise-rules.mjs +25 -0
  215. package/dist/rules/eslint-promise-rules.mjs.map +1 -0
  216. package/dist/rules/eslint-react-hooks-rules.d.mts +3 -0
  217. package/dist/rules/eslint-react-hooks-rules.d.mts.map +1 -0
  218. package/dist/rules/eslint-react-hooks-rules.mjs +7 -0
  219. package/dist/rules/eslint-react-hooks-rules.mjs.map +1 -0
  220. package/dist/rules/eslint-react-perf-rules.d.mts +3 -0
  221. package/dist/rules/eslint-react-perf-rules.d.mts.map +1 -0
  222. package/dist/rules/eslint-react-perf-rules.mjs +9 -0
  223. package/dist/rules/eslint-react-perf-rules.mjs.map +1 -0
  224. package/dist/rules/eslint-react-refresh-rules.d.mts +3 -0
  225. package/dist/rules/eslint-react-refresh-rules.d.mts.map +1 -0
  226. package/dist/rules/eslint-react-refresh-rules.mjs +6 -0
  227. package/dist/rules/eslint-react-refresh-rules.mjs.map +1 -0
  228. package/dist/rules/eslint-react-rules.d.mts +3 -0
  229. package/dist/rules/eslint-react-rules.d.mts.map +1 -0
  230. package/dist/rules/eslint-react-rules.mjs +141 -0
  231. package/dist/rules/eslint-react-rules.mjs.map +1 -0
  232. package/dist/rules/eslint-rules.d.mts +55 -0
  233. package/dist/rules/eslint-rules.d.mts.map +1 -0
  234. package/dist/rules/eslint-rules.mjs +441 -0
  235. package/dist/rules/eslint-rules.mjs.map +1 -0
  236. package/dist/rules/eslint-security-rules.d.mts +3 -0
  237. package/dist/rules/eslint-security-rules.d.mts.map +1 -0
  238. package/dist/rules/eslint-security-rules.mjs +19 -0
  239. package/dist/rules/eslint-security-rules.mjs.map +1 -0
  240. package/dist/rules/eslint-testing-library-rules.d.mts +3 -0
  241. package/dist/rules/eslint-testing-library-rules.d.mts.map +1 -0
  242. package/dist/rules/eslint-testing-library-rules.mjs +35 -0
  243. package/dist/rules/eslint-testing-library-rules.mjs.map +1 -0
  244. package/dist/rules/eslint-total-functions-rules.d.mts +3 -0
  245. package/dist/rules/eslint-total-functions-rules.d.mts.map +1 -0
  246. package/dist/rules/eslint-total-functions-rules.mjs +19 -0
  247. package/dist/rules/eslint-total-functions-rules.mjs.map +1 -0
  248. package/dist/rules/eslint-tree-shakable-rules.d.mts +3 -0
  249. package/dist/rules/eslint-tree-shakable-rules.d.mts.map +1 -0
  250. package/dist/rules/eslint-tree-shakable-rules.mjs +6 -0
  251. package/dist/rules/eslint-tree-shakable-rules.mjs.map +1 -0
  252. package/dist/rules/eslint-unicorn-rules.d.mts +3 -0
  253. package/dist/rules/eslint-unicorn-rules.d.mts.map +1 -0
  254. package/dist/rules/eslint-unicorn-rules.mjs +202 -0
  255. package/dist/rules/eslint-unicorn-rules.mjs.map +1 -0
  256. package/dist/rules/eslint-vitest-rules.d.mts +3 -0
  257. package/dist/rules/eslint-vitest-rules.d.mts.map +1 -0
  258. package/dist/rules/eslint-vitest-rules.mjs +75 -0
  259. package/dist/rules/eslint-vitest-rules.mjs.map +1 -0
  260. package/dist/rules/index.d.mts +23 -0
  261. package/dist/rules/index.d.mts.map +1 -0
  262. package/dist/rules/index.mjs +23 -0
  263. package/dist/rules/index.mjs.map +1 -0
  264. package/dist/rules/typescript-eslint-rules.d.mts +5 -0
  265. package/dist/rules/typescript-eslint-rules.d.mts.map +1 -0
  266. package/dist/rules/typescript-eslint-rules.mjs +379 -0
  267. package/dist/rules/typescript-eslint-rules.mjs.map +1 -0
  268. package/dist/tsconfig.json +1 -0
  269. package/dist/types/flat-config.d.mts +7 -0
  270. package/dist/types/flat-config.d.mts.map +1 -0
  271. package/dist/types/flat-config.mjs +2 -0
  272. package/dist/types/flat-config.mjs.map +1 -0
  273. package/dist/types/index.d.mts +4 -0
  274. package/dist/types/index.d.mts.map +1 -0
  275. package/dist/types/index.mjs +2 -0
  276. package/dist/types/index.mjs.map +1 -0
  277. package/dist/types/rules/eslint-array-func-rules.d.mts +103 -0
  278. package/dist/types/rules/eslint-array-func-rules.d.mts.map +1 -0
  279. package/dist/types/rules/eslint-array-func-rules.mjs +2 -0
  280. package/dist/types/rules/eslint-array-func-rules.mjs.map +1 -0
  281. package/dist/types/rules/eslint-cypress-rules.d.mts +205 -0
  282. package/dist/types/rules/eslint-cypress-rules.d.mts.map +1 -0
  283. package/dist/types/rules/eslint-cypress-rules.mjs +2 -0
  284. package/dist/types/rules/eslint-cypress-rules.mjs.map +1 -0
  285. package/dist/types/rules/eslint-deprecation-rules.d.mts +21 -0
  286. package/dist/types/rules/eslint-deprecation-rules.d.mts.map +1 -0
  287. package/dist/types/rules/eslint-deprecation-rules.mjs +2 -0
  288. package/dist/types/rules/eslint-deprecation-rules.mjs.map +1 -0
  289. package/dist/types/rules/eslint-functional-rules.d.mts +3767 -0
  290. package/dist/types/rules/eslint-functional-rules.d.mts.map +1 -0
  291. package/dist/types/rules/eslint-functional-rules.mjs +2 -0
  292. package/dist/types/rules/eslint-functional-rules.mjs.map +1 -0
  293. package/dist/types/rules/eslint-import-rules.d.mts +2082 -0
  294. package/dist/types/rules/eslint-import-rules.d.mts.map +1 -0
  295. package/dist/types/rules/eslint-import-rules.mjs +2 -0
  296. package/dist/types/rules/eslint-import-rules.mjs.map +1 -0
  297. package/dist/types/rules/eslint-jest-rules.d.mts +1576 -0
  298. package/dist/types/rules/eslint-jest-rules.d.mts.map +1 -0
  299. package/dist/types/rules/eslint-jest-rules.mjs +2 -0
  300. package/dist/types/rules/eslint-jest-rules.mjs.map +1 -0
  301. package/dist/types/rules/eslint-jsx-a11y-rules.d.mts +1679 -0
  302. package/dist/types/rules/eslint-jsx-a11y-rules.d.mts.map +1 -0
  303. package/dist/types/rules/eslint-jsx-a11y-rules.mjs +2 -0
  304. package/dist/types/rules/eslint-jsx-a11y-rules.mjs.map +1 -0
  305. package/dist/types/rules/eslint-playwright-rules.d.mts +1302 -0
  306. package/dist/types/rules/eslint-playwright-rules.d.mts.map +1 -0
  307. package/dist/types/rules/eslint-playwright-rules.mjs +2 -0
  308. package/dist/types/rules/eslint-playwright-rules.mjs.map +1 -0
  309. package/dist/types/rules/eslint-plugin-rules.d.mts +814 -0
  310. package/dist/types/rules/eslint-plugin-rules.d.mts.map +1 -0
  311. package/dist/types/rules/eslint-plugin-rules.mjs +2 -0
  312. package/dist/types/rules/eslint-plugin-rules.mjs.map +1 -0
  313. package/dist/types/rules/eslint-prefer-arrow-functions-rules.d.mts +82 -0
  314. package/dist/types/rules/eslint-prefer-arrow-functions-rules.d.mts.map +1 -0
  315. package/dist/types/rules/eslint-prefer-arrow-functions-rules.mjs +2 -0
  316. package/dist/types/rules/eslint-prefer-arrow-functions-rules.mjs.map +1 -0
  317. package/dist/types/rules/eslint-promise-rules.d.mts +503 -0
  318. package/dist/types/rules/eslint-promise-rules.d.mts.map +1 -0
  319. package/dist/types/rules/eslint-promise-rules.mjs +2 -0
  320. package/dist/types/rules/eslint-promise-rules.mjs.map +1 -0
  321. package/dist/types/rules/eslint-react-hooks-rules.d.mts +70 -0
  322. package/dist/types/rules/eslint-react-hooks-rules.d.mts.map +1 -0
  323. package/dist/types/rules/eslint-react-hooks-rules.mjs +2 -0
  324. package/dist/types/rules/eslint-react-hooks-rules.mjs.map +1 -0
  325. package/dist/types/rules/eslint-react-perf-rules.d.mts +196 -0
  326. package/dist/types/rules/eslint-react-perf-rules.d.mts.map +1 -0
  327. package/dist/types/rules/eslint-react-perf-rules.mjs +2 -0
  328. package/dist/types/rules/eslint-react-perf-rules.mjs.map +1 -0
  329. package/dist/types/rules/eslint-react-refresh-rules.d.mts +51 -0
  330. package/dist/types/rules/eslint-react-refresh-rules.d.mts.map +1 -0
  331. package/dist/types/rules/eslint-react-refresh-rules.mjs +2 -0
  332. package/dist/types/rules/eslint-react-refresh-rules.mjs.map +1 -0
  333. package/dist/types/rules/eslint-react-rules.d.mts +4592 -0
  334. package/dist/types/rules/eslint-react-rules.d.mts.map +1 -0
  335. package/dist/types/rules/eslint-react-rules.mjs +2 -0
  336. package/dist/types/rules/eslint-react-rules.mjs.map +1 -0
  337. package/dist/types/rules/eslint-rules.d.mts +12863 -0
  338. package/dist/types/rules/eslint-rules.d.mts.map +1 -0
  339. package/dist/types/rules/eslint-rules.mjs +2 -0
  340. package/dist/types/rules/eslint-rules.mjs.map +1 -0
  341. package/dist/types/rules/eslint-security-rules.d.mts +253 -0
  342. package/dist/types/rules/eslint-security-rules.d.mts.map +1 -0
  343. package/dist/types/rules/eslint-security-rules.mjs +2 -0
  344. package/dist/types/rules/eslint-security-rules.mjs.map +1 -0
  345. package/dist/types/rules/eslint-strict-dependencies-rules.d.mts +75 -0
  346. package/dist/types/rules/eslint-strict-dependencies-rules.d.mts.map +1 -0
  347. package/dist/types/rules/eslint-strict-dependencies-rules.mjs +2 -0
  348. package/dist/types/rules/eslint-strict-dependencies-rules.mjs.map +1 -0
  349. package/dist/types/rules/eslint-testing-library-rules.d.mts +814 -0
  350. package/dist/types/rules/eslint-testing-library-rules.d.mts.map +1 -0
  351. package/dist/types/rules/eslint-testing-library-rules.mjs +2 -0
  352. package/dist/types/rules/eslint-testing-library-rules.mjs.map +1 -0
  353. package/dist/types/rules/eslint-total-functions-rules.d.mts +197 -0
  354. package/dist/types/rules/eslint-total-functions-rules.d.mts.map +1 -0
  355. package/dist/types/rules/eslint-total-functions-rules.mjs +2 -0
  356. package/dist/types/rules/eslint-total-functions-rules.mjs.map +1 -0
  357. package/dist/types/rules/eslint-tree-shakable-rules.d.mts +19 -0
  358. package/dist/types/rules/eslint-tree-shakable-rules.d.mts.map +1 -0
  359. package/dist/types/rules/eslint-tree-shakable-rules.mjs +2 -0
  360. package/dist/types/rules/eslint-tree-shakable-rules.mjs.map +1 -0
  361. package/dist/types/rules/eslint-unicorn-rules.d.mts +3544 -0
  362. package/dist/types/rules/eslint-unicorn-rules.d.mts.map +1 -0
  363. package/dist/types/rules/eslint-unicorn-rules.mjs +2 -0
  364. package/dist/types/rules/eslint-unicorn-rules.mjs.map +1 -0
  365. package/dist/types/rules/eslint-vitest-rules.d.mts +1461 -0
  366. package/dist/types/rules/eslint-vitest-rules.d.mts.map +1 -0
  367. package/dist/types/rules/eslint-vitest-rules.mjs +2 -0
  368. package/dist/types/rules/eslint-vitest-rules.mjs.map +1 -0
  369. package/dist/types/rules/index.d.mts +25 -0
  370. package/dist/types/rules/index.d.mts.map +1 -0
  371. package/dist/types/rules/index.mjs +2 -0
  372. package/dist/types/rules/index.mjs.map +1 -0
  373. package/dist/types/rules/typescript-eslint-rules.d.mts +9150 -0
  374. package/dist/types/rules/typescript-eslint-rules.d.mts.map +1 -0
  375. package/dist/types/rules/typescript-eslint-rules.mjs +2 -0
  376. package/dist/types/rules/typescript-eslint-rules.mjs.map +1 -0
  377. package/dist/types/types.d.mts +8 -0
  378. package/dist/types/types.d.mts.map +1 -0
  379. package/dist/types/types.mjs +2 -0
  380. package/dist/types/types.mjs.map +1 -0
  381. package/dist/types.d.mts +2 -0
  382. package/package.json +129 -0
  383. package/src/configs/cypress.mts +27 -0
  384. package/src/configs/index.mts +11 -0
  385. package/src/configs/jest.mts +23 -0
  386. package/src/configs/playwright.mts +28 -0
  387. package/src/configs/plugins.mts +123 -0
  388. package/src/configs/preact.mts +17 -0
  389. package/src/configs/react-base.mts +41 -0
  390. package/src/configs/react.mts +17 -0
  391. package/src/configs/testing-library.mts +21 -0
  392. package/src/configs/typescript-without-rules.mts +94 -0
  393. package/src/configs/typescript.mts +91 -0
  394. package/src/configs/vitest.mts +19 -0
  395. package/src/custom-rules/custom.mts +8 -0
  396. package/src/custom-rules/index.mts +2 -0
  397. package/src/custom-rules/no-restricted-syntax2.mts +79 -0
  398. package/src/globals.d.mts +3 -0
  399. package/src/index.mts +5 -0
  400. package/src/plugins/index.mts +2 -0
  401. package/src/plugins/total-functions/index.mts +2 -0
  402. package/src/plugins/total-functions/plugin.mts +8 -0
  403. package/src/plugins/total-functions/rules/common.mts +81 -0
  404. package/src/plugins/total-functions/rules/fp-ts.mts +57 -0
  405. package/src/plugins/total-functions/rules/index.mts +18 -0
  406. package/src/plugins/total-functions/rules/no-enums.mts +26 -0
  407. package/src/plugins/total-functions/rules/no-enums.test.mts +65 -0
  408. package/src/plugins/total-functions/rules/no-hidden-type-assertions.mts +207 -0
  409. package/src/plugins/total-functions/rules/no-hidden-type-assertions.test.mts +287 -0
  410. package/src/plugins/total-functions/rules/no-nested-fp-ts-effects.mts +67 -0
  411. package/src/plugins/total-functions/rules/no-nested-fp-ts-effects.test.mts +150 -0
  412. package/src/plugins/total-functions/rules/no-partial-array-reduce.mts +126 -0
  413. package/src/plugins/total-functions/rules/no-partial-array-reduce.test.mts +270 -0
  414. package/src/plugins/total-functions/rules/no-partial-division.mts +107 -0
  415. package/src/plugins/total-functions/rules/no-partial-division.test.mts +233 -0
  416. package/src/plugins/total-functions/rules/no-partial-string-normalize.mts +133 -0
  417. package/src/plugins/total-functions/rules/no-partial-string-normalize.test.mts +146 -0
  418. package/src/plugins/total-functions/rules/no-partial-url-constructor.mts +100 -0
  419. package/src/plugins/total-functions/rules/no-partial-url-constructor.test.mts +152 -0
  420. package/src/plugins/total-functions/rules/no-premature-fp-ts-effects.mts +51 -0
  421. package/src/plugins/total-functions/rules/no-premature-fp-ts-effects.test.mts +108 -0
  422. package/src/plugins/total-functions/rules/no-unsafe-enum-assignment.mts +19 -0
  423. package/src/plugins/total-functions/rules/no-unsafe-mutable-readonly-assignment.mts +99 -0
  424. package/src/plugins/total-functions/rules/no-unsafe-mutable-readonly-assignment.test.mts +830 -0
  425. package/src/plugins/total-functions/rules/no-unsafe-optional-property-assignment.mts +19 -0
  426. package/src/plugins/total-functions/rules/no-unsafe-readonly-mutable-assignment.mts +99 -0
  427. package/src/plugins/total-functions/rules/no-unsafe-readonly-mutable-assignment.test.mts +626 -0
  428. package/src/plugins/total-functions/rules/no-unsafe-type-assertion.mts +65 -0
  429. package/src/plugins/total-functions/rules/no-unsafe-type-assertion.test.mts +269 -0
  430. package/src/plugins/total-functions/rules/require-strict-mode.mts +65 -0
  431. package/src/plugins/total-functions/rules/require-strict-mode.test.mts +92 -0
  432. package/src/plugins/total-functions/rules/rules.mts +28 -0
  433. package/src/plugins/total-functions/rules/unsafe-assignment-rule.mts +401 -0
  434. package/src/plugins/tree-shakable/index.mts +2 -0
  435. package/src/plugins/tree-shakable/plugin.mts +8 -0
  436. package/src/plugins/tree-shakable/rules/import-star.mts +266 -0
  437. package/src/plugins/tree-shakable/rules/import-star.test.mts +174 -0
  438. package/src/plugins/tree-shakable/rules/index.mts +2 -0
  439. package/src/plugins/tree-shakable/rules/rules.mts +6 -0
  440. package/src/rules/eslint-array-func-rules.mts +10 -0
  441. package/src/rules/eslint-cypress-rules.mts +14 -0
  442. package/src/rules/eslint-functional-rules.mts +148 -0
  443. package/src/rules/eslint-import-rules.mts +124 -0
  444. package/src/rules/eslint-jest-rules.mts +84 -0
  445. package/src/rules/eslint-jsx-a11y-rules.mts +178 -0
  446. package/src/rules/eslint-playwright-rules.mts +63 -0
  447. package/src/rules/eslint-plugin-rules.mts +35 -0
  448. package/src/rules/eslint-prefer-arrow-functions-rules.mts +16 -0
  449. package/src/rules/eslint-promise-rules.mts +26 -0
  450. package/src/rules/eslint-react-hooks-rules.mts +6 -0
  451. package/src/rules/eslint-react-perf-rules.mts +8 -0
  452. package/src/rules/eslint-react-refresh-rules.mts +5 -0
  453. package/src/rules/eslint-react-rules.mts +159 -0
  454. package/src/rules/eslint-rules.mts +462 -0
  455. package/src/rules/eslint-security-rules.mts +18 -0
  456. package/src/rules/eslint-testing-library-rules.mts +35 -0
  457. package/src/rules/eslint-total-functions-rules.mts +22 -0
  458. package/src/rules/eslint-tree-shakable-rules.mts +5 -0
  459. package/src/rules/eslint-unicorn-rules.mts +209 -0
  460. package/src/rules/eslint-vitest-rules.mts +82 -0
  461. package/src/rules/index.mts +22 -0
  462. package/src/rules/typescript-eslint-rules.mts +413 -0
  463. package/src/types/flat-config.mts +13 -0
  464. package/src/types/index.mts +3 -0
  465. package/src/types/rules/eslint-array-func-rules.mts +109 -0
  466. package/src/types/rules/eslint-cypress-rules.mts +221 -0
  467. package/src/types/rules/eslint-deprecation-rules.mts +22 -0
  468. package/src/types/rules/eslint-functional-rules.mts +4071 -0
  469. package/src/types/rules/eslint-import-rules.mts +2251 -0
  470. package/src/types/rules/eslint-jest-rules.mts +1705 -0
  471. package/src/types/rules/eslint-jsx-a11y-rules.mts +1866 -0
  472. package/src/types/rules/eslint-playwright-rules.mts +1402 -0
  473. package/src/types/rules/eslint-plugin-rules.mts +885 -0
  474. package/src/types/rules/eslint-prefer-arrow-functions-rules.mts +89 -0
  475. package/src/types/rules/eslint-promise-rules.mts +547 -0
  476. package/src/types/rules/eslint-react-hooks-rules.mts +78 -0
  477. package/src/types/rules/eslint-react-perf-rules.mts +215 -0
  478. package/src/types/rules/eslint-react-refresh-rules.mts +58 -0
  479. package/src/types/rules/eslint-react-rules.mts +5075 -0
  480. package/src/types/rules/eslint-rules.mts +13614 -0
  481. package/src/types/rules/eslint-security-rules.mts +267 -0
  482. package/src/types/rules/eslint-strict-dependencies-rules.mts +84 -0
  483. package/src/types/rules/eslint-testing-library-rules.mts +887 -0
  484. package/src/types/rules/eslint-total-functions-rules.mts +209 -0
  485. package/src/types/rules/eslint-tree-shakable-rules.mts +20 -0
  486. package/src/types/rules/eslint-unicorn-rules.mts +3796 -0
  487. package/src/types/rules/eslint-vitest-rules.mts +1575 -0
  488. package/src/types/rules/index.mts +24 -0
  489. package/src/types/rules/typescript-eslint-rules.mts +9992 -0
  490. package/src/types/types.mts +7 -0
@@ -0,0 +1,830 @@
1
+ import parser from '@typescript-eslint/parser';
2
+ import { RuleTester } from '@typescript-eslint/rule-tester';
3
+ import { AST_NODE_TYPES } from '@typescript-eslint/utils';
4
+ import { noUnsafeMutableReadonlyAssignment } from './no-unsafe-mutable-readonly-assignment.mjs';
5
+
6
+ const ruleTester = new RuleTester({
7
+ languageOptions: {
8
+ parserOptions: {
9
+ sourceType: 'module',
10
+ project: './tsconfig.tests.json',
11
+ },
12
+ parser,
13
+ },
14
+ });
15
+
16
+ ruleTester.run(
17
+ 'no-unsafe-mutable-readonly-assignment',
18
+ noUnsafeMutableReadonlyAssignment,
19
+ {
20
+ valid: [
21
+ /** Call expressions */
22
+ // zero parameters
23
+ {
24
+ filename: 'file.ts',
25
+ code: `
26
+ const foo = () => {
27
+ return undefined;
28
+ };
29
+ foo();
30
+ `,
31
+ },
32
+ // zero parameters with extra argument (TypeScript will catch this so we don't flag it)
33
+ {
34
+ filename: 'file.ts',
35
+ code: `
36
+ const foo = () => {
37
+ return undefined;
38
+ };
39
+ foo("");
40
+ `,
41
+ },
42
+ // non-object parameter
43
+ {
44
+ filename: 'file.ts',
45
+ code: `
46
+ const foo = (a: string) => {
47
+ return undefined;
48
+ };
49
+ foo("a");
50
+ `,
51
+ },
52
+ // missing arguments (TypeScript will catch this so we don't flag it)
53
+ {
54
+ filename: 'file.ts',
55
+ code: `
56
+ const foo = (a: string) => {
57
+ return undefined;
58
+ };
59
+ foo();
60
+ `,
61
+ },
62
+ // readonly -> readonly (nested object; type doesn't change)
63
+ {
64
+ filename: 'file.ts',
65
+ code: `
66
+ type ReadonlyA = { readonly a: { readonly b: string } };
67
+ const func = (param: ReadonlyA): void => {
68
+ return undefined;
69
+ };
70
+ const readonlyA = { a: { b: "" } } as const;
71
+ func(readonlyA);
72
+ `,
73
+ },
74
+ // mutable -> mutable (type doesn't change)
75
+ {
76
+ filename: 'file.ts',
77
+ code: `
78
+ type MutableA = {a: string};
79
+ const foo = (mut: MutableA) => {
80
+ mut.a = "whoops";
81
+ };
82
+ const mut: MutableA = { a: "" };
83
+ foo(mut);
84
+ `,
85
+ },
86
+ // object literal -> mutable (no reference to object retained)
87
+ {
88
+ filename: 'file.ts',
89
+ code: `
90
+ type MutableA = {a: string};
91
+ const foo = (mut: MutableA) => {
92
+ mut.a = "whoops";
93
+ };
94
+ foo({ a: "" });
95
+ `,
96
+ },
97
+ // object literal -> mutable (mutable reference to property retained)
98
+ {
99
+ filename: 'file.ts',
100
+ code: `
101
+ type MutableB = { b: string };
102
+ type MutableA = { readonly a: MutableB };
103
+ const func = (param: MutableA): void => {
104
+ return undefined;
105
+ };
106
+ const b: MutableB = { b: "" };
107
+ func({ a: b } as const);
108
+ `,
109
+ },
110
+ // object literal -> readonly (readonly reference to property retained)
111
+ {
112
+ filename: 'file.ts',
113
+ code: `
114
+ type ReadonlyB = { readonly b: string };
115
+ type ReadonlyA = { readonly a: ReadonlyB };
116
+ const func = (param: ReadonlyA): void => {
117
+ return undefined;
118
+ };
119
+ const b: ReadonlyB = { b: "" } as const;
120
+ func({ a: b } as const);
121
+ `,
122
+ },
123
+ // object literal -> readonly (no reference to object or its property retained)
124
+ {
125
+ filename: 'file.ts',
126
+ code: `
127
+ type ReadonlyB = { readonly b: string };
128
+ type ReadonlyA = { readonly a: ReadonlyB };
129
+ const func = (param: ReadonlyA): void => {
130
+ return undefined;
131
+ };
132
+ func({ a: { b: "" } } as const);
133
+ `,
134
+ },
135
+ // mutable (union) -> mutable
136
+ {
137
+ filename: 'file.ts',
138
+ code: `
139
+ type MutableA = {a: string};
140
+ const foo = (mut: MutableA) => {
141
+ mut.a = "whoops";
142
+ };
143
+ const mut: MutableA | number = { a: "" };
144
+ foo(mut);
145
+ `,
146
+ },
147
+ // mutable -> mutable (union)
148
+ {
149
+ filename: 'file.ts',
150
+ code: `
151
+ type MutableA = {a: string};
152
+ const foo = (mut: MutableA | number): void => {
153
+ return;
154
+ };
155
+ const mut: MutableA = { a: "" };
156
+ foo(mut);
157
+ `,
158
+ },
159
+ // multiple type signatures (readonly -> readonly)
160
+ {
161
+ filename: 'file.ts',
162
+ code: `
163
+ type ReadonlyA = { readonly a: string };
164
+
165
+ export function func(a: number): number;
166
+ export function func(a: ReadonlyA): ReadonlyA;
167
+ export function func(a: any): any {
168
+ return a;
169
+ }
170
+
171
+ const readonlyA: ReadonlyA = { a: "" } as const;
172
+ func(readonlyA);
173
+ `,
174
+ },
175
+ // multiple type signatures (no matching signature)
176
+ // we don't bother flagging this because TypeScript itself will catch it
177
+ {
178
+ filename: 'file.ts',
179
+ code: `
180
+ type ReadonlyA = { readonly a: string };
181
+
182
+ export function func(a: number): number;
183
+ export function func(a: string): string;
184
+ export function func(a: any): any {
185
+ return a;
186
+ }
187
+
188
+ const readonlyA: ReadonlyA = { a: "" } as const;
189
+ func(readonlyA);
190
+ `,
191
+ },
192
+ // readonly array concat.
193
+ {
194
+ filename: 'file.ts',
195
+ code: `
196
+ const arr: ReadonlyArray<never> = [] as const;
197
+ const foo = arr.concat(arr, arr);
198
+ `,
199
+ },
200
+ // TODO: https://github.com/danielnixon/eslint-plugin-total-functions/issues/132
201
+ // // mutable array concat.
202
+ // {
203
+ // filename: "file.ts",
204
+ // code: `
205
+ // const arr: Array<never> = [];
206
+ // const foo = arr.concat(arr, arr);
207
+ // `,
208
+ // },
209
+ // // Mixed mutable and readonly array concat.
210
+ // {
211
+ // filename: "file.ts",
212
+ // code: `
213
+ // const ro: ReadonlyArray<never> = [] as const;
214
+ // const mut: Array<never> = [];
215
+ // const foo = ro.concat(ro, mut);
216
+ // `,
217
+ // },
218
+ // mixed (union) -> mixed (union)
219
+ // The `readonly`s align and `mutable`s align, so no surprising mutation can arise.
220
+ {
221
+ filename: 'file.ts',
222
+ code: `
223
+ type MutableA = { a: string };
224
+ type ReadonlyB = { readonly b: string };
225
+ const func = (foo: MutableA | ReadonlyB): void => {
226
+ return;
227
+ };
228
+ const foo: MutableA | ReadonlyB = Date.now() > 0 ? { a: "" } : { b: "" } as const;
229
+ func(foo);
230
+ `,
231
+ },
232
+ // readonly array of readonly object -> readonly array of readonly object
233
+ {
234
+ filename: 'file.ts',
235
+ code: `
236
+ type Obj = { readonly foo: string };
237
+ const foo = (a: ReadonlyArray<Obj>): number => a.length;
238
+ const arr: ReadonlyArray<Obj> = [] as const;
239
+ foo(arr);
240
+ `,
241
+ },
242
+ /** Assignment expressions */
243
+ // TODO
244
+ // Array safe mutable to readonly assignment with chained array operations.
245
+ {
246
+ filename: 'file.ts',
247
+ code: `
248
+ const fooArray: readonly string[] = ["test"] as const;
249
+ const nextArray: readonly string[] = fooArray.filter((v) => v.length > 0).map((v) => v.length.toString());
250
+ `,
251
+ },
252
+ // Array safe mutable to readonly assignment. (array.filter)
253
+ {
254
+ filename: 'file.ts',
255
+ code: `
256
+ const fooArray: readonly string[] = [""] as const;
257
+ const nextArray: readonly string[] = fooArray.filter((v) => v.length > 0);
258
+ `,
259
+ },
260
+ // Array safe mutable to readonly assignment. (array.map)
261
+ {
262
+ filename: 'file.ts',
263
+ code: `
264
+ const fooArray: readonly string[] = ["test"] as const;
265
+ const nextArray: readonly string[] = fooArray.map((v) => v.length.toString());
266
+ `,
267
+ },
268
+ // Array safe mutable to readonly assignment. (array.concat)
269
+ {
270
+ filename: 'file.ts',
271
+ code: `
272
+ const fooArray: readonly string[] = ["test-1"] as const;
273
+ const booArray: readonly string[] = ["test-2"] as const;
274
+ const nextArray: readonly string[] = fooArray.concat(booArray);
275
+ `,
276
+ },
277
+ // Array safe mutable to readonly assignment. (array.flatMap)
278
+ {
279
+ filename: 'file.ts',
280
+ code: `
281
+ const fooArray: readonly string[][] = [["test"]] as const;
282
+ const nextArray: readonly string[] = fooArray.flatMap((v) => v.length.toString());
283
+ `,
284
+ },
285
+ // Array safe mutable to readonly assignment. (array.flat)
286
+ {
287
+ filename: 'file.ts',
288
+ code: `
289
+ const fooArray: readonly string[][] = [["test"]] as const;
290
+ const nextArray: readonly string[] = fooArray.flat();
291
+ `,
292
+ },
293
+ // Array safe mutable to readonly assignment. (array.slice)
294
+ {
295
+ filename: 'file.ts',
296
+ code: `
297
+ const fooArray: readonly string[] = ["test"] as const;
298
+ const nextArray: readonly string[] = fooArray.slice();
299
+ `,
300
+ },
301
+ /** Return statement */
302
+ // mutable -> mutable (function return)
303
+ {
304
+ filename: 'file.ts',
305
+ code: `
306
+ type MutableA = { a: string };
307
+ type ReadonlyA = { readonly a: string };
308
+
309
+ function foo(): MutableA {
310
+ const ma: MutableA = { a: "" };
311
+ return ma;
312
+ }
313
+ `,
314
+ },
315
+ // readonly -> readonly (function return)
316
+ {
317
+ filename: 'file.ts',
318
+ code: `
319
+ type MutableA = { a: string };
320
+ type ReadonlyA = { readonly a: string };
321
+
322
+ function foo(): ReadonlyA {
323
+ const ma: ReadonlyA = { a: "" } as const;
324
+ return ma;
325
+ }
326
+ `,
327
+ },
328
+ // mutable -> mutable (type changes)
329
+ {
330
+ filename: 'file.ts',
331
+ code: `
332
+ type MutableA = { a: string };
333
+ type MutableB = { a: string | null };
334
+ const foo = (mut: MutableB): void => {
335
+ mut.a = null; // whoops
336
+ };
337
+ const mut: MutableA = { a: "" };
338
+ foo(mut);
339
+ `,
340
+ },
341
+ // tuple -> readonly array (nested objected property)
342
+ {
343
+ filename: 'file.ts',
344
+ code: `
345
+ type Foo = {
346
+ readonly foo: ReadonlyArray<{
347
+ readonly a: string;
348
+ readonly b: string;
349
+ }>;
350
+ };
351
+
352
+ const f: Foo = {
353
+ foo: [{
354
+ a: "",
355
+ b: "",
356
+ }],
357
+ } as const;
358
+ `,
359
+ },
360
+ // mutable function return -> mutable function return (multiple call signatures).
361
+ {
362
+ filename: 'file.ts',
363
+ code: `
364
+ type MutableA = { a: string };
365
+
366
+ interface MutableFunc {
367
+ (b: number): MutableA;
368
+ (b: string): MutableA;
369
+ }
370
+
371
+ const mf: MutableFunc = (b: number | string): MutableA => {
372
+ return { a: "" };
373
+ };
374
+
375
+ const rf: MutableFunc = mf;
376
+ `,
377
+ },
378
+ // readonly function return -> readonly function return (multiple call signatures).
379
+ {
380
+ filename: 'file.ts',
381
+ code: `
382
+ type ReadonlyA = { readonly a: string };
383
+
384
+ interface ReadonlyFunc {
385
+ (b: number): ReadonlyA;
386
+ (b: string): ReadonlyA;
387
+ }
388
+
389
+ const mf: ReadonlyFunc = (b: number | string): ReadonlyA => {
390
+ return { a: "" } as const;
391
+ };
392
+
393
+ const rf: ReadonlyFunc = mf;
394
+ `,
395
+ },
396
+ // Return empty tuple from function that is declared to return some readonly array type.
397
+ {
398
+ filename: 'file.ts',
399
+ code: `
400
+ type Foo = ReadonlyArray<{ readonly a: string }>;
401
+ const foo = (): Foo => {
402
+ return [] as const;
403
+ };
404
+ `,
405
+ },
406
+ // Return empty tuple from function that is declared to return empty tuple.
407
+ {
408
+ filename: 'file.ts',
409
+ code: `
410
+ type Foo = readonly [];
411
+ const foo = (): Foo => {
412
+ return [] as const;
413
+ };
414
+ `,
415
+ },
416
+ // Return safe mutable array with chained array operations.
417
+ {
418
+ filename: 'file.ts',
419
+ code: `
420
+ const fooArray: readonly string[] = ["test"] as const;
421
+ const nextArray = (): readonly string[] => fooArray.filter((v) => v.length > 0).map((v) => v.length.toString());
422
+ `,
423
+ },
424
+ // Return safe mutable array. (array.filter)
425
+ {
426
+ filename: 'file.ts',
427
+ code: `
428
+ const fooArray: readonly string[] = [""] as const;
429
+ const nextArray = (): readonly string[] => fooArray.filter((v) => v.length > 0);
430
+ `,
431
+ },
432
+ // Return safe mutable array. (array.map)
433
+ {
434
+ filename: 'file.ts',
435
+ code: `
436
+ const fooArray: readonly string[] = ["test"] as const;
437
+ const nextArray = (): readonly string[] => fooArray.map((v) => v.length.toString());
438
+ `,
439
+ },
440
+ // Return safe mutable array. (array.concat)
441
+ {
442
+ filename: 'file.ts',
443
+ code: `
444
+ const fooArray: readonly string[] = ["test-1"] as const;
445
+ const booArray: readonly string[] = ["test-2"] as const;
446
+ const nextArray = (): readonly string[] => fooArray.concat(booArray);
447
+ `,
448
+ },
449
+ // Return safe mutable array. (array.flatMap)
450
+ {
451
+ filename: 'file.ts',
452
+ code: `
453
+ const fooArray: readonly string[][] = [["test"]] as const;
454
+ const nextArray = (): readonly string[] => fooArray.flatMap((v) => v.length.toString());
455
+ `,
456
+ },
457
+ // Return safe mutable array. (array.flat)
458
+ {
459
+ filename: 'file.ts',
460
+ code: `
461
+ const fooArray: readonly string[][] = [["test"]] as const;
462
+ const nextArray = (): readonly string[] => fooArray.flat();
463
+ `,
464
+ },
465
+ // Return safe mutable array. (array.slice)
466
+ {
467
+ filename: 'file.ts',
468
+ code: `
469
+ const fooArray: readonly string[] = ["test"] as const;
470
+ const nextArray = (): readonly string[] => fooArray.slice();
471
+ `,
472
+ },
473
+ // Return safe mutable array.
474
+ {
475
+ filename: 'file.ts',
476
+ code: `
477
+ const fooArray: readonly string[] = ["test"] as const;
478
+ const nextArray = (): readonly string[] => {
479
+ return fooArray.slice();
480
+ }
481
+ `,
482
+ },
483
+ // Yield safe mutable array.
484
+ {
485
+ filename: 'file.ts',
486
+ code: `
487
+ const fooArray: readonly string[] = ["test"] as const;
488
+ export function* mySaga(): Generator<readonly string[]> {
489
+ yield fooArray.slice();
490
+ }
491
+ `,
492
+ },
493
+ // generators
494
+ {
495
+ filename: 'file.ts',
496
+ code: `
497
+ export function* mySaga(): Generator<void> {
498
+ yield;
499
+ }
500
+ `,
501
+ },
502
+ // The five turtles.
503
+ // https://effectivetypescript.com/2021/05/06/unsoundness/#There-Are-Five-Turtles
504
+ // https://www.youtube.com/watch?v=wpgKd-rwnMw&t=1714s
505
+ {
506
+ filename: 'file.ts',
507
+ code: `
508
+ type Foo<U> = {
509
+ readonly a: U;
510
+ readonly b: Foo<Foo<U>>;
511
+ };
512
+
513
+ type Bar<U> = {
514
+ readonly a: U;
515
+ readonly b: Bar<Bar<U>>;
516
+ };
517
+
518
+ declare const foo: Foo<string>;
519
+
520
+ const bar: Bar<string> = foo;
521
+ `,
522
+ },
523
+ {
524
+ filename: 'file.ts',
525
+ code: `
526
+ type Foo<U> = {
527
+ readonly a: U;
528
+ readonly b: () => Foo<Foo<U>>;
529
+ };
530
+
531
+ type Bar<U> = {
532
+ readonly a: U;
533
+ readonly b: () => Bar<Bar<U>>;
534
+ };
535
+
536
+ declare const foo: Foo<string>;
537
+
538
+ const bar: Bar<string> = foo;
539
+ `,
540
+ },
541
+ // Return empty array literal from function that is declared to return empty tuple.
542
+ {
543
+ filename: 'file.ts',
544
+ code: `
545
+ const foo = (): readonly [] => {
546
+ return [];
547
+ };
548
+ `,
549
+ },
550
+ // https://github.com/danielnixon/eslint-plugin-total-functions/issues/741
551
+ {
552
+ filename: 'file.ts',
553
+ code: `
554
+ type Foo<U> = {
555
+ b?: Foo<Foo<U>>;
556
+ };
557
+
558
+ const takesAFoo = <U>(foo: Foo<U>): void => {
559
+ return undefined;
560
+ }
561
+
562
+ let foo: Foo<unknown> = { b: {} };
563
+
564
+ foo.b = foo;
565
+
566
+ takesAFoo(foo);
567
+ `,
568
+ },
569
+ {
570
+ filename: 'file.ts',
571
+ code: `
572
+ declare const fooArray: readonly string[];
573
+ declare const takesReadonly: (a: readonly string[]) => void;
574
+ const nextArray: readonly string[] = takesReadonly(fooArray.slice());
575
+ `,
576
+ },
577
+ // Literal (mutable) assigned to immutable but safe because no surprising mutation can arise
578
+ {
579
+ filename: 'file.ts',
580
+ code: `
581
+ const o: readonly string[] = [];
582
+ `,
583
+ },
584
+ ],
585
+ invalid: [
586
+ // initialization using mutable (literal) -> readonly
587
+ // TODO this should ideally be considered valid without requiring an `as const`.
588
+ {
589
+ filename: 'file.ts',
590
+ code: `
591
+ type ReadonlyA = { readonly a: string };
592
+ const readonlyA: ReadonlyA = { a: "" };
593
+ `,
594
+ errors: [
595
+ {
596
+ messageId: 'errorStringGeneric',
597
+ type: AST_NODE_TYPES.VariableDeclaration,
598
+ },
599
+ ],
600
+ },
601
+ // TODO `{ a: b } as const` is being flagged here. Is that correct?
602
+ // // object literal -> readonly (mutable reference to property retained)
603
+ // {
604
+ // filename: "file.ts",
605
+ // code: `
606
+ // type MutableB = { b: string };
607
+ // type ReadonlyA = { readonly a: { readonly b: string } };
608
+ // const func = (param: ReadonlyA): void => {
609
+ // return undefined;
610
+ // };
611
+ // const b: MutableB = { b: "" };
612
+ // func({ a: b } as const);
613
+ // `,
614
+ // errors: [
615
+ // {
616
+ // messageId: "errorStringGeneric",
617
+ // type: AST_NODE_TYPES.Identifier,
618
+ // },
619
+ // ],
620
+ // },
621
+ // mutable -> readonly
622
+ {
623
+ filename: 'file.ts',
624
+ code: `
625
+ type MutableA = { a: string };
626
+ type ReadonlyA = Readonly<MutableA>;
627
+ const func = (param: ReadonlyA): void => {
628
+ return undefined;
629
+ };
630
+ const mutableA: MutableA = { a: "" };
631
+ func(mutableA);
632
+ `,
633
+ errors: [
634
+ {
635
+ messageId: 'errorStringGeneric',
636
+ type: AST_NODE_TYPES.Identifier,
637
+ },
638
+ ],
639
+ },
640
+ // mutable -> readonly (function return)
641
+ {
642
+ filename: 'file.ts',
643
+ code: `
644
+ type MutableA = { a: string };
645
+ type ReadonlyA = { readonly a: string };
646
+
647
+ function foo(): ReadonlyA {
648
+ const ma: MutableA = { a: "" };
649
+ return ma;
650
+ }
651
+ `,
652
+ errors: [
653
+ {
654
+ messageId: 'errorStringGeneric',
655
+ type: AST_NODE_TYPES.ReturnStatement,
656
+ },
657
+ ],
658
+ },
659
+ // mutable object prop -> readonly object prop (as part of intersection with non-object).
660
+ {
661
+ filename: 'file.ts',
662
+ code: `
663
+ type MutableA = { a?: string } & number;
664
+ type ReadonlyA = { readonly a?: string } & number;
665
+
666
+ const ma: MutableA = 42;
667
+ const ra: ReadonlyA = ma;
668
+ `,
669
+ errors: [
670
+ {
671
+ messageId: 'errorStringGeneric',
672
+ type: AST_NODE_TYPES.VariableDeclaration,
673
+ },
674
+ ],
675
+ },
676
+ // mutable function value -> readonly.
677
+ {
678
+ filename: 'file.ts',
679
+ code: `
680
+ type MyType = {
681
+ readonly filter: () => Record<string, string>;
682
+ };
683
+
684
+ const myValue: MyType = {
685
+ filter: () => ({ foo: "bar" }),
686
+ } as const;
687
+
688
+ const foo: Readonly<Record<string, string>> = myValue.filter();
689
+ `,
690
+ errors: [
691
+ {
692
+ messageId: 'errorStringGeneric',
693
+ type: AST_NODE_TYPES.VariableDeclaration,
694
+ },
695
+ ],
696
+ },
697
+ // mutable function array value -> readonly.
698
+ {
699
+ filename: 'file.ts',
700
+ code: `
701
+ type MyType = {
702
+ readonly filter: () => string[];
703
+ };
704
+
705
+ const myValue: MyType = {
706
+ filter: () => (["bar"]),
707
+ } as const;
708
+
709
+ const foo: readonly string[] = myValue.filter();
710
+ `,
711
+ errors: [
712
+ {
713
+ messageId: 'errorStringGeneric',
714
+ type: AST_NODE_TYPES.VariableDeclaration,
715
+ },
716
+ ],
717
+ },
718
+ {
719
+ filename: 'file.ts',
720
+ code: `
721
+ type MyReadonlyType = { readonly a: string };
722
+ type MyMutableType = { a: string };
723
+
724
+ const mutableVal: MyMutableType = { a: "" };
725
+ const readonlyArrayOfMutable: readonly MyMutableType[] = [mutableVal] as const;
726
+
727
+ const shouldBeImmutable: readonly MyReadonlyType[] =
728
+ readonlyArrayOfMutable.concat({
729
+ a: "",
730
+ });
731
+ `,
732
+ errors: [
733
+ {
734
+ messageId: 'errorStringGeneric',
735
+ type: AST_NODE_TYPES.VariableDeclaration,
736
+ },
737
+ ],
738
+ },
739
+ // yield expression (generator)
740
+ {
741
+ filename: 'file.ts',
742
+ code: `
743
+ type MutableA = { a: string };
744
+ type ReadonlyA = { readonly a: string };
745
+
746
+ export function* mySaga(): Generator<ReadonlyA> {
747
+ const foo: MutableA = { a: "" };
748
+ yield foo;
749
+ }
750
+ `,
751
+ errors: [
752
+ {
753
+ messageId: 'errorStringGeneric',
754
+ type: AST_NODE_TYPES.YieldExpression,
755
+ },
756
+ ],
757
+ },
758
+ // deep(ish) type
759
+ {
760
+ filename: 'file.ts',
761
+ code: `
762
+ type A = {
763
+ a: string;
764
+ };
765
+
766
+ type B = {
767
+ readonly a: A;
768
+ };
769
+
770
+ type C = {
771
+ readonly b: B;
772
+ };
773
+
774
+ type D = {
775
+ readonly c: C;
776
+ };
777
+
778
+ type E = {
779
+ readonly d: D;
780
+ };
781
+
782
+ type F = {
783
+ readonly e: E;
784
+ };
785
+
786
+ type G = {
787
+ readonly f: F;
788
+ };
789
+
790
+ type A2 = {
791
+ readonly a: string;
792
+ };
793
+
794
+ type B2 = {
795
+ readonly a: A2;
796
+ };
797
+
798
+ type C2 = {
799
+ readonly b: B2;
800
+ };
801
+
802
+ type D2 = {
803
+ readonly c: C2;
804
+ };
805
+
806
+ type E2 = {
807
+ readonly d: D2;
808
+ };
809
+
810
+ type F2 = {
811
+ readonly e: E2;
812
+ };
813
+
814
+ type G2 = {
815
+ readonly f: F2;
816
+ };
817
+
818
+ declare const g: G;
819
+ export const g2: G2 = g;
820
+ `,
821
+ errors: [
822
+ {
823
+ messageId: 'errorStringGeneric',
824
+ type: AST_NODE_TYPES.VariableDeclaration,
825
+ },
826
+ ],
827
+ },
828
+ ],
829
+ } as const,
830
+ );