@futdevpro/dynamo-eslint 1.15.22 → 1.15.28
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/.c8rc.json +26 -26
- package/.cursor/rules/__assistant_guide.mdc +30 -30
- package/.cursor/rules/__main.mdc +64 -64
- package/.cursor/rules/_ag_backend-structure.mdc +85 -85
- package/.cursor/rules/_ag_backend.mdc +16 -16
- package/.cursor/rules/_ag_debug.mdc +7 -7
- package/.cursor/rules/_ag_documentation_writing_rules.mdc +372 -372
- package/.cursor/rules/_ag_file-refactoring.mdc +113 -113
- package/.cursor/rules/_ag_fixes_rules.mdc +5 -5
- package/.cursor/rules/_ag_frontend-structure.mdc +86 -86
- package/.cursor/rules/_ag_frontend.mdc +39 -39
- package/.cursor/rules/_ag_import-rules.mdc +44 -44
- package/.cursor/rules/_ag_naming.mdc +115 -115
- package/.cursor/rules/_ag_running_commands.mdc +4 -4
- package/.cursor/rules/_ag_server-controller.mdc +5 -5
- package/.cursor/rules/_ag_should-be.mdc +6 -6
- package/.cursor/rules/_ag_swearing.mdc +47 -47
- package/.cursor/rules/ai_development_guide.md +60 -60
- package/.cursor/rules/ai_directives.md +114 -114
- package/.cursor/rules/cursor-rules.md +160 -160
- package/.cursor/rules/default-command.mdc +464 -464
- package/.cursor/rules/error_code_pattern.md +39 -39
- package/.cursor/rules/saved rule mcp server use.md +15 -15
- package/.dynamo/pipeline.cicd.config.json +184 -184
- package/.dynamo/version-bump.config.json +5 -5
- package/.eslintrc.json +4 -4
- package/.github/workflows/main.yml +436 -436
- package/.husky/pre-commit +2 -2
- package/.vscode/settings.json +11 -11
- package/README.md +319 -319
- package/__documentations/2026-04-18-ccap-review-integration.md +173 -173
- package/__documentations/2026-08-18-bfr-ctm-005-eslint9-validator-report.md +45 -0
- package/build/configs/base.d.ts +9 -9
- package/build/configs/base.js +150 -150
- package/build/configs/fsm.d.ts +1 -1
- package/build/configs/fsm.js +7 -7
- package/build/configs/ngx-package.d.ts +1 -1
- package/build/configs/ngx-package.js +7 -7
- package/build/configs/ngx.d.ts +4 -4
- package/build/configs/ngx.js +91 -91
- package/build/configs/nts-package.d.ts +1 -1
- package/build/configs/nts-package.js +17 -17
- package/build/configs/nts.d.ts +1 -1
- package/build/configs/nts.js +31 -31
- package/build/index.d.ts +1 -1
- package/build/index.js +2 -2
- package/build/plugin/index.d.ts +52 -52
- package/build/plugin/index.js +80 -80
- package/build/plugin/rules/angular/angular-for-track-logic.d.ts +7 -7
- package/build/plugin/rules/angular/angular-for-track-logic.js +81 -81
- package/build/plugin/rules/angular/effect-signal-loop.d.ts +9 -9
- package/build/plugin/rules/angular/effect-signal-loop.js +112 -112
- package/build/plugin/rules/angular/no-async-ngoninit.d.ts +8 -8
- package/build/plugin/rules/angular/no-async-ngoninit.js +42 -42
- package/build/plugin/rules/angular/no-component-direct-api.d.ts +9 -9
- package/build/plugin/rules/angular/no-component-direct-api.js +75 -75
- package/build/plugin/rules/angular/no-method-call-in-template.d.ts +8 -8
- package/build/plugin/rules/angular/no-method-call-in-template.js +79 -79
- package/build/plugin/rules/angular/no-ngfor-directive.d.ts +7 -7
- package/build/plugin/rules/angular/no-ngfor-directive.js +59 -59
- package/build/plugin/rules/angular/no-ngif-directive.d.ts +7 -7
- package/build/plugin/rules/angular/no-ngif-directive.js +59 -59
- package/build/plugin/rules/explicit-types.d.ts +3 -3
- package/build/plugin/rules/explicit-types.js +178 -178
- package/build/plugin/rules/import/import-order.d.ts +3 -3
- package/build/plugin/rules/import/import-order.js +154 -154
- package/build/plugin/rules/import/no-import-type.d.ts +3 -3
- package/build/plugin/rules/import/no-import-type.js +45 -45
- package/build/plugin/rules/import/no-js-import.d.ts +3 -3
- package/build/plugin/rules/import/no-js-import.js +40 -40
- package/build/plugin/rules/naming-patterns.d.ts +7 -7
- package/build/plugin/rules/naming-patterns.d.ts.map +1 -1
- package/build/plugin/rules/naming-patterns.js +366 -350
- package/build/plugin/rules/naming-patterns.js.map +1 -1
- package/build/plugin/rules/no-getter-logic.d.ts +3 -3
- package/build/plugin/rules/no-getter-logic.js +194 -194
- package/build/plugin/rules/prefer-enum-over-string-union.d.ts +3 -3
- package/build/plugin/rules/prefer-enum-over-string-union.js +289 -289
- package/build/plugin/rules/prefer-interface-over-duplicate-types.d.ts +3 -3
- package/build/plugin/rules/prefer-interface-over-duplicate-types.js +264 -264
- package/build/plugin/rules/require-jsdoc-description.d.ts +3 -3
- package/build/plugin/rules/require-jsdoc-description.js +496 -496
- package/build/plugin/rules/require-test-description-prefix.d.ts +3 -3
- package/build/plugin/rules/require-test-description-prefix.js +135 -135
- package/build/plugin/rules/ts/data-model-extends.d.ts +8 -8
- package/build/plugin/rules/ts/data-model-extends.js +94 -94
- package/build/plugin/rules/ts/no-any-type.d.ts +8 -8
- package/build/plugin/rules/ts/no-any-type.js +36 -36
- package/build/plugin/rules/ts/no-as-cast.d.ts +8 -8
- package/build/plugin/rules/ts/no-as-cast.js +49 -49
- package/build/plugin/rules/ts/no-dynamic-imports.d.ts +8 -8
- package/build/plugin/rules/ts/no-dynamic-imports.js +50 -50
- package/build/plugin/rules/ts/no-native-browser-dialogs.d.ts +8 -8
- package/build/plugin/rules/ts/no-native-browser-dialogs.js +78 -78
- package/build/plugin/rules/ts/no-plain-function-export.d.ts +9 -9
- package/build/plugin/rules/ts/no-plain-function-export.js +69 -69
- package/build/plugin/rules/ts/one-export-per-file.d.ts +8 -8
- package/build/plugin/rules/ts/one-export-per-file.js +73 -73
- package/build/scripts/dynamo-fix.d.ts +26 -26
- package/build/scripts/dynamo-fix.js +146 -146
- package/build/scripts/dynamo-fix.js.map +1 -1
- package/build/scripts/eslintrc-audit.d.ts +26 -26
- package/build/scripts/eslintrc-audit.js +100 -100
- package/build/scripts/fix-return-types.d.ts +74 -74
- package/build/scripts/fix-return-types.js +226 -226
- package/build/scripts/validate-imports.d.ts +26 -26
- package/build/scripts/validate-imports.js +157 -137
- package/build/scripts/validate-imports.js.map +1 -1
- package/build/scripts/validate-naming.d.ts +26 -26
- package/build/scripts/validate-naming.js +157 -123
- package/build/scripts/validate-naming.js.map +1 -1
- package/eslint.config.js +15 -15
- package/package.json +105 -105
- package/samples/.vscode/settings.json +13 -13
- package/samples/base/.eslintrc.json +6 -6
- package/samples/base/eslint.config.js +3 -3
- package/samples/fsm/.eslintrc.json +4 -4
- package/samples/fsm/eslint.config.js +3 -3
- package/samples/ngx/.eslintrc.json +6 -6
- package/samples/ngx/eslint.config.js +3 -3
- package/samples/ngx-package/.eslintrc.json +4 -4
- package/samples/ngx-package/eslint.config.js +3 -3
- package/samples/nts/.eslintrc.json +6 -6
- package/samples/nts/eslint.config.js +3 -3
- package/samples/nts-package/.eslintrc.json +4 -4
- package/samples/nts-package/eslint.config.js +3 -3
- package/samples/package.json.example +26 -26
- package/samples/poc-sample.ts +38 -38
- package/samples/poc-violations.ts +54 -54
- package/scripts/run-coverage-tests.js +24 -24
- package/spec/support/helpers/ts-node-helper.js +9 -9
- package/spec/support/jasmine.coverage.json +23 -23
- package/spec/support/jasmine.json +24 -24
- package/src/configs/base.ts +157 -157
- package/src/configs/fsm.ts +10 -10
- package/src/configs/ngx-package.ts +10 -10
- package/src/configs/ngx.ts +96 -96
- package/src/configs/nts-package.ts +20 -20
- package/src/configs/nts.ts +34 -34
- package/src/index.ts +4 -4
- package/src/plugin/index.ts +86 -86
- package/src/plugin/rules/angular/angular-for-track-logic.spec.ts +44 -44
- package/src/plugin/rules/angular/angular-for-track-logic.ts +88 -88
- package/src/plugin/rules/angular/effect-signal-loop.spec.ts +89 -89
- package/src/plugin/rules/angular/effect-signal-loop.ts +125 -125
- package/src/plugin/rules/angular/no-async-ngoninit.spec.ts +50 -50
- package/src/plugin/rules/angular/no-async-ngoninit.ts +43 -43
- package/src/plugin/rules/angular/no-component-direct-api.spec.ts +78 -78
- package/src/plugin/rules/angular/no-component-direct-api.ts +82 -82
- package/src/plugin/rules/angular/no-method-call-in-template.spec.ts +63 -63
- package/src/plugin/rules/angular/no-method-call-in-template.ts +89 -89
- package/src/plugin/rules/angular/no-ngfor-directive.spec.ts +44 -44
- package/src/plugin/rules/angular/no-ngfor-directive.ts +62 -62
- package/src/plugin/rules/angular/no-ngif-directive.spec.ts +44 -44
- package/src/plugin/rules/angular/no-ngif-directive.ts +62 -62
- package/src/plugin/rules/explicit-types.spec.ts +190 -190
- package/src/plugin/rules/explicit-types.ts +186 -186
- package/src/plugin/rules/import/import-order.spec.ts +219 -219
- package/src/plugin/rules/import/import-order.ts +197 -197
- package/src/plugin/rules/import/no-import-type.spec.ts +69 -69
- package/src/plugin/rules/import/no-import-type.ts +46 -46
- package/src/plugin/rules/import/no-js-import.spec.ts +82 -82
- package/src/plugin/rules/import/no-js-import.ts +45 -45
- package/src/plugin/rules/naming-patterns.spec.ts +189 -127
- package/src/plugin/rules/naming-patterns.ts +426 -408
- package/src/plugin/rules/no-getter-logic.spec.ts +591 -591
- package/src/plugin/rules/no-getter-logic.ts +220 -220
- package/src/plugin/rules/prefer-enum-over-string-union.spec.ts +583 -583
- package/src/plugin/rules/prefer-enum-over-string-union.ts +333 -333
- package/src/plugin/rules/prefer-interface-over-duplicate-types.spec.ts +404 -404
- package/src/plugin/rules/prefer-interface-over-duplicate-types.ts +314 -314
- package/src/plugin/rules/require-jsdoc-description.spec.ts +779 -779
- package/src/plugin/rules/require-jsdoc-description.ts +572 -572
- package/src/plugin/rules/require-test-description-prefix.spec.ts +459 -459
- package/src/plugin/rules/require-test-description-prefix.ts +154 -154
- package/src/plugin/rules/ts/data-model-extends.spec.ts +84 -84
- package/src/plugin/rules/ts/data-model-extends.ts +100 -100
- package/src/plugin/rules/ts/no-any-type.spec.ts +28 -28
- package/src/plugin/rules/ts/no-any-type.ts +36 -36
- package/src/plugin/rules/ts/no-as-cast.spec.ts +51 -51
- package/src/plugin/rules/ts/no-as-cast.ts +51 -51
- package/src/plugin/rules/ts/no-dynamic-imports.spec.ts +54 -54
- package/src/plugin/rules/ts/no-dynamic-imports.ts +49 -49
- package/src/plugin/rules/ts/no-native-browser-dialogs.spec.ts +54 -54
- package/src/plugin/rules/ts/no-native-browser-dialogs.ts +84 -84
- package/src/plugin/rules/ts/no-plain-function-export.spec.ts +72 -72
- package/src/plugin/rules/ts/no-plain-function-export.ts +73 -73
- package/src/plugin/rules/ts/one-export-per-file.spec.ts +64 -64
- package/src/plugin/rules/ts/one-export-per-file.ts +77 -77
- package/src/scripts/dynamo-fix.ts +172 -172
- package/src/scripts/eslintrc-audit.ts +116 -116
- package/src/scripts/fix-return-types.spec.ts +65 -65
- package/src/scripts/fix-return-types.ts +288 -288
- package/src/scripts/validate-imports.ts +278 -249
- package/src/scripts/validate-naming.ts +204 -176
- package/src/scripts/validator-cli.integration.spec.ts +96 -0
- package/tsconfig.json +31 -31
|
@@ -1,186 +1,186 @@
|
|
|
1
|
-
import { Rule } from 'eslint';
|
|
2
|
-
|
|
3
|
-
const rule: Rule.RuleModule = {
|
|
4
|
-
meta: {
|
|
5
|
-
type: 'suggestion',
|
|
6
|
-
docs: {
|
|
7
|
-
description: 'Enforce explicit type annotations on all TypeScript declarations',
|
|
8
|
-
recommended: true,
|
|
9
|
-
},
|
|
10
|
-
schema: [],
|
|
11
|
-
messages: {
|
|
12
|
-
missingReturnType: 'Function "{{name}}" must have an explicit return type annotation.',
|
|
13
|
-
missingArrowReturnType: 'Arrow function must have an explicit return type annotation.',
|
|
14
|
-
missingVariableType: 'Variable "{{name}}" must have an explicit type annotation.',
|
|
15
|
-
missingParameterType: 'Parameter "{{name}}" must have an explicit type annotation.',
|
|
16
|
-
missingPropertyType: 'Class property "{{name}}" must have an explicit type annotation.',
|
|
17
|
-
missingDestructuringType: 'Destructuring assignment must have explicit type annotations.',
|
|
18
|
-
},
|
|
19
|
-
},
|
|
20
|
-
create(context) {
|
|
21
|
-
return {
|
|
22
|
-
// Function declarations
|
|
23
|
-
FunctionDeclaration(node: any) {
|
|
24
|
-
try {
|
|
25
|
-
// Check return type
|
|
26
|
-
if (!node.returnType) {
|
|
27
|
-
context.report({
|
|
28
|
-
node: node.id || node, // Report on function name if available
|
|
29
|
-
messageId: 'missingReturnType',
|
|
30
|
-
data: { name: node.id?.name || 'anonymous' },
|
|
31
|
-
});
|
|
32
|
-
}
|
|
33
|
-
|
|
34
|
-
// Check function parameters with defensive checks
|
|
35
|
-
if (node.params && Array.isArray(node.params)) {
|
|
36
|
-
node.params.forEach((param: any) => {
|
|
37
|
-
try {
|
|
38
|
-
if (param && param.type === 'Identifier' && !param.typeAnnotation) {
|
|
39
|
-
context.report({
|
|
40
|
-
node: param,
|
|
41
|
-
messageId: 'missingParameterType',
|
|
42
|
-
data: { name: param.name || 'unknown' },
|
|
43
|
-
});
|
|
44
|
-
}
|
|
45
|
-
} catch (paramError) {
|
|
46
|
-
console.error('[explicit-types] Error processing function parameter:', paramError);
|
|
47
|
-
}
|
|
48
|
-
});
|
|
49
|
-
}
|
|
50
|
-
} catch (error) {
|
|
51
|
-
console.error('[explicit-types] Error in FunctionDeclaration visitor:', error);
|
|
52
|
-
}
|
|
53
|
-
},
|
|
54
|
-
|
|
55
|
-
// Arrow functions
|
|
56
|
-
ArrowFunctionExpression(node: any) {
|
|
57
|
-
try {
|
|
58
|
-
// Check return type
|
|
59
|
-
if (!node.returnType) {
|
|
60
|
-
context.report({
|
|
61
|
-
node: node.params.length > 0 ? node.params[0] : node, // Report on first param or node
|
|
62
|
-
messageId: 'missingArrowReturnType',
|
|
63
|
-
});
|
|
64
|
-
}
|
|
65
|
-
|
|
66
|
-
// Check arrow function parameters with defensive checks
|
|
67
|
-
if (node.params && Array.isArray(node.params)) {
|
|
68
|
-
node.params.forEach((param: any) => {
|
|
69
|
-
try {
|
|
70
|
-
if (param && param.type === 'Identifier' && !param.typeAnnotation) {
|
|
71
|
-
context.report({
|
|
72
|
-
node: param,
|
|
73
|
-
messageId: 'missingParameterType',
|
|
74
|
-
data: { name: param.name || 'unknown' },
|
|
75
|
-
});
|
|
76
|
-
}
|
|
77
|
-
} catch (paramError) {
|
|
78
|
-
console.error('[explicit-types] Error processing arrow function parameter:', paramError);
|
|
79
|
-
}
|
|
80
|
-
});
|
|
81
|
-
}
|
|
82
|
-
} catch (error) {
|
|
83
|
-
console.error('[explicit-types] Error in ArrowFunctionExpression visitor:', error);
|
|
84
|
-
}
|
|
85
|
-
},
|
|
86
|
-
|
|
87
|
-
// Variable declarations
|
|
88
|
-
VariableDeclarator(node: any) {
|
|
89
|
-
try {
|
|
90
|
-
// Defensive check for node.id
|
|
91
|
-
if (!node.id) {
|
|
92
|
-
return;
|
|
93
|
-
}
|
|
94
|
-
|
|
95
|
-
if (!node.id.typeAnnotation) {
|
|
96
|
-
// Check if this variable is declared in a for loop
|
|
97
|
-
let isInForLoop = false;
|
|
98
|
-
let parent = node.parent;
|
|
99
|
-
|
|
100
|
-
while (parent) {
|
|
101
|
-
if (parent.type === 'ForStatement' || parent.type === 'ForInStatement' || parent.type === 'ForOfStatement') {
|
|
102
|
-
isInForLoop = true;
|
|
103
|
-
break;
|
|
104
|
-
}
|
|
105
|
-
parent = parent.parent;
|
|
106
|
-
}
|
|
107
|
-
|
|
108
|
-
// Skip if variable is in a for loop
|
|
109
|
-
if (isInForLoop) {
|
|
110
|
-
return;
|
|
111
|
-
}
|
|
112
|
-
|
|
113
|
-
// Skip if variable is initialized with a typed value that can be inferred
|
|
114
|
-
const hasTypedInitializer = node.init && (
|
|
115
|
-
node.init.type === 'CallExpression' ||
|
|
116
|
-
node.init.type === 'NewExpression' ||
|
|
117
|
-
node.init.type === 'ArrayExpression' ||
|
|
118
|
-
node.init.type === 'ObjectExpression' ||
|
|
119
|
-
node.init.type === 'Literal'
|
|
120
|
-
);
|
|
121
|
-
|
|
122
|
-
if (!hasTypedInitializer) {
|
|
123
|
-
context.report({
|
|
124
|
-
node: node.id,
|
|
125
|
-
messageId: 'missingVariableType',
|
|
126
|
-
data: { name: (node.id as any)?.name || 'destructured' },
|
|
127
|
-
});
|
|
128
|
-
}
|
|
129
|
-
}
|
|
130
|
-
} catch (error) {
|
|
131
|
-
console.error('[explicit-types] Error in VariableDeclarator visitor:', error);
|
|
132
|
-
}
|
|
133
|
-
},
|
|
134
|
-
|
|
135
|
-
// Class properties
|
|
136
|
-
PropertyDefinition(node: any) {
|
|
137
|
-
try {
|
|
138
|
-
// Defensive check for node.key
|
|
139
|
-
if (!node.key) {
|
|
140
|
-
return;
|
|
141
|
-
}
|
|
142
|
-
|
|
143
|
-
if (!node.typeAnnotation && !node.value) {
|
|
144
|
-
context.report({
|
|
145
|
-
node: node.key,
|
|
146
|
-
messageId: 'missingPropertyType',
|
|
147
|
-
data: { name: (node.key as any)?.name || 'computed' },
|
|
148
|
-
});
|
|
149
|
-
}
|
|
150
|
-
} catch (error) {
|
|
151
|
-
console.error('[explicit-types] Error in PropertyDefinition visitor:', error);
|
|
152
|
-
}
|
|
153
|
-
},
|
|
154
|
-
|
|
155
|
-
// Object destructuring
|
|
156
|
-
ObjectPattern(node: any) {
|
|
157
|
-
try {
|
|
158
|
-
if (!node.typeAnnotation) {
|
|
159
|
-
context.report({
|
|
160
|
-
node,
|
|
161
|
-
messageId: 'missingDestructuringType',
|
|
162
|
-
});
|
|
163
|
-
}
|
|
164
|
-
} catch (error) {
|
|
165
|
-
console.error('[explicit-types] Error in ObjectPattern visitor:', error);
|
|
166
|
-
}
|
|
167
|
-
},
|
|
168
|
-
|
|
169
|
-
// Array destructuring
|
|
170
|
-
ArrayPattern(node: any) {
|
|
171
|
-
try {
|
|
172
|
-
if (!node.typeAnnotation) {
|
|
173
|
-
context.report({
|
|
174
|
-
node,
|
|
175
|
-
messageId: 'missingDestructuringType',
|
|
176
|
-
});
|
|
177
|
-
}
|
|
178
|
-
} catch (error) {
|
|
179
|
-
console.error('[explicit-types] Error in ArrayPattern visitor:', error);
|
|
180
|
-
}
|
|
181
|
-
},
|
|
182
|
-
};
|
|
183
|
-
},
|
|
184
|
-
};
|
|
185
|
-
|
|
186
|
-
export default rule;
|
|
1
|
+
import { Rule } from 'eslint';
|
|
2
|
+
|
|
3
|
+
const rule: Rule.RuleModule = {
|
|
4
|
+
meta: {
|
|
5
|
+
type: 'suggestion',
|
|
6
|
+
docs: {
|
|
7
|
+
description: 'Enforce explicit type annotations on all TypeScript declarations',
|
|
8
|
+
recommended: true,
|
|
9
|
+
},
|
|
10
|
+
schema: [],
|
|
11
|
+
messages: {
|
|
12
|
+
missingReturnType: 'Function "{{name}}" must have an explicit return type annotation.',
|
|
13
|
+
missingArrowReturnType: 'Arrow function must have an explicit return type annotation.',
|
|
14
|
+
missingVariableType: 'Variable "{{name}}" must have an explicit type annotation.',
|
|
15
|
+
missingParameterType: 'Parameter "{{name}}" must have an explicit type annotation.',
|
|
16
|
+
missingPropertyType: 'Class property "{{name}}" must have an explicit type annotation.',
|
|
17
|
+
missingDestructuringType: 'Destructuring assignment must have explicit type annotations.',
|
|
18
|
+
},
|
|
19
|
+
},
|
|
20
|
+
create(context) {
|
|
21
|
+
return {
|
|
22
|
+
// Function declarations
|
|
23
|
+
FunctionDeclaration(node: any) {
|
|
24
|
+
try {
|
|
25
|
+
// Check return type
|
|
26
|
+
if (!node.returnType) {
|
|
27
|
+
context.report({
|
|
28
|
+
node: node.id || node, // Report on function name if available
|
|
29
|
+
messageId: 'missingReturnType',
|
|
30
|
+
data: { name: node.id?.name || 'anonymous' },
|
|
31
|
+
});
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
// Check function parameters with defensive checks
|
|
35
|
+
if (node.params && Array.isArray(node.params)) {
|
|
36
|
+
node.params.forEach((param: any) => {
|
|
37
|
+
try {
|
|
38
|
+
if (param && param.type === 'Identifier' && !param.typeAnnotation) {
|
|
39
|
+
context.report({
|
|
40
|
+
node: param,
|
|
41
|
+
messageId: 'missingParameterType',
|
|
42
|
+
data: { name: param.name || 'unknown' },
|
|
43
|
+
});
|
|
44
|
+
}
|
|
45
|
+
} catch (paramError) {
|
|
46
|
+
console.error('[explicit-types] Error processing function parameter:', paramError);
|
|
47
|
+
}
|
|
48
|
+
});
|
|
49
|
+
}
|
|
50
|
+
} catch (error) {
|
|
51
|
+
console.error('[explicit-types] Error in FunctionDeclaration visitor:', error);
|
|
52
|
+
}
|
|
53
|
+
},
|
|
54
|
+
|
|
55
|
+
// Arrow functions
|
|
56
|
+
ArrowFunctionExpression(node: any) {
|
|
57
|
+
try {
|
|
58
|
+
// Check return type
|
|
59
|
+
if (!node.returnType) {
|
|
60
|
+
context.report({
|
|
61
|
+
node: node.params.length > 0 ? node.params[0] : node, // Report on first param or node
|
|
62
|
+
messageId: 'missingArrowReturnType',
|
|
63
|
+
});
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
// Check arrow function parameters with defensive checks
|
|
67
|
+
if (node.params && Array.isArray(node.params)) {
|
|
68
|
+
node.params.forEach((param: any) => {
|
|
69
|
+
try {
|
|
70
|
+
if (param && param.type === 'Identifier' && !param.typeAnnotation) {
|
|
71
|
+
context.report({
|
|
72
|
+
node: param,
|
|
73
|
+
messageId: 'missingParameterType',
|
|
74
|
+
data: { name: param.name || 'unknown' },
|
|
75
|
+
});
|
|
76
|
+
}
|
|
77
|
+
} catch (paramError) {
|
|
78
|
+
console.error('[explicit-types] Error processing arrow function parameter:', paramError);
|
|
79
|
+
}
|
|
80
|
+
});
|
|
81
|
+
}
|
|
82
|
+
} catch (error) {
|
|
83
|
+
console.error('[explicit-types] Error in ArrowFunctionExpression visitor:', error);
|
|
84
|
+
}
|
|
85
|
+
},
|
|
86
|
+
|
|
87
|
+
// Variable declarations
|
|
88
|
+
VariableDeclarator(node: any) {
|
|
89
|
+
try {
|
|
90
|
+
// Defensive check for node.id
|
|
91
|
+
if (!node.id) {
|
|
92
|
+
return;
|
|
93
|
+
}
|
|
94
|
+
|
|
95
|
+
if (!node.id.typeAnnotation) {
|
|
96
|
+
// Check if this variable is declared in a for loop
|
|
97
|
+
let isInForLoop = false;
|
|
98
|
+
let parent = node.parent;
|
|
99
|
+
|
|
100
|
+
while (parent) {
|
|
101
|
+
if (parent.type === 'ForStatement' || parent.type === 'ForInStatement' || parent.type === 'ForOfStatement') {
|
|
102
|
+
isInForLoop = true;
|
|
103
|
+
break;
|
|
104
|
+
}
|
|
105
|
+
parent = parent.parent;
|
|
106
|
+
}
|
|
107
|
+
|
|
108
|
+
// Skip if variable is in a for loop
|
|
109
|
+
if (isInForLoop) {
|
|
110
|
+
return;
|
|
111
|
+
}
|
|
112
|
+
|
|
113
|
+
// Skip if variable is initialized with a typed value that can be inferred
|
|
114
|
+
const hasTypedInitializer = node.init && (
|
|
115
|
+
node.init.type === 'CallExpression' ||
|
|
116
|
+
node.init.type === 'NewExpression' ||
|
|
117
|
+
node.init.type === 'ArrayExpression' ||
|
|
118
|
+
node.init.type === 'ObjectExpression' ||
|
|
119
|
+
node.init.type === 'Literal'
|
|
120
|
+
);
|
|
121
|
+
|
|
122
|
+
if (!hasTypedInitializer) {
|
|
123
|
+
context.report({
|
|
124
|
+
node: node.id,
|
|
125
|
+
messageId: 'missingVariableType',
|
|
126
|
+
data: { name: (node.id as any)?.name || 'destructured' },
|
|
127
|
+
});
|
|
128
|
+
}
|
|
129
|
+
}
|
|
130
|
+
} catch (error) {
|
|
131
|
+
console.error('[explicit-types] Error in VariableDeclarator visitor:', error);
|
|
132
|
+
}
|
|
133
|
+
},
|
|
134
|
+
|
|
135
|
+
// Class properties
|
|
136
|
+
PropertyDefinition(node: any) {
|
|
137
|
+
try {
|
|
138
|
+
// Defensive check for node.key
|
|
139
|
+
if (!node.key) {
|
|
140
|
+
return;
|
|
141
|
+
}
|
|
142
|
+
|
|
143
|
+
if (!node.typeAnnotation && !node.value) {
|
|
144
|
+
context.report({
|
|
145
|
+
node: node.key,
|
|
146
|
+
messageId: 'missingPropertyType',
|
|
147
|
+
data: { name: (node.key as any)?.name || 'computed' },
|
|
148
|
+
});
|
|
149
|
+
}
|
|
150
|
+
} catch (error) {
|
|
151
|
+
console.error('[explicit-types] Error in PropertyDefinition visitor:', error);
|
|
152
|
+
}
|
|
153
|
+
},
|
|
154
|
+
|
|
155
|
+
// Object destructuring
|
|
156
|
+
ObjectPattern(node: any) {
|
|
157
|
+
try {
|
|
158
|
+
if (!node.typeAnnotation) {
|
|
159
|
+
context.report({
|
|
160
|
+
node,
|
|
161
|
+
messageId: 'missingDestructuringType',
|
|
162
|
+
});
|
|
163
|
+
}
|
|
164
|
+
} catch (error) {
|
|
165
|
+
console.error('[explicit-types] Error in ObjectPattern visitor:', error);
|
|
166
|
+
}
|
|
167
|
+
},
|
|
168
|
+
|
|
169
|
+
// Array destructuring
|
|
170
|
+
ArrayPattern(node: any) {
|
|
171
|
+
try {
|
|
172
|
+
if (!node.typeAnnotation) {
|
|
173
|
+
context.report({
|
|
174
|
+
node,
|
|
175
|
+
messageId: 'missingDestructuringType',
|
|
176
|
+
});
|
|
177
|
+
}
|
|
178
|
+
} catch (error) {
|
|
179
|
+
console.error('[explicit-types] Error in ArrayPattern visitor:', error);
|
|
180
|
+
}
|
|
181
|
+
},
|
|
182
|
+
};
|
|
183
|
+
},
|
|
184
|
+
};
|
|
185
|
+
|
|
186
|
+
export default rule;
|