eslint-plugin-typefest 1.0.6 → 1.0.8

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (92) hide show
  1. package/README.md +107 -91
  2. package/dist/_internal/constrained-type-at-location.d.ts.map +1 -1
  3. package/dist/_internal/constrained-type-at-location.js.map +1 -1
  4. package/dist/_internal/function-type-reference-patterns.d.ts +34 -0
  5. package/dist/_internal/function-type-reference-patterns.d.ts.map +1 -0
  6. package/dist/_internal/function-type-reference-patterns.js +103 -0
  7. package/dist/_internal/function-type-reference-patterns.js.map +1 -0
  8. package/dist/_internal/rule-catalog.d.ts.map +1 -1
  9. package/dist/_internal/rule-catalog.js +11 -0
  10. package/dist/_internal/rule-catalog.js.map +1 -1
  11. package/dist/_internal/rules-registry.d.ts.map +1 -1
  12. package/dist/_internal/rules-registry.js +22 -0
  13. package/dist/_internal/rules-registry.js.map +1 -1
  14. package/dist/_internal/set-membership.d.ts.map +1 -1
  15. package/dist/_internal/set-membership.js.map +1 -1
  16. package/dist/_internal/type-checker-compat.d.ts.map +1 -1
  17. package/dist/_internal/type-checker-compat.js.map +1 -1
  18. package/dist/_internal/type-reference-node.d.ts +8 -0
  19. package/dist/_internal/type-reference-node.d.ts.map +1 -1
  20. package/dist/_internal/type-reference-node.js +14 -0
  21. package/dist/_internal/type-reference-node.js.map +1 -1
  22. package/dist/_internal/typefest-config-references.d.ts +2 -1
  23. package/dist/_internal/typefest-config-references.d.ts.map +1 -1
  24. package/dist/_internal/typefest-config-references.js +11 -2
  25. package/dist/_internal/typefest-config-references.js.map +1 -1
  26. package/dist/_internal/typescript-eslint-node-autofix.js.map +1 -1
  27. package/dist/plugin.cjs +1077 -124
  28. package/dist/plugin.cjs.map +4 -4
  29. package/dist/plugin.d.ts.map +1 -1
  30. package/dist/plugin.js +5 -0
  31. package/dist/plugin.js.map +1 -1
  32. package/dist/rules/prefer-ts-extras-object-map-values.d.ts +14 -0
  33. package/dist/rules/prefer-ts-extras-object-map-values.d.ts.map +1 -0
  34. package/dist/rules/prefer-ts-extras-object-map-values.js +227 -0
  35. package/dist/rules/prefer-ts-extras-object-map-values.js.map +1 -0
  36. package/dist/rules/prefer-type-fest-asyncify.d.ts +7 -0
  37. package/dist/rules/prefer-type-fest-asyncify.d.ts.map +1 -0
  38. package/dist/rules/prefer-type-fest-asyncify.js +79 -0
  39. package/dist/rules/prefer-type-fest-asyncify.js.map +1 -0
  40. package/dist/rules/prefer-type-fest-conditional-except.d.ts +7 -0
  41. package/dist/rules/prefer-type-fest-conditional-except.d.ts.map +1 -0
  42. package/dist/rules/prefer-type-fest-conditional-except.js +94 -0
  43. package/dist/rules/prefer-type-fest-conditional-except.js.map +1 -0
  44. package/dist/rules/prefer-type-fest-conditional-keys.d.ts +7 -0
  45. package/dist/rules/prefer-type-fest-conditional-keys.d.ts.map +1 -0
  46. package/dist/rules/prefer-type-fest-conditional-keys.js +78 -0
  47. package/dist/rules/prefer-type-fest-conditional-keys.js.map +1 -0
  48. package/dist/rules/prefer-type-fest-distributed-omit.d.ts +7 -0
  49. package/dist/rules/prefer-type-fest-distributed-omit.d.ts.map +1 -0
  50. package/dist/rules/prefer-type-fest-distributed-omit.js +67 -0
  51. package/dist/rules/prefer-type-fest-distributed-omit.js.map +1 -0
  52. package/dist/rules/prefer-type-fest-distributed-pick.d.ts +7 -0
  53. package/dist/rules/prefer-type-fest-distributed-pick.d.ts.map +1 -0
  54. package/dist/rules/prefer-type-fest-distributed-pick.js +95 -0
  55. package/dist/rules/prefer-type-fest-distributed-pick.js.map +1 -0
  56. package/dist/rules/prefer-type-fest-merge.d.ts +7 -0
  57. package/dist/rules/prefer-type-fest-merge.d.ts.map +1 -0
  58. package/dist/rules/prefer-type-fest-merge.js +93 -0
  59. package/dist/rules/prefer-type-fest-merge.js.map +1 -0
  60. package/dist/rules/prefer-type-fest-pick-index-signature.d.ts +7 -0
  61. package/dist/rules/prefer-type-fest-pick-index-signature.d.ts.map +1 -0
  62. package/dist/rules/prefer-type-fest-pick-index-signature.js +98 -0
  63. package/dist/rules/prefer-type-fest-pick-index-signature.js.map +1 -0
  64. package/dist/rules/prefer-type-fest-set-return-type.d.ts +7 -0
  65. package/dist/rules/prefer-type-fest-set-return-type.d.ts.map +1 -0
  66. package/dist/rules/prefer-type-fest-set-return-type.js +53 -0
  67. package/dist/rules/prefer-type-fest-set-return-type.js.map +1 -0
  68. package/dist/rules/prefer-type-fest-stringified.d.ts +7 -0
  69. package/dist/rules/prefer-type-fest-stringified.d.ts.map +1 -0
  70. package/dist/rules/prefer-type-fest-stringified.js +73 -0
  71. package/dist/rules/prefer-type-fest-stringified.js.map +1 -0
  72. package/dist/rules/prefer-type-fest-union-to-intersection.d.ts +7 -0
  73. package/dist/rules/prefer-type-fest-union-to-intersection.d.ts.map +1 -0
  74. package/dist/rules/prefer-type-fest-union-to-intersection.js +114 -0
  75. package/dist/rules/prefer-type-fest-union-to-intersection.js.map +1 -0
  76. package/docs/rules/getting-started.md +2 -1
  77. package/docs/rules/guides/preset-selection-strategy.md +7 -0
  78. package/docs/rules/overview.md +1 -0
  79. package/docs/rules/prefer-ts-extras-object-map-values.md +146 -0
  80. package/docs/rules/prefer-type-fest-asyncify.md +93 -0
  81. package/docs/rules/prefer-type-fest-conditional-except.md +141 -0
  82. package/docs/rules/prefer-type-fest-conditional-keys.md +93 -0
  83. package/docs/rules/prefer-type-fest-distributed-omit.md +92 -0
  84. package/docs/rules/prefer-type-fest-distributed-pick.md +92 -0
  85. package/docs/rules/prefer-type-fest-merge.md +161 -0
  86. package/docs/rules/prefer-type-fest-pick-index-signature.md +93 -0
  87. package/docs/rules/prefer-type-fest-set-return-type.md +93 -0
  88. package/docs/rules/prefer-type-fest-stringified.md +134 -0
  89. package/docs/rules/prefer-type-fest-union-to-intersection.md +118 -0
  90. package/docs/rules/presets/experimental.md +163 -0
  91. package/docs/rules/presets/index.md +13 -0
  92. package/package.json +33 -34
