@daldalso/eslint-plugin 1.2.0

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.
@@ -0,0 +1,206 @@
1
+ "use strict";
2
+ var __assign = (this && this.__assign) || function () {
3
+ __assign = Object.assign || function(t) {
4
+ for (var s, i = 1, n = arguments.length; i < n; i++) {
5
+ s = arguments[i];
6
+ for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p))
7
+ t[p] = s[p];
8
+ }
9
+ return t;
10
+ };
11
+ return __assign.apply(this, arguments);
12
+ };
13
+ var __generator = (this && this.__generator) || function (thisArg, body) {
14
+ var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g;
15
+ return g = { next: verb(0), "throw": verb(1), "return": verb(2) }, typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g;
16
+ function verb(n) { return function (v) { return step([n, v]); }; }
17
+ function step(op) {
18
+ if (f) throw new TypeError("Generator is already executing.");
19
+ while (g && (g = 0, op[0] && (_ = 0)), _) try {
20
+ if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;
21
+ if (y = 0, t) op = [op[0] & 2, t.value];
22
+ switch (op[0]) {
23
+ case 0: case 1: t = op; break;
24
+ case 4: _.label++; return { value: op[1], done: false };
25
+ case 5: _.label++; y = op[1]; op = [0]; continue;
26
+ case 7: op = _.ops.pop(); _.trys.pop(); continue;
27
+ default:
28
+ if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }
29
+ if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }
30
+ if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }
31
+ if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }
32
+ if (t[2]) _.ops.pop();
33
+ _.trys.pop(); continue;
34
+ }
35
+ op = body.call(thisArg, _);
36
+ } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }
37
+ if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };
38
+ }
39
+ };
40
+ Object.defineProperty(exports, "__esModule", { value: true });
41
+ var ast_spec_1 = require("@typescript-eslint/types/dist/generated/ast-spec");
42
+ var utils_1 = require("@typescript-eslint/utils");
43
+ var patterns_1 = require("../utils/patterns");
44
+ var OBJECT_OR_ARRAY_TYPES = [
45
+ utils_1.AST_NODE_TYPES.ArrayExpression,
46
+ utils_1.AST_NODE_TYPES.ArrayPattern,
47
+ utils_1.AST_NODE_TYPES.ObjectExpression,
48
+ utils_1.AST_NODE_TYPES.ObjectPattern
49
+ ];
50
+ var DIRECTION_TABLE = {
51
+ '[': "after",
52
+ '{': "after",
53
+ ']': "before",
54
+ '}': "before"
55
+ };
56
+ exports.default = utils_1.ESLintUtils.RuleCreator.withoutDocs({
57
+ meta: {
58
+ type: "layout",
59
+ fixable: "whitespace",
60
+ messages: {
61
+ 'should': "Spacing required {{direction}} `{{token}}`.",
62
+ 'should-not': "No spacing required {{direction}} `{{token}}`."
63
+ },
64
+ schema: []
65
+ },
66
+ defaultOptions: [],
67
+ create: function (context) {
68
+ var sourceCode = context.getSourceCode();
69
+ var isFirstCloserOfLine = function (closer) {
70
+ var line = sourceCode.lines[closer.loc.start.line - 1];
71
+ var chunk = line.match(patterns_1.closingLinePattern);
72
+ if (!chunk)
73
+ return false;
74
+ return closer.loc.start.column === chunk[0].length - 1;
75
+ };
76
+ var hasOnlyObjectOrArray = function (children) { return children.length === 1
77
+ && children[0] !== null
78
+ && OBJECT_OR_ARRAY_TYPES.includes(children[0].type); };
79
+ var getMessageIdWithData = function (token, shouldBeSpaced) {
80
+ var direction = DIRECTION_TABLE[token];
81
+ return {
82
+ messageId: shouldBeSpaced ? "should" : "should-not",
83
+ data: { direction: direction, token: token }
84
+ };
85
+ };
86
+ var checkLeadingSpace = function (from, token, shouldBeSpaced) {
87
+ var _a, _b;
88
+ var _c;
89
+ if (shouldBeSpaced === void 0) { shouldBeSpaced = false; }
90
+ var opener;
91
+ var payload;
92
+ if (from.type in ast_spec_1.AST_TOKEN_TYPES) {
93
+ _a = [from, sourceCode.getTokenAfter(from)], opener = _a[0], payload = _a[1];
94
+ }
95
+ else {
96
+ _b = sourceCode.getFirstTokens(from, { count: 2 }), opener = _b[0], payload = _b[1];
97
+ }
98
+ if (!payload) {
99
+ return;
100
+ }
101
+ if (shouldBeSpaced === Boolean((_c = sourceCode.isSpaceBetween) === null || _c === void 0 ? void 0 : _c.call(sourceCode, opener, payload))) {
102
+ return;
103
+ }
104
+ context.report(__assign(__assign({ node: opener }, getMessageIdWithData(token, shouldBeSpaced)), { fix: function (fixer) {
105
+ return __generator(this, function (_a) {
106
+ switch (_a.label) {
107
+ case 0:
108
+ if (!shouldBeSpaced) return [3 /*break*/, 2];
109
+ return [4 /*yield*/, fixer.insertTextAfter(opener, " ")];
110
+ case 1:
111
+ _a.sent();
112
+ return [3 /*break*/, 4];
113
+ case 2: return [4 /*yield*/, fixer.removeRange([opener.range[1], payload.range[0]])];
114
+ case 3:
115
+ _a.sent();
116
+ _a.label = 4;
117
+ case 4: return [2 /*return*/];
118
+ }
119
+ });
120
+ } }));
121
+ };
122
+ var checkTrailingSpace = function (from, token, shouldBeSpaced) {
123
+ var _a, _b, _c;
124
+ var _d;
125
+ if (shouldBeSpaced === void 0) { shouldBeSpaced = false; }
126
+ var payload;
127
+ var closer;
128
+ if (from.type in ast_spec_1.AST_TOKEN_TYPES) {
129
+ _a = [sourceCode.getTokenBefore(from), from], payload = _a[0], closer = _a[1];
130
+ }
131
+ else if ('typeAnnotation' in from && from.typeAnnotation) {
132
+ _b = sourceCode.getTokensBefore(from.typeAnnotation, { count: 2 }), payload = _b[0], closer = _b[1];
133
+ }
134
+ else {
135
+ _c = sourceCode.getLastTokens(from, { count: 2 }), payload = _c[0], closer = _c[1];
136
+ }
137
+ if (!payload) {
138
+ return;
139
+ }
140
+ if (isFirstCloserOfLine(closer)) {
141
+ return;
142
+ }
143
+ if (shouldBeSpaced === Boolean((_d = sourceCode.isSpaceBetween) === null || _d === void 0 ? void 0 : _d.call(sourceCode, payload, closer))) {
144
+ return;
145
+ }
146
+ context.report(__assign(__assign({ node: closer }, getMessageIdWithData(token, shouldBeSpaced)), { fix: function (fixer) {
147
+ return __generator(this, function (_a) {
148
+ switch (_a.label) {
149
+ case 0:
150
+ if (!shouldBeSpaced) return [3 /*break*/, 2];
151
+ return [4 /*yield*/, fixer.insertTextBefore(closer, " ")];
152
+ case 1:
153
+ _a.sent();
154
+ return [3 /*break*/, 4];
155
+ case 2: return [4 /*yield*/, fixer.removeRange([payload.range[1], closer.range[0]])];
156
+ case 3:
157
+ _a.sent();
158
+ _a.label = 4;
159
+ case 4: return [2 /*return*/];
160
+ }
161
+ });
162
+ } }));
163
+ };
164
+ return {
165
+ 'ArrayExpression, ArrayPattern': function (node) {
166
+ if (!node.elements.length) {
167
+ return;
168
+ }
169
+ var isMultiline = node.loc.start.line !== node.loc.end.line;
170
+ var only = hasOnlyObjectOrArray(node.elements);
171
+ checkLeadingSpace(node, "[", !only);
172
+ if (isMultiline) {
173
+ checkTrailingSpace(node, "]", false);
174
+ }
175
+ else {
176
+ checkTrailingSpace(node, "]", !only);
177
+ }
178
+ },
179
+ 'ObjectExpression, ObjectPattern': function (node) {
180
+ if (!node.properties.length) {
181
+ return;
182
+ }
183
+ var isMultiline = node.loc.start.line !== node.loc.end.line;
184
+ var only = hasOnlyObjectOrArray(node.properties);
185
+ checkLeadingSpace(node, "{", !only);
186
+ if (isMultiline) {
187
+ checkTrailingSpace(node, "}", false);
188
+ }
189
+ else {
190
+ checkTrailingSpace(node, "}", !only);
191
+ }
192
+ },
193
+ 'ImportDeclaration, ExportNamedDeclaration': function (node) {
194
+ if (!node.specifiers.length) {
195
+ return;
196
+ }
197
+ var opening = sourceCode.getTokenBefore(node.specifiers[0]);
198
+ var closing = sourceCode.getTokenAfter(node.specifiers[node.specifiers.length - 1]);
199
+ if (opening)
200
+ checkLeadingSpace(opening, "{", true);
201
+ if (closing)
202
+ checkTrailingSpace(closing, "}", true);
203
+ }
204
+ };
205
+ }
206
+ });
@@ -0,0 +1,123 @@
1
+ "use strict";
2
+ var __assign = (this && this.__assign) || function () {
3
+ __assign = Object.assign || function(t) {
4
+ for (var s, i = 1, n = arguments.length; i < n; i++) {
5
+ s = arguments[i];
6
+ for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p))
7
+ t[p] = s[p];
8
+ }
9
+ return t;
10
+ };
11
+ return __assign.apply(this, arguments);
12
+ };
13
+ var __generator = (this && this.__generator) || function (thisArg, body) {
14
+ var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g;
15
+ return g = { next: verb(0), "throw": verb(1), "return": verb(2) }, typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g;
16
+ function verb(n) { return function (v) { return step([n, v]); }; }
17
+ function step(op) {
18
+ if (f) throw new TypeError("Generator is already executing.");
19
+ while (g && (g = 0, op[0] && (_ = 0)), _) try {
20
+ if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;
21
+ if (y = 0, t) op = [op[0] & 2, t.value];
22
+ switch (op[0]) {
23
+ case 0: case 1: t = op; break;
24
+ case 4: _.label++; return { value: op[1], done: false };
25
+ case 5: _.label++; y = op[1]; op = [0]; continue;
26
+ case 7: op = _.ops.pop(); _.trys.pop(); continue;
27
+ default:
28
+ if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }
29
+ if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }
30
+ if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }
31
+ if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }
32
+ if (t[2]) _.ops.pop();
33
+ _.trys.pop(); continue;
34
+ }
35
+ op = body.call(thisArg, _);
36
+ } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }
37
+ if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };
38
+ }
39
+ };
40
+ Object.defineProperty(exports, "__esModule", { value: true });
41
+ var utils_1 = require("@typescript-eslint/utils");
42
+ exports.default = utils_1.ESLintUtils.RuleCreator.withoutDocs({
43
+ meta: {
44
+ type: "layout",
45
+ fixable: "code",
46
+ messages: {
47
+ 'default': "`{{name}}` can be a constant."
48
+ },
49
+ schema: []
50
+ },
51
+ defaultOptions: [],
52
+ create: function (context) {
53
+ var sourceCode = context.getSourceCode();
54
+ var reassignedIdentifierTable = {};
55
+ var getKey = function (_a) {
56
+ var scope = _a.scope, name = _a.name;
57
+ return "".concat(scope.block.range[0], ",").concat(scope.block.range[1], "/").concat(name);
58
+ };
59
+ return {
60
+ Program: function () {
61
+ var variables = getReassignedVariables(context.getScope());
62
+ for (var _i = 0, variables_1 = variables; _i < variables_1.length; _i++) {
63
+ var v = variables_1[_i];
64
+ reassignedIdentifierTable[getKey(v)] = true;
65
+ }
66
+ },
67
+ VariableDeclaration: function (node) {
68
+ if (node.kind !== "let") {
69
+ return;
70
+ }
71
+ var scope = context.getScope();
72
+ var kindToken = sourceCode.getFirstToken(node);
73
+ for (var _i = 0, _a = node.declarations; _i < _a.length; _i++) {
74
+ var v = _a[_i];
75
+ if (v.id.type !== utils_1.AST_NODE_TYPES.Identifier)
76
+ continue;
77
+ var variable = scope.set.get(v.id.name);
78
+ if (variable && reassignedIdentifierTable[getKey(variable)])
79
+ continue;
80
+ context.report({
81
+ node: v,
82
+ messageId: "default",
83
+ data: { name: v.id.name },
84
+ fix: function (fixer) {
85
+ return __generator(this, function (_a) {
86
+ switch (_a.label) {
87
+ case 0: return [4 /*yield*/, fixer.replaceText(kindToken, "const")];
88
+ case 1:
89
+ _a.sent();
90
+ return [2 /*return*/];
91
+ }
92
+ });
93
+ }
94
+ });
95
+ }
96
+ }
97
+ };
98
+ }
99
+ });
100
+ function getReassignedVariables(scope, parentSet) {
101
+ var _a;
102
+ if (parentSet === void 0) { parentSet = {}; }
103
+ var R = [];
104
+ var set = __assign(__assign({}, parentSet), Object.fromEntries(scope.set.entries()));
105
+ for (var _i = 0, _b = scope.references; _i < _b.length; _i++) {
106
+ var v = _b[_i];
107
+ if (v.from !== scope)
108
+ continue;
109
+ if (((_a = v.identifier.parent) === null || _a === void 0 ? void 0 : _a.type) === utils_1.AST_NODE_TYPES.VariableDeclarator)
110
+ continue;
111
+ if (!v.isWrite())
112
+ continue;
113
+ var variable = set[v.identifier.name];
114
+ if (!variable)
115
+ continue;
116
+ R.push(variable);
117
+ }
118
+ for (var _c = 0, _d = scope.childScopes; _c < _d.length; _c++) {
119
+ var v = _d[_c];
120
+ R.push.apply(R, getReassignedVariables(v, set));
121
+ }
122
+ return R;
123
+ }
@@ -0,0 +1,96 @@
1
+ "use strict";
2
+ var __generator = (this && this.__generator) || function (thisArg, body) {
3
+ var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g;
4
+ return g = { next: verb(0), "throw": verb(1), "return": verb(2) }, typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g;
5
+ function verb(n) { return function (v) { return step([n, v]); }; }
6
+ function step(op) {
7
+ if (f) throw new TypeError("Generator is already executing.");
8
+ while (g && (g = 0, op[0] && (_ = 0)), _) try {
9
+ if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;
10
+ if (y = 0, t) op = [op[0] & 2, t.value];
11
+ switch (op[0]) {
12
+ case 0: case 1: t = op; break;
13
+ case 4: _.label++; return { value: op[1], done: false };
14
+ case 5: _.label++; y = op[1]; op = [0]; continue;
15
+ case 7: op = _.ops.pop(); _.trys.pop(); continue;
16
+ default:
17
+ if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }
18
+ if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }
19
+ if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }
20
+ if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }
21
+ if (t[2]) _.ops.pop();
22
+ _.trys.pop(); continue;
23
+ }
24
+ op = body.call(thisArg, _);
25
+ } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }
26
+ if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };
27
+ }
28
+ };
29
+ Object.defineProperty(exports, "__esModule", { value: true });
30
+ var utils_1 = require("@typescript-eslint/utils");
31
+ var type_1 = require("../utils/type");
32
+ exports.default = utils_1.ESLintUtils.RuleCreator.withoutDocs({
33
+ meta: {
34
+ type: "suggestion",
35
+ hasSuggestions: true,
36
+ messages: {
37
+ 'for-method': "Method should have a return type annotation.",
38
+ 'for-function': "Function with the simple return type `{{type}}` should have a return type annotation.",
39
+ 'for-function/suggest/0': "Add a return type annotation"
40
+ },
41
+ schema: [{
42
+ type: "object",
43
+ properties: {
44
+ simpleTypeMaxLength: { type: "integer" }
45
+ }
46
+ }]
47
+ },
48
+ defaultOptions: [{
49
+ simpleTypeMaxLength: 20
50
+ }],
51
+ create: function (context, _a) {
52
+ var simpleTypeMaxLength = _a[0].simpleTypeMaxLength;
53
+ (0, type_1.useTypeChecker)(context);
54
+ return {
55
+ MethodDefinition: function (node) {
56
+ if (node.value.returnType) {
57
+ return;
58
+ }
59
+ if (node.kind === "constructor") {
60
+ return;
61
+ }
62
+ if (node.kind === "set") {
63
+ return;
64
+ }
65
+ context.report({ node: node, messageId: 'for-method' });
66
+ },
67
+ FunctionDeclaration: function (node) {
68
+ if (node.returnType) {
69
+ return;
70
+ }
71
+ var returnType = (0, type_1.typeToString)(context, (0, type_1.getFunctionReturnType)(context, node));
72
+ if (returnType.length > simpleTypeMaxLength) {
73
+ return;
74
+ }
75
+ context.report({
76
+ node: node,
77
+ messageId: 'for-function',
78
+ data: { type: returnType },
79
+ suggest: [{
80
+ messageId: 'for-function/suggest/0',
81
+ fix: function (fixer) {
82
+ return __generator(this, function (_a) {
83
+ switch (_a.label) {
84
+ case 0: return [4 /*yield*/, fixer.insertTextBefore(node.body, ":".concat(returnType.replace(/ /g, "")))];
85
+ case 1:
86
+ _a.sent();
87
+ return [2 /*return*/];
88
+ }
89
+ });
90
+ }
91
+ }]
92
+ });
93
+ }
94
+ };
95
+ }
96
+ });
@@ -0,0 +1,240 @@
1
+ "use strict";
2
+ var __generator = (this && this.__generator) || function (thisArg, body) {
3
+ var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g;
4
+ return g = { next: verb(0), "throw": verb(1), "return": verb(2) }, typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g;
5
+ function verb(n) { return function (v) { return step([n, v]); }; }
6
+ function step(op) {
7
+ if (f) throw new TypeError("Generator is already executing.");
8
+ while (g && (g = 0, op[0] && (_ = 0)), _) try {
9
+ if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;
10
+ if (y = 0, t) op = [op[0] & 2, t.value];
11
+ switch (op[0]) {
12
+ case 0: case 1: t = op; break;
13
+ case 4: _.label++; return { value: op[1], done: false };
14
+ case 5: _.label++; y = op[1]; op = [0]; continue;
15
+ case 7: op = _.ops.pop(); _.trys.pop(); continue;
16
+ default:
17
+ if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }
18
+ if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }
19
+ if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }
20
+ if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }
21
+ if (t[2]) _.ops.pop();
22
+ _.trys.pop(); continue;
23
+ }
24
+ op = body.call(thisArg, _);
25
+ } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }
26
+ if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };
27
+ }
28
+ };
29
+ Object.defineProperty(exports, "__esModule", { value: true });
30
+ var ast_spec_1 = require("@typescript-eslint/types/dist/generated/ast-spec");
31
+ var utils_1 = require("@typescript-eslint/utils");
32
+ var patterns_1 = require("../utils/patterns");
33
+ var type_1 = require("../utils/type");
34
+ var quotes = ["'", "\"", "`"];
35
+ var eventMethodNames = ["on", "once", "off", "emit", "addEventListener", "removeEventListener"];
36
+ var quotePattern = /^["'`]|["'`]$/g;
37
+ exports.default = utils_1.ESLintUtils.RuleCreator.withoutDocs({
38
+ meta: {
39
+ type: "layout",
40
+ fixable: "code",
41
+ messages: {
42
+ 'from-keyish-name': "String literal for a key should be quoted with `'`.",
43
+ 'from-valueish-name': "String literal for a value should be quoted with `\"`.",
44
+ 'from-keyish-type': "String literal constrained by a finite set of values should be quoted with `'`.",
45
+ 'from-valueish-type': "String literal not constrained by a finite set of values should be quoted with `\"`.",
46
+ 'from-keyish-usage': "String literal used as a key should be quoted with `'`.",
47
+ 'from-valueish-usage': "String literal used as a value should be quoted with `\"`.",
48
+ 'from-event': "String literal used as an event name should be quoted with `'`.",
49
+ 'from-generic': "String literal used as a generic type should be quoted with `'`."
50
+ },
51
+ schema: [{
52
+ type: "object",
53
+ properties: {
54
+ keyishNamePattern: { type: "string" },
55
+ valueishNamePattern: { type: "string" }
56
+ }
57
+ }]
58
+ },
59
+ defaultOptions: [{
60
+ keyishNamePattern: patterns_1.keyishNamePattern.source,
61
+ valueishNamePattern: patterns_1.valueishNamePattern.source
62
+ }],
63
+ create: function (context, _a) {
64
+ var _b = _a[0], keyishNamePatternString = _b.keyishNamePattern, valueishNamePatternString = _b.valueishNamePattern;
65
+ var keyishNamePattern = new RegExp(keyishNamePatternString);
66
+ var valueishNamePattern = new RegExp(valueishNamePatternString);
67
+ var sourceCode = context.getSourceCode();
68
+ var assertStringLiteral = function (node, as, messageId) {
69
+ if (node.type !== ast_spec_1.AST_NODE_TYPES.Literal) {
70
+ return;
71
+ }
72
+ if (!quotes.includes(node.raw[0])) {
73
+ return;
74
+ }
75
+ var target = as === "key" ? "'" : "\"";
76
+ if (node.raw[0].startsWith(target)) {
77
+ return;
78
+ }
79
+ context.report({
80
+ node: node,
81
+ messageId: messageId,
82
+ fix: function (fixer) {
83
+ return __generator(this, function (_a) {
84
+ switch (_a.label) {
85
+ case 0: return [4 /*yield*/, fixer.replaceText(node, sourceCode.getText(node).replace(quotePattern, target))];
86
+ case 1:
87
+ _a.sent();
88
+ return [2 /*return*/];
89
+ }
90
+ });
91
+ }
92
+ });
93
+ };
94
+ var checkLiteral = function (symbol, node, ignoreKeyishUnion, isRest) {
95
+ if (keyishNamePattern.test(symbol.name)) {
96
+ assertStringLiteral(node, 'key', 'from-keyish-name');
97
+ return;
98
+ }
99
+ if (valueishNamePattern.test(symbol.name)) {
100
+ assertStringLiteral(node, 'value', 'from-valueish-name');
101
+ return;
102
+ }
103
+ if (ignoreKeyishUnion) {
104
+ assertStringLiteral(node, 'value', 'from-valueish-usage');
105
+ return;
106
+ }
107
+ var type = (0, type_1.getTSTypeBySymbol)(context, symbol, node).getNonNullableType();
108
+ var isKey;
109
+ if (isRest) {
110
+ var innerType = type.getNumberIndexType();
111
+ isKey = (innerType === null || innerType === void 0 ? void 0 : innerType.isStringLiteral()) || ((innerType === null || innerType === void 0 ? void 0 : innerType.isUnion()) && innerType.types.every(function (v) { return v.isStringLiteral(); }));
112
+ }
113
+ else {
114
+ isKey = type.isStringLiteral() || (type.isUnion() && type.types.every(function (v) { return v.isStringLiteral(); }));
115
+ }
116
+ if (isKey) {
117
+ assertStringLiteral(node, 'key', 'from-keyish-type');
118
+ }
119
+ else {
120
+ assertStringLiteral(node, 'value', 'from-valueish-type');
121
+ }
122
+ };
123
+ var checkObjectExpression = function (types, values) {
124
+ var typeMap = types.reduce(function (pv, v) {
125
+ pv[v.name] = v;
126
+ return pv;
127
+ }, {});
128
+ for (var _i = 0, values_1 = values; _i < values_1.length; _i++) {
129
+ var v = values_1[_i];
130
+ if (v.type !== ast_spec_1.AST_NODE_TYPES.Property)
131
+ continue;
132
+ if (v.key.type !== ast_spec_1.AST_NODE_TYPES.Literal)
133
+ continue;
134
+ if (typeof v.key.value !== "string")
135
+ continue;
136
+ var keySymbol = typeMap[v.key.value];
137
+ assertStringLiteral(v.key, 'key', 'from-keyish-usage');
138
+ if (keySymbol && v.value.type === ast_spec_1.AST_NODE_TYPES.Literal) {
139
+ checkLiteral(keySymbol, v.value, true);
140
+ }
141
+ else if (v.value.type === ast_spec_1.AST_NODE_TYPES.ObjectExpression) {
142
+ checkObjectExpression((0, type_1.getTSTypeByNode)(context, v.value).getNonNullableType().getProperties(), v.value.properties);
143
+ }
144
+ }
145
+ };
146
+ (0, type_1.useTypeChecker)(context);
147
+ return {
148
+ 'CallExpression, NewExpression': function (node) {
149
+ var parameters = (0, type_1.getFunctionParameters)(context, node);
150
+ if (!parameters) {
151
+ return;
152
+ }
153
+ var parameterIndex = 0;
154
+ for (var i = 0; i < node.arguments.length; i++) {
155
+ var parameter = parameters[parameterIndex];
156
+ if (!parameter)
157
+ break;
158
+ var argument = node.arguments[i];
159
+ var isRest = (0, type_1.isRestParameter)(context, parameter);
160
+ switch (argument.type) {
161
+ case ast_spec_1.AST_NODE_TYPES.Literal:
162
+ if (!parameterIndex && isCallingEventMethod(node)) {
163
+ assertStringLiteral(argument, 'key', 'from-event');
164
+ }
165
+ else {
166
+ checkLiteral(parameter, argument, false, isRest);
167
+ }
168
+ break;
169
+ case ast_spec_1.AST_NODE_TYPES.ConditionalExpression:
170
+ for (var _i = 0, _a = [argument.consequent, argument.alternate]; _i < _a.length; _i++) {
171
+ var w = _a[_i];
172
+ if (w.type !== ast_spec_1.AST_NODE_TYPES.Literal)
173
+ continue;
174
+ checkLiteral(parameter, w);
175
+ }
176
+ break;
177
+ case ast_spec_1.AST_NODE_TYPES.ObjectExpression:
178
+ checkObjectExpression((0, type_1.getTSTypeBySymbol)(context, parameter, node).getProperties(), argument.properties);
179
+ break;
180
+ }
181
+ if (!isRest) {
182
+ parameterIndex++;
183
+ }
184
+ }
185
+ },
186
+ MemberExpression: function (node) {
187
+ assertStringLiteral(node.property, 'key', 'from-keyish-usage');
188
+ },
189
+ ObjectExpression: function (node) {
190
+ var _a;
191
+ switch ((_a = node.parent) === null || _a === void 0 ? void 0 : _a.type) {
192
+ case ast_spec_1.AST_NODE_TYPES.VariableDeclarator:
193
+ checkObjectExpression((0, type_1.getObjectProperties)(context, node.parent.id), node.properties);
194
+ break;
195
+ case ast_spec_1.AST_NODE_TYPES.TSAsExpression:
196
+ checkObjectExpression((0, type_1.getObjectProperties)(context, node.parent.typeAnnotation), node.properties);
197
+ break;
198
+ }
199
+ },
200
+ TSLiteralType: function (node) {
201
+ var _a;
202
+ if (((_a = node.parent) === null || _a === void 0 ? void 0 : _a.type) === ast_spec_1.AST_NODE_TYPES.TSIndexedAccessType) {
203
+ assertStringLiteral(node.literal, 'key', 'from-keyish-name');
204
+ return;
205
+ }
206
+ var fromGeneric = false;
207
+ v: for (var _i = 0, _b = context.getAncestors().reverse(); _i < _b.length; _i++) {
208
+ var v = _b[_i];
209
+ switch (v.type) {
210
+ case ast_spec_1.AST_NODE_TYPES.TSPropertySignature:
211
+ fromGeneric = false;
212
+ break v;
213
+ case ast_spec_1.AST_NODE_TYPES.TSTypeParameter:
214
+ case ast_spec_1.AST_NODE_TYPES.TSTypeParameterInstantiation:
215
+ fromGeneric = true;
216
+ break v;
217
+ }
218
+ }
219
+ if (fromGeneric) {
220
+ assertStringLiteral(node.literal, 'key', 'from-generic');
221
+ }
222
+ else {
223
+ assertStringLiteral(node.literal, 'value', 'from-valueish-usage');
224
+ }
225
+ },
226
+ TSPropertySignature: function (node) {
227
+ assertStringLiteral(node.key, 'key', 'from-keyish-usage');
228
+ }
229
+ };
230
+ }
231
+ });
232
+ function isCallingEventMethod(node) {
233
+ if (node.type !== ast_spec_1.AST_NODE_TYPES.CallExpression)
234
+ return false;
235
+ if (node.callee.type !== ast_spec_1.AST_NODE_TYPES.MemberExpression)
236
+ return false;
237
+ if (node.callee.property.type !== ast_spec_1.AST_NODE_TYPES.Identifier)
238
+ return false;
239
+ return eventMethodNames.includes(node.callee.property.name);
240
+ }