eslint-plugin-typefest 1.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 (578) hide show
  1. package/CHANGELOG.md +1814 -0
  2. package/LICENSE +21 -0
  3. package/README.md +282 -0
  4. package/dist/_internal/array-like-expression.d.ts +67 -0
  5. package/dist/_internal/array-like-expression.d.ts.map +1 -0
  6. package/dist/_internal/array-like-expression.js +179 -0
  7. package/dist/_internal/array-like-expression.js.map +1 -0
  8. package/dist/_internal/array-method-call-rule.d.ts +34 -0
  9. package/dist/_internal/array-method-call-rule.d.ts.map +1 -0
  10. package/dist/_internal/array-method-call-rule.js +49 -0
  11. package/dist/_internal/array-method-call-rule.js.map +1 -0
  12. package/dist/_internal/ast-node.d.ts +23 -0
  13. package/dist/_internal/ast-node.d.ts.map +1 -0
  14. package/dist/_internal/ast-node.js +38 -0
  15. package/dist/_internal/ast-node.js.map +1 -0
  16. package/dist/_internal/bounded-cache.d.ts +42 -0
  17. package/dist/_internal/bounded-cache.d.ts.map +1 -0
  18. package/dist/_internal/bounded-cache.js +57 -0
  19. package/dist/_internal/bounded-cache.js.map +1 -0
  20. package/dist/_internal/constrained-type-at-location.d.ts +31 -0
  21. package/dist/_internal/constrained-type-at-location.d.ts.map +1 -0
  22. package/dist/_internal/constrained-type-at-location.js +61 -0
  23. package/dist/_internal/constrained-type-at-location.js.map +1 -0
  24. package/dist/_internal/cycle-safe-linked-search.d.ts +48 -0
  25. package/dist/_internal/cycle-safe-linked-search.d.ts.map +1 -0
  26. package/dist/_internal/cycle-safe-linked-search.js +70 -0
  27. package/dist/_internal/cycle-safe-linked-search.js.map +1 -0
  28. package/dist/_internal/expression-boolean-memoizer.d.ts +17 -0
  29. package/dist/_internal/expression-boolean-memoizer.d.ts.map +1 -0
  30. package/dist/_internal/expression-boolean-memoizer.js +23 -0
  31. package/dist/_internal/expression-boolean-memoizer.js.map +1 -0
  32. package/dist/_internal/filter-callback.d.ts +56 -0
  33. package/dist/_internal/filter-callback.d.ts.map +1 -0
  34. package/dist/_internal/filter-callback.js +100 -0
  35. package/dist/_internal/filter-callback.js.map +1 -0
  36. package/dist/_internal/global-identifier-member-call.d.ts +23 -0
  37. package/dist/_internal/global-identifier-member-call.d.ts.map +1 -0
  38. package/dist/_internal/global-identifier-member-call.js +25 -0
  39. package/dist/_internal/global-identifier-member-call.js.map +1 -0
  40. package/dist/_internal/global-member-call-rule.d.ts +36 -0
  41. package/dist/_internal/global-member-call-rule.d.ts.map +1 -0
  42. package/dist/_internal/global-member-call-rule.js +52 -0
  43. package/dist/_internal/global-member-call-rule.js.map +1 -0
  44. package/dist/_internal/import-analysis.d.ts +45 -0
  45. package/dist/_internal/import-analysis.d.ts.map +1 -0
  46. package/dist/_internal/import-analysis.js +113 -0
  47. package/dist/_internal/import-analysis.js.map +1 -0
  48. package/dist/_internal/import-aware-fixes.d.ts +31 -0
  49. package/dist/_internal/import-aware-fixes.d.ts.map +1 -0
  50. package/dist/_internal/import-aware-fixes.js +38 -0
  51. package/dist/_internal/import-aware-fixes.js.map +1 -0
  52. package/dist/_internal/import-fix-coordinator.d.ts +43 -0
  53. package/dist/_internal/import-fix-coordinator.d.ts.map +1 -0
  54. package/dist/_internal/import-fix-coordinator.js +71 -0
  55. package/dist/_internal/import-fix-coordinator.js.map +1 -0
  56. package/dist/_internal/import-insertion.d.ts +27 -0
  57. package/dist/_internal/import-insertion.d.ts.map +1 -0
  58. package/dist/_internal/import-insertion.js +295 -0
  59. package/dist/_internal/import-insertion.js.map +1 -0
  60. package/dist/_internal/imported-type-aliases.d.ts +140 -0
  61. package/dist/_internal/imported-type-aliases.d.ts.map +1 -0
  62. package/dist/_internal/imported-type-aliases.js +316 -0
  63. package/dist/_internal/imported-type-aliases.js.map +1 -0
  64. package/dist/_internal/imported-value-symbols.d.ts +157 -0
  65. package/dist/_internal/imported-value-symbols.d.ts.map +1 -0
  66. package/dist/_internal/imported-value-symbols.js +478 -0
  67. package/dist/_internal/imported-value-symbols.js.map +1 -0
  68. package/dist/_internal/member-call.d.ts +53 -0
  69. package/dist/_internal/member-call.d.ts.map +1 -0
  70. package/dist/_internal/member-call.js +48 -0
  71. package/dist/_internal/member-call.js.map +1 -0
  72. package/dist/_internal/module-source.d.ts +11 -0
  73. package/dist/_internal/module-source.d.ts.map +1 -0
  74. package/dist/_internal/module-source.js +11 -0
  75. package/dist/_internal/module-source.js.map +1 -0
  76. package/dist/_internal/normalize-expression-text.d.ts +26 -0
  77. package/dist/_internal/normalize-expression-text.d.ts.map +1 -0
  78. package/dist/_internal/normalize-expression-text.js +182 -0
  79. package/dist/_internal/normalize-expression-text.js.map +1 -0
  80. package/dist/_internal/nullish-comparison.d.ts +43 -0
  81. package/dist/_internal/nullish-comparison.d.ts.map +1 -0
  82. package/dist/_internal/nullish-comparison.js +147 -0
  83. package/dist/_internal/nullish-comparison.js.map +1 -0
  84. package/dist/_internal/plugin-settings.d.ts +32 -0
  85. package/dist/_internal/plugin-settings.d.ts.map +1 -0
  86. package/dist/_internal/plugin-settings.js +118 -0
  87. package/dist/_internal/plugin-settings.js.map +1 -0
  88. package/dist/_internal/report-adapter.d.ts +25 -0
  89. package/dist/_internal/report-adapter.d.ts.map +1 -0
  90. package/dist/_internal/report-adapter.js +36 -0
  91. package/dist/_internal/report-adapter.js.map +1 -0
  92. package/dist/_internal/rule-catalog.d.ts +51 -0
  93. package/dist/_internal/rule-catalog.d.ts.map +1 -0
  94. package/dist/_internal/rule-catalog.js +162 -0
  95. package/dist/_internal/rule-catalog.js.map +1 -0
  96. package/dist/_internal/rule-docs-metadata.d.ts +37 -0
  97. package/dist/_internal/rule-docs-metadata.d.ts.map +1 -0
  98. package/dist/_internal/rule-docs-metadata.js +192 -0
  99. package/dist/_internal/rule-docs-metadata.js.map +1 -0
  100. package/dist/_internal/rule-docs-url.d.ts +15 -0
  101. package/dist/_internal/rule-docs-url.d.ts.map +1 -0
  102. package/dist/_internal/rule-docs-url.js +15 -0
  103. package/dist/_internal/rule-docs-url.js.map +1 -0
  104. package/dist/_internal/rule-reporting.d.ts +71 -0
  105. package/dist/_internal/rule-reporting.d.ts.map +1 -0
  106. package/dist/_internal/rule-reporting.js +89 -0
  107. package/dist/_internal/rule-reporting.js.map +1 -0
  108. package/dist/_internal/rules-registry.d.ts +14 -0
  109. package/dist/_internal/rules-registry.d.ts.map +1 -0
  110. package/dist/_internal/rules-registry.js +165 -0
  111. package/dist/_internal/rules-registry.js.map +1 -0
  112. package/dist/_internal/safe-type-operation.d.ts +89 -0
  113. package/dist/_internal/safe-type-operation.d.ts.map +1 -0
  114. package/dist/_internal/safe-type-operation.js +147 -0
  115. package/dist/_internal/safe-type-operation.js.map +1 -0
  116. package/dist/_internal/scope-resolution.d.ts +20 -0
  117. package/dist/_internal/scope-resolution.d.ts.map +1 -0
  118. package/dist/_internal/scope-resolution.js +21 -0
  119. package/dist/_internal/scope-resolution.js.map +1 -0
  120. package/dist/_internal/scope-variable.d.ts +17 -0
  121. package/dist/_internal/scope-variable.d.ts.map +1 -0
  122. package/dist/_internal/scope-variable.js +30 -0
  123. package/dist/_internal/scope-variable.js.map +1 -0
  124. package/dist/_internal/set-membership.d.ts +6 -0
  125. package/dist/_internal/set-membership.d.ts.map +1 -0
  126. package/dist/_internal/set-membership.js +11 -0
  127. package/dist/_internal/set-membership.js.map +1 -0
  128. package/dist/_internal/text-character.d.ts +18 -0
  129. package/dist/_internal/text-character.d.ts.map +1 -0
  130. package/dist/_internal/text-character.js +69 -0
  131. package/dist/_internal/text-character.js.map +1 -0
  132. package/dist/_internal/throw-consequent.d.ts +22 -0
  133. package/dist/_internal/throw-consequent.d.ts.map +1 -0
  134. package/dist/_internal/throw-consequent.js +48 -0
  135. package/dist/_internal/throw-consequent.js.map +1 -0
  136. package/dist/_internal/throw-type-error.d.ts +19 -0
  137. package/dist/_internal/throw-type-error.d.ts.map +1 -0
  138. package/dist/_internal/throw-type-error.js +24 -0
  139. package/dist/_internal/throw-type-error.js.map +1 -0
  140. package/dist/_internal/type-checker-compat.d.ts +80 -0
  141. package/dist/_internal/type-checker-compat.d.ts.map +1 -0
  142. package/dist/_internal/type-checker-compat.js +104 -0
  143. package/dist/_internal/type-checker-compat.js.map +1 -0
  144. package/dist/_internal/type-predicate-autofix-safety.d.ts +20 -0
  145. package/dist/_internal/type-predicate-autofix-safety.d.ts.map +1 -0
  146. package/dist/_internal/type-predicate-autofix-safety.js +58 -0
  147. package/dist/_internal/type-predicate-autofix-safety.js.map +1 -0
  148. package/dist/_internal/type-reference-node.d.ts +19 -0
  149. package/dist/_internal/type-reference-node.d.ts.map +1 -0
  150. package/dist/_internal/type-reference-node.js +14 -0
  151. package/dist/_internal/type-reference-node.js.map +1 -0
  152. package/dist/_internal/typed-member-call-rule.d.ts +35 -0
  153. package/dist/_internal/typed-member-call-rule.d.ts.map +1 -0
  154. package/dist/_internal/typed-member-call-rule.js +50 -0
  155. package/dist/_internal/typed-member-call-rule.js.map +1 -0
  156. package/dist/_internal/typed-path-telemetry.d.ts +58 -0
  157. package/dist/_internal/typed-path-telemetry.d.ts.map +1 -0
  158. package/dist/_internal/typed-path-telemetry.js +114 -0
  159. package/dist/_internal/typed-path-telemetry.js.map +1 -0
  160. package/dist/_internal/typed-rule.d.ts +142 -0
  161. package/dist/_internal/typed-rule.d.ts.map +1 -0
  162. package/dist/_internal/typed-rule.js +197 -0
  163. package/dist/_internal/typed-rule.js.map +1 -0
  164. package/dist/_internal/typefest-config-references.d.ts +45 -0
  165. package/dist/_internal/typefest-config-references.d.ts.map +1 -0
  166. package/dist/_internal/typefest-config-references.js +98 -0
  167. package/dist/_internal/typefest-config-references.js.map +1 -0
  168. package/dist/_internal/typescript-eslint-node-autofix.d.ts +32 -0
  169. package/dist/_internal/typescript-eslint-node-autofix.d.ts.map +1 -0
  170. package/dist/_internal/typescript-eslint-node-autofix.js +495 -0
  171. package/dist/_internal/typescript-eslint-node-autofix.js.map +1 -0
  172. package/dist/_internal/value-rewrite-autofix-safety.d.ts +33 -0
  173. package/dist/_internal/value-rewrite-autofix-safety.d.ts.map +1 -0
  174. package/dist/_internal/value-rewrite-autofix-safety.js +103 -0
  175. package/dist/_internal/value-rewrite-autofix-safety.js.map +1 -0
  176. package/dist/plugin.cjs +9718 -0
  177. package/dist/plugin.cjs.map +7 -0
  178. package/dist/plugin.d.cts +76 -0
  179. package/dist/plugin.d.ts +76 -0
  180. package/dist/plugin.d.ts.map +1 -0
  181. package/dist/plugin.js +206 -0
  182. package/dist/plugin.js.map +1 -0
  183. package/dist/rules/prefer-ts-extras-array-at.d.ts +13 -0
  184. package/dist/rules/prefer-ts-extras-array-at.d.ts.map +1 -0
  185. package/dist/rules/prefer-ts-extras-array-at.js +66 -0
  186. package/dist/rules/prefer-ts-extras-array-at.js.map +1 -0
  187. package/dist/rules/prefer-ts-extras-array-concat.d.ts +13 -0
  188. package/dist/rules/prefer-ts-extras-array-concat.d.ts.map +1 -0
  189. package/dist/rules/prefer-ts-extras-array-concat.js +66 -0
  190. package/dist/rules/prefer-ts-extras-array-concat.js.map +1 -0
  191. package/dist/rules/prefer-ts-extras-array-find-last-index.d.ts +13 -0
  192. package/dist/rules/prefer-ts-extras-array-find-last-index.d.ts.map +1 -0
  193. package/dist/rules/prefer-ts-extras-array-find-last-index.js +63 -0
  194. package/dist/rules/prefer-ts-extras-array-find-last-index.js.map +1 -0
  195. package/dist/rules/prefer-ts-extras-array-find-last.d.ts +13 -0
  196. package/dist/rules/prefer-ts-extras-array-find-last.d.ts.map +1 -0
  197. package/dist/rules/prefer-ts-extras-array-find-last.js +66 -0
  198. package/dist/rules/prefer-ts-extras-array-find-last.js.map +1 -0
  199. package/dist/rules/prefer-ts-extras-array-find.d.ts +13 -0
  200. package/dist/rules/prefer-ts-extras-array-find.d.ts.map +1 -0
  201. package/dist/rules/prefer-ts-extras-array-find.js +63 -0
  202. package/dist/rules/prefer-ts-extras-array-find.js.map +1 -0
  203. package/dist/rules/prefer-ts-extras-array-first.d.ts +13 -0
  204. package/dist/rules/prefer-ts-extras-array-first.d.ts.map +1 -0
  205. package/dist/rules/prefer-ts-extras-array-first.js +107 -0
  206. package/dist/rules/prefer-ts-extras-array-first.js.map +1 -0
  207. package/dist/rules/prefer-ts-extras-array-includes.d.ts +13 -0
  208. package/dist/rules/prefer-ts-extras-array-includes.d.ts.map +1 -0
  209. package/dist/rules/prefer-ts-extras-array-includes.js +89 -0
  210. package/dist/rules/prefer-ts-extras-array-includes.js.map +1 -0
  211. package/dist/rules/prefer-ts-extras-array-join.d.ts +13 -0
  212. package/dist/rules/prefer-ts-extras-array-join.d.ts.map +1 -0
  213. package/dist/rules/prefer-ts-extras-array-join.js +66 -0
  214. package/dist/rules/prefer-ts-extras-array-join.js.map +1 -0
  215. package/dist/rules/prefer-ts-extras-array-last.d.ts +8 -0
  216. package/dist/rules/prefer-ts-extras-array-last.d.ts.map +1 -0
  217. package/dist/rules/prefer-ts-extras-array-last.js +132 -0
  218. package/dist/rules/prefer-ts-extras-array-last.js.map +1 -0
  219. package/dist/rules/prefer-ts-extras-as-writable.d.ts +13 -0
  220. package/dist/rules/prefer-ts-extras-as-writable.d.ts.map +1 -0
  221. package/dist/rules/prefer-ts-extras-as-writable.js +110 -0
  222. package/dist/rules/prefer-ts-extras-as-writable.js.map +1 -0
  223. package/dist/rules/prefer-ts-extras-assert-defined.d.ts +13 -0
  224. package/dist/rules/prefer-ts-extras-assert-defined.d.ts.map +1 -0
  225. package/dist/rules/prefer-ts-extras-assert-defined.js +182 -0
  226. package/dist/rules/prefer-ts-extras-assert-defined.js.map +1 -0
  227. package/dist/rules/prefer-ts-extras-assert-error.d.ts +13 -0
  228. package/dist/rules/prefer-ts-extras-assert-error.d.ts.map +1 -0
  229. package/dist/rules/prefer-ts-extras-assert-error.js +152 -0
  230. package/dist/rules/prefer-ts-extras-assert-error.js.map +1 -0
  231. package/dist/rules/prefer-ts-extras-assert-present.d.ts +13 -0
  232. package/dist/rules/prefer-ts-extras-assert-present.d.ts.map +1 -0
  233. package/dist/rules/prefer-ts-extras-assert-present.js +266 -0
  234. package/dist/rules/prefer-ts-extras-assert-present.js.map +1 -0
  235. package/dist/rules/prefer-ts-extras-is-defined-filter.d.ts +13 -0
  236. package/dist/rules/prefer-ts-extras-is-defined-filter.d.ts.map +1 -0
  237. package/dist/rules/prefer-ts-extras-is-defined-filter.js +90 -0
  238. package/dist/rules/prefer-ts-extras-is-defined-filter.js.map +1 -0
  239. package/dist/rules/prefer-ts-extras-is-defined.d.ts +13 -0
  240. package/dist/rules/prefer-ts-extras-is-defined.d.ts.map +1 -0
  241. package/dist/rules/prefer-ts-extras-is-defined.js +179 -0
  242. package/dist/rules/prefer-ts-extras-is-defined.js.map +1 -0
  243. package/dist/rules/prefer-ts-extras-is-empty.d.ts +13 -0
  244. package/dist/rules/prefer-ts-extras-is-empty.d.ts.map +1 -0
  245. package/dist/rules/prefer-ts-extras-is-empty.js +116 -0
  246. package/dist/rules/prefer-ts-extras-is-empty.js.map +1 -0
  247. package/dist/rules/prefer-ts-extras-is-equal-type.d.ts +13 -0
  248. package/dist/rules/prefer-ts-extras-is-equal-type.d.ts.map +1 -0
  249. package/dist/rules/prefer-ts-extras-is-equal-type.js +138 -0
  250. package/dist/rules/prefer-ts-extras-is-equal-type.js.map +1 -0
  251. package/dist/rules/prefer-ts-extras-is-finite.d.ts +13 -0
  252. package/dist/rules/prefer-ts-extras-is-finite.d.ts.map +1 -0
  253. package/dist/rules/prefer-ts-extras-is-finite.js +61 -0
  254. package/dist/rules/prefer-ts-extras-is-finite.js.map +1 -0
  255. package/dist/rules/prefer-ts-extras-is-infinite.d.ts +8 -0
  256. package/dist/rules/prefer-ts-extras-is-infinite.d.ts.map +1 -0
  257. package/dist/rules/prefer-ts-extras-is-infinite.js +178 -0
  258. package/dist/rules/prefer-ts-extras-is-infinite.js.map +1 -0
  259. package/dist/rules/prefer-ts-extras-is-integer.d.ts +13 -0
  260. package/dist/rules/prefer-ts-extras-is-integer.d.ts.map +1 -0
  261. package/dist/rules/prefer-ts-extras-is-integer.js +61 -0
  262. package/dist/rules/prefer-ts-extras-is-integer.js.map +1 -0
  263. package/dist/rules/prefer-ts-extras-is-present-filter.d.ts +13 -0
  264. package/dist/rules/prefer-ts-extras-is-present-filter.d.ts.map +1 -0
  265. package/dist/rules/prefer-ts-extras-is-present-filter.js +216 -0
  266. package/dist/rules/prefer-ts-extras-is-present-filter.js.map +1 -0
  267. package/dist/rules/prefer-ts-extras-is-present.d.ts +13 -0
  268. package/dist/rules/prefer-ts-extras-is-present.d.ts.map +1 -0
  269. package/dist/rules/prefer-ts-extras-is-present.js +217 -0
  270. package/dist/rules/prefer-ts-extras-is-present.js.map +1 -0
  271. package/dist/rules/prefer-ts-extras-is-safe-integer.d.ts +13 -0
  272. package/dist/rules/prefer-ts-extras-is-safe-integer.d.ts.map +1 -0
  273. package/dist/rules/prefer-ts-extras-is-safe-integer.js +61 -0
  274. package/dist/rules/prefer-ts-extras-is-safe-integer.js.map +1 -0
  275. package/dist/rules/prefer-ts-extras-key-in.d.ts +13 -0
  276. package/dist/rules/prefer-ts-extras-key-in.d.ts.map +1 -0
  277. package/dist/rules/prefer-ts-extras-key-in.js +124 -0
  278. package/dist/rules/prefer-ts-extras-key-in.js.map +1 -0
  279. package/dist/rules/prefer-ts-extras-not.d.ts +13 -0
  280. package/dist/rules/prefer-ts-extras-not.d.ts.map +1 -0
  281. package/dist/rules/prefer-ts-extras-not.js +136 -0
  282. package/dist/rules/prefer-ts-extras-not.js.map +1 -0
  283. package/dist/rules/prefer-ts-extras-object-entries.d.ts +13 -0
  284. package/dist/rules/prefer-ts-extras-object-entries.d.ts.map +1 -0
  285. package/dist/rules/prefer-ts-extras-object-entries.js +59 -0
  286. package/dist/rules/prefer-ts-extras-object-entries.js.map +1 -0
  287. package/dist/rules/prefer-ts-extras-object-from-entries.d.ts +13 -0
  288. package/dist/rules/prefer-ts-extras-object-from-entries.d.ts.map +1 -0
  289. package/dist/rules/prefer-ts-extras-object-from-entries.js +59 -0
  290. package/dist/rules/prefer-ts-extras-object-from-entries.js.map +1 -0
  291. package/dist/rules/prefer-ts-extras-object-has-in.d.ts +13 -0
  292. package/dist/rules/prefer-ts-extras-object-has-in.d.ts.map +1 -0
  293. package/dist/rules/prefer-ts-extras-object-has-in.js +79 -0
  294. package/dist/rules/prefer-ts-extras-object-has-in.js.map +1 -0
  295. package/dist/rules/prefer-ts-extras-object-has-own.d.ts +13 -0
  296. package/dist/rules/prefer-ts-extras-object-has-own.d.ts.map +1 -0
  297. package/dist/rules/prefer-ts-extras-object-has-own.js +82 -0
  298. package/dist/rules/prefer-ts-extras-object-has-own.js.map +1 -0
  299. package/dist/rules/prefer-ts-extras-object-keys.d.ts +13 -0
  300. package/dist/rules/prefer-ts-extras-object-keys.d.ts.map +1 -0
  301. package/dist/rules/prefer-ts-extras-object-keys.js +59 -0
  302. package/dist/rules/prefer-ts-extras-object-keys.js.map +1 -0
  303. package/dist/rules/prefer-ts-extras-object-values.d.ts +13 -0
  304. package/dist/rules/prefer-ts-extras-object-values.d.ts.map +1 -0
  305. package/dist/rules/prefer-ts-extras-object-values.js +59 -0
  306. package/dist/rules/prefer-ts-extras-object-values.js.map +1 -0
  307. package/dist/rules/prefer-ts-extras-safe-cast-to.d.ts +13 -0
  308. package/dist/rules/prefer-ts-extras-safe-cast-to.d.ts.map +1 -0
  309. package/dist/rules/prefer-ts-extras-safe-cast-to.js +159 -0
  310. package/dist/rules/prefer-ts-extras-safe-cast-to.js.map +1 -0
  311. package/dist/rules/prefer-ts-extras-set-has.d.ts +13 -0
  312. package/dist/rules/prefer-ts-extras-set-has.d.ts.map +1 -0
  313. package/dist/rules/prefer-ts-extras-set-has.js +304 -0
  314. package/dist/rules/prefer-ts-extras-set-has.js.map +1 -0
  315. package/dist/rules/prefer-ts-extras-string-split.d.ts +13 -0
  316. package/dist/rules/prefer-ts-extras-string-split.d.ts.map +1 -0
  317. package/dist/rules/prefer-ts-extras-string-split.js +166 -0
  318. package/dist/rules/prefer-ts-extras-string-split.js.map +1 -0
  319. package/dist/rules/prefer-type-fest-abstract-constructor.d.ts +13 -0
  320. package/dist/rules/prefer-type-fest-abstract-constructor.d.ts.map +1 -0
  321. package/dist/rules/prefer-type-fest-abstract-constructor.js +65 -0
  322. package/dist/rules/prefer-type-fest-abstract-constructor.js.map +1 -0
  323. package/dist/rules/prefer-type-fest-arrayable.d.ts +13 -0
  324. package/dist/rules/prefer-type-fest-arrayable.d.ts.map +1 -0
  325. package/dist/rules/prefer-type-fest-arrayable.js +123 -0
  326. package/dist/rules/prefer-type-fest-arrayable.js.map +1 -0
  327. package/dist/rules/prefer-type-fest-async-return-type.d.ts +13 -0
  328. package/dist/rules/prefer-type-fest-async-return-type.d.ts.map +1 -0
  329. package/dist/rules/prefer-type-fest-async-return-type.js +92 -0
  330. package/dist/rules/prefer-type-fest-async-return-type.js.map +1 -0
  331. package/dist/rules/prefer-type-fest-conditional-pick.d.ts +13 -0
  332. package/dist/rules/prefer-type-fest-conditional-pick.d.ts.map +1 -0
  333. package/dist/rules/prefer-type-fest-conditional-pick.js +74 -0
  334. package/dist/rules/prefer-type-fest-conditional-pick.js.map +1 -0
  335. package/dist/rules/prefer-type-fest-constructor.d.ts +13 -0
  336. package/dist/rules/prefer-type-fest-constructor.d.ts.map +1 -0
  337. package/dist/rules/prefer-type-fest-constructor.js +67 -0
  338. package/dist/rules/prefer-type-fest-constructor.js.map +1 -0
  339. package/dist/rules/prefer-type-fest-except.d.ts +13 -0
  340. package/dist/rules/prefer-type-fest-except.d.ts.map +1 -0
  341. package/dist/rules/prefer-type-fest-except.js +105 -0
  342. package/dist/rules/prefer-type-fest-except.js.map +1 -0
  343. package/dist/rules/prefer-type-fest-if.d.ts +13 -0
  344. package/dist/rules/prefer-type-fest-if.d.ts.map +1 -0
  345. package/dist/rules/prefer-type-fest-if.js +79 -0
  346. package/dist/rules/prefer-type-fest-if.js.map +1 -0
  347. package/dist/rules/prefer-type-fest-iterable-element.d.ts +13 -0
  348. package/dist/rules/prefer-type-fest-iterable-element.d.ts.map +1 -0
  349. package/dist/rules/prefer-type-fest-iterable-element.js +76 -0
  350. package/dist/rules/prefer-type-fest-iterable-element.js.map +1 -0
  351. package/dist/rules/prefer-type-fest-json-array.d.ts +13 -0
  352. package/dist/rules/prefer-type-fest-json-array.d.ts.map +1 -0
  353. package/dist/rules/prefer-type-fest-json-array.js +164 -0
  354. package/dist/rules/prefer-type-fest-json-array.js.map +1 -0
  355. package/dist/rules/prefer-type-fest-json-object.d.ts +13 -0
  356. package/dist/rules/prefer-type-fest-json-object.d.ts.map +1 -0
  357. package/dist/rules/prefer-type-fest-json-object.js +102 -0
  358. package/dist/rules/prefer-type-fest-json-object.js.map +1 -0
  359. package/dist/rules/prefer-type-fest-json-primitive.d.ts +13 -0
  360. package/dist/rules/prefer-type-fest-json-primitive.d.ts.map +1 -0
  361. package/dist/rules/prefer-type-fest-json-primitive.js +112 -0
  362. package/dist/rules/prefer-type-fest-json-primitive.js.map +1 -0
  363. package/dist/rules/prefer-type-fest-json-value.d.ts +13 -0
  364. package/dist/rules/prefer-type-fest-json-value.d.ts.map +1 -0
  365. package/dist/rules/prefer-type-fest-json-value.js +109 -0
  366. package/dist/rules/prefer-type-fest-json-value.js.map +1 -0
  367. package/dist/rules/prefer-type-fest-keys-of-union.d.ts +13 -0
  368. package/dist/rules/prefer-type-fest-keys-of-union.d.ts.map +1 -0
  369. package/dist/rules/prefer-type-fest-keys-of-union.js +74 -0
  370. package/dist/rules/prefer-type-fest-keys-of-union.js.map +1 -0
  371. package/dist/rules/prefer-type-fest-literal-union.d.ts +13 -0
  372. package/dist/rules/prefer-type-fest-literal-union.d.ts.map +1 -0
  373. package/dist/rules/prefer-type-fest-literal-union.js +181 -0
  374. package/dist/rules/prefer-type-fest-literal-union.js.map +1 -0
  375. package/dist/rules/prefer-type-fest-merge-exclusive.d.ts +13 -0
  376. package/dist/rules/prefer-type-fest-merge-exclusive.d.ts.map +1 -0
  377. package/dist/rules/prefer-type-fest-merge-exclusive.js +63 -0
  378. package/dist/rules/prefer-type-fest-merge-exclusive.js.map +1 -0
  379. package/dist/rules/prefer-type-fest-non-empty-tuple.d.ts +13 -0
  380. package/dist/rules/prefer-type-fest-non-empty-tuple.d.ts.map +1 -0
  381. package/dist/rules/prefer-type-fest-non-empty-tuple.js +133 -0
  382. package/dist/rules/prefer-type-fest-non-empty-tuple.js.map +1 -0
  383. package/dist/rules/prefer-type-fest-omit-index-signature.d.ts +13 -0
  384. package/dist/rules/prefer-type-fest-omit-index-signature.d.ts.map +1 -0
  385. package/dist/rules/prefer-type-fest-omit-index-signature.js +74 -0
  386. package/dist/rules/prefer-type-fest-omit-index-signature.js.map +1 -0
  387. package/dist/rules/prefer-type-fest-partial-deep.d.ts +13 -0
  388. package/dist/rules/prefer-type-fest-partial-deep.d.ts.map +1 -0
  389. package/dist/rules/prefer-type-fest-partial-deep.js +63 -0
  390. package/dist/rules/prefer-type-fest-partial-deep.js.map +1 -0
  391. package/dist/rules/prefer-type-fest-primitive.d.ts +13 -0
  392. package/dist/rules/prefer-type-fest-primitive.d.ts.map +1 -0
  393. package/dist/rules/prefer-type-fest-primitive.js +102 -0
  394. package/dist/rules/prefer-type-fest-primitive.js.map +1 -0
  395. package/dist/rules/prefer-type-fest-promisable.d.ts +13 -0
  396. package/dist/rules/prefer-type-fest-promisable.d.ts.map +1 -0
  397. package/dist/rules/prefer-type-fest-promisable.js +167 -0
  398. package/dist/rules/prefer-type-fest-promisable.js.map +1 -0
  399. package/dist/rules/prefer-type-fest-readonly-deep.d.ts +13 -0
  400. package/dist/rules/prefer-type-fest-readonly-deep.d.ts.map +1 -0
  401. package/dist/rules/prefer-type-fest-readonly-deep.js +63 -0
  402. package/dist/rules/prefer-type-fest-readonly-deep.js.map +1 -0
  403. package/dist/rules/prefer-type-fest-require-all-or-none.d.ts +13 -0
  404. package/dist/rules/prefer-type-fest-require-all-or-none.d.ts.map +1 -0
  405. package/dist/rules/prefer-type-fest-require-all-or-none.js +75 -0
  406. package/dist/rules/prefer-type-fest-require-all-or-none.js.map +1 -0
  407. package/dist/rules/prefer-type-fest-require-at-least-one.d.ts +13 -0
  408. package/dist/rules/prefer-type-fest-require-at-least-one.d.ts.map +1 -0
  409. package/dist/rules/prefer-type-fest-require-at-least-one.js +74 -0
  410. package/dist/rules/prefer-type-fest-require-at-least-one.js.map +1 -0
  411. package/dist/rules/prefer-type-fest-require-exactly-one.d.ts +13 -0
  412. package/dist/rules/prefer-type-fest-require-exactly-one.d.ts.map +1 -0
  413. package/dist/rules/prefer-type-fest-require-exactly-one.js +102 -0
  414. package/dist/rules/prefer-type-fest-require-exactly-one.js.map +1 -0
  415. package/dist/rules/prefer-type-fest-require-one-or-none.d.ts +13 -0
  416. package/dist/rules/prefer-type-fest-require-one-or-none.d.ts.map +1 -0
  417. package/dist/rules/prefer-type-fest-require-one-or-none.js +74 -0
  418. package/dist/rules/prefer-type-fest-require-one-or-none.js.map +1 -0
  419. package/dist/rules/prefer-type-fest-required-deep.d.ts +13 -0
  420. package/dist/rules/prefer-type-fest-required-deep.d.ts.map +1 -0
  421. package/dist/rules/prefer-type-fest-required-deep.js +63 -0
  422. package/dist/rules/prefer-type-fest-required-deep.js.map +1 -0
  423. package/dist/rules/prefer-type-fest-schema.d.ts +13 -0
  424. package/dist/rules/prefer-type-fest-schema.d.ts.map +1 -0
  425. package/dist/rules/prefer-type-fest-schema.js +74 -0
  426. package/dist/rules/prefer-type-fest-schema.js.map +1 -0
  427. package/dist/rules/prefer-type-fest-set-non-nullable.d.ts +13 -0
  428. package/dist/rules/prefer-type-fest-set-non-nullable.d.ts.map +1 -0
  429. package/dist/rules/prefer-type-fest-set-non-nullable.js +74 -0
  430. package/dist/rules/prefer-type-fest-set-non-nullable.js.map +1 -0
  431. package/dist/rules/prefer-type-fest-set-optional.d.ts +13 -0
  432. package/dist/rules/prefer-type-fest-set-optional.d.ts.map +1 -0
  433. package/dist/rules/prefer-type-fest-set-optional.js +74 -0
  434. package/dist/rules/prefer-type-fest-set-optional.js.map +1 -0
  435. package/dist/rules/prefer-type-fest-set-readonly.d.ts +13 -0
  436. package/dist/rules/prefer-type-fest-set-readonly.d.ts.map +1 -0
  437. package/dist/rules/prefer-type-fest-set-readonly.js +74 -0
  438. package/dist/rules/prefer-type-fest-set-readonly.js.map +1 -0
  439. package/dist/rules/prefer-type-fest-set-required.d.ts +13 -0
  440. package/dist/rules/prefer-type-fest-set-required.d.ts.map +1 -0
  441. package/dist/rules/prefer-type-fest-set-required.js +74 -0
  442. package/dist/rules/prefer-type-fest-set-required.js.map +1 -0
  443. package/dist/rules/prefer-type-fest-simplify.d.ts +13 -0
  444. package/dist/rules/prefer-type-fest-simplify.d.ts.map +1 -0
  445. package/dist/rules/prefer-type-fest-simplify.js +75 -0
  446. package/dist/rules/prefer-type-fest-simplify.js.map +1 -0
  447. package/dist/rules/prefer-type-fest-tagged-brands.d.ts +13 -0
  448. package/dist/rules/prefer-type-fest-tagged-brands.d.ts.map +1 -0
  449. package/dist/rules/prefer-type-fest-tagged-brands.js +174 -0
  450. package/dist/rules/prefer-type-fest-tagged-brands.js.map +1 -0
  451. package/dist/rules/prefer-type-fest-tuple-of.d.ts +14 -0
  452. package/dist/rules/prefer-type-fest-tuple-of.d.ts.map +1 -0
  453. package/dist/rules/prefer-type-fest-tuple-of.js +132 -0
  454. package/dist/rules/prefer-type-fest-tuple-of.js.map +1 -0
  455. package/dist/rules/prefer-type-fest-unknown-array.d.ts +13 -0
  456. package/dist/rules/prefer-type-fest-unknown-array.d.ts.map +1 -0
  457. package/dist/rules/prefer-type-fest-unknown-array.js +111 -0
  458. package/dist/rules/prefer-type-fest-unknown-array.js.map +1 -0
  459. package/dist/rules/prefer-type-fest-unknown-map.d.ts +13 -0
  460. package/dist/rules/prefer-type-fest-unknown-map.d.ts.map +1 -0
  461. package/dist/rules/prefer-type-fest-unknown-map.js +82 -0
  462. package/dist/rules/prefer-type-fest-unknown-map.js.map +1 -0
  463. package/dist/rules/prefer-type-fest-unknown-record.d.ts +13 -0
  464. package/dist/rules/prefer-type-fest-unknown-record.d.ts.map +1 -0
  465. package/dist/rules/prefer-type-fest-unknown-record.js +77 -0
  466. package/dist/rules/prefer-type-fest-unknown-record.js.map +1 -0
  467. package/dist/rules/prefer-type-fest-unknown-set.d.ts +13 -0
  468. package/dist/rules/prefer-type-fest-unknown-set.d.ts.map +1 -0
  469. package/dist/rules/prefer-type-fest-unknown-set.js +81 -0
  470. package/dist/rules/prefer-type-fest-unknown-set.js.map +1 -0
  471. package/dist/rules/prefer-type-fest-unwrap-tagged.d.ts +13 -0
  472. package/dist/rules/prefer-type-fest-unwrap-tagged.d.ts.map +1 -0
  473. package/dist/rules/prefer-type-fest-unwrap-tagged.js +74 -0
  474. package/dist/rules/prefer-type-fest-unwrap-tagged.js.map +1 -0
  475. package/dist/rules/prefer-type-fest-value-of.d.ts +13 -0
  476. package/dist/rules/prefer-type-fest-value-of.d.ts.map +1 -0
  477. package/dist/rules/prefer-type-fest-value-of.js +74 -0
  478. package/dist/rules/prefer-type-fest-value-of.js.map +1 -0
  479. package/dist/rules/prefer-type-fest-writable-deep.d.ts +13 -0
  480. package/dist/rules/prefer-type-fest-writable-deep.d.ts.map +1 -0
  481. package/dist/rules/prefer-type-fest-writable-deep.js +64 -0
  482. package/dist/rules/prefer-type-fest-writable-deep.js.map +1 -0
  483. package/dist/rules/prefer-type-fest-writable.d.ts +13 -0
  484. package/dist/rules/prefer-type-fest-writable.d.ts.map +1 -0
  485. package/dist/rules/prefer-type-fest-writable.js +129 -0
  486. package/dist/rules/prefer-type-fest-writable.js.map +1 -0
  487. package/docs/rules/getting-started.md +74 -0
  488. package/docs/rules/guides/adoption-checklist.md +37 -0
  489. package/docs/rules/guides/preset-selection-strategy.md +87 -0
  490. package/docs/rules/guides/rollout-and-fix-safety.md +42 -0
  491. package/docs/rules/guides/snapshot-testing.md +121 -0
  492. package/docs/rules/guides/type-aware-linting-readiness.md +105 -0
  493. package/docs/rules/overview.md +49 -0
  494. package/docs/rules/prefer-ts-extras-array-at.md +132 -0
  495. package/docs/rules/prefer-ts-extras-array-concat.md +138 -0
  496. package/docs/rules/prefer-ts-extras-array-find-last-index.md +108 -0
  497. package/docs/rules/prefer-ts-extras-array-find-last.md +108 -0
  498. package/docs/rules/prefer-ts-extras-array-find.md +108 -0
  499. package/docs/rules/prefer-ts-extras-array-first.md +132 -0
  500. package/docs/rules/prefer-ts-extras-array-includes.md +135 -0
  501. package/docs/rules/prefer-ts-extras-array-join.md +132 -0
  502. package/docs/rules/prefer-ts-extras-array-last.md +132 -0
  503. package/docs/rules/prefer-ts-extras-as-writable.md +124 -0
  504. package/docs/rules/prefer-ts-extras-assert-defined.md +140 -0
  505. package/docs/rules/prefer-ts-extras-assert-error.md +147 -0
  506. package/docs/rules/prefer-ts-extras-assert-present.md +139 -0
  507. package/docs/rules/prefer-ts-extras-is-defined-filter.md +125 -0
  508. package/docs/rules/prefer-ts-extras-is-defined.md +147 -0
  509. package/docs/rules/prefer-ts-extras-is-empty.md +142 -0
  510. package/docs/rules/prefer-ts-extras-is-equal-type.md +144 -0
  511. package/docs/rules/prefer-ts-extras-is-finite.md +116 -0
  512. package/docs/rules/prefer-ts-extras-is-infinite.md +134 -0
  513. package/docs/rules/prefer-ts-extras-is-integer.md +116 -0
  514. package/docs/rules/prefer-ts-extras-is-present-filter.md +125 -0
  515. package/docs/rules/prefer-ts-extras-is-present.md +143 -0
  516. package/docs/rules/prefer-ts-extras-is-safe-integer.md +116 -0
  517. package/docs/rules/prefer-ts-extras-key-in.md +150 -0
  518. package/docs/rules/prefer-ts-extras-not.md +138 -0
  519. package/docs/rules/prefer-ts-extras-object-entries.md +130 -0
  520. package/docs/rules/prefer-ts-extras-object-from-entries.md +131 -0
  521. package/docs/rules/prefer-ts-extras-object-has-in.md +141 -0
  522. package/docs/rules/prefer-ts-extras-object-has-own.md +137 -0
  523. package/docs/rules/prefer-ts-extras-object-keys.md +127 -0
  524. package/docs/rules/prefer-ts-extras-object-values.md +128 -0
  525. package/docs/rules/prefer-ts-extras-safe-cast-to.md +130 -0
  526. package/docs/rules/prefer-ts-extras-set-has.md +203 -0
  527. package/docs/rules/prefer-ts-extras-string-split.md +133 -0
  528. package/docs/rules/prefer-type-fest-abstract-constructor.md +87 -0
  529. package/docs/rules/prefer-type-fest-arrayable.md +127 -0
  530. package/docs/rules/prefer-type-fest-async-return-type.md +117 -0
  531. package/docs/rules/prefer-type-fest-conditional-pick.md +140 -0
  532. package/docs/rules/prefer-type-fest-constructor.md +87 -0
  533. package/docs/rules/prefer-type-fest-except.md +231 -0
  534. package/docs/rules/prefer-type-fest-if.md +217 -0
  535. package/docs/rules/prefer-type-fest-iterable-element.md +170 -0
  536. package/docs/rules/prefer-type-fest-json-array.md +107 -0
  537. package/docs/rules/prefer-type-fest-json-object.md +107 -0
  538. package/docs/rules/prefer-type-fest-json-primitive.md +105 -0
  539. package/docs/rules/prefer-type-fest-json-value.md +107 -0
  540. package/docs/rules/prefer-type-fest-keys-of-union.md +139 -0
  541. package/docs/rules/prefer-type-fest-literal-union.md +118 -0
  542. package/docs/rules/prefer-type-fest-merge-exclusive.md +118 -0
  543. package/docs/rules/prefer-type-fest-non-empty-tuple.md +115 -0
  544. package/docs/rules/prefer-type-fest-omit-index-signature.md +196 -0
  545. package/docs/rules/prefer-type-fest-partial-deep.md +133 -0
  546. package/docs/rules/prefer-type-fest-primitive.md +106 -0
  547. package/docs/rules/prefer-type-fest-promisable.md +246 -0
  548. package/docs/rules/prefer-type-fest-readonly-deep.md +151 -0
  549. package/docs/rules/prefer-type-fest-require-all-or-none.md +149 -0
  550. package/docs/rules/prefer-type-fest-require-at-least-one.md +155 -0
  551. package/docs/rules/prefer-type-fest-require-exactly-one.md +240 -0
  552. package/docs/rules/prefer-type-fest-require-one-or-none.md +165 -0
  553. package/docs/rules/prefer-type-fest-required-deep.md +123 -0
  554. package/docs/rules/prefer-type-fest-schema.md +161 -0
  555. package/docs/rules/prefer-type-fest-set-non-nullable.md +145 -0
  556. package/docs/rules/prefer-type-fest-set-optional.md +133 -0
  557. package/docs/rules/prefer-type-fest-set-readonly.md +136 -0
  558. package/docs/rules/prefer-type-fest-set-required.md +140 -0
  559. package/docs/rules/prefer-type-fest-simplify.md +168 -0
  560. package/docs/rules/prefer-type-fest-tagged-brands.md +278 -0
  561. package/docs/rules/prefer-type-fest-tuple-of.md +250 -0
  562. package/docs/rules/prefer-type-fest-unknown-array.md +126 -0
  563. package/docs/rules/prefer-type-fest-unknown-map.md +123 -0
  564. package/docs/rules/prefer-type-fest-unknown-record.md +130 -0
  565. package/docs/rules/prefer-type-fest-unknown-set.md +123 -0
  566. package/docs/rules/prefer-type-fest-unwrap-tagged.md +133 -0
  567. package/docs/rules/prefer-type-fest-value-of.md +121 -0
  568. package/docs/rules/prefer-type-fest-writable-deep.md +113 -0
  569. package/docs/rules/prefer-type-fest-writable.md +139 -0
  570. package/docs/rules/presets/all.md +102 -0
  571. package/docs/rules/presets/index.md +124 -0
  572. package/docs/rules/presets/minimal.md +37 -0
  573. package/docs/rules/presets/recommended-type-checked.md +37 -0
  574. package/docs/rules/presets/recommended.md +116 -0
  575. package/docs/rules/presets/strict.md +98 -0
  576. package/docs/rules/presets/ts-extras-type-guards.md +45 -0
  577. package/docs/rules/presets/type-fest-types.md +68 -0
  578. package/package.json +574 -0
