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,151 @@
|
|
|
1
|
+
# prefer-type-fest-readonly-deep
|
|
2
|
+
|
|
3
|
+
Require TypeFest [`ReadonlyDeep`](https://github.com/sindresorhus/type-fest/blob/main/source/readonly-deep.d.ts) over `DeepReadonly` aliases.
|
|
4
|
+
|
|
5
|
+
## Targeted pattern scope
|
|
6
|
+
|
|
7
|
+
This rule reports `DeepReadonly<T>` aliases and prefers `ReadonlyDeep<T>` for recursive immutability contracts.
|
|
8
|
+
|
|
9
|
+
## What this rule reports
|
|
10
|
+
|
|
11
|
+
- Type references named `DeepReadonly`.
|
|
12
|
+
|
|
13
|
+
### Detection boundaries
|
|
14
|
+
|
|
15
|
+
- ✅ Reports direct `DeepReadonly<T>` type references.
|
|
16
|
+
- ❌ Does not auto-fix when legacy helper semantics differ for containers.
|
|
17
|
+
|
|
18
|
+
## Why this rule exists
|
|
19
|
+
|
|
20
|
+
`ReadonlyDeep<T>` is TypeFest's canonical deep immutability utility.
|
|
21
|
+
|
|
22
|
+
Canonical naming prevents mixed deep-readonly conventions in shared contract packages.
|
|
23
|
+
|
|
24
|
+
## ❌ Incorrect
|
|
25
|
+
|
|
26
|
+
```ts
|
|
27
|
+
type Config = DeepReadonly<AppConfig>;
|
|
28
|
+
```
|
|
29
|
+
|
|
30
|
+
## ✅ Correct
|
|
31
|
+
|
|
32
|
+
```ts
|
|
33
|
+
import type { ReadonlyDeep } from "type-fest";
|
|
34
|
+
|
|
35
|
+
type Config = ReadonlyDeep<AppConfig>;
|
|
36
|
+
```
|
|
37
|
+
|
|
38
|
+
## Behavior and migration notes
|
|
39
|
+
|
|
40
|
+
- `ReadonlyDeep<T>` recursively applies readonly semantics to nested structures.
|
|
41
|
+
- Verify behavior for maps/sets/tuples if your prior alias had custom handling.
|
|
42
|
+
- Prefer applying deep readonly at API boundaries where mutation should be prevented.
|
|
43
|
+
|
|
44
|
+
## ESLint flat config example
|
|
45
|
+
|
|
46
|
+
```ts
|
|
47
|
+
import typefest from "eslint-plugin-typefest";
|
|
48
|
+
|
|
49
|
+
export default [
|
|
50
|
+
{
|
|
51
|
+
plugins: { typefest },
|
|
52
|
+
rules: {
|
|
53
|
+
"typefest/prefer-type-fest-readonly-deep": "error",
|
|
54
|
+
},
|
|
55
|
+
},
|
|
56
|
+
];
|
|
57
|
+
```
|
|
58
|
+
|
|
59
|
+
## When not to use it
|
|
60
|
+
|
|
61
|
+
Disable this rule if your codebase intentionally standardizes `DeepReadonly` naming instead of TypeFest.
|
|
62
|
+
|
|
63
|
+
## Package documentation
|
|
64
|
+
|
|
65
|
+
TypeFest package documentation:
|
|
66
|
+
|
|
67
|
+
Source file: [`source/readonly-deep.d.ts`](https://github.com/sindresorhus/type-fest/blob/main/source/readonly-deep.d.ts)
|
|
68
|
+
|
|
69
|
+
````ts
|
|
70
|
+
/**
|
|
71
|
+
Convert `object`s, `Map`s, `Set`s, and `Array`s and all of their keys/elements into immutable structures recursively.
|
|
72
|
+
|
|
73
|
+
This is useful when a deeply nested structure needs to be exposed as completely immutable, for example, an imported JSON module or when receiving an API response that is passed around.
|
|
74
|
+
|
|
75
|
+
Please upvote [this issue](https://github.com/microsoft/TypeScript/issues/13923) if you want to have this type as a built-in in TypeScript.
|
|
76
|
+
|
|
77
|
+
@example
|
|
78
|
+
```
|
|
79
|
+
import type {ReadonlyDeep} from 'type-fest';
|
|
80
|
+
|
|
81
|
+
declare const foo: {
|
|
82
|
+
a: string;
|
|
83
|
+
b: {c: number};
|
|
84
|
+
d: Array<{e: number}>;
|
|
85
|
+
};
|
|
86
|
+
|
|
87
|
+
foo.a = 'bar'; // Allowed
|
|
88
|
+
|
|
89
|
+
foo.b = {c: 3}; // Allowed
|
|
90
|
+
|
|
91
|
+
foo.b.c = 4; // Allowed
|
|
92
|
+
|
|
93
|
+
foo.d = [{e: 5}]; // Allowed
|
|
94
|
+
|
|
95
|
+
foo.d.push({e: 6}); // Allowed
|
|
96
|
+
|
|
97
|
+
const last = foo.d.at(-1);
|
|
98
|
+
if (last) {
|
|
99
|
+
last.e = 7; // Allowed
|
|
100
|
+
}
|
|
101
|
+
|
|
102
|
+
declare const readonlyFoo: ReadonlyDeep<typeof foo>;
|
|
103
|
+
|
|
104
|
+
// @ts-expect-error
|
|
105
|
+
readonlyFoo.a = 'bar';
|
|
106
|
+
// Error: Cannot assign to 'a' because it is a read-only property.
|
|
107
|
+
|
|
108
|
+
// @ts-expect-error
|
|
109
|
+
readonlyFoo.b = {c: 3};
|
|
110
|
+
// Error: Cannot assign to 'b' because it is a read-only property.
|
|
111
|
+
|
|
112
|
+
// @ts-expect-error
|
|
113
|
+
readonlyFoo.b.c = 4;
|
|
114
|
+
// Error: Cannot assign to 'c' because it is a read-only property.
|
|
115
|
+
|
|
116
|
+
// @ts-expect-error
|
|
117
|
+
readonlyFoo.d = [{e: 5}];
|
|
118
|
+
// Error: Cannot assign to 'd' because it is a read-only property.
|
|
119
|
+
|
|
120
|
+
// @ts-expect-error
|
|
121
|
+
readonlyFoo.d.push({e: 6});
|
|
122
|
+
// Error: Property 'push' does not exist on type 'ReadonlyArray<{readonly e: number}>'.
|
|
123
|
+
|
|
124
|
+
const readonlyLast = readonlyFoo.d.at(-1);
|
|
125
|
+
if (readonlyLast) {
|
|
126
|
+
// @ts-expect-error
|
|
127
|
+
readonlyLast.e = 8;
|
|
128
|
+
// Error: Cannot assign to 'e' because it is a read-only property.
|
|
129
|
+
}
|
|
130
|
+
```
|
|
131
|
+
|
|
132
|
+
Note that types containing overloaded functions are not made deeply readonly due to a [TypeScript limitation](https://github.com/microsoft/TypeScript/issues/29732).
|
|
133
|
+
|
|
134
|
+
@category Object
|
|
135
|
+
@category Array
|
|
136
|
+
@category Set
|
|
137
|
+
@category Map
|
|
138
|
+
*/
|
|
139
|
+
````
|
|
140
|
+
|
|
141
|
+
> **Rule catalog ID:** R055
|
|
142
|
+
|
|
143
|
+
## Further reading
|
|
144
|
+
|
|
145
|
+
- [TypeFest README](https://github.com/sindresorhus/type-fest)
|
|
146
|
+
- [TypeScript Handbook: Utility Types](https://www.typescriptlang.org/docs/handbook/utility-types.html)
|
|
147
|
+
|
|
148
|
+
## Adoption resources
|
|
149
|
+
|
|
150
|
+
- [Rule adoption checklist](./guides/adoption-checklist.md)
|
|
151
|
+
- [Rollout and fix safety](./guides/rollout-and-fix-safety.md)
|
|
@@ -0,0 +1,149 @@
|
|
|
1
|
+
# prefer-type-fest-require-all-or-none
|
|
2
|
+
|
|
3
|
+
Require TypeFest [`RequireAllOrNone<T, Keys>`](https://github.com/sindresorhus/type-fest/blob/main/source/require-all-or-none.d.ts) over imported aliases like
|
|
4
|
+
`AllOrNone` or `AllOrNothing`.
|
|
5
|
+
|
|
6
|
+
## Targeted pattern scope
|
|
7
|
+
|
|
8
|
+
This rule reports imported `AllOrNone`/`AllOrNothing` aliases and prefers `RequireAllOrNone<T, Keys>` for atomic key-group constraints.
|
|
9
|
+
|
|
10
|
+
Use this utility when fields only make sense as a complete set (for example,
|
|
11
|
+
`username` + `password`, or `country` + `vatId`).
|
|
12
|
+
|
|
13
|
+
## What this rule reports
|
|
14
|
+
|
|
15
|
+
- Type references that resolve to imported `AllOrNone` aliases.
|
|
16
|
+
- Type references that resolve to imported `AllOrNothing` aliases.
|
|
17
|
+
|
|
18
|
+
### Detection boundaries
|
|
19
|
+
|
|
20
|
+
- ✅ Reports imported aliases with direct named imports.
|
|
21
|
+
- ❌ Does not report namespace-qualified alias usage.
|
|
22
|
+
- ❌ Does not auto-fix.
|
|
23
|
+
|
|
24
|
+
## Why this rule exists
|
|
25
|
+
|
|
26
|
+
`RequireAllOrNone` is the canonical TypeFest utility for expressing atomic key
|
|
27
|
+
groups (either every key in the group exists, or none of them do). Canonical
|
|
28
|
+
naming reduces semantic drift across utility libraries.
|
|
29
|
+
|
|
30
|
+
This is one of the easiest places for contract bugs to hide in API request
|
|
31
|
+
types. A single canonical utility makes these constraints explicit.
|
|
32
|
+
|
|
33
|
+
## ❌ Incorrect
|
|
34
|
+
|
|
35
|
+
```ts
|
|
36
|
+
import type { AllOrNone } from "type-aliases";
|
|
37
|
+
|
|
38
|
+
type Credentials = AllOrNone<User, "username" | "password">;
|
|
39
|
+
```
|
|
40
|
+
|
|
41
|
+
## ✅ Correct
|
|
42
|
+
|
|
43
|
+
```ts
|
|
44
|
+
import type { RequireAllOrNone } from "type-fest";
|
|
45
|
+
|
|
46
|
+
type Credentials = RequireAllOrNone<User, "username" | "password">;
|
|
47
|
+
```
|
|
48
|
+
|
|
49
|
+
## Behavior and migration notes
|
|
50
|
+
|
|
51
|
+
- `RequireAllOrNone<T, Keys>` enforces atomic key groups (all keys present together or all omitted).
|
|
52
|
+
- This rule targets alias names that encode the same constraint (`AllOrNone`, `AllOrNothing`).
|
|
53
|
+
- Keep key-group definitions explicit and colocated with contract types to avoid drift.
|
|
54
|
+
|
|
55
|
+
## Additional examples
|
|
56
|
+
|
|
57
|
+
### ❌ Incorrect — Additional example
|
|
58
|
+
|
|
59
|
+
```ts
|
|
60
|
+
import type { AllOrNothing } from "custom-type-utils";
|
|
61
|
+
|
|
62
|
+
type BillingIdentity = AllOrNothing<OrderInput, "country" | "vatId">;
|
|
63
|
+
```
|
|
64
|
+
|
|
65
|
+
### ✅ Correct — Additional example
|
|
66
|
+
|
|
67
|
+
```ts
|
|
68
|
+
import type { RequireAllOrNone } from "type-fest";
|
|
69
|
+
|
|
70
|
+
type BillingIdentity = RequireAllOrNone<OrderInput, "country" | "vatId">;
|
|
71
|
+
```
|
|
72
|
+
|
|
73
|
+
### ✅ Correct — Repository-wide usage
|
|
74
|
+
|
|
75
|
+
```ts
|
|
76
|
+
type OAuthPair = RequireAllOrNone<AuthInput, "clientId" | "clientSecret">;
|
|
77
|
+
```
|
|
78
|
+
|
|
79
|
+
## ESLint flat config example
|
|
80
|
+
|
|
81
|
+
```ts
|
|
82
|
+
import typefest from "eslint-plugin-typefest";
|
|
83
|
+
|
|
84
|
+
export default [
|
|
85
|
+
{
|
|
86
|
+
plugins: { typefest },
|
|
87
|
+
rules: {
|
|
88
|
+
"typefest/prefer-type-fest-require-all-or-none": "error",
|
|
89
|
+
},
|
|
90
|
+
},
|
|
91
|
+
];
|
|
92
|
+
```
|
|
93
|
+
|
|
94
|
+
## When not to use it
|
|
95
|
+
|
|
96
|
+
Disable this rule if existing exported aliases must stay unchanged for compatibility.
|
|
97
|
+
|
|
98
|
+
## Package documentation
|
|
99
|
+
|
|
100
|
+
TypeFest package documentation:
|
|
101
|
+
|
|
102
|
+
Source file: [`source/require-all-or-none.d.ts`](https://github.com/sindresorhus/type-fest/blob/main/source/require-all-or-none.d.ts)
|
|
103
|
+
|
|
104
|
+
````ts
|
|
105
|
+
/**
|
|
106
|
+
Create a type that requires all of the given keys or none of the given keys. The remaining keys are kept as is.
|
|
107
|
+
|
|
108
|
+
Use-cases:
|
|
109
|
+
- Creating interfaces for components with mutually-inclusive keys.
|
|
110
|
+
|
|
111
|
+
The caveat with `RequireAllOrNone` is that TypeScript doesn't always know at compile time every key that will exist at runtime. Therefore `RequireAllOrNone` can't do anything to prevent extra keys it doesn't know about.
|
|
112
|
+
|
|
113
|
+
@example
|
|
114
|
+
```
|
|
115
|
+
import type {RequireAllOrNone} from 'type-fest';
|
|
116
|
+
|
|
117
|
+
type Responder = {
|
|
118
|
+
text?: () => string;
|
|
119
|
+
json?: () => string;
|
|
120
|
+
secure: boolean;
|
|
121
|
+
};
|
|
122
|
+
|
|
123
|
+
const responder1: RequireAllOrNone<Responder, 'text' | 'json'> = {
|
|
124
|
+
secure: true,
|
|
125
|
+
};
|
|
126
|
+
|
|
127
|
+
const responder2: RequireAllOrNone<Responder, 'text' | 'json'> = {
|
|
128
|
+
text: () => '{"message": "hi"}',
|
|
129
|
+
json: () => '{"message": "ok"}',
|
|
130
|
+
secure: true,
|
|
131
|
+
};
|
|
132
|
+
```
|
|
133
|
+
|
|
134
|
+
@category Object
|
|
135
|
+
*/
|
|
136
|
+
````
|
|
137
|
+
|
|
138
|
+
> **Rule catalog ID:** R056
|
|
139
|
+
|
|
140
|
+
## Further reading
|
|
141
|
+
|
|
142
|
+
- [`type-fest` README](https://github.com/sindresorhus/type-fest)
|
|
143
|
+
- [`type-fest` npm documentation](https://www.npmjs.com/package/type-fest)
|
|
144
|
+
- [TypeScript Handbook: Utility Types](https://www.typescriptlang.org/docs/handbook/utility-types.html)
|
|
145
|
+
|
|
146
|
+
## Adoption resources
|
|
147
|
+
|
|
148
|
+
- [Rule adoption checklist](./guides/adoption-checklist.md)
|
|
149
|
+
- [Rollout and fix safety](./guides/rollout-and-fix-safety.md)
|
|
@@ -0,0 +1,155 @@
|
|
|
1
|
+
# prefer-type-fest-require-at-least-one
|
|
2
|
+
|
|
3
|
+
Require TypeFest [`RequireAtLeastOne<T, Keys>`](https://github.com/sindresorhus/type-fest/blob/main/source/require-at-least-one.d.ts) over imported aliases like
|
|
4
|
+
`AtLeastOne`.
|
|
5
|
+
|
|
6
|
+
## Targeted pattern scope
|
|
7
|
+
|
|
8
|
+
This rule reports imported `AtLeastOne` aliases and prefers `RequireAtLeastOne<T, Keys>` for at-least-one field requirements.
|
|
9
|
+
|
|
10
|
+
It is especially valuable for search DTOs and patch/update payloads where
|
|
11
|
+
empty objects should be rejected at compile time.
|
|
12
|
+
|
|
13
|
+
## What this rule reports
|
|
14
|
+
|
|
15
|
+
- Type references that resolve to imported `AtLeastOne` aliases.
|
|
16
|
+
|
|
17
|
+
### Detection boundaries
|
|
18
|
+
|
|
19
|
+
- ✅ Reports imported aliases with direct named imports.
|
|
20
|
+
- ❌ Does not report namespace-qualified aliases.
|
|
21
|
+
- ❌ Does not auto-fix.
|
|
22
|
+
|
|
23
|
+
## Why this rule exists
|
|
24
|
+
|
|
25
|
+
`RequireAtLeastOne` is the canonical TypeFest utility for enforcing at least one
|
|
26
|
+
required key among a set of optional candidates. Standardizing on canonical
|
|
27
|
+
TypeFest naming keeps public type contracts easier to understand and maintain.
|
|
28
|
+
|
|
29
|
+
For user-facing APIs, this avoids accepting meaningless payloads like `{}`
|
|
30
|
+
where at least one filter field is required.
|
|
31
|
+
|
|
32
|
+
## ❌ Incorrect
|
|
33
|
+
|
|
34
|
+
```ts
|
|
35
|
+
import type { AtLeastOne } from "type-aliases";
|
|
36
|
+
|
|
37
|
+
type Update = AtLeastOne<User>;
|
|
38
|
+
```
|
|
39
|
+
|
|
40
|
+
## ✅ Correct
|
|
41
|
+
|
|
42
|
+
```ts
|
|
43
|
+
import type { RequireAtLeastOne } from "type-fest";
|
|
44
|
+
|
|
45
|
+
type Update = RequireAtLeastOne<User>;
|
|
46
|
+
```
|
|
47
|
+
|
|
48
|
+
## Behavior and migration notes
|
|
49
|
+
|
|
50
|
+
- `RequireAtLeastOne<T, Keys>` prevents empty-object payloads when at least one selector is required.
|
|
51
|
+
- This rule targets alias names with equivalent semantics (`AtLeastOne`).
|
|
52
|
+
- Use keyed variants for large object types to constrain only the fields that participate in the requirement.
|
|
53
|
+
|
|
54
|
+
## Additional examples
|
|
55
|
+
|
|
56
|
+
### ❌ Incorrect — Additional example
|
|
57
|
+
|
|
58
|
+
```ts
|
|
59
|
+
import type { AtLeastOne } from "custom-type-utils";
|
|
60
|
+
|
|
61
|
+
type UserSearch = AtLeastOne<
|
|
62
|
+
{
|
|
63
|
+
email?: string;
|
|
64
|
+
id?: string;
|
|
65
|
+
username?: string;
|
|
66
|
+
},
|
|
67
|
+
"email" | "id" | "username"
|
|
68
|
+
>;
|
|
69
|
+
```
|
|
70
|
+
|
|
71
|
+
### ✅ Correct — Additional example
|
|
72
|
+
|
|
73
|
+
```ts
|
|
74
|
+
import type { RequireAtLeastOne } from "type-fest";
|
|
75
|
+
|
|
76
|
+
type UserSearch = RequireAtLeastOne<
|
|
77
|
+
{
|
|
78
|
+
email?: string;
|
|
79
|
+
id?: string;
|
|
80
|
+
username?: string;
|
|
81
|
+
},
|
|
82
|
+
"email" | "id" | "username"
|
|
83
|
+
>;
|
|
84
|
+
```
|
|
85
|
+
|
|
86
|
+
### ✅ Correct — Repository-wide usage
|
|
87
|
+
|
|
88
|
+
```ts
|
|
89
|
+
type ProfilePatch = RequireAtLeastOne<
|
|
90
|
+
{ avatarUrl?: string; displayName?: string; bio?: string },
|
|
91
|
+
"avatarUrl" | "displayName" | "bio"
|
|
92
|
+
>;
|
|
93
|
+
```
|
|
94
|
+
|
|
95
|
+
## ESLint flat config example
|
|
96
|
+
|
|
97
|
+
```ts
|
|
98
|
+
import typefest from "eslint-plugin-typefest";
|
|
99
|
+
|
|
100
|
+
export default [
|
|
101
|
+
{
|
|
102
|
+
plugins: { typefest },
|
|
103
|
+
rules: {
|
|
104
|
+
"typefest/prefer-type-fest-require-at-least-one": "error",
|
|
105
|
+
},
|
|
106
|
+
},
|
|
107
|
+
];
|
|
108
|
+
```
|
|
109
|
+
|
|
110
|
+
## When not to use it
|
|
111
|
+
|
|
112
|
+
Disable this rule if published contracts must preserve existing alias names.
|
|
113
|
+
|
|
114
|
+
## Package documentation
|
|
115
|
+
|
|
116
|
+
TypeFest package documentation:
|
|
117
|
+
|
|
118
|
+
Source file: [`source/require-at-least-one.d.ts`](https://github.com/sindresorhus/type-fest/blob/main/source/require-at-least-one.d.ts)
|
|
119
|
+
|
|
120
|
+
````ts
|
|
121
|
+
/**
|
|
122
|
+
Create a type that requires at least one of the given keys. The remaining keys are kept as is.
|
|
123
|
+
|
|
124
|
+
@example
|
|
125
|
+
```
|
|
126
|
+
import type {RequireAtLeastOne} from 'type-fest';
|
|
127
|
+
|
|
128
|
+
type Responder = {
|
|
129
|
+
text?: () => string;
|
|
130
|
+
json?: () => string;
|
|
131
|
+
secure?: boolean;
|
|
132
|
+
};
|
|
133
|
+
|
|
134
|
+
const responder: RequireAtLeastOne<Responder, 'text' | 'json'> = {
|
|
135
|
+
json: () => '{"message": "ok"}',
|
|
136
|
+
secure: true,
|
|
137
|
+
};
|
|
138
|
+
```
|
|
139
|
+
|
|
140
|
+
@category Object
|
|
141
|
+
*/
|
|
142
|
+
````
|
|
143
|
+
|
|
144
|
+
> **Rule catalog ID:** R057
|
|
145
|
+
|
|
146
|
+
## Further reading
|
|
147
|
+
|
|
148
|
+
- [`type-fest` README](https://github.com/sindresorhus/type-fest)
|
|
149
|
+
- [`type-fest` npm documentation](https://www.npmjs.com/package/type-fest)
|
|
150
|
+
- [TypeScript Handbook: Utility Types](https://www.typescriptlang.org/docs/handbook/utility-types.html)
|
|
151
|
+
|
|
152
|
+
## Adoption resources
|
|
153
|
+
|
|
154
|
+
- [Rule adoption checklist](./guides/adoption-checklist.md)
|
|
155
|
+
- [Rollout and fix safety](./guides/rollout-and-fix-safety.md)
|
|
@@ -0,0 +1,240 @@
|
|
|
1
|
+
# prefer-type-fest-require-exactly-one
|
|
2
|
+
|
|
3
|
+
Require TypeFest [`RequireExactlyOne<T, Keys>`](https://github.com/sindresorhus/type-fest/blob/main/source/require-exactly-one.d.ts) over imported aliases like `OneOf` or `RequireOnlyOne`.
|
|
4
|
+
|
|
5
|
+
## Targeted pattern scope
|
|
6
|
+
|
|
7
|
+
This rule reports imported `OneOf`/`RequireOnlyOne` aliases and prefers `RequireExactlyOne<T, Keys>` for XOR-style object constraints.
|
|
8
|
+
|
|
9
|
+
Use this when callers must choose one mode, not multiple modes (for example,
|
|
10
|
+
`id` _or_ `slug`, `apiKey` _or_ `token`).
|
|
11
|
+
|
|
12
|
+
## What this rule reports
|
|
13
|
+
|
|
14
|
+
- Type references that resolve to imported `OneOf` aliases.
|
|
15
|
+
- Type references that resolve to imported `RequireOnlyOne` aliases.
|
|
16
|
+
|
|
17
|
+
### Detection boundaries
|
|
18
|
+
|
|
19
|
+
- ✅ Reports imported aliases with direct named imports.
|
|
20
|
+
- ❌ Does not report namespace-qualified alias usage.
|
|
21
|
+
- ✅ Auto-fixes imported alias references to `RequireExactlyOne` when replacement is syntactically safe.
|
|
22
|
+
- ✅ Alias coverage is configurable with `enforcedAliasNames`.
|
|
23
|
+
|
|
24
|
+
## Why this rule exists
|
|
25
|
+
|
|
26
|
+
`RequireExactlyOne` is the canonical TypeFest utility for enforcing exactly one active key among a set. Using the canonical name reduces semantic drift between utility libraries.
|
|
27
|
+
|
|
28
|
+
This is one of the most error-prone constraints in hand-written unions. Using a
|
|
29
|
+
known utility keeps intent obvious and consistent.
|
|
30
|
+
|
|
31
|
+
## ❌ Incorrect
|
|
32
|
+
|
|
33
|
+
```ts
|
|
34
|
+
import type { OneOf } from "type-aliases";
|
|
35
|
+
|
|
36
|
+
type Auth = OneOf<{
|
|
37
|
+
token?: string;
|
|
38
|
+
apiKey?: string;
|
|
39
|
+
}>;
|
|
40
|
+
```
|
|
41
|
+
|
|
42
|
+
## ✅ Correct
|
|
43
|
+
|
|
44
|
+
```ts
|
|
45
|
+
import type { RequireExactlyOne } from "type-fest";
|
|
46
|
+
|
|
47
|
+
type Auth = RequireExactlyOne<{
|
|
48
|
+
token?: string;
|
|
49
|
+
apiKey?: string;
|
|
50
|
+
}>;
|
|
51
|
+
```
|
|
52
|
+
|
|
53
|
+
## Behavior and migration notes
|
|
54
|
+
|
|
55
|
+
- `RequireExactlyOne<T, Keys>` encodes XOR object modes where one and only one key can be active.
|
|
56
|
+
- This rule targets alias names with matching semantics (`OneOf`, `RequireOnlyOne`).
|
|
57
|
+
- Keep the participating key set small and explicit to avoid hard-to-read error messages in consuming code.
|
|
58
|
+
|
|
59
|
+
### Options
|
|
60
|
+
|
|
61
|
+
This rule accepts a single options object:
|
|
62
|
+
|
|
63
|
+
```ts
|
|
64
|
+
type PreferTypeFestRequireExactlyOneOptions = {
|
|
65
|
+
/**
|
|
66
|
+
* Legacy alias names that this rule will report and replace.
|
|
67
|
+
*
|
|
68
|
+
* @default ["OneOf", "RequireOnlyOne"]
|
|
69
|
+
*/
|
|
70
|
+
enforcedAliasNames?: ("OneOf" | "RequireOnlyOne")[];
|
|
71
|
+
};
|
|
72
|
+
```
|
|
73
|
+
|
|
74
|
+
Default configuration:
|
|
75
|
+
|
|
76
|
+
```ts
|
|
77
|
+
{
|
|
78
|
+
enforcedAliasNames: ["OneOf", "RequireOnlyOne"],
|
|
79
|
+
}
|
|
80
|
+
```
|
|
81
|
+
|
|
82
|
+
Flat config setup (default behavior):
|
|
83
|
+
|
|
84
|
+
```ts
|
|
85
|
+
import typefest from "eslint-plugin-typefest";
|
|
86
|
+
|
|
87
|
+
export default [
|
|
88
|
+
{
|
|
89
|
+
plugins: { typefest },
|
|
90
|
+
rules: {
|
|
91
|
+
"typefest/prefer-type-fest-require-exactly-one": [
|
|
92
|
+
"error",
|
|
93
|
+
{ enforcedAliasNames: ["OneOf", "RequireOnlyOne"] },
|
|
94
|
+
],
|
|
95
|
+
},
|
|
96
|
+
},
|
|
97
|
+
];
|
|
98
|
+
```
|
|
99
|
+
|
|
100
|
+
#### `enforcedAliasNames: ["OneOf", "RequireOnlyOne"]` (default)
|
|
101
|
+
|
|
102
|
+
Reports both legacy aliases.
|
|
103
|
+
|
|
104
|
+
#### `enforcedAliasNames: ["RequireOnlyOne"]`
|
|
105
|
+
|
|
106
|
+
Reports only `RequireOnlyOne` and ignores `OneOf`:
|
|
107
|
+
|
|
108
|
+
```ts
|
|
109
|
+
import typefest from "eslint-plugin-typefest";
|
|
110
|
+
|
|
111
|
+
export default [
|
|
112
|
+
{
|
|
113
|
+
plugins: { typefest },
|
|
114
|
+
rules: {
|
|
115
|
+
"typefest/prefer-type-fest-require-exactly-one": [
|
|
116
|
+
"error",
|
|
117
|
+
{ enforcedAliasNames: ["RequireOnlyOne"] },
|
|
118
|
+
],
|
|
119
|
+
},
|
|
120
|
+
},
|
|
121
|
+
];
|
|
122
|
+
```
|
|
123
|
+
|
|
124
|
+
```ts
|
|
125
|
+
import type { OneOf, RequireOnlyOne } from "type-aliases";
|
|
126
|
+
|
|
127
|
+
type A = OneOf<{ a?: string; b?: number }>; // ✅ Not reported
|
|
128
|
+
type B = RequireOnlyOne<{ a?: string; b?: number }>; // ❌ Reported
|
|
129
|
+
```
|
|
130
|
+
|
|
131
|
+
## Additional examples
|
|
132
|
+
|
|
133
|
+
### ❌ Incorrect — Additional example
|
|
134
|
+
|
|
135
|
+
```ts
|
|
136
|
+
import type { RequireOnlyOne } from "custom-type-utils";
|
|
137
|
+
|
|
138
|
+
type LookupInput = RequireOnlyOne<
|
|
139
|
+
{
|
|
140
|
+
id?: string;
|
|
141
|
+
slug?: string;
|
|
142
|
+
externalRef?: string;
|
|
143
|
+
},
|
|
144
|
+
"id" | "slug" | "externalRef"
|
|
145
|
+
>;
|
|
146
|
+
```
|
|
147
|
+
|
|
148
|
+
### ✅ Correct — Additional example
|
|
149
|
+
|
|
150
|
+
```ts
|
|
151
|
+
import type { RequireExactlyOne } from "type-fest";
|
|
152
|
+
|
|
153
|
+
type LookupInput = RequireExactlyOne<
|
|
154
|
+
{
|
|
155
|
+
id?: string;
|
|
156
|
+
slug?: string;
|
|
157
|
+
externalRef?: string;
|
|
158
|
+
},
|
|
159
|
+
"id" | "slug" | "externalRef"
|
|
160
|
+
>;
|
|
161
|
+
```
|
|
162
|
+
|
|
163
|
+
### ✅ Correct — Repository-wide usage
|
|
164
|
+
|
|
165
|
+
```ts
|
|
166
|
+
type AuthInput = RequireExactlyOne<
|
|
167
|
+
{ token?: string; apiKey?: string; oauthCode?: string },
|
|
168
|
+
"token" | "apiKey" | "oauthCode"
|
|
169
|
+
>;
|
|
170
|
+
```
|
|
171
|
+
|
|
172
|
+
## ESLint flat config example
|
|
173
|
+
|
|
174
|
+
```ts
|
|
175
|
+
import typefest from "eslint-plugin-typefest";
|
|
176
|
+
|
|
177
|
+
export default [
|
|
178
|
+
{
|
|
179
|
+
plugins: { typefest },
|
|
180
|
+
rules: {
|
|
181
|
+
"typefest/prefer-type-fest-require-exactly-one": "error",
|
|
182
|
+
},
|
|
183
|
+
},
|
|
184
|
+
];
|
|
185
|
+
```
|
|
186
|
+
|
|
187
|
+
## When not to use it
|
|
188
|
+
|
|
189
|
+
Disable this rule if compatibility requirements force existing alias names.
|
|
190
|
+
|
|
191
|
+
## Package documentation
|
|
192
|
+
|
|
193
|
+
TypeFest package documentation:
|
|
194
|
+
|
|
195
|
+
Source file: [`source/require-exactly-one.d.ts`](https://github.com/sindresorhus/type-fest/blob/main/source/require-exactly-one.d.ts)
|
|
196
|
+
|
|
197
|
+
````ts
|
|
198
|
+
/**
|
|
199
|
+
Create a type that requires exactly one of the given keys and disallows more. The remaining keys are kept as is.
|
|
200
|
+
|
|
201
|
+
Use-cases:
|
|
202
|
+
- Creating interfaces for components that only need one of the keys to display properly.
|
|
203
|
+
- Declaring generic keys in a single place for a single use-case that gets narrowed down via `RequireExactlyOne`.
|
|
204
|
+
|
|
205
|
+
The caveat with `RequireExactlyOne` is that TypeScript doesn't always know at compile time every key that will exist at runtime. Therefore `RequireExactlyOne` can't do anything to prevent extra keys it doesn't know about.
|
|
206
|
+
|
|
207
|
+
@example
|
|
208
|
+
```
|
|
209
|
+
import type {RequireExactlyOne} from 'type-fest';
|
|
210
|
+
|
|
211
|
+
type Responder = {
|
|
212
|
+
text: () => string;
|
|
213
|
+
json: () => string;
|
|
214
|
+
secure: boolean;
|
|
215
|
+
};
|
|
216
|
+
|
|
217
|
+
const responder: RequireExactlyOne<Responder, 'text' | 'json'> = {
|
|
218
|
+
// Adding a `text` key here would cause a compile error.
|
|
219
|
+
|
|
220
|
+
json: () => '{"message": "ok"}',
|
|
221
|
+
secure: true,
|
|
222
|
+
};
|
|
223
|
+
```
|
|
224
|
+
|
|
225
|
+
@category Object
|
|
226
|
+
*/
|
|
227
|
+
````
|
|
228
|
+
|
|
229
|
+
> **Rule catalog ID:** R058
|
|
230
|
+
|
|
231
|
+
## Further reading
|
|
232
|
+
|
|
233
|
+
- [`type-fest` README](https://github.com/sindresorhus/type-fest)
|
|
234
|
+
- [`type-fest` npm documentation](https://www.npmjs.com/package/type-fest)
|
|
235
|
+
- [TypeScript Handbook: Utility Types](https://www.typescriptlang.org/docs/handbook/utility-types.html)
|
|
236
|
+
|
|
237
|
+
## Adoption resources
|
|
238
|
+
|
|
239
|
+
- [Rule adoption checklist](./guides/adoption-checklist.md)
|
|
240
|
+
- [Rollout and fix safety](./guides/rollout-and-fix-safety.md)
|