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,143 @@
1
+ # prefer-ts-extras-is-present
2
+
3
+ Require [`isPresent`](https://github.com/sindresorhus/ts-extras/blob/main/source/is-present.ts) from `ts-extras` for direct nullish checks outside `Array.prototype.filter` callbacks.
4
+
5
+ ## Targeted pattern scope
6
+
7
+ This rule scopes matching to direct nullish-check expressions outside `.filter(...)` callbacks.
8
+
9
+ - Direct nullish checks outside `Array.prototype.filter` callbacks:
10
+ - `value != null`
11
+ - `value == null`
12
+ - `value !== null && value !== undefined`
13
+ - `value === null || value === undefined`
14
+
15
+ Filter callbacks are handled by the dedicated filter rule; larger boolean expressions are only matched when they keep these shapes.
16
+
17
+ ## What this rule reports
18
+
19
+ This rule reports direct nullish comparisons that should use `isPresent(...)` helpers.
20
+
21
+ - Direct nullish checks outside `Array.prototype.filter` callbacks:
22
+ - `value != null`
23
+ - `value == null`
24
+ - `value !== null && value !== undefined`
25
+ - `value === null || value === undefined`
26
+
27
+ ## Why this rule exists
28
+
29
+ `isPresent` gives one canonical predicate for non-nullish checks and reduces mixed null/undefined comparison styles.
30
+
31
+ - Nullish guard intent is explicit.
32
+ - Narrowing to `NonNullable<T>` follows one convention.
33
+ - Verbose inline nullish checks are removed.
34
+
35
+ ## ❌ Incorrect
36
+
37
+ ```ts
38
+ if (value != null) {
39
+ consume(value);
40
+ }
41
+
42
+ if (value === null || value === undefined) {
43
+ return;
44
+ }
45
+ ```
46
+
47
+ ## ✅ Correct
48
+
49
+ ```ts
50
+ if (isPresent(value)) {
51
+ consume(value);
52
+ }
53
+
54
+ if (!isPresent(value)) {
55
+ return;
56
+ }
57
+ ```
58
+
59
+ ## Behavior and migration notes
60
+
61
+ - `isPresent(value)` means value is neither `null` nor `undefined`.
62
+ - `!isPresent(value)` is the nullish guard equivalent.
63
+ - Filter-specific nullish patterns are covered by `prefer-ts-extras-is-present-filter`.
64
+
65
+ ## Additional examples
66
+
67
+ ### ❌ Incorrect — Additional example
68
+
69
+ ```ts
70
+ if (profile != null) {
71
+ render(profile);
72
+ }
73
+ ```
74
+
75
+ ### ✅ Correct — Additional example
76
+
77
+ ```ts
78
+ if (isPresent(profile)) {
79
+ render(profile);
80
+ }
81
+ ```
82
+
83
+ ### ✅ Correct — Repository-wide usage
84
+
85
+ ```ts
86
+ const available = isPresent(cacheEntry);
87
+ ```
88
+
89
+ ## ESLint flat config example
90
+
91
+ ```ts
92
+ import typefest from "eslint-plugin-typefest";
93
+
94
+ export default [
95
+ {
96
+ plugins: { typefest },
97
+ rules: {
98
+ "typefest/prefer-ts-extras-is-present": "error",
99
+ },
100
+ },
101
+ ];
102
+ ```
103
+
104
+ ## When not to use it
105
+
106
+ Disable this rule if your code style requires explicit `=== null` / `=== undefined` branches.
107
+
108
+ ## Package documentation
109
+
110
+ ts-extras package documentation:
111
+
112
+ Source file: [`source/is-present.ts`](https://github.com/sindresorhus/ts-extras/blob/main/source/is-present.ts)
113
+
114
+ ````ts
115
+ /**
116
+ Check whether a value is present (non-nullable), meaning it is neither `null` nor `undefined`.
117
+
118
+ This can be useful as a type guard, as for example, `[1, null].filter(Boolean)` does not always type-guard correctly.
119
+
120
+ @example
121
+ ```
122
+ import {isPresent} from 'ts-extras';
123
+
124
+ [1, null, 2, undefined].filter(isPresent);
125
+ //=> [1, 2]
126
+ ```
127
+
128
+ @category Type guard
129
+ */
130
+ ````
131
+
132
+ > **Rule catalog ID:** R021
133
+
134
+ ## Further reading
135
+
136
+ - [`ts-extras` README](https://github.com/sindresorhus/ts-extras)
137
+ - [`ts-extras` package reference](https://www.npmjs.com/package/ts-extras)
138
+ - [TypeScript Handbook: Narrowing](https://www.typescriptlang.org/docs/handbook/2/narrowing.html)
139
+
140
+ ## Adoption resources
141
+
142
+ - [Rule adoption checklist](./guides/adoption-checklist.md)
143
+ - [Rollout and fix safety](./guides/rollout-and-fix-safety.md)
@@ -0,0 +1,116 @@
1
+ # prefer-ts-extras-is-safe-integer
2
+
3
+ Prefer [`isSafeInteger`](https://github.com/sindresorhus/ts-extras/blob/main/source/is-safe-integer.ts) from `ts-extras` over `Number.isSafeInteger(...)`.
4
+
5
+ This keeps predicate usage consistent with other `ts-extras` narrowing helpers.
6
+
7
+ ## Targeted pattern scope
8
+
9
+ This rule focuses on direct `Number.isSafeInteger(value)` calls that can be migrated to `isSafeInteger(value)` with deterministic fixes.
10
+
11
+ - `Number.isSafeInteger(value)` call sites that can use `isSafeInteger(value)`.
12
+
13
+ Alias indirection, wrapper helpers, and non-canonical call shapes are excluded to keep `isSafeInteger(value)` migrations safe.
14
+
15
+ ## What this rule reports
16
+
17
+ This rule reports `Number.isSafeInteger(value)` call sites when `isSafeInteger(value)` is the intended replacement.
18
+
19
+ - `Number.isSafeInteger(value)` call sites that can use `isSafeInteger(value)`.
20
+
21
+ ## Why this rule exists
22
+
23
+ `isSafeInteger` standardizes safe-integer validation and keeps numeric guard usage consistent with other `ts-extras` helpers.
24
+
25
+ - Safety-bound checks use one helper convention.
26
+ - Predicate style is consistent with `isInteger` and `isFinite`.
27
+ - Guard code for IDs/counters avoids mixed native/helper forms.
28
+
29
+ ## ❌ Incorrect
30
+
31
+ ```ts
32
+ const isSafe = Number.isSafeInteger(value);
33
+ ```
34
+
35
+ ## ✅ Correct
36
+
37
+ ```ts
38
+ const isSafe = isSafeInteger(value);
39
+ ```
40
+
41
+ ## Behavior and migration notes
42
+
43
+ - Runtime behavior matches native `Number.isSafeInteger`.
44
+ - Values outside `Number.MIN_SAFE_INTEGER` / `Number.MAX_SAFE_INTEGER` return `false`.
45
+ - Non-number values are not coerced.
46
+
47
+ ## Additional examples
48
+
49
+ ### ❌ Incorrect — Additional example
50
+
51
+ ```ts
52
+ if (Number.isSafeInteger(quantity)) {
53
+ persist(quantity);
54
+ }
55
+ ```
56
+
57
+ ### ✅ Correct — Additional example
58
+
59
+ ```ts
60
+ if (isSafeInteger(quantity)) {
61
+ persist(quantity);
62
+ }
63
+ ```
64
+
65
+ ### ✅ Correct — Repository-wide usage
66
+
67
+ ```ts
68
+ const supported = isSafeInteger(index);
69
+ ```
70
+
71
+ ## ESLint flat config example
72
+
73
+ ```ts
74
+ import typefest from "eslint-plugin-typefest";
75
+
76
+ export default [
77
+ {
78
+ plugins: { typefest },
79
+ rules: {
80
+ "typefest/prefer-ts-extras-is-safe-integer": "error",
81
+ },
82
+ },
83
+ ];
84
+ ```
85
+
86
+ ## When not to use it
87
+
88
+ Disable this rule if your team enforces native `Number.isSafeInteger` calls.
89
+
90
+ ## Package documentation
91
+
92
+ ts-extras package documentation:
93
+
94
+ Source file: [`source/is-safe-integer.ts`](https://github.com/sindresorhus/ts-extras/blob/main/source/is-safe-integer.ts)
95
+
96
+ ```ts
97
+ /**
98
+ A strongly-typed version of `Number.isSafeInteger()`.
99
+
100
+ @category Improved builtin
101
+ @category Type guard
102
+ */
103
+ ```
104
+
105
+ > **Rule catalog ID:** R023
106
+
107
+ ## Further reading
108
+
109
+ - [`ts-extras` README](https://github.com/sindresorhus/ts-extras)
110
+ - [`ts-extras` package reference](https://www.npmjs.com/package/ts-extras)
111
+ - [TypeScript Handbook: Narrowing](https://www.typescriptlang.org/docs/handbook/2/narrowing.html)
112
+
113
+ ## Adoption resources
114
+
115
+ - [Rule adoption checklist](./guides/adoption-checklist.md)
116
+ - [Rollout and fix safety](./guides/rollout-and-fix-safety.md)
@@ -0,0 +1,150 @@
1
+ # prefer-ts-extras-key-in
2
+
3
+ Prefer [`keyIn`](https://github.com/sindresorhus/ts-extras/blob/main/source/key-in.ts) from `ts-extras` over `key in object` checks.
4
+
5
+ `keyIn(...)` provides better key narrowing for dynamic property checks.
6
+
7
+ ## Targeted pattern scope
8
+
9
+ This rule focuses on direct `key in object` expressions that can be migrated to `keyIn(key, object)` with deterministic fixes.
10
+
11
+ - Native `key in object` expressions that can use `keyIn(key, object)`.
12
+
13
+ Alias indirection, wrapper helpers, and non-canonical call shapes are excluded to keep `keyIn(key, object)` migrations safe.
14
+
15
+ ## What this rule reports
16
+
17
+ This rule reports `key in object` expressions when `keyIn(key, object)` is the intended replacement.
18
+
19
+ - Native `key in object` expressions that can use `keyIn(key, object)`.
20
+
21
+ ## Why this rule exists
22
+
23
+ `keyIn` expresses key-membership checks with a helper that improves key narrowing in typed code.
24
+
25
+ - Dynamic key checks have one canonical form.
26
+ - Guarded property access needs fewer casts.
27
+ - Membership guards are easier to audit in review.
28
+
29
+ ## ❌ Incorrect
30
+
31
+ ```ts
32
+ if (key in payload) {
33
+ // ...
34
+ }
35
+ ```
36
+
37
+ ## ✅ Correct
38
+
39
+ ```ts
40
+ if (keyIn(key, payload)) {
41
+ // ...
42
+ }
43
+ ```
44
+
45
+ ## Behavior and migration notes
46
+
47
+ - Runtime semantics match the `in` operator for property existence on object/prototype chains.
48
+ - `keyIn` is useful when key values start as `string`/`PropertyKey` and need narrowing.
49
+ - If your code intentionally requires direct `in` syntax (for style or tooling), keep native checks.
50
+
51
+ ## Additional examples
52
+
53
+ ### ❌ Incorrect — Additional example
54
+
55
+ ```ts
56
+ if (candidate in record) {
57
+ console.log(record[candidate as keyof typeof record]);
58
+ }
59
+ ```
60
+
61
+ ### ✅ Correct — Additional example
62
+
63
+ ```ts
64
+ if (keyIn(candidate, record)) {
65
+ console.log(record[candidate]);
66
+ }
67
+ ```
68
+
69
+ ### ✅ Correct — Repository-wide usage
70
+
71
+ ```ts
72
+ const canRead = keyIn(data, selectedKey);
73
+ ```
74
+
75
+ ## ESLint flat config example
76
+
77
+ ```ts
78
+ import typefest from "eslint-plugin-typefest";
79
+
80
+ export default [
81
+ {
82
+ plugins: { typefest },
83
+ rules: {
84
+ "typefest/prefer-ts-extras-key-in": "error",
85
+ },
86
+ },
87
+ ];
88
+ ```
89
+
90
+ ## When not to use it
91
+
92
+ Disable this rule if direct `in` expressions are required by coding standards.
93
+
94
+ ## Package documentation
95
+
96
+ ts-extras package documentation:
97
+
98
+ Source file: [`source/key-in.ts`](https://github.com/sindresorhus/ts-extras/blob/main/source/key-in.ts)
99
+
100
+ ````ts
101
+ /**
102
+ Check if a key exists in an object and narrow the key type.
103
+
104
+ This function performs __key narrowing__ - it narrows the key variable to only keys that actually exist in the object. Uses the `in` operator to check the entire prototype chain.
105
+
106
+ When `keyIn` returns `true`, the key is narrowed to keys that exist in the object.
107
+ When it returns `false`, the key type remains unchanged.
108
+
109
+ Unlike `objectHasIn` and `objectHasOwn` (both do object narrowing), this narrows the _key_ type, making it useful for validating union types of possible keys.
110
+
111
+ @example
112
+ ```
113
+ import {keyIn} from 'ts-extras';
114
+
115
+ const object = {foo: 1, bar: 2};
116
+ const key = 'foo' as 'foo' | 'bar' | 'baz';
117
+
118
+ if (keyIn(object, key)) {
119
+ // `key` is now: 'foo' | 'bar' (narrowed from union)
120
+ console.log(object[key]); // Safe access
121
+ } else {
122
+ // `key` remains: 'foo' | 'bar' | 'baz' (unchanged)
123
+ }
124
+
125
+ // Works with symbols
126
+ const symbol = Symbol.for('myKey');
127
+ const objectWithSymbol = {[symbol]: 'value'};
128
+ if (keyIn(objectWithSymbol, symbol)) {
129
+ // symbol is narrowed to existing symbol keys
130
+ }
131
+ ```
132
+
133
+ @note This uses the `in` operator and checks the prototype chain, but blocks `__proto__` and `constructor` for security.
134
+
135
+ @category Type guard
136
+ */
137
+ ````
138
+
139
+ > **Rule catalog ID:** R024
140
+
141
+ ## Further reading
142
+
143
+ - [`ts-extras` README](https://github.com/sindresorhus/ts-extras)
144
+ - [`ts-extras` package reference](https://www.npmjs.com/package/ts-extras)
145
+ - [TypeScript Handbook: Narrowing](https://www.typescriptlang.org/docs/handbook/2/narrowing.html)
146
+
147
+ ## Adoption resources
148
+
149
+ - [Rule adoption checklist](./guides/adoption-checklist.md)
150
+ - [Rollout and fix safety](./guides/rollout-and-fix-safety.md)
@@ -0,0 +1,138 @@
1
+ # prefer-ts-extras-not
2
+
3
+ Require [`not`](https://github.com/sindresorhus/ts-extras/blob/main/source/not.ts) from `ts-extras` over inline negated predicate callbacks in `filter` calls.
4
+
5
+ ## Targeted pattern scope
6
+
7
+ This rule focuses on direct `.filter(...)` callbacks that negate a predicate and can be migrated to `not(predicate)` with deterministic fixes.
8
+
9
+ - Inline negated predicate callbacks in `.filter(...)` that can use `not(predicate)`.
10
+ - `array.filter((value) => !predicate(value))`
11
+
12
+ Alias indirection, wrapper helpers, and non-canonical call shapes are excluded to keep `not(predicate)` migrations safe.
13
+
14
+ ## What this rule reports
15
+
16
+ This rule reports `.filter(...)` call sites when `not(predicate)` is the intended replacement.
17
+
18
+ - Inline negated predicate callbacks in `.filter(...)` that can use `not(predicate)`.
19
+ - `array.filter((value) => !predicate(value))`
20
+
21
+ ## Why this rule exists
22
+
23
+ `not(predicate)` communicates intent directly and preserves predicate-based typing in a reusable helper.
24
+
25
+ ## ❌ Incorrect
26
+
27
+ ```ts
28
+ const activeUsers = users.filter((user) => !isArchived(user));
29
+ ```
30
+
31
+ ## ✅ Correct
32
+
33
+ ```ts
34
+ const activeUsers = users.filter(not(isArchived));
35
+ ```
36
+
37
+ ## Behavior and migration notes
38
+
39
+ - `not(predicate)` preserves predicate inversion intent in one reusable helper.
40
+ - This rule targets inline negation wrappers inside `filter` callbacks.
41
+ - Callbacks that do extra work beyond predicate negation should be reviewed manually.
42
+
43
+ ## Additional examples
44
+
45
+ ### ❌ Incorrect — Additional example
46
+
47
+ ```ts
48
+ const active = users.filter((user) => !isArchived(user));
49
+ ```
50
+
51
+ ### ✅ Correct — Additional example
52
+
53
+ ```ts
54
+ const active = users.filter(not(isArchived));
55
+ ```
56
+
57
+ ### ✅ Correct — Repository-wide usage
58
+
59
+ ```ts
60
+ const nonEmpty = values.filter(not(isEmptyValue));
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-ts-extras-not": "error",
73
+ },
74
+ },
75
+ ];
76
+ ```
77
+
78
+ ## When not to use it
79
+
80
+ Disable this rule if your codebase requires explicit inline callback bodies for readability.
81
+
82
+ ## Package documentation
83
+
84
+ ts-extras package documentation:
85
+
86
+ Source file: [`source/not.ts`](https://github.com/sindresorhus/ts-extras/blob/main/source/not.ts)
87
+
88
+ ````ts
89
+ /**
90
+ Invert a type predicate function.
91
+
92
+ This utility allows you to create the inverse of any type guard function, using TypeScript's `Exclude` utility type to properly narrow types.
93
+
94
+ @example
95
+ ```
96
+ import {not} from 'ts-extras';
97
+
98
+ const isNullish = (value: unknown): value is null | undefined => value == null;
99
+
100
+ const isNotNullish = not(isNullish);
101
+
102
+ const values = [1, null, 2, undefined, 3];
103
+ const defined = values.filter(isNotNullish);
104
+ //=> [1, 2, 3]
105
+ // with type number[]
106
+
107
+ // Works with any type guard
108
+ const isString = (value: unknown): value is string => typeof value === 'string';
109
+
110
+ const isNotString = not(isString);
111
+
112
+ declare const mixedValue: string | number | boolean;
113
+ if (isNotString(mixedValue)) {
114
+ mixedValue;
115
+ //=> number | boolean
116
+ }
117
+ ```
118
+
119
+ @note TypeScript may fail to narrow types in nested branches, with mutated variables, or when using `Exclude` with complex union types. See:
120
+ - https://github.com/microsoft/TypeScript/issues/44901
121
+ - https://github.com/microsoft/TypeScript/issues/43589
122
+
123
+ @category Type guard
124
+ */
125
+ ````
126
+
127
+ > **Rule catalog ID:** R025
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,130 @@
1
+ # prefer-ts-extras-object-entries
2
+
3
+ Prefer [`objectEntries`](https://github.com/sindresorhus/ts-extras/blob/main/source/object-entries.ts) from `ts-extras` over `Object.entries(...)`.
4
+
5
+ `objectEntries(...)` preserves stronger key/value typing for object iteration and reduces local casting noise.
6
+
7
+ ## Targeted pattern scope
8
+
9
+ This rule focuses on direct `Object.entries(value)` calls that can be migrated to `objectEntries(value)` with deterministic fixes.
10
+
11
+ - `Object.entries(value)` call sites that can use `objectEntries(value)`.
12
+
13
+ Alias indirection, wrapper helpers, and non-canonical call shapes are excluded to keep `objectEntries(value)` migrations safe.
14
+
15
+ ## What this rule reports
16
+
17
+ This rule reports `Object.entries(value)` call sites when `objectEntries(value)` is the intended replacement.
18
+
19
+ - `Object.entries(value)` call sites that can use `objectEntries(value)`.
20
+
21
+ ## Why this rule exists
22
+
23
+ `objectEntries` gives better static typing for entry iteration, especially when the object has known keys.
24
+
25
+ - Key unions are preserved more consistently in loops.
26
+ - Value access in tuple destructuring needs fewer local casts.
27
+ - Team code converges on one explicit runtime helper for entry iteration.
28
+
29
+ ## ❌ Incorrect
30
+
31
+ ```ts
32
+ const pairs = Object.entries(siteStatusById);
33
+ ```
34
+
35
+ ## ✅ Correct
36
+
37
+ ```ts
38
+ const pairs = objectEntries(siteStatusById);
39
+ ```
40
+
41
+ ## Behavior and migration notes
42
+
43
+ - Runtime semantics stay aligned with `Object.entries` (own enumerable string-keyed entries only).
44
+ - Property order behavior remains the same as native `Object.entries`.
45
+ - Symbol keys are still excluded, just like native behavior.
46
+ - For loosely typed inputs (for example `Record<string, unknown>`), key type remains broad (`string`).
47
+
48
+ ## Additional examples
49
+
50
+ ### ❌ Incorrect — Additional example
51
+
52
+ ```ts
53
+ const entries = Object.entries(settings);
54
+ ```
55
+
56
+ ### ✅ Correct — Additional example
57
+
58
+ ```ts
59
+ const entries = objectEntries(settings);
60
+ ```
61
+
62
+ ### ✅ Correct — Repository-wide usage
63
+
64
+ ```ts
65
+ for (const [key, value] of objectEntries(env)) {
66
+ void key;
67
+ void value;
68
+ }
69
+ ```
70
+
71
+ ## ESLint flat config example
72
+
73
+ ```ts
74
+ import typefest from "eslint-plugin-typefest";
75
+
76
+ export default [
77
+ {
78
+ plugins: { typefest },
79
+ rules: {
80
+ "typefest/prefer-ts-extras-object-entries": "error",
81
+ },
82
+ },
83
+ ];
84
+ ```
85
+
86
+ ## When not to use it
87
+
88
+ Disable this rule if you must use native `Object.entries` directly for interop constraints.
89
+
90
+ ## Package documentation
91
+
92
+ ts-extras package documentation:
93
+
94
+ Source file: [`source/object-entries.ts`](https://github.com/sindresorhus/ts-extras/blob/main/source/object-entries.ts)
95
+
96
+ ````ts
97
+ /**
98
+ A strongly-typed version of `Object.entries()`.
99
+
100
+ This is useful since `Object.entries()` always returns an array of `Array<[string, T]>`. This function returns a strongly-typed array of the entries of the given object.
101
+
102
+ - [TypeScript issues about this](https://github.com/microsoft/TypeScript/pull/12253)
103
+
104
+ @example
105
+ ```
106
+ import {objectEntries} from 'ts-extras';
107
+
108
+ const stronglyTypedEntries = objectEntries({a: 1, b: 2, c: 3});
109
+ //=> Array<['a' | 'b' | 'c', number]>
110
+
111
+ const untypedEntries = Object.entries({a: 1, b: 2, c: 3});
112
+ //=> Array<[string, number]>
113
+ ```
114
+
115
+ @category Improved builtin
116
+ */
117
+ ````
118
+
119
+ > **Rule catalog ID:** R026
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)