@@ -0,0 +1,130 @@
1
+ # prefer-ts-extras-safe-cast-to
2
+
3
+ Prefer [`safeCastTo`](https://github.com/sindresorhus/ts-extras/blob/main/source/safe-cast-to.ts) from `ts-extras` over direct `as` assertions when the cast is already assignable.
4
+
5
+ ## Targeted pattern scope
6
+
7
+ This rule focuses on direct `as T` and `<T>value` assertions that can be migrated to `safeCastTo<T>(value)` when the cast is assignable.
8
+
9
+ - Type assertions (`as T` and `<T>value`) that are already assignable and can use `safeCastTo<T>(value)`.
10
+ - `as` and angle-bracket (`<T>value`) assertions in runtime source files.
11
+ - Only assertions where the source expression type is assignable to the asserted target type.
12
+
13
+ Alias indirection, wrapper helpers, and non-canonical call shapes are excluded to keep `safeCastTo<T>(value)` migrations safe.
14
+
15
+ ## What this rule reports
16
+
17
+ This rule reports assignable `as T` and `<T>value` assertion sites when `safeCastTo<T>(value)` is the intended replacement.
18
+
19
+ - Type assertions (`as T` and `<T>value`) that are already assignable and can use `safeCastTo<T>(value)`.
20
+ - `as` and angle-bracket (`<T>value`) assertions in runtime source files.
21
+ - Only assertions where the source expression type is assignable to the asserted target type.
22
+
23
+ ## Why this rule exists
24
+
25
+ `safeCastTo<T>(value)` keeps casts type-checked and prevents silently widening unsafe assertion patterns.
26
+
27
+ ## ❌ Incorrect
28
+
29
+ ```ts
30
+ const nameValue = "Alice" as string;
31
+ ```
32
+
33
+ ## ✅ Correct
34
+
35
+ ```ts
36
+ const nameValue = safeCastTo<string>("Alice");
37
+ ```
38
+
39
+ ## Behavior and migration notes
40
+
41
+ - This rule only reports assertions where source type is assignable to target type.
42
+ - Unsafe/non-assignable assertion patterns are intentionally not rewritten by this rule.
43
+ - `safeCastTo` keeps the cast explicit while preserving assignability checks.
44
+
45
+ ## Additional examples
46
+
47
+ ### ❌ Incorrect — Additional example
48
+
49
+ ```ts
50
+ const resourceId = rawId as string;
51
+ ```
52
+
53
+ ### ✅ Correct — Additional example
54
+
55
+ ```ts
56
+ const resourceId = safeCastTo<string>(rawId);
57
+ ```
58
+
59
+ ### ✅ Correct — Repository-wide usage
60
+
61
+ ```ts
62
+ const port = safeCastTo<number>(env.PORT);
63
+ ```
64
+
65
+ ## ESLint flat config example
66
+
67
+ ```ts
68
+ import typefest from "eslint-plugin-typefest";
69
+
70
+ export default [
71
+ {
72
+ plugins: { typefest },
73
+ rules: {
74
+ "typefest/prefer-ts-extras-safe-cast-to": "error",
75
+ },
76
+ },
77
+ ];
78
+ ```
79
+
80
+ ## When not to use it
81
+
82
+ Disable this rule if your team forbids runtime casting helpers in favor of direct assertions.
83
+
84
+ ## Package documentation
85
+
86
+ ts-extras package documentation:
87
+
88
+ Source file: [`source/safe-cast-to.ts`](https://github.com/sindresorhus/ts-extras/blob/main/source/safe-cast-to.ts)
89
+
90
+ ````ts
91
+ /**
92
+ Constrain a value to the given type safely.
93
+
94
+ Unlike `as`, this refuses incompatible casts at compile time. Use it to _narrow_ or _shape_ values while preserving type safety.
95
+
96
+ @example
97
+ ```
98
+ type Foo = {
99
+ a: string;
100
+ b?: number;
101
+ };
102
+
103
+ declare const possibleUndefined: Foo | undefined;
104
+
105
+ const foo = possibleUndefined ?? safeCastTo<Partial<Foo>>({});
106
+ console.log(foo.a ?? '', foo.b ?? 0);
107
+
108
+ const bar = possibleUndefined ?? {};
109
+ // @ts-expect-error
110
+ console.log(bar.a ?? '', bar.b ?? 0);
111
+ // ^^^ Property 'a' does not exist on type '{}'.(2339)
112
+ // ^^^ Property 'b' does not exist on type '{}'.(2339)
113
+ ```
114
+
115
+ @category General
116
+ */
117
+ ````
118
+
119
+ > **Rule catalog ID:** R032
120
+
121
+ ## Further reading
122
+
123
+ - [`ts-extras` README](https://github.com/sindresorhus/ts-extras)
124
+ - [`ts-extras` package reference](https://www.npmjs.com/package/ts-extras)
125
+ - [TypeScript Handbook: Narrowing](https://www.typescriptlang.org/docs/handbook/2/narrowing.html)
126
+
127
+ ## Adoption resources
128
+
129
+ - [Rule adoption checklist](./guides/adoption-checklist.md)
130
+ - [Rollout and fix safety](./guides/rollout-and-fix-safety.md)
@@ -0,0 +1,203 @@
1
+ # prefer-ts-extras-set-has
2
+
3
+ Prefer [`setHas`](https://github.com/sindresorhus/ts-extras/blob/main/source/set-has.ts) from `ts-extras` over `set.has(...)`.
4
+
5
+ `setHas(...)` improves narrowing when checking membership in typed sets.
6
+
7
+ ## Targeted pattern scope
8
+
9
+ This rule focuses on direct `set.has(value)` calls that can be migrated to `setHas(set, value)` with deterministic fixes.
10
+
11
+ - `set.has(value)` call sites whose receiver resolves exclusively to `Set`/`ReadonlySet` branches and can use `setHas(set, value)`.
12
+
13
+ Alias indirection, mixed unions with non-Set `has` methods (for example `Set | Map`), wrapper helpers, and non-canonical call shapes are excluded to keep `setHas(set, value)` migrations safe.
14
+
15
+ ## What this rule reports
16
+
17
+ This rule reports `set.has(value)` call sites when `setHas(set, value)` is the intended replacement.
18
+
19
+ - `set.has(value)` call sites that can safely use `setHas(set, value)` without changing union-branch semantics.
20
+
21
+ ## Why this rule exists
22
+
23
+ `setHas` provides a canonical membership-check helper with strong narrowing behavior for typed sets.
24
+
25
+ - Set membership guards have one helper style.
26
+ - Candidate values can narrow after guard checks.
27
+ - Native/helper mixing is removed from set-heavy code.
28
+
29
+ ## ❌ Incorrect
30
+
31
+ ```ts
32
+ const hasMonitor = monitorIds.has(candidateId);
33
+ ```
34
+
35
+ ## ✅ Correct
36
+
37
+ ```ts
38
+ const hasMonitor = setHas(monitorIds, candidateId);
39
+ ```
40
+
41
+ ## Behavior and migration notes
42
+
43
+ - Runtime semantics match native `Set.prototype.has`.
44
+ - Equality semantics still follow SameValueZero.
45
+ - Narrowing benefits are strongest when checking unknown values against literal/unioned set members.
46
+ - If your codebase intentionally needs plain-boolean membership checks (without exposing type-guard narrowing at every call site), wrap `setHas` once in a local helper and call the helper consistently.
47
+
48
+ ## Additional examples
49
+
50
+ ### ❌ Incorrect — Additional example
51
+
52
+ ```ts
53
+ if (allowed.has(input)) {
54
+ use(input);
55
+ }
56
+ ```
57
+
58
+ ### ✅ Correct — Additional example
59
+
60
+ ```ts
61
+ if (setHas(allowed, input)) {
62
+ use(input);
63
+ }
64
+ ```
65
+
66
+ ### ✅ Correct — Repository-wide usage
67
+
68
+ ```ts
69
+ const known = setHas(codes, candidate);
70
+ ```
71
+
72
+ ## ESLint flat config example
73
+
74
+ ```ts
75
+ import typefest from "eslint-plugin-typefest";
76
+
77
+ export default [
78
+ {
79
+ plugins: { typefest },
80
+ rules: {
81
+ "typefest/prefer-ts-extras-set-has": "error",
82
+ },
83
+ },
84
+ ];
85
+ ```
86
+
87
+ ### Options
88
+
89
+ This rule accepts a single options object:
90
+
91
+ ```ts
92
+ type PreferTsExtrasSetHasOptions = {
93
+ /**
94
+ * Controls how union receivers are matched.
95
+ *
96
+ * - "allBranches": report only when every union branch is Set-like.
97
+ * - "anyBranch": report when at least one union branch is Set-like.
98
+ *
99
+ * @default "allBranches"
100
+ */
101
+ unionBranchMatchingMode?: "allBranches" | "anyBranch";
102
+ };
103
+ ```
104
+
105
+ Default configuration:
106
+
107
+ ```ts
108
+ {
109
+ unionBranchMatchingMode: "allBranches",
110
+ }
111
+ ```
112
+
113
+ #### `unionBranchMatchingMode: "allBranches"` (default)
114
+
115
+ Mixed unions are ignored to prevent noisy reports and unsafe replacements:
116
+
117
+ ```ts
118
+ declare const values: Set<number> | Map<number, number>;
119
+ const hasValue = values.has(2); // ✅ Not reported by default
120
+ ```
121
+
122
+ #### `unionBranchMatchingMode: "anyBranch"`
123
+
124
+ Mixed unions with Set-like branches are reported:
125
+
126
+ ```ts
127
+ declare const values: Set<number> | Map<number, number>;
128
+ const hasValue = values.has(2); // ❌ Reported
129
+ ```
130
+
131
+ When this option is enabled, mixed-union reports are intentionally suggestion-free (no autofix and no suggested replacement), because `setHas(values, value)` may not type-check until you narrow to a Set-like branch first.
132
+
133
+ Flat config example:
134
+
135
+ ```ts
136
+ import typefest from "eslint-plugin-typefest";
137
+
138
+ export default [
139
+ {
140
+ plugins: { typefest },
141
+ rules: {
142
+ "typefest/prefer-ts-extras-set-has": [
143
+ "error",
144
+ { unionBranchMatchingMode: "anyBranch" },
145
+ ],
146
+ },
147
+ },
148
+ ];
149
+ ```
150
+
151
+ ## When not to use it
152
+
153
+ Disable this rule if native `.has()` calls are required by local conventions.
154
+
155
+ You may also disable this rule in implementation-only layers that intentionally centralize `setHas` behind a boolean helper wrapper for stability and readability.
156
+
157
+ ## Package documentation
158
+
159
+ ts-extras package documentation:
160
+
161
+ Source file: [`source/set-has.ts`](https://github.com/sindresorhus/ts-extras/blob/main/source/set-has.ts)
162
+
163
+ ````ts
164
+ /**
165
+ A strongly-typed version of `Set#has()` that properly acts as a type guard.
166
+
167
+ When `setHas` returns `true`, the type is narrowed to the set's element type.
168
+ When it returns `false`, the type remains unchanged (i.e., `unknown` stays `unknown`).
169
+
170
+ It was [rejected](https://github.com/microsoft/TypeScript/issues/42641#issuecomment-774168319) from being done in TypeScript itself.
171
+
172
+ @example
173
+ ```
174
+ import {setHas} from 'ts-extras';
175
+
176
+ const values = ['a', 'b', 'c'] as const;
177
+ const valueSet = new Set(values);
178
+ const valueToCheck: unknown = 'a';
179
+
180
+ if (setHas(valueSet, valueToCheck)) {
181
+ // We now know that the value is of type `typeof values[number]`.
182
+ } else {
183
+ // The value remains `unknown`.
184
+ }
185
+ ```
186
+
187
+ @category Improved builtin
188
+ @category Type guard
189
+ */
190
+ ````
191
+
192
+ > **Rule catalog ID:** R033
193
+
194
+ ## Further reading
195
+
196
+ - [`ts-extras` README](https://github.com/sindresorhus/ts-extras)
197
+ - [`ts-extras` package reference](https://www.npmjs.com/package/ts-extras)
198
+ - [TypeScript Handbook: Narrowing](https://www.typescriptlang.org/docs/handbook/2/narrowing.html)
199
+
200
+ ## Adoption resources
201
+
202
+ - [Rule adoption checklist](./guides/adoption-checklist.md)
203
+ - [Rollout and fix safety](./guides/rollout-and-fix-safety.md)
@@ -0,0 +1,133 @@
1
+ # prefer-ts-extras-string-split
2
+
3
+ Prefer [`stringSplit`](https://github.com/sindresorhus/ts-extras/blob/main/source/string-split.ts) from `ts-extras` over `string.split(...)`.
4
+
5
+ `stringSplit(...)` can preserve stronger tuple-like inference for literal separators.
6
+
7
+ ## Targeted pattern scope
8
+
9
+ This rule focuses on direct `string.split(separator)` calls that can be migrated to `stringSplit(string, separator)` with deterministic fixes.
10
+
11
+ - `string.split(separator)` call sites that can use `stringSplit(string, separator)`.
12
+
13
+ Alias indirection, wrapper helpers, and non-canonical call shapes are excluded to keep `stringSplit(string, separator)` migrations safe.
14
+
15
+ ## What this rule reports
16
+
17
+ This rule reports `string.split(separator)` call sites when `stringSplit(string, separator)` is the intended replacement.
18
+
19
+ - `string.split(separator)` call sites that can use `stringSplit(string, separator)`.
20
+
21
+ ## Why this rule exists
22
+
23
+ `stringSplit` standardizes string tokenization and can preserve stronger typing for literal separators and known string shapes.
24
+
25
+ - Split usage follows one helper style across modules.
26
+ - Destructuring from split results is easier to type in strict code.
27
+ - Native/helper split styles are not mixed.
28
+
29
+ ## ❌ Incorrect
30
+
31
+ ```ts
32
+ const parts = monitorKey.split(":");
33
+ ```
34
+
35
+ ## ✅ Correct
36
+
37
+ ```ts
38
+ const parts = stringSplit(monitorKey, ":");
39
+ ```
40
+
41
+ ## Behavior and migration notes
42
+
43
+ - Runtime behavior matches native `String.prototype.split`.
44
+ - Separator semantics (string/regex, limits) are preserved.
45
+ - Literal-based tuple inference depends on the source string and separator types.
46
+
47
+ ## Additional examples
48
+
49
+ ### ❌ Incorrect — Additional example
50
+
51
+ ```ts
52
+ const [major, minor] = version.split(".");
53
+ ```
54
+
55
+ ### ✅ Correct — Additional example
56
+
57
+ ```ts
58
+ const [major, minor] = stringSplit(version, ".");
59
+ ```
60
+
61
+ ### ✅ Correct — Repository-wide usage
62
+
63
+ ```ts
64
+ const pathParts = stringSplit(route, "/");
65
+ ```
66
+
67
+ ## ESLint flat config example
68
+
69
+ ```ts
70
+ import typefest from "eslint-plugin-typefest";
71
+
72
+ export default [
73
+ {
74
+ plugins: { typefest },
75
+ rules: {
76
+ "typefest/prefer-ts-extras-string-split": "error",
77
+ },
78
+ },
79
+ ];
80
+ ```
81
+
82
+ ## When not to use it
83
+
84
+ Disable this rule if your code style standardizes on direct `.split()` usage.
85
+
86
+ ## Package documentation
87
+
88
+ ts-extras package documentation:
89
+
90
+ Source file: [`source/string-split.ts`](https://github.com/sindresorhus/ts-extras/blob/main/source/string-split.ts)
91
+
92
+ ````ts
93
+ /**
94
+ A strongly-typed version of `String#split()` that returns a tuple for literal strings.
95
+
96
+ @example
97
+ ```
98
+ import {stringSplit} from 'ts-extras';
99
+
100
+ const parts = stringSplit('foo-bar-baz', '-');
101
+ //=> ['foo', 'bar', 'baz']
102
+ // ^? ['foo', 'bar', 'baz']
103
+
104
+ const [first, second] = stringSplit('top-left', '-');
105
+ //=> first: 'top', second: 'left'
106
+
107
+ const placement = 'top-start' as const;
108
+ const side = stringSplit(placement, '-')[0];
109
+ //=> 'top'
110
+ // ^? 'top'
111
+
112
+ // Dynamic strings return string[]
113
+ const dynamic: string = 'a-b-c';
114
+ const dynamicParts = stringSplit(dynamic, '-');
115
+ //=> string[]
116
+ ```
117
+
118
+ @category Improved builtin
119
+ */
120
+ ````
121
+
122
+ > **Rule catalog ID:** R034
123
+
124
+ ## Further reading
125
+
126
+ - [`ts-extras` README](https://github.com/sindresorhus/ts-extras)
127
+ - [`ts-extras` package reference](https://www.npmjs.com/package/ts-extras)
128
+ - [TypeScript Handbook: Narrowing](https://www.typescriptlang.org/docs/handbook/2/narrowing.html)
129
+
130
+ ## Adoption resources
131
+
132
+ - [Rule adoption checklist](./guides/adoption-checklist.md)
133
+ - [Rollout and fix safety](./guides/rollout-and-fix-safety.md)
@@ -0,0 +1,87 @@
1
+ # prefer-type-fest-abstract-constructor
2
+
3
+ Require TypeFest [`AbstractConstructor`](https://github.com/sindresorhus/type-fest/blob/main/source/basic.d.ts) over explicit abstract constructor signatures.
4
+
5
+ ## Targeted pattern scope
6
+
7
+ This rule reports explicit `abstract new (...args) => T` signatures and prefers `AbstractConstructor<T>` for abstract class constructor contracts.
8
+
9
+ ## What this rule reports
10
+
11
+ - `abstract new (...args) => T` constructor type signatures.
12
+
13
+ ### Detection boundaries
14
+
15
+ - ✅ Reports explicit abstract constructor signatures used directly in type positions.
16
+ - ❌ Does not auto-fix when generic parameter mapping is ambiguous.
17
+
18
+ ## Why this rule exists
19
+
20
+ `AbstractConstructor<T>` gives one canonical representation for abstract constructable class contracts.
21
+
22
+ When teams mix explicit constructor signatures and helper aliases, higher-order APIs that accept class references become harder to standardize.
23
+
24
+ ## ❌ Incorrect
25
+
26
+ ```ts
27
+ type ExplicitAbstractCtor = abstract new (host: string, port: number) => Service;
28
+ ```
29
+
30
+ ## ✅ Correct
31
+
32
+ ```ts
33
+ import type { AbstractConstructor } from "type-fest";
34
+
35
+ type ServiceAbstractCtor = AbstractConstructor<Service>;
36
+ ```
37
+
38
+ ## Behavior and migration notes
39
+
40
+ - `AbstractConstructor<T>` models class values that cannot be instantiated directly but can be subclassed.
41
+ - If your explicit signature encoded argument constraints, preserve them by adding a dedicated wrapper type.
42
+ - Prefer canonical alias usage in plugin/public APIs that accept abstract class constructors.
43
+
44
+ ## ESLint flat config example
45
+
46
+ ```ts
47
+ import typefest from "eslint-plugin-typefest";
48
+
49
+ export default [
50
+ {
51
+ plugins: { typefest },
52
+ rules: {
53
+ "typefest/prefer-type-fest-abstract-constructor": "error",
54
+ },
55
+ },
56
+ ];
57
+ ```
58
+
59
+ ## When not to use it
60
+
61
+ Disable this rule if your codebase intentionally prefers explicit abstract constructor signatures over TypeFest aliases.
62
+
63
+ ## Package documentation
64
+
65
+ TypeFest package documentation:
66
+
67
+ Source file: [`source/basic.d.ts`](https://github.com/sindresorhus/type-fest/blob/main/source/basic.d.ts)
68
+
69
+ ```ts
70
+ /**
71
+ Matches an [`abstract class`](https://www.typescriptlang.org/docs/handbook/release-notes/typescript-4-2.html#abstract-construct-signatures) constructor.
72
+
73
+ @category Class
74
+ */
75
+ ```
76
+
77
+ > **Rule catalog ID:** R035
78
+
79
+ ## Further reading
80
+
81
+ - [TypeFest README](https://github.com/sindresorhus/type-fest)
82
+ - [TypeScript Handbook: Classes](https://www.typescriptlang.org/docs/handbook/2/classes.html)
83
+
84
+ ## Adoption resources
85
+
86
+ - [Rule adoption checklist](./guides/adoption-checklist.md)
87
+ - [Rollout and fix safety](./guides/rollout-and-fix-safety.md)
@@ -0,0 +1,127 @@
1
+ # prefer-type-fest-arrayable
2
+
3
+ Require TypeFest [`Arrayable<T>`](https://github.com/sindresorhus/type-fest/blob/main/source/arrayable.d.ts) over `T | T[]` and `T | Array<T>` unions.
4
+
5
+ ## Targeted pattern scope
6
+
7
+ This rule only matches the canonical value-or-array union spellings that TypeFest replaces with `Arrayable<T>`.
8
+
9
+ - `T | T[]`
10
+ - `T | Array<T>`
11
+
12
+ Near-miss unions (extra members or mismatched element types) are excluded unless they are exact canonical forms.
13
+
14
+ ## What this rule reports
15
+
16
+ This rule reports canonical value-or-array unions that should be rewritten as `Arrayable<T>`.
17
+
18
+ - `T | T[]`
19
+ - `T | Array<T>`
20
+
21
+ ## Why this rule exists
22
+
23
+ `Arrayable<T>` is clearer and more consistent than repeating union patterns. It also aligns code with TypeFest utility conventions used by other rules in this plugin.
24
+
25
+ ## ❌ Incorrect
26
+
27
+ ```ts
28
+ type Input = string | string[];
29
+ ```
30
+
31
+ ## ✅ Correct
32
+
33
+ ```ts
34
+ type Input = Arrayable<string>;
35
+ ```
36
+
37
+ ## Behavior and migration notes
38
+
39
+ - `Arrayable<T>` is the canonical form for value-or-array contracts.
40
+ - It replaces both `T | T[]` and `T | Array<T>` spelling variants.
41
+ - Keep this alias in public callback and option signatures to reduce repeated union boilerplate.
42
+
43
+ ## Additional examples
44
+
45
+ ### ❌ Incorrect — Additional example
46
+
47
+ ```ts
48
+ type Input = number | Array<number>; // Union repeated inline across modules
49
+ ```
50
+
51
+ ### ✅ Correct — Additional example
52
+
53
+ ```ts
54
+ type Input = Arrayable<number>;
55
+ ```
56
+
57
+ ### ✅ Correct — Repository-wide usage
58
+
59
+ ```ts
60
+ type QueryParam = Arrayable<string>;
61
+ ```
62
+
63
+ ## ESLint flat config example
64
+
65
+ ```ts
66
+ import typefest from "eslint-plugin-typefest";
67
+
68
+ export default [
69
+ {
70
+ plugins: { typefest },
71
+ rules: {
72
+ "typefest/prefer-type-fest-arrayable": "error",
73
+ },
74
+ },
75
+ ];
76
+ ```
77
+
78
+ ## When not to use it
79
+
80
+ Disable this rule if existing public type names must remain unchanged for compatibility.
81
+
82
+ ## Package documentation
83
+
84
+ TypeFest package documentation:
85
+
86
+ Source file: [`source/arrayable.d.ts`](https://github.com/sindresorhus/type-fest/blob/main/source/arrayable.d.ts)
87
+
88
+ ````ts
89
+ /**
90
+ Create a type that represents either the value or an array of the value.
91
+
92
+ @see {@link Promisable}
93
+
94
+ @example
95
+ ```
96
+ import type {Arrayable} from 'type-fest';
97
+
98
+ function bundle(input: string, output: Arrayable<string>) {
99
+ const outputList = Array.isArray(output) ? output : [output];
100
+
101
+ // …
102
+
103
+ for (const output of outputList) {
104
+ console.log(`write ${input} to: ${output}`);
105
+ }
106
+ }
107
+
108
+ bundle('src/index.js', 'dist/index.js');
109
+ bundle('src/index.js', ['dist/index.cjs', 'dist/index.mjs']);
110
+ ```
111
+
112
+ @category Array
113
+ */
114
+ ````
115
+
116
+ > **Rule catalog ID:** R036
117
+
118
+ ## Further reading
119
+
120
+ - [`type-fest` README](https://github.com/sindresorhus/type-fest)
121
+ - [`type-fest` npm documentation](https://www.npmjs.com/package/type-fest)
122
+ - [TypeScript Handbook: Utility Types](https://www.typescriptlang.org/docs/handbook/utility-types.html)
123
+
124
+ ## Adoption resources
125
+
126
+ - [Rule adoption checklist](./guides/adoption-checklist.md)
127
+ - [Rollout and fix safety](./guides/rollout-and-fix-safety.md)