@@ -0,0 +1,67 @@
1
+ import { areEquivalentTypeNodes } from "../_internal/normalize-expression-text.js";
2
+ import { reportWithOptionalFix } from "../_internal/rule-reporting.js";
3
+ import { isIdentifierTypeReference, unwrapParenthesizedTypeNode, } from "../_internal/type-reference-node.js";
4
+ import { createTypedRule } from "../_internal/typed-rule.js";
5
+ const isDistributiveConditionalExtendsType = (node) => {
6
+ const normalizedNode = unwrapParenthesizedTypeNode(node);
7
+ return (normalizedNode.type === "TSAnyKeyword" ||
8
+ normalizedNode.type === "TSUnknownKeyword");
9
+ };
10
+ const isDistributedOmitEquivalent = (node) => {
11
+ if (node.falseType.type !== "TSNeverKeyword" ||
12
+ !isDistributiveConditionalExtendsType(node.extendsType)) {
13
+ return false;
14
+ }
15
+ const normalizedTrueType = unwrapParenthesizedTypeNode(node.trueType);
16
+ if (normalizedTrueType.type !== "TSTypeReference" ||
17
+ !isIdentifierTypeReference(normalizedTrueType, "Omit")) {
18
+ return false;
19
+ }
20
+ const typeArguments = normalizedTrueType.typeArguments?.params;
21
+ if (typeArguments?.length !== 2) {
22
+ return false;
23
+ }
24
+ const [objectType] = typeArguments;
25
+ return (objectType !== undefined &&
26
+ areEquivalentTypeNodes(unwrapParenthesizedTypeNode(objectType), unwrapParenthesizedTypeNode(node.checkType)));
27
+ };
28
+ /**
29
+ * ESLint rule definition for `prefer-type-fest-distributed-omit`.
30
+ */
31
+ const preferTypeFestDistributedOmitRule = createTypedRule({
32
+ create(context) {
33
+ return {
34
+ TSConditionalType(node) {
35
+ if (!isDistributedOmitEquivalent(node)) {
36
+ return;
37
+ }
38
+ reportWithOptionalFix({
39
+ context,
40
+ fix: null,
41
+ messageId: "preferDistributedOmit",
42
+ node,
43
+ });
44
+ },
45
+ };
46
+ },
47
+ defaultOptions: [],
48
+ meta: {
49
+ deprecated: false,
50
+ docs: {
51
+ description: "require TypeFest DistributedOmit over distributive conditional helpers of the form T extends unknown ? Omit<T, K> : never.",
52
+ frozen: false,
53
+ recommended: false,
54
+ requiresTypeChecking: false,
55
+ typefestConfigs: ["typefest.configs.experimental"],
56
+ url: "https://nick2bad4u.github.io/eslint-plugin-typefest/docs/rules/prefer-type-fest-distributed-omit",
57
+ },
58
+ messages: {
59
+ preferDistributedOmit: "Prefer `DistributedOmit<ObjectType, KeyType>` from type-fest over distributive conditional helpers like `T extends unknown ? Omit<T, K> : never`.",
60
+ },
61
+ schema: [],
62
+ type: "suggestion",
63
+ },
64
+ name: "prefer-type-fest-distributed-omit",
65
+ });
66
+ export default preferTypeFestDistributedOmitRule;
67
+ //# sourceMappingURL=prefer-type-fest-distributed-omit.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"prefer-type-fest-distributed-omit.js","sourceRoot":"","sources":["../../src/rules/prefer-type-fest-distributed-omit.ts"],"names":[],"mappings":"AAMA,OAAO,EAAE,sBAAsB,EAAE,MAAM,2CAA2C,CAAC;AACnF,OAAO,EAAE,qBAAqB,EAAE,MAAM,gCAAgC,CAAC;AACvE,OAAO,EACH,yBAAyB,EACzB,2BAA2B,GAC9B,MAAM,qCAAqC,CAAC;AAC7C,OAAO,EAAE,eAAe,EAAE,MAAM,4BAA4B,CAAC;AAE7D,MAAM,oCAAoC,GAAG,CACzC,IAAiC,EAC1B,EAAE;IACT,MAAM,cAAc,GAAG,2BAA2B,CAAC,IAAI,CAAC,CAAC;IAEzD,OAAO,CACH,cAAc,CAAC,IAAI,KAAK,cAAc;QACtC,cAAc,CAAC,IAAI,KAAK,kBAAkB,CAC7C,CAAC;AACN,CAAC,CAAC;AAEF,MAAM,2BAA2B,GAAG,CAChC,IAA0C,EACnC,EAAE;IACT,IACI,IAAI,CAAC,SAAS,CAAC,IAAI,KAAK,gBAAgB;QACxC,CAAC,oCAAoC,CAAC,IAAI,CAAC,WAAW,CAAC,EACzD,CAAC;QACC,OAAO,KAAK,CAAC;IACjB,CAAC;IAED,MAAM,kBAAkB,GAAG,2BAA2B,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;IAEtE,IACI,kBAAkB,CAAC,IAAI,KAAK,iBAAiB;QAC7C,CAAC,yBAAyB,CAAC,kBAAkB,EAAE,MAAM,CAAC,EACxD,CAAC;QACC,OAAO,KAAK,CAAC;IACjB,CAAC;IAED,MAAM,aAAa,GAAG,kBAAkB,CAAC,aAAa,EAAE,MAAM,CAAC;IAE/D,IAAI,aAAa,EAAE,MAAM,KAAK,CAAC,EAAE,CAAC;QAC9B,OAAO,KAAK,CAAC;IACjB,CAAC;IAED,MAAM,CAAC,UAAU,CAAC,GAAG,aAAa,CAAC;IAEnC,OAAO,CACH,UAAU,KAAK,SAAS;QACxB,sBAAsB,CAClB,2BAA2B,CAAC,UAAU,CAAC,EACvC,2BAA2B,CAAC,IAAI,CAAC,SAAS,CAAC,CAC9C,CACJ,CAAC;AACN,CAAC,CAAC;AAEF;;GAEG;AACH,MAAM,iCAAiC,GACnC,eAAe,CAAC;IACZ,MAAM,CAAC,OAAO;QACV,OAAO;YACH,iBAAiB,CAAC,IAAI;gBAClB,IAAI,CAAC,2BAA2B,CAAC,IAAI,CAAC,EAAE,CAAC;oBACrC,OAAO;gBACX,CAAC;gBAED,qBAAqB,CAAC;oBAClB,OAAO;oBACP,GAAG,EAAE,IAAI;oBACT,SAAS,EAAE,uBAAuB;oBAClC,IAAI;iBACP,CAAC,CAAC;YACP,CAAC;SACJ,CAAC;IACN,CAAC;IACD,cAAc,EAAE,EAAE;IAClB,IAAI,EAAE;QACF,UAAU,EAAE,KAAK;QACjB,IAAI,EAAE;YACF,WAAW,EACP,4HAA4H;YAChI,MAAM,EAAE,KAAK;YACb,WAAW,EAAE,KAAK;YAClB,oBAAoB,EAAE,KAAK;YAC3B,eAAe,EAAE,CAAC,+BAA+B,CAAC;YAClD,GAAG,EAAE,kGAAkG;SAC1G;QACD,QAAQ,EAAE;YACN,qBAAqB,EACjB,mJAAmJ;SAC1J;QACD,MAAM,EAAE,EAAE;QACV,IAAI,EAAE,YAAY;KACrB;IACD,IAAI,EAAE,mCAAmC;CAC5C,CAAC,CAAC;AAEP,eAAe,iCAAiC,CAAC"}
@@ -0,0 +1,7 @@
1
+ import { createTypedRule } from "../_internal/typed-rule.js";
2
+ /**
3
+ * ESLint rule definition for `prefer-type-fest-distributed-pick`.
4
+ */
5
+ declare const preferTypeFestDistributedPickRule: ReturnType<typeof createTypedRule>;
6
+ export default preferTypeFestDistributedPickRule;
7
+ //# sourceMappingURL=prefer-type-fest-distributed-pick.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"prefer-type-fest-distributed-pick.d.ts","sourceRoot":"","sources":["../../src/rules/prefer-type-fest-distributed-pick.ts"],"names":[],"mappings":"AAYA,OAAO,EAAE,eAAe,EAAE,MAAM,4BAA4B,CAAC;AA4G7D;;GAEG;AACH,QAAA,MAAM,iCAAiC,EAAE,UAAU,CAAC,OAAO,eAAe,CAsCpE,CAAC;AAEP,eAAe,iCAAiC,CAAC"}
@@ -0,0 +1,95 @@
1
+ import { areEquivalentTypeNodes } from "../_internal/normalize-expression-text.js";
2
+ import { reportWithOptionalFix } from "../_internal/rule-reporting.js";
3
+ import { isIdentifierTypeReference, unwrapParenthesizedTypeNode, } from "../_internal/type-reference-node.js";
4
+ import { createTypedRule } from "../_internal/typed-rule.js";
5
+ const isDistributiveConditionalExtendsType = (node) => {
6
+ const normalizedNode = unwrapParenthesizedTypeNode(node);
7
+ return (normalizedNode.type === "TSAnyKeyword" ||
8
+ normalizedNode.type === "TSUnknownKeyword");
9
+ };
10
+ const isKeyofBaseType = (node, baseType) => {
11
+ const normalizedNode = unwrapParenthesizedTypeNode(node);
12
+ if (normalizedNode.type !== "TSTypeOperator" ||
13
+ normalizedNode.operator !== "keyof" ||
14
+ normalizedNode.typeAnnotation === undefined) {
15
+ return false;
16
+ }
17
+ return areEquivalentTypeNodes(unwrapParenthesizedTypeNode(normalizedNode.typeAnnotation), unwrapParenthesizedTypeNode(baseType));
18
+ };
19
+ const isExtractOverKeyofBaseType = (node, baseType) => {
20
+ const normalizedNode = unwrapParenthesizedTypeNode(node);
21
+ if (normalizedNode.type !== "TSTypeReference" ||
22
+ !isIdentifierTypeReference(normalizedNode, "Extract")) {
23
+ return false;
24
+ }
25
+ const typeArguments = normalizedNode.typeArguments?.params;
26
+ if (typeArguments?.length !== 2) {
27
+ return false;
28
+ }
29
+ const [, extractedFromType] = typeArguments;
30
+ return (extractedFromType !== undefined &&
31
+ isKeyofBaseType(extractedFromType, baseType));
32
+ };
33
+ const isDistributedPickEquivalent = (node) => {
34
+ if (node.falseType.type !== "TSNeverKeyword" ||
35
+ !isDistributiveConditionalExtendsType(node.extendsType)) {
36
+ return false;
37
+ }
38
+ const normalizedTrueType = unwrapParenthesizedTypeNode(node.trueType);
39
+ if (normalizedTrueType.type !== "TSTypeReference" ||
40
+ !isIdentifierTypeReference(normalizedTrueType, "Pick")) {
41
+ return false;
42
+ }
43
+ const typeArguments = normalizedTrueType.typeArguments?.params;
44
+ if (typeArguments?.length !== 2) {
45
+ return false;
46
+ }
47
+ const [objectType, selectedKeysType] = typeArguments;
48
+ if (objectType === undefined || selectedKeysType === undefined) {
49
+ return false;
50
+ }
51
+ if (!areEquivalentTypeNodes(unwrapParenthesizedTypeNode(objectType), unwrapParenthesizedTypeNode(node.checkType))) {
52
+ return false;
53
+ }
54
+ return (!isIdentifierTypeReference(unwrapParenthesizedTypeNode(selectedKeysType), "Extract") || isExtractOverKeyofBaseType(selectedKeysType, node.checkType));
55
+ };
56
+ /**
57
+ * ESLint rule definition for `prefer-type-fest-distributed-pick`.
58
+ */
59
+ const preferTypeFestDistributedPickRule = createTypedRule({
60
+ create(context) {
61
+ return {
62
+ TSConditionalType(node) {
63
+ if (!isDistributedPickEquivalent(node)) {
64
+ return;
65
+ }
66
+ reportWithOptionalFix({
67
+ context,
68
+ fix: null,
69
+ messageId: "preferDistributedPick",
70
+ node,
71
+ });
72
+ },
73
+ };
74
+ },
75
+ defaultOptions: [],
76
+ meta: {
77
+ deprecated: false,
78
+ docs: {
79
+ description: "require TypeFest DistributedPick over distributive conditional helpers of the form T extends unknown ? Pick<T, K> : never.",
80
+ frozen: false,
81
+ recommended: false,
82
+ requiresTypeChecking: false,
83
+ typefestConfigs: ["typefest.configs.experimental"],
84
+ url: "https://nick2bad4u.github.io/eslint-plugin-typefest/docs/rules/prefer-type-fest-distributed-pick",
85
+ },
86
+ messages: {
87
+ preferDistributedPick: "Prefer `DistributedPick<ObjectType, KeyType>` from type-fest over distributive conditional helpers like `T extends unknown ? Pick<T, K> : never`.",
88
+ },
89
+ schema: [],
90
+ type: "suggestion",
91
+ },
92
+ name: "prefer-type-fest-distributed-pick",
93
+ });
94
+ export default preferTypeFestDistributedPickRule;
95
+ //# sourceMappingURL=prefer-type-fest-distributed-pick.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"prefer-type-fest-distributed-pick.js","sourceRoot":"","sources":["../../src/rules/prefer-type-fest-distributed-pick.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,7 @@
1
+ import { createTypedRule } from "../_internal/typed-rule.js";
2
+ /**
3
+ * ESLint rule definition for `prefer-type-fest-merge`.
4
+ */
5
+ declare const preferTypeFestMergeRule: ReturnType<typeof createTypedRule>;
6
+ export default preferTypeFestMergeRule;
7
+ //# sourceMappingURL=prefer-type-fest-merge.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"prefer-type-fest-merge.d.ts","sourceRoot":"","sources":["../../src/rules/prefer-type-fest-merge.ts"],"names":[],"mappings":"AAYA,OAAO,EAAE,eAAe,EAAE,MAAM,4BAA4B,CAAC;AA2D7D;;GAEG;AACH,QAAA,MAAM,uBAAuB,EAAE,UAAU,CAAC,OAAO,eAAe,CAsE1D,CAAC;AAEP,eAAe,uBAAuB,CAAC"}
@@ -0,0 +1,93 @@
1
+ import { collectNamedImportLocalNamesFromSource } from "../_internal/imported-type-aliases.js";
2
+ import { TYPE_FEST_MODULE_SOURCE } from "../_internal/module-source.js";
3
+ import { areEquivalentTypeNodes } from "../_internal/normalize-expression-text.js";
4
+ import { reportWithOptionalFix } from "../_internal/rule-reporting.js";
5
+ import { setContainsValue } from "../_internal/set-membership.js";
6
+ import { unwrapParenthesizedTypeNode } from "../_internal/type-reference-node.js";
7
+ import { createTypedRule } from "../_internal/typed-rule.js";
8
+ /**
9
+ * Detect whether an `Except<Destination, keyof Source>` reference is the left
10
+ * side of a merge-style intersection.
11
+ *
12
+ * @param node - Candidate type reference.
13
+ * @param siblingType - Sibling type from the same intersection.
14
+ * @param exceptLocalNames - In-scope local names bound to `Except`.
15
+ *
16
+ * @returns `true` when the reference encodes the `Merge<Destination, Source>`
17
+ * pattern; otherwise `false`.
18
+ */
19
+ const isMergeIntersectionExceptReference = (node, siblingType, exceptLocalNames) => {
20
+ if (node.typeName.type !== "Identifier" ||
21
+ !setContainsValue(exceptLocalNames, node.typeName.name)) {
22
+ return false;
23
+ }
24
+ const typeArguments = node.typeArguments?.params;
25
+ if (typeArguments?.length !== 2) {
26
+ return false;
27
+ }
28
+ const [, omittedKeysType] = typeArguments;
29
+ if (omittedKeysType === undefined) {
30
+ return false;
31
+ }
32
+ const normalizedOmittedKeysType = unwrapParenthesizedTypeNode(omittedKeysType);
33
+ if (normalizedOmittedKeysType.type !== "TSTypeOperator" ||
34
+ normalizedOmittedKeysType.operator !== "keyof") {
35
+ return false;
36
+ }
37
+ const keyedSourceType = normalizedOmittedKeysType.typeAnnotation;
38
+ if (keyedSourceType === undefined) {
39
+ return false;
40
+ }
41
+ return areEquivalentTypeNodes(unwrapParenthesizedTypeNode(siblingType), keyedSourceType);
42
+ };
43
+ /**
44
+ * ESLint rule definition for `prefer-type-fest-merge`.
45
+ */
46
+ const preferTypeFestMergeRule = createTypedRule({
47
+ create(context) {
48
+ const exceptLocalNames = collectNamedImportLocalNamesFromSource(context.sourceCode, TYPE_FEST_MODULE_SOURCE, "Except");
49
+ return {
50
+ 'TSIntersectionType > TSTypeReference[typeName.type="Identifier"]'(node) {
51
+ const intersectionNode = node.parent;
52
+ if (intersectionNode?.type !== "TSIntersectionType" ||
53
+ intersectionNode.types.length !== 2) {
54
+ return;
55
+ }
56
+ const [leftType, rightType] = intersectionNode.types;
57
+ if (leftType === undefined || rightType === undefined) {
58
+ return;
59
+ }
60
+ const siblingType = leftType === node ? rightType : leftType;
61
+ if (!isMergeIntersectionExceptReference(node, siblingType, exceptLocalNames)) {
62
+ return;
63
+ }
64
+ reportWithOptionalFix({
65
+ context,
66
+ fix: null,
67
+ messageId: "preferMerge",
68
+ node: intersectionNode,
69
+ });
70
+ },
71
+ };
72
+ },
73
+ defaultOptions: [],
74
+ meta: {
75
+ deprecated: false,
76
+ docs: {
77
+ description: "require TypeFest Merge over Except<Destination, keyof Source> & Source intersections.",
78
+ frozen: false,
79
+ recommended: false,
80
+ requiresTypeChecking: false,
81
+ typefestConfigs: ["typefest.configs.experimental"],
82
+ url: "https://nick2bad4u.github.io/eslint-plugin-typefest/docs/rules/prefer-type-fest-merge",
83
+ },
84
+ messages: {
85
+ preferMerge: "Prefer `Merge<Destination, Source>` from type-fest over `Except<Destination, keyof Source> & Source` when the second object cleanly overrides the first.",
86
+ },
87
+ schema: [],
88
+ type: "suggestion",
89
+ },
90
+ name: "prefer-type-fest-merge",
91
+ });
92
+ export default preferTypeFestMergeRule;
93
+ //# sourceMappingURL=prefer-type-fest-merge.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"prefer-type-fest-merge.js","sourceRoot":"","sources":["../../src/rules/prefer-type-fest-merge.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,7 @@
1
+ import { createTypedRule } from "../_internal/typed-rule.js";
2
+ /**
3
+ * ESLint rule definition for `prefer-type-fest-pick-index-signature`.
4
+ */
5
+ declare const preferTypeFestPickIndexSignatureRule: ReturnType<typeof createTypedRule>;
6
+ export default preferTypeFestPickIndexSignatureRule;
7
+ //# sourceMappingURL=prefer-type-fest-pick-index-signature.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"prefer-type-fest-pick-index-signature.d.ts","sourceRoot":"","sources":["../../src/rules/prefer-type-fest-pick-index-signature.ts"],"names":[],"mappings":"AAcA,OAAO,EAAE,eAAe,EAAE,MAAM,4BAA4B,CAAC;AA4F7D;;GAEG;AACH,QAAA,MAAM,oCAAoC,EAAE,UAAU,CAAC,OAAO,eAAe,CAsCvE,CAAC;AAEP,eAAe,oCAAoC,CAAC"}
@@ -0,0 +1,98 @@
1
+ import { isDefined } from "ts-extras";
2
+ import { areEquivalentTypeNodes } from "../_internal/normalize-expression-text.js";
3
+ import { reportWithOptionalFix } from "../_internal/rule-reporting.js";
4
+ import { isIdentifierTypeReference, unwrapParenthesizedTypeNode, } from "../_internal/type-reference-node.js";
5
+ import { createTypedRule } from "../_internal/typed-rule.js";
6
+ const isEmptyObjectTypeLiteral = (node) => node.type === "TSTypeLiteral" && node.members.length === 0;
7
+ const hasPickIndexSignatureMappedTypeShape = (node) => {
8
+ if (node.key.type !== "Identifier") {
9
+ return false;
10
+ }
11
+ if (node.readonly !== false && isDefined(node.readonly)) {
12
+ return false;
13
+ }
14
+ if (node.optional !== false && isDefined(node.optional)) {
15
+ return false;
16
+ }
17
+ const constraint = node.constraint;
18
+ if (constraint?.type !== "TSTypeOperator" ||
19
+ constraint.operator !== "keyof" ||
20
+ constraint.typeAnnotation === undefined) {
21
+ return false;
22
+ }
23
+ const baseType = unwrapParenthesizedTypeNode(constraint.typeAnnotation);
24
+ const indexedValueType = node.typeAnnotation;
25
+ if (indexedValueType?.type !== "TSIndexedAccessType" ||
26
+ !areEquivalentTypeNodes(unwrapParenthesizedTypeNode(indexedValueType.objectType), baseType) ||
27
+ indexedValueType.indexType.type !== "TSTypeReference" ||
28
+ indexedValueType.indexType.typeName.type !== "Identifier" ||
29
+ indexedValueType.indexType.typeName.name !== node.key.name) {
30
+ return false;
31
+ }
32
+ const keyRemapType = node.nameType;
33
+ if (keyRemapType?.type !== "TSConditionalType") {
34
+ return false;
35
+ }
36
+ if (!isEmptyObjectTypeLiteral(unwrapParenthesizedTypeNode(keyRemapType.checkType)) ||
37
+ keyRemapType.falseType.type !== "TSNeverKeyword" ||
38
+ keyRemapType.trueType.type !== "TSTypeReference" ||
39
+ keyRemapType.trueType.typeName.type !== "Identifier" ||
40
+ keyRemapType.trueType.typeName.name !== node.key.name) {
41
+ return false;
42
+ }
43
+ const normalizedExtendsType = unwrapParenthesizedTypeNode(keyRemapType.extendsType);
44
+ if (normalizedExtendsType.type !== "TSTypeReference" ||
45
+ !isIdentifierTypeReference(normalizedExtendsType, "Record")) {
46
+ return false;
47
+ }
48
+ const recordTypeArguments = normalizedExtendsType.typeArguments?.params;
49
+ if (recordTypeArguments?.length !== 2) {
50
+ return false;
51
+ }
52
+ const [recordKeyType, recordValueType] = recordTypeArguments;
53
+ return (recordKeyType !== undefined &&
54
+ recordValueType?.type === "TSUnknownKeyword" &&
55
+ recordKeyType.type === "TSTypeReference" &&
56
+ recordKeyType.typeName.type === "Identifier" &&
57
+ recordKeyType.typeName.name === node.key.name);
58
+ };
59
+ /**
60
+ * ESLint rule definition for `prefer-type-fest-pick-index-signature`.
61
+ */
62
+ const preferTypeFestPickIndexSignatureRule = createTypedRule({
63
+ create(context) {
64
+ return {
65
+ TSMappedType(node) {
66
+ if (!hasPickIndexSignatureMappedTypeShape(node)) {
67
+ return;
68
+ }
69
+ reportWithOptionalFix({
70
+ context,
71
+ fix: null,
72
+ messageId: "preferPickIndexSignature",
73
+ node,
74
+ });
75
+ },
76
+ };
77
+ },
78
+ defaultOptions: [],
79
+ meta: {
80
+ deprecated: false,
81
+ docs: {
82
+ description: "require TypeFest PickIndexSignature over manual mapped types that keep only index signatures.",
83
+ frozen: false,
84
+ recommended: false,
85
+ requiresTypeChecking: false,
86
+ typefestConfigs: ["typefest.configs.experimental"],
87
+ url: "https://nick2bad4u.github.io/eslint-plugin-typefest/docs/rules/prefer-type-fest-pick-index-signature",
88
+ },
89
+ messages: {
90
+ preferPickIndexSignature: "Prefer `PickIndexSignature<ObjectType>` from type-fest over manual mapped types that keep only index signatures.",
91
+ },
92
+ schema: [],
93
+ type: "suggestion",
94
+ },
95
+ name: "prefer-type-fest-pick-index-signature",
96
+ });
97
+ export default preferTypeFestPickIndexSignatureRule;
98
+ //# sourceMappingURL=prefer-type-fest-pick-index-signature.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"prefer-type-fest-pick-index-signature.js","sourceRoot":"","sources":["../../src/rules/prefer-type-fest-pick-index-signature.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,7 @@
1
+ import { createTypedRule } from "../_internal/typed-rule.js";
2
+ /**
3
+ * ESLint rule definition for `prefer-type-fest-set-return-type`.
4
+ */
5
+ declare const preferTypeFestSetReturnTypeRule: ReturnType<typeof createTypedRule>;
6
+ export default preferTypeFestSetReturnTypeRule;
7
+ //# sourceMappingURL=prefer-type-fest-set-return-type.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"prefer-type-fest-set-return-type.d.ts","sourceRoot":"","sources":["../../src/rules/prefer-type-fest-set-return-type.ts"],"names":[],"mappings":"AAUA,OAAO,EAAE,eAAe,EAAE,MAAM,4BAA4B,CAAC;AAE7D;;GAEG;AACH,QAAA,MAAM,+BAA+B,EAAE,UAAU,CAAC,OAAO,eAAe,CAuDlE,CAAC;AAEP,eAAe,+BAA+B,CAAC"}
@@ -0,0 +1,53 @@
1
+ /**
2
+ * @packageDocumentation
3
+ * ESLint rule implementation for `prefer-type-fest-set-return-type`.
4
+ */
5
+ import { getParametersFunctionArgumentFromFunctionType, isPromiseAwaitedReturnTypeReferenceForFunction, isReturnTypeReferenceForFunction, } from "../_internal/function-type-reference-patterns.js";
6
+ import { reportWithOptionalFix } from "../_internal/rule-reporting.js";
7
+ import { createTypedRule } from "../_internal/typed-rule.js";
8
+ /**
9
+ * ESLint rule definition for `prefer-type-fest-set-return-type`.
10
+ */
11
+ const preferTypeFestSetReturnTypeRule = createTypedRule({
12
+ create(context) {
13
+ return {
14
+ TSFunctionType(node) {
15
+ const functionType = getParametersFunctionArgumentFromFunctionType(node);
16
+ const returnType = node.returnType?.typeAnnotation;
17
+ if (functionType === null || returnType === undefined) {
18
+ return;
19
+ }
20
+ if (isReturnTypeReferenceForFunction(returnType, functionType) ||
21
+ isPromiseAwaitedReturnTypeReferenceForFunction(returnType, functionType)) {
22
+ return;
23
+ }
24
+ reportWithOptionalFix({
25
+ context,
26
+ fix: null,
27
+ messageId: "preferSetReturnType",
28
+ node,
29
+ });
30
+ },
31
+ };
32
+ },
33
+ defaultOptions: [],
34
+ meta: {
35
+ deprecated: false,
36
+ docs: {
37
+ description: "require TypeFest SetReturnType over direct function-type wrappers of the form (...args: Parameters<F>) => R.",
38
+ frozen: false,
39
+ recommended: false,
40
+ requiresTypeChecking: false,
41
+ typefestConfigs: ["typefest.configs.experimental"],
42
+ url: "https://nick2bad4u.github.io/eslint-plugin-typefest/docs/rules/prefer-type-fest-set-return-type",
43
+ },
44
+ messages: {
45
+ preferSetReturnType: "Prefer `SetReturnType<Function, TypeToReturn>` from type-fest over direct function-type wrappers like `(...args: Parameters<Function>) => TypeToReturn`.",
46
+ },
47
+ schema: [],
48
+ type: "suggestion",
49
+ },
50
+ name: "prefer-type-fest-set-return-type",
51
+ });
52
+ export default preferTypeFestSetReturnTypeRule;
53
+ //# sourceMappingURL=prefer-type-fest-set-return-type.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"prefer-type-fest-set-return-type.js","sourceRoot":"","sources":["../../src/rules/prefer-type-fest-set-return-type.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,OAAO,EACH,6CAA6C,EAC7C,8CAA8C,EAC9C,gCAAgC,GACnC,MAAM,kDAAkD,CAAC;AAC1D,OAAO,EAAE,qBAAqB,EAAE,MAAM,gCAAgC,CAAC;AACvE,OAAO,EAAE,eAAe,EAAE,MAAM,4BAA4B,CAAC;AAE7D;;GAEG;AACH,MAAM,+BAA+B,GACjC,eAAe,CAAC;IACZ,MAAM,CAAC,OAAO;QACV,OAAO;YACH,cAAc,CAAC,IAAI;gBACf,MAAM,YAAY,GACd,6CAA6C,CAAC,IAAI,CAAC,CAAC;gBACxD,MAAM,UAAU,GAAG,IAAI,CAAC,UAAU,EAAE,cAAc,CAAC;gBAEnD,IAAI,YAAY,KAAK,IAAI,IAAI,UAAU,KAAK,SAAS,EAAE,CAAC;oBACpD,OAAO;gBACX,CAAC;gBAED,IACI,gCAAgC,CAC5B,UAAU,EACV,YAAY,CACf;oBACD,8CAA8C,CAC1C,UAAU,EACV,YAAY,CACf,EACH,CAAC;oBACC,OAAO;gBACX,CAAC;gBAED,qBAAqB,CAAC;oBAClB,OAAO;oBACP,GAAG,EAAE,IAAI;oBACT,SAAS,EAAE,qBAAqB;oBAChC,IAAI;iBACP,CAAC,CAAC;YACP,CAAC;SACJ,CAAC;IACN,CAAC;IACD,cAAc,EAAE,EAAE;IAClB,IAAI,EAAE;QACF,UAAU,EAAE,KAAK;QACjB,IAAI,EAAE;YACF,WAAW,EACP,8GAA8G;YAClH,MAAM,EAAE,KAAK;YACb,WAAW,EAAE,KAAK;YAClB,oBAAoB,EAAE,KAAK;YAC3B,eAAe,EAAE,CAAC,+BAA+B,CAAC;YAClD,GAAG,EAAE,iGAAiG;SACzG;QACD,QAAQ,EAAE;YACN,mBAAmB,EACf,0JAA0J;SACjK;QACD,MAAM,EAAE,EAAE;QACV,IAAI,EAAE,YAAY;KACrB;IACD,IAAI,EAAE,kCAAkC;CAC3C,CAAC,CAAC;AAEP,eAAe,+BAA+B,CAAC"}
@@ -0,0 +1,7 @@
1
+ import { createTypedRule } from "../_internal/typed-rule.js";
2
+ /**
3
+ * ESLint rule definition for `prefer-type-fest-stringified`.
4
+ */
5
+ declare const preferTypeFestStringifiedRule: ReturnType<typeof createTypedRule>;
6
+ export default preferTypeFestStringifiedRule;
7
+ //# sourceMappingURL=prefer-type-fest-stringified.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"prefer-type-fest-stringified.d.ts","sourceRoot":"","sources":["../../src/rules/prefer-type-fest-stringified.ts"],"names":[],"mappings":"AASA,OAAO,EAAE,eAAe,EAAE,MAAM,4BAA4B,CAAC;AA0C7D;;GAEG;AACH,QAAA,MAAM,6BAA6B,EAAE,UAAU,CAAC,OAAO,eAAe,CAsChE,CAAC;AAEP,eAAe,6BAA6B,CAAC"}
@@ -0,0 +1,73 @@
1
+ import { isDefined } from "ts-extras";
2
+ import { reportWithOptionalFix } from "../_internal/rule-reporting.js";
3
+ import { createTypedRule } from "../_internal/typed-rule.js";
4
+ /**
5
+ * Detect mapped types equivalent to `Stringified<T>`.
6
+ *
7
+ * @param node - Mapped type node to inspect.
8
+ *
9
+ * @returns `true` when the mapped type has the exact `Stringified<T>`
10
+ * equivalent shape.
11
+ */
12
+ const hasStringifiedMappedTypeShape = (node) => {
13
+ if (node.readonly !== false && isDefined(node.readonly)) {
14
+ return false;
15
+ }
16
+ if (node.optional !== false && isDefined(node.optional)) {
17
+ return false;
18
+ }
19
+ if (node.nameType !== null) {
20
+ return false;
21
+ }
22
+ if (node.key.type !== "Identifier") {
23
+ return false;
24
+ }
25
+ const { constraint } = node;
26
+ if (constraint?.type !== "TSTypeOperator") {
27
+ return false;
28
+ }
29
+ if (constraint.operator !== "keyof") {
30
+ return false;
31
+ }
32
+ return node.typeAnnotation?.type === "TSStringKeyword";
33
+ };
34
+ /**
35
+ * ESLint rule definition for `prefer-type-fest-stringified`.
36
+ */
37
+ const preferTypeFestStringifiedRule = createTypedRule({
38
+ create(context) {
39
+ return {
40
+ TSMappedType(node) {
41
+ if (!hasStringifiedMappedTypeShape(node)) {
42
+ return;
43
+ }
44
+ reportWithOptionalFix({
45
+ context,
46
+ fix: null,
47
+ messageId: "preferStringified",
48
+ node,
49
+ });
50
+ },
51
+ };
52
+ },
53
+ defaultOptions: [],
54
+ meta: {
55
+ deprecated: false,
56
+ docs: {
57
+ description: "require TypeFest Stringified over manual mapped types of the form { [K in keyof T]: string }.",
58
+ frozen: false,
59
+ recommended: false,
60
+ requiresTypeChecking: false,
61
+ typefestConfigs: ["typefest.configs.experimental"],
62
+ url: "https://nick2bad4u.github.io/eslint-plugin-typefest/docs/rules/prefer-type-fest-stringified",
63
+ },
64
+ messages: {
65
+ preferStringified: "Prefer `Stringified<T>` from type-fest over manual mapped types of the form `{ [K in keyof T]: string }`.",
66
+ },
67
+ schema: [],
68
+ type: "suggestion",
69
+ },
70
+ name: "prefer-type-fest-stringified",
71
+ });
72
+ export default preferTypeFestStringifiedRule;
73
+ //# sourceMappingURL=prefer-type-fest-stringified.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"prefer-type-fest-stringified.js","sourceRoot":"","sources":["../../src/rules/prefer-type-fest-stringified.ts"],"names":[],"mappings":"AAMA,OAAO,EAAE,SAAS,EAAE,MAAM,WAAW,CAAC;AAEtC,OAAO,EAAE,qBAAqB,EAAE,MAAM,gCAAgC,CAAC;AACvE,OAAO,EAAE,eAAe,EAAE,MAAM,4BAA4B,CAAC;AAE7D;;;;;;;GAOG;AACH,MAAM,6BAA6B,GAAG,CAClC,IAAqC,EAC9B,EAAE;IACT,IAAI,IAAI,CAAC,QAAQ,KAAK,KAAK,IAAI,SAAS,CAAC,IAAI,CAAC,QAAQ,CAAC,EAAE,CAAC;QACtD,OAAO,KAAK,CAAC;IACjB,CAAC;IAED,IAAI,IAAI,CAAC,QAAQ,KAAK,KAAK,IAAI,SAAS,CAAC,IAAI,CAAC,QAAQ,CAAC,EAAE,CAAC;QACtD,OAAO,KAAK,CAAC;IACjB,CAAC;IAED,IAAI,IAAI,CAAC,QAAQ,KAAK,IAAI,EAAE,CAAC;QACzB,OAAO,KAAK,CAAC;IACjB,CAAC;IAED,IAAI,IAAI,CAAC,GAAG,CAAC,IAAI,KAAK,YAAY,EAAE,CAAC;QACjC,OAAO,KAAK,CAAC;IACjB,CAAC;IAED,MAAM,EAAE,UAAU,EAAE,GAAG,IAAI,CAAC;IAE5B,IAAI,UAAU,EAAE,IAAI,KAAK,gBAAgB,EAAE,CAAC;QACxC,OAAO,KAAK,CAAC;IACjB,CAAC;IAED,IAAI,UAAU,CAAC,QAAQ,KAAK,OAAO,EAAE,CAAC;QAClC,OAAO,KAAK,CAAC;IACjB,CAAC;IAED,OAAO,IAAI,CAAC,cAAc,EAAE,IAAI,KAAK,iBAAiB,CAAC;AAC3D,CAAC,CAAC;AAEF;;GAEG;AACH,MAAM,6BAA6B,GAC/B,eAAe,CAAC;IACZ,MAAM,CAAC,OAAO;QACV,OAAO;YACH,YAAY,CAAC,IAAI;gBACb,IAAI,CAAC,6BAA6B,CAAC,IAAI,CAAC,EAAE,CAAC;oBACvC,OAAO;gBACX,CAAC;gBAED,qBAAqB,CAAC;oBAClB,OAAO;oBACP,GAAG,EAAE,IAAI;oBACT,SAAS,EAAE,mBAAmB;oBAC9B,IAAI;iBACP,CAAC,CAAC;YACP,CAAC;SACJ,CAAC;IACN,CAAC;IACD,cAAc,EAAE,EAAE;IAClB,IAAI,EAAE;QACF,UAAU,EAAE,KAAK;QACjB,IAAI,EAAE;YACF,WAAW,EACP,+FAA+F;YACnG,MAAM,EAAE,KAAK;YACb,WAAW,EAAE,KAAK;YAClB,oBAAoB,EAAE,KAAK;YAC3B,eAAe,EAAE,CAAC,+BAA+B,CAAC;YAClD,GAAG,EAAE,6FAA6F;SACrG;QACD,QAAQ,EAAE;YACN,iBAAiB,EACb,2GAA2G;SAClH;QACD,MAAM,EAAE,EAAE;QACV,IAAI,EAAE,YAAY;KACrB;IACD,IAAI,EAAE,8BAA8B;CACvC,CAAC,CAAC;AAEP,eAAe,6BAA6B,CAAC"}
@@ -0,0 +1,7 @@
1
+ import { createTypedRule } from "../_internal/typed-rule.js";
2
+ /**
3
+ * ESLint rule definition for `prefer-type-fest-union-to-intersection`.
4
+ */
5
+ declare const preferTypeFestUnionToIntersectionRule: ReturnType<typeof createTypedRule>;
6
+ export default preferTypeFestUnionToIntersectionRule;
7
+ //# sourceMappingURL=prefer-type-fest-union-to-intersection.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"prefer-type-fest-union-to-intersection.d.ts","sourceRoot":"","sources":["../../src/rules/prefer-type-fest-union-to-intersection.ts"],"names":[],"mappings":"AASA,OAAO,EAAE,eAAe,EAAE,MAAM,4BAA4B,CAAC;AA+I7D;;GAEG;AACH,QAAA,MAAM,qCAAqC,EAAE,UAAU,CACnD,OAAO,eAAe,CAsCxB,CAAC;AAEH,eAAe,qCAAqC,CAAC"}