consistent-indexed-object-style.js
4.2 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
const util_1 = require("../util");
const experimental_utils_1 = require("@typescript-eslint/experimental-utils");
exports.default = util_1.createRule({
name: 'consistent-indexed-object-style',
meta: {
type: 'suggestion',
docs: {
description: 'Enforce or disallow the use of the record type',
category: 'Stylistic Issues',
// too opinionated to be recommended
recommended: false,
},
messages: {
preferRecord: 'A record is preferred over an index signature',
preferIndexSignature: 'An index signature is preferred over a record.',
},
fixable: 'code',
schema: [
{
enum: ['record', 'index-signature'],
},
],
},
defaultOptions: ['record'],
create(context) {
const sourceCode = context.getSourceCode();
if (context.options[0] === 'index-signature') {
return {
TSTypeReference(node) {
var _a;
const typeName = node.typeName;
if (typeName.type !== experimental_utils_1.AST_NODE_TYPES.Identifier) {
return;
}
if (typeName.name !== 'Record') {
return;
}
const params = (_a = node.typeParameters) === null || _a === void 0 ? void 0 : _a.params;
if ((params === null || params === void 0 ? void 0 : params.length) !== 2) {
return;
}
context.report({
node,
messageId: 'preferIndexSignature',
fix(fixer) {
const key = sourceCode.getText(params[0]);
const type = sourceCode.getText(params[1]);
return fixer.replaceText(node, `{ [key: ${key}]: ${type} }`);
},
});
},
};
}
function checkMembers(members, node, prefix, postfix) {
if (members.length !== 1) {
return;
}
const [member] = members;
if (member.type !== experimental_utils_1.AST_NODE_TYPES.TSIndexSignature) {
return;
}
const [parameter] = member.parameters;
if (!parameter) {
return;
}
if (parameter.type !== experimental_utils_1.AST_NODE_TYPES.Identifier) {
return;
}
const keyType = parameter.typeAnnotation;
if (!keyType) {
return;
}
const valueType = member.typeAnnotation;
if (!valueType) {
return;
}
context.report({
node,
messageId: 'preferRecord',
fix(fixer) {
const key = sourceCode.getText(keyType.typeAnnotation);
const value = sourceCode.getText(valueType.typeAnnotation);
const record = member.readonly
? `Readonly<Record<${key}, ${value}>>`
: `Record<${key}, ${value}>`;
return fixer.replaceText(node, `${prefix}${record}${postfix}`);
},
});
}
return {
TSTypeLiteral(node) {
checkMembers(node.members, node, '', '');
},
TSInterfaceDeclaration(node) {
var _a, _b, _c;
let genericTypes = '';
if (((_b = (_a = node.typeParameters) === null || _a === void 0 ? void 0 : _a.params) !== null && _b !== void 0 ? _b : []).length > 0) {
genericTypes = `<${(_c = node.typeParameters) === null || _c === void 0 ? void 0 : _c.params.map(p => p.name.name).join(', ')}>`;
}
checkMembers(node.body.body, node, `type ${node.id.name}${genericTypes} = `, ';');
},
};
},
});
//# sourceMappingURL=consistent-indexed-object-style.js.map