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,217 @@
|
|
|
1
|
+
# prefer-type-fest-if
|
|
2
|
+
|
|
3
|
+
Require TypeFest [`If`](https://github.com/sindresorhus/type-fest/blob/main/source/if.d.ts) + `Is*` utilities over deprecated aliases like `IfAny`,
|
|
4
|
+
`IfNever`, `IfUnknown`, `IfNull`, and `IfEmptyObject`.
|
|
5
|
+
|
|
6
|
+
## Targeted pattern scope
|
|
7
|
+
|
|
8
|
+
This rule reports deprecated `IfAny`/`IfNever`/`IfUnknown`/`IfNull`/`IfEmptyObject` aliases and migrates usage to canonical `If<Is*>` patterns from `type-fest`.
|
|
9
|
+
|
|
10
|
+
It is intentionally strict about naming consistency and intentionally conservative
|
|
11
|
+
about fixing. Rewriting `IfAny<T, A, B>` into `If<IsAny<T>, A, B>` is a
|
|
12
|
+
structural transform, not a safe one-token rename.
|
|
13
|
+
|
|
14
|
+
## What this rule reports
|
|
15
|
+
|
|
16
|
+
- Imported type aliases used as identifier type references:
|
|
17
|
+
- `IfAny`
|
|
18
|
+
- `IfNever`
|
|
19
|
+
- `IfUnknown`
|
|
20
|
+
- `IfNull`
|
|
21
|
+
- `IfEmptyObject`
|
|
22
|
+
|
|
23
|
+
### Detection boundaries
|
|
24
|
+
|
|
25
|
+
- ✅ Reports `import type { IfAny } ...` followed by `IfAny<...>` usage.
|
|
26
|
+
- ❌ Does not report locally renamed imports (`import type { IfAny as AliasIfAny } ...`).
|
|
27
|
+
- ❌ Does not report namespace-qualified references like `TypeUtils.IfAny<...>` (the matcher targets identifier references).
|
|
28
|
+
- ❌ Does not auto-fix because replacement requires rebuilding type arguments.
|
|
29
|
+
|
|
30
|
+
## Why this rule exists
|
|
31
|
+
|
|
32
|
+
These aliases are deprecated in TypeFest. The canonical pattern is to use
|
|
33
|
+
`If<...>` with the corresponding `Is*` utility (for example, `If<IsAny<T>, ...>`).
|
|
34
|
+
|
|
35
|
+
In practice, teams that keep old aliases around end up with mixed style across
|
|
36
|
+
packages (`IfAny`, `IfUnknown`, custom wrappers). This rule prevents that drift.
|
|
37
|
+
|
|
38
|
+
## ❌ Incorrect
|
|
39
|
+
|
|
40
|
+
```ts
|
|
41
|
+
import type { IfAny } from "type-fest";
|
|
42
|
+
|
|
43
|
+
type Result = IfAny<T, "any", "not-any">;
|
|
44
|
+
```
|
|
45
|
+
|
|
46
|
+
## ✅ Correct
|
|
47
|
+
|
|
48
|
+
```ts
|
|
49
|
+
import type { If, IsAny } from "type-fest";
|
|
50
|
+
|
|
51
|
+
type Result = If<IsAny<T>, "any", "not-any">;
|
|
52
|
+
```
|
|
53
|
+
|
|
54
|
+
## Behavior and migration notes
|
|
55
|
+
|
|
56
|
+
- Deprecated aliases map to `If<Is*>` forms (`IfAny` → `If<IsAny<...>>`, etc.).
|
|
57
|
+
- This rule intentionally does not auto-fix because argument restructuring must be explicit and reviewable.
|
|
58
|
+
- Keep migration focused on parity: preserve branch types and generic parameter order during conversion.
|
|
59
|
+
|
|
60
|
+
## Additional examples
|
|
61
|
+
|
|
62
|
+
### ❌ Incorrect — Additional example
|
|
63
|
+
|
|
64
|
+
```ts
|
|
65
|
+
import type { IfUnknown } from "custom-type-utils";
|
|
66
|
+
|
|
67
|
+
type ParseMode<T> = IfUnknown<T, "strict", "lenient">;
|
|
68
|
+
```
|
|
69
|
+
|
|
70
|
+
### ✅ Correct — Additional example
|
|
71
|
+
|
|
72
|
+
```ts
|
|
73
|
+
import type { If, IsUnknown } from "type-fest";
|
|
74
|
+
|
|
75
|
+
type ParseMode<T> = If<IsUnknown<T>, "strict", "lenient">;
|
|
76
|
+
```
|
|
77
|
+
|
|
78
|
+
### ✅ Correct — Repository-wide usage
|
|
79
|
+
|
|
80
|
+
```ts
|
|
81
|
+
import type { If, IsNull } from "type-fest";
|
|
82
|
+
|
|
83
|
+
type NullLabel<T> = If<IsNull<T>, "nullable", "non-nullable">;
|
|
84
|
+
```
|
|
85
|
+
|
|
86
|
+
## ESLint flat config example
|
|
87
|
+
|
|
88
|
+
```ts
|
|
89
|
+
import typefest from "eslint-plugin-typefest";
|
|
90
|
+
|
|
91
|
+
export default [
|
|
92
|
+
{
|
|
93
|
+
plugins: { typefest },
|
|
94
|
+
rules: {
|
|
95
|
+
"typefest/prefer-type-fest-if": "error",
|
|
96
|
+
},
|
|
97
|
+
},
|
|
98
|
+
];
|
|
99
|
+
```
|
|
100
|
+
|
|
101
|
+
## When not to use it
|
|
102
|
+
|
|
103
|
+
Disable this rule if legacy alias naming must be preserved for compatibility.
|
|
104
|
+
|
|
105
|
+
## Package documentation
|
|
106
|
+
|
|
107
|
+
TypeFest package documentation:
|
|
108
|
+
|
|
109
|
+
Source file: [`source/if.d.ts`](https://github.com/sindresorhus/type-fest/blob/main/source/if.d.ts)
|
|
110
|
+
|
|
111
|
+
````ts
|
|
112
|
+
/**
|
|
113
|
+
An if-else-like type that resolves depending on whether the given `boolean` type is `true` or `false`.
|
|
114
|
+
|
|
115
|
+
Use-cases:
|
|
116
|
+
- You can use this in combination with `Is*` types to create an if-else-like experience. For example, `If<IsAny<any>, 'is any', 'not any'>`.
|
|
117
|
+
|
|
118
|
+
Note:
|
|
119
|
+
- Returns a union of if branch and else branch if the given type is `boolean` or `any`. For example, `If<boolean, 'Y', 'N'>` will return `'Y' | 'N'`.
|
|
120
|
+
- Returns the else branch if the given type is `never`. For example, `If<never, 'Y', 'N'>` will return `'N'`.
|
|
121
|
+
|
|
122
|
+
@example
|
|
123
|
+
```
|
|
124
|
+
import type {If} from 'type-fest';
|
|
125
|
+
|
|
126
|
+
type A = If<true, 'yes', 'no'>;
|
|
127
|
+
//=> 'yes'
|
|
128
|
+
|
|
129
|
+
type B = If<false, 'yes', 'no'>;
|
|
130
|
+
//=> 'no'
|
|
131
|
+
|
|
132
|
+
type C = If<boolean, 'yes', 'no'>;
|
|
133
|
+
//=> 'yes' | 'no'
|
|
134
|
+
|
|
135
|
+
type D = If<any, 'yes', 'no'>;
|
|
136
|
+
//=> 'yes' | 'no'
|
|
137
|
+
|
|
138
|
+
type E = If<never, 'yes', 'no'>;
|
|
139
|
+
//=> 'no'
|
|
140
|
+
```
|
|
141
|
+
|
|
142
|
+
@example
|
|
143
|
+
```
|
|
144
|
+
import type {If, IsAny, IsNever} from 'type-fest';
|
|
145
|
+
|
|
146
|
+
type A = If<IsAny<unknown>, 'is any', 'not any'>;
|
|
147
|
+
//=> 'not any'
|
|
148
|
+
|
|
149
|
+
type B = If<IsNever<never>, 'is never', 'not never'>;
|
|
150
|
+
//=> 'is never'
|
|
151
|
+
```
|
|
152
|
+
|
|
153
|
+
@example
|
|
154
|
+
```
|
|
155
|
+
import type {If, IsEqual} from 'type-fest';
|
|
156
|
+
|
|
157
|
+
type IfEqual<T, U, IfBranch, ElseBranch> = If<IsEqual<T, U>, IfBranch, ElseBranch>;
|
|
158
|
+
|
|
159
|
+
type A = IfEqual<string, string, 'equal', 'not equal'>;
|
|
160
|
+
//=> 'equal'
|
|
161
|
+
|
|
162
|
+
type B = IfEqual<string, number, 'equal', 'not equal'>;
|
|
163
|
+
//=> 'not equal'
|
|
164
|
+
```
|
|
165
|
+
|
|
166
|
+
Note: Sometimes using the `If` type can make an implementation non–tail-recursive, which can impact performance. In such cases, it’s better to use a conditional directly. Refer to the following example:
|
|
167
|
+
|
|
168
|
+
@example
|
|
169
|
+
```
|
|
170
|
+
import type {If, IsEqual, StringRepeat} from 'type-fest';
|
|
171
|
+
|
|
172
|
+
type HundredZeroes = StringRepeat<'0', 100>;
|
|
173
|
+
|
|
174
|
+
// The following implementation is not tail recursive
|
|
175
|
+
type Includes<S extends string, Char extends string> =
|
|
176
|
+
S extends `${infer First}${infer Rest}`
|
|
177
|
+
? If<IsEqual<First, Char>,
|
|
178
|
+
'found',
|
|
179
|
+
Includes<Rest, Char>>
|
|
180
|
+
: 'not found';
|
|
181
|
+
|
|
182
|
+
// Hence, instantiations with long strings will fail
|
|
183
|
+
// @ts-expect-error
|
|
184
|
+
type Fails = Includes<HundredZeroes, '1'>;
|
|
185
|
+
// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
|
186
|
+
// Error: Type instantiation is excessively deep and possibly infinite.
|
|
187
|
+
|
|
188
|
+
// However, if we use a simple conditional instead of `If`, the implementation becomes tail-recursive
|
|
189
|
+
type IncludesWithoutIf<S extends string, Char extends string> =
|
|
190
|
+
S extends `${infer First}${infer Rest}`
|
|
191
|
+
? IsEqual<First, Char> extends true
|
|
192
|
+
? 'found'
|
|
193
|
+
: IncludesWithoutIf<Rest, Char>
|
|
194
|
+
: 'not found';
|
|
195
|
+
|
|
196
|
+
// Now, instantiations with long strings will work
|
|
197
|
+
type Works = IncludesWithoutIf<HundredZeroes, '1'>;
|
|
198
|
+
//=> 'not found'
|
|
199
|
+
```
|
|
200
|
+
|
|
201
|
+
@category Type Guard
|
|
202
|
+
@category Utilities
|
|
203
|
+
*/
|
|
204
|
+
````
|
|
205
|
+
|
|
206
|
+
> **Rule catalog ID:** R041
|
|
207
|
+
|
|
208
|
+
## Further reading
|
|
209
|
+
|
|
210
|
+
- [`type-fest` README](https://github.com/sindresorhus/type-fest)
|
|
211
|
+
- [`type-fest` npm documentation](https://www.npmjs.com/package/type-fest)
|
|
212
|
+
- [TypeScript Handbook: Utility Types](https://www.typescriptlang.org/docs/handbook/utility-types.html)
|
|
213
|
+
|
|
214
|
+
## Adoption resources
|
|
215
|
+
|
|
216
|
+
- [Rule adoption checklist](./guides/adoption-checklist.md)
|
|
217
|
+
- [Rollout and fix safety](./guides/rollout-and-fix-safety.md)
|
|
@@ -0,0 +1,170 @@
|
|
|
1
|
+
# prefer-type-fest-iterable-element
|
|
2
|
+
|
|
3
|
+
Require TypeFest [`IterableElement<T>`](https://github.com/sindresorhus/type-fest/blob/main/source/iterable-element.d.ts) over imported aliases like `SetElement`, `SetEntry`, and `SetValues`.
|
|
4
|
+
|
|
5
|
+
## Targeted pattern scope
|
|
6
|
+
|
|
7
|
+
This rule focuses on imported legacy iterable helper aliases that TypeFest now models via `IterableElement`.
|
|
8
|
+
|
|
9
|
+
- Type references that resolve to imported `SetElement` aliases.
|
|
10
|
+
- Type references that resolve to imported `SetEntry` aliases.
|
|
11
|
+
- Type references that resolve to imported `SetValues` aliases.
|
|
12
|
+
|
|
13
|
+
Unrelated type references and aliases from non-targeted imports are intentionally left untouched.
|
|
14
|
+
|
|
15
|
+
## What this rule reports
|
|
16
|
+
|
|
17
|
+
This rule reports imported iterable helper aliases that should be consolidated to `IterableElement`.
|
|
18
|
+
|
|
19
|
+
- Type references that resolve to imported `SetElement` aliases.
|
|
20
|
+
- Type references that resolve to imported `SetEntry` aliases.
|
|
21
|
+
- Type references that resolve to imported `SetValues` aliases.
|
|
22
|
+
|
|
23
|
+
## Why this rule exists
|
|
24
|
+
|
|
25
|
+
`IterableElement` is the canonical TypeFest utility for extracting element types from iterable collections. Consolidating on one name makes collection type extraction patterns easier to audit and maintain.
|
|
26
|
+
|
|
27
|
+
## ❌ Incorrect
|
|
28
|
+
|
|
29
|
+
```ts
|
|
30
|
+
import type { SetElement } from "type-aliases";
|
|
31
|
+
|
|
32
|
+
type Value = SetElement<Set<string>>;
|
|
33
|
+
```
|
|
34
|
+
|
|
35
|
+
## ✅ Correct
|
|
36
|
+
|
|
37
|
+
```ts
|
|
38
|
+
import type { IterableElement } from "type-fest";
|
|
39
|
+
|
|
40
|
+
type Value = IterableElement<Set<string>>;
|
|
41
|
+
```
|
|
42
|
+
|
|
43
|
+
## Behavior and migration notes
|
|
44
|
+
|
|
45
|
+
- This rule targets imported alias names that duplicate `IterableElement` semantics (`SetElement`, `SetEntry`, `SetValues`).
|
|
46
|
+
- Standardize on `IterableElement<T>` for sync and async iterable extraction patterns.
|
|
47
|
+
- Keep legacy alias names only when external libraries expose them as a required public API.
|
|
48
|
+
|
|
49
|
+
## Additional examples
|
|
50
|
+
|
|
51
|
+
### ❌ Incorrect — Additional example
|
|
52
|
+
|
|
53
|
+
```ts
|
|
54
|
+
import type { SetElement } from "type-aliases";
|
|
55
|
+
|
|
56
|
+
type Item = SetElement<Set<number>>;
|
|
57
|
+
```
|
|
58
|
+
|
|
59
|
+
### ✅ Correct — Additional example
|
|
60
|
+
|
|
61
|
+
```ts
|
|
62
|
+
import type { IterableElement } from "type-fest";
|
|
63
|
+
|
|
64
|
+
type Item = IterableElement<Set<number>>;
|
|
65
|
+
```
|
|
66
|
+
|
|
67
|
+
### ✅ Correct — Repository-wide usage
|
|
68
|
+
|
|
69
|
+
```ts
|
|
70
|
+
type StreamChunk = IterableElement<AsyncIterable<string>>;
|
|
71
|
+
```
|
|
72
|
+
|
|
73
|
+
## ESLint flat config example
|
|
74
|
+
|
|
75
|
+
```ts
|
|
76
|
+
import typefest from "eslint-plugin-typefest";
|
|
77
|
+
|
|
78
|
+
export default [
|
|
79
|
+
{
|
|
80
|
+
plugins: { typefest },
|
|
81
|
+
rules: {
|
|
82
|
+
"typefest/prefer-type-fest-iterable-element": "error",
|
|
83
|
+
},
|
|
84
|
+
},
|
|
85
|
+
];
|
|
86
|
+
```
|
|
87
|
+
|
|
88
|
+
## When not to use it
|
|
89
|
+
|
|
90
|
+
Disable this rule if compatibility requires preserving external alias names.
|
|
91
|
+
|
|
92
|
+
## Package documentation
|
|
93
|
+
|
|
94
|
+
TypeFest package documentation:
|
|
95
|
+
|
|
96
|
+
Source file: [`source/iterable-element.d.ts`](https://github.com/sindresorhus/type-fest/blob/main/source/iterable-element.d.ts)
|
|
97
|
+
|
|
98
|
+
````ts
|
|
99
|
+
/**
|
|
100
|
+
Get the element type of an `Iterable`/`AsyncIterable`. For example, `Array`, `Set`, `Map`, generator, stream, etc.
|
|
101
|
+
|
|
102
|
+
This can be useful, for example, if you want to get the type that is yielded in a generator function. Often the return type of those functions are not specified.
|
|
103
|
+
|
|
104
|
+
This type works with both `Iterable`s and `AsyncIterable`s, so it can be use with synchronous and asynchronous generators.
|
|
105
|
+
|
|
106
|
+
Here is an example of `IterableElement` in action with a generator function:
|
|
107
|
+
|
|
108
|
+
@example
|
|
109
|
+
```
|
|
110
|
+
import type {IterableElement} from 'type-fest';
|
|
111
|
+
|
|
112
|
+
function * iAmGenerator() {
|
|
113
|
+
yield 1;
|
|
114
|
+
yield 2;
|
|
115
|
+
}
|
|
116
|
+
|
|
117
|
+
type MeNumber = IterableElement<ReturnType<typeof iAmGenerator>>;
|
|
118
|
+
```
|
|
119
|
+
|
|
120
|
+
And here is an example with an async generator:
|
|
121
|
+
|
|
122
|
+
@example
|
|
123
|
+
```
|
|
124
|
+
import type {IterableElement} from 'type-fest';
|
|
125
|
+
|
|
126
|
+
async function * iAmGeneratorAsync() {
|
|
127
|
+
yield 'hi';
|
|
128
|
+
yield true;
|
|
129
|
+
}
|
|
130
|
+
|
|
131
|
+
type MeStringOrBoolean = IterableElement<ReturnType<typeof iAmGeneratorAsync>>;
|
|
132
|
+
```
|
|
133
|
+
|
|
134
|
+
Many types in JavaScript/TypeScript are iterables. This type works on all types that implement those interfaces.
|
|
135
|
+
|
|
136
|
+
An example with an array of strings:
|
|
137
|
+
|
|
138
|
+
@example
|
|
139
|
+
```
|
|
140
|
+
import type {IterableElement} from 'type-fest';
|
|
141
|
+
|
|
142
|
+
type MeString = IterableElement<string[]>;
|
|
143
|
+
```
|
|
144
|
+
|
|
145
|
+
@example
|
|
146
|
+
```
|
|
147
|
+
import type {IterableElement} from 'type-fest';
|
|
148
|
+
|
|
149
|
+
const fruits = new Set(['🍎', '🍌', '🍉'] as const);
|
|
150
|
+
|
|
151
|
+
type Fruit = IterableElement<typeof fruits>;
|
|
152
|
+
//=> '🍎' | '🍌' | '🍉'
|
|
153
|
+
```
|
|
154
|
+
|
|
155
|
+
@category Iterable
|
|
156
|
+
*/
|
|
157
|
+
````
|
|
158
|
+
|
|
159
|
+
> **Rule catalog ID:** R042
|
|
160
|
+
|
|
161
|
+
## Further reading
|
|
162
|
+
|
|
163
|
+
- [`type-fest` README](https://github.com/sindresorhus/type-fest)
|
|
164
|
+
- [`type-fest` npm documentation](https://www.npmjs.com/package/type-fest)
|
|
165
|
+
- [TypeScript Handbook: Utility Types](https://www.typescriptlang.org/docs/handbook/utility-types.html)
|
|
166
|
+
|
|
167
|
+
## Adoption resources
|
|
168
|
+
|
|
169
|
+
- [Rule adoption checklist](./guides/adoption-checklist.md)
|
|
170
|
+
- [Rollout and fix safety](./guides/rollout-and-fix-safety.md)
|
|
@@ -0,0 +1,107 @@
|
|
|
1
|
+
# prefer-type-fest-json-array
|
|
2
|
+
|
|
3
|
+
Require TypeFest [`JsonArray`](https://github.com/sindresorhus/type-fest/blob/main/source/json-value.d.ts) over explicit `JsonValue` array-union aliases.
|
|
4
|
+
|
|
5
|
+
## Targeted pattern scope
|
|
6
|
+
|
|
7
|
+
This rule matches explicit JSON array alias spellings where `JsonArray` communicates intent directly.
|
|
8
|
+
|
|
9
|
+
- `JsonValue[] | readonly JsonValue[]`
|
|
10
|
+
- `Array<JsonValue> | ReadonlyArray<JsonValue>`
|
|
11
|
+
|
|
12
|
+
This rule intentionally excludes other array aliases and non-JSON payload array forms.
|
|
13
|
+
|
|
14
|
+
## What this rule reports
|
|
15
|
+
|
|
16
|
+
This rule reports explicit `JsonValue` array alias forms that should use `JsonArray`.
|
|
17
|
+
|
|
18
|
+
- `JsonValue[] | readonly JsonValue[]`
|
|
19
|
+
- `Array<JsonValue> | ReadonlyArray<JsonValue>`
|
|
20
|
+
|
|
21
|
+
## Why this rule exists
|
|
22
|
+
|
|
23
|
+
`JsonArray` communicates JSON array intent directly and avoids repeating equivalent array union shapes.
|
|
24
|
+
|
|
25
|
+
## ❌ Incorrect
|
|
26
|
+
|
|
27
|
+
```ts
|
|
28
|
+
type Payload = JsonValue[] | readonly JsonValue[];
|
|
29
|
+
```
|
|
30
|
+
|
|
31
|
+
## ✅ Correct
|
|
32
|
+
|
|
33
|
+
```ts
|
|
34
|
+
type Payload = JsonArray;
|
|
35
|
+
```
|
|
36
|
+
|
|
37
|
+
## Behavior and migration notes
|
|
38
|
+
|
|
39
|
+
- `JsonArray` is the canonical alias for JSON arrays in `type-fest`.
|
|
40
|
+
- Keep `JsonValue[] | readonly JsonValue[]` usage out of shared contracts to avoid duplicate representations.
|
|
41
|
+
- Prefer one canonical alias per concept to reduce type alias drift across packages.
|
|
42
|
+
|
|
43
|
+
## Additional examples
|
|
44
|
+
|
|
45
|
+
### ❌ Incorrect — Additional example
|
|
46
|
+
|
|
47
|
+
```ts
|
|
48
|
+
type Payload = Array<JsonValue>;
|
|
49
|
+
```
|
|
50
|
+
|
|
51
|
+
### ✅ Correct — Additional example
|
|
52
|
+
|
|
53
|
+
```ts
|
|
54
|
+
type Payload = JsonArray;
|
|
55
|
+
```
|
|
56
|
+
|
|
57
|
+
### ✅ Correct — Repository-wide usage
|
|
58
|
+
|
|
59
|
+
```ts
|
|
60
|
+
type SerializedRows = JsonArray;
|
|
61
|
+
```
|
|
62
|
+
|
|
63
|
+
## ESLint flat config example
|
|
64
|
+
|
|
65
|
+
```ts
|
|
66
|
+
import typefest from "eslint-plugin-typefest";
|
|
67
|
+
|
|
68
|
+
export default [
|
|
69
|
+
{
|
|
70
|
+
plugins: { typefest },
|
|
71
|
+
rules: {
|
|
72
|
+
"typefest/prefer-type-fest-json-array": "error",
|
|
73
|
+
},
|
|
74
|
+
},
|
|
75
|
+
];
|
|
76
|
+
```
|
|
77
|
+
|
|
78
|
+
## When not to use it
|
|
79
|
+
|
|
80
|
+
Disable this rule if public APIs must preserve existing custom alias names for compatibility.
|
|
81
|
+
|
|
82
|
+
## Package documentation
|
|
83
|
+
|
|
84
|
+
TypeFest package documentation:
|
|
85
|
+
|
|
86
|
+
Source file: [`source/json-value.d.ts`](https://github.com/sindresorhus/type-fest/blob/main/source/json-value.d.ts)
|
|
87
|
+
|
|
88
|
+
```ts
|
|
89
|
+
/**
|
|
90
|
+
Matches a JSON array.
|
|
91
|
+
|
|
92
|
+
@category JSON
|
|
93
|
+
*/
|
|
94
|
+
```
|
|
95
|
+
|
|
96
|
+
> **Rule catalog ID:** R043
|
|
97
|
+
|
|
98
|
+
## Further reading
|
|
99
|
+
|
|
100
|
+
- [`type-fest` README](https://github.com/sindresorhus/type-fest)
|
|
101
|
+
- [`type-fest` npm documentation](https://www.npmjs.com/package/type-fest)
|
|
102
|
+
- [TypeScript Handbook: Utility Types](https://www.typescriptlang.org/docs/handbook/utility-types.html)
|
|
103
|
+
|
|
104
|
+
## Adoption resources
|
|
105
|
+
|
|
106
|
+
- [Rule adoption checklist](./guides/adoption-checklist.md)
|
|
107
|
+
- [Rollout and fix safety](./guides/rollout-and-fix-safety.md)
|
|
@@ -0,0 +1,107 @@
|
|
|
1
|
+
# prefer-type-fest-json-object
|
|
2
|
+
|
|
3
|
+
Require TypeFest [`JsonObject`](https://github.com/sindresorhus/type-fest/blob/main/source/json-value.d.ts) over equivalent explicit `Record<string, JsonValue>` aliases.
|
|
4
|
+
|
|
5
|
+
## Targeted pattern scope
|
|
6
|
+
|
|
7
|
+
This rule targets direct `Record<string, JsonValue>` aliases used as JSON object contracts.
|
|
8
|
+
|
|
9
|
+
- `Record<string, JsonValue>`
|
|
10
|
+
|
|
11
|
+
Broader record aliases and structurally different object constraints are intentionally left unchanged.
|
|
12
|
+
|
|
13
|
+
## What this rule reports
|
|
14
|
+
|
|
15
|
+
This rule reports `Record<string, JsonValue>` aliases that should use `JsonObject`.
|
|
16
|
+
|
|
17
|
+
- `Record<string, JsonValue>`
|
|
18
|
+
|
|
19
|
+
## Why this rule exists
|
|
20
|
+
|
|
21
|
+
`JsonObject` communicates intent directly and avoids repeating verbose JSON object alias patterns.
|
|
22
|
+
|
|
23
|
+
## ❌ Incorrect
|
|
24
|
+
|
|
25
|
+
```ts
|
|
26
|
+
type Payload = Record<string, JsonValue>;
|
|
27
|
+
```
|
|
28
|
+
|
|
29
|
+
## ✅ Correct
|
|
30
|
+
|
|
31
|
+
```ts
|
|
32
|
+
type Payload = JsonObject;
|
|
33
|
+
```
|
|
34
|
+
|
|
35
|
+
## Behavior and migration notes
|
|
36
|
+
|
|
37
|
+
- `JsonObject` is equivalent in intent to `Record<string, JsonValue>` for JSON object contracts.
|
|
38
|
+
- Standardize on `JsonObject` for shared payload/config types to avoid repeating low-level dictionary syntax.
|
|
39
|
+
- Keep runtime validation separate; this rule only normalizes compile-time type naming.
|
|
40
|
+
|
|
41
|
+
## Additional examples
|
|
42
|
+
|
|
43
|
+
### ❌ Incorrect — Additional example
|
|
44
|
+
|
|
45
|
+
```ts
|
|
46
|
+
type Payload = Record<string, JsonValue>;
|
|
47
|
+
```
|
|
48
|
+
|
|
49
|
+
### ✅ Correct — Additional example
|
|
50
|
+
|
|
51
|
+
```ts
|
|
52
|
+
type Payload = JsonObject;
|
|
53
|
+
```
|
|
54
|
+
|
|
55
|
+
### ✅ Correct — Repository-wide usage
|
|
56
|
+
|
|
57
|
+
```ts
|
|
58
|
+
type EventAttributes = JsonObject;
|
|
59
|
+
```
|
|
60
|
+
|
|
61
|
+
## ESLint flat config example
|
|
62
|
+
|
|
63
|
+
```ts
|
|
64
|
+
import typefest from "eslint-plugin-typefest";
|
|
65
|
+
|
|
66
|
+
export default [
|
|
67
|
+
{
|
|
68
|
+
plugins: { typefest },
|
|
69
|
+
rules: {
|
|
70
|
+
"typefest/prefer-type-fest-json-object": "error",
|
|
71
|
+
},
|
|
72
|
+
},
|
|
73
|
+
];
|
|
74
|
+
```
|
|
75
|
+
|
|
76
|
+
## When not to use it
|
|
77
|
+
|
|
78
|
+
Disable this rule if a published API requires preserving existing alias names.
|
|
79
|
+
|
|
80
|
+
## Package documentation
|
|
81
|
+
|
|
82
|
+
TypeFest package documentation:
|
|
83
|
+
|
|
84
|
+
Source file: [`source/json-value.d.ts`](https://github.com/sindresorhus/type-fest/blob/main/source/json-value.d.ts)
|
|
85
|
+
|
|
86
|
+
```ts
|
|
87
|
+
/**
|
|
88
|
+
Matches a JSON object.
|
|
89
|
+
|
|
90
|
+
This type can be useful to enforce some input to be JSON-compatible or as a super-type to be extended from. Don't use this as a direct return type as the user would have to double-cast it: `jsonObject as unknown as CustomResponse`. Instead, you could extend your CustomResponse type from it to ensure your type only uses JSON-compatible types: `interface CustomResponse extends JsonObject { … }`.
|
|
91
|
+
|
|
92
|
+
@category JSON
|
|
93
|
+
*/
|
|
94
|
+
```
|
|
95
|
+
|
|
96
|
+
> **Rule catalog ID:** R044
|
|
97
|
+
|
|
98
|
+
## Further reading
|
|
99
|
+
|
|
100
|
+
- [`type-fest` README](https://github.com/sindresorhus/type-fest)
|
|
101
|
+
- [`type-fest` npm documentation](https://www.npmjs.com/package/type-fest)
|
|
102
|
+
- [TypeScript Handbook: Utility Types](https://www.typescriptlang.org/docs/handbook/utility-types.html)
|
|
103
|
+
|
|
104
|
+
## Adoption resources
|
|
105
|
+
|
|
106
|
+
- [Rule adoption checklist](./guides/adoption-checklist.md)
|
|
107
|
+
- [Rollout and fix safety](./guides/rollout-and-fix-safety.md)
|
|
@@ -0,0 +1,105 @@
|
|
|
1
|
+
# prefer-type-fest-json-primitive
|
|
2
|
+
|
|
3
|
+
Require TypeFest [`JsonPrimitive`](https://github.com/sindresorhus/type-fest/blob/main/source/json-value.d.ts) over explicit JSON primitive keyword unions.
|
|
4
|
+
|
|
5
|
+
## Targeted pattern scope
|
|
6
|
+
|
|
7
|
+
This rule narrows matching to explicit primitive-union spellings that TypeFest captures as `JsonPrimitive`.
|
|
8
|
+
|
|
9
|
+
- `boolean | null | number | string` unions (in any order)
|
|
10
|
+
|
|
11
|
+
Non-primitive additions and alias-expanded unions are out of scope unless they exactly preserve the primitive set.
|
|
12
|
+
|
|
13
|
+
## What this rule reports
|
|
14
|
+
|
|
15
|
+
This rule reports primitive-only unions that should be rewritten as `JsonPrimitive`.
|
|
16
|
+
|
|
17
|
+
- `boolean | null | number | string` unions (in any order)
|
|
18
|
+
|
|
19
|
+
## Why this rule exists
|
|
20
|
+
|
|
21
|
+
`JsonPrimitive` communicates JSON primitive intent directly and avoids repeating equivalent keyword-union definitions.
|
|
22
|
+
|
|
23
|
+
## ❌ Incorrect
|
|
24
|
+
|
|
25
|
+
```ts
|
|
26
|
+
type Scalar = string | number | boolean | null;
|
|
27
|
+
```
|
|
28
|
+
|
|
29
|
+
## ✅ Correct
|
|
30
|
+
|
|
31
|
+
```ts
|
|
32
|
+
type Scalar = JsonPrimitive;
|
|
33
|
+
```
|
|
34
|
+
|
|
35
|
+
## Behavior and migration notes
|
|
36
|
+
|
|
37
|
+
- `JsonPrimitive` covers `string | number | boolean | null`.
|
|
38
|
+
- The union order in source code is irrelevant; this rule targets the shape, not token order.
|
|
39
|
+
- Keep this alias for scalar JSON domains while using `JsonValue` for full recursive JSON values.
|
|
40
|
+
|
|
41
|
+
## Additional examples
|
|
42
|
+
|
|
43
|
+
### ❌ Incorrect — Additional example
|
|
44
|
+
|
|
45
|
+
```ts
|
|
46
|
+
type PrimitiveValue = string | number | boolean | null;
|
|
47
|
+
```
|
|
48
|
+
|
|
49
|
+
### ✅ Correct — Additional example
|
|
50
|
+
|
|
51
|
+
```ts
|
|
52
|
+
type PrimitiveValue = JsonPrimitive;
|
|
53
|
+
```
|
|
54
|
+
|
|
55
|
+
### ✅ Correct — Repository-wide usage
|
|
56
|
+
|
|
57
|
+
```ts
|
|
58
|
+
type Cell = JsonPrimitive;
|
|
59
|
+
```
|
|
60
|
+
|
|
61
|
+
## ESLint flat config example
|
|
62
|
+
|
|
63
|
+
```ts
|
|
64
|
+
import typefest from "eslint-plugin-typefest";
|
|
65
|
+
|
|
66
|
+
export default [
|
|
67
|
+
{
|
|
68
|
+
plugins: { typefest },
|
|
69
|
+
rules: {
|
|
70
|
+
"typefest/prefer-type-fest-json-primitive": "error",
|
|
71
|
+
},
|
|
72
|
+
},
|
|
73
|
+
];
|
|
74
|
+
```
|
|
75
|
+
|
|
76
|
+
## When not to use it
|
|
77
|
+
|
|
78
|
+
Disable this rule if existing exported aliases must remain stable.
|
|
79
|
+
|
|
80
|
+
## Package documentation
|
|
81
|
+
|
|
82
|
+
TypeFest package documentation:
|
|
83
|
+
|
|
84
|
+
Source file: [`source/json-value.d.ts`](https://github.com/sindresorhus/type-fest/blob/main/source/json-value.d.ts)
|
|
85
|
+
|
|
86
|
+
```ts
|
|
87
|
+
/**
|
|
88
|
+
Matches any valid JSON primitive value.
|
|
89
|
+
|
|
90
|
+
@category JSON
|
|
91
|
+
*/
|
|
92
|
+
```
|
|
93
|
+
|
|
94
|
+
> **Rule catalog ID:** R045
|
|
95
|
+
|
|
96
|
+
## Further reading
|
|
97
|
+
|
|
98
|
+
- [`type-fest` README](https://github.com/sindresorhus/type-fest)
|
|
99
|
+
- [`type-fest` npm documentation](https://www.npmjs.com/package/type-fest)
|
|
100
|
+
- [TypeScript Handbook: Utility Types](https://www.typescriptlang.org/docs/handbook/utility-types.html)
|
|
101
|
+
|
|
102
|
+
## Adoption resources
|
|
103
|
+
|
|
104
|
+
- [Rule adoption checklist](./guides/adoption-checklist.md)
|
|
105
|
+
- [Rollout and fix safety](./guides/rollout-and-fix-safety.md)
|