eslint-cdk-plugin 0.4.0 → 1.0.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.
- package/CONTRIBUTING.md +105 -0
- package/README.md +52 -7
- package/VERSIONING_POLICY.md +34 -0
- package/assets/logo.png +0 -0
- package/dist/index.d.mts +31 -0
- package/dist/index.mjs +8 -1
- package/dist/index.mjs.map +1 -0
- package/dist/no-class-in-interface-props.d.mts +2 -0
- package/dist/no-class-in-interface-props.mjs +10 -18
- package/dist/no-class-in-interface-props.mjs.map +1 -0
- package/dist/no-construct-stack-suffix.d.mts +2 -0
- package/dist/no-construct-stack-suffix.mjs +13 -22
- package/dist/no-construct-stack-suffix.mjs.map +1 -0
- package/dist/no-import-private.d.mts +2 -0
- package/dist/no-import-private.mjs +17 -29
- package/dist/no-import-private.mjs.map +1 -0
- package/dist/no-mutable-props-interface.d.mts +2 -0
- package/dist/no-mutable-props-interface.mjs +11 -23
- package/dist/no-mutable-props-interface.mjs.map +1 -0
- package/dist/no-mutable-public-fields.d.mts +2 -0
- package/dist/no-mutable-public-fields.mjs +20 -33
- package/dist/no-mutable-public-fields.mjs.map +1 -0
- package/dist/no-parent-name-construct-id-match.d.mts +2 -0
- package/dist/no-parent-name-construct-id-match.mjs +82 -129
- package/dist/no-parent-name-construct-id-match.mjs.map +1 -0
- package/dist/no-public-class-fields.d.mts +2 -0
- package/dist/no-public-class-fields.mjs +30 -57
- package/dist/no-public-class-fields.mjs.map +1 -0
- package/dist/no-variable-construct-id.d.mts +2 -0
- package/dist/no-variable-construct-id.mjs +63 -0
- package/dist/no-variable-construct-id.mjs.map +1 -0
- package/dist/pascal-case-construct-id.d.mts +2 -0
- package/dist/pascal-case-construct-id.mjs +17 -44
- package/dist/pascal-case-construct-id.mjs.map +1 -0
- package/dist/require-passing-this.d.mts +2 -0
- package/dist/require-passing-this.mjs +39 -0
- package/dist/require-passing-this.mjs.map +1 -0
- package/dist/utils/convertString.d.mts +1 -0
- package/dist/utils/convertString.mjs +4 -9
- package/dist/utils/convertString.mjs.map +1 -0
- package/dist/utils/typeCheck.d.mts +3 -0
- package/dist/utils/typeCheck.mjs +16 -0
- package/dist/utils/typeCheck.mjs.map +1 -0
- package/package.json +6 -3
- package/dist/utils/isConstructOrStackType.mjs +0 -19
|
@@ -1,12 +1,6 @@
|
|
|
1
1
|
import { AST_NODE_TYPES, ESLintUtils } from "@typescript-eslint/utils";
|
|
2
|
-
import { isConstructOrStackType } from "./utils/
|
|
3
|
-
|
|
4
|
-
* Disallow mutable public class fields
|
|
5
|
-
* @param context - The rule context provided by ESLint
|
|
6
|
-
* @returns An object containing the AST visitor functions
|
|
7
|
-
* @see {@link https://eslint-cdk-plugin.dev/rules/no-mutable-public-fields} - Documentation
|
|
8
|
-
*/
|
|
9
|
-
export var noMutablePublicFields = ESLintUtils.RuleCreator.withoutDocs({
|
|
2
|
+
import { isConstructOrStackType } from "./utils/typeCheck.mjs";
|
|
3
|
+
export const noMutablePublicFields = ESLintUtils.RuleCreator.withoutDocs({
|
|
10
4
|
meta: {
|
|
11
5
|
type: "problem",
|
|
12
6
|
docs: {
|
|
@@ -19,52 +13,45 @@ export var noMutablePublicFields = ESLintUtils.RuleCreator.withoutDocs({
|
|
|
19
13
|
schema: [],
|
|
20
14
|
},
|
|
21
15
|
defaultOptions: [],
|
|
22
|
-
create
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
16
|
+
create(context) {
|
|
17
|
+
const parserServices = ESLintUtils.getParserServices(context);
|
|
18
|
+
const typeChecker = parserServices.program.getTypeChecker();
|
|
19
|
+
const sourceCode = context.sourceCode;
|
|
26
20
|
return {
|
|
27
|
-
ClassDeclaration
|
|
28
|
-
|
|
29
|
-
var type = checker.getTypeAtLocation(parserServices.esTreeNodeToTSNodeMap.get(node));
|
|
21
|
+
ClassDeclaration(node) {
|
|
22
|
+
const type = typeChecker.getTypeAtLocation(parserServices.esTreeNodeToTSNodeMap.get(node));
|
|
30
23
|
if (!isConstructOrStackType(type)) {
|
|
31
24
|
return;
|
|
32
25
|
}
|
|
33
|
-
|
|
34
|
-
// NOTE: check property definition
|
|
26
|
+
for (const member of node.body.body) {
|
|
35
27
|
if (member.type !== AST_NODE_TYPES.PropertyDefinition ||
|
|
36
28
|
member.key.type !== AST_NODE_TYPES.Identifier) {
|
|
37
|
-
|
|
29
|
+
continue;
|
|
38
30
|
}
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
return "continue";
|
|
31
|
+
if (["private", "protected"].includes(member.accessibility ?? "")) {
|
|
32
|
+
continue;
|
|
42
33
|
}
|
|
43
|
-
// NOTE: Skip if readonly is present
|
|
44
34
|
if (member.readonly)
|
|
45
|
-
|
|
35
|
+
continue;
|
|
46
36
|
context.report({
|
|
47
37
|
node: member,
|
|
48
38
|
messageId: "noMutablePublicFields",
|
|
49
39
|
data: {
|
|
50
40
|
propertyName: member.key.name,
|
|
51
41
|
},
|
|
52
|
-
fix:
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
42
|
+
fix: (fixer) => {
|
|
43
|
+
const accessibility = member.accessibility ? "public " : "";
|
|
44
|
+
const paramText = sourceCode.getText(member);
|
|
45
|
+
const [key, value] = paramText.split(":");
|
|
46
|
+
const replacedKey = key.startsWith("public ")
|
|
57
47
|
? key.replace("public ", "")
|
|
58
48
|
: key;
|
|
59
|
-
return fixer.replaceText(member,
|
|
49
|
+
return fixer.replaceText(member, `${accessibility}readonly ${replacedKey}:${value}`);
|
|
60
50
|
},
|
|
61
51
|
});
|
|
62
|
-
};
|
|
63
|
-
for (var _i = 0, _b = node.body.body; _i < _b.length; _i++) {
|
|
64
|
-
var member = _b[_i];
|
|
65
|
-
_loop_1(member);
|
|
66
52
|
}
|
|
67
53
|
},
|
|
68
54
|
};
|
|
69
55
|
},
|
|
70
56
|
});
|
|
57
|
+
//# sourceMappingURL=no-mutable-public-fields.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"no-mutable-public-fields.mjs","sourceRoot":"","sources":["../src/no-mutable-public-fields.mts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,WAAW,EAAE,MAAM,0BAA0B,CAAC;AAEvE,OAAO,EAAE,sBAAsB,EAAE,MAAM,uBAAuB,CAAC;AAQ/D,MAAM,CAAC,MAAM,qBAAqB,GAAG,WAAW,CAAC,WAAW,CAAC,WAAW,CAAC;IACvE,IAAI,EAAE;QACJ,IAAI,EAAE,SAAS;QACf,IAAI,EAAE;YACJ,WAAW,EAAE,sCAAsC;SACpD;QACD,OAAO,EAAE,MAAM;QACf,QAAQ,EAAE;YACR,qBAAqB,EACnB,gGAAgG;SACnG;QACD,MAAM,EAAE,EAAE;KACX;IACD,cAAc,EAAE,EAAE;IAClB,MAAM,CAAC,OAAO;QACZ,MAAM,cAAc,GAAG,WAAW,CAAC,iBAAiB,CAAC,OAAO,CAAC,CAAC;QAC9D,MAAM,WAAW,GAAG,cAAc,CAAC,OAAO,CAAC,cAAc,EAAE,CAAC;QAC5D,MAAM,UAAU,GAAG,OAAO,CAAC,UAAU,CAAC;QAEtC,OAAO;YACL,gBAAgB,CAAC,IAAI;gBACnB,MAAM,IAAI,GAAG,WAAW,CAAC,iBAAiB,CACxC,cAAc,CAAC,qBAAqB,CAAC,GAAG,CAAC,IAAI,CAAC,CAC/C,CAAC;gBACF,IAAI,CAAC,sBAAsB,CAAC,IAAI,CAAC,EAAE,CAAC;oBAClC,OAAO;gBACT,CAAC;gBAED,KAAK,MAAM,MAAM,IAAI,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC;oBAEpC,IACE,MAAM,CAAC,IAAI,KAAK,cAAc,CAAC,kBAAkB;wBACjD,MAAM,CAAC,GAAG,CAAC,IAAI,KAAK,cAAc,CAAC,UAAU,EAC7C,CAAC;wBACD,SAAS;oBACX,CAAC;oBAGD,IAAI,CAAC,SAAS,EAAE,WAAW,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC,aAAa,IAAI,EAAE,CAAC,EAAE,CAAC;wBAClE,SAAS;oBACX,CAAC;oBAGD,IAAI,MAAM,CAAC,QAAQ;wBAAE,SAAS;oBAE9B,OAAO,CAAC,MAAM,CAAC;wBACb,IAAI,EAAE,MAAM;wBACZ,SAAS,EAAE,uBAAuB;wBAClC,IAAI,EAAE;4BACJ,YAAY,EAAE,MAAM,CAAC,GAAG,CAAC,IAAI;yBAC9B;wBACD,GAAG,EAAE,CAAC,KAAK,EAAE,EAAE;4BACb,MAAM,aAAa,GAAG,MAAM,CAAC,aAAa,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC;4BAC5D,MAAM,SAAS,GAAG,UAAU,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;4BAC7C,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,GAAG,SAAS,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;4BAC1C,MAAM,WAAW,GAAG,GAAG,CAAC,UAAU,CAAC,SAAS,CAAC;gCAC3C,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,SAAS,EAAE,EAAE,CAAC;gCAC5B,CAAC,CAAC,GAAG,CAAC;4BAER,OAAO,KAAK,CAAC,WAAW,CACtB,MAAM,EACN,GAAG,aAAa,YAAY,WAAW,IAAI,KAAK,EAAE,CACnD,CAAC;wBACJ,CAAC;qBACF,CAAC,CAAC;gBACL,CAAC;YACH,CAAC;SACF,CAAC;IACJ,CAAC;CACF,CAAC,CAAC"}
|
|
@@ -1,12 +1,6 @@
|
|
|
1
1
|
import { AST_NODE_TYPES, ESLintUtils, } from "@typescript-eslint/utils";
|
|
2
2
|
import { toPascalCase } from "./utils/convertString.mjs";
|
|
3
|
-
|
|
4
|
-
* Enforce that construct IDs does not match the parent construct name.
|
|
5
|
-
* @param context - The rule context provided by ESLint
|
|
6
|
-
* @returns An object containing the AST visitor functions
|
|
7
|
-
* @see {@link https://eslint-cdk-plugin.dev/rules/no-parent-name-construct-id-match} - Documentation
|
|
8
|
-
*/
|
|
9
|
-
export var noParentNameConstructIdMatch = ESLintUtils.RuleCreator.withoutDocs({
|
|
3
|
+
export const noParentNameConstructIdMatch = ESLintUtils.RuleCreator.withoutDocs({
|
|
10
4
|
meta: {
|
|
11
5
|
type: "problem",
|
|
12
6
|
docs: {
|
|
@@ -18,87 +12,75 @@ export var noParentNameConstructIdMatch = ESLintUtils.RuleCreator.withoutDocs({
|
|
|
18
12
|
schema: [],
|
|
19
13
|
},
|
|
20
14
|
defaultOptions: [],
|
|
21
|
-
create
|
|
15
|
+
create(context) {
|
|
22
16
|
return {
|
|
23
|
-
ClassBody
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
if ((parent === null || parent === void 0 ? void 0 : parent.type) !== AST_NODE_TYPES.ClassDeclaration)
|
|
17
|
+
ClassBody(node) {
|
|
18
|
+
const parent = node.parent;
|
|
19
|
+
if (parent?.type !== AST_NODE_TYPES.ClassDeclaration)
|
|
27
20
|
return;
|
|
28
|
-
|
|
21
|
+
const parentClassName = parent.id?.name;
|
|
29
22
|
if (!parentClassName)
|
|
30
23
|
return;
|
|
31
|
-
for (
|
|
32
|
-
var body = _b[_i];
|
|
33
|
-
// NOTE: Ignore if neither method nor constructor.
|
|
24
|
+
for (const body of node.body) {
|
|
34
25
|
if (body.type !== AST_NODE_TYPES.MethodDefinition ||
|
|
35
26
|
!["method", "constructor"].includes(body.kind) ||
|
|
36
27
|
body.value.type !== AST_NODE_TYPES.FunctionExpression) {
|
|
37
28
|
continue;
|
|
38
29
|
}
|
|
39
30
|
validateConstructorBody({
|
|
40
|
-
node
|
|
31
|
+
node,
|
|
41
32
|
expression: body.value,
|
|
42
|
-
parentClassName
|
|
43
|
-
context
|
|
33
|
+
parentClassName,
|
|
34
|
+
context,
|
|
44
35
|
});
|
|
45
36
|
}
|
|
46
37
|
},
|
|
47
38
|
};
|
|
48
39
|
},
|
|
49
40
|
});
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
* - validate each statement in the constructor body
|
|
53
|
-
*/
|
|
54
|
-
var validateConstructorBody = function (_a) {
|
|
55
|
-
var _b;
|
|
56
|
-
var node = _a.node, expression = _a.expression, parentClassName = _a.parentClassName, context = _a.context;
|
|
57
|
-
for (var _i = 0, _c = expression.body.body; _i < _c.length; _i++) {
|
|
58
|
-
var statement = _c[_i];
|
|
41
|
+
const validateConstructorBody = ({ node, expression, parentClassName, context, }) => {
|
|
42
|
+
for (const statement of expression.body.body) {
|
|
59
43
|
switch (statement.type) {
|
|
60
44
|
case AST_NODE_TYPES.VariableDeclaration: {
|
|
61
|
-
|
|
62
|
-
if (
|
|
45
|
+
const newExpression = statement.declarations[0].init;
|
|
46
|
+
if (newExpression?.type !== AST_NODE_TYPES.NewExpression)
|
|
63
47
|
continue;
|
|
64
48
|
validateConstructId({
|
|
65
|
-
node
|
|
66
|
-
context
|
|
49
|
+
node,
|
|
50
|
+
context,
|
|
67
51
|
expression: newExpression,
|
|
68
|
-
parentClassName
|
|
52
|
+
parentClassName,
|
|
69
53
|
});
|
|
70
54
|
break;
|
|
71
55
|
}
|
|
72
56
|
case AST_NODE_TYPES.ExpressionStatement: {
|
|
73
|
-
if (
|
|
57
|
+
if (statement.expression?.type !== AST_NODE_TYPES.NewExpression)
|
|
74
58
|
break;
|
|
75
59
|
validateStatement({
|
|
76
|
-
node
|
|
77
|
-
statement
|
|
78
|
-
parentClassName
|
|
79
|
-
context
|
|
60
|
+
node,
|
|
61
|
+
statement,
|
|
62
|
+
parentClassName,
|
|
63
|
+
context,
|
|
80
64
|
});
|
|
81
65
|
break;
|
|
82
66
|
}
|
|
83
67
|
case AST_NODE_TYPES.IfStatement: {
|
|
84
68
|
traverseStatements({
|
|
85
|
-
node
|
|
86
|
-
context
|
|
87
|
-
parentClassName
|
|
69
|
+
node,
|
|
70
|
+
context,
|
|
71
|
+
parentClassName,
|
|
88
72
|
statement: statement.consequent,
|
|
89
73
|
});
|
|
90
74
|
break;
|
|
91
75
|
}
|
|
92
76
|
case AST_NODE_TYPES.SwitchStatement: {
|
|
93
|
-
for (
|
|
94
|
-
|
|
95
|
-
for (var _f = 0, _g = switchCase.consequent; _f < _g.length; _f++) {
|
|
96
|
-
var statement_1 = _g[_f];
|
|
77
|
+
for (const switchCase of statement.cases) {
|
|
78
|
+
for (const statement of switchCase.consequent) {
|
|
97
79
|
traverseStatements({
|
|
98
|
-
node
|
|
99
|
-
context
|
|
100
|
-
parentClassName
|
|
101
|
-
statement
|
|
80
|
+
node,
|
|
81
|
+
context,
|
|
82
|
+
parentClassName,
|
|
83
|
+
statement,
|
|
102
84
|
});
|
|
103
85
|
}
|
|
104
86
|
}
|
|
@@ -107,154 +89,124 @@ var validateConstructorBody = function (_a) {
|
|
|
107
89
|
}
|
|
108
90
|
}
|
|
109
91
|
};
|
|
110
|
-
|
|
111
|
-
* Recursively traverse and validate statements in the AST
|
|
112
|
-
* - Handles BlockStatement, ExpressionStatement, and VariableDeclaration
|
|
113
|
-
* - Validates construct IDs against parent class name
|
|
114
|
-
*/
|
|
115
|
-
var traverseStatements = function (_a) {
|
|
116
|
-
var node = _a.node, statement = _a.statement, parentClassName = _a.parentClassName, context = _a.context;
|
|
92
|
+
const traverseStatements = ({ node, statement, parentClassName, context, }) => {
|
|
117
93
|
switch (statement.type) {
|
|
118
94
|
case AST_NODE_TYPES.BlockStatement: {
|
|
119
|
-
for (
|
|
120
|
-
var body = _b[_i];
|
|
95
|
+
for (const body of statement.body) {
|
|
121
96
|
validateStatement({
|
|
122
|
-
node
|
|
97
|
+
node,
|
|
123
98
|
statement: body,
|
|
124
|
-
parentClassName
|
|
125
|
-
context
|
|
99
|
+
parentClassName,
|
|
100
|
+
context,
|
|
126
101
|
});
|
|
127
102
|
}
|
|
128
103
|
break;
|
|
129
104
|
}
|
|
130
105
|
case AST_NODE_TYPES.ExpressionStatement: {
|
|
131
|
-
|
|
132
|
-
if (
|
|
106
|
+
const newExpression = statement.expression;
|
|
107
|
+
if (newExpression?.type !== AST_NODE_TYPES.NewExpression)
|
|
133
108
|
break;
|
|
134
109
|
validateStatement({
|
|
135
|
-
node
|
|
136
|
-
statement
|
|
137
|
-
parentClassName
|
|
138
|
-
context
|
|
110
|
+
node,
|
|
111
|
+
statement,
|
|
112
|
+
parentClassName,
|
|
113
|
+
context,
|
|
139
114
|
});
|
|
140
115
|
break;
|
|
141
116
|
}
|
|
142
117
|
case AST_NODE_TYPES.VariableDeclaration: {
|
|
143
|
-
|
|
144
|
-
if (
|
|
118
|
+
const newExpression = statement.declarations[0].init;
|
|
119
|
+
if (newExpression?.type !== AST_NODE_TYPES.NewExpression)
|
|
145
120
|
break;
|
|
146
121
|
validateConstructId({
|
|
147
|
-
node
|
|
148
|
-
context
|
|
122
|
+
node,
|
|
123
|
+
context,
|
|
149
124
|
expression: newExpression,
|
|
150
|
-
parentClassName
|
|
125
|
+
parentClassName,
|
|
151
126
|
});
|
|
152
127
|
break;
|
|
153
128
|
}
|
|
154
129
|
}
|
|
155
130
|
};
|
|
156
|
-
|
|
157
|
-
* Validate a single statement in the AST
|
|
158
|
-
* - Handles different types of statements (Variable, Expression, If, Switch)
|
|
159
|
-
* - Extracts and validates construct IDs from new expressions
|
|
160
|
-
*/
|
|
161
|
-
var validateStatement = function (_a) {
|
|
162
|
-
var node = _a.node, statement = _a.statement, parentClassName = _a.parentClassName, context = _a.context;
|
|
131
|
+
const validateStatement = ({ node, statement, parentClassName, context, }) => {
|
|
163
132
|
switch (statement.type) {
|
|
164
133
|
case AST_NODE_TYPES.VariableDeclaration: {
|
|
165
|
-
|
|
166
|
-
if (
|
|
134
|
+
const newExpression = statement.declarations[0].init;
|
|
135
|
+
if (newExpression?.type !== AST_NODE_TYPES.NewExpression)
|
|
167
136
|
break;
|
|
168
137
|
validateConstructId({
|
|
169
|
-
node
|
|
170
|
-
context
|
|
138
|
+
node,
|
|
139
|
+
context,
|
|
171
140
|
expression: newExpression,
|
|
172
|
-
parentClassName
|
|
141
|
+
parentClassName,
|
|
173
142
|
});
|
|
174
143
|
break;
|
|
175
144
|
}
|
|
176
145
|
case AST_NODE_TYPES.ExpressionStatement: {
|
|
177
|
-
|
|
178
|
-
if (
|
|
146
|
+
const newExpression = statement.expression;
|
|
147
|
+
if (newExpression?.type !== AST_NODE_TYPES.NewExpression)
|
|
179
148
|
break;
|
|
180
149
|
validateConstructId({
|
|
181
|
-
node
|
|
182
|
-
context
|
|
150
|
+
node,
|
|
151
|
+
context,
|
|
183
152
|
expression: newExpression,
|
|
184
|
-
parentClassName
|
|
153
|
+
parentClassName,
|
|
185
154
|
});
|
|
186
155
|
break;
|
|
187
156
|
}
|
|
188
157
|
case AST_NODE_TYPES.IfStatement: {
|
|
189
158
|
validateIfStatement({
|
|
190
|
-
node
|
|
191
|
-
statement
|
|
192
|
-
parentClassName
|
|
193
|
-
context
|
|
159
|
+
node,
|
|
160
|
+
statement,
|
|
161
|
+
parentClassName,
|
|
162
|
+
context,
|
|
194
163
|
});
|
|
195
164
|
break;
|
|
196
165
|
}
|
|
197
166
|
case AST_NODE_TYPES.SwitchStatement: {
|
|
198
167
|
validateSwitchStatement({
|
|
199
|
-
node
|
|
200
|
-
statement
|
|
201
|
-
parentClassName
|
|
202
|
-
context
|
|
168
|
+
node,
|
|
169
|
+
statement,
|
|
170
|
+
parentClassName,
|
|
171
|
+
context,
|
|
203
172
|
});
|
|
204
173
|
break;
|
|
205
174
|
}
|
|
206
175
|
}
|
|
207
176
|
};
|
|
208
|
-
|
|
209
|
-
* Validate the `if` statement
|
|
210
|
-
* - Validate recursively if `if` statements are nested
|
|
211
|
-
*/
|
|
212
|
-
var validateIfStatement = function (_a) {
|
|
213
|
-
var node = _a.node, statement = _a.statement, parentClassName = _a.parentClassName, context = _a.context;
|
|
177
|
+
const validateIfStatement = ({ node, statement, parentClassName, context, }) => {
|
|
214
178
|
traverseStatements({
|
|
215
|
-
node
|
|
216
|
-
context
|
|
217
|
-
parentClassName
|
|
179
|
+
node,
|
|
180
|
+
context,
|
|
181
|
+
parentClassName,
|
|
218
182
|
statement: statement.consequent,
|
|
219
183
|
});
|
|
220
184
|
};
|
|
221
|
-
|
|
222
|
-
|
|
223
|
-
|
|
224
|
-
*/
|
|
225
|
-
var validateSwitchStatement = function (_a) {
|
|
226
|
-
var node = _a.node, statement = _a.statement, parentClassName = _a.parentClassName, context = _a.context;
|
|
227
|
-
for (var _i = 0, _b = statement.cases; _i < _b.length; _i++) {
|
|
228
|
-
var caseStatement = _b[_i];
|
|
229
|
-
for (var _c = 0, _d = caseStatement.consequent; _c < _d.length; _c++) {
|
|
230
|
-
var _consequent = _d[_c];
|
|
185
|
+
const validateSwitchStatement = ({ node, statement, parentClassName, context, }) => {
|
|
186
|
+
for (const caseStatement of statement.cases) {
|
|
187
|
+
for (const _consequent of caseStatement.consequent) {
|
|
231
188
|
traverseStatements({
|
|
232
|
-
node
|
|
233
|
-
context
|
|
234
|
-
parentClassName
|
|
189
|
+
node,
|
|
190
|
+
context,
|
|
191
|
+
parentClassName,
|
|
235
192
|
statement: _consequent,
|
|
236
193
|
});
|
|
237
194
|
}
|
|
238
195
|
}
|
|
239
196
|
};
|
|
240
|
-
|
|
241
|
-
* Validate that parent construct name and child id do not match
|
|
242
|
-
*/
|
|
243
|
-
var validateConstructId = function (_a) {
|
|
244
|
-
var node = _a.node, context = _a.context, expression = _a.expression, parentClassName = _a.parentClassName;
|
|
197
|
+
const validateConstructId = ({ node, context, expression, parentClassName, }) => {
|
|
245
198
|
if (expression.arguments.length < 2)
|
|
246
199
|
return;
|
|
247
|
-
|
|
248
|
-
var secondArg = expression.arguments[1];
|
|
200
|
+
const secondArg = expression.arguments[1];
|
|
249
201
|
if (secondArg.type !== AST_NODE_TYPES.Literal ||
|
|
250
202
|
typeof secondArg.value !== "string") {
|
|
251
203
|
return;
|
|
252
204
|
}
|
|
253
|
-
|
|
254
|
-
|
|
205
|
+
const formattedConstructId = toPascalCase(secondArg.value);
|
|
206
|
+
const formattedParentClassName = toPascalCase(parentClassName);
|
|
255
207
|
if (formattedParentClassName === formattedConstructId) {
|
|
256
208
|
context.report({
|
|
257
|
-
node
|
|
209
|
+
node,
|
|
258
210
|
messageId: "noParentNameConstructIdMatch",
|
|
259
211
|
data: {
|
|
260
212
|
constructId: secondArg.value,
|
|
@@ -263,3 +215,4 @@ var validateConstructId = function (_a) {
|
|
|
263
215
|
});
|
|
264
216
|
}
|
|
265
217
|
};
|
|
218
|
+
//# sourceMappingURL=no-parent-name-construct-id-match.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"no-parent-name-construct-id-match.mjs","sourceRoot":"","sources":["../src/no-parent-name-construct-id-match.mts"],"names":[],"mappings":"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"}
|
|
@@ -1,13 +1,7 @@
|
|
|
1
1
|
import { AST_NODE_TYPES, ESLintUtils, } from "@typescript-eslint/utils";
|
|
2
2
|
import { SymbolFlags } from "typescript";
|
|
3
|
-
import { isConstructOrStackType } from "./utils/
|
|
4
|
-
|
|
5
|
-
* Disallow class types in public class fields
|
|
6
|
-
* @param context - The rule context provided by ESLint
|
|
7
|
-
* @returns An object containing the AST visitor functions
|
|
8
|
-
* @see {@link https://eslint-cdk-plugin.dev/rules/no-public-class-fields} - Documentation
|
|
9
|
-
*/
|
|
10
|
-
export var noPublicClassFields = ESLintUtils.RuleCreator.withoutDocs({
|
|
3
|
+
import { isConstructOrStackType } from "./utils/typeCheck.mjs";
|
|
4
|
+
export const noPublicClassFields = ESLintUtils.RuleCreator.withoutDocs({
|
|
11
5
|
meta: {
|
|
12
6
|
type: "problem",
|
|
13
7
|
docs: {
|
|
@@ -19,67 +13,54 @@ export var noPublicClassFields = ESLintUtils.RuleCreator.withoutDocs({
|
|
|
19
13
|
schema: [],
|
|
20
14
|
},
|
|
21
15
|
defaultOptions: [],
|
|
22
|
-
create
|
|
23
|
-
|
|
24
|
-
|
|
16
|
+
create(context) {
|
|
17
|
+
const parserServices = ESLintUtils.getParserServices(context);
|
|
18
|
+
const typeChecker = parserServices.program.getTypeChecker();
|
|
25
19
|
return {
|
|
26
|
-
ClassDeclaration
|
|
27
|
-
|
|
20
|
+
ClassDeclaration(node) {
|
|
21
|
+
const type = typeChecker.getTypeAtLocation(parserServices.esTreeNodeToTSNodeMap.get(node));
|
|
28
22
|
if (!isConstructOrStackType(type)) {
|
|
29
23
|
return;
|
|
30
24
|
}
|
|
31
|
-
// NOTE: Check class members
|
|
32
25
|
validateClassMember({
|
|
33
|
-
node
|
|
34
|
-
context
|
|
35
|
-
parserServices
|
|
36
|
-
typeChecker
|
|
37
|
-
});
|
|
38
|
-
// NOTE: Check constructor parameter properties
|
|
39
|
-
var constructor = node.body.body.find(function (member) {
|
|
40
|
-
return member.type === AST_NODE_TYPES.MethodDefinition &&
|
|
41
|
-
member.kind === "constructor";
|
|
26
|
+
node,
|
|
27
|
+
context,
|
|
28
|
+
parserServices,
|
|
29
|
+
typeChecker,
|
|
42
30
|
});
|
|
31
|
+
const constructor = node.body.body.find((member) => member.type === AST_NODE_TYPES.MethodDefinition &&
|
|
32
|
+
member.kind === "constructor");
|
|
43
33
|
if (!constructor ||
|
|
44
34
|
constructor.value.type !== AST_NODE_TYPES.FunctionExpression) {
|
|
45
35
|
return;
|
|
46
36
|
}
|
|
47
37
|
validateConstructorParameterProperty({
|
|
48
|
-
constructor
|
|
49
|
-
context
|
|
50
|
-
parserServices
|
|
51
|
-
typeChecker
|
|
38
|
+
constructor,
|
|
39
|
+
context,
|
|
40
|
+
parserServices,
|
|
41
|
+
typeChecker,
|
|
52
42
|
});
|
|
53
43
|
},
|
|
54
44
|
};
|
|
55
45
|
},
|
|
56
46
|
});
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
* - if it is a class type, report an error
|
|
60
|
-
*/
|
|
61
|
-
var validateClassMember = function (_a) {
|
|
62
|
-
var _b;
|
|
63
|
-
var node = _a.node, context = _a.context, parserServices = _a.parserServices, typeChecker = _a.typeChecker;
|
|
64
|
-
for (var _i = 0, _c = node.body.body; _i < _c.length; _i++) {
|
|
65
|
-
var member = _c[_i];
|
|
47
|
+
const validateClassMember = ({ node, context, parserServices, typeChecker, }) => {
|
|
48
|
+
for (const member of node.body.body) {
|
|
66
49
|
if (member.type !== AST_NODE_TYPES.PropertyDefinition ||
|
|
67
50
|
member.key.type !== AST_NODE_TYPES.Identifier) {
|
|
68
51
|
continue;
|
|
69
52
|
}
|
|
70
|
-
|
|
71
|
-
if (["private", "protected"].includes((_b = member.accessibility) !== null && _b !== void 0 ? _b : "")) {
|
|
53
|
+
if (["private", "protected"].includes(member.accessibility ?? "")) {
|
|
72
54
|
continue;
|
|
73
55
|
}
|
|
74
|
-
// NOTE: Skip fields without type annotation
|
|
75
56
|
if (!member.typeAnnotation) {
|
|
76
57
|
continue;
|
|
77
58
|
}
|
|
78
|
-
|
|
79
|
-
|
|
59
|
+
const tsNode = parserServices.esTreeNodeToTSNodeMap.get(member);
|
|
60
|
+
const type = typeChecker.getTypeAtLocation(tsNode);
|
|
80
61
|
if (!type.symbol)
|
|
81
62
|
continue;
|
|
82
|
-
|
|
63
|
+
const isClass = type.symbol.flags === SymbolFlags.Class;
|
|
83
64
|
if (!isClass)
|
|
84
65
|
continue;
|
|
85
66
|
context.report({
|
|
@@ -92,32 +73,23 @@ var validateClassMember = function (_a) {
|
|
|
92
73
|
});
|
|
93
74
|
}
|
|
94
75
|
};
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
* - if it is a class type, report an error
|
|
98
|
-
*/
|
|
99
|
-
var validateConstructorParameterProperty = function (_a) {
|
|
100
|
-
var _b;
|
|
101
|
-
var constructor = _a.constructor, context = _a.context, parserServices = _a.parserServices, typeChecker = _a.typeChecker;
|
|
102
|
-
for (var _i = 0, _c = constructor.value.params; _i < _c.length; _i++) {
|
|
103
|
-
var param = _c[_i];
|
|
76
|
+
const validateConstructorParameterProperty = ({ constructor, context, parserServices, typeChecker, }) => {
|
|
77
|
+
for (const param of constructor.value.params) {
|
|
104
78
|
if (param.type !== AST_NODE_TYPES.TSParameterProperty ||
|
|
105
79
|
param.parameter.type !== AST_NODE_TYPES.Identifier) {
|
|
106
80
|
continue;
|
|
107
81
|
}
|
|
108
|
-
|
|
109
|
-
if (["private", "protected"].includes((_b = param.accessibility) !== null && _b !== void 0 ? _b : "")) {
|
|
82
|
+
if (["private", "protected"].includes(param.accessibility ?? "")) {
|
|
110
83
|
continue;
|
|
111
84
|
}
|
|
112
|
-
// NOTE: Skip parameters without type annotation
|
|
113
85
|
if (!param.parameter.typeAnnotation) {
|
|
114
86
|
continue;
|
|
115
87
|
}
|
|
116
|
-
|
|
117
|
-
|
|
88
|
+
const tsNode = parserServices.esTreeNodeToTSNodeMap.get(param);
|
|
89
|
+
const type = typeChecker.getTypeAtLocation(tsNode);
|
|
118
90
|
if (!type.symbol)
|
|
119
91
|
continue;
|
|
120
|
-
|
|
92
|
+
const isClass = type.symbol.flags === SymbolFlags.Class;
|
|
121
93
|
if (!isClass)
|
|
122
94
|
continue;
|
|
123
95
|
context.report({
|
|
@@ -130,3 +102,4 @@ var validateConstructorParameterProperty = function (_a) {
|
|
|
130
102
|
});
|
|
131
103
|
}
|
|
132
104
|
};
|
|
105
|
+
//# sourceMappingURL=no-public-class-fields.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"no-public-class-fields.mjs","sourceRoot":"","sources":["../src/no-public-class-fields.mts"],"names":[],"mappings":"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"}
|