@defai.digital/ax-cli 3.15.21 → 3.15.24

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.
Files changed (261) hide show
  1. package/README.md +22 -2
  2. package/dist/agent/agent-executor.d.ts +1 -1
  3. package/dist/agent/agent-executor.js +15 -17
  4. package/dist/agent/agent-executor.js.map +1 -1
  5. package/dist/agent/execution/tool-executor.d.ts +6 -0
  6. package/dist/agent/execution/tool-executor.js +16 -1
  7. package/dist/agent/execution/tool-executor.js.map +1 -1
  8. package/dist/agent/llm-agent.js +91 -22
  9. package/dist/agent/llm-agent.js.map +1 -1
  10. package/dist/agent/parallel-tools.d.ts +65 -0
  11. package/dist/agent/parallel-tools.js +146 -0
  12. package/dist/agent/parallel-tools.js.map +1 -0
  13. package/dist/llm/tools.js +1 -1
  14. package/dist/llm/tools.js.map +1 -1
  15. package/dist/ui/components/chat-interface.js +14 -0
  16. package/dist/ui/components/chat-interface.js.map +1 -1
  17. package/dist/ui/hooks/use-input-handler.js +2 -2
  18. package/dist/ui/hooks/use-input-handler.js.map +1 -1
  19. package/dist/ui/utils/image-handler.js +8 -5
  20. package/dist/ui/utils/image-handler.js.map +1 -1
  21. package/package.json +1 -1
  22. package/dist/analyzers/architecture/anti-pattern-detectors/god-object-detector.d.ts +0 -29
  23. package/dist/analyzers/architecture/anti-pattern-detectors/god-object-detector.js +0 -103
  24. package/dist/analyzers/architecture/anti-pattern-detectors/god-object-detector.js.map +0 -1
  25. package/dist/analyzers/architecture/architecture-analyzer.d.ts +0 -58
  26. package/dist/analyzers/architecture/architecture-analyzer.js +0 -276
  27. package/dist/analyzers/architecture/architecture-analyzer.js.map +0 -1
  28. package/dist/analyzers/architecture/index.d.ts +0 -12
  29. package/dist/analyzers/architecture/index.js +0 -14
  30. package/dist/analyzers/architecture/index.js.map +0 -1
  31. package/dist/analyzers/architecture/pattern-detectors/base-detector.d.ts +0 -27
  32. package/dist/analyzers/architecture/pattern-detectors/base-detector.js +0 -31
  33. package/dist/analyzers/architecture/pattern-detectors/base-detector.js.map +0 -1
  34. package/dist/analyzers/architecture/pattern-detectors/clean-architecture-detector.d.ts +0 -11
  35. package/dist/analyzers/architecture/pattern-detectors/clean-architecture-detector.js +0 -57
  36. package/dist/analyzers/architecture/pattern-detectors/clean-architecture-detector.js.map +0 -1
  37. package/dist/analyzers/architecture/pattern-detectors/mvc-detector.d.ts +0 -11
  38. package/dist/analyzers/architecture/pattern-detectors/mvc-detector.js +0 -43
  39. package/dist/analyzers/architecture/pattern-detectors/mvc-detector.js.map +0 -1
  40. package/dist/analyzers/architecture/pattern-detectors/repository-detector.d.ts +0 -11
  41. package/dist/analyzers/architecture/pattern-detectors/repository-detector.js +0 -49
  42. package/dist/analyzers/architecture/pattern-detectors/repository-detector.js.map +0 -1
  43. package/dist/analyzers/architecture/project-structure-scanner.d.ts +0 -54
  44. package/dist/analyzers/architecture/project-structure-scanner.js +0 -204
  45. package/dist/analyzers/architecture/project-structure-scanner.js.map +0 -1
  46. package/dist/analyzers/ast/index.d.ts +0 -13
  47. package/dist/analyzers/ast/index.js +0 -16
  48. package/dist/analyzers/ast/index.js.map +0 -1
  49. package/dist/analyzers/ast/language-parser.d.ts +0 -59
  50. package/dist/analyzers/ast/language-parser.js +0 -107
  51. package/dist/analyzers/ast/language-parser.js.map +0 -1
  52. package/dist/analyzers/ast/multi-language-parser.d.ts +0 -79
  53. package/dist/analyzers/ast/multi-language-parser.js +0 -157
  54. package/dist/analyzers/ast/multi-language-parser.js.map +0 -1
  55. package/dist/analyzers/ast/node-helpers.d.ts +0 -81
  56. package/dist/analyzers/ast/node-helpers.js +0 -128
  57. package/dist/analyzers/ast/node-helpers.js.map +0 -1
  58. package/dist/analyzers/ast/parser.d.ts +0 -60
  59. package/dist/analyzers/ast/parser.js +0 -305
  60. package/dist/analyzers/ast/parser.js.map +0 -1
  61. package/dist/analyzers/ast/traverser.d.ts +0 -67
  62. package/dist/analyzers/ast/traverser.js +0 -156
  63. package/dist/analyzers/ast/traverser.js.map +0 -1
  64. package/dist/analyzers/ast/types.d.ts +0 -107
  65. package/dist/analyzers/ast/types.js +0 -7
  66. package/dist/analyzers/ast/types.js.map +0 -1
  67. package/dist/analyzers/best-practices/base-rule.d.ts +0 -45
  68. package/dist/analyzers/best-practices/base-rule.js +0 -45
  69. package/dist/analyzers/best-practices/base-rule.js.map +0 -1
  70. package/dist/analyzers/best-practices/best-practice-validator.d.ts +0 -35
  71. package/dist/analyzers/best-practices/best-practice-validator.js +0 -181
  72. package/dist/analyzers/best-practices/best-practice-validator.js.map +0 -1
  73. package/dist/analyzers/best-practices/index.d.ts +0 -10
  74. package/dist/analyzers/best-practices/index.js +0 -11
  75. package/dist/analyzers/best-practices/index.js.map +0 -1
  76. package/dist/analyzers/best-practices/rules/index.d.ts +0 -7
  77. package/dist/analyzers/best-practices/rules/index.js +0 -56
  78. package/dist/analyzers/best-practices/rules/index.js.map +0 -1
  79. package/dist/analyzers/best-practices/rules/typescript/consistent-naming.d.ts +0 -17
  80. package/dist/analyzers/best-practices/rules/typescript/consistent-naming.js +0 -41
  81. package/dist/analyzers/best-practices/rules/typescript/consistent-naming.js.map +0 -1
  82. package/dist/analyzers/best-practices/rules/typescript/function-complexity.d.ts +0 -27
  83. package/dist/analyzers/best-practices/rules/typescript/function-complexity.js +0 -76
  84. package/dist/analyzers/best-practices/rules/typescript/function-complexity.js.map +0 -1
  85. package/dist/analyzers/best-practices/rules/typescript/index.d.ts +0 -15
  86. package/dist/analyzers/best-practices/rules/typescript/index.js +0 -16
  87. package/dist/analyzers/best-practices/rules/typescript/index.js.map +0 -1
  88. package/dist/analyzers/best-practices/rules/typescript/max-file-length.d.ts +0 -18
  89. package/dist/analyzers/best-practices/rules/typescript/max-file-length.js +0 -25
  90. package/dist/analyzers/best-practices/rules/typescript/max-file-length.js.map +0 -1
  91. package/dist/analyzers/best-practices/rules/typescript/no-any-type.d.ts +0 -17
  92. package/dist/analyzers/best-practices/rules/typescript/no-any-type.js +0 -27
  93. package/dist/analyzers/best-practices/rules/typescript/no-any-type.js.map +0 -1
  94. package/dist/analyzers/best-practices/rules/typescript/no-implicit-any.d.ts +0 -18
  95. package/dist/analyzers/best-practices/rules/typescript/no-implicit-any.js +0 -39
  96. package/dist/analyzers/best-practices/rules/typescript/no-implicit-any.js.map +0 -1
  97. package/dist/analyzers/best-practices/rules/typescript/no-magic-numbers.d.ts +0 -17
  98. package/dist/analyzers/best-practices/rules/typescript/no-magic-numbers.js +0 -38
  99. package/dist/analyzers/best-practices/rules/typescript/no-magic-numbers.js.map +0 -1
  100. package/dist/analyzers/best-practices/rules/typescript/no-unused-vars.d.ts +0 -17
  101. package/dist/analyzers/best-practices/rules/typescript/no-unused-vars.js +0 -38
  102. package/dist/analyzers/best-practices/rules/typescript/no-unused-vars.js.map +0 -1
  103. package/dist/analyzers/best-practices/rules/typescript/prefer-const.d.ts +0 -17
  104. package/dist/analyzers/best-practices/rules/typescript/prefer-const.js +0 -35
  105. package/dist/analyzers/best-practices/rules/typescript/prefer-const.js.map +0 -1
  106. package/dist/analyzers/best-practices/rules/typescript/prefer-readonly.d.ts +0 -17
  107. package/dist/analyzers/best-practices/rules/typescript/prefer-readonly.js +0 -36
  108. package/dist/analyzers/best-practices/rules/typescript/prefer-readonly.js.map +0 -1
  109. package/dist/analyzers/best-practices/rules/typescript/proper-error-handling.d.ts +0 -17
  110. package/dist/analyzers/best-practices/rules/typescript/proper-error-handling.js +0 -27
  111. package/dist/analyzers/best-practices/rules/typescript/proper-error-handling.js.map +0 -1
  112. package/dist/analyzers/best-practices/types.d.ts +0 -86
  113. package/dist/analyzers/best-practices/types.js +0 -7
  114. package/dist/analyzers/best-practices/types.js.map +0 -1
  115. package/dist/analyzers/cache/analysis-cache.d.ts +0 -41
  116. package/dist/analyzers/cache/analysis-cache.js +0 -84
  117. package/dist/analyzers/cache/analysis-cache.js.map +0 -1
  118. package/dist/analyzers/code-smells/base-smell-detector.d.ts +0 -30
  119. package/dist/analyzers/code-smells/base-smell-detector.js +0 -44
  120. package/dist/analyzers/code-smells/base-smell-detector.js.map +0 -1
  121. package/dist/analyzers/code-smells/code-smell-analyzer.d.ts +0 -30
  122. package/dist/analyzers/code-smells/code-smell-analyzer.js +0 -167
  123. package/dist/analyzers/code-smells/code-smell-analyzer.js.map +0 -1
  124. package/dist/analyzers/code-smells/detectors/data-clumps-detector.d.ts +0 -11
  125. package/dist/analyzers/code-smells/detectors/data-clumps-detector.js +0 -64
  126. package/dist/analyzers/code-smells/detectors/data-clumps-detector.js.map +0 -1
  127. package/dist/analyzers/code-smells/detectors/dead-code-detector.d.ts +0 -11
  128. package/dist/analyzers/code-smells/detectors/dead-code-detector.js +0 -58
  129. package/dist/analyzers/code-smells/detectors/dead-code-detector.js.map +0 -1
  130. package/dist/analyzers/code-smells/detectors/duplicate-code-detector.d.ts +0 -11
  131. package/dist/analyzers/code-smells/detectors/duplicate-code-detector.js +0 -69
  132. package/dist/analyzers/code-smells/detectors/duplicate-code-detector.js.map +0 -1
  133. package/dist/analyzers/code-smells/detectors/feature-envy-detector.d.ts +0 -11
  134. package/dist/analyzers/code-smells/detectors/feature-envy-detector.js +0 -70
  135. package/dist/analyzers/code-smells/detectors/feature-envy-detector.js.map +0 -1
  136. package/dist/analyzers/code-smells/detectors/inappropriate-intimacy-detector.d.ts +0 -11
  137. package/dist/analyzers/code-smells/detectors/inappropriate-intimacy-detector.js +0 -59
  138. package/dist/analyzers/code-smells/detectors/inappropriate-intimacy-detector.js.map +0 -1
  139. package/dist/analyzers/code-smells/detectors/large-class-detector.d.ts +0 -13
  140. package/dist/analyzers/code-smells/detectors/large-class-detector.js +0 -61
  141. package/dist/analyzers/code-smells/detectors/large-class-detector.js.map +0 -1
  142. package/dist/analyzers/code-smells/detectors/long-method-detector.d.ts +0 -12
  143. package/dist/analyzers/code-smells/detectors/long-method-detector.js +0 -55
  144. package/dist/analyzers/code-smells/detectors/long-method-detector.js.map +0 -1
  145. package/dist/analyzers/code-smells/detectors/long-parameter-list-detector.d.ts +0 -12
  146. package/dist/analyzers/code-smells/detectors/long-parameter-list-detector.js +0 -53
  147. package/dist/analyzers/code-smells/detectors/long-parameter-list-detector.js.map +0 -1
  148. package/dist/analyzers/code-smells/detectors/magic-numbers-detector.d.ts +0 -12
  149. package/dist/analyzers/code-smells/detectors/magic-numbers-detector.js +0 -56
  150. package/dist/analyzers/code-smells/detectors/magic-numbers-detector.js.map +0 -1
  151. package/dist/analyzers/code-smells/detectors/nested-conditionals-detector.d.ts +0 -13
  152. package/dist/analyzers/code-smells/detectors/nested-conditionals-detector.js +0 -77
  153. package/dist/analyzers/code-smells/detectors/nested-conditionals-detector.js.map +0 -1
  154. package/dist/analyzers/code-smells/index.d.ts +0 -16
  155. package/dist/analyzers/code-smells/index.js +0 -19
  156. package/dist/analyzers/code-smells/index.js.map +0 -1
  157. package/dist/analyzers/code-smells/types.d.ts +0 -82
  158. package/dist/analyzers/code-smells/types.js +0 -30
  159. package/dist/analyzers/code-smells/types.js.map +0 -1
  160. package/dist/analyzers/dependency/circular-detector.d.ts +0 -17
  161. package/dist/analyzers/dependency/circular-detector.js +0 -73
  162. package/dist/analyzers/dependency/circular-detector.js.map +0 -1
  163. package/dist/analyzers/dependency/coupling-calculator.d.ts +0 -24
  164. package/dist/analyzers/dependency/coupling-calculator.js +0 -86
  165. package/dist/analyzers/dependency/coupling-calculator.js.map +0 -1
  166. package/dist/analyzers/dependency/dependency-analyzer.d.ts +0 -44
  167. package/dist/analyzers/dependency/dependency-analyzer.js +0 -218
  168. package/dist/analyzers/dependency/dependency-analyzer.js.map +0 -1
  169. package/dist/analyzers/dependency/dependency-graph.d.ts +0 -57
  170. package/dist/analyzers/dependency/dependency-graph.js +0 -198
  171. package/dist/analyzers/dependency/dependency-graph.js.map +0 -1
  172. package/dist/analyzers/dependency/index.d.ts +0 -8
  173. package/dist/analyzers/dependency/index.js +0 -8
  174. package/dist/analyzers/dependency/index.js.map +0 -1
  175. package/dist/analyzers/dependency/types.d.ts +0 -105
  176. package/dist/analyzers/dependency/types.js +0 -5
  177. package/dist/analyzers/dependency/types.js.map +0 -1
  178. package/dist/analyzers/errors.d.ts +0 -51
  179. package/dist/analyzers/errors.js +0 -79
  180. package/dist/analyzers/errors.js.map +0 -1
  181. package/dist/analyzers/git/churn-calculator.d.ts +0 -36
  182. package/dist/analyzers/git/churn-calculator.js +0 -257
  183. package/dist/analyzers/git/churn-calculator.js.map +0 -1
  184. package/dist/analyzers/git/git-analyzer.d.ts +0 -19
  185. package/dist/analyzers/git/git-analyzer.js +0 -79
  186. package/dist/analyzers/git/git-analyzer.js.map +0 -1
  187. package/dist/analyzers/git/hotspot-detector.d.ts +0 -34
  188. package/dist/analyzers/git/hotspot-detector.js +0 -173
  189. package/dist/analyzers/git/hotspot-detector.js.map +0 -1
  190. package/dist/analyzers/git/index.d.ts +0 -7
  191. package/dist/analyzers/git/index.js +0 -7
  192. package/dist/analyzers/git/index.js.map +0 -1
  193. package/dist/analyzers/git/types.d.ts +0 -88
  194. package/dist/analyzers/git/types.js +0 -5
  195. package/dist/analyzers/git/types.js.map +0 -1
  196. package/dist/analyzers/metrics/halstead-calculator.d.ts +0 -30
  197. package/dist/analyzers/metrics/halstead-calculator.js +0 -150
  198. package/dist/analyzers/metrics/halstead-calculator.js.map +0 -1
  199. package/dist/analyzers/metrics/index.d.ts +0 -9
  200. package/dist/analyzers/metrics/index.js +0 -9
  201. package/dist/analyzers/metrics/index.js.map +0 -1
  202. package/dist/analyzers/metrics/maintainability-calculator.d.ts +0 -17
  203. package/dist/analyzers/metrics/maintainability-calculator.js +0 -46
  204. package/dist/analyzers/metrics/maintainability-calculator.js.map +0 -1
  205. package/dist/analyzers/metrics/metrics-analyzer.d.ts +0 -32
  206. package/dist/analyzers/metrics/metrics-analyzer.js +0 -144
  207. package/dist/analyzers/metrics/metrics-analyzer.js.map +0 -1
  208. package/dist/analyzers/metrics/types.d.ts +0 -67
  209. package/dist/analyzers/metrics/types.js +0 -5
  210. package/dist/analyzers/metrics/types.js.map +0 -1
  211. package/dist/analyzers/security/base-detector.d.ts +0 -58
  212. package/dist/analyzers/security/base-detector.js +0 -104
  213. package/dist/analyzers/security/base-detector.js.map +0 -1
  214. package/dist/analyzers/security/detectors/command-injection-detector.d.ts +0 -12
  215. package/dist/analyzers/security/detectors/command-injection-detector.js +0 -84
  216. package/dist/analyzers/security/detectors/command-injection-detector.js.map +0 -1
  217. package/dist/analyzers/security/detectors/hardcoded-secrets-detector.d.ts +0 -16
  218. package/dist/analyzers/security/detectors/hardcoded-secrets-detector.js +0 -140
  219. package/dist/analyzers/security/detectors/hardcoded-secrets-detector.js.map +0 -1
  220. package/dist/analyzers/security/detectors/insecure-deserialization-detector.d.ts +0 -12
  221. package/dist/analyzers/security/detectors/insecure-deserialization-detector.js +0 -109
  222. package/dist/analyzers/security/detectors/insecure-deserialization-detector.js.map +0 -1
  223. package/dist/analyzers/security/detectors/insecure-random-detector.d.ts +0 -12
  224. package/dist/analyzers/security/detectors/insecure-random-detector.js +0 -61
  225. package/dist/analyzers/security/detectors/insecure-random-detector.js.map +0 -1
  226. package/dist/analyzers/security/detectors/path-traversal-detector.d.ts +0 -12
  227. package/dist/analyzers/security/detectors/path-traversal-detector.js +0 -82
  228. package/dist/analyzers/security/detectors/path-traversal-detector.js.map +0 -1
  229. package/dist/analyzers/security/detectors/sql-injection-detector.d.ts +0 -12
  230. package/dist/analyzers/security/detectors/sql-injection-detector.js +0 -88
  231. package/dist/analyzers/security/detectors/sql-injection-detector.js.map +0 -1
  232. package/dist/analyzers/security/detectors/weak-crypto-detector.d.ts +0 -12
  233. package/dist/analyzers/security/detectors/weak-crypto-detector.js +0 -104
  234. package/dist/analyzers/security/detectors/weak-crypto-detector.js.map +0 -1
  235. package/dist/analyzers/security/detectors/xss-detector.d.ts +0 -12
  236. package/dist/analyzers/security/detectors/xss-detector.js +0 -90
  237. package/dist/analyzers/security/detectors/xss-detector.js.map +0 -1
  238. package/dist/analyzers/security/index.d.ts +0 -16
  239. package/dist/analyzers/security/index.js +0 -18
  240. package/dist/analyzers/security/index.js.map +0 -1
  241. package/dist/analyzers/security/security-analyzer.d.ts +0 -38
  242. package/dist/analyzers/security/security-analyzer.js +0 -215
  243. package/dist/analyzers/security/security-analyzer.js.map +0 -1
  244. package/dist/analyzers/security/types.d.ts +0 -95
  245. package/dist/analyzers/security/types.js +0 -7
  246. package/dist/analyzers/security/types.js.map +0 -1
  247. package/dist/tools/analysis-tools/architecture-tool.d.ts +0 -46
  248. package/dist/tools/analysis-tools/architecture-tool.js +0 -124
  249. package/dist/tools/analysis-tools/architecture-tool.js.map +0 -1
  250. package/dist/tools/analysis-tools/validation-tool.d.ts +0 -51
  251. package/dist/tools/analysis-tools/validation-tool.js +0 -121
  252. package/dist/tools/analysis-tools/validation-tool.js.map +0 -1
  253. package/dist/tools/analysis-tools.d.ts +0 -73
  254. package/dist/tools/analysis-tools.js +0 -422
  255. package/dist/tools/analysis-tools.js.map +0 -1
  256. package/dist/types/analysis.d.ts +0 -177
  257. package/dist/types/analysis.js +0 -8
  258. package/dist/types/analysis.js.map +0 -1
  259. package/dist/utils/analysis-logger.d.ts +0 -50
  260. package/dist/utils/analysis-logger.js +0 -73
  261. package/dist/utils/analysis-logger.js.map +0 -1
