@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.
- package/README.md +22 -2
- package/dist/agent/agent-executor.d.ts +1 -1
- package/dist/agent/agent-executor.js +15 -17
- package/dist/agent/agent-executor.js.map +1 -1
- package/dist/agent/execution/tool-executor.d.ts +6 -0
- package/dist/agent/execution/tool-executor.js +16 -1
- package/dist/agent/execution/tool-executor.js.map +1 -1
- package/dist/agent/llm-agent.js +91 -22
- package/dist/agent/llm-agent.js.map +1 -1
- package/dist/agent/parallel-tools.d.ts +65 -0
- package/dist/agent/parallel-tools.js +146 -0
- package/dist/agent/parallel-tools.js.map +1 -0
- package/dist/llm/tools.js +1 -1
- package/dist/llm/tools.js.map +1 -1
- package/dist/ui/components/chat-interface.js +14 -0
- package/dist/ui/components/chat-interface.js.map +1 -1
- package/dist/ui/hooks/use-input-handler.js +2 -2
- package/dist/ui/hooks/use-input-handler.js.map +1 -1
- package/dist/ui/utils/image-handler.js +8 -5
- package/dist/ui/utils/image-handler.js.map +1 -1
- package/package.json +1 -1
- package/dist/analyzers/architecture/anti-pattern-detectors/god-object-detector.d.ts +0 -29
- package/dist/analyzers/architecture/anti-pattern-detectors/god-object-detector.js +0 -103
- package/dist/analyzers/architecture/anti-pattern-detectors/god-object-detector.js.map +0 -1
- package/dist/analyzers/architecture/architecture-analyzer.d.ts +0 -58
- package/dist/analyzers/architecture/architecture-analyzer.js +0 -276
- package/dist/analyzers/architecture/architecture-analyzer.js.map +0 -1
- package/dist/analyzers/architecture/index.d.ts +0 -12
- package/dist/analyzers/architecture/index.js +0 -14
- package/dist/analyzers/architecture/index.js.map +0 -1
- package/dist/analyzers/architecture/pattern-detectors/base-detector.d.ts +0 -27
- package/dist/analyzers/architecture/pattern-detectors/base-detector.js +0 -31
- package/dist/analyzers/architecture/pattern-detectors/base-detector.js.map +0 -1
- package/dist/analyzers/architecture/pattern-detectors/clean-architecture-detector.d.ts +0 -11
- package/dist/analyzers/architecture/pattern-detectors/clean-architecture-detector.js +0 -57
- package/dist/analyzers/architecture/pattern-detectors/clean-architecture-detector.js.map +0 -1
- package/dist/analyzers/architecture/pattern-detectors/mvc-detector.d.ts +0 -11
- package/dist/analyzers/architecture/pattern-detectors/mvc-detector.js +0 -43
- package/dist/analyzers/architecture/pattern-detectors/mvc-detector.js.map +0 -1
- package/dist/analyzers/architecture/pattern-detectors/repository-detector.d.ts +0 -11
- package/dist/analyzers/architecture/pattern-detectors/repository-detector.js +0 -49
- package/dist/analyzers/architecture/pattern-detectors/repository-detector.js.map +0 -1
- package/dist/analyzers/architecture/project-structure-scanner.d.ts +0 -54
- package/dist/analyzers/architecture/project-structure-scanner.js +0 -204
- package/dist/analyzers/architecture/project-structure-scanner.js.map +0 -1
- package/dist/analyzers/ast/index.d.ts +0 -13
- package/dist/analyzers/ast/index.js +0 -16
- package/dist/analyzers/ast/index.js.map +0 -1
- package/dist/analyzers/ast/language-parser.d.ts +0 -59
- package/dist/analyzers/ast/language-parser.js +0 -107
- package/dist/analyzers/ast/language-parser.js.map +0 -1
- package/dist/analyzers/ast/multi-language-parser.d.ts +0 -79
- package/dist/analyzers/ast/multi-language-parser.js +0 -157
- package/dist/analyzers/ast/multi-language-parser.js.map +0 -1
- package/dist/analyzers/ast/node-helpers.d.ts +0 -81
- package/dist/analyzers/ast/node-helpers.js +0 -128
- package/dist/analyzers/ast/node-helpers.js.map +0 -1
- package/dist/analyzers/ast/parser.d.ts +0 -60
- package/dist/analyzers/ast/parser.js +0 -305
- package/dist/analyzers/ast/parser.js.map +0 -1
- package/dist/analyzers/ast/traverser.d.ts +0 -67
- package/dist/analyzers/ast/traverser.js +0 -156
- package/dist/analyzers/ast/traverser.js.map +0 -1
- package/dist/analyzers/ast/types.d.ts +0 -107
- package/dist/analyzers/ast/types.js +0 -7
- package/dist/analyzers/ast/types.js.map +0 -1
- package/dist/analyzers/best-practices/base-rule.d.ts +0 -45
- package/dist/analyzers/best-practices/base-rule.js +0 -45
- package/dist/analyzers/best-practices/base-rule.js.map +0 -1
- package/dist/analyzers/best-practices/best-practice-validator.d.ts +0 -35
- package/dist/analyzers/best-practices/best-practice-validator.js +0 -181
- package/dist/analyzers/best-practices/best-practice-validator.js.map +0 -1
- package/dist/analyzers/best-practices/index.d.ts +0 -10
- package/dist/analyzers/best-practices/index.js +0 -11
- package/dist/analyzers/best-practices/index.js.map +0 -1
- package/dist/analyzers/best-practices/rules/index.d.ts +0 -7
- package/dist/analyzers/best-practices/rules/index.js +0 -56
- package/dist/analyzers/best-practices/rules/index.js.map +0 -1
- package/dist/analyzers/best-practices/rules/typescript/consistent-naming.d.ts +0 -17
- package/dist/analyzers/best-practices/rules/typescript/consistent-naming.js +0 -41
- package/dist/analyzers/best-practices/rules/typescript/consistent-naming.js.map +0 -1
- package/dist/analyzers/best-practices/rules/typescript/function-complexity.d.ts +0 -27
- package/dist/analyzers/best-practices/rules/typescript/function-complexity.js +0 -76
- package/dist/analyzers/best-practices/rules/typescript/function-complexity.js.map +0 -1
- package/dist/analyzers/best-practices/rules/typescript/index.d.ts +0 -15
- package/dist/analyzers/best-practices/rules/typescript/index.js +0 -16
- package/dist/analyzers/best-practices/rules/typescript/index.js.map +0 -1
- package/dist/analyzers/best-practices/rules/typescript/max-file-length.d.ts +0 -18
- package/dist/analyzers/best-practices/rules/typescript/max-file-length.js +0 -25
- package/dist/analyzers/best-practices/rules/typescript/max-file-length.js.map +0 -1
- package/dist/analyzers/best-practices/rules/typescript/no-any-type.d.ts +0 -17
- package/dist/analyzers/best-practices/rules/typescript/no-any-type.js +0 -27
- package/dist/analyzers/best-practices/rules/typescript/no-any-type.js.map +0 -1
- package/dist/analyzers/best-practices/rules/typescript/no-implicit-any.d.ts +0 -18
- package/dist/analyzers/best-practices/rules/typescript/no-implicit-any.js +0 -39
- package/dist/analyzers/best-practices/rules/typescript/no-implicit-any.js.map +0 -1
- package/dist/analyzers/best-practices/rules/typescript/no-magic-numbers.d.ts +0 -17
- package/dist/analyzers/best-practices/rules/typescript/no-magic-numbers.js +0 -38
- package/dist/analyzers/best-practices/rules/typescript/no-magic-numbers.js.map +0 -1
- package/dist/analyzers/best-practices/rules/typescript/no-unused-vars.d.ts +0 -17
- package/dist/analyzers/best-practices/rules/typescript/no-unused-vars.js +0 -38
- package/dist/analyzers/best-practices/rules/typescript/no-unused-vars.js.map +0 -1
- package/dist/analyzers/best-practices/rules/typescript/prefer-const.d.ts +0 -17
- package/dist/analyzers/best-practices/rules/typescript/prefer-const.js +0 -35
- package/dist/analyzers/best-practices/rules/typescript/prefer-const.js.map +0 -1
- package/dist/analyzers/best-practices/rules/typescript/prefer-readonly.d.ts +0 -17
- package/dist/analyzers/best-practices/rules/typescript/prefer-readonly.js +0 -36
- package/dist/analyzers/best-practices/rules/typescript/prefer-readonly.js.map +0 -1
- package/dist/analyzers/best-practices/rules/typescript/proper-error-handling.d.ts +0 -17
- package/dist/analyzers/best-practices/rules/typescript/proper-error-handling.js +0 -27
- package/dist/analyzers/best-practices/rules/typescript/proper-error-handling.js.map +0 -1
- package/dist/analyzers/best-practices/types.d.ts +0 -86
- package/dist/analyzers/best-practices/types.js +0 -7
- package/dist/analyzers/best-practices/types.js.map +0 -1
- package/dist/analyzers/cache/analysis-cache.d.ts +0 -41
- package/dist/analyzers/cache/analysis-cache.js +0 -84
- package/dist/analyzers/cache/analysis-cache.js.map +0 -1
- package/dist/analyzers/code-smells/base-smell-detector.d.ts +0 -30
- package/dist/analyzers/code-smells/base-smell-detector.js +0 -44
- package/dist/analyzers/code-smells/base-smell-detector.js.map +0 -1
- package/dist/analyzers/code-smells/code-smell-analyzer.d.ts +0 -30
- package/dist/analyzers/code-smells/code-smell-analyzer.js +0 -167
- package/dist/analyzers/code-smells/code-smell-analyzer.js.map +0 -1
- package/dist/analyzers/code-smells/detectors/data-clumps-detector.d.ts +0 -11
- package/dist/analyzers/code-smells/detectors/data-clumps-detector.js +0 -64
- package/dist/analyzers/code-smells/detectors/data-clumps-detector.js.map +0 -1
- package/dist/analyzers/code-smells/detectors/dead-code-detector.d.ts +0 -11
- package/dist/analyzers/code-smells/detectors/dead-code-detector.js +0 -58
- package/dist/analyzers/code-smells/detectors/dead-code-detector.js.map +0 -1
- package/dist/analyzers/code-smells/detectors/duplicate-code-detector.d.ts +0 -11
- package/dist/analyzers/code-smells/detectors/duplicate-code-detector.js +0 -69
- package/dist/analyzers/code-smells/detectors/duplicate-code-detector.js.map +0 -1
- package/dist/analyzers/code-smells/detectors/feature-envy-detector.d.ts +0 -11
- package/dist/analyzers/code-smells/detectors/feature-envy-detector.js +0 -70
- package/dist/analyzers/code-smells/detectors/feature-envy-detector.js.map +0 -1
- package/dist/analyzers/code-smells/detectors/inappropriate-intimacy-detector.d.ts +0 -11
- package/dist/analyzers/code-smells/detectors/inappropriate-intimacy-detector.js +0 -59
- package/dist/analyzers/code-smells/detectors/inappropriate-intimacy-detector.js.map +0 -1
- package/dist/analyzers/code-smells/detectors/large-class-detector.d.ts +0 -13
- package/dist/analyzers/code-smells/detectors/large-class-detector.js +0 -61
- package/dist/analyzers/code-smells/detectors/large-class-detector.js.map +0 -1
- package/dist/analyzers/code-smells/detectors/long-method-detector.d.ts +0 -12
- package/dist/analyzers/code-smells/detectors/long-method-detector.js +0 -55
- package/dist/analyzers/code-smells/detectors/long-method-detector.js.map +0 -1
- package/dist/analyzers/code-smells/detectors/long-parameter-list-detector.d.ts +0 -12
- package/dist/analyzers/code-smells/detectors/long-parameter-list-detector.js +0 -53
- package/dist/analyzers/code-smells/detectors/long-parameter-list-detector.js.map +0 -1
- package/dist/analyzers/code-smells/detectors/magic-numbers-detector.d.ts +0 -12
- package/dist/analyzers/code-smells/detectors/magic-numbers-detector.js +0 -56
- package/dist/analyzers/code-smells/detectors/magic-numbers-detector.js.map +0 -1
- package/dist/analyzers/code-smells/detectors/nested-conditionals-detector.d.ts +0 -13
- package/dist/analyzers/code-smells/detectors/nested-conditionals-detector.js +0 -77
- package/dist/analyzers/code-smells/detectors/nested-conditionals-detector.js.map +0 -1
- package/dist/analyzers/code-smells/index.d.ts +0 -16
- package/dist/analyzers/code-smells/index.js +0 -19
- package/dist/analyzers/code-smells/index.js.map +0 -1
- package/dist/analyzers/code-smells/types.d.ts +0 -82
- package/dist/analyzers/code-smells/types.js +0 -30
- package/dist/analyzers/code-smells/types.js.map +0 -1
- package/dist/analyzers/dependency/circular-detector.d.ts +0 -17
- package/dist/analyzers/dependency/circular-detector.js +0 -73
- package/dist/analyzers/dependency/circular-detector.js.map +0 -1
- package/dist/analyzers/dependency/coupling-calculator.d.ts +0 -24
- package/dist/analyzers/dependency/coupling-calculator.js +0 -86
- package/dist/analyzers/dependency/coupling-calculator.js.map +0 -1
- package/dist/analyzers/dependency/dependency-analyzer.d.ts +0 -44
- package/dist/analyzers/dependency/dependency-analyzer.js +0 -218
- package/dist/analyzers/dependency/dependency-analyzer.js.map +0 -1
- package/dist/analyzers/dependency/dependency-graph.d.ts +0 -57
- package/dist/analyzers/dependency/dependency-graph.js +0 -198
- package/dist/analyzers/dependency/dependency-graph.js.map +0 -1
- package/dist/analyzers/dependency/index.d.ts +0 -8
- package/dist/analyzers/dependency/index.js +0 -8
- package/dist/analyzers/dependency/index.js.map +0 -1
- package/dist/analyzers/dependency/types.d.ts +0 -105
- package/dist/analyzers/dependency/types.js +0 -5
- package/dist/analyzers/dependency/types.js.map +0 -1
- package/dist/analyzers/errors.d.ts +0 -51
- package/dist/analyzers/errors.js +0 -79
- package/dist/analyzers/errors.js.map +0 -1
- package/dist/analyzers/git/churn-calculator.d.ts +0 -36
- package/dist/analyzers/git/churn-calculator.js +0 -257
- package/dist/analyzers/git/churn-calculator.js.map +0 -1
- package/dist/analyzers/git/git-analyzer.d.ts +0 -19
- package/dist/analyzers/git/git-analyzer.js +0 -79
- package/dist/analyzers/git/git-analyzer.js.map +0 -1
- package/dist/analyzers/git/hotspot-detector.d.ts +0 -34
- package/dist/analyzers/git/hotspot-detector.js +0 -173
- package/dist/analyzers/git/hotspot-detector.js.map +0 -1
- package/dist/analyzers/git/index.d.ts +0 -7
- package/dist/analyzers/git/index.js +0 -7
- package/dist/analyzers/git/index.js.map +0 -1
- package/dist/analyzers/git/types.d.ts +0 -88
- package/dist/analyzers/git/types.js +0 -5
- package/dist/analyzers/git/types.js.map +0 -1
- package/dist/analyzers/metrics/halstead-calculator.d.ts +0 -30
- package/dist/analyzers/metrics/halstead-calculator.js +0 -150
- package/dist/analyzers/metrics/halstead-calculator.js.map +0 -1
- package/dist/analyzers/metrics/index.d.ts +0 -9
- package/dist/analyzers/metrics/index.js +0 -9
- package/dist/analyzers/metrics/index.js.map +0 -1
- package/dist/analyzers/metrics/maintainability-calculator.d.ts +0 -17
- package/dist/analyzers/metrics/maintainability-calculator.js +0 -46
- package/dist/analyzers/metrics/maintainability-calculator.js.map +0 -1
- package/dist/analyzers/metrics/metrics-analyzer.d.ts +0 -32
- package/dist/analyzers/metrics/metrics-analyzer.js +0 -144
- package/dist/analyzers/metrics/metrics-analyzer.js.map +0 -1
- package/dist/analyzers/metrics/types.d.ts +0 -67
- package/dist/analyzers/metrics/types.js +0 -5
- package/dist/analyzers/metrics/types.js.map +0 -1
- package/dist/analyzers/security/base-detector.d.ts +0 -58
- package/dist/analyzers/security/base-detector.js +0 -104
- package/dist/analyzers/security/base-detector.js.map +0 -1
- package/dist/analyzers/security/detectors/command-injection-detector.d.ts +0 -12
- package/dist/analyzers/security/detectors/command-injection-detector.js +0 -84
- package/dist/analyzers/security/detectors/command-injection-detector.js.map +0 -1
- package/dist/analyzers/security/detectors/hardcoded-secrets-detector.d.ts +0 -16
- package/dist/analyzers/security/detectors/hardcoded-secrets-detector.js +0 -140
- package/dist/analyzers/security/detectors/hardcoded-secrets-detector.js.map +0 -1
- package/dist/analyzers/security/detectors/insecure-deserialization-detector.d.ts +0 -12
- package/dist/analyzers/security/detectors/insecure-deserialization-detector.js +0 -109
- package/dist/analyzers/security/detectors/insecure-deserialization-detector.js.map +0 -1
- package/dist/analyzers/security/detectors/insecure-random-detector.d.ts +0 -12
- package/dist/analyzers/security/detectors/insecure-random-detector.js +0 -61
- package/dist/analyzers/security/detectors/insecure-random-detector.js.map +0 -1
- package/dist/analyzers/security/detectors/path-traversal-detector.d.ts +0 -12
- package/dist/analyzers/security/detectors/path-traversal-detector.js +0 -82
- package/dist/analyzers/security/detectors/path-traversal-detector.js.map +0 -1
- package/dist/analyzers/security/detectors/sql-injection-detector.d.ts +0 -12
- package/dist/analyzers/security/detectors/sql-injection-detector.js +0 -88
- package/dist/analyzers/security/detectors/sql-injection-detector.js.map +0 -1
- package/dist/analyzers/security/detectors/weak-crypto-detector.d.ts +0 -12
- package/dist/analyzers/security/detectors/weak-crypto-detector.js +0 -104
- package/dist/analyzers/security/detectors/weak-crypto-detector.js.map +0 -1
- package/dist/analyzers/security/detectors/xss-detector.d.ts +0 -12
- package/dist/analyzers/security/detectors/xss-detector.js +0 -90
- package/dist/analyzers/security/detectors/xss-detector.js.map +0 -1
- package/dist/analyzers/security/index.d.ts +0 -16
- package/dist/analyzers/security/index.js +0 -18
- package/dist/analyzers/security/index.js.map +0 -1
- package/dist/analyzers/security/security-analyzer.d.ts +0 -38
- package/dist/analyzers/security/security-analyzer.js +0 -215
- package/dist/analyzers/security/security-analyzer.js.map +0 -1
- package/dist/analyzers/security/types.d.ts +0 -95
- package/dist/analyzers/security/types.js +0 -7
- package/dist/analyzers/security/types.js.map +0 -1
- package/dist/tools/analysis-tools/architecture-tool.d.ts +0 -46
- package/dist/tools/analysis-tools/architecture-tool.js +0 -124
- package/dist/tools/analysis-tools/architecture-tool.js.map +0 -1
- package/dist/tools/analysis-tools/validation-tool.d.ts +0 -51
- package/dist/tools/analysis-tools/validation-tool.js +0 -121
- package/dist/tools/analysis-tools/validation-tool.js.map +0 -1
- package/dist/tools/analysis-tools.d.ts +0 -73
- package/dist/tools/analysis-tools.js +0 -422
- package/dist/tools/analysis-tools.js.map +0 -1
- package/dist/types/analysis.d.ts +0 -177
- package/dist/types/analysis.js +0 -8
- package/dist/types/analysis.js.map +0 -1
- package/dist/utils/analysis-logger.d.ts +0 -50
- package/dist/utils/analysis-logger.js +0 -73
- package/dist/utils/analysis-logger.js.map +0 -1
|
@@ -1,82 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Code Smell Detector Types
|
|
3
|
-
*/
|
|
4
|
-
/**
|
|
5
|
-
* Type of code smell
|
|
6
|
-
*/
|
|
7
|
-
export declare enum SmellType {
|
|
8
|
-
LONG_METHOD = "LONG_METHOD",
|
|
9
|
-
LARGE_CLASS = "LARGE_CLASS",
|
|
10
|
-
LONG_PARAMETER_LIST = "LONG_PARAMETER_LIST",
|
|
11
|
-
DUPLICATE_CODE = "DUPLICATE_CODE",
|
|
12
|
-
DEAD_CODE = "DEAD_CODE",
|
|
13
|
-
MAGIC_NUMBERS = "MAGIC_NUMBERS",
|
|
14
|
-
NESTED_CONDITIONALS = "NESTED_CONDITIONALS",
|
|
15
|
-
FEATURE_ENVY = "FEATURE_ENVY",
|
|
16
|
-
DATA_CLUMPS = "DATA_CLUMPS",
|
|
17
|
-
INAPPROPRIATE_INTIMACY = "INAPPROPRIATE_INTIMACY"
|
|
18
|
-
}
|
|
19
|
-
/**
|
|
20
|
-
* Severity of code smell
|
|
21
|
-
*/
|
|
22
|
-
export declare enum SmellSeverity {
|
|
23
|
-
LOW = "LOW",
|
|
24
|
-
MEDIUM = "MEDIUM",
|
|
25
|
-
HIGH = "HIGH",
|
|
26
|
-
CRITICAL = "CRITICAL"
|
|
27
|
-
}
|
|
28
|
-
/**
|
|
29
|
-
* Code smell detection result
|
|
30
|
-
*/
|
|
31
|
-
export interface CodeSmell {
|
|
32
|
-
readonly type: SmellType;
|
|
33
|
-
readonly severity: SmellSeverity;
|
|
34
|
-
readonly filePath: string;
|
|
35
|
-
readonly startLine: number;
|
|
36
|
-
readonly endLine: number;
|
|
37
|
-
readonly message: string;
|
|
38
|
-
readonly suggestion: string;
|
|
39
|
-
readonly metadata: Readonly<Record<string, unknown>>;
|
|
40
|
-
}
|
|
41
|
-
/**
|
|
42
|
-
* Detector configuration
|
|
43
|
-
*/
|
|
44
|
-
export interface DetectorConfig {
|
|
45
|
-
readonly enabled: boolean;
|
|
46
|
-
readonly thresholds?: Readonly<Record<string, number>>;
|
|
47
|
-
}
|
|
48
|
-
/**
|
|
49
|
-
* Analysis options
|
|
50
|
-
*/
|
|
51
|
-
export interface CodeSmellAnalysisOptions {
|
|
52
|
-
readonly detectorConfigs?: Readonly<Record<SmellType, DetectorConfig>>;
|
|
53
|
-
readonly ignorePatterns?: readonly string[];
|
|
54
|
-
}
|
|
55
|
-
/**
|
|
56
|
-
* Analysis result
|
|
57
|
-
*/
|
|
58
|
-
export interface CodeSmellAnalysisResult {
|
|
59
|
-
readonly smells: ReadonlyArray<CodeSmell>;
|
|
60
|
-
readonly summary: CodeSmellSummary;
|
|
61
|
-
readonly timestamp: Date;
|
|
62
|
-
}
|
|
63
|
-
/**
|
|
64
|
-
* Summary statistics
|
|
65
|
-
*/
|
|
66
|
-
export interface CodeSmellSummary {
|
|
67
|
-
readonly totalSmells: number;
|
|
68
|
-
readonly smellsByType: Readonly<Record<SmellType, number>>;
|
|
69
|
-
readonly smellsBySeverity: Readonly<Record<SmellSeverity, number>>;
|
|
70
|
-
readonly filesAnalyzed: number;
|
|
71
|
-
readonly filesWithSmells: number;
|
|
72
|
-
readonly averageSmellsPerFile: number;
|
|
73
|
-
readonly codeHealthScore: number;
|
|
74
|
-
}
|
|
75
|
-
/**
|
|
76
|
-
* Base detector interface
|
|
77
|
-
*/
|
|
78
|
-
export interface SmellDetector {
|
|
79
|
-
readonly type: SmellType;
|
|
80
|
-
readonly config: DetectorConfig;
|
|
81
|
-
detect(filePath: string): Promise<CodeSmell[]>;
|
|
82
|
-
}
|
|
@@ -1,30 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Code Smell Detector Types
|
|
3
|
-
*/
|
|
4
|
-
/**
|
|
5
|
-
* Type of code smell
|
|
6
|
-
*/
|
|
7
|
-
export var SmellType;
|
|
8
|
-
(function (SmellType) {
|
|
9
|
-
SmellType["LONG_METHOD"] = "LONG_METHOD";
|
|
10
|
-
SmellType["LARGE_CLASS"] = "LARGE_CLASS";
|
|
11
|
-
SmellType["LONG_PARAMETER_LIST"] = "LONG_PARAMETER_LIST";
|
|
12
|
-
SmellType["DUPLICATE_CODE"] = "DUPLICATE_CODE";
|
|
13
|
-
SmellType["DEAD_CODE"] = "DEAD_CODE";
|
|
14
|
-
SmellType["MAGIC_NUMBERS"] = "MAGIC_NUMBERS";
|
|
15
|
-
SmellType["NESTED_CONDITIONALS"] = "NESTED_CONDITIONALS";
|
|
16
|
-
SmellType["FEATURE_ENVY"] = "FEATURE_ENVY";
|
|
17
|
-
SmellType["DATA_CLUMPS"] = "DATA_CLUMPS";
|
|
18
|
-
SmellType["INAPPROPRIATE_INTIMACY"] = "INAPPROPRIATE_INTIMACY";
|
|
19
|
-
})(SmellType || (SmellType = {}));
|
|
20
|
-
/**
|
|
21
|
-
* Severity of code smell
|
|
22
|
-
*/
|
|
23
|
-
export var SmellSeverity;
|
|
24
|
-
(function (SmellSeverity) {
|
|
25
|
-
SmellSeverity["LOW"] = "LOW";
|
|
26
|
-
SmellSeverity["MEDIUM"] = "MEDIUM";
|
|
27
|
-
SmellSeverity["HIGH"] = "HIGH";
|
|
28
|
-
SmellSeverity["CRITICAL"] = "CRITICAL";
|
|
29
|
-
})(SmellSeverity || (SmellSeverity = {}));
|
|
30
|
-
//# sourceMappingURL=types.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../../src/analyzers/code-smells/types.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH;;GAEG;AACH,MAAM,CAAN,IAAY,SAWX;AAXD,WAAY,SAAS;IACnB,wCAA2B,CAAA;IAC3B,wCAA2B,CAAA;IAC3B,wDAA2C,CAAA;IAC3C,8CAAiC,CAAA;IACjC,oCAAuB,CAAA;IACvB,4CAA+B,CAAA;IAC/B,wDAA2C,CAAA;IAC3C,0CAA6B,CAAA;IAC7B,wCAA2B,CAAA;IAC3B,8DAAiD,CAAA;AACnD,CAAC,EAXW,SAAS,KAAT,SAAS,QAWpB;AAED;;GAEG;AACH,MAAM,CAAN,IAAY,aAKX;AALD,WAAY,aAAa;IACvB,4BAAW,CAAA;IACX,kCAAiB,CAAA;IACjB,8BAAa,CAAA;IACb,sCAAqB,CAAA;AACvB,CAAC,EALW,aAAa,KAAb,aAAa,QAKxB"}
|
|
@@ -1,17 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Circular Dependency Detector
|
|
3
|
-
*
|
|
4
|
-
* Uses Tarjan's Strongly Connected Components algorithm
|
|
5
|
-
*/
|
|
6
|
-
import type { DependencyGraph } from './dependency-graph.js';
|
|
7
|
-
import type { CircularDependency } from './types.js';
|
|
8
|
-
export declare class CircularDependencyDetector {
|
|
9
|
-
/**
|
|
10
|
-
* Detect all circular dependencies
|
|
11
|
-
*/
|
|
12
|
-
detectCycles(graph: DependencyGraph): CircularDependency[];
|
|
13
|
-
/**
|
|
14
|
-
* Create circular dependency object from SCC
|
|
15
|
-
*/
|
|
16
|
-
private createCircularDependency;
|
|
17
|
-
}
|
|
@@ -1,73 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Circular Dependency Detector
|
|
3
|
-
*
|
|
4
|
-
* Uses Tarjan's Strongly Connected Components algorithm
|
|
5
|
-
*/
|
|
6
|
-
export class CircularDependencyDetector {
|
|
7
|
-
/**
|
|
8
|
-
* Detect all circular dependencies
|
|
9
|
-
*/
|
|
10
|
-
detectCycles(graph) {
|
|
11
|
-
const sccs = graph.getStronglyConnectedComponents();
|
|
12
|
-
const cycles = [];
|
|
13
|
-
for (const scc of sccs) {
|
|
14
|
-
if (scc.length > 1) {
|
|
15
|
-
cycles.push(this.createCircularDependency(scc, graph));
|
|
16
|
-
}
|
|
17
|
-
}
|
|
18
|
-
// Sort by severity and impact
|
|
19
|
-
return cycles.sort((a, b) => {
|
|
20
|
-
const severityOrder = { critical: 0, high: 1, medium: 2, low: 3 };
|
|
21
|
-
const severityDiff = severityOrder[a.severity] - severityOrder[b.severity];
|
|
22
|
-
return severityDiff !== 0 ? severityDiff : b.impact - a.impact;
|
|
23
|
-
});
|
|
24
|
-
}
|
|
25
|
-
/**
|
|
26
|
-
* Create circular dependency object from SCC
|
|
27
|
-
*/
|
|
28
|
-
createCircularDependency(cycle, graph) {
|
|
29
|
-
const length = cycle.length;
|
|
30
|
-
// Determine severity based on cycle length
|
|
31
|
-
let severity;
|
|
32
|
-
if (length === 2) {
|
|
33
|
-
severity = 'medium'; // Simple A->B->A cycle
|
|
34
|
-
}
|
|
35
|
-
else if (length <= 4) {
|
|
36
|
-
severity = 'high'; // Complex but manageable
|
|
37
|
-
}
|
|
38
|
-
else {
|
|
39
|
-
severity = 'critical'; // Very complex, hard to refactor
|
|
40
|
-
}
|
|
41
|
-
// Calculate impact based on:
|
|
42
|
-
// 1. Number of files in cycle
|
|
43
|
-
// 2. Total LOC in cycle
|
|
44
|
-
// 3. Coupling of files in cycle
|
|
45
|
-
let totalLOC = 0;
|
|
46
|
-
let totalCoupling = 0;
|
|
47
|
-
for (const file of cycle) {
|
|
48
|
-
const node = graph.getNode(file);
|
|
49
|
-
if (node) {
|
|
50
|
-
totalLOC += node.loc;
|
|
51
|
-
totalCoupling += node.imports.length + node.exports.length;
|
|
52
|
-
}
|
|
53
|
-
}
|
|
54
|
-
// BUG FIX: Safe impact formula with individual component capping to prevent overflow
|
|
55
|
-
// Each component is capped individually before summing to prevent precision loss
|
|
56
|
-
// with very large codebases (1M+ LOC)
|
|
57
|
-
const lengthFactor = Math.min(30, (length / 10) * 30);
|
|
58
|
-
const locFactor = Math.min(40, (totalLOC / 500) * 40);
|
|
59
|
-
const couplingFactor = Math.min(30, (totalCoupling / 20) * 30);
|
|
60
|
-
const impact = Math.min(100, Math.round(lengthFactor + locFactor + couplingFactor));
|
|
61
|
-
// Generate description
|
|
62
|
-
const fileNames = cycle.map(f => f.split('/').pop() || f);
|
|
63
|
-
const description = `Circular dependency detected: ${fileNames.join(' → ')} → ${fileNames[0]}`;
|
|
64
|
-
return Object.freeze({
|
|
65
|
-
cycle: Object.freeze(cycle),
|
|
66
|
-
length,
|
|
67
|
-
severity,
|
|
68
|
-
impact,
|
|
69
|
-
description,
|
|
70
|
-
});
|
|
71
|
-
}
|
|
72
|
-
}
|
|
73
|
-
//# sourceMappingURL=circular-detector.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"circular-detector.js","sourceRoot":"","sources":["../../../src/analyzers/dependency/circular-detector.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,24 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Coupling Metrics Calculator
|
|
3
|
-
*
|
|
4
|
-
* Calculates:
|
|
5
|
-
* - Afferent Coupling (Ca): How many files depend on this
|
|
6
|
-
* - Efferent Coupling (Ce): How many files this depends on
|
|
7
|
-
* - Instability (I): Ce / (Ce + Ca)
|
|
8
|
-
* - Abstractness (A): Abstract elements / Total elements
|
|
9
|
-
* - Distance from Main Sequence (D): |A + I - 1|
|
|
10
|
-
*/
|
|
11
|
-
import type { DependencyGraph } from './dependency-graph.js';
|
|
12
|
-
import type { CouplingMetrics } from './types.js';
|
|
13
|
-
import type { FileASTInfo } from '../ast/types.js';
|
|
14
|
-
export declare class CouplingCalculator {
|
|
15
|
-
/**
|
|
16
|
-
* Calculate coupling metrics for all files
|
|
17
|
-
*/
|
|
18
|
-
calculateMetrics(graph: DependencyGraph, astMap: Map<string, FileASTInfo>): CouplingMetrics[];
|
|
19
|
-
/**
|
|
20
|
-
* Calculate abstractness of a file
|
|
21
|
-
* A = abstract classes + interfaces / total classes + functions
|
|
22
|
-
*/
|
|
23
|
-
private calculateAbstractness;
|
|
24
|
-
}
|
|
@@ -1,86 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Coupling Metrics Calculator
|
|
3
|
-
*
|
|
4
|
-
* Calculates:
|
|
5
|
-
* - Afferent Coupling (Ca): How many files depend on this
|
|
6
|
-
* - Efferent Coupling (Ce): How many files this depends on
|
|
7
|
-
* - Instability (I): Ce / (Ce + Ca)
|
|
8
|
-
* - Abstractness (A): Abstract elements / Total elements
|
|
9
|
-
* - Distance from Main Sequence (D): |A + I - 1|
|
|
10
|
-
*/
|
|
11
|
-
export class CouplingCalculator {
|
|
12
|
-
/**
|
|
13
|
-
* Calculate coupling metrics for all files
|
|
14
|
-
*/
|
|
15
|
-
calculateMetrics(graph, astMap) {
|
|
16
|
-
const metrics = [];
|
|
17
|
-
for (const node of graph.getNodes()) {
|
|
18
|
-
const file = node.filePath;
|
|
19
|
-
const ca = graph.getAfferentDependencies(file).length;
|
|
20
|
-
const ce = graph.getEfferentDependencies(file).length;
|
|
21
|
-
// Instability: I = Ce / (Ce + Ca)
|
|
22
|
-
// I = 0: Maximally stable (many dependents, few dependencies)
|
|
23
|
-
// I = 1: Maximally unstable (few dependents, many dependencies)
|
|
24
|
-
const instability = (ce + ca) === 0 ? 0 : ce / (ce + ca);
|
|
25
|
-
// Abstractness: A = abstract elements / total elements
|
|
26
|
-
const ast = astMap.get(file);
|
|
27
|
-
const abstractness = ast ? this.calculateAbstractness(ast) : 0;
|
|
28
|
-
// Distance from Main Sequence: D = |A + I - 1|
|
|
29
|
-
// D = 0: On the main sequence (ideal)
|
|
30
|
-
// D > 0.5: In "zone of pain" (concrete + unstable) or "zone of uselessness" (abstract + stable)
|
|
31
|
-
const distance = Math.abs(abstractness + instability - 1);
|
|
32
|
-
// Determine zone
|
|
33
|
-
let zone;
|
|
34
|
-
if (abstractness > 0.7 && instability < 0.3) {
|
|
35
|
-
zone = 'useless'; // Abstract but no dependents
|
|
36
|
-
}
|
|
37
|
-
else if (abstractness < 0.3 && instability > 0.7) {
|
|
38
|
-
zone = 'painful'; // Concrete and many dependencies
|
|
39
|
-
}
|
|
40
|
-
else {
|
|
41
|
-
zone = 'balanced';
|
|
42
|
-
}
|
|
43
|
-
metrics.push(Object.freeze({
|
|
44
|
-
file,
|
|
45
|
-
afferentCoupling: ca,
|
|
46
|
-
efferentCoupling: ce,
|
|
47
|
-
instability,
|
|
48
|
-
abstractness,
|
|
49
|
-
distanceFromMainSequence: distance,
|
|
50
|
-
zone,
|
|
51
|
-
}));
|
|
52
|
-
}
|
|
53
|
-
return metrics;
|
|
54
|
-
}
|
|
55
|
-
/**
|
|
56
|
-
* Calculate abstractness of a file
|
|
57
|
-
* A = abstract classes + interfaces / total classes + functions
|
|
58
|
-
*/
|
|
59
|
-
calculateAbstractness(ast) {
|
|
60
|
-
let abstractCount = 0;
|
|
61
|
-
let totalCount = 0;
|
|
62
|
-
// Count classes
|
|
63
|
-
for (const cls of ast.classes) {
|
|
64
|
-
totalCount++;
|
|
65
|
-
// Heuristic: Consider class abstract if:
|
|
66
|
-
// 1. Name starts with 'Abstract' or 'Base' or 'I'
|
|
67
|
-
// 2. Implements interfaces (likely an abstraction)
|
|
68
|
-
const isAbstract = cls.name.startsWith('Abstract') ||
|
|
69
|
-
cls.name.startsWith('Base') ||
|
|
70
|
-
cls.name.startsWith('I') ||
|
|
71
|
-
cls.implementsInterfaces.length > 0;
|
|
72
|
-
if (isAbstract) {
|
|
73
|
-
abstractCount++;
|
|
74
|
-
}
|
|
75
|
-
}
|
|
76
|
-
// Count type exports as abstract
|
|
77
|
-
// (interfaces, type aliases)
|
|
78
|
-
const typeExports = ast.exports.filter(exp => exp.type === 'type');
|
|
79
|
-
abstractCount += typeExports.length;
|
|
80
|
-
totalCount += typeExports.length;
|
|
81
|
-
// Functions are always concrete
|
|
82
|
-
totalCount += ast.functions.length;
|
|
83
|
-
return totalCount === 0 ? 0 : abstractCount / totalCount;
|
|
84
|
-
}
|
|
85
|
-
}
|
|
86
|
-
//# sourceMappingURL=coupling-calculator.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"coupling-calculator.js","sourceRoot":"","sources":["../../../src/analyzers/dependency/coupling-calculator.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,44 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Dependency Analyzer
|
|
3
|
-
*
|
|
4
|
-
* Main orchestrator for dependency analysis
|
|
5
|
-
*/
|
|
6
|
-
import type { DependencyAnalysisResult, DependencyAnalysisOptions } from './types.js';
|
|
7
|
-
/**
|
|
8
|
-
* Default file patterns for multi-language support
|
|
9
|
-
*/
|
|
10
|
-
export declare const DEFAULT_ANALYSIS_PATTERN = "**/*.{ts,tsx,js,jsx,py,rs,go,c,cpp,cc,cxx,h,hpp,swift}";
|
|
11
|
-
export declare class DependencyAnalyzer {
|
|
12
|
-
private astParser;
|
|
13
|
-
private circularDetector;
|
|
14
|
-
private couplingCalculator;
|
|
15
|
-
constructor();
|
|
16
|
-
/**
|
|
17
|
-
* Analyze dependencies in a directory
|
|
18
|
-
*/
|
|
19
|
-
analyzeDependencies(directory: string, pattern?: string, options?: DependencyAnalysisOptions): Promise<DependencyAnalysisResult>;
|
|
20
|
-
/**
|
|
21
|
-
* Create import edges from AST imports
|
|
22
|
-
*/
|
|
23
|
-
private createImportEdges;
|
|
24
|
-
/**
|
|
25
|
-
* Create export edges from AST exports
|
|
26
|
-
*/
|
|
27
|
-
private createExportEdges;
|
|
28
|
-
/**
|
|
29
|
-
* Resolve import specifier to absolute file path
|
|
30
|
-
*/
|
|
31
|
-
private resolveImportPath;
|
|
32
|
-
/**
|
|
33
|
-
* Find orphaned files (no dependencies)
|
|
34
|
-
*/
|
|
35
|
-
private findOrphanedFiles;
|
|
36
|
-
/**
|
|
37
|
-
* Find hub files (high coupling)
|
|
38
|
-
*/
|
|
39
|
-
private findHubFiles;
|
|
40
|
-
/**
|
|
41
|
-
* Calculate summary statistics
|
|
42
|
-
*/
|
|
43
|
-
private calculateSummary;
|
|
44
|
-
}
|
|
@@ -1,218 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Dependency Analyzer
|
|
3
|
-
*
|
|
4
|
-
* Main orchestrator for dependency analysis
|
|
5
|
-
*/
|
|
6
|
-
import { DependencyGraph } from './dependency-graph.js';
|
|
7
|
-
import { CircularDependencyDetector } from './circular-detector.js';
|
|
8
|
-
import { CouplingCalculator } from './coupling-calculator.js';
|
|
9
|
-
import { getMultiLanguageParser } from '../ast/multi-language-parser.js';
|
|
10
|
-
import { existsSync, promises as fs } from 'fs';
|
|
11
|
-
import { glob } from 'glob';
|
|
12
|
-
import path from 'path';
|
|
13
|
-
/**
|
|
14
|
-
* Default file patterns for multi-language support
|
|
15
|
-
*/
|
|
16
|
-
export const DEFAULT_ANALYSIS_PATTERN = '**/*.{ts,tsx,js,jsx,py,rs,go,c,cpp,cc,cxx,h,hpp,swift}';
|
|
17
|
-
export class DependencyAnalyzer {
|
|
18
|
-
astParser;
|
|
19
|
-
circularDetector;
|
|
20
|
-
couplingCalculator;
|
|
21
|
-
constructor() {
|
|
22
|
-
this.astParser = getMultiLanguageParser();
|
|
23
|
-
this.circularDetector = new CircularDependencyDetector();
|
|
24
|
-
this.couplingCalculator = new CouplingCalculator();
|
|
25
|
-
}
|
|
26
|
-
/**
|
|
27
|
-
* Analyze dependencies in a directory
|
|
28
|
-
*/
|
|
29
|
-
async analyzeDependencies(directory, pattern = '**/*.{ts,tsx,js,jsx}', options = {}) {
|
|
30
|
-
const timestamp = new Date();
|
|
31
|
-
// Find all files
|
|
32
|
-
const ignorePatterns = [
|
|
33
|
-
'**/node_modules/**',
|
|
34
|
-
'**/dist/**',
|
|
35
|
-
'**/build/**',
|
|
36
|
-
'**/.git/**',
|
|
37
|
-
...(options.ignorePatterns || []),
|
|
38
|
-
];
|
|
39
|
-
const files = await glob(pattern, {
|
|
40
|
-
cwd: directory,
|
|
41
|
-
absolute: true,
|
|
42
|
-
nodir: true,
|
|
43
|
-
ignore: ignorePatterns,
|
|
44
|
-
});
|
|
45
|
-
// Build dependency graph
|
|
46
|
-
const graph = new DependencyGraph();
|
|
47
|
-
const astMap = new Map();
|
|
48
|
-
// Parse all files
|
|
49
|
-
for (const file of files) {
|
|
50
|
-
try {
|
|
51
|
-
const ast = await this.astParser.parseFile(file);
|
|
52
|
-
astMap.set(file, ast);
|
|
53
|
-
// Get file stats
|
|
54
|
-
const stats = await fs.stat(file);
|
|
55
|
-
// Create dependency node
|
|
56
|
-
const node = {
|
|
57
|
-
filePath: file,
|
|
58
|
-
imports: this.createImportEdges(file, ast.imports, directory),
|
|
59
|
-
exports: this.createExportEdges(file, ast.exports),
|
|
60
|
-
size: stats.size,
|
|
61
|
-
loc: ast.totalLines,
|
|
62
|
-
};
|
|
63
|
-
graph.addNode(node);
|
|
64
|
-
// Add edges for internal imports
|
|
65
|
-
for (const imp of node.imports) {
|
|
66
|
-
if (!options.includeNodeModules && imp.to.includes('node_modules')) {
|
|
67
|
-
continue;
|
|
68
|
-
}
|
|
69
|
-
graph.addEdge(imp.from, imp.to);
|
|
70
|
-
}
|
|
71
|
-
}
|
|
72
|
-
catch (error) {
|
|
73
|
-
// Skip files that can't be parsed
|
|
74
|
-
console.error(`Error parsing ${file}:`, error);
|
|
75
|
-
}
|
|
76
|
-
}
|
|
77
|
-
// Detect circular dependencies
|
|
78
|
-
const circularDependencies = this.circularDetector.detectCycles(graph);
|
|
79
|
-
// Calculate coupling metrics
|
|
80
|
-
const couplingMetrics = this.couplingCalculator.calculateMetrics(graph, astMap);
|
|
81
|
-
// Find orphaned files (no imports/exports or isolated)
|
|
82
|
-
const orphanedFiles = this.findOrphanedFiles(graph);
|
|
83
|
-
// Find hub files (high coupling)
|
|
84
|
-
const hubFiles = this.findHubFiles(couplingMetrics);
|
|
85
|
-
// Calculate summary
|
|
86
|
-
const summary = this.calculateSummary(graph, circularDependencies, couplingMetrics);
|
|
87
|
-
return Object.freeze({
|
|
88
|
-
graph,
|
|
89
|
-
circularDependencies: Object.freeze(circularDependencies),
|
|
90
|
-
couplingMetrics: Object.freeze(couplingMetrics),
|
|
91
|
-
orphanedFiles: Object.freeze(orphanedFiles),
|
|
92
|
-
hubFiles: Object.freeze(hubFiles),
|
|
93
|
-
summary: Object.freeze(summary),
|
|
94
|
-
timestamp,
|
|
95
|
-
});
|
|
96
|
-
}
|
|
97
|
-
/**
|
|
98
|
-
* Create import edges from AST imports
|
|
99
|
-
*/
|
|
100
|
-
createImportEdges(file, imports, baseDir) {
|
|
101
|
-
return imports.map(imp => {
|
|
102
|
-
const resolvedPath = this.resolveImportPath(file, imp.moduleSpecifier, baseDir);
|
|
103
|
-
return Object.freeze({
|
|
104
|
-
from: file,
|
|
105
|
-
to: resolvedPath,
|
|
106
|
-
importedSymbols: Object.freeze([
|
|
107
|
-
...imp.namedImports,
|
|
108
|
-
...(imp.defaultImport ? [imp.defaultImport] : []),
|
|
109
|
-
...(imp.namespaceImport ? [imp.namespaceImport] : []),
|
|
110
|
-
]),
|
|
111
|
-
isDynamic: false,
|
|
112
|
-
isTypeOnly: imp.isTypeOnly || false,
|
|
113
|
-
});
|
|
114
|
-
});
|
|
115
|
-
}
|
|
116
|
-
/**
|
|
117
|
-
* Create export edges from AST exports
|
|
118
|
-
*/
|
|
119
|
-
createExportEdges(file, exports) {
|
|
120
|
-
return exports.map(exp => Object.freeze({
|
|
121
|
-
from: file,
|
|
122
|
-
symbols: Object.freeze([exp.name]),
|
|
123
|
-
isDefault: exp.isDefault,
|
|
124
|
-
isReExport: false, // Simplified for now
|
|
125
|
-
}));
|
|
126
|
-
}
|
|
127
|
-
/**
|
|
128
|
-
* Resolve import specifier to absolute file path
|
|
129
|
-
*/
|
|
130
|
-
resolveImportPath(fromFile, specifier, baseDir) {
|
|
131
|
-
if (specifier.startsWith('.')) {
|
|
132
|
-
// Relative import
|
|
133
|
-
const fromDir = path.dirname(fromFile);
|
|
134
|
-
let resolved = path.resolve(fromDir, specifier);
|
|
135
|
-
// Remove .js extension if present (TypeScript uses .js in imports)
|
|
136
|
-
if (resolved.endsWith('.js')) {
|
|
137
|
-
resolved = resolved.slice(0, -3);
|
|
138
|
-
}
|
|
139
|
-
// Try extensions
|
|
140
|
-
const extensions = ['.ts', '.tsx', '.js', '.jsx', '/index.ts', '/index.tsx', '/index.js'];
|
|
141
|
-
for (const ext of extensions) {
|
|
142
|
-
const testPath = resolved.endsWith('.ts') || resolved.endsWith('.tsx')
|
|
143
|
-
? resolved
|
|
144
|
-
: resolved + ext;
|
|
145
|
-
try {
|
|
146
|
-
if (existsSync(testPath)) {
|
|
147
|
-
return testPath;
|
|
148
|
-
}
|
|
149
|
-
}
|
|
150
|
-
catch {
|
|
151
|
-
// Continue to next extension
|
|
152
|
-
}
|
|
153
|
-
}
|
|
154
|
-
// Return resolved path even if file doesn't exist
|
|
155
|
-
return resolved + '.ts'; // Default to .ts
|
|
156
|
-
}
|
|
157
|
-
// External module
|
|
158
|
-
return path.join(baseDir, 'node_modules', specifier);
|
|
159
|
-
}
|
|
160
|
-
/**
|
|
161
|
-
* Find orphaned files (no dependencies)
|
|
162
|
-
*/
|
|
163
|
-
findOrphanedFiles(graph) {
|
|
164
|
-
const orphaned = [];
|
|
165
|
-
for (const node of graph.getNodes()) {
|
|
166
|
-
const afferent = graph.getAfferentDependencies(node.filePath);
|
|
167
|
-
const efferent = graph.getEfferentDependencies(node.filePath);
|
|
168
|
-
if (afferent.length === 0 && efferent.length === 0) {
|
|
169
|
-
orphaned.push(node.filePath);
|
|
170
|
-
}
|
|
171
|
-
}
|
|
172
|
-
return orphaned;
|
|
173
|
-
}
|
|
174
|
-
/**
|
|
175
|
-
* Find hub files (high coupling)
|
|
176
|
-
*/
|
|
177
|
-
findHubFiles(metrics) {
|
|
178
|
-
if (metrics.length === 0)
|
|
179
|
-
return [];
|
|
180
|
-
// Hub = high afferent OR efferent coupling (top 10%)
|
|
181
|
-
const sorted = [...metrics].sort((a, b) => (b.afferentCoupling + b.efferentCoupling) -
|
|
182
|
-
(a.afferentCoupling + a.efferentCoupling));
|
|
183
|
-
const threshold = Math.max(1, Math.ceil(sorted.length * 0.1));
|
|
184
|
-
return sorted.slice(0, threshold).map(m => m.file);
|
|
185
|
-
}
|
|
186
|
-
/**
|
|
187
|
-
* Calculate summary statistics
|
|
188
|
-
*/
|
|
189
|
-
calculateSummary(graph, circularDeps, metrics) {
|
|
190
|
-
const totalFiles = graph.getNodes().length;
|
|
191
|
-
const totalDependencies = graph.getTotalEdges();
|
|
192
|
-
const avgCa = totalFiles > 0
|
|
193
|
-
? metrics.reduce((sum, m) => sum + m.afferentCoupling, 0) / totalFiles
|
|
194
|
-
: 0;
|
|
195
|
-
const avgCe = totalFiles > 0
|
|
196
|
-
? metrics.reduce((sum, m) => sum + m.efferentCoupling, 0) / totalFiles
|
|
197
|
-
: 0;
|
|
198
|
-
const avgInstability = totalFiles > 0
|
|
199
|
-
? metrics.reduce((sum, m) => sum + m.instability, 0) / totalFiles
|
|
200
|
-
: 0;
|
|
201
|
-
const maxCycleLength = circularDeps.reduce((max, dep) => Math.max(max, dep.length), 0);
|
|
202
|
-
// Health score (0-100)
|
|
203
|
-
const circularPenalty = Math.min(50, circularDeps.length * 5);
|
|
204
|
-
const instabilityPenalty = avgInstability * 20;
|
|
205
|
-
const healthScore = Math.max(0, 100 - circularPenalty - instabilityPenalty);
|
|
206
|
-
return Object.freeze({
|
|
207
|
-
totalFiles,
|
|
208
|
-
totalDependencies,
|
|
209
|
-
averageAfferentCoupling: avgCa,
|
|
210
|
-
averageEfferentCoupling: avgCe,
|
|
211
|
-
averageInstability: avgInstability,
|
|
212
|
-
circularDependencyCount: circularDeps.length,
|
|
213
|
-
maxCycleLength,
|
|
214
|
-
healthScore: Math.round(healthScore),
|
|
215
|
-
});
|
|
216
|
-
}
|
|
217
|
-
}
|
|
218
|
-
//# sourceMappingURL=dependency-analyzer.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"dependency-analyzer.js","sourceRoot":"","sources":["../../../src/analyzers/dependency/dependency-analyzer.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,57 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Dependency Graph Implementation
|
|
3
|
-
*
|
|
4
|
-
* Adjacency list-based directed graph for file dependencies
|
|
5
|
-
*/
|
|
6
|
-
import type { DependencyNode, DependencyGraph as IDependencyGraph } from './types.js';
|
|
7
|
-
export declare class DependencyGraph implements IDependencyGraph {
|
|
8
|
-
private nodes;
|
|
9
|
-
private adjacencyList;
|
|
10
|
-
private reverseAdjacencyList;
|
|
11
|
-
constructor();
|
|
12
|
-
/**
|
|
13
|
-
* Add node to graph
|
|
14
|
-
*/
|
|
15
|
-
addNode(node: DependencyNode): void;
|
|
16
|
-
/**
|
|
17
|
-
* Add directed edge from -> to
|
|
18
|
-
*/
|
|
19
|
-
addEdge(from: string, to: string): void;
|
|
20
|
-
/**
|
|
21
|
-
* Get node by file path
|
|
22
|
-
*/
|
|
23
|
-
getNode(file: string): DependencyNode | undefined;
|
|
24
|
-
/**
|
|
25
|
-
* Get all nodes
|
|
26
|
-
*/
|
|
27
|
-
getNodes(): DependencyNode[];
|
|
28
|
-
/**
|
|
29
|
-
* Get afferent dependencies (files that depend on this file)
|
|
30
|
-
*/
|
|
31
|
-
getAfferentDependencies(file: string): string[];
|
|
32
|
-
/**
|
|
33
|
-
* Get efferent dependencies (files this file depends on)
|
|
34
|
-
*/
|
|
35
|
-
getEfferentDependencies(file: string): string[];
|
|
36
|
-
/**
|
|
37
|
-
* Get total number of edges
|
|
38
|
-
*/
|
|
39
|
-
getTotalEdges(): number;
|
|
40
|
-
/**
|
|
41
|
-
* Check if path exists from -> to using BFS
|
|
42
|
-
*/
|
|
43
|
-
hasPath(from: string, to: string): boolean;
|
|
44
|
-
/**
|
|
45
|
-
* Topological sort using DFS
|
|
46
|
-
* Returns sorted list and whether cycle was detected
|
|
47
|
-
*/
|
|
48
|
-
topologicalSort(): {
|
|
49
|
-
sorted: string[];
|
|
50
|
-
hasCycle: boolean;
|
|
51
|
-
};
|
|
52
|
-
/**
|
|
53
|
-
* Get strongly connected components using Tarjan's algorithm
|
|
54
|
-
* (Used for circular dependency detection)
|
|
55
|
-
*/
|
|
56
|
-
getStronglyConnectedComponents(): string[][];
|
|
57
|
-
}
|