@typescript-eslint/eslint-plugin 6.8.1-alpha.21 → 6.8.1-alpha.23
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.
|
@@ -23,7 +23,7 @@ var __importStar = (this && this.__importStar) || function (mod) {
|
|
|
23
23
|
return result;
|
|
24
24
|
};
|
|
25
25
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
26
|
-
exports.getEnumTypes = void 0;
|
|
26
|
+
exports.getEnumKeyForLiteral = exports.getEnumTypes = exports.getEnumLiterals = void 0;
|
|
27
27
|
const tsutils = __importStar(require("ts-api-utils"));
|
|
28
28
|
const ts = __importStar(require("typescript"));
|
|
29
29
|
const util_1 = require("../../util");
|
|
@@ -42,6 +42,21 @@ function getBaseEnumType(typeChecker, type) {
|
|
|
42
42
|
}
|
|
43
43
|
return typeChecker.getTypeAtLocation(symbol.valueDeclaration.parent);
|
|
44
44
|
}
|
|
45
|
+
/**
|
|
46
|
+
* Retrieve only the Enum literals from a type. for example:
|
|
47
|
+
* - 123 --> []
|
|
48
|
+
* - {} --> []
|
|
49
|
+
* - Fruit.Apple --> [Fruit.Apple]
|
|
50
|
+
* - Fruit.Apple | Vegetable.Lettuce --> [Fruit.Apple, Vegetable.Lettuce]
|
|
51
|
+
* - Fruit.Apple | Vegetable.Lettuce | 123 --> [Fruit.Apple, Vegetable.Lettuce]
|
|
52
|
+
* - T extends Fruit --> [Fruit]
|
|
53
|
+
*/
|
|
54
|
+
function getEnumLiterals(type) {
|
|
55
|
+
return tsutils
|
|
56
|
+
.unionTypeParts(type)
|
|
57
|
+
.filter((subType) => (0, util_1.isTypeFlagSet)(subType, ts.TypeFlags.EnumLiteral));
|
|
58
|
+
}
|
|
59
|
+
exports.getEnumLiterals = getEnumLiterals;
|
|
45
60
|
/**
|
|
46
61
|
* A type can have 0 or more enum types. For example:
|
|
47
62
|
* - 123 --> []
|
|
@@ -52,10 +67,46 @@ function getBaseEnumType(typeChecker, type) {
|
|
|
52
67
|
* - T extends Fruit --> [Fruit]
|
|
53
68
|
*/
|
|
54
69
|
function getEnumTypes(typeChecker, type) {
|
|
55
|
-
return
|
|
56
|
-
.unionTypeParts(type)
|
|
57
|
-
.filter(subType => (0, util_1.isTypeFlagSet)(subType, ts.TypeFlags.EnumLiteral))
|
|
58
|
-
.map(type => getBaseEnumType(typeChecker, type));
|
|
70
|
+
return getEnumLiterals(type).map(type => getBaseEnumType(typeChecker, type));
|
|
59
71
|
}
|
|
60
72
|
exports.getEnumTypes = getEnumTypes;
|
|
73
|
+
/**
|
|
74
|
+
* Returns the enum key that matches the given literal node, or null if none
|
|
75
|
+
* match. For example:
|
|
76
|
+
* ```ts
|
|
77
|
+
* enum Fruit {
|
|
78
|
+
* Apple = 'apple',
|
|
79
|
+
* Banana = 'banana',
|
|
80
|
+
* }
|
|
81
|
+
*
|
|
82
|
+
* getEnumKeyForLiteral([Fruit.Apple, Fruit.Banana], 'apple') --> 'Fruit.Apple'
|
|
83
|
+
* getEnumKeyForLiteral([Fruit.Apple, Fruit.Banana], 'banana') --> 'Fruit.Banana'
|
|
84
|
+
* getEnumKeyForLiteral([Fruit.Apple, Fruit.Banana], 'cherry') --> null
|
|
85
|
+
* ```
|
|
86
|
+
*/
|
|
87
|
+
function getEnumKeyForLiteral(enumLiterals, literal) {
|
|
88
|
+
for (const enumLiteral of enumLiterals) {
|
|
89
|
+
if (enumLiteral.value === literal) {
|
|
90
|
+
const { symbol } = enumLiteral;
|
|
91
|
+
const memberDeclaration = symbol.valueDeclaration;
|
|
92
|
+
const enumDeclaration = memberDeclaration.parent;
|
|
93
|
+
const memberNameIdentifier = memberDeclaration.name;
|
|
94
|
+
const enumName = enumDeclaration.name.text;
|
|
95
|
+
switch (memberNameIdentifier.kind) {
|
|
96
|
+
case ts.SyntaxKind.Identifier:
|
|
97
|
+
return `${enumName}.${memberNameIdentifier.text}`;
|
|
98
|
+
case ts.SyntaxKind.StringLiteral: {
|
|
99
|
+
const memberName = memberNameIdentifier.text.replace(/'/g, "\\'");
|
|
100
|
+
return `${enumName}['${memberName}']`;
|
|
101
|
+
}
|
|
102
|
+
case ts.SyntaxKind.ComputedPropertyName:
|
|
103
|
+
return `${enumName}[${memberNameIdentifier.expression.getText()}]`;
|
|
104
|
+
default:
|
|
105
|
+
break;
|
|
106
|
+
}
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
return null;
|
|
110
|
+
}
|
|
111
|
+
exports.getEnumKeyForLiteral = getEnumKeyForLiteral;
|
|
61
112
|
//# sourceMappingURL=shared.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"shared.js","sourceRoot":"","sources":["../../../src/rules/enum-utils/shared.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,sDAAwC;AACxC,+CAAiC;AAEjC,qCAA2C;AAE3C;;;;;;;GAOG;AACH,SAAS,eAAe,CAAC,WAA2B,EAAE,IAAa;IACjE,MAAM,MAAM,GAAG,IAAI,CAAC,SAAS,EAAG,CAAC;IACjC,IAAI,CAAC,OAAO,CAAC,eAAe,CAAC,MAAM,EAAE,EAAE,CAAC,WAAW,CAAC,UAAU,CAAC,EAAE;QAC/D,OAAO,IAAI,CAAC;KACb;IAED,OAAO,WAAW,CAAC,iBAAiB,CAAC,MAAM,CAAC,gBAAiB,CAAC,MAAM,CAAC,CAAC;AACxE,CAAC;AAED;;;;;;;;GAQG;AACH,SAAgB,
|
|
1
|
+
{"version":3,"file":"shared.js","sourceRoot":"","sources":["../../../src/rules/enum-utils/shared.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,sDAAwC;AACxC,+CAAiC;AAEjC,qCAA2C;AAE3C;;;;;;;GAOG;AACH,SAAS,eAAe,CAAC,WAA2B,EAAE,IAAa;IACjE,MAAM,MAAM,GAAG,IAAI,CAAC,SAAS,EAAG,CAAC;IACjC,IAAI,CAAC,OAAO,CAAC,eAAe,CAAC,MAAM,EAAE,EAAE,CAAC,WAAW,CAAC,UAAU,CAAC,EAAE;QAC/D,OAAO,IAAI,CAAC;KACb;IAED,OAAO,WAAW,CAAC,iBAAiB,CAAC,MAAM,CAAC,gBAAiB,CAAC,MAAM,CAAC,CAAC;AACxE,CAAC;AAED;;;;;;;;GAQG;AACH,SAAgB,eAAe,CAAC,IAAa;IAC3C,OAAO,OAAO;SACX,cAAc,CAAC,IAAI,CAAC;SACpB,MAAM,CAAC,CAAC,OAAO,EAA6B,EAAE,CAC7C,IAAA,oBAAa,EAAC,OAAO,EAAE,EAAE,CAAC,SAAS,CAAC,WAAW,CAAC,CACjD,CAAC;AACN,CAAC;AAND,0CAMC;AAED;;;;;;;;GAQG;AACH,SAAgB,YAAY,CAC1B,WAA2B,EAC3B,IAAa;IAEb,OAAO,eAAe,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,eAAe,CAAC,WAAW,EAAE,IAAI,CAAC,CAAC,CAAC;AAC/E,CAAC;AALD,oCAKC;AAED;;;;;;;;;;;;;GAaG;AACH,SAAgB,oBAAoB,CAClC,YAA8B,EAC9B,OAAgB;IAEhB,KAAK,MAAM,WAAW,IAAI,YAAY,EAAE;QACtC,IAAI,WAAW,CAAC,KAAK,KAAK,OAAO,EAAE;YACjC,MAAM,EAAE,MAAM,EAAE,GAAG,WAAW,CAAC;YAE/B,MAAM,iBAAiB,GAAG,MAAM,CAAC,gBAAiC,CAAC;YACnE,MAAM,eAAe,GAAG,iBAAiB,CAAC,MAAM,CAAC;YAEjD,MAAM,oBAAoB,GAAG,iBAAiB,CAAC,IAAI,CAAC;YACpD,MAAM,QAAQ,GAAG,eAAe,CAAC,IAAI,CAAC,IAAI,CAAC;YAE3C,QAAQ,oBAAoB,CAAC,IAAI,EAAE;gBACjC,KAAK,EAAE,CAAC,UAAU,CAAC,UAAU;oBAC3B,OAAO,GAAG,QAAQ,IAAI,oBAAoB,CAAC,IAAI,EAAE,CAAC;gBAEpD,KAAK,EAAE,CAAC,UAAU,CAAC,aAAa,CAAC,CAAC;oBAChC,MAAM,UAAU,GAAG,oBAAoB,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;oBAElE,OAAO,GAAG,QAAQ,KAAK,UAAU,IAAI,CAAC;iBACvC;gBAED,KAAK,EAAE,CAAC,UAAU,CAAC,oBAAoB;oBACrC,OAAO,GAAG,QAAQ,IAAI,oBAAoB,CAAC,UAAU,CAAC,OAAO,EAAE,GAAG,CAAC;gBAErE;oBACE,MAAM;aACT;SACF;KACF;IAED,OAAO,IAAI,CAAC;AACd,CAAC;AAlCD,oDAkCC"}
|
|
@@ -50,6 +50,7 @@ function getEnumValueType(type) {
|
|
|
50
50
|
exports.default = (0, util_1.createRule)({
|
|
51
51
|
name: 'no-unsafe-enum-comparison',
|
|
52
52
|
meta: {
|
|
53
|
+
hasSuggestions: true,
|
|
53
54
|
type: 'suggestion',
|
|
54
55
|
docs: {
|
|
55
56
|
description: 'Disallow comparing an enum value with a non-enum value',
|
|
@@ -58,6 +59,7 @@ exports.default = (0, util_1.createRule)({
|
|
|
58
59
|
},
|
|
59
60
|
messages: {
|
|
60
61
|
mismatched: 'The two values in this comparison do not have a shared enum type.',
|
|
62
|
+
replaceValueWithEnum: 'Replace with an enum value comparison.',
|
|
61
63
|
},
|
|
62
64
|
schema: [],
|
|
63
65
|
},
|
|
@@ -107,6 +109,33 @@ exports.default = (0, util_1.createRule)({
|
|
|
107
109
|
context.report({
|
|
108
110
|
messageId: 'mismatched',
|
|
109
111
|
node,
|
|
112
|
+
suggest: [
|
|
113
|
+
{
|
|
114
|
+
messageId: 'replaceValueWithEnum',
|
|
115
|
+
fix(fixer) {
|
|
116
|
+
// Replace the right side with an enum key if possible:
|
|
117
|
+
//
|
|
118
|
+
// ```ts
|
|
119
|
+
// Fruit.Apple === 'apple'; // Fruit.Apple === Fruit.Apple
|
|
120
|
+
// ```
|
|
121
|
+
const leftEnumKey = (0, shared_1.getEnumKeyForLiteral)((0, shared_1.getEnumLiterals)(left), (0, util_1.getStaticValue)(node.right)?.value);
|
|
122
|
+
if (leftEnumKey) {
|
|
123
|
+
return fixer.replaceText(node.right, leftEnumKey);
|
|
124
|
+
}
|
|
125
|
+
// Replace the left side with an enum key if possible:
|
|
126
|
+
//
|
|
127
|
+
// ```ts
|
|
128
|
+
// declare const fruit: Fruit;
|
|
129
|
+
// 'apple' === Fruit.Apple; // Fruit.Apple === Fruit.Apple
|
|
130
|
+
// ```
|
|
131
|
+
const rightEnumKey = (0, shared_1.getEnumKeyForLiteral)((0, shared_1.getEnumLiterals)(right), (0, util_1.getStaticValue)(node.left)?.value);
|
|
132
|
+
if (rightEnumKey) {
|
|
133
|
+
return fixer.replaceText(node.left, rightEnumKey);
|
|
134
|
+
}
|
|
135
|
+
return null;
|
|
136
|
+
},
|
|
137
|
+
},
|
|
138
|
+
],
|
|
110
139
|
});
|
|
111
140
|
}
|
|
112
141
|
},
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"no-unsafe-enum-comparison.js","sourceRoot":"","sources":["../../src/rules/no-unsafe-enum-comparison.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;AACA,sDAAwC;AACxC,+CAAiC;AAEjC,
|
|
1
|
+
{"version":3,"file":"no-unsafe-enum-comparison.js","sourceRoot":"","sources":["../../src/rules/no-unsafe-enum-comparison.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@typescript-eslint/eslint-plugin",
|
|
3
|
-
"version": "6.8.1-alpha.
|
|
3
|
+
"version": "6.8.1-alpha.23+26bc3d0c5",
|
|
4
4
|
"description": "TypeScript plugin for ESLint",
|
|
5
5
|
"files": [
|
|
6
6
|
"dist",
|
|
@@ -57,10 +57,10 @@
|
|
|
57
57
|
},
|
|
58
58
|
"dependencies": {
|
|
59
59
|
"@eslint-community/regexpp": "^4.5.1",
|
|
60
|
-
"@typescript-eslint/scope-manager": "6.8.1-alpha.
|
|
61
|
-
"@typescript-eslint/type-utils": "6.8.1-alpha.
|
|
62
|
-
"@typescript-eslint/utils": "6.8.1-alpha.
|
|
63
|
-
"@typescript-eslint/visitor-keys": "6.8.1-alpha.
|
|
60
|
+
"@typescript-eslint/scope-manager": "6.8.1-alpha.23+26bc3d0c5",
|
|
61
|
+
"@typescript-eslint/type-utils": "6.8.1-alpha.23+26bc3d0c5",
|
|
62
|
+
"@typescript-eslint/utils": "6.8.1-alpha.23+26bc3d0c5",
|
|
63
|
+
"@typescript-eslint/visitor-keys": "6.8.1-alpha.23+26bc3d0c5",
|
|
64
64
|
"debug": "^4.3.4",
|
|
65
65
|
"graphemer": "^1.4.0",
|
|
66
66
|
"ignore": "^5.2.4",
|
|
@@ -74,7 +74,7 @@
|
|
|
74
74
|
"@types/marked": "*",
|
|
75
75
|
"@types/natural-compare": "*",
|
|
76
76
|
"@typescript-eslint/rule-schema-to-typescript-types": "6.8.0",
|
|
77
|
-
"@typescript-eslint/rule-tester": "6.8.1-alpha.
|
|
77
|
+
"@typescript-eslint/rule-tester": "6.8.1-alpha.23+26bc3d0c5",
|
|
78
78
|
"ajv": "^6.12.6",
|
|
79
79
|
"chalk": "^5.3.0",
|
|
80
80
|
"cross-fetch": "*",
|
|
@@ -103,5 +103,5 @@
|
|
|
103
103
|
"type": "opencollective",
|
|
104
104
|
"url": "https://opencollective.com/typescript-eslint"
|
|
105
105
|
},
|
|
106
|
-
"gitHead": "
|
|
106
|
+
"gitHead": "26bc3d0c57a6948a7a2805b67996ecdbaf83c852"
|
|
107
107
|
}
|