@@ -1,70 +0,0 @@
1
- /**
2
- * Feature Envy Detector
3
- *
4
- * Detects methods that use more features from other classes than their own
5
- */
6
- import { BaseSmellDetector } from '../base-smell-detector.js';
7
- import { SmellType, SmellSeverity } from '../types.js';
8
- import { SyntaxKind } from 'ts-morph';
9
- export class FeatureEnvyDetector extends BaseSmellDetector {
10
- constructor(config = { enabled: true, thresholds: { ratio: 0.7 } }) {
11
- super(SmellType.FEATURE_ENVY, config);
12
- }
13
- async detect(filePath) {
14
- if (!this.isEnabled())
15
- return [];
16
- const smells = [];
17
- const envyRatio = this.getThreshold('ratio', 0.7);
18
- try {
19
- // This detector requires ts-morph semantic analysis (TypeScript/JavaScript only)
20
- const sourceFile = this.astParser.getSourceFile(filePath);
21
- if (!sourceFile)
22
- return [];
23
- const classes = sourceFile.getClasses();
24
- for (const cls of classes) {
25
- const className = cls.getName() || 'anonymous';
26
- const classProperties = new Set(cls.getProperties().map((p) => p.getName()));
27
- for (const method of cls.getMethods()) {
28
- const methodName = method.getName();
29
- let ownPropertyAccess = 0;
30
- let externalPropertyAccess = 0;
31
- // Count property accesses
32
- method.forEachDescendant((node) => {
33
- if (node.getKind() === SyntaxKind.PropertyAccessExpression) {
34
- const text = node.getText();
35
- // Check if accessing own property
36
- if (text.startsWith('this.')) {
37
- const propName = text.slice(5).split('.')[0];
38
- // BUG FIX: Skip empty property names (e.g., malformed "this." without property)
39
- if (propName) {
40
- if (classProperties.has(propName)) {
41
- ownPropertyAccess++;
42
- }
43
- else {
44
- externalPropertyAccess++;
45
- }
46
- }
47
- }
48
- else {
49
- externalPropertyAccess++;
50
- }
51
- }
52
- });
53
- const totalAccess = ownPropertyAccess + externalPropertyAccess;
54
- if (totalAccess > 5) {
55
- // Only check if significant number of accesses
56
- const externalRatio = externalPropertyAccess / totalAccess;
57
- if (externalRatio >= envyRatio) {
58
- smells.push(this.createSmell(filePath, method.getStartLineNumber(), method.getEndLineNumber(), `Method '${className}.${methodName}' exhibits feature envy (${Math.round(externalRatio * 100)}% external access)`, `This method accesses more external properties than its own. Consider moving this logic to the class it's most interested in.`, externalRatio >= 0.9 ? SmellSeverity.HIGH : SmellSeverity.MEDIUM, { className, methodName, ownAccess: ownPropertyAccess, externalAccess: externalPropertyAccess }));
59
- }
60
- }
61
- }
62
- }
63
- }
64
- catch {
65
- // Skip files that can't be parsed
66
- }
67
- return smells;
68
- }
69
- }
70
- //# sourceMappingURL=feature-envy-detector.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"feature-envy-detector.js","sourceRoot":"","sources":["../../../../src/analyzers/code-smells/detectors/feature-envy-detector.ts"],"names":[],"mappings":"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"}
@@ -1,11 +0,0 @@
1
- /**
2
- * Inappropriate Intimacy Detector
3
- *
4
- * Detects classes that are too tightly coupled
5
- */
6
- import { BaseSmellDetector } from '../base-smell-detector.js';
7
- import { type CodeSmell, type DetectorConfig } from '../types.js';
8
- export declare class InappropriateIntimacyDetector extends BaseSmellDetector {
9
- constructor(config?: DetectorConfig);
10
- detect(filePath: string): Promise<CodeSmell[]>;
11
- }
@@ -1,59 +0,0 @@
1
- /**
2
- * Inappropriate Intimacy Detector
3
- *
4
- * Detects classes that are too tightly coupled
5
- */
6
- import { BaseSmellDetector } from '../base-smell-detector.js';
7
- import { SmellType, SmellSeverity } from '../types.js';
8
- import { SyntaxKind } from 'ts-morph';
9
- export class InappropriateIntimacyDetector extends BaseSmellDetector {
10
- constructor(config = { enabled: true, thresholds: { maxAccess: 10 } }) {
11
- super(SmellType.INAPPROPRIATE_INTIMACY, config);
12
- }
13
- async detect(filePath) {
14
- if (!this.isEnabled())
15
- return [];
16
- const smells = [];
17
- const maxAccess = this.getThreshold('maxAccess', 10);
18
- try {
19
- // This detector requires ts-morph semantic analysis (TypeScript/JavaScript only)
20
- const sourceFile = this.astParser.getSourceFile(filePath);
21
- if (!sourceFile)
22
- return [];
23
- const classes = sourceFile.getClasses();
24
- for (const cls of classes) {
25
- const className = cls.getName() || 'anonymous';
26
- const externalClassAccess = new Map();
27
- // Count accesses to other classes
28
- cls.forEachDescendant((node) => {
29
- if (node.getKind() === SyntaxKind.PropertyAccessExpression) {
30
- const text = node.getText();
31
- // Skip 'this.' accesses
32
- if (text.startsWith('this.'))
33
- return;
34
- // Extract potential class name from property access (e.g., 'otherClass.property')
35
- const parts = text.split('.');
36
- if (parts.length >= 2) {
37
- const potentialClass = parts[0];
38
- // Simple heuristic: capitalized names or common object names
39
- if (potentialClass.length > 0 && /^[a-z][a-zA-Z]*$/.test(potentialClass)) {
40
- externalClassAccess.set(potentialClass, (externalClassAccess.get(potentialClass) || 0) + 1);
41
- }
42
- }
43
- }
44
- });
45
- // Report excessive coupling
46
- for (const [externalClass, accessCount] of externalClassAccess.entries()) {
47
- if (accessCount > maxAccess) {
48
- smells.push(this.createSmell(filePath, cls.getStartLineNumber(), cls.getEndLineNumber(), `Class '${className}' is too intimate with '${externalClass}' (${accessCount} accesses)`, `Consider refactoring to reduce coupling. Move shared functionality to a common base class or use composition.`, accessCount >= 20 ? SmellSeverity.HIGH : SmellSeverity.MEDIUM, { className, targetClass: externalClass, accessCount, threshold: maxAccess }));
49
- }
50
- }
51
- }
52
- }
53
- catch {
54
- // Skip files that can't be parsed
55
- }
56
- return smells;
57
- }
58
- }
59
- //# sourceMappingURL=inappropriate-intimacy-detector.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"inappropriate-intimacy-detector.js","sourceRoot":"","sources":["../../../../src/analyzers/code-smells/detectors/inappropriate-intimacy-detector.ts"],"names":[],"mappings":"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"}
@@ -1,13 +0,0 @@
1
- /**
2
- * Large Class Detector
3
- *
4
- * Detects classes that are too large (lines or method count)
5
- */
6
- import { BaseSmellDetector } from '../base-smell-detector.js';
7
- import { type CodeSmell, type DetectorConfig } from '../types.js';
8
- export declare class LargeClassDetector extends BaseSmellDetector {
9
- constructor(config?: DetectorConfig);
10
- detect(filePath: string): Promise<CodeSmell[]>;
11
- private getSeverityByRatio;
12
- private updateSeverity;
13
- }
@@ -1,61 +0,0 @@
1
- /**
2
- * Large Class Detector
3
- *
4
- * Detects classes that are too large (lines or method count)
5
- */
6
- import { BaseSmellDetector } from '../base-smell-detector.js';
7
- import { SmellType, SmellSeverity } from '../types.js';
8
- export class LargeClassDetector extends BaseSmellDetector {
9
- constructor(config = { enabled: true, thresholds: { maxLines: 300, maxMethods: 20 } }) {
10
- super(SmellType.LARGE_CLASS, config);
11
- }
12
- async detect(filePath) {
13
- if (!this.isEnabled())
14
- return [];
15
- const smells = [];
16
- const maxLines = this.getThreshold('maxLines', 300);
17
- const maxMethods = this.getThreshold('maxMethods', 20);
18
- try {
19
- const ast = await this.astParser.parseFile(filePath);
20
- for (const cls of ast.classes) {
21
- const issues = [];
22
- let severity = SmellSeverity.LOW;
23
- // Check line count
24
- if (cls.length > maxLines) {
25
- issues.push(`${cls.length} lines (threshold: ${maxLines})`);
26
- severity = this.updateSeverity(severity, this.getSeverityByRatio(cls.length, maxLines));
27
- }
28
- // Check method count
29
- if (cls.methods.length > maxMethods) {
30
- issues.push(`${cls.methods.length} methods (threshold: ${maxMethods})`);
31
- severity = this.updateSeverity(severity, this.getSeverityByRatio(cls.methods.length, maxMethods));
32
- }
33
- if (issues.length > 0) {
34
- smells.push(this.createSmell(filePath, cls.startLine, cls.endLine, `Class '${cls.name}' is too large: ${issues.join(', ')}`, `Consider splitting this class into smaller, more focused classes following the Single Responsibility Principle.`, severity, { className: cls.name, lines: cls.length, methods: cls.methods.length }));
35
- }
36
- }
37
- }
38
- catch {
39
- // Skip files that can't be parsed
40
- }
41
- return smells;
42
- }
43
- getSeverityByRatio(value, threshold) {
44
- // Guard against division by zero
45
- if (threshold === 0)
46
- return SmellSeverity.LOW;
47
- const ratio = value / threshold;
48
- if (ratio >= 3)
49
- return SmellSeverity.CRITICAL;
50
- if (ratio >= 2)
51
- return SmellSeverity.HIGH;
52
- if (ratio >= 1.5)
53
- return SmellSeverity.MEDIUM;
54
- return SmellSeverity.LOW;
55
- }
56
- updateSeverity(current, newSev) {
57
- const order = { LOW: 0, MEDIUM: 1, HIGH: 2, CRITICAL: 3 };
58
- return order[newSev] > order[current] ? newSev : current;
59
- }
60
- }
61
- //# sourceMappingURL=large-class-detector.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"large-class-detector.js","sourceRoot":"","sources":["../../../../src/analyzers/code-smells/detectors/large-class-detector.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,iBAAiB,EAAE,MAAM,2BAA2B,CAAC;AAC9D,OAAO,EAAE,SAAS,EAAE,aAAa,EAAuC,MAAM,aAAa,CAAC;AAE5F,MAAM,OAAO,kBAAmB,SAAQ,iBAAiB;IACvD,YAAY,SAAyB,EAAE,OAAO,EAAE,IAAI,EAAE,UAAU,EAAE,EAAE,QAAQ,EAAE,GAAG,EAAE,UAAU,EAAE,EAAE,EAAE,EAAE;QACnG,KAAK,CAAC,SAAS,CAAC,WAAW,EAAE,MAAM,CAAC,CAAC;IACvC,CAAC;IAED,KAAK,CAAC,MAAM,CAAC,QAAgB;QAC3B,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE;YAAE,OAAO,EAAE,CAAC;QAEjC,MAAM,MAAM,GAAgB,EAAE,CAAC;QAC/B,MAAM,QAAQ,GAAG,IAAI,CAAC,YAAY,CAAC,UAAU,EAAE,GAAG,CAAC,CAAC;QACpD,MAAM,UAAU,GAAG,IAAI,CAAC,YAAY,CAAC,YAAY,EAAE,EAAE,CAAC,CAAC;QAEvD,IAAI,CAAC;YACH,MAAM,GAAG,GAAG,MAAM,IAAI,CAAC,SAAS,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAC;YAErD,KAAK,MAAM,GAAG,IAAI,GAAG,CAAC,OAAO,EAAE,CAAC;gBAC9B,MAAM,MAAM,GAAa,EAAE,CAAC;gBAC5B,IAAI,QAAQ,GAA2F,aAAa,CAAC,GAAG,CAAC;gBAEzH,mBAAmB;gBACnB,IAAI,GAAG,CAAC,MAAM,GAAG,QAAQ,EAAE,CAAC;oBAC1B,MAAM,CAAC,IAAI,CAAC,GAAG,GAAG,CAAC,MAAM,sBAAsB,QAAQ,GAAG,CAAC,CAAC;oBAC5D,QAAQ,GAAG,IAAI,CAAC,cAAc,CAAC,QAAQ,EAAE,IAAI,CAAC,kBAAkB,CAAC,GAAG,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC,CAAC;gBAC1F,CAAC;gBAED,qBAAqB;gBACrB,IAAI,GAAG,CAAC,OAAO,CAAC,MAAM,GAAG,UAAU,EAAE,CAAC;oBACpC,MAAM,CAAC,IAAI,CAAC,GAAG,GAAG,CAAC,OAAO,CAAC,MAAM,wBAAwB,UAAU,GAAG,CAAC,CAAC;oBACxE,QAAQ,GAAG,IAAI,CAAC,cAAc,CAAC,QAAQ,EAAE,IAAI,CAAC,kBAAkB,CAAC,GAAG,CAAC,OAAO,CAAC,MAAM,EAAE,UAAU,CAAC,CAAC,CAAC;gBACpG,CAAC;gBAED,IAAI,MAAM,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;oBACtB,MAAM,CAAC,IAAI,CACT,IAAI,CAAC,WAAW,CACd,QAAQ,EACR,GAAG,CAAC,SAAS,EACb,GAAG,CAAC,OAAO,EACX,UAAU,GAAG,CAAC,IAAI,mBAAmB,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,EACxD,iHAAiH,EACjH,QAAQ,EACR,EAAE,SAAS,EAAE,GAAG,CAAC,IAAI,EAAE,KAAK,EAAE,GAAG,CAAC,MAAM,EAAE,OAAO,EAAE,GAAG,CAAC,OAAO,CAAC,MAAM,EAAE,CACxE,CACF,CAAC;gBACJ,CAAC;YACH,CAAC;QACH,CAAC;QAAC,MAAM,CAAC;YACP,kCAAkC;QACpC,CAAC;QAED,OAAO,MAAM,CAAC;IAChB,CAAC;IAEO,kBAAkB,CAAC,KAAa,EAAE,SAAiB;QACzD,iCAAiC;QACjC,IAAI,SAAS,KAAK,CAAC;YAAE,OAAO,aAAa,CAAC,GAAG,CAAC;QAC9C,MAAM,KAAK,GAAG,KAAK,GAAG,SAAS,CAAC;QAChC,IAAI,KAAK,IAAI,CAAC;YAAE,OAAO,aAAa,CAAC,QAAQ,CAAC;QAC9C,IAAI,KAAK,IAAI,CAAC;YAAE,OAAO,aAAa,CAAC,IAAI,CAAC;QAC1C,IAAI,KAAK,IAAI,GAAG;YAAE,OAAO,aAAa,CAAC,MAAM,CAAC;QAC9C,OAAO,aAAa,CAAC,GAAG,CAAC;IAC3B,CAAC;IAEO,cAAc,CACpB,OAA+F,EAC/F,MAA8F;QAE9F,MAAM,KAAK,GAAG,EAAE,GAAG,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,IAAI,EAAE,CAAC,EAAE,QAAQ,EAAE,CAAC,EAAE,CAAC;QAC1D,OAAO,KAAK,CAAC,MAAM,CAAC,GAAG,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,OAAO,CAAC;IAC3D,CAAC;CACF"}
@@ -1,12 +0,0 @@
1
- /**
2
- * Long Method Detector
3
- *
4
- * Detects functions/methods that exceed a threshold line count
5
- */
6
- import { BaseSmellDetector } from '../base-smell-detector.js';
7
- import { type CodeSmell, type DetectorConfig } from '../types.js';
8
- export declare class LongMethodDetector extends BaseSmellDetector {
9
- constructor(config?: DetectorConfig);
10
- detect(filePath: string): Promise<CodeSmell[]>;
11
- private getSeverity;
12
- }
@@ -1,55 +0,0 @@
1
- /**
2
- * Long Method Detector
3
- *
4
- * Detects functions/methods that exceed a threshold line count
5
- */
6
- import { BaseSmellDetector } from '../base-smell-detector.js';
7
- import { SmellType, SmellSeverity } from '../types.js';
8
- export class LongMethodDetector extends BaseSmellDetector {
9
- constructor(config = { enabled: true, thresholds: { maxLines: 50 } }) {
10
- super(SmellType.LONG_METHOD, config);
11
- }
12
- async detect(filePath) {
13
- if (!this.isEnabled())
14
- return [];
15
- const smells = [];
16
- const maxLines = this.getThreshold('maxLines', 50);
17
- try {
18
- const ast = await this.astParser.parseFile(filePath);
19
- // Check functions
20
- for (const func of ast.functions) {
21
- if (func.length > maxLines) {
22
- const severity = this.getSeverity(func.length, maxLines);
23
- smells.push(this.createSmell(filePath, func.startLine, func.endLine, `Function '${func.name}' is too long (${func.length} lines)`, `Consider breaking this function into smaller, focused functions. Aim for functions under ${maxLines} lines.`, severity, { functionName: func.name, lines: func.length, threshold: maxLines }));
24
- }
25
- }
26
- // Check methods in classes
27
- for (const cls of ast.classes) {
28
- for (const method of cls.methods) {
29
- if (method.length > maxLines) {
30
- const severity = this.getSeverity(method.length, maxLines);
31
- smells.push(this.createSmell(filePath, method.startLine, method.endLine, `Method '${cls.name}.${method.name}' is too long (${method.length} lines)`, `Consider extracting parts of this method into smaller helper methods.`, severity, { className: cls.name, methodName: method.name, lines: method.length, threshold: maxLines }));
32
- }
33
- }
34
- }
35
- }
36
- catch {
37
- // Skip files that can't be parsed
38
- }
39
- return smells;
40
- }
41
- getSeverity(lines, threshold) {
42
- // Guard against division by zero
43
- if (threshold === 0)
44
- return SmellSeverity.LOW;
45
- const ratio = lines / threshold;
46
- if (ratio >= 4)
47
- return SmellSeverity.CRITICAL;
48
- if (ratio >= 2)
49
- return SmellSeverity.HIGH;
50
- if (ratio >= 1.5)
51
- return SmellSeverity.MEDIUM;
52
- return SmellSeverity.LOW;
53
- }
54
- }
55
- //# sourceMappingURL=long-method-detector.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"long-method-detector.js","sourceRoot":"","sources":["../../../../src/analyzers/code-smells/detectors/long-method-detector.ts"],"names":[],"mappings":"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"}
@@ -1,12 +0,0 @@
1
- /**
2
- * Long Parameter List Detector
3
- *
4
- * Detects functions with too many parameters
5
- */
6
- import { BaseSmellDetector } from '../base-smell-detector.js';
7
- import { type CodeSmell, type DetectorConfig } from '../types.js';
8
- export declare class LongParameterListDetector extends BaseSmellDetector {
9
- constructor(config?: DetectorConfig);
10
- detect(filePath: string): Promise<CodeSmell[]>;
11
- private getSeverity;
12
- }
@@ -1,53 +0,0 @@
1
- /**
2
- * Long Parameter List Detector
3
- *
4
- * Detects functions with too many parameters
5
- */
6
- import { BaseSmellDetector } from '../base-smell-detector.js';
7
- import { SmellType, SmellSeverity } from '../types.js';
8
- export class LongParameterListDetector extends BaseSmellDetector {
9
- constructor(config = { enabled: true, thresholds: { maxParams: 5 } }) {
10
- super(SmellType.LONG_PARAMETER_LIST, config);
11
- }
12
- async detect(filePath) {
13
- if (!this.isEnabled())
14
- return [];
15
- const smells = [];
16
- const maxParams = this.getThreshold('maxParams', 5);
17
- try {
18
- const ast = await this.astParser.parseFile(filePath);
19
- // Check functions
20
- for (const func of ast.functions) {
21
- if (func.parameters.length > maxParams) {
22
- smells.push(this.createSmell(filePath, func.startLine, func.endLine, `Function '${func.name}' has too many parameters (${func.parameters.length})`, `Consider using a parameter object or builder pattern to reduce the parameter count. Aim for ${maxParams} or fewer parameters.`, this.getSeverity(func.parameters.length, maxParams), { functionName: func.name, paramCount: func.parameters.length, threshold: maxParams }));
23
- }
24
- }
25
- // Check methods
26
- for (const cls of ast.classes) {
27
- for (const method of cls.methods) {
28
- if (method.parameters.length > maxParams) {
29
- smells.push(this.createSmell(filePath, method.startLine, method.endLine, `Method '${cls.name}.${method.name}' has too many parameters (${method.parameters.length})`, `Consider using a parameter object or refactoring to reduce dependencies.`, this.getSeverity(method.parameters.length, maxParams), { className: cls.name, methodName: method.name, paramCount: method.parameters.length, threshold: maxParams }));
30
- }
31
- }
32
- }
33
- }
34
- catch {
35
- // Skip files that can't be parsed
36
- }
37
- return smells;
38
- }
39
- getSeverity(count, threshold) {
40
- // Guard against division by zero
41
- if (threshold === 0)
42
- return SmellSeverity.LOW;
43
- const ratio = count / threshold;
44
- if (ratio >= 2.5)
45
- return SmellSeverity.CRITICAL;
46
- if (ratio >= 2)
47
- return SmellSeverity.HIGH;
48
- if (ratio >= 1.5)
49
- return SmellSeverity.MEDIUM;
50
- return SmellSeverity.LOW;
51
- }
52
- }
53
- //# sourceMappingURL=long-parameter-list-detector.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"long-parameter-list-detector.js","sourceRoot":"","sources":["../../../../src/analyzers/code-smells/detectors/long-parameter-list-detector.ts"],"names":[],"mappings":"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"}
@@ -1,12 +0,0 @@
1
- /**
2
- * Magic Numbers Detector
3
- *
4
- * Detects hardcoded numeric literals (excluding common values like 0, 1, -1, 100)
5
- */
6
- import { BaseSmellDetector } from '../base-smell-detector.js';
7
- import { type CodeSmell, type DetectorConfig } from '../types.js';
8
- export declare class MagicNumbersDetector extends BaseSmellDetector {
9
- private readonly ALLOWED_NUMBERS;
10
- constructor(config?: DetectorConfig);
11
- detect(filePath: string): Promise<CodeSmell[]>;
12
- }
@@ -1,56 +0,0 @@
1
- /**
2
- * Magic Numbers Detector
3
- *
4
- * Detects hardcoded numeric literals (excluding common values like 0, 1, -1, 100)
5
- */
6
- import { BaseSmellDetector } from '../base-smell-detector.js';
7
- import { SmellType, SmellSeverity } from '../types.js';
8
- import { SyntaxKind } from 'ts-morph';
9
- export class MagicNumbersDetector extends BaseSmellDetector {
10
- ALLOWED_NUMBERS = new Set([0, 1, -1, 2, 10, 100, 1000]);
11
- constructor(config = { enabled: true }) {
12
- super(SmellType.MAGIC_NUMBERS, config);
13
- }
14
- async detect(filePath) {
15
- if (!this.isEnabled())
16
- return [];
17
- const smells = [];
18
- try {
19
- // This detector requires ts-morph semantic analysis (TypeScript/JavaScript only)
20
- const sourceFile = this.astParser.getSourceFile(filePath);
21
- if (!sourceFile)
22
- return [];
23
- const magicNumbers = new Map();
24
- // Find all numeric literals
25
- sourceFile.forEachDescendant((node) => {
26
- if (node.getKind() === SyntaxKind.NumericLiteral) {
27
- const value = Number(node.getText());
28
- // Skip allowed numbers
29
- if (this.ALLOWED_NUMBERS.has(value))
30
- return;
31
- // Skip if in const declaration (already named)
32
- const parent = node.getParent();
33
- if (parent && parent.getKind() === SyntaxKind.VariableDeclaration) {
34
- return;
35
- }
36
- const line = node.getStartLineNumber();
37
- const existing = magicNumbers.get(value) ?? [];
38
- existing.push({ line, text: node.getText() });
39
- magicNumbers.set(value, existing);
40
- }
41
- });
42
- // Create smells for magic numbers
43
- for (const [value, occurrences] of magicNumbers.entries()) {
44
- if (occurrences.length > 0) {
45
- const firstOccurrence = occurrences[0];
46
- smells.push(this.createSmell(filePath, firstOccurrence.line, firstOccurrence.line, `Magic number '${value}' found (${occurrences.length} occurrence${occurrences.length > 1 ? 's' : ''})`, `Replace this magic number with a named constant to improve code readability and maintainability.`, occurrences.length >= 3 ? SmellSeverity.MEDIUM : SmellSeverity.LOW, { value, occurrences: occurrences.length, lines: occurrences.map(o => o.line) }));
47
- }
48
- }
49
- }
50
- catch {
51
- // Skip files that can't be parsed
52
- }
53
- return smells;
54
- }
55
- }
56
- //# sourceMappingURL=magic-numbers-detector.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"magic-numbers-detector.js","sourceRoot":"","sources":["../../../../src/analyzers/code-smells/detectors/magic-numbers-detector.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,iBAAiB,EAAE,MAAM,2BAA2B,CAAC;AAC9D,OAAO,EAAE,SAAS,EAAE,aAAa,EAAuC,MAAM,aAAa,CAAC;AAC5F,OAAO,EAAE,UAAU,EAAE,MAAM,UAAU,CAAC;AAEtC,MAAM,OAAO,oBAAqB,SAAQ,iBAAiB;IACxC,eAAe,GAAG,IAAI,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,EAAE,GAAG,EAAE,IAAI,CAAC,CAAC,CAAC;IAEzE,YAAY,SAAyB,EAAE,OAAO,EAAE,IAAI,EAAE;QACpD,KAAK,CAAC,SAAS,CAAC,aAAa,EAAE,MAAM,CAAC,CAAC;IACzC,CAAC;IAED,KAAK,CAAC,MAAM,CAAC,QAAgB;QAC3B,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE;YAAE,OAAO,EAAE,CAAC;QAEjC,MAAM,MAAM,GAAgB,EAAE,CAAC;QAE/B,IAAI,CAAC;YACH,iFAAiF;YACjF,MAAM,UAAU,GAAG,IAAI,CAAC,SAAS,CAAC,aAAa,CAAC,QAAQ,CAAC,CAAC;YAC1D,IAAI,CAAC,UAAU;gBAAE,OAAO,EAAE,CAAC;YAE3B,MAAM,YAAY,GAAG,IAAI,GAAG,EAAiD,CAAC;YAE9E,4BAA4B;YAC5B,UAAU,CAAC,iBAAiB,CAAC,CAAC,IAAI,EAAE,EAAE;gBACpC,IAAI,IAAI,CAAC,OAAO,EAAE,KAAK,UAAU,CAAC,cAAc,EAAE,CAAC;oBACjD,MAAM,KAAK,GAAG,MAAM,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC,CAAC;oBAErC,uBAAuB;oBACvB,IAAI,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC,KAAK,CAAC;wBAAE,OAAO;oBAE5C,+CAA+C;oBAC/C,MAAM,MAAM,GAAG,IAAI,CAAC,SAAS,EAAE,CAAC;oBAChC,IAAI,MAAM,IAAI,MAAM,CAAC,OAAO,EAAE,KAAK,UAAU,CAAC,mBAAmB,EAAE,CAAC;wBAClE,OAAO;oBACT,CAAC;oBAED,MAAM,IAAI,GAAG,IAAI,CAAC,kBAAkB,EAAE,CAAC;oBACvC,MAAM,QAAQ,GAAG,YAAY,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC;oBAC/C,QAAQ,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC;oBAC9C,YAAY,CAAC,GAAG,CAAC,KAAK,EAAE,QAAQ,CAAC,CAAC;gBACpC,CAAC;YACH,CAAC,CAAC,CAAC;YAEH,kCAAkC;YAClC,KAAK,MAAM,CAAC,KAAK,EAAE,WAAW,CAAC,IAAI,YAAY,CAAC,OAAO,EAAE,EAAE,CAAC;gBAC1D,IAAI,WAAW,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;oBAC3B,MAAM,eAAe,GAAG,WAAW,CAAC,CAAC,CAAC,CAAC;oBACvC,MAAM,CAAC,IAAI,CACT,IAAI,CAAC,WAAW,CACd,QAAQ,EACR,eAAe,CAAC,IAAI,EACpB,eAAe,CAAC,IAAI,EACpB,iBAAiB,KAAK,YAAY,WAAW,CAAC,MAAM,cAAc,WAAW,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,GAAG,EACtG,kGAAkG,EAClG,WAAW,CAAC,MAAM,IAAI,CAAC,CAAC,CAAC,CAAC,aAAa,CAAC,MAAM,CAAC,CAAC,CAAC,aAAa,CAAC,GAAG,EAClE,EAAE,KAAK,EAAE,WAAW,EAAE,WAAW,CAAC,MAAM,EAAE,KAAK,EAAE,WAAW,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,CAChF,CACF,CAAC;gBACJ,CAAC;YACH,CAAC;QACH,CAAC;QAAC,MAAM,CAAC;YACP,kCAAkC;QACpC,CAAC;QAED,OAAO,MAAM,CAAC;IAChB,CAAC;CACF"}
@@ -1,13 +0,0 @@
1
- /**
2
- * Nested Conditionals Detector
3
- *
4
- * Detects deeply nested if/else/switch statements
5
- */
6
- import { BaseSmellDetector } from '../base-smell-detector.js';
7
- import { type CodeSmell, type DetectorConfig } from '../types.js';
8
- export declare class NestedConditionalsDetector extends BaseSmellDetector {
9
- constructor(config?: DetectorConfig);
10
- detect(filePath: string): Promise<CodeSmell[]>;
11
- private getMaxNestingDepth;
12
- private getSeverity;
13
- }
@@ -1,77 +0,0 @@
1
- /**
2
- * Nested Conditionals Detector
3
- *
4
- * Detects deeply nested if/else/switch statements
5
- */
6
- import { BaseSmellDetector } from '../base-smell-detector.js';
7
- import { SmellType, SmellSeverity } from '../types.js';
8
- import { SyntaxKind } from 'ts-morph';
9
- export class NestedConditionalsDetector extends BaseSmellDetector {
10
- constructor(config = { enabled: true, thresholds: { maxDepth: 3 } }) {
11
- super(SmellType.NESTED_CONDITIONALS, config);
12
- }
13
- async detect(filePath) {
14
- if (!this.isEnabled())
15
- return [];
16
- const smells = [];
17
- const maxDepth = this.getThreshold('maxDepth', 3);
18
- try {
19
- // This detector requires ts-morph semantic analysis (TypeScript/JavaScript only)
20
- const sourceFile = this.astParser.getSourceFile(filePath);
21
- if (!sourceFile)
22
- return [];
23
- // Check each function/method
24
- const functions = sourceFile.getFunctions();
25
- for (const func of functions) {
26
- const depth = this.getMaxNestingDepth(func);
27
- if (depth > maxDepth) {
28
- smells.push(this.createSmell(filePath, func.getStartLineNumber(), func.getEndLineNumber(), `Function '${func.getName() || 'anonymous'}' has deeply nested conditionals (depth: ${depth})`, `Reduce nesting by using early returns, extracting methods, or simplifying logic.`, this.getSeverity(depth, maxDepth), { functionName: func.getName() || 'anonymous', depth, threshold: maxDepth }));
29
- }
30
- }
31
- // Check methods
32
- const classes = sourceFile.getClasses();
33
- for (const cls of classes) {
34
- for (const method of cls.getMethods()) {
35
- const depth = this.getMaxNestingDepth(method);
36
- if (depth > maxDepth) {
37
- smells.push(this.createSmell(filePath, method.getStartLineNumber(), method.getEndLineNumber(), `Method '${cls.getName()}.${method.getName()}' has deeply nested conditionals (depth: ${depth})`, `Reduce nesting by using guard clauses or extracting sub-methods.`, this.getSeverity(depth, maxDepth), { className: cls.getName(), methodName: method.getName(), depth, threshold: maxDepth }));
38
- }
39
- }
40
- }
41
- }
42
- catch {
43
- // Skip files that can't be parsed
44
- }
45
- return smells;
46
- }
47
- getMaxNestingDepth(node) {
48
- let maxDepth = 0;
49
- const traverse = (n, currentDepth) => {
50
- const kind = n.getKind();
51
- // Increment depth for conditional statements
52
- const isConditional = kind === SyntaxKind.IfStatement ||
53
- kind === SyntaxKind.SwitchStatement ||
54
- kind === SyntaxKind.ConditionalExpression;
55
- const newDepth = isConditional ? currentDepth + 1 : currentDepth;
56
- maxDepth = Math.max(maxDepth, newDepth);
57
- // Traverse children
58
- n.forEachChild((child) => traverse(child, newDepth));
59
- };
60
- traverse(node, 0);
61
- return maxDepth;
62
- }
63
- getSeverity(depth, threshold) {
64
- // Guard against division by zero
65
- if (threshold === 0)
66
- return SmellSeverity.LOW;
67
- const ratio = depth / threshold;
68
- if (ratio >= 2.5)
69
- return SmellSeverity.CRITICAL;
70
- if (ratio >= 2)
71
- return SmellSeverity.HIGH;
72
- if (ratio >= 1.5)
73
- return SmellSeverity.MEDIUM;
74
- return SmellSeverity.LOW;
75
- }
76
- }
77
- //# sourceMappingURL=nested-conditionals-detector.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"nested-conditionals-detector.js","sourceRoot":"","sources":["../../../../src/analyzers/code-smells/detectors/nested-conditionals-detector.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,iBAAiB,EAAE,MAAM,2BAA2B,CAAC;AAC9D,OAAO,EAAE,SAAS,EAAE,aAAa,EAAuC,MAAM,aAAa,CAAC;AAC5F,OAAO,EAAE,UAAU,EAAQ,MAAM,UAAU,CAAC;AAE5C,MAAM,OAAO,0BAA2B,SAAQ,iBAAiB;IAC/D,YAAY,SAAyB,EAAE,OAAO,EAAE,IAAI,EAAE,UAAU,EAAE,EAAE,QAAQ,EAAE,CAAC,EAAE,EAAE;QACjF,KAAK,CAAC,SAAS,CAAC,mBAAmB,EAAE,MAAM,CAAC,CAAC;IAC/C,CAAC;IAED,KAAK,CAAC,MAAM,CAAC,QAAgB;QAC3B,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE;YAAE,OAAO,EAAE,CAAC;QAEjC,MAAM,MAAM,GAAgB,EAAE,CAAC;QAC/B,MAAM,QAAQ,GAAG,IAAI,CAAC,YAAY,CAAC,UAAU,EAAE,CAAC,CAAC,CAAC;QAElD,IAAI,CAAC;YACH,iFAAiF;YACjF,MAAM,UAAU,GAAG,IAAI,CAAC,SAAS,CAAC,aAAa,CAAC,QAAQ,CAAC,CAAC;YAC1D,IAAI,CAAC,UAAU;gBAAE,OAAO,EAAE,CAAC;YAE3B,6BAA6B;YAC7B,MAAM,SAAS,GAAG,UAAU,CAAC,YAAY,EAAE,CAAC;YAC5C,KAAK,MAAM,IAAI,IAAI,SAAS,EAAE,CAAC;gBAC7B,MAAM,KAAK,GAAG,IAAI,CAAC,kBAAkB,CAAC,IAAI,CAAC,CAAC;gBAC5C,IAAI,KAAK,GAAG,QAAQ,EAAE,CAAC;oBACrB,MAAM,CAAC,IAAI,CACT,IAAI,CAAC,WAAW,CACd,QAAQ,EACR,IAAI,CAAC,kBAAkB,EAAE,EACzB,IAAI,CAAC,gBAAgB,EAAE,EACvB,aAAa,IAAI,CAAC,OAAO,EAAE,IAAI,WAAW,4CAA4C,KAAK,GAAG,EAC9F,kFAAkF,EAClF,IAAI,CAAC,WAAW,CAAC,KAAK,EAAE,QAAQ,CAAC,EACjC,EAAE,YAAY,EAAE,IAAI,CAAC,OAAO,EAAE,IAAI,WAAW,EAAE,KAAK,EAAE,SAAS,EAAE,QAAQ,EAAE,CAC5E,CACF,CAAC;gBACJ,CAAC;YACH,CAAC;YAED,gBAAgB;YAChB,MAAM,OAAO,GAAG,UAAU,CAAC,UAAU,EAAE,CAAC;YACxC,KAAK,MAAM,GAAG,IAAI,OAAO,EAAE,CAAC;gBAC1B,KAAK,MAAM,MAAM,IAAI,GAAG,CAAC,UAAU,EAAE,EAAE,CAAC;oBACtC,MAAM,KAAK,GAAG,IAAI,CAAC,kBAAkB,CAAC,MAAM,CAAC,CAAC;oBAC9C,IAAI,KAAK,GAAG,QAAQ,EAAE,CAAC;wBACrB,MAAM,CAAC,IAAI,CACT,IAAI,CAAC,WAAW,CACd,QAAQ,EACR,MAAM,CAAC,kBAAkB,EAAE,EAC3B,MAAM,CAAC,gBAAgB,EAAE,EACzB,WAAW,GAAG,CAAC,OAAO,EAAE,IAAI,MAAM,CAAC,OAAO,EAAE,4CAA4C,KAAK,GAAG,EAChG,kEAAkE,EAClE,IAAI,CAAC,WAAW,CAAC,KAAK,EAAE,QAAQ,CAAC,EACjC,EAAE,SAAS,EAAE,GAAG,CAAC,OAAO,EAAE,EAAE,UAAU,EAAE,MAAM,CAAC,OAAO,EAAE,EAAE,KAAK,EAAE,SAAS,EAAE,QAAQ,EAAE,CACvF,CACF,CAAC;oBACJ,CAAC;gBACH,CAAC;YACH,CAAC;QACH,CAAC;QAAC,MAAM,CAAC;YACP,kCAAkC;QACpC,CAAC;QAED,OAAO,MAAM,CAAC;IAChB,CAAC;IAEO,kBAAkB,CAAC,IAAU;QACnC,IAAI,QAAQ,GAAG,CAAC,CAAC;QAEjB,MAAM,QAAQ,GAAG,CAAC,CAAO,EAAE,YAAoB,EAAQ,EAAE;YACvD,MAAM,IAAI,GAAG,CAAC,CAAC,OAAO,EAAE,CAAC;YAEzB,6CAA6C;YAC7C,MAAM,aAAa,GACjB,IAAI,KAAK,UAAU,CAAC,WAAW;gBAC/B,IAAI,KAAK,UAAU,CAAC,eAAe;gBACnC,IAAI,KAAK,UAAU,CAAC,qBAAqB,CAAC;YAE5C,MAAM,QAAQ,GAAG,aAAa,CAAC,CAAC,CAAC,YAAY,GAAG,CAAC,CAAC,CAAC,CAAC,YAAY,CAAC;YACjE,QAAQ,GAAG,IAAI,CAAC,GAAG,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAC;YAExC,oBAAoB;YACpB,CAAC,CAAC,YAAY,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,QAAQ,CAAC,KAAK,EAAE,QAAQ,CAAC,CAAC,CAAC;QACvD,CAAC,CAAC;QAEF,QAAQ,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC;QAClB,OAAO,QAAQ,CAAC;IAClB,CAAC;IAEO,WAAW,CAAC,KAAa,EAAE,SAAiB;QAClD,iCAAiC;QACjC,IAAI,SAAS,KAAK,CAAC;YAAE,OAAO,aAAa,CAAC,GAAG,CAAC;QAC9C,MAAM,KAAK,GAAG,KAAK,GAAG,SAAS,CAAC;QAChC,IAAI,KAAK,IAAI,GAAG;YAAE,OAAO,aAAa,CAAC,QAAQ,CAAC;QAChD,IAAI,KAAK,IAAI,CAAC;YAAE,OAAO,aAAa,CAAC,IAAI,CAAC;QAC1C,IAAI,KAAK,IAAI,GAAG;YAAE,OAAO,aAAa,CAAC,MAAM,CAAC;QAC9C,OAAO,aAAa,CAAC,GAAG,CAAC;IAC3B,CAAC;CACF"}
@@ -1,16 +0,0 @@
1
- /**
2
- * Code Smell Analyzer Module
3
- */
4
- export { CodeSmellAnalyzer } from './code-smell-analyzer.js';
5
- export { BaseSmellDetector } from './base-smell-detector.js';
6
- export { LongMethodDetector } from './detectors/long-method-detector.js';
7
- export { LargeClassDetector } from './detectors/large-class-detector.js';
8
- export { LongParameterListDetector } from './detectors/long-parameter-list-detector.js';
9
- export { MagicNumbersDetector } from './detectors/magic-numbers-detector.js';
10
- export { NestedConditionalsDetector } from './detectors/nested-conditionals-detector.js';
11
- export { DeadCodeDetector } from './detectors/dead-code-detector.js';
12
- export { DuplicateCodeDetector } from './detectors/duplicate-code-detector.js';
13
- export { FeatureEnvyDetector } from './detectors/feature-envy-detector.js';
14
- export { DataClumpsDetector } from './detectors/data-clumps-detector.js';
15
- export { InappropriateIntimacyDetector } from './detectors/inappropriate-intimacy-detector.js';
16
- export { SmellType, SmellSeverity, type CodeSmell, type DetectorConfig, type CodeSmellAnalysisOptions, type CodeSmellAnalysisResult, type CodeSmellSummary, type SmellDetector, } from './types.js';
@@ -1,19 +0,0 @@
1
- /**
2
- * Code Smell Analyzer Module
3
- */
4
- export { CodeSmellAnalyzer } from './code-smell-analyzer.js';
5
- export { BaseSmellDetector } from './base-smell-detector.js';
6
- // Detectors
7
- export { LongMethodDetector } from './detectors/long-method-detector.js';
8
- export { LargeClassDetector } from './detectors/large-class-detector.js';
9
- export { LongParameterListDetector } from './detectors/long-parameter-list-detector.js';
10
- export { MagicNumbersDetector } from './detectors/magic-numbers-detector.js';
11
- export { NestedConditionalsDetector } from './detectors/nested-conditionals-detector.js';
12
- export { DeadCodeDetector } from './detectors/dead-code-detector.js';
13
- export { DuplicateCodeDetector } from './detectors/duplicate-code-detector.js';
14
- export { FeatureEnvyDetector } from './detectors/feature-envy-detector.js';
15
- export { DataClumpsDetector } from './detectors/data-clumps-detector.js';
16
- export { InappropriateIntimacyDetector } from './detectors/inappropriate-intimacy-detector.js';
17
- // Types
18
- export { SmellType, SmellSeverity, } from './types.js';
19
- //# sourceMappingURL=index.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/analyzers/code-smells/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,iBAAiB,EAAE,MAAM,0BAA0B,CAAC;AAC7D,OAAO,EAAE,iBAAiB,EAAE,MAAM,0BAA0B,CAAC;AAE7D,YAAY;AACZ,OAAO,EAAE,kBAAkB,EAAE,MAAM,qCAAqC,CAAC;AACzE,OAAO,EAAE,kBAAkB,EAAE,MAAM,qCAAqC,CAAC;AACzE,OAAO,EAAE,yBAAyB,EAAE,MAAM,6CAA6C,CAAC;AACxF,OAAO,EAAE,oBAAoB,EAAE,MAAM,uCAAuC,CAAC;AAC7E,OAAO,EAAE,0BAA0B,EAAE,MAAM,6CAA6C,CAAC;AACzF,OAAO,EAAE,gBAAgB,EAAE,MAAM,mCAAmC,CAAC;AACrE,OAAO,EAAE,qBAAqB,EAAE,MAAM,wCAAwC,CAAC;AAC/E,OAAO,EAAE,mBAAmB,EAAE,MAAM,sCAAsC,CAAC;AAC3E,OAAO,EAAE,kBAAkB,EAAE,MAAM,qCAAqC,CAAC;AACzE,OAAO,EAAE,6BAA6B,EAAE,MAAM,gDAAgD,CAAC;AAE/F,QAAQ;AACR,OAAO,EACL,SAAS,EACT,aAAa,GAOd,MAAM,YAAY,CAAC"}