/
prefer-readonly-parameter-types.ts
59 lines (56 loc) · 1.63 KB
/
prefer-readonly-parameter-types.ts
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
import {
TSESTree,
AST_NODE_TYPES,
} from '@typescript-eslint/experimental-utils';
import * as util from '../util';
export default util.createRule({
name: 'prefer-readonly-parameter-types',
meta: {
type: 'suggestion',
docs: {
description: 'TODO',
category: 'Possible Errors',
recommended: false,
requiresTypeChecking: true,
},
schema: [
{
type: 'string',
enum: ['prefer-readonly', 'prefer-mutable', 'ignore'],
},
],
messages: {
shouldBeReadonly: 'Parameter should be a read only type',
},
},
defaultOptions: [],
create(context) {
const { esTreeNodeToTSNodeMap, program } = util.getParserServices(context);
const checker = program.getTypeChecker();
return {
'ArrowFunctionExpression, FunctionDeclaration, FunctionExpression, TSEmptyBodyFunctionExpression'(
node:
| TSESTree.ArrowFunctionExpression
| TSESTree.FunctionDeclaration
| TSESTree.FunctionExpression
| TSESTree.TSEmptyBodyFunctionExpression,
): void {
for (const param of node.params) {
const actualParam =
param.type === AST_NODE_TYPES.TSParameterProperty
? param.parameter
: param;
const tsNode = esTreeNodeToTSNodeMap.get(actualParam);
const type = checker.getTypeAtLocation(tsNode);
const isReadOnly = util.isTypeReadonly(checker, type);
if (!isReadOnly) {
return context.report({
node: actualParam,
messageId: 'shouldBeReadonly',
});
}
}
},
};
},
});