codexia 0.2.0
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/CHANGELOG.md +111 -0
- package/LICENSE +663 -0
- package/README.md +392 -0
- package/dist/adapters/github/index.d.ts +66 -0
- package/dist/adapters/github/index.d.ts.map +1 -0
- package/dist/adapters/github/index.js +84 -0
- package/dist/adapters/github/index.js.map +1 -0
- package/dist/adapters/index.d.ts +5 -0
- package/dist/adapters/index.d.ts.map +1 -0
- package/dist/adapters/index.js +5 -0
- package/dist/adapters/index.js.map +1 -0
- package/dist/cli/commands/changelog.d.ts +3 -0
- package/dist/cli/commands/changelog.d.ts.map +1 -0
- package/dist/cli/commands/changelog.js +221 -0
- package/dist/cli/commands/changelog.js.map +1 -0
- package/dist/cli/commands/check.d.ts +3 -0
- package/dist/cli/commands/check.d.ts.map +1 -0
- package/dist/cli/commands/check.js +35 -0
- package/dist/cli/commands/check.js.map +1 -0
- package/dist/cli/commands/complexity.d.ts +3 -0
- package/dist/cli/commands/complexity.d.ts.map +1 -0
- package/dist/cli/commands/complexity.js +103 -0
- package/dist/cli/commands/complexity.js.map +1 -0
- package/dist/cli/commands/graph.d.ts +3 -0
- package/dist/cli/commands/graph.d.ts.map +1 -0
- package/dist/cli/commands/graph.js +46 -0
- package/dist/cli/commands/graph.js.map +1 -0
- package/dist/cli/commands/history.d.ts +3 -0
- package/dist/cli/commands/history.d.ts.map +1 -0
- package/dist/cli/commands/history.js +127 -0
- package/dist/cli/commands/history.js.map +1 -0
- package/dist/cli/commands/hotpaths.d.ts +3 -0
- package/dist/cli/commands/hotpaths.d.ts.map +1 -0
- package/dist/cli/commands/hotpaths.js +153 -0
- package/dist/cli/commands/hotpaths.js.map +1 -0
- package/dist/cli/commands/impact.d.ts +3 -0
- package/dist/cli/commands/impact.d.ts.map +1 -0
- package/dist/cli/commands/impact.js +37 -0
- package/dist/cli/commands/impact.js.map +1 -0
- package/dist/cli/commands/init.d.ts +3 -0
- package/dist/cli/commands/init.d.ts.map +1 -0
- package/dist/cli/commands/init.js +167 -0
- package/dist/cli/commands/init.js.map +1 -0
- package/dist/cli/commands/invariants.d.ts +3 -0
- package/dist/cli/commands/invariants.d.ts.map +1 -0
- package/dist/cli/commands/invariants.js +176 -0
- package/dist/cli/commands/invariants.js.map +1 -0
- package/dist/cli/commands/mcp-server.d.ts +3 -0
- package/dist/cli/commands/mcp-server.d.ts.map +1 -0
- package/dist/cli/commands/mcp-server.js +64 -0
- package/dist/cli/commands/mcp-server.js.map +1 -0
- package/dist/cli/commands/monorepo.d.ts +3 -0
- package/dist/cli/commands/monorepo.d.ts.map +1 -0
- package/dist/cli/commands/monorepo.js +156 -0
- package/dist/cli/commands/monorepo.js.map +1 -0
- package/dist/cli/commands/pr-report.d.ts +3 -0
- package/dist/cli/commands/pr-report.d.ts.map +1 -0
- package/dist/cli/commands/pr-report.js +32 -0
- package/dist/cli/commands/pr-report.js.map +1 -0
- package/dist/cli/commands/scan.d.ts +3 -0
- package/dist/cli/commands/scan.d.ts.map +1 -0
- package/dist/cli/commands/scan.js +25 -0
- package/dist/cli/commands/scan.js.map +1 -0
- package/dist/cli/commands/signals.d.ts +3 -0
- package/dist/cli/commands/signals.d.ts.map +1 -0
- package/dist/cli/commands/signals.js +34 -0
- package/dist/cli/commands/signals.js.map +1 -0
- package/dist/cli/commands/tests.d.ts +3 -0
- package/dist/cli/commands/tests.d.ts.map +1 -0
- package/dist/cli/commands/tests.js +30 -0
- package/dist/cli/commands/tests.js.map +1 -0
- package/dist/cli/commands/watch.d.ts +3 -0
- package/dist/cli/commands/watch.d.ts.map +1 -0
- package/dist/cli/commands/watch.js +131 -0
- package/dist/cli/commands/watch.js.map +1 -0
- package/dist/cli/engine.d.ts +162 -0
- package/dist/cli/engine.d.ts.map +1 -0
- package/dist/cli/engine.js +564 -0
- package/dist/cli/engine.js.map +1 -0
- package/dist/cli/formatter.d.ts +39 -0
- package/dist/cli/formatter.d.ts.map +1 -0
- package/dist/cli/formatter.js +444 -0
- package/dist/cli/formatter.js.map +1 -0
- package/dist/cli/index.d.ts +2 -0
- package/dist/cli/index.d.ts.map +1 -0
- package/dist/cli/index.js +63 -0
- package/dist/cli/index.js.map +1 -0
- package/dist/cli/interactive.d.ts +7 -0
- package/dist/cli/interactive.d.ts.map +1 -0
- package/dist/cli/interactive.js +644 -0
- package/dist/cli/interactive.js.map +1 -0
- package/dist/core/dependency-graph.d.ts +54 -0
- package/dist/core/dependency-graph.d.ts.map +1 -0
- package/dist/core/dependency-graph.js +190 -0
- package/dist/core/dependency-graph.js.map +1 -0
- package/dist/core/dependency-graph.test.d.ts +2 -0
- package/dist/core/dependency-graph.test.d.ts.map +1 -0
- package/dist/core/dependency-graph.test.js +106 -0
- package/dist/core/dependency-graph.test.js.map +1 -0
- package/dist/core/git-analyzer.d.ts +52 -0
- package/dist/core/git-analyzer.d.ts.map +1 -0
- package/dist/core/git-analyzer.js +250 -0
- package/dist/core/git-analyzer.js.map +1 -0
- package/dist/core/git-analyzer.test.d.ts +2 -0
- package/dist/core/git-analyzer.test.d.ts.map +1 -0
- package/dist/core/git-analyzer.test.js +71 -0
- package/dist/core/git-analyzer.test.js.map +1 -0
- package/dist/core/index.d.ts +7 -0
- package/dist/core/index.d.ts.map +1 -0
- package/dist/core/index.js +7 -0
- package/dist/core/index.js.map +1 -0
- package/dist/core/repo-indexer.d.ts +57 -0
- package/dist/core/repo-indexer.d.ts.map +1 -0
- package/dist/core/repo-indexer.js +356 -0
- package/dist/core/repo-indexer.js.map +1 -0
- package/dist/core/repo-indexer.test.d.ts +2 -0
- package/dist/core/repo-indexer.test.d.ts.map +1 -0
- package/dist/core/repo-indexer.test.js +89 -0
- package/dist/core/repo-indexer.test.js.map +1 -0
- package/dist/core/signals-engine.d.ts +38 -0
- package/dist/core/signals-engine.d.ts.map +1 -0
- package/dist/core/signals-engine.js +142 -0
- package/dist/core/signals-engine.js.map +1 -0
- package/dist/core/signals-engine.test.d.ts +2 -0
- package/dist/core/signals-engine.test.d.ts.map +1 -0
- package/dist/core/signals-engine.test.js +129 -0
- package/dist/core/signals-engine.test.js.map +1 -0
- package/dist/core/symbol-map.d.ts +45 -0
- package/dist/core/symbol-map.d.ts.map +1 -0
- package/dist/core/symbol-map.js +187 -0
- package/dist/core/symbol-map.js.map +1 -0
- package/dist/core/types.d.ts +514 -0
- package/dist/core/types.d.ts.map +1 -0
- package/dist/core/types.js +5 -0
- package/dist/core/types.js.map +1 -0
- package/dist/core/types.test.d.ts +2 -0
- package/dist/core/types.test.d.ts.map +1 -0
- package/dist/core/types.test.js +20 -0
- package/dist/core/types.test.js.map +1 -0
- package/dist/index.d.ts +5 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +9 -0
- package/dist/index.js.map +1 -0
- package/dist/mcp/index.d.ts +3 -0
- package/dist/mcp/index.d.ts.map +1 -0
- package/dist/mcp/index.js +2 -0
- package/dist/mcp/index.js.map +1 -0
- package/dist/mcp/server.d.ts +89 -0
- package/dist/mcp/server.d.ts.map +1 -0
- package/dist/mcp/server.js +549 -0
- package/dist/mcp/server.js.map +1 -0
- package/dist/modules/changelog-generator.d.ts +82 -0
- package/dist/modules/changelog-generator.d.ts.map +1 -0
- package/dist/modules/changelog-generator.js +350 -0
- package/dist/modules/changelog-generator.js.map +1 -0
- package/dist/modules/complexity-engine.d.ts +86 -0
- package/dist/modules/complexity-engine.d.ts.map +1 -0
- package/dist/modules/complexity-engine.js +355 -0
- package/dist/modules/complexity-engine.js.map +1 -0
- package/dist/modules/convention-checker.d.ts +24 -0
- package/dist/modules/convention-checker.d.ts.map +1 -0
- package/dist/modules/convention-checker.js +181 -0
- package/dist/modules/convention-checker.js.map +1 -0
- package/dist/modules/graph-utils.d.ts +38 -0
- package/dist/modules/graph-utils.d.ts.map +1 -0
- package/dist/modules/graph-utils.js +40 -0
- package/dist/modules/graph-utils.js.map +1 -0
- package/dist/modules/hot-path-detector.d.ts +105 -0
- package/dist/modules/hot-path-detector.d.ts.map +1 -0
- package/dist/modules/hot-path-detector.js +332 -0
- package/dist/modules/hot-path-detector.js.map +1 -0
- package/dist/modules/impact-analyzer.d.ts +40 -0
- package/dist/modules/impact-analyzer.d.ts.map +1 -0
- package/dist/modules/impact-analyzer.js +218 -0
- package/dist/modules/impact-analyzer.js.map +1 -0
- package/dist/modules/impact-analyzer.test.d.ts +2 -0
- package/dist/modules/impact-analyzer.test.d.ts.map +1 -0
- package/dist/modules/impact-analyzer.test.js +308 -0
- package/dist/modules/impact-analyzer.test.js.map +1 -0
- package/dist/modules/index.d.ts +14 -0
- package/dist/modules/index.d.ts.map +1 -0
- package/dist/modules/index.js +20 -0
- package/dist/modules/index.js.map +1 -0
- package/dist/modules/invariant-engine.d.ts +119 -0
- package/dist/modules/invariant-engine.d.ts.map +1 -0
- package/dist/modules/invariant-engine.js +457 -0
- package/dist/modules/invariant-engine.js.map +1 -0
- package/dist/modules/memory-loader.d.ts +34 -0
- package/dist/modules/memory-loader.d.ts.map +1 -0
- package/dist/modules/memory-loader.js +313 -0
- package/dist/modules/memory-loader.js.map +1 -0
- package/dist/modules/memory-loader.test.d.ts +2 -0
- package/dist/modules/memory-loader.test.d.ts.map +1 -0
- package/dist/modules/memory-loader.test.js +120 -0
- package/dist/modules/memory-loader.test.js.map +1 -0
- package/dist/modules/monorepo-analyzer.d.ts +141 -0
- package/dist/modules/monorepo-analyzer.d.ts.map +1 -0
- package/dist/modules/monorepo-analyzer.js +453 -0
- package/dist/modules/monorepo-analyzer.js.map +1 -0
- package/dist/modules/plugin-system.d.ts +144 -0
- package/dist/modules/plugin-system.d.ts.map +1 -0
- package/dist/modules/plugin-system.js +428 -0
- package/dist/modules/plugin-system.js.map +1 -0
- package/dist/modules/smart-test-prioritizer.d.ts +95 -0
- package/dist/modules/smart-test-prioritizer.d.ts.map +1 -0
- package/dist/modules/smart-test-prioritizer.js +328 -0
- package/dist/modules/smart-test-prioritizer.js.map +1 -0
- package/dist/modules/temporal-analyzer.d.ts +71 -0
- package/dist/modules/temporal-analyzer.d.ts.map +1 -0
- package/dist/modules/temporal-analyzer.js +301 -0
- package/dist/modules/temporal-analyzer.js.map +1 -0
- package/dist/modules/test-suggester.d.ts +22 -0
- package/dist/modules/test-suggester.d.ts.map +1 -0
- package/dist/modules/test-suggester.js +145 -0
- package/dist/modules/test-suggester.js.map +1 -0
- package/dist/modules/visualizer.d.ts +49 -0
- package/dist/modules/visualizer.d.ts.map +1 -0
- package/dist/modules/visualizer.js +302 -0
- package/dist/modules/visualizer.js.map +1 -0
- package/dist/modules/watcher.d.ts +82 -0
- package/dist/modules/watcher.d.ts.map +1 -0
- package/dist/modules/watcher.js +298 -0
- package/dist/modules/watcher.js.map +1 -0
- package/package.json +70 -0
|
@@ -0,0 +1,355 @@
|
|
|
1
|
+
// ============================================================================
|
|
2
|
+
// Complexity Engine
|
|
3
|
+
// ============================================================================
|
|
4
|
+
export class ComplexityEngine {
|
|
5
|
+
/**
|
|
6
|
+
* Analyze complexity of a single file
|
|
7
|
+
*/
|
|
8
|
+
analyzeFile(fileInfo, content) {
|
|
9
|
+
const metrics = this.calculateDetailedMetrics(content);
|
|
10
|
+
const symbolComplexities = this.analyzeSymbols(fileInfo.symbols, content);
|
|
11
|
+
const score = this.calculateScore(fileInfo, metrics, symbolComplexities);
|
|
12
|
+
return {
|
|
13
|
+
path: fileInfo.relativePath,
|
|
14
|
+
score,
|
|
15
|
+
symbols: symbolComplexities,
|
|
16
|
+
metrics,
|
|
17
|
+
};
|
|
18
|
+
}
|
|
19
|
+
/**
|
|
20
|
+
* Analyze complexity across all files
|
|
21
|
+
*/
|
|
22
|
+
analyzeAll(files, contents, dependencyInfo) {
|
|
23
|
+
const results = new Map();
|
|
24
|
+
for (const [path, fileInfo] of files) {
|
|
25
|
+
const content = contents.get(path) || '';
|
|
26
|
+
const complexity = this.analyzeFile(fileInfo, content);
|
|
27
|
+
// Add coupling metrics from dependency info
|
|
28
|
+
const deps = dependencyInfo.get(path);
|
|
29
|
+
if (deps) {
|
|
30
|
+
const totalDeps = deps.imports + deps.importedBy;
|
|
31
|
+
complexity.score.coupling = Math.min(100, (deps.imports + deps.importedBy) * 5);
|
|
32
|
+
complexity.score.instability = totalDeps > 0
|
|
33
|
+
? deps.imports / totalDeps
|
|
34
|
+
: 0;
|
|
35
|
+
}
|
|
36
|
+
results.set(path, complexity);
|
|
37
|
+
}
|
|
38
|
+
return results;
|
|
39
|
+
}
|
|
40
|
+
/**
|
|
41
|
+
* Calculate detailed code metrics
|
|
42
|
+
*/
|
|
43
|
+
calculateDetailedMetrics(content) {
|
|
44
|
+
const lines = content.split('\n');
|
|
45
|
+
let logicalLines = 0;
|
|
46
|
+
let commentLines = 0;
|
|
47
|
+
let blankLines = 0;
|
|
48
|
+
let inBlockComment = false;
|
|
49
|
+
let maxNestingDepth = 0;
|
|
50
|
+
let currentNesting = 0;
|
|
51
|
+
let returnStatements = 0;
|
|
52
|
+
let parameterCount = 0;
|
|
53
|
+
const functionLengths = [];
|
|
54
|
+
let currentFunctionStart = -1;
|
|
55
|
+
for (let i = 0; i < lines.length; i++) {
|
|
56
|
+
const line = lines[i].trim();
|
|
57
|
+
// Blank line
|
|
58
|
+
if (line === '') {
|
|
59
|
+
blankLines++;
|
|
60
|
+
continue;
|
|
61
|
+
}
|
|
62
|
+
// Block comment handling
|
|
63
|
+
if (line.startsWith('/*')) {
|
|
64
|
+
inBlockComment = true;
|
|
65
|
+
commentLines++;
|
|
66
|
+
if (line.includes('*/'))
|
|
67
|
+
inBlockComment = false;
|
|
68
|
+
continue;
|
|
69
|
+
}
|
|
70
|
+
if (inBlockComment) {
|
|
71
|
+
commentLines++;
|
|
72
|
+
if (line.includes('*/'))
|
|
73
|
+
inBlockComment = false;
|
|
74
|
+
continue;
|
|
75
|
+
}
|
|
76
|
+
// Single line comment
|
|
77
|
+
if (line.startsWith('//')) {
|
|
78
|
+
commentLines++;
|
|
79
|
+
continue;
|
|
80
|
+
}
|
|
81
|
+
// Logical line
|
|
82
|
+
logicalLines++;
|
|
83
|
+
// Nesting depth tracking
|
|
84
|
+
const openBraces = (line.match(/{/g) || []).length;
|
|
85
|
+
const closeBraces = (line.match(/}/g) || []).length;
|
|
86
|
+
currentNesting += openBraces - closeBraces;
|
|
87
|
+
maxNestingDepth = Math.max(maxNestingDepth, currentNesting);
|
|
88
|
+
// Return statements
|
|
89
|
+
if (/\breturn\b/.test(line)) {
|
|
90
|
+
returnStatements++;
|
|
91
|
+
}
|
|
92
|
+
// Function/method detection
|
|
93
|
+
if (/\b(function|async function|\w+\s*\(.*\)\s*[:{]|=>\s*{?)/.test(line)) {
|
|
94
|
+
if (currentFunctionStart >= 0) {
|
|
95
|
+
functionLengths.push(i - currentFunctionStart);
|
|
96
|
+
}
|
|
97
|
+
currentFunctionStart = i;
|
|
98
|
+
// Count parameters
|
|
99
|
+
const paramMatch = line.match(/\(([^)]*)\)/);
|
|
100
|
+
if (paramMatch) {
|
|
101
|
+
const params = paramMatch[1].split(',').filter(p => p.trim());
|
|
102
|
+
parameterCount += params.length;
|
|
103
|
+
}
|
|
104
|
+
}
|
|
105
|
+
}
|
|
106
|
+
// Close last function
|
|
107
|
+
if (currentFunctionStart >= 0) {
|
|
108
|
+
functionLengths.push(lines.length - currentFunctionStart);
|
|
109
|
+
}
|
|
110
|
+
const avgFunctionLength = functionLengths.length > 0
|
|
111
|
+
? functionLengths.reduce((a, b) => a + b, 0) / functionLengths.length
|
|
112
|
+
: 0;
|
|
113
|
+
const maxFunctionLength = functionLengths.length > 0
|
|
114
|
+
? Math.max(...functionLengths)
|
|
115
|
+
: 0;
|
|
116
|
+
return {
|
|
117
|
+
linesOfCode: lines.length,
|
|
118
|
+
logicalLines,
|
|
119
|
+
commentLines,
|
|
120
|
+
blankLines,
|
|
121
|
+
commentRatio: lines.length > 0 ? commentLines / lines.length : 0,
|
|
122
|
+
avgFunctionLength,
|
|
123
|
+
maxFunctionLength,
|
|
124
|
+
maxNestingDepth,
|
|
125
|
+
parameterCount,
|
|
126
|
+
returnStatements,
|
|
127
|
+
};
|
|
128
|
+
}
|
|
129
|
+
/**
|
|
130
|
+
* Analyze complexity of individual symbols
|
|
131
|
+
*/
|
|
132
|
+
analyzeSymbols(symbols, content) {
|
|
133
|
+
const results = [];
|
|
134
|
+
const lines = content.split('\n');
|
|
135
|
+
for (const symbol of symbols) {
|
|
136
|
+
// Estimate symbol boundaries (simplified)
|
|
137
|
+
const startLine = symbol.line - 1;
|
|
138
|
+
let endLine = startLine;
|
|
139
|
+
let braceCount = 0;
|
|
140
|
+
let started = false;
|
|
141
|
+
for (let i = startLine; i < lines.length; i++) {
|
|
142
|
+
const line = lines[i];
|
|
143
|
+
for (const char of line) {
|
|
144
|
+
if (char === '{') {
|
|
145
|
+
braceCount++;
|
|
146
|
+
started = true;
|
|
147
|
+
}
|
|
148
|
+
else if (char === '}') {
|
|
149
|
+
braceCount--;
|
|
150
|
+
if (started && braceCount === 0) {
|
|
151
|
+
endLine = i;
|
|
152
|
+
break;
|
|
153
|
+
}
|
|
154
|
+
}
|
|
155
|
+
}
|
|
156
|
+
if (started && braceCount === 0)
|
|
157
|
+
break;
|
|
158
|
+
}
|
|
159
|
+
const symbolContent = lines.slice(startLine, endLine + 1).join('\n');
|
|
160
|
+
results.push({
|
|
161
|
+
name: symbol.name,
|
|
162
|
+
kind: symbol.kind,
|
|
163
|
+
cyclomatic: this.calculateCyclomaticComplexity(symbolContent),
|
|
164
|
+
cognitive: this.calculateCognitiveComplexity(symbolContent),
|
|
165
|
+
linesOfCode: endLine - startLine + 1,
|
|
166
|
+
parameters: this.countParameters(symbolContent),
|
|
167
|
+
dependencies: symbol.references?.length || 0,
|
|
168
|
+
});
|
|
169
|
+
}
|
|
170
|
+
return results;
|
|
171
|
+
}
|
|
172
|
+
/**
|
|
173
|
+
* Calculate cyclomatic complexity (decision points + 1)
|
|
174
|
+
*/
|
|
175
|
+
calculateCyclomaticComplexity(code) {
|
|
176
|
+
let complexity = 1;
|
|
177
|
+
// Control flow keywords
|
|
178
|
+
const patterns = [
|
|
179
|
+
/\bif\b/g,
|
|
180
|
+
/\belse\s+if\b/g,
|
|
181
|
+
/\bfor\b/g,
|
|
182
|
+
/\bwhile\b/g,
|
|
183
|
+
/\bdo\b/g,
|
|
184
|
+
/\bcase\b/g,
|
|
185
|
+
/\bcatch\b/g,
|
|
186
|
+
/\?\?/g, // Nullish coalescing
|
|
187
|
+
/\?\./g, // Optional chaining
|
|
188
|
+
/\|\|/g, // Logical OR
|
|
189
|
+
/&&/g, // Logical AND
|
|
190
|
+
/\?[^:]/g, // Ternary (not TS type)
|
|
191
|
+
];
|
|
192
|
+
for (const pattern of patterns) {
|
|
193
|
+
const matches = code.match(pattern);
|
|
194
|
+
if (matches) {
|
|
195
|
+
complexity += matches.length;
|
|
196
|
+
}
|
|
197
|
+
}
|
|
198
|
+
return complexity;
|
|
199
|
+
}
|
|
200
|
+
/**
|
|
201
|
+
* Calculate cognitive complexity (human-centric complexity)
|
|
202
|
+
*/
|
|
203
|
+
calculateCognitiveComplexity(code) {
|
|
204
|
+
let complexity = 0;
|
|
205
|
+
let nestingLevel = 0;
|
|
206
|
+
const lines = code.split('\n');
|
|
207
|
+
for (const line of lines) {
|
|
208
|
+
const trimmed = line.trim();
|
|
209
|
+
// Increment for nesting
|
|
210
|
+
if (/\b(if|else|for|while|switch|try|catch)\b/.test(trimmed)) {
|
|
211
|
+
complexity += 1 + nestingLevel; // Base + nesting penalty
|
|
212
|
+
}
|
|
213
|
+
// Break/continue with labels add complexity
|
|
214
|
+
if (/\b(break|continue)\s+\w+/.test(trimmed)) {
|
|
215
|
+
complexity += 1;
|
|
216
|
+
}
|
|
217
|
+
// Recursion is complex
|
|
218
|
+
if (/\bthis\.\w+\(/.test(trimmed) || /\brecurs/.test(trimmed)) {
|
|
219
|
+
complexity += 1;
|
|
220
|
+
}
|
|
221
|
+
// Track nesting
|
|
222
|
+
const opens = (line.match(/{/g) || []).length;
|
|
223
|
+
const closes = (line.match(/}/g) || []).length;
|
|
224
|
+
nestingLevel = Math.max(0, nestingLevel + opens - closes);
|
|
225
|
+
}
|
|
226
|
+
return complexity;
|
|
227
|
+
}
|
|
228
|
+
/**
|
|
229
|
+
* Count function parameters
|
|
230
|
+
*/
|
|
231
|
+
countParameters(code) {
|
|
232
|
+
const firstLine = code.split('\n')[0];
|
|
233
|
+
const match = firstLine.match(/\(([^)]*)\)/);
|
|
234
|
+
if (!match)
|
|
235
|
+
return 0;
|
|
236
|
+
const params = match[1].split(',').filter(p => p.trim());
|
|
237
|
+
return params.length;
|
|
238
|
+
}
|
|
239
|
+
/**
|
|
240
|
+
* Calculate overall complexity score
|
|
241
|
+
*/
|
|
242
|
+
calculateScore(fileInfo, metrics, symbolComplexities) {
|
|
243
|
+
// Calculate averages
|
|
244
|
+
const avgCyclomatic = symbolComplexities.length > 0
|
|
245
|
+
? symbolComplexities.reduce((sum, s) => sum + s.cyclomatic, 0) / symbolComplexities.length
|
|
246
|
+
: 0;
|
|
247
|
+
const avgCognitive = symbolComplexities.length > 0
|
|
248
|
+
? symbolComplexities.reduce((sum, s) => sum + s.cognitive, 0) / symbolComplexities.length
|
|
249
|
+
: 0;
|
|
250
|
+
// Abstractness: ratio of interfaces/types to classes/functions
|
|
251
|
+
const abstractSymbols = fileInfo.symbols.filter(s => s.kind === 'interface' || s.kind === 'type').length;
|
|
252
|
+
const concreteSymbols = fileInfo.symbols.filter(s => s.kind === 'class' || s.kind === 'function').length;
|
|
253
|
+
const abstractness = (abstractSymbols + concreteSymbols) > 0
|
|
254
|
+
? abstractSymbols / (abstractSymbols + concreteSymbols)
|
|
255
|
+
: 0;
|
|
256
|
+
// Cohesion: simplified - based on how many symbols reference each other
|
|
257
|
+
// Lower exports relative to total symbols suggests higher cohesion
|
|
258
|
+
const cohesion = fileInfo.symbols.length > 0
|
|
259
|
+
? 1 - (fileInfo.exports.length / fileInfo.symbols.length)
|
|
260
|
+
: 1;
|
|
261
|
+
// Maintainability Index (simplified version of Microsoft's formula)
|
|
262
|
+
// MI = 171 - 5.2 * ln(V) - 0.23 * G - 16.2 * ln(L)
|
|
263
|
+
// Where V=volume, G=cyclomatic, L=lines
|
|
264
|
+
const volume = metrics.logicalLines * Math.log2(fileInfo.symbols.length + 1);
|
|
265
|
+
const mi = Math.max(0, Math.min(100, 171 - 5.2 * Math.log(volume + 1) - 0.23 * avgCyclomatic - 16.2 * Math.log(metrics.linesOfCode + 1)));
|
|
266
|
+
// Overall score (weighted composite)
|
|
267
|
+
const overall = Math.round((100 - Math.min(100, avgCyclomatic * 5)) * 0.25 +
|
|
268
|
+
(100 - Math.min(100, avgCognitive * 3)) * 0.25 +
|
|
269
|
+
mi * 0.3 +
|
|
270
|
+
cohesion * 100 * 0.1 +
|
|
271
|
+
(1 - Math.min(1, metrics.maxNestingDepth / 10)) * 100 * 0.1);
|
|
272
|
+
return {
|
|
273
|
+
overall,
|
|
274
|
+
cyclomatic: Math.round(avgCyclomatic * 10) / 10,
|
|
275
|
+
cognitive: Math.round(avgCognitive * 10) / 10,
|
|
276
|
+
coupling: 0, // Calculated externally with dependency info
|
|
277
|
+
cohesion: Math.round(cohesion * 100) / 100,
|
|
278
|
+
abstractness: Math.round(abstractness * 100) / 100,
|
|
279
|
+
instability: 0, // Calculated externally with dependency info
|
|
280
|
+
maintainabilityIndex: Math.round(mi),
|
|
281
|
+
};
|
|
282
|
+
}
|
|
283
|
+
/**
|
|
284
|
+
* Get complexity signals (warnings for problematic areas)
|
|
285
|
+
*/
|
|
286
|
+
getSignals(complexity) {
|
|
287
|
+
const signals = [];
|
|
288
|
+
// High cyclomatic complexity
|
|
289
|
+
if (complexity.score.cyclomatic > 15) {
|
|
290
|
+
signals.push({
|
|
291
|
+
type: 'high-cyclomatic',
|
|
292
|
+
severity: complexity.score.cyclomatic > 25 ? 'error' : 'warning',
|
|
293
|
+
message: `High cyclomatic complexity (${complexity.score.cyclomatic})`,
|
|
294
|
+
suggestion: 'Consider breaking down complex functions',
|
|
295
|
+
});
|
|
296
|
+
}
|
|
297
|
+
// High cognitive complexity
|
|
298
|
+
if (complexity.score.cognitive > 20) {
|
|
299
|
+
signals.push({
|
|
300
|
+
type: 'high-cognitive',
|
|
301
|
+
severity: complexity.score.cognitive > 35 ? 'error' : 'warning',
|
|
302
|
+
message: `High cognitive complexity (${complexity.score.cognitive})`,
|
|
303
|
+
suggestion: 'Simplify nested logic and reduce cognitive load',
|
|
304
|
+
});
|
|
305
|
+
}
|
|
306
|
+
// Low maintainability index
|
|
307
|
+
if (complexity.score.maintainabilityIndex < 40) {
|
|
308
|
+
signals.push({
|
|
309
|
+
type: 'low-maintainability',
|
|
310
|
+
severity: complexity.score.maintainabilityIndex < 20 ? 'error' : 'warning',
|
|
311
|
+
message: `Low maintainability index (${complexity.score.maintainabilityIndex}/100)`,
|
|
312
|
+
suggestion: 'Refactor to improve maintainability',
|
|
313
|
+
});
|
|
314
|
+
}
|
|
315
|
+
// High coupling
|
|
316
|
+
if (complexity.score.coupling > 50) {
|
|
317
|
+
signals.push({
|
|
318
|
+
type: 'high-coupling',
|
|
319
|
+
severity: 'warning',
|
|
320
|
+
message: `High coupling score (${complexity.score.coupling})`,
|
|
321
|
+
suggestion: 'Consider reducing dependencies',
|
|
322
|
+
});
|
|
323
|
+
}
|
|
324
|
+
// Instability zone (high instability + low abstractness)
|
|
325
|
+
if (complexity.score.instability > 0.7 && complexity.score.abstractness < 0.3) {
|
|
326
|
+
signals.push({
|
|
327
|
+
type: 'instability-zone',
|
|
328
|
+
severity: 'warning',
|
|
329
|
+
message: 'File is in instability zone (high instability, low abstractness)',
|
|
330
|
+
suggestion: 'Add abstractions or reduce outgoing dependencies',
|
|
331
|
+
});
|
|
332
|
+
}
|
|
333
|
+
// Complex symbols
|
|
334
|
+
for (const symbol of complexity.symbols) {
|
|
335
|
+
if (symbol.cyclomatic > 20) {
|
|
336
|
+
signals.push({
|
|
337
|
+
type: 'complex-symbol',
|
|
338
|
+
severity: 'warning',
|
|
339
|
+
message: `${symbol.kind} '${symbol.name}' has high complexity (${symbol.cyclomatic})`,
|
|
340
|
+
suggestion: 'Break down into smaller functions',
|
|
341
|
+
});
|
|
342
|
+
}
|
|
343
|
+
if (symbol.linesOfCode > 100) {
|
|
344
|
+
signals.push({
|
|
345
|
+
type: 'long-function',
|
|
346
|
+
severity: 'info',
|
|
347
|
+
message: `${symbol.kind} '${symbol.name}' is ${symbol.linesOfCode} lines`,
|
|
348
|
+
suggestion: 'Consider extracting helper functions',
|
|
349
|
+
});
|
|
350
|
+
}
|
|
351
|
+
}
|
|
352
|
+
return signals;
|
|
353
|
+
}
|
|
354
|
+
}
|
|
355
|
+
//# sourceMappingURL=complexity-engine.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"complexity-engine.js","sourceRoot":"","sources":["../../src/modules/complexity-engine.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import type { ConventionViolation, ConventionMemory, FileInfo, GitDiff } from '../core/types.js';
|
|
2
|
+
export declare class ConventionChecker {
|
|
3
|
+
private conventions;
|
|
4
|
+
constructor();
|
|
5
|
+
/**
|
|
6
|
+
* Load conventions from memory
|
|
7
|
+
*/
|
|
8
|
+
loadFromMemory(memory: ConventionMemory): void;
|
|
9
|
+
/**
|
|
10
|
+
* Check files for convention violations
|
|
11
|
+
*/
|
|
12
|
+
check(diff: GitDiff, files: Map<string, FileInfo>): ConventionViolation[];
|
|
13
|
+
/**
|
|
14
|
+
* Check all conventions (not just diff)
|
|
15
|
+
*/
|
|
16
|
+
checkAll(files: Map<string, FileInfo>): ConventionViolation[];
|
|
17
|
+
private checkFileConventions;
|
|
18
|
+
private checkSymbolConventions;
|
|
19
|
+
private loadDefaultConventions;
|
|
20
|
+
private getConvention;
|
|
21
|
+
private toPascalCase;
|
|
22
|
+
private toCamelCase;
|
|
23
|
+
}
|
|
24
|
+
//# sourceMappingURL=convention-checker.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"convention-checker.d.ts","sourceRoot":"","sources":["../../src/modules/convention-checker.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAEV,mBAAmB,EACnB,gBAAgB,EAChB,QAAQ,EACR,OAAO,EACR,MAAM,kBAAkB,CAAC;AAE1B,qBAAa,iBAAiB;IAC5B,OAAO,CAAC,WAAW,CAAoB;;IAMvC;;OAEG;IACH,cAAc,CAAC,MAAM,EAAE,gBAAgB,GAAG,IAAI;IAkB9C;;OAEG;IACH,KAAK,CAAC,IAAI,EAAE,OAAO,EAAE,KAAK,EAAE,GAAG,CAAC,MAAM,EAAE,QAAQ,CAAC,GAAG,mBAAmB,EAAE;IAmBzE;;OAEG;IACH,QAAQ,CAAC,KAAK,EAAE,GAAG,CAAC,MAAM,EAAE,QAAQ,CAAC,GAAG,mBAAmB,EAAE;IAc7D,OAAO,CAAC,oBAAoB;IA8B5B,OAAO,CAAC,sBAAsB;IAiD9B,OAAO,CAAC,sBAAsB;IA6C9B,OAAO,CAAC,aAAa;IAIrB,OAAO,CAAC,YAAY;IAMpB,OAAO,CAAC,WAAW;CAKpB"}
|
|
@@ -0,0 +1,181 @@
|
|
|
1
|
+
export class ConventionChecker {
|
|
2
|
+
conventions = [];
|
|
3
|
+
constructor() {
|
|
4
|
+
this.loadDefaultConventions();
|
|
5
|
+
}
|
|
6
|
+
/**
|
|
7
|
+
* Load conventions from memory
|
|
8
|
+
*/
|
|
9
|
+
loadFromMemory(memory) {
|
|
10
|
+
// Convert memory conventions to checkable conventions
|
|
11
|
+
for (const naming of memory.naming) {
|
|
12
|
+
this.conventions.push({
|
|
13
|
+
id: `naming-${naming.target}`,
|
|
14
|
+
name: `${naming.target} naming`,
|
|
15
|
+
description: `${naming.target} should match pattern ${naming.pattern}`,
|
|
16
|
+
category: 'naming',
|
|
17
|
+
severity: 'warning',
|
|
18
|
+
check: {
|
|
19
|
+
type: 'regex',
|
|
20
|
+
pattern: naming.pattern,
|
|
21
|
+
message: `${naming.target} does not match expected pattern`,
|
|
22
|
+
},
|
|
23
|
+
});
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
/**
|
|
27
|
+
* Check files for convention violations
|
|
28
|
+
*/
|
|
29
|
+
check(diff, files) {
|
|
30
|
+
const violations = [];
|
|
31
|
+
for (const file of diff.files) {
|
|
32
|
+
const fileInfo = files.get(file.path);
|
|
33
|
+
if (!fileInfo)
|
|
34
|
+
continue;
|
|
35
|
+
// Check file-level conventions
|
|
36
|
+
violations.push(...this.checkFileConventions(file.path, fileInfo));
|
|
37
|
+
// Check symbol-level conventions
|
|
38
|
+
for (const symbol of fileInfo.symbols) {
|
|
39
|
+
violations.push(...this.checkSymbolConventions(symbol, file.path));
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
return violations;
|
|
43
|
+
}
|
|
44
|
+
/**
|
|
45
|
+
* Check all conventions (not just diff)
|
|
46
|
+
*/
|
|
47
|
+
checkAll(files) {
|
|
48
|
+
const violations = [];
|
|
49
|
+
for (const [filePath, fileInfo] of files) {
|
|
50
|
+
violations.push(...this.checkFileConventions(filePath, fileInfo));
|
|
51
|
+
for (const symbol of fileInfo.symbols) {
|
|
52
|
+
violations.push(...this.checkSymbolConventions(symbol, filePath));
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
return violations;
|
|
56
|
+
}
|
|
57
|
+
checkFileConventions(filePath, fileInfo) {
|
|
58
|
+
const violations = [];
|
|
59
|
+
// Check: File size
|
|
60
|
+
if (fileInfo.lines > 500) {
|
|
61
|
+
violations.push({
|
|
62
|
+
convention: this.getConvention('file-size'),
|
|
63
|
+
filePath,
|
|
64
|
+
line: 1,
|
|
65
|
+
column: 1,
|
|
66
|
+
message: `File has ${fileInfo.lines} lines, exceeds recommended 500`,
|
|
67
|
+
suggestion: 'Consider splitting into smaller modules',
|
|
68
|
+
});
|
|
69
|
+
}
|
|
70
|
+
// Check: Too many exports
|
|
71
|
+
if (fileInfo.exports.length > 10) {
|
|
72
|
+
violations.push({
|
|
73
|
+
convention: this.getConvention('export-count'),
|
|
74
|
+
filePath,
|
|
75
|
+
line: 1,
|
|
76
|
+
column: 1,
|
|
77
|
+
message: `File has ${fileInfo.exports.length} exports, exceeds recommended 10`,
|
|
78
|
+
suggestion: 'Consider grouping related exports or splitting the module',
|
|
79
|
+
});
|
|
80
|
+
}
|
|
81
|
+
return violations;
|
|
82
|
+
}
|
|
83
|
+
checkSymbolConventions(symbol, filePath) {
|
|
84
|
+
const violations = [];
|
|
85
|
+
// Check: Class naming (PascalCase)
|
|
86
|
+
if (symbol.kind === 'class' && !/^[A-Z][a-zA-Z0-9]*$/.test(symbol.name)) {
|
|
87
|
+
violations.push({
|
|
88
|
+
convention: this.getConvention('class-naming'),
|
|
89
|
+
filePath,
|
|
90
|
+
line: symbol.line,
|
|
91
|
+
column: 1,
|
|
92
|
+
message: `Class '${symbol.name}' should use PascalCase`,
|
|
93
|
+
suggestion: `Rename to ${this.toPascalCase(symbol.name)}`,
|
|
94
|
+
});
|
|
95
|
+
}
|
|
96
|
+
// Check: Interface naming (PascalCase, optionally prefixed with I)
|
|
97
|
+
if (symbol.kind === 'interface' && !/^I?[A-Z][a-zA-Z0-9]*$/.test(symbol.name)) {
|
|
98
|
+
violations.push({
|
|
99
|
+
convention: this.getConvention('interface-naming'),
|
|
100
|
+
filePath,
|
|
101
|
+
line: symbol.line,
|
|
102
|
+
column: 1,
|
|
103
|
+
message: `Interface '${symbol.name}' should use PascalCase`,
|
|
104
|
+
});
|
|
105
|
+
}
|
|
106
|
+
// Check: Function naming (camelCase)
|
|
107
|
+
if (symbol.kind === 'function' && !/^[a-z][a-zA-Z0-9]*$/.test(symbol.name)) {
|
|
108
|
+
violations.push({
|
|
109
|
+
convention: this.getConvention('function-naming'),
|
|
110
|
+
filePath,
|
|
111
|
+
line: symbol.line,
|
|
112
|
+
column: 1,
|
|
113
|
+
message: `Function '${symbol.name}' should use camelCase`,
|
|
114
|
+
suggestion: `Rename to ${this.toCamelCase(symbol.name)}`,
|
|
115
|
+
});
|
|
116
|
+
}
|
|
117
|
+
// Check: Constant naming (SCREAMING_SNAKE_CASE for true constants)
|
|
118
|
+
if (symbol.kind === 'variable' && symbol.name === symbol.name.toUpperCase() && symbol.name.length > 1) {
|
|
119
|
+
// This is likely intentional constant naming - no violation
|
|
120
|
+
}
|
|
121
|
+
return violations;
|
|
122
|
+
}
|
|
123
|
+
loadDefaultConventions() {
|
|
124
|
+
this.conventions = [
|
|
125
|
+
{
|
|
126
|
+
id: 'file-size',
|
|
127
|
+
name: 'File Size',
|
|
128
|
+
description: 'Files should not exceed 500 lines',
|
|
129
|
+
category: 'structure',
|
|
130
|
+
severity: 'warning',
|
|
131
|
+
check: { type: 'custom', message: 'File exceeds recommended size' },
|
|
132
|
+
},
|
|
133
|
+
{
|
|
134
|
+
id: 'export-count',
|
|
135
|
+
name: 'Export Count',
|
|
136
|
+
description: 'Files should not have more than 10 exports',
|
|
137
|
+
category: 'exports',
|
|
138
|
+
severity: 'warning',
|
|
139
|
+
check: { type: 'custom', message: 'Too many exports in file' },
|
|
140
|
+
},
|
|
141
|
+
{
|
|
142
|
+
id: 'class-naming',
|
|
143
|
+
name: 'Class Naming',
|
|
144
|
+
description: 'Classes should use PascalCase',
|
|
145
|
+
category: 'naming',
|
|
146
|
+
severity: 'warning',
|
|
147
|
+
check: { type: 'regex', pattern: '^[A-Z][a-zA-Z0-9]*$', message: 'Use PascalCase' },
|
|
148
|
+
},
|
|
149
|
+
{
|
|
150
|
+
id: 'interface-naming',
|
|
151
|
+
name: 'Interface Naming',
|
|
152
|
+
description: 'Interfaces should use PascalCase',
|
|
153
|
+
category: 'naming',
|
|
154
|
+
severity: 'warning',
|
|
155
|
+
check: { type: 'regex', pattern: '^I?[A-Z][a-zA-Z0-9]*$', message: 'Use PascalCase' },
|
|
156
|
+
},
|
|
157
|
+
{
|
|
158
|
+
id: 'function-naming',
|
|
159
|
+
name: 'Function Naming',
|
|
160
|
+
description: 'Functions should use camelCase',
|
|
161
|
+
category: 'naming',
|
|
162
|
+
severity: 'warning',
|
|
163
|
+
check: { type: 'regex', pattern: '^[a-z][a-zA-Z0-9]*$', message: 'Use camelCase' },
|
|
164
|
+
},
|
|
165
|
+
];
|
|
166
|
+
}
|
|
167
|
+
getConvention(id) {
|
|
168
|
+
return this.conventions.find(c => c.id === id);
|
|
169
|
+
}
|
|
170
|
+
toPascalCase(str) {
|
|
171
|
+
return str
|
|
172
|
+
.replace(/[-_](.)/g, (_, c) => c.toUpperCase())
|
|
173
|
+
.replace(/^(.)/, (_, c) => c.toUpperCase());
|
|
174
|
+
}
|
|
175
|
+
toCamelCase(str) {
|
|
176
|
+
return str
|
|
177
|
+
.replace(/[-_](.)/g, (_, c) => c.toUpperCase())
|
|
178
|
+
.replace(/^(.)/, (_, c) => c.toLowerCase());
|
|
179
|
+
}
|
|
180
|
+
}
|
|
181
|
+
//# sourceMappingURL=convention-checker.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"convention-checker.js","sourceRoot":"","sources":["../../src/modules/convention-checker.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Utility functions for graph data transformations
|
|
3
|
+
*/
|
|
4
|
+
export interface RawGraphNode {
|
|
5
|
+
id: string;
|
|
6
|
+
}
|
|
7
|
+
export interface RawGraphEdge {
|
|
8
|
+
from: string;
|
|
9
|
+
to: string;
|
|
10
|
+
}
|
|
11
|
+
export interface RawGraphData {
|
|
12
|
+
nodes: RawGraphNode[];
|
|
13
|
+
edges: RawGraphEdge[];
|
|
14
|
+
}
|
|
15
|
+
export interface TransformedGraphNode {
|
|
16
|
+
path: string;
|
|
17
|
+
imports: string[];
|
|
18
|
+
importedBy: string[];
|
|
19
|
+
depth: number;
|
|
20
|
+
}
|
|
21
|
+
export interface TransformedGraphEdge {
|
|
22
|
+
from: string;
|
|
23
|
+
to: string;
|
|
24
|
+
kind: 'static';
|
|
25
|
+
}
|
|
26
|
+
export interface TransformedGraphData {
|
|
27
|
+
nodes: TransformedGraphNode[];
|
|
28
|
+
edges: TransformedGraphEdge[];
|
|
29
|
+
rootNodes: string[];
|
|
30
|
+
leafNodes: string[];
|
|
31
|
+
}
|
|
32
|
+
/**
|
|
33
|
+
* Transform engine's graph format to Visualizer's expected format
|
|
34
|
+
* @param rawData - Raw graph data from engine with nodes and edges
|
|
35
|
+
* @returns Transformed graph data with imports, importedBy, root and leaf nodes
|
|
36
|
+
*/
|
|
37
|
+
export declare function transformGraphData(rawData: RawGraphData): TransformedGraphData;
|
|
38
|
+
//# sourceMappingURL=graph-utils.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"graph-utils.d.ts","sourceRoot":"","sources":["../../src/modules/graph-utils.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,MAAM,WAAW,YAAY;IAC3B,EAAE,EAAE,MAAM,CAAC;CACZ;AAED,MAAM,WAAW,YAAY;IAC3B,IAAI,EAAE,MAAM,CAAC;IACb,EAAE,EAAE,MAAM,CAAC;CACZ;AAED,MAAM,WAAW,YAAY;IAC3B,KAAK,EAAE,YAAY,EAAE,CAAC;IACtB,KAAK,EAAE,YAAY,EAAE,CAAC;CACvB;AAED,MAAM,WAAW,oBAAoB;IACnC,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,UAAU,EAAE,MAAM,EAAE,CAAC;IACrB,KAAK,EAAE,MAAM,CAAC;CACf;AAED,MAAM,WAAW,oBAAoB;IACnC,IAAI,EAAE,MAAM,CAAC;IACb,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,QAAQ,CAAC;CAChB;AAED,MAAM,WAAW,oBAAoB;IACnC,KAAK,EAAE,oBAAoB,EAAE,CAAC;IAC9B,KAAK,EAAE,oBAAoB,EAAE,CAAC;IAC9B,SAAS,EAAE,MAAM,EAAE,CAAC;IACpB,SAAS,EAAE,MAAM,EAAE,CAAC;CACrB;AAED;;;;GAIG;AACH,wBAAgB,kBAAkB,CAAC,OAAO,EAAE,YAAY,GAAG,oBAAoB,CAiC9E"}
|