eslint-plugin-typefest 1.0.4 → 1.0.5

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 (61) hide show
  1. package/README.md +88 -79
  2. package/dist/_internal/rule-catalog.d.ts.map +1 -1
  3. package/dist/_internal/rule-catalog.js +9 -0
  4. package/dist/_internal/rule-catalog.js.map +1 -1
  5. package/dist/_internal/rules-registry.d.ts.map +1 -1
  6. package/dist/_internal/rules-registry.js +18 -0
  7. package/dist/_internal/rules-registry.js.map +1 -1
  8. package/dist/plugin.cjs +855 -27
  9. package/dist/plugin.cjs.map +4 -4
  10. package/dist/rules/prefer-type-fest-and-all.d.ts +13 -0
  11. package/dist/rules/prefer-type-fest-and-all.d.ts.map +1 -0
  12. package/dist/rules/prefer-type-fest-and-all.js +105 -0
  13. package/dist/rules/prefer-type-fest-and-all.js.map +1 -0
  14. package/dist/rules/prefer-type-fest-array-length.d.ts +13 -0
  15. package/dist/rules/prefer-type-fest-array-length.d.ts.map +1 -0
  16. package/dist/rules/prefer-type-fest-array-length.js +77 -0
  17. package/dist/rules/prefer-type-fest-array-length.js.map +1 -0
  18. package/dist/rules/prefer-type-fest-conditional-pick-deep.d.ts +13 -0
  19. package/dist/rules/prefer-type-fest-conditional-pick-deep.d.ts.map +1 -0
  20. package/dist/rules/prefer-type-fest-conditional-pick-deep.js +75 -0
  21. package/dist/rules/prefer-type-fest-conditional-pick-deep.js.map +1 -0
  22. package/dist/rules/prefer-type-fest-less-than-or-equal.d.ts +13 -0
  23. package/dist/rules/prefer-type-fest-less-than-or-equal.d.ts.map +1 -0
  24. package/dist/rules/prefer-type-fest-less-than-or-equal.js +153 -0
  25. package/dist/rules/prefer-type-fest-less-than-or-equal.js.map +1 -0
  26. package/dist/rules/prefer-type-fest-less-than.d.ts +13 -0
  27. package/dist/rules/prefer-type-fest-less-than.d.ts.map +1 -0
  28. package/dist/rules/prefer-type-fest-less-than.js +154 -0
  29. package/dist/rules/prefer-type-fest-less-than.js.map +1 -0
  30. package/dist/rules/prefer-type-fest-optional.d.ts +13 -0
  31. package/dist/rules/prefer-type-fest-optional.d.ts.map +1 -0
  32. package/dist/rules/prefer-type-fest-optional.js +130 -0
  33. package/dist/rules/prefer-type-fest-optional.js.map +1 -0
  34. package/dist/rules/prefer-type-fest-or-all.d.ts +13 -0
  35. package/dist/rules/prefer-type-fest-or-all.d.ts.map +1 -0
  36. package/dist/rules/prefer-type-fest-or-all.js +105 -0
  37. package/dist/rules/prefer-type-fest-or-all.js.map +1 -0
  38. package/dist/rules/prefer-type-fest-union-member.d.ts +13 -0
  39. package/dist/rules/prefer-type-fest-union-member.d.ts.map +1 -0
  40. package/dist/rules/prefer-type-fest-union-member.js +159 -0
  41. package/dist/rules/prefer-type-fest-union-member.js.map +1 -0
  42. package/dist/rules/prefer-type-fest-union-to-tuple.d.ts +13 -0
  43. package/dist/rules/prefer-type-fest-union-to-tuple.d.ts.map +1 -0
  44. package/dist/rules/prefer-type-fest-union-to-tuple.js +75 -0
  45. package/dist/rules/prefer-type-fest-union-to-tuple.js.map +1 -0
  46. package/docs/rules/prefer-type-fest-and-all.md +111 -0
  47. package/docs/rules/prefer-type-fest-array-length.md +109 -0
  48. package/docs/rules/prefer-type-fest-conditional-pick-deep.md +112 -0
  49. package/docs/rules/prefer-type-fest-less-than-or-equal.md +111 -0
  50. package/docs/rules/prefer-type-fest-less-than.md +111 -0
  51. package/docs/rules/prefer-type-fest-optional.md +104 -0
  52. package/docs/rules/prefer-type-fest-or-all.md +111 -0
  53. package/docs/rules/prefer-type-fest-union-member.md +119 -0
  54. package/docs/rules/prefer-type-fest-union-to-tuple.md +108 -0
  55. package/docs/rules/presets/all.md +9 -0
  56. package/docs/rules/presets/index.md +87 -78
  57. package/docs/rules/presets/recommended-type-checked.md +74 -65
  58. package/docs/rules/presets/recommended.md +8 -0
  59. package/docs/rules/presets/strict.md +9 -0
  60. package/docs/rules/presets/type-fest-types.md +8 -0
  61. package/package.json +21 -16
