@defai.digital/ax-cli 3.4.6 → 3.5.2
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/LICENSE +2 -6
- package/README.md +90 -2
- package/dist/analyzers/ast/parser.d.ts +59 -0
- package/dist/analyzers/ast/parser.js +293 -0
- package/dist/analyzers/ast/parser.js.map +1 -0
- package/dist/analyzers/ast/types.d.ts +107 -0
- package/dist/analyzers/ast/types.js +7 -0
- package/dist/analyzers/ast/types.js.map +1 -0
- package/dist/analyzers/code-smells/base-smell-detector.d.ts +30 -0
- package/dist/analyzers/code-smells/base-smell-detector.js +44 -0
- package/dist/analyzers/code-smells/base-smell-detector.js.map +1 -0
- package/dist/analyzers/code-smells/code-smell-analyzer.d.ts +30 -0
- package/dist/analyzers/code-smells/code-smell-analyzer.js +167 -0
- package/dist/analyzers/code-smells/code-smell-analyzer.js.map +1 -0
- package/dist/analyzers/code-smells/detectors/data-clumps-detector.d.ts +11 -0
- package/dist/analyzers/code-smells/detectors/data-clumps-detector.js +66 -0
- package/dist/analyzers/code-smells/detectors/data-clumps-detector.js.map +1 -0
- package/dist/analyzers/code-smells/detectors/dead-code-detector.d.ts +11 -0
- package/dist/analyzers/code-smells/detectors/dead-code-detector.js +53 -0
- package/dist/analyzers/code-smells/detectors/dead-code-detector.js.map +1 -0
- package/dist/analyzers/code-smells/detectors/duplicate-code-detector.d.ts +11 -0
- package/dist/analyzers/code-smells/detectors/duplicate-code-detector.js +51 -0
- package/dist/analyzers/code-smells/detectors/duplicate-code-detector.js.map +1 -0
- package/dist/analyzers/code-smells/detectors/feature-envy-detector.d.ts +11 -0
- package/dist/analyzers/code-smells/detectors/feature-envy-detector.js +64 -0
- package/dist/analyzers/code-smells/detectors/feature-envy-detector.js.map +1 -0
- package/dist/analyzers/code-smells/detectors/inappropriate-intimacy-detector.d.ts +11 -0
- package/dist/analyzers/code-smells/detectors/inappropriate-intimacy-detector.js +56 -0
- package/dist/analyzers/code-smells/detectors/inappropriate-intimacy-detector.js.map +1 -0
- package/dist/analyzers/code-smells/detectors/large-class-detector.d.ts +13 -0
- package/dist/analyzers/code-smells/detectors/large-class-detector.js +58 -0
- package/dist/analyzers/code-smells/detectors/large-class-detector.js.map +1 -0
- package/dist/analyzers/code-smells/detectors/long-method-detector.d.ts +12 -0
- package/dist/analyzers/code-smells/detectors/long-method-detector.js +52 -0
- package/dist/analyzers/code-smells/detectors/long-method-detector.js.map +1 -0
- package/dist/analyzers/code-smells/detectors/long-parameter-list-detector.d.ts +12 -0
- package/dist/analyzers/code-smells/detectors/long-parameter-list-detector.js +50 -0
- package/dist/analyzers/code-smells/detectors/long-parameter-list-detector.js.map +1 -0
- package/dist/analyzers/code-smells/detectors/magic-numbers-detector.d.ts +12 -0
- package/dist/analyzers/code-smells/detectors/magic-numbers-detector.js +54 -0
- package/dist/analyzers/code-smells/detectors/magic-numbers-detector.js.map +1 -0
- package/dist/analyzers/code-smells/detectors/nested-conditionals-detector.d.ts +13 -0
- package/dist/analyzers/code-smells/detectors/nested-conditionals-detector.js +71 -0
- package/dist/analyzers/code-smells/detectors/nested-conditionals-detector.js.map +1 -0
- package/dist/analyzers/code-smells/index.d.ts +16 -0
- package/dist/analyzers/code-smells/index.js +19 -0
- package/dist/analyzers/code-smells/index.js.map +1 -0
- package/dist/analyzers/code-smells/types.d.ts +82 -0
- package/dist/analyzers/code-smells/types.js +30 -0
- package/dist/analyzers/code-smells/types.js.map +1 -0
- package/dist/analyzers/dependency/circular-detector.d.ts +17 -0
- package/dist/analyzers/dependency/circular-detector.js +71 -0
- package/dist/analyzers/dependency/circular-detector.js.map +1 -0
- package/dist/analyzers/dependency/coupling-calculator.d.ts +24 -0
- package/dist/analyzers/dependency/coupling-calculator.js +86 -0
- package/dist/analyzers/dependency/coupling-calculator.js.map +1 -0
- package/dist/analyzers/dependency/dependency-analyzer.d.ts +40 -0
- package/dist/analyzers/dependency/dependency-analyzer.js +214 -0
- package/dist/analyzers/dependency/dependency-analyzer.js.map +1 -0
- package/dist/analyzers/dependency/dependency-graph.d.ts +57 -0
- package/dist/analyzers/dependency/dependency-graph.js +186 -0
- package/dist/analyzers/dependency/dependency-graph.js.map +1 -0
- package/dist/analyzers/dependency/index.d.ts +8 -0
- package/dist/analyzers/dependency/index.js +8 -0
- package/dist/analyzers/dependency/index.js.map +1 -0
- package/dist/analyzers/dependency/types.d.ts +105 -0
- package/dist/analyzers/dependency/types.js +5 -0
- package/dist/analyzers/dependency/types.js.map +1 -0
- package/dist/analyzers/git/churn-calculator.d.ts +34 -0
- package/dist/analyzers/git/churn-calculator.js +214 -0
- package/dist/analyzers/git/churn-calculator.js.map +1 -0
- package/dist/analyzers/git/git-analyzer.d.ts +19 -0
- package/dist/analyzers/git/git-analyzer.js +71 -0
- package/dist/analyzers/git/git-analyzer.js.map +1 -0
- package/dist/analyzers/git/hotspot-detector.d.ts +34 -0
- package/dist/analyzers/git/hotspot-detector.js +170 -0
- package/dist/analyzers/git/hotspot-detector.js.map +1 -0
- package/dist/analyzers/git/index.d.ts +7 -0
- package/dist/analyzers/git/index.js +7 -0
- package/dist/analyzers/git/index.js.map +1 -0
- package/dist/analyzers/git/types.d.ts +88 -0
- package/dist/analyzers/git/types.js +5 -0
- package/dist/analyzers/git/types.js.map +1 -0
- package/dist/analyzers/metrics/halstead-calculator.d.ts +30 -0
- package/dist/analyzers/metrics/halstead-calculator.js +150 -0
- package/dist/analyzers/metrics/halstead-calculator.js.map +1 -0
- package/dist/analyzers/metrics/index.d.ts +9 -0
- package/dist/analyzers/metrics/index.js +9 -0
- package/dist/analyzers/metrics/index.js.map +1 -0
- package/dist/analyzers/metrics/maintainability-calculator.d.ts +17 -0
- package/dist/analyzers/metrics/maintainability-calculator.js +46 -0
- package/dist/analyzers/metrics/maintainability-calculator.js.map +1 -0
- package/dist/analyzers/metrics/metrics-analyzer.d.ts +32 -0
- package/dist/analyzers/metrics/metrics-analyzer.js +140 -0
- package/dist/analyzers/metrics/metrics-analyzer.js.map +1 -0
- package/dist/analyzers/metrics/types.d.ts +67 -0
- package/dist/analyzers/metrics/types.js +5 -0
- package/dist/analyzers/metrics/types.js.map +1 -0
- package/dist/analyzers/security/base-detector.d.ts +58 -0
- package/dist/analyzers/security/base-detector.js +104 -0
- package/dist/analyzers/security/base-detector.js.map +1 -0
- package/dist/analyzers/security/detectors/command-injection-detector.d.ts +12 -0
- package/dist/analyzers/security/detectors/command-injection-detector.js +84 -0
- package/dist/analyzers/security/detectors/command-injection-detector.js.map +1 -0
- package/dist/analyzers/security/detectors/hardcoded-secrets-detector.d.ts +16 -0
- package/dist/analyzers/security/detectors/hardcoded-secrets-detector.js +140 -0
- package/dist/analyzers/security/detectors/hardcoded-secrets-detector.js.map +1 -0
- package/dist/analyzers/security/detectors/insecure-deserialization-detector.d.ts +12 -0
- package/dist/analyzers/security/detectors/insecure-deserialization-detector.js +109 -0
- package/dist/analyzers/security/detectors/insecure-deserialization-detector.js.map +1 -0
- package/dist/analyzers/security/detectors/insecure-random-detector.d.ts +12 -0
- package/dist/analyzers/security/detectors/insecure-random-detector.js +61 -0
- package/dist/analyzers/security/detectors/insecure-random-detector.js.map +1 -0
- package/dist/analyzers/security/detectors/path-traversal-detector.d.ts +12 -0
- package/dist/analyzers/security/detectors/path-traversal-detector.js +82 -0
- package/dist/analyzers/security/detectors/path-traversal-detector.js.map +1 -0
- package/dist/analyzers/security/detectors/sql-injection-detector.d.ts +12 -0
- package/dist/analyzers/security/detectors/sql-injection-detector.js +88 -0
- package/dist/analyzers/security/detectors/sql-injection-detector.js.map +1 -0
- package/dist/analyzers/security/detectors/weak-crypto-detector.d.ts +12 -0
- package/dist/analyzers/security/detectors/weak-crypto-detector.js +104 -0
- package/dist/analyzers/security/detectors/weak-crypto-detector.js.map +1 -0
- package/dist/analyzers/security/detectors/xss-detector.d.ts +12 -0
- package/dist/analyzers/security/detectors/xss-detector.js +90 -0
- package/dist/analyzers/security/detectors/xss-detector.js.map +1 -0
- package/dist/analyzers/security/index.d.ts +16 -0
- package/dist/analyzers/security/index.js +18 -0
- package/dist/analyzers/security/index.js.map +1 -0
- package/dist/analyzers/security/security-analyzer.d.ts +38 -0
- package/dist/analyzers/security/security-analyzer.js +215 -0
- package/dist/analyzers/security/security-analyzer.js.map +1 -0
- package/dist/analyzers/security/types.d.ts +95 -0
- package/dist/analyzers/security/types.js +7 -0
- package/dist/analyzers/security/types.js.map +1 -0
- package/dist/commands/memory.js +1 -1
- package/dist/commands/memory.js.map +1 -1
- package/dist/commands/setup.js +6 -1
- package/dist/commands/setup.js.map +1 -1
- package/dist/hooks/use-enhanced-input.d.ts +0 -1
- package/dist/hooks/use-enhanced-input.js.map +1 -1
- package/dist/mcp/health.js +4 -2
- package/dist/mcp/health.js.map +1 -1
- package/dist/mcp/validation.js +12 -6
- package/dist/mcp/validation.js.map +1 -1
- package/dist/tools/analysis-tools.d.ts +73 -0
- package/dist/tools/analysis-tools.js +422 -0
- package/dist/tools/analysis-tools.js.map +1 -0
- package/dist/tools/bash.js +2 -1
- package/dist/tools/bash.js.map +1 -1
- package/dist/ui/components/chat-history.js +1 -1
- package/dist/ui/components/chat-history.js.map +1 -1
- package/dist/ui/components/chat-interface.js +3 -2
- package/dist/ui/components/chat-interface.js.map +1 -1
- package/dist/ui/components/confirmation-dialog.js +1 -1
- package/dist/ui/components/confirmation-dialog.js.map +1 -1
- package/dist/ui/components/welcome-panel.js +1 -1
- package/dist/ui/components/welcome-panel.js.map +1 -1
- package/dist/ui/hooks/use-chat-reducer.d.ts +61 -0
- package/dist/ui/hooks/use-chat-reducer.js +118 -0
- package/dist/ui/hooks/use-chat-reducer.js.map +1 -0
- package/dist/ui/hooks/use-enhanced-input.d.ts +40 -0
- package/dist/ui/hooks/use-enhanced-input.js +254 -0
- package/dist/ui/hooks/use-enhanced-input.js.map +1 -0
- package/dist/ui/hooks/use-input-handler.d.ts +46 -0
- package/dist/ui/hooks/use-input-handler.js +1434 -0
- package/dist/ui/hooks/use-input-handler.js.map +1 -0
- package/dist/ui/hooks/use-input-history.d.ts +9 -0
- package/dist/ui/hooks/use-input-history.js +117 -0
- package/dist/ui/hooks/use-input-history.js.map +1 -0
- package/dist/utils/config-loader.js +3 -3
- package/dist/utils/config-loader.js.map +1 -1
- package/dist/utils/parallel-analyzer.js +7 -11
- package/dist/utils/parallel-analyzer.js.map +1 -1
- package/dist/utils/paste-collapse.d.ts +46 -0
- package/dist/utils/paste-collapse.js +77 -0
- package/dist/utils/paste-collapse.js.map +1 -0
- package/dist/utils/settings-manager.js +16 -2
- package/dist/utils/settings-manager.js.map +1 -1
- package/dist/utils/streaming-analyzer.js +9 -21
- package/dist/utils/streaming-analyzer.js.map +1 -1
- package/package.json +5 -5
- package/vitest.config.ts +1 -0
- package/dist/commands/weather.d.ts +0 -8
- package/dist/commands/weather.js +0 -160
- package/dist/commands/weather.js.map +0 -1
- package/dist/grok/client.d.ts +0 -144
- package/dist/grok/client.js +0 -237
- package/dist/grok/client.js.map +0 -1
- package/dist/grok/tools.d.ts +0 -8
- package/dist/grok/tools.js +0 -318
- package/dist/grok/tools.js.map +0 -1
- package/dist/grok/types.d.ts +0 -291
- package/dist/grok/types.js +0 -127
- package/dist/grok/types.js.map +0 -1
- package/dist/tools/morph-editor.d.ts +0 -36
- package/dist/tools/morph-editor.js +0 -308
- package/dist/tools/morph-editor.js.map +0 -1
- package/dist/ui/components/session-recovery.d.ts +0 -12
- package/dist/ui/components/session-recovery.js +0 -93
- package/dist/ui/components/session-recovery.js.map +0 -1
- package/dist/utils/model-config.d.ts +0 -28
- package/dist/utils/model-config.js +0 -43
- package/dist/utils/model-config.js.map +0 -1
- package/dist/utils/tool-helpers.d.ts +0 -25
- package/dist/utils/tool-helpers.js +0 -79
- package/dist/utils/tool-helpers.js.map +0 -1
- /package/{automatosx.config.json → ax.config.json} +0 -0
- /package/{config → config-defaults}/messages.yaml +0 -0
- /package/{config → config-defaults}/models.yaml +0 -0
- /package/{config → config-defaults}/prompts.yaml +0 -0
- /package/{config → config-defaults}/settings.yaml +0 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"circular-detector.js","sourceRoot":"","sources":["../../../src/analyzers/dependency/circular-detector.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,24 @@
|
|
|
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
|
+
}
|
|
@@ -0,0 +1,86 @@
|
|
|
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
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"coupling-calculator.js","sourceRoot":"","sources":["../../../src/analyzers/dependency/coupling-calculator.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Dependency Analyzer
|
|
3
|
+
*
|
|
4
|
+
* Main orchestrator for dependency analysis
|
|
5
|
+
*/
|
|
6
|
+
import type { DependencyAnalysisResult, DependencyAnalysisOptions } from './types.js';
|
|
7
|
+
export declare class DependencyAnalyzer {
|
|
8
|
+
private astParser;
|
|
9
|
+
private circularDetector;
|
|
10
|
+
private couplingCalculator;
|
|
11
|
+
constructor();
|
|
12
|
+
/**
|
|
13
|
+
* Analyze dependencies in a directory
|
|
14
|
+
*/
|
|
15
|
+
analyzeDependencies(directory: string, pattern?: string, options?: DependencyAnalysisOptions): Promise<DependencyAnalysisResult>;
|
|
16
|
+
/**
|
|
17
|
+
* Create import edges from AST imports
|
|
18
|
+
*/
|
|
19
|
+
private createImportEdges;
|
|
20
|
+
/**
|
|
21
|
+
* Create export edges from AST exports
|
|
22
|
+
*/
|
|
23
|
+
private createExportEdges;
|
|
24
|
+
/**
|
|
25
|
+
* Resolve import specifier to absolute file path
|
|
26
|
+
*/
|
|
27
|
+
private resolveImportPath;
|
|
28
|
+
/**
|
|
29
|
+
* Find orphaned files (no dependencies)
|
|
30
|
+
*/
|
|
31
|
+
private findOrphanedFiles;
|
|
32
|
+
/**
|
|
33
|
+
* Find hub files (high coupling)
|
|
34
|
+
*/
|
|
35
|
+
private findHubFiles;
|
|
36
|
+
/**
|
|
37
|
+
* Calculate summary statistics
|
|
38
|
+
*/
|
|
39
|
+
private calculateSummary;
|
|
40
|
+
}
|
|
@@ -0,0 +1,214 @@
|
|
|
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 { ASTParser } from '../ast/parser.js';
|
|
10
|
+
import { existsSync, promises as fs } from 'fs';
|
|
11
|
+
import { glob } from 'glob';
|
|
12
|
+
import path from 'path';
|
|
13
|
+
export class DependencyAnalyzer {
|
|
14
|
+
astParser;
|
|
15
|
+
circularDetector;
|
|
16
|
+
couplingCalculator;
|
|
17
|
+
constructor() {
|
|
18
|
+
this.astParser = new ASTParser();
|
|
19
|
+
this.circularDetector = new CircularDependencyDetector();
|
|
20
|
+
this.couplingCalculator = new CouplingCalculator();
|
|
21
|
+
}
|
|
22
|
+
/**
|
|
23
|
+
* Analyze dependencies in a directory
|
|
24
|
+
*/
|
|
25
|
+
async analyzeDependencies(directory, pattern = '**/*.{ts,tsx,js,jsx}', options = {}) {
|
|
26
|
+
const timestamp = new Date();
|
|
27
|
+
// Find all files
|
|
28
|
+
const ignorePatterns = [
|
|
29
|
+
'**/node_modules/**',
|
|
30
|
+
'**/dist/**',
|
|
31
|
+
'**/build/**',
|
|
32
|
+
'**/.git/**',
|
|
33
|
+
...(options.ignorePatterns || []),
|
|
34
|
+
];
|
|
35
|
+
const files = await glob(pattern, {
|
|
36
|
+
cwd: directory,
|
|
37
|
+
absolute: true,
|
|
38
|
+
nodir: true,
|
|
39
|
+
ignore: ignorePatterns,
|
|
40
|
+
});
|
|
41
|
+
// Build dependency graph
|
|
42
|
+
const graph = new DependencyGraph();
|
|
43
|
+
const astMap = new Map();
|
|
44
|
+
// Parse all files
|
|
45
|
+
for (const file of files) {
|
|
46
|
+
try {
|
|
47
|
+
const ast = this.astParser.parseFile(file);
|
|
48
|
+
astMap.set(file, ast);
|
|
49
|
+
// Get file stats
|
|
50
|
+
const stats = await fs.stat(file);
|
|
51
|
+
// Create dependency node
|
|
52
|
+
const node = {
|
|
53
|
+
filePath: file,
|
|
54
|
+
imports: this.createImportEdges(file, ast.imports, directory),
|
|
55
|
+
exports: this.createExportEdges(file, ast.exports),
|
|
56
|
+
size: stats.size,
|
|
57
|
+
loc: ast.totalLines,
|
|
58
|
+
};
|
|
59
|
+
graph.addNode(node);
|
|
60
|
+
// Add edges for internal imports
|
|
61
|
+
for (const imp of node.imports) {
|
|
62
|
+
if (!options.includeNodeModules && imp.to.includes('node_modules')) {
|
|
63
|
+
continue;
|
|
64
|
+
}
|
|
65
|
+
graph.addEdge(imp.from, imp.to);
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
catch (error) {
|
|
69
|
+
// Skip files that can't be parsed
|
|
70
|
+
console.error(`Error parsing ${file}:`, error);
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
// Detect circular dependencies
|
|
74
|
+
const circularDependencies = this.circularDetector.detectCycles(graph);
|
|
75
|
+
// Calculate coupling metrics
|
|
76
|
+
const couplingMetrics = this.couplingCalculator.calculateMetrics(graph, astMap);
|
|
77
|
+
// Find orphaned files (no imports/exports or isolated)
|
|
78
|
+
const orphanedFiles = this.findOrphanedFiles(graph);
|
|
79
|
+
// Find hub files (high coupling)
|
|
80
|
+
const hubFiles = this.findHubFiles(couplingMetrics);
|
|
81
|
+
// Calculate summary
|
|
82
|
+
const summary = this.calculateSummary(graph, circularDependencies, couplingMetrics);
|
|
83
|
+
return Object.freeze({
|
|
84
|
+
graph,
|
|
85
|
+
circularDependencies: Object.freeze(circularDependencies),
|
|
86
|
+
couplingMetrics: Object.freeze(couplingMetrics),
|
|
87
|
+
orphanedFiles: Object.freeze(orphanedFiles),
|
|
88
|
+
hubFiles: Object.freeze(hubFiles),
|
|
89
|
+
summary: Object.freeze(summary),
|
|
90
|
+
timestamp,
|
|
91
|
+
});
|
|
92
|
+
}
|
|
93
|
+
/**
|
|
94
|
+
* Create import edges from AST imports
|
|
95
|
+
*/
|
|
96
|
+
createImportEdges(file, imports, baseDir) {
|
|
97
|
+
return imports.map(imp => {
|
|
98
|
+
const resolvedPath = this.resolveImportPath(file, imp.moduleSpecifier, baseDir);
|
|
99
|
+
return Object.freeze({
|
|
100
|
+
from: file,
|
|
101
|
+
to: resolvedPath,
|
|
102
|
+
importedSymbols: Object.freeze([
|
|
103
|
+
...imp.namedImports,
|
|
104
|
+
...(imp.defaultImport ? [imp.defaultImport] : []),
|
|
105
|
+
...(imp.namespaceImport ? [imp.namespaceImport] : []),
|
|
106
|
+
]),
|
|
107
|
+
isDynamic: false,
|
|
108
|
+
isTypeOnly: imp.isTypeOnly || false,
|
|
109
|
+
});
|
|
110
|
+
});
|
|
111
|
+
}
|
|
112
|
+
/**
|
|
113
|
+
* Create export edges from AST exports
|
|
114
|
+
*/
|
|
115
|
+
createExportEdges(file, exports) {
|
|
116
|
+
return exports.map(exp => Object.freeze({
|
|
117
|
+
from: file,
|
|
118
|
+
symbols: Object.freeze([exp.name]),
|
|
119
|
+
isDefault: exp.isDefault,
|
|
120
|
+
isReExport: false, // Simplified for now
|
|
121
|
+
}));
|
|
122
|
+
}
|
|
123
|
+
/**
|
|
124
|
+
* Resolve import specifier to absolute file path
|
|
125
|
+
*/
|
|
126
|
+
resolveImportPath(fromFile, specifier, baseDir) {
|
|
127
|
+
if (specifier.startsWith('.')) {
|
|
128
|
+
// Relative import
|
|
129
|
+
const fromDir = path.dirname(fromFile);
|
|
130
|
+
let resolved = path.resolve(fromDir, specifier);
|
|
131
|
+
// Remove .js extension if present (TypeScript uses .js in imports)
|
|
132
|
+
if (resolved.endsWith('.js')) {
|
|
133
|
+
resolved = resolved.slice(0, -3);
|
|
134
|
+
}
|
|
135
|
+
// Try extensions
|
|
136
|
+
const extensions = ['.ts', '.tsx', '.js', '.jsx', '/index.ts', '/index.tsx', '/index.js'];
|
|
137
|
+
for (const ext of extensions) {
|
|
138
|
+
const testPath = resolved.endsWith('.ts') || resolved.endsWith('.tsx')
|
|
139
|
+
? resolved
|
|
140
|
+
: resolved + ext;
|
|
141
|
+
try {
|
|
142
|
+
if (existsSync(testPath)) {
|
|
143
|
+
return testPath;
|
|
144
|
+
}
|
|
145
|
+
}
|
|
146
|
+
catch {
|
|
147
|
+
// Continue to next extension
|
|
148
|
+
}
|
|
149
|
+
}
|
|
150
|
+
// Return resolved path even if file doesn't exist
|
|
151
|
+
return resolved + '.ts'; // Default to .ts
|
|
152
|
+
}
|
|
153
|
+
// External module
|
|
154
|
+
return path.join(baseDir, 'node_modules', specifier);
|
|
155
|
+
}
|
|
156
|
+
/**
|
|
157
|
+
* Find orphaned files (no dependencies)
|
|
158
|
+
*/
|
|
159
|
+
findOrphanedFiles(graph) {
|
|
160
|
+
const orphaned = [];
|
|
161
|
+
for (const node of graph.getNodes()) {
|
|
162
|
+
const afferent = graph.getAfferentDependencies(node.filePath);
|
|
163
|
+
const efferent = graph.getEfferentDependencies(node.filePath);
|
|
164
|
+
if (afferent.length === 0 && efferent.length === 0) {
|
|
165
|
+
orphaned.push(node.filePath);
|
|
166
|
+
}
|
|
167
|
+
}
|
|
168
|
+
return orphaned;
|
|
169
|
+
}
|
|
170
|
+
/**
|
|
171
|
+
* Find hub files (high coupling)
|
|
172
|
+
*/
|
|
173
|
+
findHubFiles(metrics) {
|
|
174
|
+
if (metrics.length === 0)
|
|
175
|
+
return [];
|
|
176
|
+
// Hub = high afferent OR efferent coupling (top 10%)
|
|
177
|
+
const sorted = [...metrics].sort((a, b) => (b.afferentCoupling + b.efferentCoupling) -
|
|
178
|
+
(a.afferentCoupling + a.efferentCoupling));
|
|
179
|
+
const threshold = Math.max(1, Math.ceil(sorted.length * 0.1));
|
|
180
|
+
return sorted.slice(0, threshold).map(m => m.file);
|
|
181
|
+
}
|
|
182
|
+
/**
|
|
183
|
+
* Calculate summary statistics
|
|
184
|
+
*/
|
|
185
|
+
calculateSummary(graph, circularDeps, metrics) {
|
|
186
|
+
const totalFiles = graph.getNodes().length;
|
|
187
|
+
const totalDependencies = graph.getTotalEdges();
|
|
188
|
+
const avgCa = totalFiles > 0
|
|
189
|
+
? metrics.reduce((sum, m) => sum + m.afferentCoupling, 0) / totalFiles
|
|
190
|
+
: 0;
|
|
191
|
+
const avgCe = totalFiles > 0
|
|
192
|
+
? metrics.reduce((sum, m) => sum + m.efferentCoupling, 0) / totalFiles
|
|
193
|
+
: 0;
|
|
194
|
+
const avgInstability = totalFiles > 0
|
|
195
|
+
? metrics.reduce((sum, m) => sum + m.instability, 0) / totalFiles
|
|
196
|
+
: 0;
|
|
197
|
+
const maxCycleLength = circularDeps.reduce((max, dep) => Math.max(max, dep.length), 0);
|
|
198
|
+
// Health score (0-100)
|
|
199
|
+
const circularPenalty = Math.min(50, circularDeps.length * 5);
|
|
200
|
+
const instabilityPenalty = avgInstability * 20;
|
|
201
|
+
const healthScore = Math.max(0, 100 - circularPenalty - instabilityPenalty);
|
|
202
|
+
return Object.freeze({
|
|
203
|
+
totalFiles,
|
|
204
|
+
totalDependencies,
|
|
205
|
+
averageAfferentCoupling: avgCa,
|
|
206
|
+
averageEfferentCoupling: avgCe,
|
|
207
|
+
averageInstability: avgInstability,
|
|
208
|
+
circularDependencyCount: circularDeps.length,
|
|
209
|
+
maxCycleLength,
|
|
210
|
+
healthScore: Math.round(healthScore),
|
|
211
|
+
});
|
|
212
|
+
}
|
|
213
|
+
}
|
|
214
|
+
//# sourceMappingURL=dependency-analyzer.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"dependency-analyzer.js","sourceRoot":"","sources":["../../../src/analyzers/dependency/dependency-analyzer.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,57 @@
|
|
|
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
|
+
}
|
|
@@ -0,0 +1,186 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Dependency Graph Implementation
|
|
3
|
+
*
|
|
4
|
+
* Adjacency list-based directed graph for file dependencies
|
|
5
|
+
*/
|
|
6
|
+
export class DependencyGraph {
|
|
7
|
+
nodes;
|
|
8
|
+
adjacencyList;
|
|
9
|
+
reverseAdjacencyList; // For efficient afferent lookup
|
|
10
|
+
constructor() {
|
|
11
|
+
this.nodes = new Map();
|
|
12
|
+
this.adjacencyList = new Map();
|
|
13
|
+
this.reverseAdjacencyList = new Map();
|
|
14
|
+
}
|
|
15
|
+
/**
|
|
16
|
+
* Add node to graph
|
|
17
|
+
*/
|
|
18
|
+
addNode(node) {
|
|
19
|
+
this.nodes.set(node.filePath, node);
|
|
20
|
+
if (!this.adjacencyList.has(node.filePath)) {
|
|
21
|
+
this.adjacencyList.set(node.filePath, new Set());
|
|
22
|
+
}
|
|
23
|
+
if (!this.reverseAdjacencyList.has(node.filePath)) {
|
|
24
|
+
this.reverseAdjacencyList.set(node.filePath, new Set());
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
/**
|
|
28
|
+
* Add directed edge from -> to
|
|
29
|
+
*/
|
|
30
|
+
addEdge(from, to) {
|
|
31
|
+
// Ensure nodes exist
|
|
32
|
+
if (!this.adjacencyList.has(from)) {
|
|
33
|
+
this.adjacencyList.set(from, new Set());
|
|
34
|
+
}
|
|
35
|
+
if (!this.reverseAdjacencyList.has(to)) {
|
|
36
|
+
this.reverseAdjacencyList.set(to, new Set());
|
|
37
|
+
}
|
|
38
|
+
// Add edge
|
|
39
|
+
this.adjacencyList.get(from).add(to);
|
|
40
|
+
this.reverseAdjacencyList.get(to).add(from);
|
|
41
|
+
}
|
|
42
|
+
/**
|
|
43
|
+
* Get node by file path
|
|
44
|
+
*/
|
|
45
|
+
getNode(file) {
|
|
46
|
+
return this.nodes.get(file);
|
|
47
|
+
}
|
|
48
|
+
/**
|
|
49
|
+
* Get all nodes
|
|
50
|
+
*/
|
|
51
|
+
getNodes() {
|
|
52
|
+
return Array.from(this.nodes.values());
|
|
53
|
+
}
|
|
54
|
+
/**
|
|
55
|
+
* Get afferent dependencies (files that depend on this file)
|
|
56
|
+
*/
|
|
57
|
+
getAfferentDependencies(file) {
|
|
58
|
+
const deps = this.reverseAdjacencyList.get(file);
|
|
59
|
+
return deps ? Array.from(deps) : [];
|
|
60
|
+
}
|
|
61
|
+
/**
|
|
62
|
+
* Get efferent dependencies (files this file depends on)
|
|
63
|
+
*/
|
|
64
|
+
getEfferentDependencies(file) {
|
|
65
|
+
const deps = this.adjacencyList.get(file);
|
|
66
|
+
return deps ? Array.from(deps) : [];
|
|
67
|
+
}
|
|
68
|
+
/**
|
|
69
|
+
* Get total number of edges
|
|
70
|
+
*/
|
|
71
|
+
getTotalEdges() {
|
|
72
|
+
let total = 0;
|
|
73
|
+
for (const deps of this.adjacencyList.values()) {
|
|
74
|
+
total += deps.size;
|
|
75
|
+
}
|
|
76
|
+
return total;
|
|
77
|
+
}
|
|
78
|
+
/**
|
|
79
|
+
* Check if path exists from -> to using BFS
|
|
80
|
+
*/
|
|
81
|
+
hasPath(from, to) {
|
|
82
|
+
if (from === to)
|
|
83
|
+
return true;
|
|
84
|
+
const visited = new Set();
|
|
85
|
+
const queue = [from];
|
|
86
|
+
while (queue.length > 0) {
|
|
87
|
+
const current = queue.shift();
|
|
88
|
+
if (current === to)
|
|
89
|
+
return true;
|
|
90
|
+
if (visited.has(current))
|
|
91
|
+
continue;
|
|
92
|
+
visited.add(current);
|
|
93
|
+
const neighbors = this.adjacencyList.get(current) || new Set();
|
|
94
|
+
for (const neighbor of neighbors) {
|
|
95
|
+
if (!visited.has(neighbor)) {
|
|
96
|
+
queue.push(neighbor);
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
return false;
|
|
101
|
+
}
|
|
102
|
+
/**
|
|
103
|
+
* Topological sort using DFS
|
|
104
|
+
* Returns sorted list and whether cycle was detected
|
|
105
|
+
*/
|
|
106
|
+
topologicalSort() {
|
|
107
|
+
const visited = new Set();
|
|
108
|
+
const recursionStack = new Set();
|
|
109
|
+
const sorted = [];
|
|
110
|
+
let hasCycle = false;
|
|
111
|
+
const dfs = (node) => {
|
|
112
|
+
if (recursionStack.has(node)) {
|
|
113
|
+
hasCycle = true;
|
|
114
|
+
return;
|
|
115
|
+
}
|
|
116
|
+
if (visited.has(node))
|
|
117
|
+
return;
|
|
118
|
+
visited.add(node);
|
|
119
|
+
recursionStack.add(node);
|
|
120
|
+
const neighbors = this.adjacencyList.get(node) || new Set();
|
|
121
|
+
for (const neighbor of neighbors) {
|
|
122
|
+
dfs(neighbor);
|
|
123
|
+
}
|
|
124
|
+
recursionStack.delete(node);
|
|
125
|
+
sorted.unshift(node); // Add to front for reverse post-order
|
|
126
|
+
};
|
|
127
|
+
// Visit all nodes
|
|
128
|
+
for (const node of this.nodes.keys()) {
|
|
129
|
+
if (!visited.has(node)) {
|
|
130
|
+
dfs(node);
|
|
131
|
+
}
|
|
132
|
+
}
|
|
133
|
+
return { sorted, hasCycle };
|
|
134
|
+
}
|
|
135
|
+
/**
|
|
136
|
+
* Get strongly connected components using Tarjan's algorithm
|
|
137
|
+
* (Used for circular dependency detection)
|
|
138
|
+
*/
|
|
139
|
+
getStronglyConnectedComponents() {
|
|
140
|
+
const index = new Map();
|
|
141
|
+
const lowLink = new Map();
|
|
142
|
+
const onStack = new Set();
|
|
143
|
+
const stack = [];
|
|
144
|
+
const sccs = [];
|
|
145
|
+
let currentIndex = 0;
|
|
146
|
+
const strongConnect = (node) => {
|
|
147
|
+
index.set(node, currentIndex);
|
|
148
|
+
lowLink.set(node, currentIndex);
|
|
149
|
+
currentIndex++;
|
|
150
|
+
stack.push(node);
|
|
151
|
+
onStack.add(node);
|
|
152
|
+
const neighbors = this.adjacencyList.get(node) || new Set();
|
|
153
|
+
for (const neighbor of neighbors) {
|
|
154
|
+
if (!index.has(neighbor)) {
|
|
155
|
+
strongConnect(neighbor);
|
|
156
|
+
lowLink.set(node, Math.min(lowLink.get(node), lowLink.get(neighbor)));
|
|
157
|
+
}
|
|
158
|
+
else if (onStack.has(neighbor)) {
|
|
159
|
+
lowLink.set(node, Math.min(lowLink.get(node), index.get(neighbor)));
|
|
160
|
+
}
|
|
161
|
+
}
|
|
162
|
+
// If node is a root node, pop the stack and create SCC
|
|
163
|
+
if (lowLink.get(node) === index.get(node)) {
|
|
164
|
+
const scc = [];
|
|
165
|
+
let w;
|
|
166
|
+
do {
|
|
167
|
+
w = stack.pop();
|
|
168
|
+
onStack.delete(w);
|
|
169
|
+
scc.push(w);
|
|
170
|
+
} while (w !== node);
|
|
171
|
+
// Only add if SCC has more than 1 node (circular dependency)
|
|
172
|
+
if (scc.length > 1) {
|
|
173
|
+
sccs.push(scc);
|
|
174
|
+
}
|
|
175
|
+
}
|
|
176
|
+
};
|
|
177
|
+
// Run on all nodes
|
|
178
|
+
for (const node of this.nodes.keys()) {
|
|
179
|
+
if (!index.has(node)) {
|
|
180
|
+
strongConnect(node);
|
|
181
|
+
}
|
|
182
|
+
}
|
|
183
|
+
return sccs;
|
|
184
|
+
}
|
|
185
|
+
}
|
|
186
|
+
//# sourceMappingURL=dependency-graph.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"dependency-graph.js","sourceRoot":"","sources":["../../../src/analyzers/dependency/dependency-graph.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Dependency Analyzer Module
|
|
3
|
+
*/
|
|
4
|
+
export { DependencyAnalyzer } from './dependency-analyzer.js';
|
|
5
|
+
export { DependencyGraph } from './dependency-graph.js';
|
|
6
|
+
export { CircularDependencyDetector } from './circular-detector.js';
|
|
7
|
+
export { CouplingCalculator } from './coupling-calculator.js';
|
|
8
|
+
export type { DependencyNode, ImportEdge, ExportEdge, CircularDependency, CouplingMetrics, DependencyAnalysisResult, DependencySummary, DependencyAnalysisOptions, } from './types.js';
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Dependency Analyzer Module
|
|
3
|
+
*/
|
|
4
|
+
export { DependencyAnalyzer } from './dependency-analyzer.js';
|
|
5
|
+
export { DependencyGraph } from './dependency-graph.js';
|
|
6
|
+
export { CircularDependencyDetector } from './circular-detector.js';
|
|
7
|
+
export { CouplingCalculator } from './coupling-calculator.js';
|
|
8
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/analyzers/dependency/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,kBAAkB,EAAE,MAAM,0BAA0B,CAAC;AAC9D,OAAO,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;AACxD,OAAO,EAAE,0BAA0B,EAAE,MAAM,wBAAwB,CAAC;AACpE,OAAO,EAAE,kBAAkB,EAAE,MAAM,0BAA0B,CAAC"}
|