@behavioral-contracts/verify-cli 1.0.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/LICENSE +119 -0
- package/README.md +694 -0
- package/dist/analyze-results.js +253 -0
- package/dist/analyzer.d.ts +366 -0
- package/dist/analyzer.d.ts.map +1 -0
- package/dist/analyzer.js +2592 -0
- package/dist/analyzer.js.map +1 -0
- package/dist/analyzers/async-error-analyzer.d.ts +72 -0
- package/dist/analyzers/async-error-analyzer.d.ts.map +1 -0
- package/dist/analyzers/async-error-analyzer.js +243 -0
- package/dist/analyzers/async-error-analyzer.js.map +1 -0
- package/dist/analyzers/event-listener-analyzer.d.ts +102 -0
- package/dist/analyzers/event-listener-analyzer.d.ts.map +1 -0
- package/dist/analyzers/event-listener-analyzer.js +253 -0
- package/dist/analyzers/event-listener-analyzer.js.map +1 -0
- package/dist/analyzers/react-query-analyzer.d.ts +66 -0
- package/dist/analyzers/react-query-analyzer.d.ts.map +1 -0
- package/dist/analyzers/react-query-analyzer.js +341 -0
- package/dist/analyzers/react-query-analyzer.js.map +1 -0
- package/dist/analyzers/return-value-analyzer.d.ts +61 -0
- package/dist/analyzers/return-value-analyzer.d.ts.map +1 -0
- package/dist/analyzers/return-value-analyzer.js +225 -0
- package/dist/analyzers/return-value-analyzer.js.map +1 -0
- package/dist/code-snippet.d.ts +48 -0
- package/dist/code-snippet.d.ts.map +1 -0
- package/dist/code-snippet.js +84 -0
- package/dist/code-snippet.js.map +1 -0
- package/dist/corpus-loader.d.ts +33 -0
- package/dist/corpus-loader.d.ts.map +1 -0
- package/dist/corpus-loader.js +155 -0
- package/dist/corpus-loader.js.map +1 -0
- package/dist/fixture-tester.d.ts +28 -0
- package/dist/fixture-tester.d.ts.map +1 -0
- package/dist/fixture-tester.js +176 -0
- package/dist/fixture-tester.js.map +1 -0
- package/dist/index.d.ts +6 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +375 -0
- package/dist/index.js.map +1 -0
- package/dist/package-discovery.d.ts +62 -0
- package/dist/package-discovery.d.ts.map +1 -0
- package/dist/package-discovery.js +299 -0
- package/dist/package-discovery.js.map +1 -0
- package/dist/reporter.d.ts +43 -0
- package/dist/reporter.d.ts.map +1 -0
- package/dist/reporter.js +347 -0
- package/dist/reporter.js.map +1 -0
- package/dist/reporters/benchmarking.d.ts +70 -0
- package/dist/reporters/benchmarking.d.ts.map +1 -0
- package/dist/reporters/benchmarking.js +191 -0
- package/dist/reporters/benchmarking.js.map +1 -0
- package/dist/reporters/d3-visualizer.d.ts +40 -0
- package/dist/reporters/d3-visualizer.d.ts.map +1 -0
- package/dist/reporters/d3-visualizer.js +803 -0
- package/dist/reporters/d3-visualizer.js.map +1 -0
- package/dist/reporters/health-score.d.ts +33 -0
- package/dist/reporters/health-score.d.ts.map +1 -0
- package/dist/reporters/health-score.js +149 -0
- package/dist/reporters/health-score.js.map +1 -0
- package/dist/reporters/index.d.ts +11 -0
- package/dist/reporters/index.d.ts.map +1 -0
- package/dist/reporters/index.js +11 -0
- package/dist/reporters/index.js.map +1 -0
- package/dist/reporters/package-breakdown.d.ts +48 -0
- package/dist/reporters/package-breakdown.d.ts.map +1 -0
- package/dist/reporters/package-breakdown.js +185 -0
- package/dist/reporters/package-breakdown.js.map +1 -0
- package/dist/reporters/positive-evidence.d.ts +42 -0
- package/dist/reporters/positive-evidence.d.ts.map +1 -0
- package/dist/reporters/positive-evidence.js +436 -0
- package/dist/reporters/positive-evidence.js.map +1 -0
- package/dist/tsconfig-generator.d.ts +17 -0
- package/dist/tsconfig-generator.d.ts.map +1 -0
- package/dist/tsconfig-generator.js +107 -0
- package/dist/tsconfig-generator.js.map +1 -0
- package/dist/types.d.ts +298 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +5 -0
- package/dist/types.js.map +1 -0
- package/package.json +59 -0
|
@@ -0,0 +1,436 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Positive Evidence Reporter
|
|
3
|
+
*
|
|
4
|
+
* Generates reports that show value even when zero violations are found.
|
|
5
|
+
* Focus: "Here's what we checked and validated" vs "Here's what broke"
|
|
6
|
+
*/
|
|
7
|
+
import { calculateHealthScore } from './health-score.js';
|
|
8
|
+
import { buildPackageBreakdown, formatPackageBreakdown, getPassingPackages, } from './package-breakdown.js';
|
|
9
|
+
import { compareAgainstBenchmark, formatBenchmarkComparison, loadBenchmark, } from './benchmarking.js';
|
|
10
|
+
/**
|
|
11
|
+
* Generate complete positive evidence report
|
|
12
|
+
*/
|
|
13
|
+
export async function generatePositiveEvidenceReport(audit, options = {
|
|
14
|
+
showHealthScore: true,
|
|
15
|
+
showPackageBreakdown: true,
|
|
16
|
+
showInsights: true,
|
|
17
|
+
showRecommendations: true,
|
|
18
|
+
showBenchmarking: false, // Phase 2
|
|
19
|
+
}) {
|
|
20
|
+
// Calculate metrics
|
|
21
|
+
const healthMetrics = calculateHealthScore(audit);
|
|
22
|
+
const packageBreakdown = buildPackageBreakdown(audit);
|
|
23
|
+
// Load and compare against benchmark (if enabled)
|
|
24
|
+
let benchmarking;
|
|
25
|
+
let benchmark;
|
|
26
|
+
if (options.showBenchmarking) {
|
|
27
|
+
try {
|
|
28
|
+
// Try to load benchmark from default location
|
|
29
|
+
const path = await import('path');
|
|
30
|
+
const url = await import('url');
|
|
31
|
+
const __filename = url.fileURLToPath(import.meta.url);
|
|
32
|
+
const __dirname = path.dirname(__filename);
|
|
33
|
+
const benchmarkPath = path.resolve(__dirname, '../../data/benchmarks.json');
|
|
34
|
+
const loadedBenchmark = await loadBenchmark(benchmarkPath);
|
|
35
|
+
if (loadedBenchmark) {
|
|
36
|
+
benchmark = loadedBenchmark;
|
|
37
|
+
benchmarking = compareAgainstBenchmark(audit, benchmark);
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
catch {
|
|
41
|
+
// Benchmark not available, skip
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
// Generate insights (with benchmarking data if available)
|
|
45
|
+
const insights = generateInsights(audit, healthMetrics, packageBreakdown, benchmarking);
|
|
46
|
+
// Generate recommendations
|
|
47
|
+
const recommendations = generateRecommendations(audit, healthMetrics, packageBreakdown);
|
|
48
|
+
// Format complete report
|
|
49
|
+
const formattedReport = formatPositiveEvidenceReport(audit, healthMetrics, packageBreakdown, insights, recommendations, options, benchmarking, benchmark);
|
|
50
|
+
return {
|
|
51
|
+
healthMetrics,
|
|
52
|
+
packageBreakdown,
|
|
53
|
+
benchmarking,
|
|
54
|
+
insights,
|
|
55
|
+
recommendations,
|
|
56
|
+
formattedReport,
|
|
57
|
+
};
|
|
58
|
+
}
|
|
59
|
+
/**
|
|
60
|
+
* Format the complete positive evidence report
|
|
61
|
+
*/
|
|
62
|
+
function formatPositiveEvidenceReport(audit, health, breakdown, insights, recommendations, options, benchmarking, benchmark) {
|
|
63
|
+
const lines = [];
|
|
64
|
+
const green = '\x1b[32m';
|
|
65
|
+
const yellow = '\x1b[33m';
|
|
66
|
+
const cyan = '\x1b[36m';
|
|
67
|
+
const bold = '\x1b[1m';
|
|
68
|
+
const reset = '\x1b[0m';
|
|
69
|
+
// Header
|
|
70
|
+
lines.push('');
|
|
71
|
+
lines.push('╔═══════════════════════════════════════════════════════════════════════════════╗');
|
|
72
|
+
lines.push('║ Behavioral Contracts Analysis Report ║');
|
|
73
|
+
lines.push('╚═══════════════════════════════════════════════════════════════════════════════╝');
|
|
74
|
+
lines.push('');
|
|
75
|
+
// Get repository name from tsconfig path
|
|
76
|
+
const repoName = extractRepoName(audit.tsconfig);
|
|
77
|
+
lines.push(`${bold}Repository:${reset} ${repoName}`);
|
|
78
|
+
lines.push(`${bold}Analyzed:${reset} ${new Date(audit.timestamp).toLocaleString()}`);
|
|
79
|
+
if (audit.git_commit) {
|
|
80
|
+
lines.push(`${bold}Git Commit:${reset} ${audit.git_commit.substring(0, 8)}`);
|
|
81
|
+
}
|
|
82
|
+
if (audit.git_branch) {
|
|
83
|
+
lines.push(`${bold}Git Branch:${reset} ${audit.git_branch}`);
|
|
84
|
+
}
|
|
85
|
+
lines.push('');
|
|
86
|
+
// Health Score Section
|
|
87
|
+
if (options.showHealthScore) {
|
|
88
|
+
const scoreColor = getScoreColor(health.overallScore);
|
|
89
|
+
lines.push(`${green}✅ CODE HEALTH SCORE: ${scoreColor}${health.overallScore}/100${reset}`);
|
|
90
|
+
lines.push('');
|
|
91
|
+
// Coverage Summary
|
|
92
|
+
lines.push(`${cyan}📊 COVERAGE SUMMARY${reset}`);
|
|
93
|
+
lines.push('─'.repeat(80));
|
|
94
|
+
lines.push(` • Files Analyzed: ${audit.files_analyzed}`);
|
|
95
|
+
lines.push(` • Package Usages Detected: ${health.checksPerformed}`);
|
|
96
|
+
lines.push(` • Contracts Applied: ${audit.contracts_applied}`);
|
|
97
|
+
const violationColor = audit.violations.length === 0 ? green : yellow;
|
|
98
|
+
const violationIcon = audit.violations.length === 0 ? '✓' : '!';
|
|
99
|
+
lines.push(` • Violations Found: ${violationColor}${audit.violations.length} ${violationIcon}${reset}`);
|
|
100
|
+
lines.push(` • Checks Passed: ${green}${health.checksPassed} ✓${reset}`);
|
|
101
|
+
lines.push('');
|
|
102
|
+
// Health Metrics
|
|
103
|
+
lines.push(`${cyan}📈 REPOSITORY HEALTH METRICS${reset}`);
|
|
104
|
+
lines.push('─'.repeat(80));
|
|
105
|
+
lines.push(` • Error Handling Compliance: ${health.errorHandlingCompliance}%`);
|
|
106
|
+
lines.push(` • Package Coverage: ${health.packageCoverage}%`);
|
|
107
|
+
lines.push(` • Code Maturity: ${health.codeMaturity}`);
|
|
108
|
+
const riskColor = getRiskColor(health.riskLevel);
|
|
109
|
+
lines.push(` • Risk Level: ${riskColor}${health.riskLevel}${reset}`);
|
|
110
|
+
lines.push('');
|
|
111
|
+
}
|
|
112
|
+
// Package Breakdown Section
|
|
113
|
+
if (options.showPackageBreakdown) {
|
|
114
|
+
lines.push(formatPackageBreakdown(breakdown));
|
|
115
|
+
lines.push('');
|
|
116
|
+
}
|
|
117
|
+
// Benchmarking Section
|
|
118
|
+
if (options.showBenchmarking && benchmarking && benchmark) {
|
|
119
|
+
lines.push(formatBenchmarkComparison(benchmarking, benchmark));
|
|
120
|
+
lines.push('');
|
|
121
|
+
}
|
|
122
|
+
// Insights Section
|
|
123
|
+
if (options.showInsights && insights.length > 0) {
|
|
124
|
+
lines.push(`${cyan}💡 INSIGHTS${reset}`);
|
|
125
|
+
lines.push('─'.repeat(80));
|
|
126
|
+
insights.forEach(insight => {
|
|
127
|
+
lines.push(` ${insight}`);
|
|
128
|
+
});
|
|
129
|
+
lines.push('');
|
|
130
|
+
}
|
|
131
|
+
// Recommendations Section
|
|
132
|
+
if (options.showRecommendations && recommendations.length > 0) {
|
|
133
|
+
lines.push(`${cyan}🎯 RECOMMENDATIONS${reset}`);
|
|
134
|
+
lines.push('─'.repeat(80));
|
|
135
|
+
recommendations.forEach((rec, idx) => {
|
|
136
|
+
lines.push(` ${idx + 1}. ${rec}`);
|
|
137
|
+
});
|
|
138
|
+
lines.push('');
|
|
139
|
+
}
|
|
140
|
+
// Footer
|
|
141
|
+
lines.push('═'.repeat(80));
|
|
142
|
+
lines.push(` Report generated by Behavioral Contracts v${audit.tool_version}`);
|
|
143
|
+
lines.push(` Next scan: Enable CI integration for continuous monitoring`);
|
|
144
|
+
lines.push('═'.repeat(80));
|
|
145
|
+
lines.push('');
|
|
146
|
+
return lines.join('\n');
|
|
147
|
+
}
|
|
148
|
+
/**
|
|
149
|
+
* Generate insights based on analysis
|
|
150
|
+
*/
|
|
151
|
+
function generateInsights(audit, health, breakdown, benchmarking) {
|
|
152
|
+
const insights = [];
|
|
153
|
+
const green = '\x1b[32m';
|
|
154
|
+
const yellow = '\x1b[33m';
|
|
155
|
+
const reset = '\x1b[0m';
|
|
156
|
+
// Perfect score insight
|
|
157
|
+
if (health.errorHandlingCompliance === 100) {
|
|
158
|
+
insights.push(`${green}✓${reset} Perfect score! All ${health.checksPerformed} package usage points follow best practices.`);
|
|
159
|
+
}
|
|
160
|
+
// High compliance insight
|
|
161
|
+
else if (health.errorHandlingCompliance >= 95) {
|
|
162
|
+
insights.push(`${green}✓${reset} Excellent compliance (${health.errorHandlingCompliance}%) - only ${audit.violations.length} issues found in ${health.checksPerformed} checks.`);
|
|
163
|
+
}
|
|
164
|
+
// Passing packages insight
|
|
165
|
+
const passingPackages = getPassingPackages(breakdown);
|
|
166
|
+
if (passingPackages.length > 0) {
|
|
167
|
+
const topPassing = passingPackages.slice(0, 3).map(p => p.packageName).join(', ');
|
|
168
|
+
insights.push(`${green}✓${reset} ${passingPackages.length} packages have zero violations (${topPassing}${passingPackages.length > 3 ? ', ...' : ''}).`);
|
|
169
|
+
}
|
|
170
|
+
// Global error handlers insight
|
|
171
|
+
if (health.hasGlobalErrorHandlers) {
|
|
172
|
+
insights.push(`${green}✓${reset} Global error handling patterns detected - shows architectural maturity.`);
|
|
173
|
+
}
|
|
174
|
+
// Consistent patterns insight
|
|
175
|
+
if (health.hasConsistentPatterns) {
|
|
176
|
+
insights.push(`${green}✓${reset} Consistent error handling patterns throughout codebase.`);
|
|
177
|
+
}
|
|
178
|
+
// Package coverage insight
|
|
179
|
+
const enhanced = audit;
|
|
180
|
+
if (enhanced.package_discovery) {
|
|
181
|
+
const uncoveredCount = enhanced.package_discovery.withoutContracts;
|
|
182
|
+
if (uncoveredCount > 0) {
|
|
183
|
+
insights.push(`${yellow}!${reset} ${uncoveredCount} packages don't have contracts yet - coverage opportunity for future scans.`);
|
|
184
|
+
}
|
|
185
|
+
}
|
|
186
|
+
// Add volume insight (shows we did real work)
|
|
187
|
+
if (health.checksPerformed > 100) {
|
|
188
|
+
insights.push(`${green}✓${reset} Analyzed ${health.checksPerformed} function calls across ${audit.files_analyzed} files - comprehensive coverage.`);
|
|
189
|
+
}
|
|
190
|
+
// Benchmarking insight
|
|
191
|
+
if (benchmarking) {
|
|
192
|
+
if (benchmarking.percentile_rank >= 75) {
|
|
193
|
+
insights.push(`${green}✓${reset} Your code is cleaner than ${benchmarking.percentile_rank}% of repos analyzed (${benchmarking.comparison.toLowerCase()}).`);
|
|
194
|
+
}
|
|
195
|
+
if (benchmarking.violations_avoided > 0) {
|
|
196
|
+
insights.push(`${green}✓${reset} Avoided ${benchmarking.violations_avoided} violations compared to average repo.`);
|
|
197
|
+
}
|
|
198
|
+
}
|
|
199
|
+
return insights;
|
|
200
|
+
}
|
|
201
|
+
/**
|
|
202
|
+
* Generate actionable recommendations
|
|
203
|
+
*/
|
|
204
|
+
function generateRecommendations(audit, health, _breakdown) {
|
|
205
|
+
const recommendations = [];
|
|
206
|
+
// Perfect code recommendations
|
|
207
|
+
if (audit.violations.length === 0) {
|
|
208
|
+
recommendations.push('Add Behavioral Contracts badge to your README to showcase code quality');
|
|
209
|
+
recommendations.push('Integrate with CI/CD to maintain these standards as the team scales');
|
|
210
|
+
recommendations.push('Share this report with your team to celebrate excellent code quality');
|
|
211
|
+
}
|
|
212
|
+
// Some violations recommendations
|
|
213
|
+
else if (audit.violations.length < 10) {
|
|
214
|
+
recommendations.push(`Fix ${audit.violations.length} remaining violations to achieve 100% compliance`);
|
|
215
|
+
recommendations.push('Run scan after fixes to verify improvements');
|
|
216
|
+
recommendations.push('Add to CI to prevent future violations');
|
|
217
|
+
}
|
|
218
|
+
// Many violations recommendations
|
|
219
|
+
else {
|
|
220
|
+
recommendations.push('Prioritize fixing ERROR-level violations first (production risk)');
|
|
221
|
+
recommendations.push('Consider fixing violations package-by-package for manageable progress');
|
|
222
|
+
recommendations.push('Review error handling patterns with team to establish standards');
|
|
223
|
+
}
|
|
224
|
+
// Package coverage recommendations
|
|
225
|
+
const enhanced = audit;
|
|
226
|
+
if (enhanced.package_discovery && enhanced.package_discovery.withoutContracts > 5) {
|
|
227
|
+
recommendations.push(`Request contracts for your most-used packages (${enhanced.package_discovery.withoutContracts} uncovered)`);
|
|
228
|
+
}
|
|
229
|
+
// Growth recommendations
|
|
230
|
+
if (health.checksPerformed > 500) {
|
|
231
|
+
recommendations.push('Consider automated scanning on every PR for this large codebase');
|
|
232
|
+
}
|
|
233
|
+
return recommendations;
|
|
234
|
+
}
|
|
235
|
+
/**
|
|
236
|
+
* Extract repository name from tsconfig path
|
|
237
|
+
*/
|
|
238
|
+
function extractRepoName(tsconfigPath) {
|
|
239
|
+
// Extract from path like: /Users/.../test-repos/Next-js-Boilerplate/tsconfig.json
|
|
240
|
+
const parts = tsconfigPath.split('/');
|
|
241
|
+
const repoIndex = parts.findIndex(p => p === 'test-repos') + 1;
|
|
242
|
+
if (repoIndex > 0 && repoIndex < parts.length) {
|
|
243
|
+
return parts[repoIndex];
|
|
244
|
+
}
|
|
245
|
+
// Fallback: get parent directory
|
|
246
|
+
return parts[parts.length - 2] || 'Unknown Repository';
|
|
247
|
+
}
|
|
248
|
+
/**
|
|
249
|
+
* Get color for score
|
|
250
|
+
*/
|
|
251
|
+
function getScoreColor(score) {
|
|
252
|
+
if (score >= 90)
|
|
253
|
+
return '\x1b[32m'; // Green
|
|
254
|
+
if (score >= 70)
|
|
255
|
+
return '\x1b[33m'; // Yellow
|
|
256
|
+
return '\x1b[31m'; // Red
|
|
257
|
+
}
|
|
258
|
+
/**
|
|
259
|
+
* Get color for risk level
|
|
260
|
+
*/
|
|
261
|
+
function getRiskColor(risk) {
|
|
262
|
+
if (risk === 'LOW')
|
|
263
|
+
return '\x1b[32m'; // Green
|
|
264
|
+
if (risk === 'MEDIUM')
|
|
265
|
+
return '\x1b[33m'; // Yellow
|
|
266
|
+
if (risk === 'HIGH')
|
|
267
|
+
return '\x1b[31m'; // Red
|
|
268
|
+
return '\x1b[35m'; // Magenta for CRITICAL
|
|
269
|
+
}
|
|
270
|
+
/**
|
|
271
|
+
* Print positive evidence report to console
|
|
272
|
+
*/
|
|
273
|
+
export async function printPositiveEvidenceReport(audit, options) {
|
|
274
|
+
const report = await generatePositiveEvidenceReport(audit, options);
|
|
275
|
+
console.log(report.formattedReport);
|
|
276
|
+
}
|
|
277
|
+
/**
|
|
278
|
+
* Write positive evidence report to file
|
|
279
|
+
*/
|
|
280
|
+
export async function writePositiveEvidenceReport(audit, outputPath, options) {
|
|
281
|
+
const { writeFile } = await import('fs/promises');
|
|
282
|
+
const report = await generatePositiveEvidenceReport(audit, options);
|
|
283
|
+
await writeFile(outputPath, report.formattedReport, 'utf-8');
|
|
284
|
+
}
|
|
285
|
+
/**
|
|
286
|
+
* Format positive evidence report as Markdown
|
|
287
|
+
*/
|
|
288
|
+
function formatPositiveEvidenceReportMarkdown(audit, health, breakdown, insights, recommendations, options, benchmarking, benchmark) {
|
|
289
|
+
const lines = [];
|
|
290
|
+
// Header
|
|
291
|
+
lines.push('# Behavioral Contracts Analysis Report');
|
|
292
|
+
lines.push('');
|
|
293
|
+
// Get repository name from tsconfig path
|
|
294
|
+
const repoName = extractRepoName(audit.tsconfig);
|
|
295
|
+
lines.push(`**Repository:** ${repoName}`);
|
|
296
|
+
lines.push(`**Analyzed:** ${new Date(audit.timestamp).toLocaleString()}`);
|
|
297
|
+
if (audit.git_commit) {
|
|
298
|
+
lines.push(`**Git Commit:** \`${audit.git_commit.substring(0, 8)}\``);
|
|
299
|
+
}
|
|
300
|
+
if (audit.git_branch) {
|
|
301
|
+
lines.push(`**Git Branch:** ${audit.git_branch}`);
|
|
302
|
+
}
|
|
303
|
+
lines.push('');
|
|
304
|
+
// Health Score Section
|
|
305
|
+
if (options.showHealthScore) {
|
|
306
|
+
lines.push(`## ✅ Code Health Score: ${health.overallScore}/100`);
|
|
307
|
+
lines.push('');
|
|
308
|
+
// Coverage Summary
|
|
309
|
+
lines.push('### 📊 Coverage Summary');
|
|
310
|
+
lines.push('');
|
|
311
|
+
lines.push(`- **Files Analyzed:** ${audit.files_analyzed}`);
|
|
312
|
+
lines.push(`- **Package Usages Detected:** ${health.checksPerformed}`);
|
|
313
|
+
lines.push(`- **Contracts Applied:** ${audit.contracts_applied}`);
|
|
314
|
+
lines.push(`- **Violations Found:** ${audit.violations.length}`);
|
|
315
|
+
lines.push(`- **Checks Passed:** ${health.checksPassed} ✓`);
|
|
316
|
+
lines.push('');
|
|
317
|
+
// Health Metrics
|
|
318
|
+
lines.push('### 📈 Repository Health Metrics');
|
|
319
|
+
lines.push('');
|
|
320
|
+
lines.push(`- **Error Handling Compliance:** ${health.errorHandlingCompliance}%`);
|
|
321
|
+
lines.push(`- **Package Coverage:** ${health.packageCoverage}%`);
|
|
322
|
+
lines.push(`- **Code Maturity:** ${health.codeMaturity}`);
|
|
323
|
+
lines.push(`- **Risk Level:** ${health.riskLevel}`);
|
|
324
|
+
lines.push('');
|
|
325
|
+
}
|
|
326
|
+
// Package Breakdown Section
|
|
327
|
+
if (options.showPackageBreakdown) {
|
|
328
|
+
lines.push('## 📦 Package Breakdown');
|
|
329
|
+
lines.push('');
|
|
330
|
+
lines.push('| Package | Checks | Passed | Failed | Status | Compliance |');
|
|
331
|
+
lines.push('|---------|--------|--------|--------|--------|------------|');
|
|
332
|
+
breakdown.packages.forEach(pkg => {
|
|
333
|
+
const status = pkg.status === 'PASS' ? '✓ PASS' : '✗ FAIL';
|
|
334
|
+
lines.push(`| ${pkg.packageName} | ${pkg.contractsApplied} | ${pkg.checksPassedCount} | ${pkg.violationsFound} | ${status} | ${pkg.compliancePercent}% |`);
|
|
335
|
+
});
|
|
336
|
+
lines.push('');
|
|
337
|
+
lines.push(`**Summary:** ${breakdown.packagesFullyCompliant} passing, ${breakdown.packagesWithViolations} failing (${breakdown.totalPackagesAnalyzed} total)`);
|
|
338
|
+
lines.push('');
|
|
339
|
+
}
|
|
340
|
+
// Benchmarking Section
|
|
341
|
+
if (options.showBenchmarking && benchmarking && benchmark) {
|
|
342
|
+
lines.push('## 🏆 Benchmarking');
|
|
343
|
+
lines.push('');
|
|
344
|
+
lines.push(`**Sample Size:** ${benchmark.sample_size} repositories analyzed`);
|
|
345
|
+
lines.push('');
|
|
346
|
+
lines.push(`- **Your Violations:** ${benchmarking.your_violations}`);
|
|
347
|
+
lines.push(`- **Average Violations:** ${benchmarking.avg_violations}`);
|
|
348
|
+
lines.push('');
|
|
349
|
+
if (benchmarking.violations_avoided > 0) {
|
|
350
|
+
lines.push(`✓ You avoided **${benchmarking.violations_avoided} violations** vs typical repo`);
|
|
351
|
+
lines.push('');
|
|
352
|
+
}
|
|
353
|
+
lines.push(`**Your Ranking:** Top ${100 - benchmarking.percentile_rank}%`);
|
|
354
|
+
lines.push('');
|
|
355
|
+
lines.push(`Your repo is **${benchmarking.comparison.toLowerCase()}** than ${benchmarking.percentile_rank}% of repos scanned.`);
|
|
356
|
+
lines.push('');
|
|
357
|
+
// Show percentile distribution
|
|
358
|
+
lines.push('### Percentile Distribution');
|
|
359
|
+
lines.push('');
|
|
360
|
+
lines.push('| Percentile | Violations |');
|
|
361
|
+
lines.push('|------------|------------|');
|
|
362
|
+
lines.push(`| 25th | ${benchmark.percentiles.p25} |`);
|
|
363
|
+
lines.push(`| 50th (median) | ${benchmark.percentiles.p50} |`);
|
|
364
|
+
lines.push(`| 75th | ${benchmark.percentiles.p75} |`);
|
|
365
|
+
lines.push(`| 90th | ${benchmark.percentiles.p90} |`);
|
|
366
|
+
lines.push('');
|
|
367
|
+
}
|
|
368
|
+
// Insights Section
|
|
369
|
+
if (options.showInsights && insights.length > 0) {
|
|
370
|
+
lines.push('## 💡 Insights');
|
|
371
|
+
lines.push('');
|
|
372
|
+
// Strip ANSI codes from insights
|
|
373
|
+
insights.forEach(insight => {
|
|
374
|
+
const clean = insight.replace(/\x1b\[\d+m/g, '');
|
|
375
|
+
lines.push(`- ${clean}`);
|
|
376
|
+
});
|
|
377
|
+
lines.push('');
|
|
378
|
+
}
|
|
379
|
+
// Recommendations Section
|
|
380
|
+
if (options.showRecommendations && recommendations.length > 0) {
|
|
381
|
+
lines.push('## 🎯 Recommendations');
|
|
382
|
+
lines.push('');
|
|
383
|
+
recommendations.forEach((rec, idx) => {
|
|
384
|
+
lines.push(`${idx + 1}. ${rec}`);
|
|
385
|
+
});
|
|
386
|
+
lines.push('');
|
|
387
|
+
}
|
|
388
|
+
// Footer
|
|
389
|
+
lines.push('---');
|
|
390
|
+
lines.push('');
|
|
391
|
+
lines.push(`*Report generated by Behavioral Contracts v${audit.tool_version}*`);
|
|
392
|
+
lines.push('');
|
|
393
|
+
lines.push('*Next scan: Enable CI integration for continuous monitoring*');
|
|
394
|
+
lines.push('');
|
|
395
|
+
return lines.join('\n');
|
|
396
|
+
}
|
|
397
|
+
/**
|
|
398
|
+
* Write positive evidence report to file as Markdown
|
|
399
|
+
*/
|
|
400
|
+
export async function writePositiveEvidenceReportMarkdown(audit, outputPath, options) {
|
|
401
|
+
const { writeFile } = await import('fs/promises');
|
|
402
|
+
// Generate the report data (includes loading benchmark if enabled)
|
|
403
|
+
const report = await generatePositiveEvidenceReport(audit, options);
|
|
404
|
+
// Load benchmark data separately for formatting (if benchmarking is enabled)
|
|
405
|
+
let benchmark;
|
|
406
|
+
if (options?.showBenchmarking !== false && report.benchmarking) {
|
|
407
|
+
benchmark = await loadBenchmarkForMarkdown();
|
|
408
|
+
}
|
|
409
|
+
// Format as markdown
|
|
410
|
+
const markdownContent = formatPositiveEvidenceReportMarkdown(audit, report.healthMetrics, report.packageBreakdown, report.insights, report.recommendations, options || {
|
|
411
|
+
showHealthScore: true,
|
|
412
|
+
showPackageBreakdown: true,
|
|
413
|
+
showInsights: true,
|
|
414
|
+
showRecommendations: true,
|
|
415
|
+
showBenchmarking: true,
|
|
416
|
+
}, report.benchmarking, benchmark);
|
|
417
|
+
await writeFile(outputPath, markdownContent, 'utf-8');
|
|
418
|
+
}
|
|
419
|
+
/**
|
|
420
|
+
* Helper to load benchmark for markdown formatting
|
|
421
|
+
*/
|
|
422
|
+
async function loadBenchmarkForMarkdown() {
|
|
423
|
+
try {
|
|
424
|
+
const path = await import('path');
|
|
425
|
+
const url = await import('url');
|
|
426
|
+
const __filename = url.fileURLToPath(import.meta.url);
|
|
427
|
+
const __dirname = path.dirname(__filename);
|
|
428
|
+
const benchmarkPath = path.resolve(__dirname, '../../data/benchmarks.json');
|
|
429
|
+
const loadedBenchmark = await loadBenchmark(benchmarkPath);
|
|
430
|
+
return loadedBenchmark || undefined;
|
|
431
|
+
}
|
|
432
|
+
catch {
|
|
433
|
+
return undefined;
|
|
434
|
+
}
|
|
435
|
+
}
|
|
436
|
+
//# sourceMappingURL=positive-evidence.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"positive-evidence.js","sourceRoot":"","sources":["../../src/reporters/positive-evidence.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAGH,OAAO,EAAE,oBAAoB,EAAsB,MAAM,mBAAmB,CAAC;AAC7E,OAAO,EACL,qBAAqB,EACrB,sBAAsB,EAEtB,kBAAkB,GACnB,MAAM,wBAAwB,CAAC;AAChC,OAAO,EACL,uBAAuB,EACvB,yBAAyB,EACzB,aAAa,GAGd,MAAM,mBAAmB,CAAC;AAmB3B;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,8BAA8B,CAClD,KAAwC,EACxC,UAAyC;IACvC,eAAe,EAAE,IAAI;IACrB,oBAAoB,EAAE,IAAI;IAC1B,YAAY,EAAE,IAAI;IAClB,mBAAmB,EAAE,IAAI;IACzB,gBAAgB,EAAE,KAAK,EAAE,UAAU;CACpC;IAED,oBAAoB;IACpB,MAAM,aAAa,GAAG,oBAAoB,CAAC,KAAK,CAAC,CAAC;IAClD,MAAM,gBAAgB,GAAG,qBAAqB,CAAC,KAAK,CAAC,CAAC;IAEtD,kDAAkD;IAClD,IAAI,YAA2C,CAAC;IAChD,IAAI,SAAoC,CAAC;IAEzC,IAAI,OAAO,CAAC,gBAAgB,EAAE,CAAC;QAC7B,IAAI,CAAC;YACH,8CAA8C;YAC9C,MAAM,IAAI,GAAG,MAAM,MAAM,CAAC,MAAM,CAAC,CAAC;YAClC,MAAM,GAAG,GAAG,MAAM,MAAM,CAAC,KAAK,CAAC,CAAC;YAChC,MAAM,UAAU,GAAG,GAAG,CAAC,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;YACtD,MAAM,SAAS,GAAG,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC;YAC3C,MAAM,aAAa,GAAG,IAAI,CAAC,OAAO,CAAC,SAAS,EAAE,4BAA4B,CAAC,CAAC;YAE5E,MAAM,eAAe,GAAG,MAAM,aAAa,CAAC,aAAa,CAAC,CAAC;YAC3D,IAAI,eAAe,EAAE,CAAC;gBACpB,SAAS,GAAG,eAAe,CAAC;gBAC5B,YAAY,GAAG,uBAAuB,CAAC,KAAK,EAAE,SAAS,CAAC,CAAC;YAC3D,CAAC;QACH,CAAC;QAAC,MAAM,CAAC;YACP,gCAAgC;QAClC,CAAC;IACH,CAAC;IAED,0DAA0D;IAC1D,MAAM,QAAQ,GAAG,gBAAgB,CAAC,KAAK,EAAE,aAAa,EAAE,gBAAgB,EAAE,YAAY,CAAC,CAAC;IAExF,2BAA2B;IAC3B,MAAM,eAAe,GAAG,uBAAuB,CAAC,KAAK,EAAE,aAAa,EAAE,gBAAgB,CAAC,CAAC;IAExF,yBAAyB;IACzB,MAAM,eAAe,GAAG,4BAA4B,CAClD,KAAK,EACL,aAAa,EACb,gBAAgB,EAChB,QAAQ,EACR,eAAe,EACf,OAAO,EACP,YAAY,EACZ,SAAS,CACV,CAAC;IAEF,OAAO;QACL,aAAa;QACb,gBAAgB;QAChB,YAAY;QACZ,QAAQ;QACR,eAAe;QACf,eAAe;KAChB,CAAC;AACJ,CAAC;AAED;;GAEG;AACH,SAAS,4BAA4B,CACnC,KAAwC,EACxC,MAAqB,EACrB,SAAkC,EAClC,QAAkB,EAClB,eAAyB,EACzB,OAAsC,EACtC,YAAgC,EAChC,SAAyB;IAEzB,MAAM,KAAK,GAAa,EAAE,CAAC;IAC3B,MAAM,KAAK,GAAG,UAAU,CAAC;IACzB,MAAM,MAAM,GAAG,UAAU,CAAC;IAC1B,MAAM,IAAI,GAAG,UAAU,CAAC;IACxB,MAAM,IAAI,GAAG,SAAS,CAAC;IACvB,MAAM,KAAK,GAAG,SAAS,CAAC;IAExB,SAAS;IACT,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IACf,KAAK,CAAC,IAAI,CAAC,mFAAmF,CAAC,CAAC;IAChG,KAAK,CAAC,IAAI,CAAC,mFAAmF,CAAC,CAAC;IAChG,KAAK,CAAC,IAAI,CAAC,mFAAmF,CAAC,CAAC;IAChG,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IAEf,yCAAyC;IACzC,MAAM,QAAQ,GAAG,eAAe,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC;IACjD,KAAK,CAAC,IAAI,CAAC,GAAG,IAAI,cAAc,KAAK,IAAI,QAAQ,EAAE,CAAC,CAAC;IACrD,KAAK,CAAC,IAAI,CAAC,GAAG,IAAI,YAAY,KAAK,IAAI,IAAI,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC,cAAc,EAAE,EAAE,CAAC,CAAC;IACrF,IAAI,KAAK,CAAC,UAAU,EAAE,CAAC;QACrB,KAAK,CAAC,IAAI,CAAC,GAAG,IAAI,cAAc,KAAK,IAAI,KAAK,CAAC,UAAU,CAAC,SAAS,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC;IAC/E,CAAC;IACD,IAAI,KAAK,CAAC,UAAU,EAAE,CAAC;QACrB,KAAK,CAAC,IAAI,CAAC,GAAG,IAAI,cAAc,KAAK,IAAI,KAAK,CAAC,UAAU,EAAE,CAAC,CAAC;IAC/D,CAAC;IACD,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IAEf,uBAAuB;IACvB,IAAI,OAAO,CAAC,eAAe,EAAE,CAAC;QAC5B,MAAM,UAAU,GAAG,aAAa,CAAC,MAAM,CAAC,YAAY,CAAC,CAAC;QACtD,KAAK,CAAC,IAAI,CAAC,GAAG,KAAK,wBAAwB,UAAU,GAAG,MAAM,CAAC,YAAY,OAAO,KAAK,EAAE,CAAC,CAAC;QAC3F,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QAEf,mBAAmB;QACnB,KAAK,CAAC,IAAI,CAAC,GAAG,IAAI,sBAAsB,KAAK,EAAE,CAAC,CAAC;QACjD,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,CAAC;QAC3B,KAAK,CAAC,IAAI,CAAC,uBAAuB,KAAK,CAAC,cAAc,EAAE,CAAC,CAAC;QAC1D,KAAK,CAAC,IAAI,CAAC,gCAAgC,MAAM,CAAC,eAAe,EAAE,CAAC,CAAC;QACrE,KAAK,CAAC,IAAI,CAAC,0BAA0B,KAAK,CAAC,iBAAiB,EAAE,CAAC,CAAC;QAEhE,MAAM,cAAc,GAAG,KAAK,CAAC,UAAU,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,CAAC;QACtE,MAAM,aAAa,GAAG,KAAK,CAAC,UAAU,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC;QAChE,KAAK,CAAC,IAAI,CAAC,yBAAyB,cAAc,GAAG,KAAK,CAAC,UAAU,CAAC,MAAM,IAAI,aAAa,GAAG,KAAK,EAAE,CAAC,CAAC;QACzG,KAAK,CAAC,IAAI,CAAC,sBAAsB,KAAK,GAAG,MAAM,CAAC,YAAY,KAAK,KAAK,EAAE,CAAC,CAAC;QAC1E,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QAEf,iBAAiB;QACjB,KAAK,CAAC,IAAI,CAAC,GAAG,IAAI,+BAA+B,KAAK,EAAE,CAAC,CAAC;QAC1D,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,CAAC;QAC3B,KAAK,CAAC,IAAI,CAAC,kCAAkC,MAAM,CAAC,uBAAuB,GAAG,CAAC,CAAC;QAChF,KAAK,CAAC,IAAI,CAAC,yBAAyB,MAAM,CAAC,eAAe,GAAG,CAAC,CAAC;QAC/D,KAAK,CAAC,IAAI,CAAC,sBAAsB,MAAM,CAAC,YAAY,EAAE,CAAC,CAAC;QAExD,MAAM,SAAS,GAAG,YAAY,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;QACjD,KAAK,CAAC,IAAI,CAAC,mBAAmB,SAAS,GAAG,MAAM,CAAC,SAAS,GAAG,KAAK,EAAE,CAAC,CAAC;QACtE,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IACjB,CAAC;IAED,4BAA4B;IAC5B,IAAI,OAAO,CAAC,oBAAoB,EAAE,CAAC;QACjC,KAAK,CAAC,IAAI,CAAC,sBAAsB,CAAC,SAAS,CAAC,CAAC,CAAC;QAC9C,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IACjB,CAAC;IAED,uBAAuB;IACvB,IAAI,OAAO,CAAC,gBAAgB,IAAI,YAAY,IAAI,SAAS,EAAE,CAAC;QAC1D,KAAK,CAAC,IAAI,CAAC,yBAAyB,CAAC,YAAY,EAAE,SAAS,CAAC,CAAC,CAAC;QAC/D,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IACjB,CAAC;IAED,mBAAmB;IACnB,IAAI,OAAO,CAAC,YAAY,IAAI,QAAQ,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAChD,KAAK,CAAC,IAAI,CAAC,GAAG,IAAI,cAAc,KAAK,EAAE,CAAC,CAAC;QACzC,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,CAAC;QAC3B,QAAQ,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE;YACzB,KAAK,CAAC,IAAI,CAAC,KAAK,OAAO,EAAE,CAAC,CAAC;QAC7B,CAAC,CAAC,CAAC;QACH,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IACjB,CAAC;IAED,0BAA0B;IAC1B,IAAI,OAAO,CAAC,mBAAmB,IAAI,eAAe,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAC9D,KAAK,CAAC,IAAI,CAAC,GAAG,IAAI,qBAAqB,KAAK,EAAE,CAAC,CAAC;QAChD,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,CAAC;QAC3B,eAAe,CAAC,OAAO,CAAC,CAAC,GAAG,EAAE,GAAG,EAAE,EAAE;YACnC,KAAK,CAAC,IAAI,CAAC,KAAK,GAAG,GAAG,CAAC,KAAK,GAAG,EAAE,CAAC,CAAC;QACrC,CAAC,CAAC,CAAC;QACH,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IACjB,CAAC;IAED,SAAS;IACT,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,CAAC;IAC3B,KAAK,CAAC,IAAI,CAAC,+CAA+C,KAAK,CAAC,YAAY,EAAE,CAAC,CAAC;IAChF,KAAK,CAAC,IAAI,CAAC,8DAA8D,CAAC,CAAC;IAC3E,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,CAAC;IAC3B,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IAEf,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AAC1B,CAAC;AAED;;GAEG;AACH,SAAS,gBAAgB,CACvB,KAAwC,EACxC,MAAqB,EACrB,SAAkC,EAClC,YAAgC;IAEhC,MAAM,QAAQ,GAAa,EAAE,CAAC;IAC9B,MAAM,KAAK,GAAG,UAAU,CAAC;IACzB,MAAM,MAAM,GAAG,UAAU,CAAC;IAC1B,MAAM,KAAK,GAAG,SAAS,CAAC;IAExB,wBAAwB;IACxB,IAAI,MAAM,CAAC,uBAAuB,KAAK,GAAG,EAAE,CAAC;QAC3C,QAAQ,CAAC,IAAI,CAAC,GAAG,KAAK,IAAI,KAAK,uBAAuB,MAAM,CAAC,eAAe,8CAA8C,CAAC,CAAC;IAC9H,CAAC;IAED,0BAA0B;SACrB,IAAI,MAAM,CAAC,uBAAuB,IAAI,EAAE,EAAE,CAAC;QAC9C,QAAQ,CAAC,IAAI,CAAC,GAAG,KAAK,IAAI,KAAK,0BAA0B,MAAM,CAAC,uBAAuB,aAAa,KAAK,CAAC,UAAU,CAAC,MAAM,oBAAoB,MAAM,CAAC,eAAe,UAAU,CAAC,CAAC;IACnL,CAAC;IAED,2BAA2B;IAC3B,MAAM,eAAe,GAAG,kBAAkB,CAAC,SAAS,CAAC,CAAC;IACtD,IAAI,eAAe,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAC/B,MAAM,UAAU,GAAG,eAAe,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAClF,QAAQ,CAAC,IAAI,CAAC,GAAG,KAAK,IAAI,KAAK,IAAI,eAAe,CAAC,MAAM,mCAAmC,UAAU,GAAG,eAAe,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC;IAC1J,CAAC;IAED,gCAAgC;IAChC,IAAI,MAAM,CAAC,sBAAsB,EAAE,CAAC;QAClC,QAAQ,CAAC,IAAI,CAAC,GAAG,KAAK,IAAI,KAAK,0EAA0E,CAAC,CAAC;IAC7G,CAAC;IAED,8BAA8B;IAC9B,IAAI,MAAM,CAAC,qBAAqB,EAAE,CAAC;QACjC,QAAQ,CAAC,IAAI,CAAC,GAAG,KAAK,IAAI,KAAK,0DAA0D,CAAC,CAAC;IAC7F,CAAC;IAED,2BAA2B;IAC3B,MAAM,QAAQ,GAAG,KAA4B,CAAC;IAC9C,IAAI,QAAQ,CAAC,iBAAiB,EAAE,CAAC;QAC/B,MAAM,cAAc,GAAG,QAAQ,CAAC,iBAAiB,CAAC,gBAAgB,CAAC;QACnE,IAAI,cAAc,GAAG,CAAC,EAAE,CAAC;YACvB,QAAQ,CAAC,IAAI,CAAC,GAAG,MAAM,IAAI,KAAK,IAAI,cAAc,6EAA6E,CAAC,CAAC;QACnI,CAAC;IACH,CAAC;IAED,8CAA8C;IAC9C,IAAI,MAAM,CAAC,eAAe,GAAG,GAAG,EAAE,CAAC;QACjC,QAAQ,CAAC,IAAI,CAAC,GAAG,KAAK,IAAI,KAAK,aAAa,MAAM,CAAC,eAAe,0BAA0B,KAAK,CAAC,cAAc,kCAAkC,CAAC,CAAC;IACtJ,CAAC;IAED,uBAAuB;IACvB,IAAI,YAAY,EAAE,CAAC;QACjB,IAAI,YAAY,CAAC,eAAe,IAAI,EAAE,EAAE,CAAC;YACvC,QAAQ,CAAC,IAAI,CAAC,GAAG,KAAK,IAAI,KAAK,8BAA8B,YAAY,CAAC,eAAe,wBAAwB,YAAY,CAAC,UAAU,CAAC,WAAW,EAAE,IAAI,CAAC,CAAC;QAC9J,CAAC;QACD,IAAI,YAAY,CAAC,kBAAkB,GAAG,CAAC,EAAE,CAAC;YACxC,QAAQ,CAAC,IAAI,CAAC,GAAG,KAAK,IAAI,KAAK,YAAY,YAAY,CAAC,kBAAkB,uCAAuC,CAAC,CAAC;QACrH,CAAC;IACH,CAAC;IAED,OAAO,QAAQ,CAAC;AAClB,CAAC;AAED;;GAEG;AACH,SAAS,uBAAuB,CAC9B,KAAwC,EACxC,MAAqB,EACrB,UAAmC;IAEnC,MAAM,eAAe,GAAa,EAAE,CAAC;IAErC,+BAA+B;IAC/B,IAAI,KAAK,CAAC,UAAU,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAClC,eAAe,CAAC,IAAI,CAAC,wEAAwE,CAAC,CAAC;QAC/F,eAAe,CAAC,IAAI,CAAC,qEAAqE,CAAC,CAAC;QAC5F,eAAe,CAAC,IAAI,CAAC,sEAAsE,CAAC,CAAC;IAC/F,CAAC;IAED,kCAAkC;SAC7B,IAAI,KAAK,CAAC,UAAU,CAAC,MAAM,GAAG,EAAE,EAAE,CAAC;QACtC,eAAe,CAAC,IAAI,CAAC,OAAO,KAAK,CAAC,UAAU,CAAC,MAAM,kDAAkD,CAAC,CAAC;QACvG,eAAe,CAAC,IAAI,CAAC,6CAA6C,CAAC,CAAC;QACpE,eAAe,CAAC,IAAI,CAAC,wCAAwC,CAAC,CAAC;IACjE,CAAC;IAED,kCAAkC;SAC7B,CAAC;QACJ,eAAe,CAAC,IAAI,CAAC,kEAAkE,CAAC,CAAC;QACzF,eAAe,CAAC,IAAI,CAAC,uEAAuE,CAAC,CAAC;QAC9F,eAAe,CAAC,IAAI,CAAC,iEAAiE,CAAC,CAAC;IAC1F,CAAC;IAED,mCAAmC;IACnC,MAAM,QAAQ,GAAG,KAA4B,CAAC;IAC9C,IAAI,QAAQ,CAAC,iBAAiB,IAAI,QAAQ,CAAC,iBAAiB,CAAC,gBAAgB,GAAG,CAAC,EAAE,CAAC;QAClF,eAAe,CAAC,IAAI,CAAC,kDAAkD,QAAQ,CAAC,iBAAiB,CAAC,gBAAgB,aAAa,CAAC,CAAC;IACnI,CAAC;IAED,yBAAyB;IACzB,IAAI,MAAM,CAAC,eAAe,GAAG,GAAG,EAAE,CAAC;QACjC,eAAe,CAAC,IAAI,CAAC,iEAAiE,CAAC,CAAC;IAC1F,CAAC;IAED,OAAO,eAAe,CAAC;AACzB,CAAC;AAED;;GAEG;AACH,SAAS,eAAe,CAAC,YAAoB;IAC3C,kFAAkF;IAClF,MAAM,KAAK,GAAG,YAAY,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;IACtC,MAAM,SAAS,GAAG,KAAK,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,KAAK,YAAY,CAAC,GAAG,CAAC,CAAC;IAE/D,IAAI,SAAS,GAAG,CAAC,IAAI,SAAS,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC;QAC9C,OAAO,KAAK,CAAC,SAAS,CAAC,CAAC;IAC1B,CAAC;IAED,iCAAiC;IACjC,OAAO,KAAK,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,IAAI,oBAAoB,CAAC;AACzD,CAAC;AAED;;GAEG;AACH,SAAS,aAAa,CAAC,KAAa;IAClC,IAAI,KAAK,IAAI,EAAE;QAAE,OAAO,UAAU,CAAC,CAAC,QAAQ;IAC5C,IAAI,KAAK,IAAI,EAAE;QAAE,OAAO,UAAU,CAAC,CAAC,SAAS;IAC7C,OAAO,UAAU,CAAC,CAAC,MAAM;AAC3B,CAAC;AAED;;GAEG;AACH,SAAS,YAAY,CAAC,IAAY;IAChC,IAAI,IAAI,KAAK,KAAK;QAAE,OAAO,UAAU,CAAC,CAAC,QAAQ;IAC/C,IAAI,IAAI,KAAK,QAAQ;QAAE,OAAO,UAAU,CAAC,CAAC,SAAS;IACnD,IAAI,IAAI,KAAK,MAAM;QAAE,OAAO,UAAU,CAAC,CAAC,MAAM;IAC9C,OAAO,UAAU,CAAC,CAAC,uBAAuB;AAC5C,CAAC;AAED;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,2BAA2B,CAC/C,KAAwC,EACxC,OAAuC;IAEvC,MAAM,MAAM,GAAG,MAAM,8BAA8B,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC;IACpE,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,eAAe,CAAC,CAAC;AACtC,CAAC;AAED;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,2BAA2B,CAC/C,KAAwC,EACxC,UAAkB,EAClB,OAAuC;IAEvC,MAAM,EAAE,SAAS,EAAE,GAAG,MAAM,MAAM,CAAC,aAAa,CAAC,CAAC;IAClD,MAAM,MAAM,GAAG,MAAM,8BAA8B,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC;IACpE,MAAM,SAAS,CAAC,UAAU,EAAE,MAAM,CAAC,eAAe,EAAE,OAAO,CAAC,CAAC;AAC/D,CAAC;AAED;;GAEG;AACH,SAAS,oCAAoC,CAC3C,KAAwC,EACxC,MAAqB,EACrB,SAAkC,EAClC,QAAkB,EAClB,eAAyB,EACzB,OAAsC,EACtC,YAAgC,EAChC,SAAyB;IAEzB,MAAM,KAAK,GAAa,EAAE,CAAC;IAE3B,SAAS;IACT,KAAK,CAAC,IAAI,CAAC,wCAAwC,CAAC,CAAC;IACrD,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IAEf,yCAAyC;IACzC,MAAM,QAAQ,GAAG,eAAe,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC;IACjD,KAAK,CAAC,IAAI,CAAC,mBAAmB,QAAQ,EAAE,CAAC,CAAC;IAC1C,KAAK,CAAC,IAAI,CAAC,iBAAiB,IAAI,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC,cAAc,EAAE,EAAE,CAAC,CAAC;IAC1E,IAAI,KAAK,CAAC,UAAU,EAAE,CAAC;QACrB,KAAK,CAAC,IAAI,CAAC,qBAAqB,KAAK,CAAC,UAAU,CAAC,SAAS,CAAC,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC;IACxE,CAAC;IACD,IAAI,KAAK,CAAC,UAAU,EAAE,CAAC;QACrB,KAAK,CAAC,IAAI,CAAC,mBAAmB,KAAK,CAAC,UAAU,EAAE,CAAC,CAAC;IACpD,CAAC;IACD,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IAEf,uBAAuB;IACvB,IAAI,OAAO,CAAC,eAAe,EAAE,CAAC;QAC5B,KAAK,CAAC,IAAI,CAAC,2BAA2B,MAAM,CAAC,YAAY,MAAM,CAAC,CAAC;QACjE,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QAEf,mBAAmB;QACnB,KAAK,CAAC,IAAI,CAAC,yBAAyB,CAAC,CAAC;QACtC,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QACf,KAAK,CAAC,IAAI,CAAC,yBAAyB,KAAK,CAAC,cAAc,EAAE,CAAC,CAAC;QAC5D,KAAK,CAAC,IAAI,CAAC,kCAAkC,MAAM,CAAC,eAAe,EAAE,CAAC,CAAC;QACvE,KAAK,CAAC,IAAI,CAAC,4BAA4B,KAAK,CAAC,iBAAiB,EAAE,CAAC,CAAC;QAClE,KAAK,CAAC,IAAI,CAAC,2BAA2B,KAAK,CAAC,UAAU,CAAC,MAAM,EAAE,CAAC,CAAC;QACjE,KAAK,CAAC,IAAI,CAAC,wBAAwB,MAAM,CAAC,YAAY,IAAI,CAAC,CAAC;QAC5D,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QAEf,iBAAiB;QACjB,KAAK,CAAC,IAAI,CAAC,kCAAkC,CAAC,CAAC;QAC/C,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QACf,KAAK,CAAC,IAAI,CAAC,oCAAoC,MAAM,CAAC,uBAAuB,GAAG,CAAC,CAAC;QAClF,KAAK,CAAC,IAAI,CAAC,2BAA2B,MAAM,CAAC,eAAe,GAAG,CAAC,CAAC;QACjE,KAAK,CAAC,IAAI,CAAC,wBAAwB,MAAM,CAAC,YAAY,EAAE,CAAC,CAAC;QAC1D,KAAK,CAAC,IAAI,CAAC,qBAAqB,MAAM,CAAC,SAAS,EAAE,CAAC,CAAC;QACpD,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IACjB,CAAC;IAED,4BAA4B;IAC5B,IAAI,OAAO,CAAC,oBAAoB,EAAE,CAAC;QACjC,KAAK,CAAC,IAAI,CAAC,yBAAyB,CAAC,CAAC;QACtC,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QACf,KAAK,CAAC,IAAI,CAAC,8DAA8D,CAAC,CAAC;QAC3E,KAAK,CAAC,IAAI,CAAC,8DAA8D,CAAC,CAAC;QAE3E,SAAS,CAAC,QAAQ,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE;YAC/B,MAAM,MAAM,GAAG,GAAG,CAAC,MAAM,KAAK,MAAM,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,QAAQ,CAAC;YAC3D,KAAK,CAAC,IAAI,CAAC,KAAK,GAAG,CAAC,WAAW,MAAM,GAAG,CAAC,gBAAgB,MAAM,GAAG,CAAC,iBAAiB,MAAM,GAAG,CAAC,eAAe,MAAM,MAAM,MAAM,GAAG,CAAC,iBAAiB,KAAK,CAAC,CAAC;QAC7J,CAAC,CAAC,CAAC;QAEH,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QACf,KAAK,CAAC,IAAI,CAAC,gBAAgB,SAAS,CAAC,sBAAsB,aAAa,SAAS,CAAC,sBAAsB,aAAa,SAAS,CAAC,qBAAqB,SAAS,CAAC,CAAC;QAC/J,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IACjB,CAAC;IAED,uBAAuB;IACvB,IAAI,OAAO,CAAC,gBAAgB,IAAI,YAAY,IAAI,SAAS,EAAE,CAAC;QAC1D,KAAK,CAAC,IAAI,CAAC,oBAAoB,CAAC,CAAC;QACjC,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QACf,KAAK,CAAC,IAAI,CAAC,oBAAoB,SAAS,CAAC,WAAW,wBAAwB,CAAC,CAAC;QAC9E,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QACf,KAAK,CAAC,IAAI,CAAC,0BAA0B,YAAY,CAAC,eAAe,EAAE,CAAC,CAAC;QACrE,KAAK,CAAC,IAAI,CAAC,6BAA6B,YAAY,CAAC,cAAc,EAAE,CAAC,CAAC;QACvE,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QAEf,IAAI,YAAY,CAAC,kBAAkB,GAAG,CAAC,EAAE,CAAC;YACxC,KAAK,CAAC,IAAI,CAAC,mBAAmB,YAAY,CAAC,kBAAkB,+BAA+B,CAAC,CAAC;YAC9F,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QACjB,CAAC;QAED,KAAK,CAAC,IAAI,CAAC,yBAAyB,GAAG,GAAG,YAAY,CAAC,eAAe,GAAG,CAAC,CAAC;QAC3E,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QACf,KAAK,CAAC,IAAI,CAAC,kBAAkB,YAAY,CAAC,UAAU,CAAC,WAAW,EAAE,WAAW,YAAY,CAAC,eAAe,qBAAqB,CAAC,CAAC;QAChI,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QAEf,+BAA+B;QAC/B,KAAK,CAAC,IAAI,CAAC,6BAA6B,CAAC,CAAC;QAC1C,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QACf,KAAK,CAAC,IAAI,CAAC,6BAA6B,CAAC,CAAC;QAC1C,KAAK,CAAC,IAAI,CAAC,6BAA6B,CAAC,CAAC;QAC1C,KAAK,CAAC,IAAI,CAAC,YAAY,SAAS,CAAC,WAAW,CAAC,GAAG,IAAI,CAAC,CAAC;QACtD,KAAK,CAAC,IAAI,CAAC,qBAAqB,SAAS,CAAC,WAAW,CAAC,GAAG,IAAI,CAAC,CAAC;QAC/D,KAAK,CAAC,IAAI,CAAC,YAAY,SAAS,CAAC,WAAW,CAAC,GAAG,IAAI,CAAC,CAAC;QACtD,KAAK,CAAC,IAAI,CAAC,YAAY,SAAS,CAAC,WAAW,CAAC,GAAG,IAAI,CAAC,CAAC;QACtD,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IACjB,CAAC;IAED,mBAAmB;IACnB,IAAI,OAAO,CAAC,YAAY,IAAI,QAAQ,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAChD,KAAK,CAAC,IAAI,CAAC,gBAAgB,CAAC,CAAC;QAC7B,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QACf,iCAAiC;QACjC,QAAQ,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE;YACzB,MAAM,KAAK,GAAG,OAAO,CAAC,OAAO,CAAC,aAAa,EAAE,EAAE,CAAC,CAAC;YACjD,KAAK,CAAC,IAAI,CAAC,KAAK,KAAK,EAAE,CAAC,CAAC;QAC3B,CAAC,CAAC,CAAC;QACH,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IACjB,CAAC;IAED,0BAA0B;IAC1B,IAAI,OAAO,CAAC,mBAAmB,IAAI,eAAe,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAC9D,KAAK,CAAC,IAAI,CAAC,uBAAuB,CAAC,CAAC;QACpC,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QACf,eAAe,CAAC,OAAO,CAAC,CAAC,GAAG,EAAE,GAAG,EAAE,EAAE;YACnC,KAAK,CAAC,IAAI,CAAC,GAAG,GAAG,GAAG,CAAC,KAAK,GAAG,EAAE,CAAC,CAAC;QACnC,CAAC,CAAC,CAAC;QACH,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IACjB,CAAC;IAED,SAAS;IACT,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IAClB,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IACf,KAAK,CAAC,IAAI,CAAC,8CAA8C,KAAK,CAAC,YAAY,GAAG,CAAC,CAAC;IAChF,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IACf,KAAK,CAAC,IAAI,CAAC,8DAA8D,CAAC,CAAC;IAC3E,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IAEf,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AAC1B,CAAC;AAED;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,mCAAmC,CACvD,KAAwC,EACxC,UAAkB,EAClB,OAAuC;IAEvC,MAAM,EAAE,SAAS,EAAE,GAAG,MAAM,MAAM,CAAC,aAAa,CAAC,CAAC;IAElD,mEAAmE;IACnE,MAAM,MAAM,GAAG,MAAM,8BAA8B,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC;IAEpE,6EAA6E;IAC7E,IAAI,SAAoC,CAAC;IACzC,IAAI,OAAO,EAAE,gBAAgB,KAAK,KAAK,IAAI,MAAM,CAAC,YAAY,EAAE,CAAC;QAC/D,SAAS,GAAG,MAAM,wBAAwB,EAAE,CAAC;IAC/C,CAAC;IAED,qBAAqB;IACrB,MAAM,eAAe,GAAG,oCAAoC,CAC1D,KAAK,EACL,MAAM,CAAC,aAAa,EACpB,MAAM,CAAC,gBAAgB,EACvB,MAAM,CAAC,QAAQ,EACf,MAAM,CAAC,eAAe,EACtB,OAAO,IAAI;QACT,eAAe,EAAE,IAAI;QACrB,oBAAoB,EAAE,IAAI;QAC1B,YAAY,EAAE,IAAI;QAClB,mBAAmB,EAAE,IAAI;QACzB,gBAAgB,EAAE,IAAI;KACvB,EACD,MAAM,CAAC,YAAY,EACnB,SAAS,CACV,CAAC;IAEF,MAAM,SAAS,CAAC,UAAU,EAAE,eAAe,EAAE,OAAO,CAAC,CAAC;AACxD,CAAC;AAED;;GAEG;AACH,KAAK,UAAU,wBAAwB;IACrC,IAAI,CAAC;QACH,MAAM,IAAI,GAAG,MAAM,MAAM,CAAC,MAAM,CAAC,CAAC;QAClC,MAAM,GAAG,GAAG,MAAM,MAAM,CAAC,KAAK,CAAC,CAAC;QAChC,MAAM,UAAU,GAAG,GAAG,CAAC,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QACtD,MAAM,SAAS,GAAG,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC;QAC3C,MAAM,aAAa,GAAG,IAAI,CAAC,OAAO,CAAC,SAAS,EAAE,4BAA4B,CAAC,CAAC;QAC5E,MAAM,eAAe,GAAG,MAAM,aAAa,CAAC,aAAa,CAAC,CAAC;QAC3D,OAAO,eAAe,IAAI,SAAS,CAAC;IACtC,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,SAAS,CAAC;IACnB,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Auto-generates minimal tsconfig.json for analysis
|
|
3
|
+
*/
|
|
4
|
+
interface TsConfigOptions {
|
|
5
|
+
projectDir: string;
|
|
6
|
+
includeTests?: boolean;
|
|
7
|
+
}
|
|
8
|
+
/**
|
|
9
|
+
* Generates a minimal tsconfig.json suitable for analysis
|
|
10
|
+
*/
|
|
11
|
+
export declare function generateMinimalTsconfig(tsconfigPath: string, options?: TsConfigOptions): void;
|
|
12
|
+
/**
|
|
13
|
+
* Ensures tsconfig.json exists, generating if necessary
|
|
14
|
+
*/
|
|
15
|
+
export declare function ensureTsconfig(tsconfigPath: string): void;
|
|
16
|
+
export {};
|
|
17
|
+
//# sourceMappingURL=tsconfig-generator.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tsconfig-generator.d.ts","sourceRoot":"","sources":["../src/tsconfig-generator.ts"],"names":[],"mappings":"AAAA;;GAEG;AAMH,UAAU,eAAe;IACvB,UAAU,EAAE,MAAM,CAAC;IACnB,YAAY,CAAC,EAAE,OAAO,CAAC;CACxB;AA2BD;;GAEG;AACH,wBAAgB,uBAAuB,CAAC,YAAY,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,eAAe,GAAG,IAAI,CAkF7F;AAED;;GAEG;AACH,wBAAgB,cAAc,CAAC,YAAY,EAAE,MAAM,GAAG,IAAI,CAMzD"}
|
|
@@ -0,0 +1,107 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Auto-generates minimal tsconfig.json for analysis
|
|
3
|
+
*/
|
|
4
|
+
import * as fs from 'fs';
|
|
5
|
+
import * as path from 'path';
|
|
6
|
+
import chalk from 'chalk';
|
|
7
|
+
/**
|
|
8
|
+
* Detects project structure and generates appropriate include patterns
|
|
9
|
+
*/
|
|
10
|
+
function detectIncludePatterns(projectDir) {
|
|
11
|
+
const patterns = [];
|
|
12
|
+
// Check for common monorepo structures
|
|
13
|
+
const possibleDirs = ['packages', 'apps', 'libs', 'src'];
|
|
14
|
+
for (const dir of possibleDirs) {
|
|
15
|
+
const fullPath = path.join(projectDir, dir);
|
|
16
|
+
if (fs.existsSync(fullPath) && fs.statSync(fullPath).isDirectory()) {
|
|
17
|
+
patterns.push(`${dir}/**/*.ts`);
|
|
18
|
+
patterns.push(`${dir}/**/*.tsx`);
|
|
19
|
+
}
|
|
20
|
+
}
|
|
21
|
+
// If no standard dirs found, include all TS files
|
|
22
|
+
if (patterns.length === 0) {
|
|
23
|
+
patterns.push('**/*.ts', '**/*.tsx');
|
|
24
|
+
}
|
|
25
|
+
return patterns;
|
|
26
|
+
}
|
|
27
|
+
/**
|
|
28
|
+
* Generates a minimal tsconfig.json suitable for analysis
|
|
29
|
+
*/
|
|
30
|
+
export function generateMinimalTsconfig(tsconfigPath, options) {
|
|
31
|
+
const projectDir = options?.projectDir || path.dirname(tsconfigPath);
|
|
32
|
+
const includeTests = options?.includeTests || false;
|
|
33
|
+
// Detect include patterns based on project structure
|
|
34
|
+
const includePatterns = detectIncludePatterns(projectDir);
|
|
35
|
+
// Build exclude patterns
|
|
36
|
+
const excludePatterns = [
|
|
37
|
+
'node_modules',
|
|
38
|
+
'dist',
|
|
39
|
+
'build',
|
|
40
|
+
'out',
|
|
41
|
+
'**/node_modules',
|
|
42
|
+
'**/dist',
|
|
43
|
+
'**/build',
|
|
44
|
+
'**/out',
|
|
45
|
+
'**/.next',
|
|
46
|
+
'**/coverage',
|
|
47
|
+
];
|
|
48
|
+
// Exclude test files unless explicitly requested
|
|
49
|
+
if (!includeTests) {
|
|
50
|
+
excludePatterns.push('**/*.test.ts', '**/*.test.tsx', '**/*.spec.ts', '**/*.spec.tsx', '**/__tests__', '**/__mocks__');
|
|
51
|
+
}
|
|
52
|
+
// Check if there's a base config to extend
|
|
53
|
+
const possibleBaseConfigs = [
|
|
54
|
+
'_tsconfig.base.json',
|
|
55
|
+
'tsconfig.base.json',
|
|
56
|
+
'tsconfig.settings.json',
|
|
57
|
+
];
|
|
58
|
+
let extendsPath;
|
|
59
|
+
for (const baseConfig of possibleBaseConfigs) {
|
|
60
|
+
const fullPath = path.join(projectDir, baseConfig);
|
|
61
|
+
if (fs.existsSync(fullPath)) {
|
|
62
|
+
extendsPath = `./${baseConfig}`;
|
|
63
|
+
break;
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
// Build the config object
|
|
67
|
+
const config = {
|
|
68
|
+
compilerOptions: {
|
|
69
|
+
target: 'ES2020',
|
|
70
|
+
module: 'commonjs',
|
|
71
|
+
lib: ['ES2020'],
|
|
72
|
+
moduleResolution: 'node',
|
|
73
|
+
esModuleInterop: true,
|
|
74
|
+
skipLibCheck: true,
|
|
75
|
+
forceConsistentCasingInFileNames: true,
|
|
76
|
+
resolveJsonModule: true,
|
|
77
|
+
allowSyntheticDefaultImports: true,
|
|
78
|
+
strict: false, // Don't enforce strict mode for analysis
|
|
79
|
+
noEmit: true, // We're only analyzing, not compiling
|
|
80
|
+
},
|
|
81
|
+
include: includePatterns,
|
|
82
|
+
exclude: excludePatterns,
|
|
83
|
+
};
|
|
84
|
+
// Add extends if base config exists
|
|
85
|
+
if (extendsPath) {
|
|
86
|
+
config.extends = extendsPath;
|
|
87
|
+
}
|
|
88
|
+
// Write the config file
|
|
89
|
+
const configJson = JSON.stringify(config, null, 2);
|
|
90
|
+
fs.writeFileSync(tsconfigPath, configJson, 'utf-8');
|
|
91
|
+
console.log(chalk.dim(` Generated tsconfig.json with patterns:`));
|
|
92
|
+
console.log(chalk.dim(` include: ${includePatterns.join(', ')}`));
|
|
93
|
+
if (extendsPath) {
|
|
94
|
+
console.log(chalk.dim(` extends: ${extendsPath}`));
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
/**
|
|
98
|
+
* Ensures tsconfig.json exists, generating if necessary
|
|
99
|
+
*/
|
|
100
|
+
export function ensureTsconfig(tsconfigPath) {
|
|
101
|
+
if (!fs.existsSync(tsconfigPath)) {
|
|
102
|
+
const projectDir = path.dirname(tsconfigPath);
|
|
103
|
+
console.log(chalk.yellow(` tsconfig.json not found, generating minimal config...`));
|
|
104
|
+
generateMinimalTsconfig(tsconfigPath, { projectDir });
|
|
105
|
+
}
|
|
106
|
+
}
|
|
107
|
+
//# sourceMappingURL=tsconfig-generator.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tsconfig-generator.js","sourceRoot":"","sources":["../src/tsconfig-generator.ts"],"names":[],"mappings":"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"}
|