@@ -0,0 +1,154 @@
1
+ /**
2
+ * @packageDocumentation
3
+ * ESLint rule implementation for `prefer-type-fest-less-than`.
4
+ */
5
+ import { collectDirectNamedImportsFromSource, collectNamedImportLocalNamesFromSource, collectNamespaceImportLocalNamesFromSource, createSafeTypeNodeTextReplacementFix, } from "../_internal/imported-type-aliases.js";
6
+ import { TYPE_FEST_MODULE_SOURCE } from "../_internal/module-source.js";
7
+ import { reportWithOptionalFix } from "../_internal/rule-reporting.js";
8
+ import { setContainsValue } from "../_internal/set-membership.js";
9
+ import { createTypedRule } from "../_internal/typed-rule.js";
10
+ const GREATER_THAN_OR_EQUAL_TYPE_NAME = "GreaterThanOrEqual";
11
+ const LESS_THAN_TYPE_NAME = "LessThan";
12
+ const isLiteralBooleanType = (node, expectedBooleanValue) => node.type === "TSLiteralType" &&
13
+ node.literal.type === "Literal" &&
14
+ node.literal.value === expectedBooleanValue;
15
+ const isFalseLiteralType = (node) => isLiteralBooleanType(node, false);
16
+ const isTrueLiteralType = (node) => isLiteralBooleanType(node, true);
17
+ /**
18
+ * ESLint rule definition for `prefer-type-fest-less-than`.
19
+ *
20
+ * @remarks
21
+ * Defines metadata, diagnostics, and suggestions/fixes for this rule.
22
+ */
23
+ const preferTypeFestLessThanRule = createTypedRule({
24
+ create(context) {
25
+ const typeFestDirectImports = collectDirectNamedImportsFromSource(context.sourceCode, TYPE_FEST_MODULE_SOURCE);
26
+ const greaterThanOrEqualLocalNames = collectNamedImportLocalNamesFromSource(context.sourceCode, TYPE_FEST_MODULE_SOURCE, GREATER_THAN_OR_EQUAL_TYPE_NAME);
27
+ const typeFestNamespaceImportNames = collectNamespaceImportLocalNamesFromSource(context.sourceCode, TYPE_FEST_MODULE_SOURCE);
28
+ const getComparatorTypeArgumentTexts = (typeReference) => {
29
+ const typeArguments = typeReference.typeArguments?.params ?? [];
30
+ const [leftType, rightType] = typeArguments;
31
+ if (!leftType || !rightType || typeArguments.length !== 2) {
32
+ return null;
33
+ }
34
+ return {
35
+ leftTypeText: context.sourceCode.getText(leftType),
36
+ rightTypeText: context.sourceCode.getText(rightType),
37
+ };
38
+ };
39
+ const isGreaterThanOrEqualTypeReference = (typeReference) => {
40
+ if (typeReference.typeName.type === "Identifier") {
41
+ return setContainsValue(greaterThanOrEqualLocalNames, typeReference.typeName.name);
42
+ }
43
+ if (typeReference.typeName.type !== "TSQualifiedName") {
44
+ return false;
45
+ }
46
+ return (typeReference.typeName.left.type === "Identifier" &&
47
+ setContainsValue(typeFestNamespaceImportNames, typeReference.typeName.left.name) &&
48
+ typeReference.typeName.right.type === "Identifier" &&
49
+ typeReference.typeName.right.name ===
50
+ GREATER_THAN_OR_EQUAL_TYPE_NAME);
51
+ };
52
+ const getComparatorTypeArgumentTextsFromTypeNode = (typeNode) => {
53
+ if (typeNode.type !== "TSTypeReference") {
54
+ return null;
55
+ }
56
+ if (!isGreaterThanOrEqualTypeReference(typeNode)) {
57
+ return null;
58
+ }
59
+ return getComparatorTypeArgumentTexts(typeNode);
60
+ };
61
+ const getDirectLessThanReplacement = (conditionalTypeNode) => {
62
+ const comparatorTypeArgumentTexts = getComparatorTypeArgumentTextsFromTypeNode(conditionalTypeNode.checkType);
63
+ if (!comparatorTypeArgumentTexts) {
64
+ return null;
65
+ }
66
+ if (!isTrueLiteralType(conditionalTypeNode.extendsType) ||
67
+ !isFalseLiteralType(conditionalTypeNode.trueType) ||
68
+ !isTrueLiteralType(conditionalTypeNode.falseType)) {
69
+ return null;
70
+ }
71
+ return comparatorTypeArgumentTexts;
72
+ };
73
+ const getInferWrappedLessThanReplacement = (conditionalTypeNode) => {
74
+ const comparatorTypeArgumentTexts = getComparatorTypeArgumentTextsFromTypeNode(conditionalTypeNode.checkType);
75
+ if (!comparatorTypeArgumentTexts) {
76
+ return null;
77
+ }
78
+ if (conditionalTypeNode.extendsType.type !== "TSInferType" ||
79
+ conditionalTypeNode.falseType.type !== "TSNeverKeyword" ||
80
+ conditionalTypeNode.trueType.type !== "TSConditionalType") {
81
+ return null;
82
+ }
83
+ const inferIdentifierName = conditionalTypeNode.extendsType.typeParameter.name.name;
84
+ const innerConditionalTypeNode = conditionalTypeNode.trueType;
85
+ if (innerConditionalTypeNode.checkType.type !==
86
+ "TSTypeReference" ||
87
+ innerConditionalTypeNode.checkType.typeName.type !==
88
+ "Identifier" ||
89
+ innerConditionalTypeNode.checkType.typeName.name !==
90
+ inferIdentifierName ||
91
+ innerConditionalTypeNode.checkType.typeArguments !==
92
+ undefined ||
93
+ !isTrueLiteralType(innerConditionalTypeNode.extendsType) ||
94
+ !isFalseLiteralType(innerConditionalTypeNode.trueType) ||
95
+ !isTrueLiteralType(innerConditionalTypeNode.falseType)) {
96
+ return null;
97
+ }
98
+ return comparatorTypeArgumentTexts;
99
+ };
100
+ const getLessThanReplacementText = (conditionalTypeNode) => {
101
+ const comparatorTypeArgumentTexts = getDirectLessThanReplacement(conditionalTypeNode) ??
102
+ getInferWrappedLessThanReplacement(conditionalTypeNode);
103
+ if (!comparatorTypeArgumentTexts) {
104
+ return null;
105
+ }
106
+ return `${LESS_THAN_TYPE_NAME}<${comparatorTypeArgumentTexts.leftTypeText}, ${comparatorTypeArgumentTexts.rightTypeText}>`;
107
+ };
108
+ return {
109
+ TSConditionalType(node) {
110
+ const replacementText = getLessThanReplacementText(node);
111
+ if (replacementText === null ||
112
+ replacementText.length === 0) {
113
+ return;
114
+ }
115
+ const fix = createSafeTypeNodeTextReplacementFix(node, LESS_THAN_TYPE_NAME, replacementText, typeFestDirectImports);
116
+ reportWithOptionalFix({
117
+ context,
118
+ fix,
119
+ messageId: "preferLessThan",
120
+ node,
121
+ });
122
+ },
123
+ };
124
+ },
125
+ defaultOptions: [],
126
+ meta: {
127
+ deprecated: false,
128
+ docs: {
129
+ description: "require TypeFest LessThan over `GreaterThanOrEqual<A, B> extends true ? false : true` wrappers.",
130
+ frozen: false,
131
+ recommended: true,
132
+ requiresTypeChecking: false,
133
+ typefestConfigs: [
134
+ "typefest.configs.recommended",
135
+ "typefest.configs.strict",
136
+ "typefest.configs.all",
137
+ "typefest.configs.type-fest/types",
138
+ ],
139
+ url: "https://nick2bad4u.github.io/eslint-plugin-typefest/docs/rules/prefer-type-fest-less-than",
140
+ },
141
+ fixable: "code",
142
+ messages: {
143
+ preferLessThan: "Prefer `LessThan<A, B>` from type-fest over wrappers built from `GreaterThanOrEqual<A, B>`.",
144
+ },
145
+ schema: [],
146
+ type: "suggestion",
147
+ },
148
+ name: "prefer-type-fest-less-than",
149
+ });
150
+ /**
151
+ * Default export for the `prefer-type-fest-less-than` rule module.
152
+ */
153
+ export default preferTypeFestLessThanRule;
154
+ //# sourceMappingURL=prefer-type-fest-less-than.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"prefer-type-fest-less-than.js","sourceRoot":"","sources":["../../src/rules/prefer-type-fest-less-than.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,13 @@
1
+ import { createTypedRule } from "../_internal/typed-rule.js";
2
+ /**
3
+ * ESLint rule definition for `prefer-type-fest-optional`.
4
+ *
5
+ * @remarks
6
+ * Defines metadata, diagnostics, and suggestions/fixes for this rule.
7
+ */
8
+ declare const preferTypeFestOptionalRule: ReturnType<typeof createTypedRule>;
9
+ /**
10
+ * Default export for the `prefer-type-fest-optional` rule module.
11
+ */
12
+ export default preferTypeFestOptionalRule;
13
+ //# sourceMappingURL=prefer-type-fest-optional.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"prefer-type-fest-optional.d.ts","sourceRoot":"","sources":["../../src/rules/prefer-type-fest-optional.ts"],"names":[],"mappings":"AAcA,OAAO,EAAE,eAAe,EAAE,MAAM,4BAA4B,CAAC;AA4E7D;;;;;GAKG;AACH,QAAA,MAAM,0BAA0B,EAAE,UAAU,CAAC,OAAO,eAAe,CAuF7D,CAAC;AAEP;;GAEG;AACH,eAAe,0BAA0B,CAAC"}
@@ -0,0 +1,130 @@
1
+ import { arrayAt, arrayFirst } from "ts-extras";
2
+ /**
3
+ * @packageDocumentation
4
+ * ESLint rule implementation for `prefer-type-fest-optional`.
5
+ */
6
+ import { collectDirectNamedImportsFromSource, createSafeTypeNodeTextReplacementFix, } from "../_internal/imported-type-aliases.js";
7
+ import { TYPE_FEST_MODULE_SOURCE } from "../_internal/module-source.js";
8
+ import { reportWithOptionalFix } from "../_internal/rule-reporting.js";
9
+ import { createTypedRule } from "../_internal/typed-rule.js";
10
+ const OPTIONAL_TYPE_NAME = "Optional";
11
+ const EXCLUDE_TYPE_NAME = "Exclude";
12
+ const NON_NULLABLE_TYPE_NAME = "NonNullable";
13
+ const isNullKeywordType = (node) => node.type === "TSNullKeyword";
14
+ const isUndefinedKeywordType = (node) => node.type === "TSUndefinedKeyword";
15
+ const isNullishDeleteType = (node) => {
16
+ if (isNullKeywordType(node)) {
17
+ return true;
18
+ }
19
+ if (node.type !== "TSUnionType" || node.types.length !== 2) {
20
+ return false;
21
+ }
22
+ let hasNull = false;
23
+ let hasUndefined = false;
24
+ for (const member of node.types) {
25
+ if (isNullKeywordType(member)) {
26
+ hasNull = true;
27
+ continue;
28
+ }
29
+ if (isUndefinedKeywordType(member)) {
30
+ hasUndefined = true;
31
+ continue;
32
+ }
33
+ return false;
34
+ }
35
+ return hasNull && hasUndefined;
36
+ };
37
+ const getOptionalInnerTypeText = ({ sourceCode, typeNode, }) => {
38
+ if (typeNode.type !== "TSTypeReference" ||
39
+ typeNode.typeName.type !== "Identifier") {
40
+ return null;
41
+ }
42
+ const typeArguments = typeNode.typeArguments?.params ?? [];
43
+ if (typeNode.typeName.name === NON_NULLABLE_TYPE_NAME) {
44
+ const [innerType] = typeArguments;
45
+ return innerType ? sourceCode.getText(innerType) : null;
46
+ }
47
+ if (typeNode.typeName.name !== EXCLUDE_TYPE_NAME) {
48
+ return null;
49
+ }
50
+ const [innerType, deletedType] = typeArguments;
51
+ if (!innerType || !deletedType || !isNullishDeleteType(deletedType)) {
52
+ return null;
53
+ }
54
+ return sourceCode.getText(innerType);
55
+ };
56
+ /**
57
+ * ESLint rule definition for `prefer-type-fest-optional`.
58
+ *
59
+ * @remarks
60
+ * Defines metadata, diagnostics, and suggestions/fixes for this rule.
61
+ */
62
+ const preferTypeFestOptionalRule = createTypedRule({
63
+ create(context) {
64
+ const typeFestDirectImports = collectDirectNamedImportsFromSource(context.sourceCode, TYPE_FEST_MODULE_SOURCE);
65
+ return {
66
+ TSUnionType(node) {
67
+ if (node.types.length !== 2) {
68
+ return;
69
+ }
70
+ const firstMember = arrayFirst(node.types);
71
+ const secondMember = arrayAt(node.types, 1);
72
+ if (!firstMember || !secondMember) {
73
+ return;
74
+ }
75
+ const optionalEquivalentMember = isUndefinedKeywordType(firstMember)
76
+ ? secondMember
77
+ : isUndefinedKeywordType(secondMember)
78
+ ? firstMember
79
+ : null;
80
+ if (!optionalEquivalentMember) {
81
+ return;
82
+ }
83
+ const innerTypeText = getOptionalInnerTypeText({
84
+ sourceCode: context.sourceCode,
85
+ typeNode: optionalEquivalentMember,
86
+ });
87
+ if (innerTypeText === null ||
88
+ innerTypeText.trim().length === 0) {
89
+ return;
90
+ }
91
+ const fix = createSafeTypeNodeTextReplacementFix(node, OPTIONAL_TYPE_NAME, `${OPTIONAL_TYPE_NAME}<${innerTypeText}>`, typeFestDirectImports);
92
+ reportWithOptionalFix({
93
+ context,
94
+ fix,
95
+ messageId: "preferOptional",
96
+ node,
97
+ });
98
+ },
99
+ };
100
+ },
101
+ defaultOptions: [],
102
+ meta: {
103
+ deprecated: false,
104
+ docs: {
105
+ description: "require TypeFest Optional over `Exclude<T, null> | undefined` and `NonNullable<T> | undefined` patterns.",
106
+ frozen: false,
107
+ recommended: true,
108
+ requiresTypeChecking: false,
109
+ typefestConfigs: [
110
+ "typefest.configs.recommended",
111
+ "typefest.configs.strict",
112
+ "typefest.configs.all",
113
+ "typefest.configs.type-fest/types",
114
+ ],
115
+ url: "https://nick2bad4u.github.io/eslint-plugin-typefest/docs/rules/prefer-type-fest-optional",
116
+ },
117
+ fixable: "code",
118
+ messages: {
119
+ preferOptional: "Prefer `Optional<T>` from type-fest over `Exclude<T, null> | undefined` and equivalent optional-value patterns.",
120
+ },
121
+ schema: [],
122
+ type: "suggestion",
123
+ },
124
+ name: "prefer-type-fest-optional",
125
+ });
126
+ /**
127
+ * Default export for the `prefer-type-fest-optional` rule module.
128
+ */
129
+ export default preferTypeFestOptionalRule;
130
+ //# sourceMappingURL=prefer-type-fest-optional.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"prefer-type-fest-optional.js","sourceRoot":"","sources":["../../src/rules/prefer-type-fest-optional.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,13 @@
1
+ import { createTypedRule } from "../_internal/typed-rule.js";
2
+ /**
3
+ * ESLint rule definition for `prefer-type-fest-or-all`.
4
+ *
5
+ * @remarks
6
+ * Defines metadata, diagnostics, and suggestions/fixes for this rule.
7
+ */
8
+ declare const preferTypeFestOrAllRule: ReturnType<typeof createTypedRule>;
9
+ /**
10
+ * Default export for the `prefer-type-fest-or-all` rule module.
11
+ */
12
+ export default preferTypeFestOrAllRule;
13
+ //# sourceMappingURL=prefer-type-fest-or-all.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"prefer-type-fest-or-all.d.ts","sourceRoot":"","sources":["../../src/rules/prefer-type-fest-or-all.ts"],"names":[],"mappings":"AAeA,OAAO,EAAE,eAAe,EAAE,MAAM,4BAA4B,CAAC;AAU7D;;;;;GAKG;AACH,QAAA,MAAM,uBAAuB,EAAE,UAAU,CAAC,OAAO,eAAe,CAoI1D,CAAC;AAEP;;GAEG;AACH,eAAe,uBAAuB,CAAC"}
@@ -0,0 +1,105 @@
1
+ /**
2
+ * @packageDocumentation
3
+ * ESLint rule implementation for `prefer-type-fest-or-all`.
4
+ */
5
+ import { collectDirectNamedImportsFromSource, collectNamedImportLocalNamesFromSource, collectNamespaceImportLocalNamesFromSource, createSafeTypeNodeTextReplacementFix, } from "../_internal/imported-type-aliases.js";
6
+ import { TYPE_FEST_MODULE_SOURCE } from "../_internal/module-source.js";
7
+ import { reportWithOptionalFix } from "../_internal/rule-reporting.js";
8
+ import { setContainsValue } from "../_internal/set-membership.js";
9
+ import { createTypedRule } from "../_internal/typed-rule.js";
10
+ const SOME_EXTEND_TYPE_NAME = "SomeExtend";
11
+ const OR_ALL_TYPE_NAME = "OrAll";
12
+ const isTrueLiteralType = (node) => node.type === "TSLiteralType" &&
13
+ node.literal.type === "Literal" &&
14
+ node.literal.value === true;
15
+ /**
16
+ * ESLint rule definition for `prefer-type-fest-or-all`.
17
+ *
18
+ * @remarks
19
+ * Defines metadata, diagnostics, and suggestions/fixes for this rule.
20
+ */
21
+ const preferTypeFestOrAllRule = createTypedRule({
22
+ create(context) {
23
+ const typeFestDirectImports = collectDirectNamedImportsFromSource(context.sourceCode, TYPE_FEST_MODULE_SOURCE);
24
+ const someExtendLocalNames = collectNamedImportLocalNamesFromSource(context.sourceCode, TYPE_FEST_MODULE_SOURCE, SOME_EXTEND_TYPE_NAME);
25
+ const typeFestNamespaceImportNames = collectNamespaceImportLocalNamesFromSource(context.sourceCode, TYPE_FEST_MODULE_SOURCE);
26
+ const getSomeExtendTupleArgumentText = (typeReference) => {
27
+ const typeArguments = typeReference.typeArguments?.params ?? [];
28
+ const [tupleArgument, comparedType] = typeArguments;
29
+ if (!tupleArgument ||
30
+ !comparedType ||
31
+ !isTrueLiteralType(comparedType)) {
32
+ return null;
33
+ }
34
+ if (typeArguments.length !== 2) {
35
+ return null;
36
+ }
37
+ return context.sourceCode.getText(tupleArgument);
38
+ };
39
+ const reportIfSomeExtendEquivalent = (node) => {
40
+ const tupleArgumentText = getSomeExtendTupleArgumentText(node);
41
+ if (tupleArgumentText === null ||
42
+ tupleArgumentText.trim().length === 0) {
43
+ return;
44
+ }
45
+ const fix = createSafeTypeNodeTextReplacementFix(node, OR_ALL_TYPE_NAME, `${OR_ALL_TYPE_NAME}<${tupleArgumentText}>`, typeFestDirectImports);
46
+ reportWithOptionalFix({
47
+ context,
48
+ fix,
49
+ messageId: "preferOrAll",
50
+ node,
51
+ });
52
+ };
53
+ return {
54
+ 'TSTypeReference[typeName.type="Identifier"]'(typeReference) {
55
+ if (typeReference.typeName.type !== "Identifier" ||
56
+ !setContainsValue(someExtendLocalNames, typeReference.typeName.name)) {
57
+ return;
58
+ }
59
+ reportIfSomeExtendEquivalent(typeReference);
60
+ },
61
+ 'TSTypeReference[typeName.type="TSQualifiedName"]'(typeReference) {
62
+ if (typeReference.typeName.type !== "TSQualifiedName") {
63
+ return;
64
+ }
65
+ if (typeReference.typeName.left.type !== "Identifier" ||
66
+ !setContainsValue(typeFestNamespaceImportNames, typeReference.typeName.left.name) ||
67
+ typeReference.typeName.right.type !== "Identifier" ||
68
+ typeReference.typeName.right.name !==
69
+ SOME_EXTEND_TYPE_NAME) {
70
+ return;
71
+ }
72
+ reportIfSomeExtendEquivalent(typeReference);
73
+ },
74
+ };
75
+ },
76
+ defaultOptions: [],
77
+ meta: {
78
+ deprecated: false,
79
+ docs: {
80
+ description: "require TypeFest OrAll over `SomeExtend<TTuple, true>` boolean-tuple checks.",
81
+ frozen: false,
82
+ recommended: true,
83
+ requiresTypeChecking: false,
84
+ typefestConfigs: [
85
+ "typefest.configs.recommended",
86
+ "typefest.configs.strict",
87
+ "typefest.configs.all",
88
+ "typefest.configs.type-fest/types",
89
+ ],
90
+ url: "https://nick2bad4u.github.io/eslint-plugin-typefest/docs/rules/prefer-type-fest-or-all",
91
+ },
92
+ fixable: "code",
93
+ messages: {
94
+ preferOrAll: "Prefer `OrAll<TTuple>` from type-fest over `SomeExtend<TTuple, true>` for boolean-tuple disjunction checks.",
95
+ },
96
+ schema: [],
97
+ type: "suggestion",
98
+ },
99
+ name: "prefer-type-fest-or-all",
100
+ });
101
+ /**
102
+ * Default export for the `prefer-type-fest-or-all` rule module.
103
+ */
104
+ export default preferTypeFestOrAllRule;
105
+ //# sourceMappingURL=prefer-type-fest-or-all.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"prefer-type-fest-or-all.js","sourceRoot":"","sources":["../../src/rules/prefer-type-fest-or-all.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,13 @@
1
+ import { createTypedRule } from "../_internal/typed-rule.js";
2
+ /**
3
+ * ESLint rule definition for `prefer-type-fest-union-member`.
4
+ *
5
+ * @remarks
6
+ * Defines metadata, diagnostics, and suggestions/fixes for this rule.
7
+ */
8
+ declare const preferTypeFestUnionMemberRule: ReturnType<typeof createTypedRule>;
9
+ /**
10
+ * Default export for the `prefer-type-fest-union-member` rule module.
11
+ */
12
+ export default preferTypeFestUnionMemberRule;
13
+ //# sourceMappingURL=prefer-type-fest-union-member.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"prefer-type-fest-union-member.d.ts","sourceRoot":"","sources":["../../src/rules/prefer-type-fest-union-member.ts"],"names":[],"mappings":"AAcA,OAAO,EAAE,eAAe,EAAE,MAAM,4BAA4B,CAAC;AAsK7D;;;;;GAKG;AACH,QAAA,MAAM,6BAA6B,EAAE,UAAU,CAAC,OAAO,eAAe,CAiEhE,CAAC;AAEP;;GAEG;AACH,eAAe,6BAA6B,CAAC"}
@@ -0,0 +1,159 @@
1
+ import { arrayFirst } from "ts-extras";
2
+ /**
3
+ * @packageDocumentation
4
+ * ESLint rule implementation for `prefer-type-fest-union-member`.
5
+ */
6
+ import { collectDirectNamedImportsFromSource, createSafeTypeNodeTextReplacementFix, } from "../_internal/imported-type-aliases.js";
7
+ import { TYPE_FEST_MODULE_SOURCE } from "../_internal/module-source.js";
8
+ import { reportWithOptionalFix } from "../_internal/rule-reporting.js";
9
+ import { createTypedRule } from "../_internal/typed-rule.js";
10
+ const UNION_MEMBER_TYPE_NAME = "UnionMember";
11
+ const UNION_TO_INTERSECTION_TYPE_NAME = "UnionToIntersection";
12
+ const IS_NEVER_TYPE_NAME = "IsNever";
13
+ const isIdentifierTypeReferenceNamed = (node, name) => node.type === "TSTypeReference" &&
14
+ node.typeName.type === "Identifier" &&
15
+ node.typeName.name === name;
16
+ const isBooleanLiteralType = (node, expectedValue) => node.type === "TSLiteralType" &&
17
+ node.literal.type === "Literal" &&
18
+ node.literal.value === expectedValue;
19
+ const getUnionArgumentTextFromDistributiveFunctionWrapper = ({ node, sourceCode, }) => {
20
+ if (node.type !== "TSConditionalType") {
21
+ return null;
22
+ }
23
+ if (node.extendsType.type !== "TSAnyKeyword" ||
24
+ node.falseType.type !== "TSNeverKeyword") {
25
+ return null;
26
+ }
27
+ if (node.trueType.type !== "TSFunctionType") {
28
+ return null;
29
+ }
30
+ const returnType = node.trueType.returnType?.typeAnnotation;
31
+ if (!returnType) {
32
+ return null;
33
+ }
34
+ const checkTypeText = sourceCode.getText(node.checkType);
35
+ const returnTypeText = sourceCode.getText(returnType);
36
+ return checkTypeText === returnTypeText ? checkTypeText : null;
37
+ };
38
+ const getUnionArgumentTextFromExtractor = ({ node, sourceCode, }) => {
39
+ if (node.falseType.type !== "TSNeverKeyword") {
40
+ return null;
41
+ }
42
+ if (!isIdentifierTypeReferenceNamed(node.checkType, UNION_TO_INTERSECTION_TYPE_NAME)) {
43
+ return null;
44
+ }
45
+ const extractorArgument = arrayFirst(node.checkType.typeArguments?.params ?? []);
46
+ if (!extractorArgument) {
47
+ return null;
48
+ }
49
+ const unionArgumentText = getUnionArgumentTextFromDistributiveFunctionWrapper({
50
+ node: extractorArgument,
51
+ sourceCode,
52
+ });
53
+ if (unionArgumentText === null) {
54
+ return null;
55
+ }
56
+ if (node.extendsType.type !== "TSFunctionType") {
57
+ return null;
58
+ }
59
+ const inferredReturnType = node.extendsType.returnType?.typeAnnotation;
60
+ const inferredTypeParameterName = inferredReturnType?.type === "TSInferType"
61
+ ? inferredReturnType.typeParameter.name.name
62
+ : null;
63
+ if (inferredTypeParameterName === null ||
64
+ node.trueType.type !== "TSTypeReference" ||
65
+ node.trueType.typeName.type !== "Identifier" ||
66
+ node.trueType.typeName.name !== inferredTypeParameterName) {
67
+ return null;
68
+ }
69
+ return unionArgumentText;
70
+ };
71
+ const getUnionMemberEquivalentArgumentText = ({ node, sourceCode, }) => {
72
+ if (node.type !== "TSConditionalType") {
73
+ return null;
74
+ }
75
+ const directExtractorText = getUnionArgumentTextFromExtractor({
76
+ node,
77
+ sourceCode,
78
+ });
79
+ if (directExtractorText !== null) {
80
+ return directExtractorText;
81
+ }
82
+ if (!isIdentifierTypeReferenceNamed(node.checkType, IS_NEVER_TYPE_NAME) ||
83
+ !isBooleanLiteralType(node.extendsType, true) ||
84
+ node.trueType.type !== "TSNeverKeyword") {
85
+ return null;
86
+ }
87
+ const guardedArgument = arrayFirst(node.checkType.typeArguments?.params ?? []);
88
+ if (!guardedArgument) {
89
+ return null;
90
+ }
91
+ const guardedArgumentText = sourceCode.getText(guardedArgument);
92
+ if (node.falseType.type !== "TSConditionalType") {
93
+ return null;
94
+ }
95
+ const extractorText = getUnionArgumentTextFromExtractor({
96
+ node: node.falseType,
97
+ sourceCode,
98
+ });
99
+ return extractorText === guardedArgumentText ? extractorText : null;
100
+ };
101
+ /**
102
+ * ESLint rule definition for `prefer-type-fest-union-member`.
103
+ *
104
+ * @remarks
105
+ * Defines metadata, diagnostics, and suggestions/fixes for this rule.
106
+ */
107
+ const preferTypeFestUnionMemberRule = createTypedRule({
108
+ create(context) {
109
+ const typeFestDirectImports = collectDirectNamedImportsFromSource(context.sourceCode, TYPE_FEST_MODULE_SOURCE);
110
+ return {
111
+ TSTypeAliasDeclaration(node) {
112
+ const unionArgumentText = getUnionMemberEquivalentArgumentText({
113
+ node: node.typeAnnotation,
114
+ sourceCode: context.sourceCode,
115
+ });
116
+ if (unionArgumentText === null ||
117
+ unionArgumentText.trim().length === 0) {
118
+ return;
119
+ }
120
+ const fix = createSafeTypeNodeTextReplacementFix(node.typeAnnotation, UNION_MEMBER_TYPE_NAME, `${UNION_MEMBER_TYPE_NAME}<${unionArgumentText}>`, typeFestDirectImports);
121
+ reportWithOptionalFix({
122
+ context,
123
+ fix,
124
+ messageId: "preferUnionMember",
125
+ node: node.typeAnnotation,
126
+ });
127
+ },
128
+ };
129
+ },
130
+ defaultOptions: [],
131
+ meta: {
132
+ deprecated: false,
133
+ docs: {
134
+ description: "require TypeFest UnionMember over custom union-member extraction helpers based on `UnionToIntersection`.",
135
+ frozen: false,
136
+ recommended: true,
137
+ requiresTypeChecking: false,
138
+ typefestConfigs: [
139
+ "typefest.configs.recommended",
140
+ "typefest.configs.strict",
141
+ "typefest.configs.all",
142
+ "typefest.configs.type-fest/types",
143
+ ],
144
+ url: "https://nick2bad4u.github.io/eslint-plugin-typefest/docs/rules/prefer-type-fest-union-member",
145
+ },
146
+ fixable: "code",
147
+ messages: {
148
+ preferUnionMember: "Prefer `UnionMember<T>` from type-fest over custom union-member extraction helpers based on `UnionToIntersection`.",
149
+ },
150
+ schema: [],
151
+ type: "suggestion",
152
+ },
153
+ name: "prefer-type-fest-union-member",
154
+ });
155
+ /**
156
+ * Default export for the `prefer-type-fest-union-member` rule module.
157
+ */
158
+ export default preferTypeFestUnionMemberRule;
159
+ //# sourceMappingURL=prefer-type-fest-union-member.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"prefer-type-fest-union-member.js","sourceRoot":"","sources":["../../src/rules/prefer-type-fest-union-member.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,13 @@
1
+ import { createTypedRule } from "../_internal/typed-rule.js";
2
+ /**
3
+ * ESLint rule definition for `prefer-type-fest-union-to-tuple`.
4
+ *
5
+ * @remarks
6
+ * Defines metadata, diagnostics, and suggestions/fixes for this rule.
7
+ */
8
+ declare const preferTypeFestUnionToTupleRule: ReturnType<typeof createTypedRule>;
9
+ /**
10
+ * Default export for the `prefer-type-fest-union-to-tuple` rule module.
11
+ */
12
+ export default preferTypeFestUnionToTupleRule;
13
+ //# sourceMappingURL=prefer-type-fest-union-to-tuple.d.ts.map