@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,88 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Git Integration Types
|
|
3
|
-
*/
|
|
4
|
-
/**
|
|
5
|
-
* Git commit information
|
|
6
|
-
*/
|
|
7
|
-
export interface GitCommit {
|
|
8
|
-
readonly hash: string;
|
|
9
|
-
readonly author: string;
|
|
10
|
-
readonly date: Date;
|
|
11
|
-
readonly message: string;
|
|
12
|
-
readonly filesChanged: ReadonlyArray<string>;
|
|
13
|
-
}
|
|
14
|
-
/**
|
|
15
|
-
* File churn metrics
|
|
16
|
-
*/
|
|
17
|
-
export interface FileChurn {
|
|
18
|
-
readonly filePath: string;
|
|
19
|
-
readonly commitCount: number;
|
|
20
|
-
readonly additions: number;
|
|
21
|
-
readonly deletions: number;
|
|
22
|
-
readonly totalChurn: number;
|
|
23
|
-
readonly lastModified: Date;
|
|
24
|
-
readonly authors: ReadonlyArray<string>;
|
|
25
|
-
}
|
|
26
|
-
/**
|
|
27
|
-
* Code hotspot (high churn + high complexity)
|
|
28
|
-
*/
|
|
29
|
-
export interface CodeHotspot {
|
|
30
|
-
readonly filePath: string;
|
|
31
|
-
readonly hotspotScore: number;
|
|
32
|
-
readonly churnScore: number;
|
|
33
|
-
readonly complexityScore: number;
|
|
34
|
-
readonly commitCount: number;
|
|
35
|
-
readonly totalChurn: number;
|
|
36
|
-
readonly averageComplexity: number;
|
|
37
|
-
readonly maxComplexity: number;
|
|
38
|
-
readonly severity: 'LOW' | 'MEDIUM' | 'HIGH' | 'CRITICAL';
|
|
39
|
-
readonly reason: string;
|
|
40
|
-
readonly recommendation: string;
|
|
41
|
-
}
|
|
42
|
-
/**
|
|
43
|
-
* Contributor statistics
|
|
44
|
-
*/
|
|
45
|
-
export interface ContributorStats {
|
|
46
|
-
readonly author: string;
|
|
47
|
-
readonly commitCount: number;
|
|
48
|
-
readonly filesChanged: number;
|
|
49
|
-
readonly linesAdded: number;
|
|
50
|
-
readonly linesDeleted: number;
|
|
51
|
-
readonly firstCommit: Date;
|
|
52
|
-
readonly lastCommit: Date;
|
|
53
|
-
}
|
|
54
|
-
/**
|
|
55
|
-
* Git analysis result
|
|
56
|
-
*/
|
|
57
|
-
export interface GitAnalysisResult {
|
|
58
|
-
readonly hotspots: ReadonlyArray<CodeHotspot>;
|
|
59
|
-
readonly churnMetrics: ReadonlyArray<FileChurn>;
|
|
60
|
-
readonly contributors: ReadonlyArray<ContributorStats>;
|
|
61
|
-
readonly summary: GitAnalysisSummary;
|
|
62
|
-
readonly timestamp: Date;
|
|
63
|
-
}
|
|
64
|
-
/**
|
|
65
|
-
* Analysis summary
|
|
66
|
-
*/
|
|
67
|
-
export interface GitAnalysisSummary {
|
|
68
|
-
readonly totalCommits: number;
|
|
69
|
-
readonly filesAnalyzed: number;
|
|
70
|
-
readonly hotspotCount: number;
|
|
71
|
-
readonly averageChurn: number;
|
|
72
|
-
readonly topContributor: string;
|
|
73
|
-
readonly dateRange: {
|
|
74
|
-
readonly from: Date;
|
|
75
|
-
readonly to: Date;
|
|
76
|
-
};
|
|
77
|
-
}
|
|
78
|
-
/**
|
|
79
|
-
* Analysis options
|
|
80
|
-
*/
|
|
81
|
-
export interface GitAnalysisOptions {
|
|
82
|
-
readonly since?: string;
|
|
83
|
-
readonly until?: string;
|
|
84
|
-
readonly branch?: string;
|
|
85
|
-
readonly includePatterns?: readonly string[];
|
|
86
|
-
readonly excludePatterns?: readonly string[];
|
|
87
|
-
readonly hotspotThreshold?: number;
|
|
88
|
-
}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../../src/analyzers/git/types.ts"],"names":[],"mappings":"AAAA;;GAEG"}
|
|
@@ -1,30 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Halstead Complexity Calculator
|
|
3
|
-
*
|
|
4
|
-
* Calculates Halstead metrics from source code tokens
|
|
5
|
-
*/
|
|
6
|
-
import type { HalsteadMetrics } from './types.js';
|
|
7
|
-
export declare class HalsteadCalculator {
|
|
8
|
-
private astParser;
|
|
9
|
-
constructor();
|
|
10
|
-
/**
|
|
11
|
-
* Calculate Halstead metrics for a file
|
|
12
|
-
*/
|
|
13
|
-
calculateMetrics(filePath: string): HalsteadMetrics;
|
|
14
|
-
/**
|
|
15
|
-
* Compute Halstead metrics from counts
|
|
16
|
-
*/
|
|
17
|
-
private computeMetrics;
|
|
18
|
-
/**
|
|
19
|
-
* Check if node is an operator
|
|
20
|
-
*/
|
|
21
|
-
private isOperator;
|
|
22
|
-
/**
|
|
23
|
-
* Check if node is an operand
|
|
24
|
-
*/
|
|
25
|
-
private isOperand;
|
|
26
|
-
/**
|
|
27
|
-
* Get operator symbol for syntax kind
|
|
28
|
-
*/
|
|
29
|
-
private getOperatorSymbol;
|
|
30
|
-
}
|
|
@@ -1,150 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Halstead Complexity Calculator
|
|
3
|
-
*
|
|
4
|
-
* Calculates Halstead metrics from source code tokens
|
|
5
|
-
*/
|
|
6
|
-
import { SyntaxKind } from 'ts-morph';
|
|
7
|
-
import { ASTParser } from '../ast/parser.js';
|
|
8
|
-
export class HalsteadCalculator {
|
|
9
|
-
astParser;
|
|
10
|
-
constructor() {
|
|
11
|
-
this.astParser = new ASTParser();
|
|
12
|
-
}
|
|
13
|
-
/**
|
|
14
|
-
* Calculate Halstead metrics for a file
|
|
15
|
-
*/
|
|
16
|
-
calculateMetrics(filePath) {
|
|
17
|
-
const sourceFile = this.astParser.getSourceFile(filePath);
|
|
18
|
-
const operators = new Set();
|
|
19
|
-
const operands = new Set();
|
|
20
|
-
let operatorCount = 0;
|
|
21
|
-
let operandCount = 0;
|
|
22
|
-
// Traverse AST and count operators/operands
|
|
23
|
-
sourceFile.forEachDescendant((node) => {
|
|
24
|
-
const kind = node.getKind();
|
|
25
|
-
const text = node.getText();
|
|
26
|
-
// Operators
|
|
27
|
-
if (this.isOperator(kind)) {
|
|
28
|
-
operators.add(this.getOperatorSymbol(kind));
|
|
29
|
-
operatorCount++;
|
|
30
|
-
}
|
|
31
|
-
// Operands (identifiers, literals)
|
|
32
|
-
else if (this.isOperand(kind)) {
|
|
33
|
-
operands.add(text);
|
|
34
|
-
operandCount++;
|
|
35
|
-
}
|
|
36
|
-
});
|
|
37
|
-
const n1 = operators.size;
|
|
38
|
-
const n2 = operands.size;
|
|
39
|
-
const N1 = operatorCount;
|
|
40
|
-
const N2 = operandCount;
|
|
41
|
-
return this.computeMetrics(n1, n2, N1, N2);
|
|
42
|
-
}
|
|
43
|
-
/**
|
|
44
|
-
* Compute Halstead metrics from counts
|
|
45
|
-
*/
|
|
46
|
-
computeMetrics(n1, n2, N1, N2) {
|
|
47
|
-
const vocabulary = n1 + n2;
|
|
48
|
-
const length = N1 + N2;
|
|
49
|
-
const calculatedLength = n1 > 0 && n2 > 0
|
|
50
|
-
? n1 * Math.log2(n1) + n2 * Math.log2(n2)
|
|
51
|
-
: 0;
|
|
52
|
-
const volume = length > 0 && vocabulary > 0
|
|
53
|
-
? length * Math.log2(vocabulary)
|
|
54
|
-
: 0;
|
|
55
|
-
const difficulty = n1 > 0 && n2 > 0 && N2 > 0
|
|
56
|
-
? (n1 / 2) * (N2 / n2)
|
|
57
|
-
: 0;
|
|
58
|
-
const effort = difficulty * volume;
|
|
59
|
-
const time = effort / 18; // Seconds to program
|
|
60
|
-
const bugs = volume / 3000; // Estimated delivered bugs
|
|
61
|
-
return Object.freeze({
|
|
62
|
-
n1,
|
|
63
|
-
n2,
|
|
64
|
-
N1,
|
|
65
|
-
N2,
|
|
66
|
-
vocabulary,
|
|
67
|
-
length,
|
|
68
|
-
calculatedLength: Math.round(calculatedLength * 100) / 100,
|
|
69
|
-
volume: Math.round(volume * 100) / 100,
|
|
70
|
-
difficulty: Math.round(difficulty * 100) / 100,
|
|
71
|
-
effort: Math.round(effort * 100) / 100,
|
|
72
|
-
time: Math.round(time * 100) / 100,
|
|
73
|
-
bugs: Math.round(bugs * 1000) / 1000,
|
|
74
|
-
});
|
|
75
|
-
}
|
|
76
|
-
/**
|
|
77
|
-
* Check if node is an operator
|
|
78
|
-
*/
|
|
79
|
-
isOperator(kind) {
|
|
80
|
-
const operators = [
|
|
81
|
-
SyntaxKind.PlusToken,
|
|
82
|
-
SyntaxKind.MinusToken,
|
|
83
|
-
SyntaxKind.AsteriskToken,
|
|
84
|
-
SyntaxKind.SlashToken,
|
|
85
|
-
SyntaxKind.PercentToken,
|
|
86
|
-
SyntaxKind.EqualsToken,
|
|
87
|
-
SyntaxKind.EqualsEqualsToken,
|
|
88
|
-
SyntaxKind.EqualsEqualsEqualsToken,
|
|
89
|
-
SyntaxKind.ExclamationEqualsToken,
|
|
90
|
-
SyntaxKind.ExclamationEqualsEqualsToken,
|
|
91
|
-
SyntaxKind.LessThanToken,
|
|
92
|
-
SyntaxKind.GreaterThanToken,
|
|
93
|
-
SyntaxKind.LessThanEqualsToken,
|
|
94
|
-
SyntaxKind.GreaterThanEqualsToken,
|
|
95
|
-
SyntaxKind.AmpersandAmpersandToken,
|
|
96
|
-
SyntaxKind.BarBarToken,
|
|
97
|
-
SyntaxKind.ExclamationToken,
|
|
98
|
-
SyntaxKind.QuestionToken,
|
|
99
|
-
SyntaxKind.PlusPlusToken,
|
|
100
|
-
SyntaxKind.MinusMinusToken,
|
|
101
|
-
SyntaxKind.AmpersandToken,
|
|
102
|
-
SyntaxKind.BarToken,
|
|
103
|
-
SyntaxKind.CaretToken,
|
|
104
|
-
SyntaxKind.TildeToken,
|
|
105
|
-
SyntaxKind.LessThanLessThanToken,
|
|
106
|
-
SyntaxKind.GreaterThanGreaterThanToken,
|
|
107
|
-
];
|
|
108
|
-
return operators.includes(kind);
|
|
109
|
-
}
|
|
110
|
-
/**
|
|
111
|
-
* Check if node is an operand
|
|
112
|
-
*/
|
|
113
|
-
isOperand(kind) {
|
|
114
|
-
return (kind === SyntaxKind.Identifier ||
|
|
115
|
-
kind === SyntaxKind.NumericLiteral ||
|
|
116
|
-
kind === SyntaxKind.StringLiteral ||
|
|
117
|
-
kind === SyntaxKind.TrueKeyword ||
|
|
118
|
-
kind === SyntaxKind.FalseKeyword ||
|
|
119
|
-
kind === SyntaxKind.NullKeyword);
|
|
120
|
-
}
|
|
121
|
-
/**
|
|
122
|
-
* Get operator symbol for syntax kind
|
|
123
|
-
*/
|
|
124
|
-
getOperatorSymbol(kind) {
|
|
125
|
-
const symbols = {
|
|
126
|
-
[SyntaxKind.PlusToken]: '+',
|
|
127
|
-
[SyntaxKind.MinusToken]: '-',
|
|
128
|
-
[SyntaxKind.AsteriskToken]: '*',
|
|
129
|
-
[SyntaxKind.SlashToken]: '/',
|
|
130
|
-
[SyntaxKind.PercentToken]: '%',
|
|
131
|
-
[SyntaxKind.EqualsToken]: '=',
|
|
132
|
-
[SyntaxKind.EqualsEqualsToken]: '==',
|
|
133
|
-
[SyntaxKind.EqualsEqualsEqualsToken]: '===',
|
|
134
|
-
[SyntaxKind.ExclamationEqualsToken]: '!=',
|
|
135
|
-
[SyntaxKind.ExclamationEqualsEqualsToken]: '!==',
|
|
136
|
-
[SyntaxKind.LessThanToken]: '<',
|
|
137
|
-
[SyntaxKind.GreaterThanToken]: '>',
|
|
138
|
-
[SyntaxKind.LessThanEqualsToken]: '<=',
|
|
139
|
-
[SyntaxKind.GreaterThanEqualsToken]: '>=',
|
|
140
|
-
[SyntaxKind.AmpersandAmpersandToken]: '&&',
|
|
141
|
-
[SyntaxKind.BarBarToken]: '||',
|
|
142
|
-
[SyntaxKind.ExclamationToken]: '!',
|
|
143
|
-
[SyntaxKind.QuestionToken]: '?',
|
|
144
|
-
[SyntaxKind.PlusPlusToken]: '++',
|
|
145
|
-
[SyntaxKind.MinusMinusToken]: '--',
|
|
146
|
-
};
|
|
147
|
-
return symbols[kind] || kind.toString();
|
|
148
|
-
}
|
|
149
|
-
}
|
|
150
|
-
//# sourceMappingURL=halstead-calculator.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"halstead-calculator.js","sourceRoot":"","sources":["../../../src/analyzers/metrics/halstead-calculator.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,9 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Advanced Metrics Analyzer
|
|
3
|
-
*
|
|
4
|
-
* Calculates Halstead metrics and Maintainability Index
|
|
5
|
-
*/
|
|
6
|
-
export { MetricsAnalyzer } from './metrics-analyzer.js';
|
|
7
|
-
export { HalsteadCalculator } from './halstead-calculator.js';
|
|
8
|
-
export { MaintainabilityCalculator } from './maintainability-calculator.js';
|
|
9
|
-
export type { HalsteadMetrics, MaintainabilityIndex, FileMetrics, MetricsAnalysisResult, MetricsAnalysisOptions, MetricsSummary, } from './types.js';
|
|
@@ -1,9 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Advanced Metrics Analyzer
|
|
3
|
-
*
|
|
4
|
-
* Calculates Halstead metrics and Maintainability Index
|
|
5
|
-
*/
|
|
6
|
-
export { MetricsAnalyzer } from './metrics-analyzer.js';
|
|
7
|
-
export { HalsteadCalculator } from './halstead-calculator.js';
|
|
8
|
-
export { MaintainabilityCalculator } from './maintainability-calculator.js';
|
|
9
|
-
//# sourceMappingURL=index.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/analyzers/metrics/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;AACxD,OAAO,EAAE,kBAAkB,EAAE,MAAM,0BAA0B,CAAC;AAC9D,OAAO,EAAE,yBAAyB,EAAE,MAAM,iCAAiC,CAAC"}
|
|
@@ -1,17 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Maintainability Index Calculator
|
|
3
|
-
*
|
|
4
|
-
* Calculates MI = 171 - 5.2*ln(V) - 0.23*CC - 16.2*ln(LOC)
|
|
5
|
-
* Normalized to 0-100 scale
|
|
6
|
-
*/
|
|
7
|
-
import type { MaintainabilityIndex } from './types.js';
|
|
8
|
-
export declare class MaintainabilityCalculator {
|
|
9
|
-
/**
|
|
10
|
-
* Calculate Maintainability Index
|
|
11
|
-
*/
|
|
12
|
-
calculateIndex(halsteadVolume: number, cyclomaticComplexity: number, linesOfCode: number): MaintainabilityIndex;
|
|
13
|
-
/**
|
|
14
|
-
* Get letter rating from MI score
|
|
15
|
-
*/
|
|
16
|
-
private getRating;
|
|
17
|
-
}
|
|
@@ -1,46 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Maintainability Index Calculator
|
|
3
|
-
*
|
|
4
|
-
* Calculates MI = 171 - 5.2*ln(V) - 0.23*CC - 16.2*ln(LOC)
|
|
5
|
-
* Normalized to 0-100 scale
|
|
6
|
-
*/
|
|
7
|
-
export class MaintainabilityCalculator {
|
|
8
|
-
/**
|
|
9
|
-
* Calculate Maintainability Index
|
|
10
|
-
*/
|
|
11
|
-
calculateIndex(halsteadVolume, cyclomaticComplexity, linesOfCode) {
|
|
12
|
-
// Original formula: MI = 171 - 5.2*ln(V) - 0.23*CC - 16.2*ln(LOC)
|
|
13
|
-
// Clamp values to avoid invalid log
|
|
14
|
-
const V = Math.max(1, halsteadVolume);
|
|
15
|
-
const CC = Math.max(1, cyclomaticComplexity);
|
|
16
|
-
const LOC = Math.max(1, linesOfCode);
|
|
17
|
-
const rawMI = 171 - 5.2 * Math.log(V) - 0.23 * CC - 16.2 * Math.log(LOC);
|
|
18
|
-
// Normalize to 0-100 scale
|
|
19
|
-
// Original MI can range from negative to ~171
|
|
20
|
-
// We'll use: MI_normalized = max(0, (rawMI / 171) * 100)
|
|
21
|
-
const score = Math.max(0, Math.min(100, (rawMI / 171) * 100));
|
|
22
|
-
const rating = this.getRating(score);
|
|
23
|
-
return Object.freeze({
|
|
24
|
-
score: Math.round(score * 100) / 100,
|
|
25
|
-
rating,
|
|
26
|
-
halsteadVolume: V,
|
|
27
|
-
cyclomaticComplexity: CC,
|
|
28
|
-
linesOfCode: LOC,
|
|
29
|
-
});
|
|
30
|
-
}
|
|
31
|
-
/**
|
|
32
|
-
* Get letter rating from MI score
|
|
33
|
-
*/
|
|
34
|
-
getRating(score) {
|
|
35
|
-
if (score >= 80)
|
|
36
|
-
return 'A'; // Highly maintainable
|
|
37
|
-
if (score >= 65)
|
|
38
|
-
return 'B'; // Moderately maintainable
|
|
39
|
-
if (score >= 50)
|
|
40
|
-
return 'C'; // Somewhat maintainable
|
|
41
|
-
if (score >= 35)
|
|
42
|
-
return 'D'; // Difficult to maintain
|
|
43
|
-
return 'F'; // Very difficult to maintain
|
|
44
|
-
}
|
|
45
|
-
}
|
|
46
|
-
//# sourceMappingURL=maintainability-calculator.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"maintainability-calculator.js","sourceRoot":"","sources":["../../../src/analyzers/metrics/maintainability-calculator.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAIH,MAAM,OAAO,yBAAyB;IACpC;;OAEG;IACH,cAAc,CACZ,cAAsB,EACtB,oBAA4B,EAC5B,WAAmB;QAEnB,kEAAkE;QAClE,oCAAoC;QACpC,MAAM,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,cAAc,CAAC,CAAC;QACtC,MAAM,EAAE,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,oBAAoB,CAAC,CAAC;QAC7C,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,WAAW,CAAC,CAAC;QAErC,MAAM,KAAK,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,IAAI,GAAG,EAAE,GAAG,IAAI,GAAG,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;QAEzE,2BAA2B;QAC3B,8CAA8C;QAC9C,yDAAyD;QACzD,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,CAAC,KAAK,GAAG,GAAG,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC;QAE9D,MAAM,MAAM,GAAG,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC;QAErC,OAAO,MAAM,CAAC,MAAM,CAAC;YACnB,KAAK,EAAE,IAAI,CAAC,KAAK,CAAC,KAAK,GAAG,GAAG,CAAC,GAAG,GAAG;YACpC,MAAM;YACN,cAAc,EAAE,CAAC;YACjB,oBAAoB,EAAE,EAAE;YACxB,WAAW,EAAE,GAAG;SACjB,CAAC,CAAC;IACL,CAAC;IAED;;OAEG;IACK,SAAS,CAAC,KAAa;QAC7B,IAAI,KAAK,IAAI,EAAE;YAAE,OAAO,GAAG,CAAC,CAAC,sBAAsB;QACnD,IAAI,KAAK,IAAI,EAAE;YAAE,OAAO,GAAG,CAAC,CAAC,0BAA0B;QACvD,IAAI,KAAK,IAAI,EAAE;YAAE,OAAO,GAAG,CAAC,CAAC,wBAAwB;QACrD,IAAI,KAAK,IAAI,EAAE;YAAE,OAAO,GAAG,CAAC,CAAC,wBAAwB;QACrD,OAAO,GAAG,CAAC,CAAC,6BAA6B;IAC3C,CAAC;CACF"}
|
|
@@ -1,32 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Metrics Analyzer
|
|
3
|
-
*
|
|
4
|
-
* Main orchestrator for advanced code metrics analysis
|
|
5
|
-
*/
|
|
6
|
-
import type { MetricsAnalysisResult, MetricsAnalysisOptions } from './types.js';
|
|
7
|
-
export declare class MetricsAnalyzer {
|
|
8
|
-
private halsteadCalculator;
|
|
9
|
-
private maintainabilityCalculator;
|
|
10
|
-
private astParser;
|
|
11
|
-
constructor();
|
|
12
|
-
/**
|
|
13
|
-
* Analyze metrics for files matching patterns
|
|
14
|
-
*/
|
|
15
|
-
analyze(directory: string, options?: MetricsAnalysisOptions): Promise<MetricsAnalysisResult>;
|
|
16
|
-
/**
|
|
17
|
-
* Analyze a single file
|
|
18
|
-
*/
|
|
19
|
-
private analyzeFile;
|
|
20
|
-
/**
|
|
21
|
-
* Calculate lines of code (excluding blank lines)
|
|
22
|
-
*/
|
|
23
|
-
private calculateLinesOfCode;
|
|
24
|
-
/**
|
|
25
|
-
* Get files to analyze based on patterns
|
|
26
|
-
*/
|
|
27
|
-
private getFilesToAnalyze;
|
|
28
|
-
/**
|
|
29
|
-
* Calculate summary statistics
|
|
30
|
-
*/
|
|
31
|
-
private calculateSummary;
|
|
32
|
-
}
|
|
@@ -1,144 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Metrics Analyzer
|
|
3
|
-
*
|
|
4
|
-
* Main orchestrator for advanced code metrics analysis
|
|
5
|
-
*/
|
|
6
|
-
import { HalsteadCalculator } from './halstead-calculator.js';
|
|
7
|
-
import { MaintainabilityCalculator } from './maintainability-calculator.js';
|
|
8
|
-
import { getMultiLanguageParser } from '../ast/multi-language-parser.js';
|
|
9
|
-
import { glob } from 'glob';
|
|
10
|
-
export class MetricsAnalyzer {
|
|
11
|
-
halsteadCalculator;
|
|
12
|
-
maintainabilityCalculator;
|
|
13
|
-
astParser;
|
|
14
|
-
constructor() {
|
|
15
|
-
this.halsteadCalculator = new HalsteadCalculator();
|
|
16
|
-
this.maintainabilityCalculator = new MaintainabilityCalculator();
|
|
17
|
-
this.astParser = getMultiLanguageParser();
|
|
18
|
-
}
|
|
19
|
-
/**
|
|
20
|
-
* Analyze metrics for files matching patterns
|
|
21
|
-
*/
|
|
22
|
-
async analyze(directory, options = {}) {
|
|
23
|
-
const files = await this.getFilesToAnalyze(directory, options);
|
|
24
|
-
const fileMetrics = [];
|
|
25
|
-
for (const filePath of files) {
|
|
26
|
-
try {
|
|
27
|
-
const metrics = await this.analyzeFile(filePath);
|
|
28
|
-
fileMetrics.push(metrics);
|
|
29
|
-
}
|
|
30
|
-
catch {
|
|
31
|
-
// Skip files that fail to parse
|
|
32
|
-
continue;
|
|
33
|
-
}
|
|
34
|
-
}
|
|
35
|
-
const summary = this.calculateSummary(fileMetrics);
|
|
36
|
-
return Object.freeze({
|
|
37
|
-
fileMetrics: Object.freeze(fileMetrics),
|
|
38
|
-
summary,
|
|
39
|
-
timestamp: new Date(),
|
|
40
|
-
});
|
|
41
|
-
}
|
|
42
|
-
/**
|
|
43
|
-
* Analyze a single file
|
|
44
|
-
*/
|
|
45
|
-
async analyzeFile(filePath) {
|
|
46
|
-
// Calculate Halstead metrics
|
|
47
|
-
const halstead = this.halsteadCalculator.calculateMetrics(filePath);
|
|
48
|
-
// Get AST info for complexity and LOC
|
|
49
|
-
const ast = await this.astParser.parseFile(filePath);
|
|
50
|
-
// Calculate average and max complexity
|
|
51
|
-
const complexities = ast.functions.map((f) => f.complexity);
|
|
52
|
-
const averageComplexity = complexities.length > 0
|
|
53
|
-
? complexities.reduce((a, b) => a + b, 0) / complexities.length
|
|
54
|
-
: 0;
|
|
55
|
-
const maxComplexity = complexities.length > 0 ? Math.max(...complexities) : 0;
|
|
56
|
-
// Calculate total lines of code (excluding blank lines and comments)
|
|
57
|
-
const linesOfCode = this.calculateLinesOfCode(filePath);
|
|
58
|
-
// Calculate Maintainability Index
|
|
59
|
-
const maintainability = this.maintainabilityCalculator.calculateIndex(halstead.volume, averageComplexity, linesOfCode);
|
|
60
|
-
return Object.freeze({
|
|
61
|
-
filePath,
|
|
62
|
-
halstead,
|
|
63
|
-
maintainability,
|
|
64
|
-
averageComplexity: Math.round(averageComplexity * 100) / 100,
|
|
65
|
-
maxComplexity,
|
|
66
|
-
totalFunctions: ast.functions.length,
|
|
67
|
-
});
|
|
68
|
-
}
|
|
69
|
-
/**
|
|
70
|
-
* Calculate lines of code (excluding blank lines)
|
|
71
|
-
*/
|
|
72
|
-
calculateLinesOfCode(filePath) {
|
|
73
|
-
const sourceFile = this.astParser.getSourceFile(filePath);
|
|
74
|
-
if (!sourceFile) {
|
|
75
|
-
// For non-TS/JS files, return 0 (Halstead metrics will still work)
|
|
76
|
-
return 0;
|
|
77
|
-
}
|
|
78
|
-
const text = sourceFile.getFullText();
|
|
79
|
-
const lines = text.split('\n');
|
|
80
|
-
// Count non-blank lines
|
|
81
|
-
let loc = 0;
|
|
82
|
-
for (const line of lines) {
|
|
83
|
-
const trimmed = line.trim();
|
|
84
|
-
if (trimmed.length > 0) {
|
|
85
|
-
loc++;
|
|
86
|
-
}
|
|
87
|
-
}
|
|
88
|
-
return loc;
|
|
89
|
-
}
|
|
90
|
-
/**
|
|
91
|
-
* Get files to analyze based on patterns
|
|
92
|
-
*/
|
|
93
|
-
async getFilesToAnalyze(directory, options) {
|
|
94
|
-
const includePatterns = options.includePatterns || ['**/*.ts', '**/*.tsx'];
|
|
95
|
-
const excludePatterns = options.excludePatterns || [
|
|
96
|
-
'**/node_modules/**',
|
|
97
|
-
'**/*.test.ts',
|
|
98
|
-
'**/*.spec.ts',
|
|
99
|
-
'**/dist/**',
|
|
100
|
-
'**/build/**',
|
|
101
|
-
];
|
|
102
|
-
const allFiles = new Set();
|
|
103
|
-
for (const pattern of includePatterns) {
|
|
104
|
-
const matches = await glob(pattern, {
|
|
105
|
-
cwd: directory,
|
|
106
|
-
absolute: true,
|
|
107
|
-
ignore: excludePatterns ? [...excludePatterns] : [],
|
|
108
|
-
});
|
|
109
|
-
for (const match of matches) {
|
|
110
|
-
allFiles.add(match);
|
|
111
|
-
}
|
|
112
|
-
}
|
|
113
|
-
return Array.from(allFiles).sort();
|
|
114
|
-
}
|
|
115
|
-
/**
|
|
116
|
-
* Calculate summary statistics
|
|
117
|
-
*/
|
|
118
|
-
calculateSummary(fileMetrics) {
|
|
119
|
-
if (fileMetrics.length === 0) {
|
|
120
|
-
return Object.freeze({
|
|
121
|
-
filesAnalyzed: 0,
|
|
122
|
-
averageMaintainability: 0,
|
|
123
|
-
averageHalsteadVolume: 0,
|
|
124
|
-
averageComplexity: 0,
|
|
125
|
-
lowMaintainabilityCount: 0,
|
|
126
|
-
highComplexityCount: 0,
|
|
127
|
-
});
|
|
128
|
-
}
|
|
129
|
-
const totalMaintainability = fileMetrics.reduce((sum, m) => sum + m.maintainability.score, 0);
|
|
130
|
-
const totalHalsteadVolume = fileMetrics.reduce((sum, m) => sum + m.halstead.volume, 0);
|
|
131
|
-
const totalComplexity = fileMetrics.reduce((sum, m) => sum + m.averageComplexity, 0);
|
|
132
|
-
const lowMaintainabilityCount = fileMetrics.filter((m) => m.maintainability.score < 65).length;
|
|
133
|
-
const highComplexityCount = fileMetrics.filter((m) => m.maxComplexity > 10).length;
|
|
134
|
-
return Object.freeze({
|
|
135
|
-
filesAnalyzed: fileMetrics.length,
|
|
136
|
-
averageMaintainability: Math.round((totalMaintainability / fileMetrics.length) * 100) / 100,
|
|
137
|
-
averageHalsteadVolume: Math.round((totalHalsteadVolume / fileMetrics.length) * 100) / 100,
|
|
138
|
-
averageComplexity: Math.round((totalComplexity / fileMetrics.length) * 100) / 100,
|
|
139
|
-
lowMaintainabilityCount,
|
|
140
|
-
highComplexityCount,
|
|
141
|
-
});
|
|
142
|
-
}
|
|
143
|
-
}
|
|
144
|
-
//# sourceMappingURL=metrics-analyzer.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"metrics-analyzer.js","sourceRoot":"","sources":["../../../src/analyzers/metrics/metrics-analyzer.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,67 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Advanced Metrics Types
|
|
3
|
-
*/
|
|
4
|
-
/**
|
|
5
|
-
* Halstead complexity metrics
|
|
6
|
-
*/
|
|
7
|
-
export interface HalsteadMetrics {
|
|
8
|
-
readonly n1: number;
|
|
9
|
-
readonly n2: number;
|
|
10
|
-
readonly N1: number;
|
|
11
|
-
readonly N2: number;
|
|
12
|
-
readonly vocabulary: number;
|
|
13
|
-
readonly length: number;
|
|
14
|
-
readonly calculatedLength: number;
|
|
15
|
-
readonly volume: number;
|
|
16
|
-
readonly difficulty: number;
|
|
17
|
-
readonly effort: number;
|
|
18
|
-
readonly time: number;
|
|
19
|
-
readonly bugs: number;
|
|
20
|
-
}
|
|
21
|
-
/**
|
|
22
|
-
* Maintainability Index
|
|
23
|
-
*/
|
|
24
|
-
export interface MaintainabilityIndex {
|
|
25
|
-
readonly score: number;
|
|
26
|
-
readonly rating: 'A' | 'B' | 'C' | 'D' | 'F';
|
|
27
|
-
readonly halsteadVolume: number;
|
|
28
|
-
readonly cyclomaticComplexity: number;
|
|
29
|
-
readonly linesOfCode: number;
|
|
30
|
-
}
|
|
31
|
-
/**
|
|
32
|
-
* File metrics
|
|
33
|
-
*/
|
|
34
|
-
export interface FileMetrics {
|
|
35
|
-
readonly filePath: string;
|
|
36
|
-
readonly halstead: HalsteadMetrics;
|
|
37
|
-
readonly maintainability: MaintainabilityIndex;
|
|
38
|
-
readonly averageComplexity: number;
|
|
39
|
-
readonly maxComplexity: number;
|
|
40
|
-
readonly totalFunctions: number;
|
|
41
|
-
}
|
|
42
|
-
/**
|
|
43
|
-
* Metrics analysis result
|
|
44
|
-
*/
|
|
45
|
-
export interface MetricsAnalysisResult {
|
|
46
|
-
readonly fileMetrics: ReadonlyArray<FileMetrics>;
|
|
47
|
-
readonly summary: MetricsSummary;
|
|
48
|
-
readonly timestamp: Date;
|
|
49
|
-
}
|
|
50
|
-
/**
|
|
51
|
-
* Summary statistics
|
|
52
|
-
*/
|
|
53
|
-
export interface MetricsSummary {
|
|
54
|
-
readonly filesAnalyzed: number;
|
|
55
|
-
readonly averageMaintainability: number;
|
|
56
|
-
readonly averageHalsteadVolume: number;
|
|
57
|
-
readonly averageComplexity: number;
|
|
58
|
-
readonly lowMaintainabilityCount: number;
|
|
59
|
-
readonly highComplexityCount: number;
|
|
60
|
-
}
|
|
61
|
-
/**
|
|
62
|
-
* Analysis options
|
|
63
|
-
*/
|
|
64
|
-
export interface MetricsAnalysisOptions {
|
|
65
|
-
readonly includePatterns?: readonly string[];
|
|
66
|
-
readonly excludePatterns?: readonly string[];
|
|
67
|
-
}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../../src/analyzers/metrics/types.ts"],"names":[],"mappings":"AAAA;;GAEG"}
|