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,138 @@
1
+ # prefer-ts-extras-array-concat
2
+
3
+ Prefer [`arrayConcat`](https://github.com/sindresorhus/ts-extras/blob/main/source/array-concat.ts) from `ts-extras` over `array.concat(...)`.
4
+
5
+ `arrayConcat(...)` preserves stronger tuple and readonly-array typing across generic flows.
6
+
7
+ ## Targeted pattern scope
8
+
9
+ This rule focuses on direct `left.concat(right)` calls that can be migrated to `arrayConcat(left, right)` with deterministic fixes.
10
+
11
+ - `left.concat(right)` call sites that can use `arrayConcat(left, right)`.
12
+
13
+ Alias indirection, wrapper helpers, and non-canonical call shapes are excluded to keep `arrayConcat(left, right)` migrations safe.
14
+
15
+ ## What this rule reports
16
+
17
+ This rule reports `left.concat(right)` call sites when `arrayConcat(left, right)` is the intended replacement.
18
+
19
+ - `left.concat(right)` call sites that can use `arrayConcat(left, right)`.
20
+
21
+ ## Why this rule exists
22
+
23
+ `arrayConcat` preserves tuple/readonly array typing better when concatenating heterogeneous arrays.
24
+
25
+ - The output element type is inferred more predictably in generic utilities.
26
+ - Concatenation style is consistent with other `ts-extras` array helpers.
27
+ - Post-concat casts are needed less often.
28
+
29
+ ## ❌ Incorrect
30
+
31
+ ```ts
32
+ const allIds = primaryIds.concat(secondaryIds);
33
+ ```
34
+
35
+ ## ✅ Correct
36
+
37
+ ```ts
38
+ const allIds = arrayConcat(primaryIds, secondaryIds);
39
+ ```
40
+
41
+ ## Behavior and migration notes
42
+
43
+ - Runtime behavior matches native `Array.prototype.concat`.
44
+ - Concatenation is still shallow (no deep cloning).
45
+ - Array arguments are flattened one level, matching native concat semantics.
46
+
47
+ ## Additional examples
48
+
49
+ ### ❌ Incorrect — Additional example
50
+
51
+ ```ts
52
+ const combined = left.concat(right);
53
+ ```
54
+
55
+ ### ✅ Correct — Additional example
56
+
57
+ ```ts
58
+ const combined = arrayConcat(left, right);
59
+ ```
60
+
61
+ ### ✅ Correct — Repository-wide usage
62
+
63
+ ```ts
64
+ const merged = arrayConcat(baseFlags, envFlags);
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-array-concat": "error",
77
+ },
78
+ },
79
+ ];
80
+ ```
81
+
82
+ ## When not to use it
83
+
84
+ Disable this rule if your codebase standardizes on native `.concat()` for framework interop.
85
+
86
+ ## Package documentation
87
+
88
+ ts-extras package documentation:
89
+
90
+ Source file: [`source/array-concat.ts`](https://github.com/sindresorhus/ts-extras/blob/main/source/array-concat.ts)
91
+
92
+ ````ts
93
+ /**
94
+ A strongly-typed version of `Array#concat()` that properly handles arrays of different types.
95
+
96
+ TypeScript's built-in `Array#concat()` has issues with type inference when concatenating arrays of different types or empty arrays. This function provides proper type inference for heterogeneous array concatenation.
97
+
98
+ Note: This function preserves array holes, matching the native `Array#concat()` behavior.
99
+
100
+ @example
101
+ ```
102
+ import {arrayConcat} from 'ts-extras';
103
+
104
+ const strings = ['a', 'b'];
105
+ const numbers = [1, 2];
106
+
107
+ // TypeScript's built-in concat would error here
108
+ const mixed = arrayConcat(strings, numbers);
109
+ //=> ['a', 'b', 1, 2]
110
+ // ^? (string | number)[]
111
+
112
+ // Works with tuples
113
+ const tuple = arrayConcat(['x'] as const, [1] as const);
114
+ //=> ['x', 1]
115
+ // ^? (1 | 'x')[]
116
+
117
+ // Handles empty arrays correctly
118
+ const withEmpty = arrayConcat([], ['hello']);
119
+ //=> ['hello']
120
+ // ^? string[]
121
+ ```
122
+
123
+ @category Improved builtin
124
+ */
125
+ ````
126
+
127
+ > **Rule catalog ID:** R002
128
+
129
+ ## Further reading
130
+
131
+ - [`ts-extras` README](https://github.com/sindresorhus/ts-extras)
132
+ - [`ts-extras` package reference](https://www.npmjs.com/package/ts-extras)
133
+ - [TypeScript Handbook: Narrowing](https://www.typescriptlang.org/docs/handbook/2/narrowing.html)
134
+
135
+ ## Adoption resources
136
+
137
+ - [Rule adoption checklist](./guides/adoption-checklist.md)
138
+ - [Rollout and fix safety](./guides/rollout-and-fix-safety.md)
@@ -0,0 +1,108 @@
1
+ # prefer-ts-extras-array-find-last-index
2
+
3
+ Prefer [`arrayFindLastIndex`](https://github.com/sindresorhus/ts-extras/blob/main/source/array-find-last-index.ts) from `ts-extras` over `array.findLastIndex(...)`.
4
+
5
+ `arrayFindLastIndex(...)` improves predicate inference in typed arrays.
6
+
7
+ ## Targeted pattern scope
8
+
9
+ This rule focuses on direct `array.findLastIndex(predicate)` calls that can be migrated to `arrayFindLastIndex(array, predicate)` with deterministic fixes.
10
+
11
+ - `array.findLastIndex(predicate)` call sites that can use `arrayFindLastIndex(array, predicate)`.
12
+
13
+ Alias indirection, wrapper helpers, and non-canonical call shapes are excluded to keep `arrayFindLastIndex(array, predicate)` migrations safe.
14
+
15
+ ## What this rule reports
16
+
17
+ This rule reports `array.findLastIndex(predicate)` call sites when `arrayFindLastIndex(array, predicate)` is the intended replacement.
18
+
19
+ - `array.findLastIndex(predicate)` call sites that can use `arrayFindLastIndex(array, predicate)`.
20
+
21
+ ## Why this rule exists
22
+
23
+ `arrayFindLastIndex` standardizes reverse index lookup and keeps call signatures aligned with other `ts-extras` search helpers.
24
+
25
+ - Reverse index scans are explicit at the call site.
26
+ - Search code avoids mixed native/helper patterns.
27
+ - Index-based follow-up logic stays uniform across modules.
28
+
29
+ ## ❌ Incorrect
30
+
31
+ ```ts
32
+ const index = monitors.findLastIndex((entry) => entry.id === targetId);
33
+ ```
34
+
35
+ ## ✅ Correct
36
+
37
+ ```ts
38
+ const index = arrayFindLastIndex(monitors, (entry) => entry.id === targetId);
39
+ ```
40
+
41
+ ## Behavior and migration notes
42
+
43
+ - Runtime behavior matches native `Array.prototype.findLastIndex`.
44
+ - Search still proceeds from right to left.
45
+ - If no element matches, the result is `-1`.
46
+
47
+ ## Additional examples
48
+
49
+ ### ❌ Incorrect — Additional example
50
+
51
+ ```ts
52
+ const index = logs.findLastIndex((entry) => entry.level === "warn");
53
+ ```
54
+
55
+ ### ✅ Correct — Additional example
56
+
57
+ ```ts
58
+ const index = arrayFindLastIndex(logs, (entry) => entry.level === "warn");
59
+ ```
60
+
61
+ ### ✅ Correct — Repository-wide usage
62
+
63
+ ```ts
64
+ const retryIndex = arrayFindLastIndex(attempts, (attempt) => !attempt.success);
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-array-find-last-index": "error",
77
+ },
78
+ },
79
+ ];
80
+ ```
81
+
82
+ ## When not to use it
83
+
84
+ Disable this rule if your codebase has standardized on native `.findLastIndex()`.
85
+
86
+ ## Package documentation
87
+
88
+ ts-extras package documentation:
89
+
90
+ `ts-extras@0.17.x` does not currently expose `arrayFindLastIndex` in its published API, so there is no canonical `source/*.ts` link for this helper yet.
91
+
92
+ Reference links:
93
+
94
+ - [`ts-extras` API list (README)](https://github.com/sindresorhus/ts-extras/blob/main/readme.md#api)
95
+ - [`ts-extras` source directory](https://github.com/sindresorhus/ts-extras/tree/main/source)
96
+
97
+ > **Rule catalog ID:** R005
98
+
99
+ ## Further reading
100
+
101
+ - [`ts-extras` README](https://github.com/sindresorhus/ts-extras)
102
+ - [`ts-extras` package reference](https://www.npmjs.com/package/ts-extras)
103
+ - [TypeScript Handbook: Narrowing](https://www.typescriptlang.org/docs/handbook/2/narrowing.html)
104
+
105
+ ## Adoption resources
106
+
107
+ - [Rule adoption checklist](./guides/adoption-checklist.md)
108
+ - [Rollout and fix safety](./guides/rollout-and-fix-safety.md)
@@ -0,0 +1,108 @@
1
+ # prefer-ts-extras-array-find-last
2
+
3
+ Prefer [`arrayFindLast`](https://github.com/sindresorhus/ts-extras/blob/main/source/array-find-last.ts) from `ts-extras` over `array.findLast(...)`.
4
+
5
+ `arrayFindLast(...)` improves predicate inference and value narrowing in typed arrays.
6
+
7
+ ## Targeted pattern scope
8
+
9
+ This rule focuses on direct `array.findLast(predicate)` calls that can be migrated to `arrayFindLast(array, predicate)` with deterministic fixes.
10
+
11
+ - `array.findLast(predicate)` call sites that can use `arrayFindLast(array, predicate)`.
12
+
13
+ Alias indirection, wrapper helpers, and non-canonical call shapes are excluded to keep `arrayFindLast(array, predicate)` migrations safe.
14
+
15
+ ## What this rule reports
16
+
17
+ This rule reports `array.findLast(predicate)` call sites when `arrayFindLast(array, predicate)` is the intended replacement.
18
+
19
+ - `array.findLast(predicate)` call sites that can use `arrayFindLast(array, predicate)`.
20
+
21
+ ## Why this rule exists
22
+
23
+ `arrayFindLast` makes reverse-direction predicate lookups explicit and keeps them aligned with the `ts-extras` helper style.
24
+
25
+ - Reverse scans are easier to spot during code review.
26
+ - Call signatures stay consistent with `arrayFind` / `arrayFindLastIndex`.
27
+ - Utility code that depends on "latest match" is easier to audit.
28
+
29
+ ## ❌ Incorrect
30
+
31
+ ```ts
32
+ const monitor = monitors.findLast((entry) => entry.id === targetId);
33
+ ```
34
+
35
+ ## ✅ Correct
36
+
37
+ ```ts
38
+ const monitor = arrayFindLast(monitors, (entry) => entry.id === targetId);
39
+ ```
40
+
41
+ ## Behavior and migration notes
42
+
43
+ - Runtime behavior matches native `Array.prototype.findLast`.
44
+ - Search direction remains right-to-left.
45
+ - Result is the matching element, or `undefined` if no match exists.
46
+
47
+ ## Additional examples
48
+
49
+ ### ❌ Incorrect — Additional example
50
+
51
+ ```ts
52
+ const latest = events.findLast((entry) => entry.type === "login");
53
+ ```
54
+
55
+ ### ✅ Correct — Additional example
56
+
57
+ ```ts
58
+ const latest = arrayFindLast(events, (entry) => entry.type === "login");
59
+ ```
60
+
61
+ ### ✅ Correct — Repository-wide usage
62
+
63
+ ```ts
64
+ const trailingError = arrayFindLast(logs, (entry) => entry.level === "error");
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-array-find-last": "error",
77
+ },
78
+ },
79
+ ];
80
+ ```
81
+
82
+ ## When not to use it
83
+
84
+ Disable this rule if your team intentionally uses native `.findLast()` everywhere.
85
+
86
+ ## Package documentation
87
+
88
+ ts-extras package documentation:
89
+
90
+ `ts-extras@0.17.x` does not currently expose `arrayFindLast` in its published API, so there is no canonical `source/*.ts` link for this helper yet.
91
+
92
+ Reference links:
93
+
94
+ - [`ts-extras` API list (README)](https://github.com/sindresorhus/ts-extras/blob/main/readme.md#api)
95
+ - [`ts-extras` source directory](https://github.com/sindresorhus/ts-extras/tree/main/source)
96
+
97
+ > **Rule catalog ID:** R004
98
+
99
+ ## Further reading
100
+
101
+ - [`ts-extras` README](https://github.com/sindresorhus/ts-extras)
102
+ - [`ts-extras` package reference](https://www.npmjs.com/package/ts-extras)
103
+ - [TypeScript Handbook: Narrowing](https://www.typescriptlang.org/docs/handbook/2/narrowing.html)
104
+
105
+ ## Adoption resources
106
+
107
+ - [Rule adoption checklist](./guides/adoption-checklist.md)
108
+ - [Rollout and fix safety](./guides/rollout-and-fix-safety.md)
@@ -0,0 +1,108 @@
1
+ # prefer-ts-extras-array-find
2
+
3
+ Prefer [`arrayFind`](https://github.com/sindresorhus/ts-extras/blob/main/source/array-find.ts) from `ts-extras` over `array.find(...)`.
4
+
5
+ `arrayFind(...)` improves predicate inference and value narrowing in typed arrays.
6
+
7
+ ## Targeted pattern scope
8
+
9
+ This rule focuses on direct `array.find(predicate)` calls that can be migrated to `arrayFind(array, predicate)` with deterministic fixes.
10
+
11
+ - `array.find(predicate)` call sites that can use `arrayFind(array, predicate)`.
12
+
13
+ Alias indirection, wrapper helpers, and non-canonical call shapes are excluded to keep `arrayFind(array, predicate)` migrations safe.
14
+
15
+ ## What this rule reports
16
+
17
+ This rule reports `array.find(predicate)` call sites when `arrayFind(array, predicate)` is the intended replacement.
18
+
19
+ - `array.find(predicate)` call sites that can use `arrayFind(array, predicate)`.
20
+
21
+ ## Why this rule exists
22
+
23
+ `arrayFind` keeps predicate-driven lookup aligned with the other `ts-extras` helper APIs and improves inference in generic code.
24
+
25
+ - Predicate call sites are standardized across modules.
26
+ - Result types are easier to follow in utility layers.
27
+ - Local type assertions after `find` calls are reduced.
28
+
29
+ ## ❌ Incorrect
30
+
31
+ ```ts
32
+ const monitor = monitors.find((entry) => entry.id === targetId);
33
+ ```
34
+
35
+ ## ✅ Correct
36
+
37
+ ```ts
38
+ const monitor = arrayFind(monitors, (entry) => entry.id === targetId);
39
+ ```
40
+
41
+ ## Behavior and migration notes
42
+
43
+ - Runtime behavior matches native `Array.prototype.find`.
44
+ - Search still returns the first matching element.
45
+ - If no element matches, the result is `undefined`.
46
+
47
+ ## Additional examples
48
+
49
+ ### ❌ Incorrect — Additional example
50
+
51
+ ```ts
52
+ const user = users.find((item) => item.id === userId);
53
+ ```
54
+
55
+ ### ✅ Correct — Additional example
56
+
57
+ ```ts
58
+ const user = arrayFind(users, (item) => item.id === userId);
59
+ ```
60
+
61
+ ### ✅ Correct — Repository-wide usage
62
+
63
+ ```ts
64
+ const firstError = arrayFind(logs, (entry) => entry.level === "error");
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-array-find": "error",
77
+ },
78
+ },
79
+ ];
80
+ ```
81
+
82
+ ## When not to use it
83
+
84
+ Disable this rule if your team requires native `.find()` for consistency with existing shared APIs.
85
+
86
+ ## Package documentation
87
+
88
+ ts-extras package documentation:
89
+
90
+ `ts-extras@0.17.x` does not currently expose `arrayFind` in its published API, so there is no canonical `source/*.ts` link for this helper yet.
91
+
92
+ Reference links:
93
+
94
+ - [`ts-extras` API list (README)](https://github.com/sindresorhus/ts-extras/blob/main/readme.md#api)
95
+ - [`ts-extras` source directory](https://github.com/sindresorhus/ts-extras/tree/main/source)
96
+
97
+ > **Rule catalog ID:** R003
98
+
99
+ ## Further reading
100
+
101
+ - [`ts-extras` README](https://github.com/sindresorhus/ts-extras)
102
+ - [`ts-extras` package reference](https://www.npmjs.com/package/ts-extras)
103
+ - [TypeScript Handbook: Narrowing](https://www.typescriptlang.org/docs/handbook/2/narrowing.html)
104
+
105
+ ## Adoption resources
106
+
107
+ - [Rule adoption checklist](./guides/adoption-checklist.md)
108
+ - [Rollout and fix safety](./guides/rollout-and-fix-safety.md)
@@ -0,0 +1,132 @@
1
+ # prefer-ts-extras-array-first
2
+
3
+ Require [`arrayFirst`](https://github.com/sindresorhus/ts-extras/blob/main/source/array-first.ts) from `ts-extras` over direct `array[0]` access.
4
+
5
+ ## Targeted pattern scope
6
+
7
+ This rule only matches direct first-element index access (`receiver[0]`) where the receiver expression can be reused unchanged in `arrayFirst(receiver)`.
8
+
9
+ - Direct first-element access using index form (`array[0]`).
10
+
11
+ Syntactically similar alternatives are intentionally out of scope unless they preserve the same AST shape.
12
+
13
+ ## What this rule reports
14
+
15
+ This rule reports direct `receiver[0]` access sites that can be safely replaced with `arrayFirst(receiver)`.
16
+
17
+ - Direct first-element access using index form (`array[0]`).
18
+
19
+ ## Why this rule exists
20
+
21
+ `arrayFirst` makes first-element access explicit and keeps tuple/readonly inference consistent with the rest of the `ts-extras` helper set.
22
+
23
+ - First-element lookups are easier to search and standardize.
24
+ - Tuple-aware access patterns are consistent in shared utilities.
25
+ - Teams avoid mixing helper-based and index-based first-item access.
26
+
27
+ ## ❌ Incorrect
28
+
29
+ ```ts
30
+ const first = values[0];
31
+ ```
32
+
33
+ ## ✅ Correct
34
+
35
+ ```ts
36
+ const first = arrayFirst(values);
37
+ ```
38
+
39
+ ## Behavior and migration notes
40
+
41
+ - Runtime behavior matches `array[0]` access.
42
+ - Empty arrays still yield `undefined`.
43
+ - This rule targets index access; optional chaining around access (`array?.[0]`) should be reviewed manually during migration.
44
+
45
+ ## Additional examples
46
+
47
+ ### ❌ Incorrect — Additional example
48
+
49
+ ```ts
50
+ const first = rows[0];
51
+ ```
52
+
53
+ ### ✅ Correct — Additional example
54
+
55
+ ```ts
56
+ const first = arrayFirst(rows);
57
+ ```
58
+
59
+ ### ✅ Correct — Repository-wide usage
60
+
61
+ ```ts
62
+ const header = arrayFirst(headers);
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-array-first": "error",
75
+ },
76
+ },
77
+ ];
78
+ ```
79
+
80
+ ## When not to use it
81
+
82
+ Disable this rule if direct index access is required in performance-sensitive hotspots.
83
+
84
+ ## Package documentation
85
+
86
+ ts-extras package documentation:
87
+
88
+ Source file: [`source/array-first.ts`](https://github.com/sindresorhus/ts-extras/blob/main/source/array-first.ts)
89
+
90
+ ````ts
91
+ /**
92
+ Return the first item of an array with stronger typing for tuples.
93
+
94
+ This mirrors getting `array[0]` but with better type safety and handling for empty arrays.
95
+
96
+ @example
97
+ ```
98
+ import {arrayFirst} from 'ts-extras';
99
+
100
+ const tuple = ['abc', 123, true] as const;
101
+ const first = arrayFirst(tuple);
102
+ //=> 'abc'
103
+ // ^? 'abc'
104
+
105
+ const array = ['a', 'b', 'c'];
106
+ const maybeFirst = arrayFirst(array);
107
+ //=> 'a'
108
+ // ^? string | undefined
109
+
110
+ // Empty arrays
111
+ const empty: string[] = [];
112
+ const noFirst = arrayFirst(empty);
113
+ //=> undefined
114
+ // ^? string | undefined
115
+ ```
116
+
117
+ @category Improved builtin
118
+ */
119
+ ````
120
+
121
+ > **Rule catalog ID:** R006
122
+
123
+ ## Further reading
124
+
125
+ - [`ts-extras` README](https://github.com/sindresorhus/ts-extras)
126
+ - [`ts-extras` package reference](https://www.npmjs.com/package/ts-extras)
127
+ - [TypeScript Handbook: Narrowing](https://www.typescriptlang.org/docs/handbook/2/narrowing.html)
128
+
129
+ ## Adoption resources
130
+
131
+ - [Rule adoption checklist](./guides/adoption-checklist.md)
132
+ - [Rollout and fix safety](./guides/rollout-and-fix-safety.md)