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.
- package/CHANGELOG.md +1814 -0
- package/LICENSE +21 -0
- package/README.md +282 -0
- package/dist/_internal/array-like-expression.d.ts +67 -0
- package/dist/_internal/array-like-expression.d.ts.map +1 -0
- package/dist/_internal/array-like-expression.js +179 -0
- package/dist/_internal/array-like-expression.js.map +1 -0
- package/dist/_internal/array-method-call-rule.d.ts +34 -0
- package/dist/_internal/array-method-call-rule.d.ts.map +1 -0
- package/dist/_internal/array-method-call-rule.js +49 -0
- package/dist/_internal/array-method-call-rule.js.map +1 -0
- package/dist/_internal/ast-node.d.ts +23 -0
- package/dist/_internal/ast-node.d.ts.map +1 -0
- package/dist/_internal/ast-node.js +38 -0
- package/dist/_internal/ast-node.js.map +1 -0
- package/dist/_internal/bounded-cache.d.ts +42 -0
- package/dist/_internal/bounded-cache.d.ts.map +1 -0
- package/dist/_internal/bounded-cache.js +57 -0
- package/dist/_internal/bounded-cache.js.map +1 -0
- package/dist/_internal/constrained-type-at-location.d.ts +31 -0
- package/dist/_internal/constrained-type-at-location.d.ts.map +1 -0
- package/dist/_internal/constrained-type-at-location.js +61 -0
- package/dist/_internal/constrained-type-at-location.js.map +1 -0
- package/dist/_internal/cycle-safe-linked-search.d.ts +48 -0
- package/dist/_internal/cycle-safe-linked-search.d.ts.map +1 -0
- package/dist/_internal/cycle-safe-linked-search.js +70 -0
- package/dist/_internal/cycle-safe-linked-search.js.map +1 -0
- package/dist/_internal/expression-boolean-memoizer.d.ts +17 -0
- package/dist/_internal/expression-boolean-memoizer.d.ts.map +1 -0
- package/dist/_internal/expression-boolean-memoizer.js +23 -0
- package/dist/_internal/expression-boolean-memoizer.js.map +1 -0
- package/dist/_internal/filter-callback.d.ts +56 -0
- package/dist/_internal/filter-callback.d.ts.map +1 -0
- package/dist/_internal/filter-callback.js +100 -0
- package/dist/_internal/filter-callback.js.map +1 -0
- package/dist/_internal/global-identifier-member-call.d.ts +23 -0
- package/dist/_internal/global-identifier-member-call.d.ts.map +1 -0
- package/dist/_internal/global-identifier-member-call.js +25 -0
- package/dist/_internal/global-identifier-member-call.js.map +1 -0
- package/dist/_internal/global-member-call-rule.d.ts +36 -0
- package/dist/_internal/global-member-call-rule.d.ts.map +1 -0
- package/dist/_internal/global-member-call-rule.js +52 -0
- package/dist/_internal/global-member-call-rule.js.map +1 -0
- package/dist/_internal/import-analysis.d.ts +45 -0
- package/dist/_internal/import-analysis.d.ts.map +1 -0
- package/dist/_internal/import-analysis.js +113 -0
- package/dist/_internal/import-analysis.js.map +1 -0
- package/dist/_internal/import-aware-fixes.d.ts +31 -0
- package/dist/_internal/import-aware-fixes.d.ts.map +1 -0
- package/dist/_internal/import-aware-fixes.js +38 -0
- package/dist/_internal/import-aware-fixes.js.map +1 -0
- package/dist/_internal/import-fix-coordinator.d.ts +43 -0
- package/dist/_internal/import-fix-coordinator.d.ts.map +1 -0
- package/dist/_internal/import-fix-coordinator.js +71 -0
- package/dist/_internal/import-fix-coordinator.js.map +1 -0
- package/dist/_internal/import-insertion.d.ts +27 -0
- package/dist/_internal/import-insertion.d.ts.map +1 -0
- package/dist/_internal/import-insertion.js +295 -0
- package/dist/_internal/import-insertion.js.map +1 -0
- package/dist/_internal/imported-type-aliases.d.ts +140 -0
- package/dist/_internal/imported-type-aliases.d.ts.map +1 -0
- package/dist/_internal/imported-type-aliases.js +316 -0
- package/dist/_internal/imported-type-aliases.js.map +1 -0
- package/dist/_internal/imported-value-symbols.d.ts +157 -0
- package/dist/_internal/imported-value-symbols.d.ts.map +1 -0
- package/dist/_internal/imported-value-symbols.js +478 -0
- package/dist/_internal/imported-value-symbols.js.map +1 -0
- package/dist/_internal/member-call.d.ts +53 -0
- package/dist/_internal/member-call.d.ts.map +1 -0
- package/dist/_internal/member-call.js +48 -0
- package/dist/_internal/member-call.js.map +1 -0
- package/dist/_internal/module-source.d.ts +11 -0
- package/dist/_internal/module-source.d.ts.map +1 -0
- package/dist/_internal/module-source.js +11 -0
- package/dist/_internal/module-source.js.map +1 -0
- package/dist/_internal/normalize-expression-text.d.ts +26 -0
- package/dist/_internal/normalize-expression-text.d.ts.map +1 -0
- package/dist/_internal/normalize-expression-text.js +182 -0
- package/dist/_internal/normalize-expression-text.js.map +1 -0
- package/dist/_internal/nullish-comparison.d.ts +43 -0
- package/dist/_internal/nullish-comparison.d.ts.map +1 -0
- package/dist/_internal/nullish-comparison.js +147 -0
- package/dist/_internal/nullish-comparison.js.map +1 -0
- package/dist/_internal/plugin-settings.d.ts +32 -0
- package/dist/_internal/plugin-settings.d.ts.map +1 -0
- package/dist/_internal/plugin-settings.js +118 -0
- package/dist/_internal/plugin-settings.js.map +1 -0
- package/dist/_internal/report-adapter.d.ts +25 -0
- package/dist/_internal/report-adapter.d.ts.map +1 -0
- package/dist/_internal/report-adapter.js +36 -0
- package/dist/_internal/report-adapter.js.map +1 -0
- package/dist/_internal/rule-catalog.d.ts +51 -0
- package/dist/_internal/rule-catalog.d.ts.map +1 -0
- package/dist/_internal/rule-catalog.js +162 -0
- package/dist/_internal/rule-catalog.js.map +1 -0
- package/dist/_internal/rule-docs-metadata.d.ts +37 -0
- package/dist/_internal/rule-docs-metadata.d.ts.map +1 -0
- package/dist/_internal/rule-docs-metadata.js +192 -0
- package/dist/_internal/rule-docs-metadata.js.map +1 -0
- package/dist/_internal/rule-docs-url.d.ts +15 -0
- package/dist/_internal/rule-docs-url.d.ts.map +1 -0
- package/dist/_internal/rule-docs-url.js +15 -0
- package/dist/_internal/rule-docs-url.js.map +1 -0
- package/dist/_internal/rule-reporting.d.ts +71 -0
- package/dist/_internal/rule-reporting.d.ts.map +1 -0
- package/dist/_internal/rule-reporting.js +89 -0
- package/dist/_internal/rule-reporting.js.map +1 -0
- package/dist/_internal/rules-registry.d.ts +14 -0
- package/dist/_internal/rules-registry.d.ts.map +1 -0
- package/dist/_internal/rules-registry.js +165 -0
- package/dist/_internal/rules-registry.js.map +1 -0
- package/dist/_internal/safe-type-operation.d.ts +89 -0
- package/dist/_internal/safe-type-operation.d.ts.map +1 -0
- package/dist/_internal/safe-type-operation.js +147 -0
- package/dist/_internal/safe-type-operation.js.map +1 -0
- package/dist/_internal/scope-resolution.d.ts +20 -0
- package/dist/_internal/scope-resolution.d.ts.map +1 -0
- package/dist/_internal/scope-resolution.js +21 -0
- package/dist/_internal/scope-resolution.js.map +1 -0
- package/dist/_internal/scope-variable.d.ts +17 -0
- package/dist/_internal/scope-variable.d.ts.map +1 -0
- package/dist/_internal/scope-variable.js +30 -0
- package/dist/_internal/scope-variable.js.map +1 -0
- package/dist/_internal/set-membership.d.ts +6 -0
- package/dist/_internal/set-membership.d.ts.map +1 -0
- package/dist/_internal/set-membership.js +11 -0
- package/dist/_internal/set-membership.js.map +1 -0
- package/dist/_internal/text-character.d.ts +18 -0
- package/dist/_internal/text-character.d.ts.map +1 -0
- package/dist/_internal/text-character.js +69 -0
- package/dist/_internal/text-character.js.map +1 -0
- package/dist/_internal/throw-consequent.d.ts +22 -0
- package/dist/_internal/throw-consequent.d.ts.map +1 -0
- package/dist/_internal/throw-consequent.js +48 -0
- package/dist/_internal/throw-consequent.js.map +1 -0
- package/dist/_internal/throw-type-error.d.ts +19 -0
- package/dist/_internal/throw-type-error.d.ts.map +1 -0
- package/dist/_internal/throw-type-error.js +24 -0
- package/dist/_internal/throw-type-error.js.map +1 -0
- package/dist/_internal/type-checker-compat.d.ts +80 -0
- package/dist/_internal/type-checker-compat.d.ts.map +1 -0
- package/dist/_internal/type-checker-compat.js +104 -0
- package/dist/_internal/type-checker-compat.js.map +1 -0
- package/dist/_internal/type-predicate-autofix-safety.d.ts +20 -0
- package/dist/_internal/type-predicate-autofix-safety.d.ts.map +1 -0
- package/dist/_internal/type-predicate-autofix-safety.js +58 -0
- package/dist/_internal/type-predicate-autofix-safety.js.map +1 -0
- package/dist/_internal/type-reference-node.d.ts +19 -0
- package/dist/_internal/type-reference-node.d.ts.map +1 -0
- package/dist/_internal/type-reference-node.js +14 -0
- package/dist/_internal/type-reference-node.js.map +1 -0
- package/dist/_internal/typed-member-call-rule.d.ts +35 -0
- package/dist/_internal/typed-member-call-rule.d.ts.map +1 -0
- package/dist/_internal/typed-member-call-rule.js +50 -0
- package/dist/_internal/typed-member-call-rule.js.map +1 -0
- package/dist/_internal/typed-path-telemetry.d.ts +58 -0
- package/dist/_internal/typed-path-telemetry.d.ts.map +1 -0
- package/dist/_internal/typed-path-telemetry.js +114 -0
- package/dist/_internal/typed-path-telemetry.js.map +1 -0
- package/dist/_internal/typed-rule.d.ts +142 -0
- package/dist/_internal/typed-rule.d.ts.map +1 -0
- package/dist/_internal/typed-rule.js +197 -0
- package/dist/_internal/typed-rule.js.map +1 -0
- package/dist/_internal/typefest-config-references.d.ts +45 -0
- package/dist/_internal/typefest-config-references.d.ts.map +1 -0
- package/dist/_internal/typefest-config-references.js +98 -0
- package/dist/_internal/typefest-config-references.js.map +1 -0
- package/dist/_internal/typescript-eslint-node-autofix.d.ts +32 -0
- package/dist/_internal/typescript-eslint-node-autofix.d.ts.map +1 -0
- package/dist/_internal/typescript-eslint-node-autofix.js +495 -0
- package/dist/_internal/typescript-eslint-node-autofix.js.map +1 -0
- package/dist/_internal/value-rewrite-autofix-safety.d.ts +33 -0
- package/dist/_internal/value-rewrite-autofix-safety.d.ts.map +1 -0
- package/dist/_internal/value-rewrite-autofix-safety.js +103 -0
- package/dist/_internal/value-rewrite-autofix-safety.js.map +1 -0
- package/dist/plugin.cjs +9718 -0
- package/dist/plugin.cjs.map +7 -0
- package/dist/plugin.d.cts +76 -0
- package/dist/plugin.d.ts +76 -0
- package/dist/plugin.d.ts.map +1 -0
- package/dist/plugin.js +206 -0
- package/dist/plugin.js.map +1 -0
- package/dist/rules/prefer-ts-extras-array-at.d.ts +13 -0
- package/dist/rules/prefer-ts-extras-array-at.d.ts.map +1 -0
- package/dist/rules/prefer-ts-extras-array-at.js +66 -0
- package/dist/rules/prefer-ts-extras-array-at.js.map +1 -0
- package/dist/rules/prefer-ts-extras-array-concat.d.ts +13 -0
- package/dist/rules/prefer-ts-extras-array-concat.d.ts.map +1 -0
- package/dist/rules/prefer-ts-extras-array-concat.js +66 -0
- package/dist/rules/prefer-ts-extras-array-concat.js.map +1 -0
- package/dist/rules/prefer-ts-extras-array-find-last-index.d.ts +13 -0
- package/dist/rules/prefer-ts-extras-array-find-last-index.d.ts.map +1 -0
- package/dist/rules/prefer-ts-extras-array-find-last-index.js +63 -0
- package/dist/rules/prefer-ts-extras-array-find-last-index.js.map +1 -0
- package/dist/rules/prefer-ts-extras-array-find-last.d.ts +13 -0
- package/dist/rules/prefer-ts-extras-array-find-last.d.ts.map +1 -0
- package/dist/rules/prefer-ts-extras-array-find-last.js +66 -0
- package/dist/rules/prefer-ts-extras-array-find-last.js.map +1 -0
- package/dist/rules/prefer-ts-extras-array-find.d.ts +13 -0
- package/dist/rules/prefer-ts-extras-array-find.d.ts.map +1 -0
- package/dist/rules/prefer-ts-extras-array-find.js +63 -0
- package/dist/rules/prefer-ts-extras-array-find.js.map +1 -0
- package/dist/rules/prefer-ts-extras-array-first.d.ts +13 -0
- package/dist/rules/prefer-ts-extras-array-first.d.ts.map +1 -0
- package/dist/rules/prefer-ts-extras-array-first.js +107 -0
- package/dist/rules/prefer-ts-extras-array-first.js.map +1 -0
- package/dist/rules/prefer-ts-extras-array-includes.d.ts +13 -0
- package/dist/rules/prefer-ts-extras-array-includes.d.ts.map +1 -0
- package/dist/rules/prefer-ts-extras-array-includes.js +89 -0
- package/dist/rules/prefer-ts-extras-array-includes.js.map +1 -0
- package/dist/rules/prefer-ts-extras-array-join.d.ts +13 -0
- package/dist/rules/prefer-ts-extras-array-join.d.ts.map +1 -0
- package/dist/rules/prefer-ts-extras-array-join.js +66 -0
- package/dist/rules/prefer-ts-extras-array-join.js.map +1 -0
- package/dist/rules/prefer-ts-extras-array-last.d.ts +8 -0
- package/dist/rules/prefer-ts-extras-array-last.d.ts.map +1 -0
- package/dist/rules/prefer-ts-extras-array-last.js +132 -0
- package/dist/rules/prefer-ts-extras-array-last.js.map +1 -0
- package/dist/rules/prefer-ts-extras-as-writable.d.ts +13 -0
- package/dist/rules/prefer-ts-extras-as-writable.d.ts.map +1 -0
- package/dist/rules/prefer-ts-extras-as-writable.js +110 -0
- package/dist/rules/prefer-ts-extras-as-writable.js.map +1 -0
- package/dist/rules/prefer-ts-extras-assert-defined.d.ts +13 -0
- package/dist/rules/prefer-ts-extras-assert-defined.d.ts.map +1 -0
- package/dist/rules/prefer-ts-extras-assert-defined.js +182 -0
- package/dist/rules/prefer-ts-extras-assert-defined.js.map +1 -0
- package/dist/rules/prefer-ts-extras-assert-error.d.ts +13 -0
- package/dist/rules/prefer-ts-extras-assert-error.d.ts.map +1 -0
- package/dist/rules/prefer-ts-extras-assert-error.js +152 -0
- package/dist/rules/prefer-ts-extras-assert-error.js.map +1 -0
- package/dist/rules/prefer-ts-extras-assert-present.d.ts +13 -0
- package/dist/rules/prefer-ts-extras-assert-present.d.ts.map +1 -0
- package/dist/rules/prefer-ts-extras-assert-present.js +266 -0
- package/dist/rules/prefer-ts-extras-assert-present.js.map +1 -0
- package/dist/rules/prefer-ts-extras-is-defined-filter.d.ts +13 -0
- package/dist/rules/prefer-ts-extras-is-defined-filter.d.ts.map +1 -0
- package/dist/rules/prefer-ts-extras-is-defined-filter.js +90 -0
- package/dist/rules/prefer-ts-extras-is-defined-filter.js.map +1 -0
- package/dist/rules/prefer-ts-extras-is-defined.d.ts +13 -0
- package/dist/rules/prefer-ts-extras-is-defined.d.ts.map +1 -0
- package/dist/rules/prefer-ts-extras-is-defined.js +179 -0
- package/dist/rules/prefer-ts-extras-is-defined.js.map +1 -0
- package/dist/rules/prefer-ts-extras-is-empty.d.ts +13 -0
- package/dist/rules/prefer-ts-extras-is-empty.d.ts.map +1 -0
- package/dist/rules/prefer-ts-extras-is-empty.js +116 -0
- package/dist/rules/prefer-ts-extras-is-empty.js.map +1 -0
- package/dist/rules/prefer-ts-extras-is-equal-type.d.ts +13 -0
- package/dist/rules/prefer-ts-extras-is-equal-type.d.ts.map +1 -0
- package/dist/rules/prefer-ts-extras-is-equal-type.js +138 -0
- package/dist/rules/prefer-ts-extras-is-equal-type.js.map +1 -0
- package/dist/rules/prefer-ts-extras-is-finite.d.ts +13 -0
- package/dist/rules/prefer-ts-extras-is-finite.d.ts.map +1 -0
- package/dist/rules/prefer-ts-extras-is-finite.js +61 -0
- package/dist/rules/prefer-ts-extras-is-finite.js.map +1 -0
- package/dist/rules/prefer-ts-extras-is-infinite.d.ts +8 -0
- package/dist/rules/prefer-ts-extras-is-infinite.d.ts.map +1 -0
- package/dist/rules/prefer-ts-extras-is-infinite.js +178 -0
- package/dist/rules/prefer-ts-extras-is-infinite.js.map +1 -0
- package/dist/rules/prefer-ts-extras-is-integer.d.ts +13 -0
- package/dist/rules/prefer-ts-extras-is-integer.d.ts.map +1 -0
- package/dist/rules/prefer-ts-extras-is-integer.js +61 -0
- package/dist/rules/prefer-ts-extras-is-integer.js.map +1 -0
- package/dist/rules/prefer-ts-extras-is-present-filter.d.ts +13 -0
- package/dist/rules/prefer-ts-extras-is-present-filter.d.ts.map +1 -0
- package/dist/rules/prefer-ts-extras-is-present-filter.js +216 -0
- package/dist/rules/prefer-ts-extras-is-present-filter.js.map +1 -0
- package/dist/rules/prefer-ts-extras-is-present.d.ts +13 -0
- package/dist/rules/prefer-ts-extras-is-present.d.ts.map +1 -0
- package/dist/rules/prefer-ts-extras-is-present.js +217 -0
- package/dist/rules/prefer-ts-extras-is-present.js.map +1 -0
- package/dist/rules/prefer-ts-extras-is-safe-integer.d.ts +13 -0
- package/dist/rules/prefer-ts-extras-is-safe-integer.d.ts.map +1 -0
- package/dist/rules/prefer-ts-extras-is-safe-integer.js +61 -0
- package/dist/rules/prefer-ts-extras-is-safe-integer.js.map +1 -0
- package/dist/rules/prefer-ts-extras-key-in.d.ts +13 -0
- package/dist/rules/prefer-ts-extras-key-in.d.ts.map +1 -0
- package/dist/rules/prefer-ts-extras-key-in.js +124 -0
- package/dist/rules/prefer-ts-extras-key-in.js.map +1 -0
- package/dist/rules/prefer-ts-extras-not.d.ts +13 -0
- package/dist/rules/prefer-ts-extras-not.d.ts.map +1 -0
- package/dist/rules/prefer-ts-extras-not.js +136 -0
- package/dist/rules/prefer-ts-extras-not.js.map +1 -0
- package/dist/rules/prefer-ts-extras-object-entries.d.ts +13 -0
- package/dist/rules/prefer-ts-extras-object-entries.d.ts.map +1 -0
- package/dist/rules/prefer-ts-extras-object-entries.js +59 -0
- package/dist/rules/prefer-ts-extras-object-entries.js.map +1 -0
- package/dist/rules/prefer-ts-extras-object-from-entries.d.ts +13 -0
- package/dist/rules/prefer-ts-extras-object-from-entries.d.ts.map +1 -0
- package/dist/rules/prefer-ts-extras-object-from-entries.js +59 -0
- package/dist/rules/prefer-ts-extras-object-from-entries.js.map +1 -0
- package/dist/rules/prefer-ts-extras-object-has-in.d.ts +13 -0
- package/dist/rules/prefer-ts-extras-object-has-in.d.ts.map +1 -0
- package/dist/rules/prefer-ts-extras-object-has-in.js +79 -0
- package/dist/rules/prefer-ts-extras-object-has-in.js.map +1 -0
- package/dist/rules/prefer-ts-extras-object-has-own.d.ts +13 -0
- package/dist/rules/prefer-ts-extras-object-has-own.d.ts.map +1 -0
- package/dist/rules/prefer-ts-extras-object-has-own.js +82 -0
- package/dist/rules/prefer-ts-extras-object-has-own.js.map +1 -0
- package/dist/rules/prefer-ts-extras-object-keys.d.ts +13 -0
- package/dist/rules/prefer-ts-extras-object-keys.d.ts.map +1 -0
- package/dist/rules/prefer-ts-extras-object-keys.js +59 -0
- package/dist/rules/prefer-ts-extras-object-keys.js.map +1 -0
- package/dist/rules/prefer-ts-extras-object-values.d.ts +13 -0
- package/dist/rules/prefer-ts-extras-object-values.d.ts.map +1 -0
- package/dist/rules/prefer-ts-extras-object-values.js +59 -0
- package/dist/rules/prefer-ts-extras-object-values.js.map +1 -0
- package/dist/rules/prefer-ts-extras-safe-cast-to.d.ts +13 -0
- package/dist/rules/prefer-ts-extras-safe-cast-to.d.ts.map +1 -0
- package/dist/rules/prefer-ts-extras-safe-cast-to.js +159 -0
- package/dist/rules/prefer-ts-extras-safe-cast-to.js.map +1 -0
- package/dist/rules/prefer-ts-extras-set-has.d.ts +13 -0
- package/dist/rules/prefer-ts-extras-set-has.d.ts.map +1 -0
- package/dist/rules/prefer-ts-extras-set-has.js +304 -0
- package/dist/rules/prefer-ts-extras-set-has.js.map +1 -0
- package/dist/rules/prefer-ts-extras-string-split.d.ts +13 -0
- package/dist/rules/prefer-ts-extras-string-split.d.ts.map +1 -0
- package/dist/rules/prefer-ts-extras-string-split.js +166 -0
- package/dist/rules/prefer-ts-extras-string-split.js.map +1 -0
- package/dist/rules/prefer-type-fest-abstract-constructor.d.ts +13 -0
- package/dist/rules/prefer-type-fest-abstract-constructor.d.ts.map +1 -0
- package/dist/rules/prefer-type-fest-abstract-constructor.js +65 -0
- package/dist/rules/prefer-type-fest-abstract-constructor.js.map +1 -0
- package/dist/rules/prefer-type-fest-arrayable.d.ts +13 -0
- package/dist/rules/prefer-type-fest-arrayable.d.ts.map +1 -0
- package/dist/rules/prefer-type-fest-arrayable.js +123 -0
- package/dist/rules/prefer-type-fest-arrayable.js.map +1 -0
- package/dist/rules/prefer-type-fest-async-return-type.d.ts +13 -0
- package/dist/rules/prefer-type-fest-async-return-type.d.ts.map +1 -0
- package/dist/rules/prefer-type-fest-async-return-type.js +92 -0
- package/dist/rules/prefer-type-fest-async-return-type.js.map +1 -0
- package/dist/rules/prefer-type-fest-conditional-pick.d.ts +13 -0
- package/dist/rules/prefer-type-fest-conditional-pick.d.ts.map +1 -0
- package/dist/rules/prefer-type-fest-conditional-pick.js +74 -0
- package/dist/rules/prefer-type-fest-conditional-pick.js.map +1 -0
- package/dist/rules/prefer-type-fest-constructor.d.ts +13 -0
- package/dist/rules/prefer-type-fest-constructor.d.ts.map +1 -0
- package/dist/rules/prefer-type-fest-constructor.js +67 -0
- package/dist/rules/prefer-type-fest-constructor.js.map +1 -0
- package/dist/rules/prefer-type-fest-except.d.ts +13 -0
- package/dist/rules/prefer-type-fest-except.d.ts.map +1 -0
- package/dist/rules/prefer-type-fest-except.js +105 -0
- package/dist/rules/prefer-type-fest-except.js.map +1 -0
- package/dist/rules/prefer-type-fest-if.d.ts +13 -0
- package/dist/rules/prefer-type-fest-if.d.ts.map +1 -0
- package/dist/rules/prefer-type-fest-if.js +79 -0
- package/dist/rules/prefer-type-fest-if.js.map +1 -0
- package/dist/rules/prefer-type-fest-iterable-element.d.ts +13 -0
- package/dist/rules/prefer-type-fest-iterable-element.d.ts.map +1 -0
- package/dist/rules/prefer-type-fest-iterable-element.js +76 -0
- package/dist/rules/prefer-type-fest-iterable-element.js.map +1 -0
- package/dist/rules/prefer-type-fest-json-array.d.ts +13 -0
- package/dist/rules/prefer-type-fest-json-array.d.ts.map +1 -0
- package/dist/rules/prefer-type-fest-json-array.js +164 -0
- package/dist/rules/prefer-type-fest-json-array.js.map +1 -0
- package/dist/rules/prefer-type-fest-json-object.d.ts +13 -0
- package/dist/rules/prefer-type-fest-json-object.d.ts.map +1 -0
- package/dist/rules/prefer-type-fest-json-object.js +102 -0
- package/dist/rules/prefer-type-fest-json-object.js.map +1 -0
- package/dist/rules/prefer-type-fest-json-primitive.d.ts +13 -0
- package/dist/rules/prefer-type-fest-json-primitive.d.ts.map +1 -0
- package/dist/rules/prefer-type-fest-json-primitive.js +112 -0
- package/dist/rules/prefer-type-fest-json-primitive.js.map +1 -0
- package/dist/rules/prefer-type-fest-json-value.d.ts +13 -0
- package/dist/rules/prefer-type-fest-json-value.d.ts.map +1 -0
- package/dist/rules/prefer-type-fest-json-value.js +109 -0
- package/dist/rules/prefer-type-fest-json-value.js.map +1 -0
- package/dist/rules/prefer-type-fest-keys-of-union.d.ts +13 -0
- package/dist/rules/prefer-type-fest-keys-of-union.d.ts.map +1 -0
- package/dist/rules/prefer-type-fest-keys-of-union.js +74 -0
- package/dist/rules/prefer-type-fest-keys-of-union.js.map +1 -0
- package/dist/rules/prefer-type-fest-literal-union.d.ts +13 -0
- package/dist/rules/prefer-type-fest-literal-union.d.ts.map +1 -0
- package/dist/rules/prefer-type-fest-literal-union.js +181 -0
- package/dist/rules/prefer-type-fest-literal-union.js.map +1 -0
- package/dist/rules/prefer-type-fest-merge-exclusive.d.ts +13 -0
- package/dist/rules/prefer-type-fest-merge-exclusive.d.ts.map +1 -0
- package/dist/rules/prefer-type-fest-merge-exclusive.js +63 -0
- package/dist/rules/prefer-type-fest-merge-exclusive.js.map +1 -0
- package/dist/rules/prefer-type-fest-non-empty-tuple.d.ts +13 -0
- package/dist/rules/prefer-type-fest-non-empty-tuple.d.ts.map +1 -0
- package/dist/rules/prefer-type-fest-non-empty-tuple.js +133 -0
- package/dist/rules/prefer-type-fest-non-empty-tuple.js.map +1 -0
- package/dist/rules/prefer-type-fest-omit-index-signature.d.ts +13 -0
- package/dist/rules/prefer-type-fest-omit-index-signature.d.ts.map +1 -0
- package/dist/rules/prefer-type-fest-omit-index-signature.js +74 -0
- package/dist/rules/prefer-type-fest-omit-index-signature.js.map +1 -0
- package/dist/rules/prefer-type-fest-partial-deep.d.ts +13 -0
- package/dist/rules/prefer-type-fest-partial-deep.d.ts.map +1 -0
- package/dist/rules/prefer-type-fest-partial-deep.js +63 -0
- package/dist/rules/prefer-type-fest-partial-deep.js.map +1 -0
- package/dist/rules/prefer-type-fest-primitive.d.ts +13 -0
- package/dist/rules/prefer-type-fest-primitive.d.ts.map +1 -0
- package/dist/rules/prefer-type-fest-primitive.js +102 -0
- package/dist/rules/prefer-type-fest-primitive.js.map +1 -0
- package/dist/rules/prefer-type-fest-promisable.d.ts +13 -0
- package/dist/rules/prefer-type-fest-promisable.d.ts.map +1 -0
- package/dist/rules/prefer-type-fest-promisable.js +167 -0
- package/dist/rules/prefer-type-fest-promisable.js.map +1 -0
- package/dist/rules/prefer-type-fest-readonly-deep.d.ts +13 -0
- package/dist/rules/prefer-type-fest-readonly-deep.d.ts.map +1 -0
- package/dist/rules/prefer-type-fest-readonly-deep.js +63 -0
- package/dist/rules/prefer-type-fest-readonly-deep.js.map +1 -0
- package/dist/rules/prefer-type-fest-require-all-or-none.d.ts +13 -0
- package/dist/rules/prefer-type-fest-require-all-or-none.d.ts.map +1 -0
- package/dist/rules/prefer-type-fest-require-all-or-none.js +75 -0
- package/dist/rules/prefer-type-fest-require-all-or-none.js.map +1 -0
- package/dist/rules/prefer-type-fest-require-at-least-one.d.ts +13 -0
- package/dist/rules/prefer-type-fest-require-at-least-one.d.ts.map +1 -0
- package/dist/rules/prefer-type-fest-require-at-least-one.js +74 -0
- package/dist/rules/prefer-type-fest-require-at-least-one.js.map +1 -0
- package/dist/rules/prefer-type-fest-require-exactly-one.d.ts +13 -0
- package/dist/rules/prefer-type-fest-require-exactly-one.d.ts.map +1 -0
- package/dist/rules/prefer-type-fest-require-exactly-one.js +102 -0
- package/dist/rules/prefer-type-fest-require-exactly-one.js.map +1 -0
- package/dist/rules/prefer-type-fest-require-one-or-none.d.ts +13 -0
- package/dist/rules/prefer-type-fest-require-one-or-none.d.ts.map +1 -0
- package/dist/rules/prefer-type-fest-require-one-or-none.js +74 -0
- package/dist/rules/prefer-type-fest-require-one-or-none.js.map +1 -0
- package/dist/rules/prefer-type-fest-required-deep.d.ts +13 -0
- package/dist/rules/prefer-type-fest-required-deep.d.ts.map +1 -0
- package/dist/rules/prefer-type-fest-required-deep.js +63 -0
- package/dist/rules/prefer-type-fest-required-deep.js.map +1 -0
- package/dist/rules/prefer-type-fest-schema.d.ts +13 -0
- package/dist/rules/prefer-type-fest-schema.d.ts.map +1 -0
- package/dist/rules/prefer-type-fest-schema.js +74 -0
- package/dist/rules/prefer-type-fest-schema.js.map +1 -0
- package/dist/rules/prefer-type-fest-set-non-nullable.d.ts +13 -0
- package/dist/rules/prefer-type-fest-set-non-nullable.d.ts.map +1 -0
- package/dist/rules/prefer-type-fest-set-non-nullable.js +74 -0
- package/dist/rules/prefer-type-fest-set-non-nullable.js.map +1 -0
- package/dist/rules/prefer-type-fest-set-optional.d.ts +13 -0
- package/dist/rules/prefer-type-fest-set-optional.d.ts.map +1 -0
- package/dist/rules/prefer-type-fest-set-optional.js +74 -0
- package/dist/rules/prefer-type-fest-set-optional.js.map +1 -0
- package/dist/rules/prefer-type-fest-set-readonly.d.ts +13 -0
- package/dist/rules/prefer-type-fest-set-readonly.d.ts.map +1 -0
- package/dist/rules/prefer-type-fest-set-readonly.js +74 -0
- package/dist/rules/prefer-type-fest-set-readonly.js.map +1 -0
- package/dist/rules/prefer-type-fest-set-required.d.ts +13 -0
- package/dist/rules/prefer-type-fest-set-required.d.ts.map +1 -0
- package/dist/rules/prefer-type-fest-set-required.js +74 -0
- package/dist/rules/prefer-type-fest-set-required.js.map +1 -0
- package/dist/rules/prefer-type-fest-simplify.d.ts +13 -0
- package/dist/rules/prefer-type-fest-simplify.d.ts.map +1 -0
- package/dist/rules/prefer-type-fest-simplify.js +75 -0
- package/dist/rules/prefer-type-fest-simplify.js.map +1 -0
- package/dist/rules/prefer-type-fest-tagged-brands.d.ts +13 -0
- package/dist/rules/prefer-type-fest-tagged-brands.d.ts.map +1 -0
- package/dist/rules/prefer-type-fest-tagged-brands.js +174 -0
- package/dist/rules/prefer-type-fest-tagged-brands.js.map +1 -0
- package/dist/rules/prefer-type-fest-tuple-of.d.ts +14 -0
- package/dist/rules/prefer-type-fest-tuple-of.d.ts.map +1 -0
- package/dist/rules/prefer-type-fest-tuple-of.js +132 -0
- package/dist/rules/prefer-type-fest-tuple-of.js.map +1 -0
- package/dist/rules/prefer-type-fest-unknown-array.d.ts +13 -0
- package/dist/rules/prefer-type-fest-unknown-array.d.ts.map +1 -0
- package/dist/rules/prefer-type-fest-unknown-array.js +111 -0
- package/dist/rules/prefer-type-fest-unknown-array.js.map +1 -0
- package/dist/rules/prefer-type-fest-unknown-map.d.ts +13 -0
- package/dist/rules/prefer-type-fest-unknown-map.d.ts.map +1 -0
- package/dist/rules/prefer-type-fest-unknown-map.js +82 -0
- package/dist/rules/prefer-type-fest-unknown-map.js.map +1 -0
- package/dist/rules/prefer-type-fest-unknown-record.d.ts +13 -0
- package/dist/rules/prefer-type-fest-unknown-record.d.ts.map +1 -0
- package/dist/rules/prefer-type-fest-unknown-record.js +77 -0
- package/dist/rules/prefer-type-fest-unknown-record.js.map +1 -0
- package/dist/rules/prefer-type-fest-unknown-set.d.ts +13 -0
- package/dist/rules/prefer-type-fest-unknown-set.d.ts.map +1 -0
- package/dist/rules/prefer-type-fest-unknown-set.js +81 -0
- package/dist/rules/prefer-type-fest-unknown-set.js.map +1 -0
- package/dist/rules/prefer-type-fest-unwrap-tagged.d.ts +13 -0
- package/dist/rules/prefer-type-fest-unwrap-tagged.d.ts.map +1 -0
- package/dist/rules/prefer-type-fest-unwrap-tagged.js +74 -0
- package/dist/rules/prefer-type-fest-unwrap-tagged.js.map +1 -0
- package/dist/rules/prefer-type-fest-value-of.d.ts +13 -0
- package/dist/rules/prefer-type-fest-value-of.d.ts.map +1 -0
- package/dist/rules/prefer-type-fest-value-of.js +74 -0
- package/dist/rules/prefer-type-fest-value-of.js.map +1 -0
- package/dist/rules/prefer-type-fest-writable-deep.d.ts +13 -0
- package/dist/rules/prefer-type-fest-writable-deep.d.ts.map +1 -0
- package/dist/rules/prefer-type-fest-writable-deep.js +64 -0
- package/dist/rules/prefer-type-fest-writable-deep.js.map +1 -0
- package/dist/rules/prefer-type-fest-writable.d.ts +13 -0
- package/dist/rules/prefer-type-fest-writable.d.ts.map +1 -0
- package/dist/rules/prefer-type-fest-writable.js +129 -0
- package/dist/rules/prefer-type-fest-writable.js.map +1 -0
- package/docs/rules/getting-started.md +74 -0
- package/docs/rules/guides/adoption-checklist.md +37 -0
- package/docs/rules/guides/preset-selection-strategy.md +87 -0
- package/docs/rules/guides/rollout-and-fix-safety.md +42 -0
- package/docs/rules/guides/snapshot-testing.md +121 -0
- package/docs/rules/guides/type-aware-linting-readiness.md +105 -0
- package/docs/rules/overview.md +49 -0
- package/docs/rules/prefer-ts-extras-array-at.md +132 -0
- package/docs/rules/prefer-ts-extras-array-concat.md +138 -0
- package/docs/rules/prefer-ts-extras-array-find-last-index.md +108 -0
- package/docs/rules/prefer-ts-extras-array-find-last.md +108 -0
- package/docs/rules/prefer-ts-extras-array-find.md +108 -0
- package/docs/rules/prefer-ts-extras-array-first.md +132 -0
- package/docs/rules/prefer-ts-extras-array-includes.md +135 -0
- package/docs/rules/prefer-ts-extras-array-join.md +132 -0
- package/docs/rules/prefer-ts-extras-array-last.md +132 -0
- package/docs/rules/prefer-ts-extras-as-writable.md +124 -0
- package/docs/rules/prefer-ts-extras-assert-defined.md +140 -0
- package/docs/rules/prefer-ts-extras-assert-error.md +147 -0
- package/docs/rules/prefer-ts-extras-assert-present.md +139 -0
- package/docs/rules/prefer-ts-extras-is-defined-filter.md +125 -0
- package/docs/rules/prefer-ts-extras-is-defined.md +147 -0
- package/docs/rules/prefer-ts-extras-is-empty.md +142 -0
- package/docs/rules/prefer-ts-extras-is-equal-type.md +144 -0
- package/docs/rules/prefer-ts-extras-is-finite.md +116 -0
- package/docs/rules/prefer-ts-extras-is-infinite.md +134 -0
- package/docs/rules/prefer-ts-extras-is-integer.md +116 -0
- package/docs/rules/prefer-ts-extras-is-present-filter.md +125 -0
- package/docs/rules/prefer-ts-extras-is-present.md +143 -0
- package/docs/rules/prefer-ts-extras-is-safe-integer.md +116 -0
- package/docs/rules/prefer-ts-extras-key-in.md +150 -0
- package/docs/rules/prefer-ts-extras-not.md +138 -0
- package/docs/rules/prefer-ts-extras-object-entries.md +130 -0
- package/docs/rules/prefer-ts-extras-object-from-entries.md +131 -0
- package/docs/rules/prefer-ts-extras-object-has-in.md +141 -0
- package/docs/rules/prefer-ts-extras-object-has-own.md +137 -0
- package/docs/rules/prefer-ts-extras-object-keys.md +127 -0
- package/docs/rules/prefer-ts-extras-object-values.md +128 -0
- package/docs/rules/prefer-ts-extras-safe-cast-to.md +130 -0
- package/docs/rules/prefer-ts-extras-set-has.md +203 -0
- package/docs/rules/prefer-ts-extras-string-split.md +133 -0
- package/docs/rules/prefer-type-fest-abstract-constructor.md +87 -0
- package/docs/rules/prefer-type-fest-arrayable.md +127 -0
- package/docs/rules/prefer-type-fest-async-return-type.md +117 -0
- package/docs/rules/prefer-type-fest-conditional-pick.md +140 -0
- package/docs/rules/prefer-type-fest-constructor.md +87 -0
- package/docs/rules/prefer-type-fest-except.md +231 -0
- package/docs/rules/prefer-type-fest-if.md +217 -0
- package/docs/rules/prefer-type-fest-iterable-element.md +170 -0
- package/docs/rules/prefer-type-fest-json-array.md +107 -0
- package/docs/rules/prefer-type-fest-json-object.md +107 -0
- package/docs/rules/prefer-type-fest-json-primitive.md +105 -0
- package/docs/rules/prefer-type-fest-json-value.md +107 -0
- package/docs/rules/prefer-type-fest-keys-of-union.md +139 -0
- package/docs/rules/prefer-type-fest-literal-union.md +118 -0
- package/docs/rules/prefer-type-fest-merge-exclusive.md +118 -0
- package/docs/rules/prefer-type-fest-non-empty-tuple.md +115 -0
- package/docs/rules/prefer-type-fest-omit-index-signature.md +196 -0
- package/docs/rules/prefer-type-fest-partial-deep.md +133 -0
- package/docs/rules/prefer-type-fest-primitive.md +106 -0
- package/docs/rules/prefer-type-fest-promisable.md +246 -0
- package/docs/rules/prefer-type-fest-readonly-deep.md +151 -0
- package/docs/rules/prefer-type-fest-require-all-or-none.md +149 -0
- package/docs/rules/prefer-type-fest-require-at-least-one.md +155 -0
- package/docs/rules/prefer-type-fest-require-exactly-one.md +240 -0
- package/docs/rules/prefer-type-fest-require-one-or-none.md +165 -0
- package/docs/rules/prefer-type-fest-required-deep.md +123 -0
- package/docs/rules/prefer-type-fest-schema.md +161 -0
- package/docs/rules/prefer-type-fest-set-non-nullable.md +145 -0
- package/docs/rules/prefer-type-fest-set-optional.md +133 -0
- package/docs/rules/prefer-type-fest-set-readonly.md +136 -0
- package/docs/rules/prefer-type-fest-set-required.md +140 -0
- package/docs/rules/prefer-type-fest-simplify.md +168 -0
- package/docs/rules/prefer-type-fest-tagged-brands.md +278 -0
- package/docs/rules/prefer-type-fest-tuple-of.md +250 -0
- package/docs/rules/prefer-type-fest-unknown-array.md +126 -0
- package/docs/rules/prefer-type-fest-unknown-map.md +123 -0
- package/docs/rules/prefer-type-fest-unknown-record.md +130 -0
- package/docs/rules/prefer-type-fest-unknown-set.md +123 -0
- package/docs/rules/prefer-type-fest-unwrap-tagged.md +133 -0
- package/docs/rules/prefer-type-fest-value-of.md +121 -0
- package/docs/rules/prefer-type-fest-writable-deep.md +113 -0
- package/docs/rules/prefer-type-fest-writable.md +139 -0
- package/docs/rules/presets/all.md +102 -0
- package/docs/rules/presets/index.md +124 -0
- package/docs/rules/presets/minimal.md +37 -0
- package/docs/rules/presets/recommended-type-checked.md +37 -0
- package/docs/rules/presets/recommended.md +116 -0
- package/docs/rules/presets/strict.md +98 -0
- package/docs/rules/presets/ts-extras-type-guards.md +45 -0
- package/docs/rules/presets/type-fest-types.md +68 -0
- package/package.json +574 -0
|
@@ -0,0 +1,74 @@
|
|
|
1
|
+
---
|
|
2
|
+
title: Getting Started
|
|
3
|
+
description: Enable eslint-plugin-typefest quickly in Flat Config.
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# Getting Started
|
|
7
|
+
|
|
8
|
+
Install the plugin:
|
|
9
|
+
|
|
10
|
+
```bash
|
|
11
|
+
npm install --save-dev eslint-plugin-typefest typescript
|
|
12
|
+
```
|
|
13
|
+
|
|
14
|
+
Enable one preset in your Flat Config:
|
|
15
|
+
|
|
16
|
+
```ts
|
|
17
|
+
import typefest from "eslint-plugin-typefest";
|
|
18
|
+
|
|
19
|
+
export default [
|
|
20
|
+
typefest.configs.recommended,
|
|
21
|
+
];
|
|
22
|
+
```
|
|
23
|
+
|
|
24
|
+
`recommended` does not require type information.
|
|
25
|
+
|
|
26
|
+
If you want the same baseline plus type-aware helper rules, use
|
|
27
|
+
`typefest.configs["recommended-type-checked"]`.
|
|
28
|
+
|
|
29
|
+
## Alternative: manual scoped setup
|
|
30
|
+
|
|
31
|
+
If you prefer to apply plugin rules inside your own file-scoped config object, spread the preset rules manually.
|
|
32
|
+
|
|
33
|
+
```ts
|
|
34
|
+
import tsParser from "@typescript-eslint/parser";
|
|
35
|
+
import typefest from "eslint-plugin-typefest";
|
|
36
|
+
|
|
37
|
+
export default [
|
|
38
|
+
{
|
|
39
|
+
files: ["**/*.{ts,tsx,mts,cts}"],
|
|
40
|
+
languageOptions: {
|
|
41
|
+
parser: tsParser,
|
|
42
|
+
parserOptions: {
|
|
43
|
+
ecmaVersion: "latest",
|
|
44
|
+
// Enable only when using a type-aware preset.
|
|
45
|
+
// projectService: true,
|
|
46
|
+
sourceType: "module",
|
|
47
|
+
},
|
|
48
|
+
},
|
|
49
|
+
plugins: {
|
|
50
|
+
typefest,
|
|
51
|
+
},
|
|
52
|
+
rules: {
|
|
53
|
+
...typefest.configs.recommended.rules,
|
|
54
|
+
},
|
|
55
|
+
},
|
|
56
|
+
];
|
|
57
|
+
```
|
|
58
|
+
|
|
59
|
+
Use this pattern when you only extend rules and want full control over parser setup per scope.
|
|
60
|
+
|
|
61
|
+
## Recommended rollout
|
|
62
|
+
|
|
63
|
+
1. Start with `recommended` (or `minimal` if you want low initial noise).
|
|
64
|
+
2. Fix violations in small batches.
|
|
65
|
+
3. Move to `recommended-type-checked` when you are ready for typed rules.
|
|
66
|
+
4. Move to `strict` once your baseline is stable.
|
|
67
|
+
5. Use `all` only when you explicitly want every rule, including experimental rules.
|
|
68
|
+
|
|
69
|
+
## Need a subset instead of a full preset?
|
|
70
|
+
|
|
71
|
+
- π `typefest.configs["type-fest/types"]`
|
|
72
|
+
- β΄οΈ `typefest.configs["ts-extras/type-guards"]`
|
|
73
|
+
|
|
74
|
+
See the **Presets** section in this sidebar for details and examples.
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
---
|
|
2
|
+
title: Rule adoption checklist
|
|
3
|
+
description: Practical checklist for adopting eslint-plugin-typefest rules with low risk.
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# Rule adoption checklist
|
|
7
|
+
|
|
8
|
+
Use this checklist when rolling out one or more rules across an existing codebase.
|
|
9
|
+
|
|
10
|
+
## Before enabling rules
|
|
11
|
+
|
|
12
|
+
1. Identify the target package/folder scope.
|
|
13
|
+
2. Run ESLint in report-only mode to estimate violation count.
|
|
14
|
+
3. Confirm your CI, tests, and typecheck are green before refactoring.
|
|
15
|
+
4. Decide whether this rollout is autofix-first or manual-first.
|
|
16
|
+
|
|
17
|
+
## During migration
|
|
18
|
+
|
|
19
|
+
1. Apply changes in small batches (per folder/package).
|
|
20
|
+
2. Keep each PR focused on one rule family when possible.
|
|
21
|
+
3. Re-run tests and typecheck after each batch.
|
|
22
|
+
4. Flag behavior-sensitive replacements for reviewer attention.
|
|
23
|
+
|
|
24
|
+
## After migration
|
|
25
|
+
|
|
26
|
+
1. Switch rule severity from `warn` to `error`.
|
|
27
|
+
2. Remove local disables added during migration.
|
|
28
|
+
3. Add one representative example to internal team docs.
|
|
29
|
+
4. Track regressions by keeping the rule enabled in CI.
|
|
30
|
+
|
|
31
|
+
## Suggested PR checklist
|
|
32
|
+
|
|
33
|
+
- [ ] Only target files for this migration are changed.
|
|
34
|
+
- [ ] Tests pass after each replacement batch.
|
|
35
|
+
- [ ] Typecheck passes after each replacement batch.
|
|
36
|
+
- [ ] Reviewer notes include runtime-sensitive replacements.
|
|
37
|
+
- [ ] Final lint run has no new violations for the migrated rule(s).
|
|
@@ -0,0 +1,87 @@
|
|
|
1
|
+
---
|
|
2
|
+
title: Preset selection strategy
|
|
3
|
+
description: Choose the right eslint-plugin-typefest preset and roll it out with minimal migration risk.
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# Preset selection strategy
|
|
7
|
+
|
|
8
|
+
This guide helps teams pick a preset based on migration tolerance, type-checking maturity, and rollout velocity.
|
|
9
|
+
|
|
10
|
+
## Decision checkpoints
|
|
11
|
+
|
|
12
|
+
Use these checkpoints before choosing a preset:
|
|
13
|
+
|
|
14
|
+
1. **Type information availability**: Do you run ESLint with project-aware type services in CI/local workflows?
|
|
15
|
+
2. **Migration bandwidth**: Can the team handle broad replacement churn this quarter?
|
|
16
|
+
3. **Runtime sensitivity**: Do you need to review behavior-sensitive changes manually before broad adoption?
|
|
17
|
+
4. **Convergence target**: Do you intend to land on `strict`/`all`, or stay at a stable baseline?
|
|
18
|
+
|
|
19
|
+
## Recommended starting points
|
|
20
|
+
|
|
21
|
+
### `minimal`
|
|
22
|
+
|
|
23
|
+
Choose this when:
|
|
24
|
+
|
|
25
|
+
- You need the lowest-friction baseline.
|
|
26
|
+
- You want immediate value with minimal code churn.
|
|
27
|
+
|
|
28
|
+
### `recommended`
|
|
29
|
+
|
|
30
|
+
Choose this when:
|
|
31
|
+
|
|
32
|
+
- You want broader coverage but still pragmatic defaults.
|
|
33
|
+
- You can absorb moderate migration effort.
|
|
34
|
+
|
|
35
|
+
### `recommended-type-checked`
|
|
36
|
+
|
|
37
|
+
Choose this when:
|
|
38
|
+
|
|
39
|
+
- Type services are already stable in your lint pipeline.
|
|
40
|
+
- You want stronger guidance on typed guard/helper patterns.
|
|
41
|
+
|
|
42
|
+
### `strict`
|
|
43
|
+
|
|
44
|
+
Choose this when:
|
|
45
|
+
|
|
46
|
+
- Your codebase already enforces high lint/type discipline.
|
|
47
|
+
- You prefer stronger consistency constraints over minimal churn.
|
|
48
|
+
|
|
49
|
+
### `all`
|
|
50
|
+
|
|
51
|
+
Choose this when:
|
|
52
|
+
|
|
53
|
+
- You want full plugin coverage and can manage incremental cleanup.
|
|
54
|
+
- You actively maintain migration and suppression hygiene.
|
|
55
|
+
|
|
56
|
+
### Domain overlays
|
|
57
|
+
|
|
58
|
+
Layer these when they match your codebase goals:
|
|
59
|
+
|
|
60
|
+
- `type-fest/types`
|
|
61
|
+
- `ts-extras/type-guards`
|
|
62
|
+
|
|
63
|
+
## Rollout playbook
|
|
64
|
+
|
|
65
|
+
1. Start with `warn` for one target folder/package.
|
|
66
|
+
2. Record baseline violations and identify high-churn rule families.
|
|
67
|
+
3. Run autofix in scoped batches, then run full tests/typecheck.
|
|
68
|
+
4. Promote to `error` after each batch reaches zero violations.
|
|
69
|
+
5. Repeat until all target folders are converged.
|
|
70
|
+
|
|
71
|
+
## Validation gates
|
|
72
|
+
|
|
73
|
+
- `npm run lint`
|
|
74
|
+
- `npm run typecheck`
|
|
75
|
+
- `npm run test`
|
|
76
|
+
|
|
77
|
+
For monorepos, run package-level gates first, then full-repo gates.
|
|
78
|
+
|
|
79
|
+
## Escalation policy
|
|
80
|
+
|
|
81
|
+
If a rule creates migration risk or noisy output:
|
|
82
|
+
|
|
83
|
+
1. Keep the preset enabled.
|
|
84
|
+
2. Temporarily lower that single rule to `warn` or `off` with a tracking note.
|
|
85
|
+
3. Re-enable after targeted remediation.
|
|
86
|
+
|
|
87
|
+
This preserves preset consistency while avoiding long-lived blind spots.
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
---
|
|
2
|
+
title: Rollout and fix safety
|
|
3
|
+
description: Guidance for phased rollout, fix safety, and manual verification.
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# Rollout and fix safety
|
|
7
|
+
|
|
8
|
+
This page centralizes rollout guidance used across rule migrations.
|
|
9
|
+
|
|
10
|
+
## Phased rollout model
|
|
11
|
+
|
|
12
|
+
1. Start with `warn` severity to measure blast radius.
|
|
13
|
+
2. Run `--fix` only on a scoped folder first.
|
|
14
|
+
3. Review runtime-sensitive call sites manually.
|
|
15
|
+
4. Promote to `error` after baseline cleanup.
|
|
16
|
+
|
|
17
|
+
## Fix safety expectations
|
|
18
|
+
|
|
19
|
+
- **Autofix-safe patterns:** simple API shape substitutions where runtime behavior is equivalent.
|
|
20
|
+
- **Suggestion-only patterns:** potentially behavior-sensitive changes requiring explicit reviewer choice.
|
|
21
|
+
- **Manual migrations:** replacements that depend on local typing, nullability, or control flow assumptions.
|
|
22
|
+
|
|
23
|
+
## Manual verification checklist
|
|
24
|
+
|
|
25
|
+
1. Verify import changes are deduplicated and stable.
|
|
26
|
+
2. Confirm narrowed types still match downstream usage.
|
|
27
|
+
3. Validate guard/predicate behavior with tests.
|
|
28
|
+
4. Confirm no accidental semantic changes in edge cases.
|
|
29
|
+
|
|
30
|
+
## FAQ
|
|
31
|
+
|
|
32
|
+
### Why not migrate everything in one pass?
|
|
33
|
+
|
|
34
|
+
Large one-shot migrations make regressions harder to detect and review. Smaller batches isolate risk.
|
|
35
|
+
|
|
36
|
+
### Should we always use `--fix` in CI?
|
|
37
|
+
|
|
38
|
+
No. Prefer running `--fix` locally and committing explicit changes. CI should validate, not rewrite, code.
|
|
39
|
+
|
|
40
|
+
### How do we handle wrapper utilities?
|
|
41
|
+
|
|
42
|
+
Either align wrappers to canonical helpers/types used by this plugin or deprecate wrappers that duplicate behavior.
|
|
@@ -0,0 +1,121 @@
|
|
|
1
|
+
---
|
|
2
|
+
title: Snapshot testing guidance
|
|
3
|
+
description: How to use Vitest snapshots safely and effectively in eslint-plugin-typefest.
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# Snapshot testing guidance
|
|
7
|
+
|
|
8
|
+
This guide explains where snapshot tests add value in this repository, where
|
|
9
|
+
they do not, and how to keep snapshots stable and reviewable.
|
|
10
|
+
|
|
11
|
+
## Why we use snapshots selectively
|
|
12
|
+
|
|
13
|
+
Snapshot tests are useful when they protect a stable, public contract.
|
|
14
|
+
|
|
15
|
+
In this plugin, high-value snapshots focus on:
|
|
16
|
+
|
|
17
|
+
- public plugin contracts (rules, presets, parser-option flags)
|
|
18
|
+
- normalized rule metadata matrices
|
|
19
|
+
- generated documentation artifacts (for example README rule tables)
|
|
20
|
+
- docs heading schemas and structural content contracts
|
|
21
|
+
|
|
22
|
+
Snapshot tests are intentionally not the default for all tests. Rule behavior,
|
|
23
|
+
autofixes, and diagnostics should still be asserted explicitly in `RuleTester`
|
|
24
|
+
cases.
|
|
25
|
+
|
|
26
|
+
## High-value snapshot targets in this repository
|
|
27
|
+
|
|
28
|
+
The current snapshot suites cover:
|
|
29
|
+
|
|
30
|
+
- `test/plugin-contract-snapshots.test.ts`
|
|
31
|
+
- exported rule names and counts
|
|
32
|
+
- preset matrix with normalized parser options and sorted rule IDs
|
|
33
|
+
- `test/rule-metadata-snapshots.test.ts`
|
|
34
|
+
- normalized rule metadata contract summaries
|
|
35
|
+
- `test/readme-rules-table-sync.test.ts`
|
|
36
|
+
- generated README rules section via file snapshot
|
|
37
|
+
- `test/docs-heading-snapshots.test.ts`
|
|
38
|
+
- canonical rule-doc heading matrix per rule page
|
|
39
|
+
|
|
40
|
+
## Anti-patterns to avoid
|
|
41
|
+
|
|
42
|
+
Avoid snapshotting these unless there is a strong reason:
|
|
43
|
+
|
|
44
|
+
- raw AST trees (too noisy and version-fragile)
|
|
45
|
+
- full ESLint diagnostics objects for normal rule tests
|
|
46
|
+
- unnormalized runtime objects with unstable key ordering
|
|
47
|
+
- large snapshots that hide intent and are hard to review
|
|
48
|
+
|
|
49
|
+
If a test can use a precise explicit assertion, prefer that over a large
|
|
50
|
+
snapshot.
|
|
51
|
+
|
|
52
|
+
## Snapshot design checklist
|
|
53
|
+
|
|
54
|
+
Before adding a snapshot, ensure all of the following are true:
|
|
55
|
+
|
|
56
|
+
1. The value represents a stable contract, not incidental internals.
|
|
57
|
+
2. Fields are normalized and deterministic:
|
|
58
|
+
- sort arrays and keys
|
|
59
|
+
- remove volatile data (timestamps, environment-specific paths, random IDs)
|
|
60
|
+
3. The snapshot payload is intentionally small and reviewer-friendly.
|
|
61
|
+
4. The test name explains the contract, not just the mechanism.
|
|
62
|
+
5. A failing diff should be actionable in code review.
|
|
63
|
+
|
|
64
|
+
## Matcher selection
|
|
65
|
+
|
|
66
|
+
Choose the matcher based on the output shape:
|
|
67
|
+
|
|
68
|
+
- `toMatchSnapshot()`
|
|
69
|
+
- best for small-to-medium normalized object graphs
|
|
70
|
+
- `toMatchInlineSnapshot()`
|
|
71
|
+
- best for compact payloads (identity labels, short strings)
|
|
72
|
+
- `toMatchFileSnapshot()`
|
|
73
|
+
- best for generated text artifacts where markdown/code readability matters
|
|
74
|
+
|
|
75
|
+
For generated Markdown sections or tables, prefer `toMatchFileSnapshot()`.
|
|
76
|
+
|
|
77
|
+
## Update workflow
|
|
78
|
+
|
|
79
|
+
Use focused updates first:
|
|
80
|
+
|
|
81
|
+
```bash
|
|
82
|
+
npx vitest run test/plugin-contract-snapshots.test.ts -u
|
|
83
|
+
npx vitest run test/rule-metadata-snapshots.test.ts -u
|
|
84
|
+
npx vitest run test/readme-rules-table-sync.test.ts -u
|
|
85
|
+
npx vitest run test/docs-heading-snapshots.test.ts -u
|
|
86
|
+
```
|
|
87
|
+
|
|
88
|
+
Then verify without update mode:
|
|
89
|
+
|
|
90
|
+
```bash
|
|
91
|
+
npx vitest run test/plugin-contract-snapshots.test.ts test/rule-metadata-snapshots.test.ts test/readme-rules-table-sync.test.ts test/docs-heading-snapshots.test.ts
|
|
92
|
+
```
|
|
93
|
+
|
|
94
|
+
Finally run repo checks before opening a PR:
|
|
95
|
+
|
|
96
|
+
```bash
|
|
97
|
+
npm run lint:all:fix:quiet
|
|
98
|
+
npm run typecheck
|
|
99
|
+
npm test
|
|
100
|
+
```
|
|
101
|
+
|
|
102
|
+
## PR review checklist for snapshot changes
|
|
103
|
+
|
|
104
|
+
- [ ] Snapshot diff reflects an intentional contract change.
|
|
105
|
+
- [ ] No volatile or environment-specific fields were added.
|
|
106
|
+
- [ ] Sorting/normalization is preserved.
|
|
107
|
+
- [ ] Rule behavior tests (explicit assertions) were updated when required.
|
|
108
|
+
- [ ] Generated docs snapshots still match canonical generators.
|
|
109
|
+
|
|
110
|
+
## Additional notes
|
|
111
|
+
|
|
112
|
+
- With async concurrent tests, use the local test context `expect` when
|
|
113
|
+
snapshotting to avoid association issues.
|
|
114
|
+
- Prefer one logical contract per snapshot test block; split broad snapshots
|
|
115
|
+
into smaller focused contracts.
|
|
116
|
+
- If a snapshot repeatedly churns from unrelated dependency updates, redesign
|
|
117
|
+
the payload to snapshot less and assert more explicitly.
|
|
118
|
+
|
|
119
|
+
## Further reading
|
|
120
|
+
|
|
121
|
+
- [Vitest Snapshot Guide](https://v2.vitest.dev/guide/snapshot.html)
|
|
@@ -0,0 +1,105 @@
|
|
|
1
|
+
---
|
|
2
|
+
title: Type-aware linting readiness
|
|
3
|
+
description: Checklist and rollout playbook for enabling type-aware eslint-plugin-typefest rules safely.
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# Type-aware linting readiness
|
|
7
|
+
|
|
8
|
+
Use this guide before enabling type-aware presets or rules in a large codebase.
|
|
9
|
+
|
|
10
|
+
## When this guide applies
|
|
11
|
+
|
|
12
|
+
Use this checklist when adopting:
|
|
13
|
+
|
|
14
|
+
- `recommended-type-checked`
|
|
15
|
+
- `strict` or `all` in projects with type-aware rules
|
|
16
|
+
- `ts-extras/type-guards`
|
|
17
|
+
|
|
18
|
+
## Readiness checklist
|
|
19
|
+
|
|
20
|
+
### 1) Parser-service availability
|
|
21
|
+
|
|
22
|
+
Confirm the lint runtime can provide full type services:
|
|
23
|
+
|
|
24
|
+
- ESLint uses `@typescript-eslint/parser`
|
|
25
|
+
- your lint config resolves the intended `tsconfig`(s)
|
|
26
|
+
- the targeted files are included in those `tsconfig`(s)
|
|
27
|
+
|
|
28
|
+
### 2) Project graph stability
|
|
29
|
+
|
|
30
|
+
Before enabling strict typed checks:
|
|
31
|
+
|
|
32
|
+
- `npm run typecheck` is green
|
|
33
|
+
- baseline linting is green (or has a controlled known backlog)
|
|
34
|
+
- generated types/artifacts are not stale
|
|
35
|
+
|
|
36
|
+
### 3) Performance baseline
|
|
37
|
+
|
|
38
|
+
Capture a baseline to detect regressions:
|
|
39
|
+
|
|
40
|
+
```bash
|
|
41
|
+
npx eslint "src/**/*.{ts,tsx}" --stats
|
|
42
|
+
```
|
|
43
|
+
|
|
44
|
+
Track:
|
|
45
|
+
|
|
46
|
+
- total runtime
|
|
47
|
+
- expensive files
|
|
48
|
+
- hot rules that call type-checker operations frequently
|
|
49
|
+
|
|
50
|
+
### 4) CI gate ordering
|
|
51
|
+
|
|
52
|
+
Prefer this order:
|
|
53
|
+
|
|
54
|
+
1. typecheck
|
|
55
|
+
2. lint (typed rules enabled)
|
|
56
|
+
3. tests
|
|
57
|
+
|
|
58
|
+
This keeps typed-service failures easy to classify.
|
|
59
|
+
|
|
60
|
+
## Recommended rollout sequence
|
|
61
|
+
|
|
62
|
+
1. Start with one package/folder.
|
|
63
|
+
2. Enable type-aware rules as `warn` first.
|
|
64
|
+
3. Fix baseline findings in small batches.
|
|
65
|
+
4. Promote to `error` once the scope stays green.
|
|
66
|
+
5. Expand scope incrementally.
|
|
67
|
+
|
|
68
|
+
## Fast validation commands
|
|
69
|
+
|
|
70
|
+
```bash
|
|
71
|
+
npm run typecheck
|
|
72
|
+
npm run lint
|
|
73
|
+
npm run test
|
|
74
|
+
```
|
|
75
|
+
|
|
76
|
+
For focused typed checks during migration:
|
|
77
|
+
|
|
78
|
+
```bash
|
|
79
|
+
npx eslint "src/**/*.{ts,tsx}" --stats
|
|
80
|
+
```
|
|
81
|
+
|
|
82
|
+
## Common failure modes
|
|
83
|
+
|
|
84
|
+
### "Typed rule requires type information"
|
|
85
|
+
|
|
86
|
+
Likely causes:
|
|
87
|
+
|
|
88
|
+
- file not included in the active `tsconfig`
|
|
89
|
+
- parser-service wiring mismatch for the current workspace
|
|
90
|
+
- incorrect project root assumptions in local/CI lint execution
|
|
91
|
+
|
|
92
|
+
### Large runtime regressions
|
|
93
|
+
|
|
94
|
+
Likely causes:
|
|
95
|
+
|
|
96
|
+
- expensive semantic checks on broad selectors
|
|
97
|
+
- repeated checker calls without syntax prefilters
|
|
98
|
+
- too-large rollout scope for first pass
|
|
99
|
+
|
|
100
|
+
## Related docs
|
|
101
|
+
|
|
102
|
+
- [Rollout and fix safety](./rollout-and-fix-safety.md)
|
|
103
|
+
- [Rule adoption checklist](./adoption-checklist.md)
|
|
104
|
+
- [Preset selection strategy](./preset-selection-strategy.md)
|
|
105
|
+
- [Typed service path inventory](https://nick2bad4u.github.io/eslint-plugin-typefest/docs/developer/typed-paths)
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
---
|
|
2
|
+
title: Overview
|
|
3
|
+
description: README-style overview for eslint-plugin-typefest.
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# eslint-plugin-typefest
|
|
7
|
+
|
|
8
|
+
ESLint plugin for teams that want consistent TypeScript-first conventions based on:
|
|
9
|
+
|
|
10
|
+
- [`type-fest`](https://github.com/sindresorhus/type-fest)
|
|
11
|
+
- [`ts-extras`](https://github.com/sindresorhus/ts-extras)
|
|
12
|
+
|
|
13
|
+
The plugin ships focused rule sets for modern Flat Config usage, with parser setup included in each preset.
|
|
14
|
+
|
|
15
|
+
## Installation
|
|
16
|
+
|
|
17
|
+
```bash
|
|
18
|
+
npm install --save-dev eslint-plugin-typefest typescript
|
|
19
|
+
```
|
|
20
|
+
|
|
21
|
+
> `@typescript-eslint/parser` is loaded automatically by plugin presets.
|
|
22
|
+
|
|
23
|
+
## Quick start (Flat Config)
|
|
24
|
+
|
|
25
|
+
```ts
|
|
26
|
+
import typefest from "eslint-plugin-typefest";
|
|
27
|
+
|
|
28
|
+
export default [typefest.configs.recommended];
|
|
29
|
+
```
|
|
30
|
+
|
|
31
|
+
That is enough for TypeScript files (`**/*.{ts,tsx,mts,cts}`).
|
|
32
|
+
|
|
33
|
+
## Presets
|
|
34
|
+
|
|
35
|
+
| Preset | Preset page |
|
|
36
|
+
| ------------------------------------------------- | ------------------------------------------------------------------- |
|
|
37
|
+
| π’ `typefest.configs.minimal` | [Minimal](./presets/minimal.md) |
|
|
38
|
+
| π‘ `typefest.configs.recommended` | [Recommended](./presets/recommended.md) |
|
|
39
|
+
| π `typefest.configs["recommended-type-checked"]` | [Recommended (type-checked)](./presets/recommended-type-checked.md) |
|
|
40
|
+
| π΄ `typefest.configs.strict` | [Strict](./presets/strict.md) |
|
|
41
|
+
| π£ `typefest.configs.all` | [All](./presets/all.md) |
|
|
42
|
+
| π `typefest.configs["type-fest/types"]` | [type-fest/types](./presets/type-fest-types.md) |
|
|
43
|
+
| β΄οΈ `typefest.configs["ts-extras/type-guards"]` | [ts-extras/type-guards](./presets/ts-extras-type-guards.md) |
|
|
44
|
+
|
|
45
|
+
## Next steps
|
|
46
|
+
|
|
47
|
+
- Open **Getting Started** in this sidebar.
|
|
48
|
+
- Browse [**Presets**](./presets/index.md) for preset-by-preset guidance.
|
|
49
|
+
- Use **Rules** to review every rule with examples.
|
|
@@ -0,0 +1,132 @@
|
|
|
1
|
+
# prefer-ts-extras-array-at
|
|
2
|
+
|
|
3
|
+
Prefer [`arrayAt`](https://github.com/sindresorhus/ts-extras/blob/main/source/array-at.ts) from `ts-extras` over `array.at(...)`.
|
|
4
|
+
|
|
5
|
+
`arrayAt(...)` preserves stronger element typing for indexed array access.
|
|
6
|
+
|
|
7
|
+
## Targeted pattern scope
|
|
8
|
+
|
|
9
|
+
This rule focuses on direct `array.at(index)` calls that can be migrated to `arrayAt(array, index)` with deterministic fixes.
|
|
10
|
+
|
|
11
|
+
- `array.at(index)` call sites that can use `arrayAt(array, index)`.
|
|
12
|
+
|
|
13
|
+
Alias indirection, wrapper helpers, and non-canonical call shapes are excluded to keep `arrayAt(array, index)` migrations safe.
|
|
14
|
+
|
|
15
|
+
## What this rule reports
|
|
16
|
+
|
|
17
|
+
This rule reports `array.at(index)` call sites when `arrayAt(array, index)` is the intended replacement.
|
|
18
|
+
|
|
19
|
+
- `array.at(index)` call sites that can use `arrayAt(array, index)`.
|
|
20
|
+
|
|
21
|
+
## Why this rule exists
|
|
22
|
+
|
|
23
|
+
`arrayAt` keeps indexed access explicit and improves type inference for tuples and readonly arrays.
|
|
24
|
+
|
|
25
|
+
- Indexing logic is standardized across modules.
|
|
26
|
+
- Tuple element access needs fewer local casts.
|
|
27
|
+
- Call sites remain explicit about both source array and index.
|
|
28
|
+
|
|
29
|
+
## β Incorrect
|
|
30
|
+
|
|
31
|
+
```ts
|
|
32
|
+
const firstStatus = statuses.at(0);
|
|
33
|
+
```
|
|
34
|
+
|
|
35
|
+
## β
Correct
|
|
36
|
+
|
|
37
|
+
```ts
|
|
38
|
+
const firstStatus = arrayAt(statuses, 0);
|
|
39
|
+
```
|
|
40
|
+
|
|
41
|
+
## Behavior and migration notes
|
|
42
|
+
|
|
43
|
+
- Runtime semantics align with `Array.prototype.at`.
|
|
44
|
+
- Negative indexes are supported (`-1` means last element).
|
|
45
|
+
- Out-of-range access still returns `undefined`.
|
|
46
|
+
|
|
47
|
+
## Additional examples
|
|
48
|
+
|
|
49
|
+
### β Incorrect β Additional example
|
|
50
|
+
|
|
51
|
+
```ts
|
|
52
|
+
const selected = tuple.at(-1); // Weaker tuple index inference
|
|
53
|
+
```
|
|
54
|
+
|
|
55
|
+
### β
Correct β Additional example
|
|
56
|
+
|
|
57
|
+
```ts
|
|
58
|
+
const selected = arrayAt(tuple, -1);
|
|
59
|
+
```
|
|
60
|
+
|
|
61
|
+
### β
Correct β Repository-wide usage
|
|
62
|
+
|
|
63
|
+
```ts
|
|
64
|
+
const first = arrayAt(users, 0);
|
|
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-at": "error",
|
|
77
|
+
},
|
|
78
|
+
},
|
|
79
|
+
];
|
|
80
|
+
```
|
|
81
|
+
|
|
82
|
+
## When not to use it
|
|
83
|
+
|
|
84
|
+
Disable this rule if native `.at()` usage is required by a local coding standard.
|
|
85
|
+
|
|
86
|
+
## Package documentation
|
|
87
|
+
|
|
88
|
+
ts-extras package documentation:
|
|
89
|
+
|
|
90
|
+
Source file: [`source/array-at.ts`](https://github.com/sindresorhus/ts-extras/blob/main/source/array-at.ts)
|
|
91
|
+
|
|
92
|
+
````ts
|
|
93
|
+
/**
|
|
94
|
+
Return the item at the given index like `Array#at()`, but with stronger typing for tuples. Supports `-1` on tuples.
|
|
95
|
+
|
|
96
|
+
This mirrors the runtime behavior of `Array#at()` and returns `undefined` for out-of-bounds indices. For tuples, a negative index of `-1` resolves to the tupleβs last element type. Positive literal indices for tuples resolve to the corresponding element type.
|
|
97
|
+
|
|
98
|
+
@example
|
|
99
|
+
```
|
|
100
|
+
import {arrayAt} from 'ts-extras';
|
|
101
|
+
|
|
102
|
+
const tuple = ['abc', 123, true] as const;
|
|
103
|
+
const last = arrayAt(tuple, -1);
|
|
104
|
+
//=> true
|
|
105
|
+
// ^? true | undefined
|
|
106
|
+
|
|
107
|
+
const first = arrayAt(tuple, 0);
|
|
108
|
+
//=> 'abc'
|
|
109
|
+
// ^? 'abc' | undefined
|
|
110
|
+
|
|
111
|
+
const array = ['a', 'b', 'c'];
|
|
112
|
+
const maybeItem = arrayAt(array, -1);
|
|
113
|
+
//=> 'c'
|
|
114
|
+
// ^? string | undefined
|
|
115
|
+
```
|
|
116
|
+
|
|
117
|
+
@category Improved builtin
|
|
118
|
+
*/
|
|
119
|
+
````
|
|
120
|
+
|
|
121
|
+
> **Rule catalog ID:** R001
|
|
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)
|