@scrymore/scry-sbcov 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/README.md +410 -0
- package/bin/scry-sbcov.js +3 -0
- package/dist/analyzers/git-analyzer.d.ts +49 -0
- package/dist/analyzers/git-analyzer.d.ts.map +1 -0
- package/dist/analyzers/git-analyzer.js +265 -0
- package/dist/analyzers/git-analyzer.js.map +1 -0
- package/dist/cli/config.d.ts +12 -0
- package/dist/cli/config.d.ts.map +1 -0
- package/dist/cli/config.js +197 -0
- package/dist/cli/config.js.map +1 -0
- package/dist/cli/index.d.ts +7 -0
- package/dist/cli/index.d.ts.map +1 -0
- package/dist/cli/index.js +164 -0
- package/dist/cli/index.js.map +1 -0
- package/dist/core/analyzer.d.ts +19 -0
- package/dist/core/analyzer.d.ts.map +1 -0
- package/dist/core/analyzer.js +117 -0
- package/dist/core/analyzer.js.map +1 -0
- package/dist/core/coverage-calculator.d.ts +38 -0
- package/dist/core/coverage-calculator.d.ts.map +1 -0
- package/dist/core/coverage-calculator.js +335 -0
- package/dist/core/coverage-calculator.js.map +1 -0
- package/dist/core/report-generator.d.ts +10 -0
- package/dist/core/report-generator.d.ts.map +1 -0
- package/dist/core/report-generator.js +477 -0
- package/dist/core/report-generator.js.map +1 -0
- package/dist/core/story-executor.d.ts +22 -0
- package/dist/core/story-executor.d.ts.map +1 -0
- package/dist/core/story-executor.js +379 -0
- package/dist/core/story-executor.js.map +1 -0
- package/dist/detectors/component-detector.d.ts +15 -0
- package/dist/detectors/component-detector.d.ts.map +1 -0
- package/dist/detectors/component-detector.js +632 -0
- package/dist/detectors/component-detector.js.map +1 -0
- package/dist/index.d.ts +16 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +18 -0
- package/dist/index.js.map +1 -0
- package/dist/parsers/story-parser.d.ts +18 -0
- package/dist/parsers/story-parser.d.ts.map +1 -0
- package/dist/parsers/story-parser.js +353 -0
- package/dist/parsers/story-parser.js.map +1 -0
- package/dist/types/index.d.ts +502 -0
- package/dist/types/index.d.ts.map +1 -0
- package/dist/types/index.js +6 -0
- package/dist/types/index.js.map +1 -0
- package/package.json +79 -0
|
@@ -0,0 +1,164 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
/**
|
|
3
|
+
* scry-sbcov CLI Entry Point
|
|
4
|
+
* Storybook story coverage analyzer for React component libraries
|
|
5
|
+
*/
|
|
6
|
+
import { Command } from 'commander';
|
|
7
|
+
import chalk from 'chalk';
|
|
8
|
+
import * as fs from 'node:fs';
|
|
9
|
+
import * as path from 'node:path';
|
|
10
|
+
import { loadConfig } from './config.js';
|
|
11
|
+
import { analyze } from '../core/analyzer.js';
|
|
12
|
+
const packageJsonPath = new URL('../../package.json', import.meta.url);
|
|
13
|
+
let version = '0.1.0';
|
|
14
|
+
try {
|
|
15
|
+
const packageJson = JSON.parse(fs.readFileSync(packageJsonPath, 'utf-8'));
|
|
16
|
+
version = packageJson.version;
|
|
17
|
+
}
|
|
18
|
+
catch {
|
|
19
|
+
// Use default version
|
|
20
|
+
}
|
|
21
|
+
const program = new Command();
|
|
22
|
+
program
|
|
23
|
+
.name('scry-sbcov')
|
|
24
|
+
.description('Storybook story coverage analyzer for React component libraries')
|
|
25
|
+
.version(version)
|
|
26
|
+
.option('-c, --config <path>', 'Path to config file (default: scry-sbcov.config.js)')
|
|
27
|
+
.option('-o, --output <path>', 'Output JSON report path (default: stdout)')
|
|
28
|
+
.option('--include <glob>', 'Component file patterns (comma-separated)')
|
|
29
|
+
.option('--exclude <glob>', 'Patterns to exclude (comma-separated)')
|
|
30
|
+
.option('--stories <glob>', 'Story file patterns (comma-separated)')
|
|
31
|
+
.option('--base <branch>', 'Base branch for new code analysis (default: main)')
|
|
32
|
+
.option('--no-git', 'Disable git-based new code analysis')
|
|
33
|
+
.option('--execute', 'Run stories and capture failures')
|
|
34
|
+
.option('--storybook-url <url>', 'Storybook URL for execution (default: http://localhost:6006)')
|
|
35
|
+
.option('--storybook-static <dir>', 'Path to static Storybook build')
|
|
36
|
+
.option('--ci', 'CI mode: exit code 1 if quality gate fails')
|
|
37
|
+
.option('--threshold-component <n>', 'Component coverage threshold %', parseFloat)
|
|
38
|
+
.option('--threshold-new-code <n>', 'New code coverage threshold %', parseFloat)
|
|
39
|
+
.option('-v, --verbose', 'Verbose output')
|
|
40
|
+
.action(async (options) => {
|
|
41
|
+
try {
|
|
42
|
+
await run(options);
|
|
43
|
+
}
|
|
44
|
+
catch (error) {
|
|
45
|
+
console.error(chalk.red('Error:'), error instanceof Error ? error.message : error);
|
|
46
|
+
if (options.verbose && error instanceof Error) {
|
|
47
|
+
console.error(error.stack);
|
|
48
|
+
}
|
|
49
|
+
process.exit(1);
|
|
50
|
+
}
|
|
51
|
+
});
|
|
52
|
+
async function run(cliOptions) {
|
|
53
|
+
const verbose = cliOptions.verbose || false;
|
|
54
|
+
const ciMode = cliOptions.ci || false;
|
|
55
|
+
const projectPath = process.cwd();
|
|
56
|
+
if (verbose) {
|
|
57
|
+
console.log(chalk.blue('scry-sbcov') + ' - Storybook Story Coverage Analyzer\n');
|
|
58
|
+
console.log(chalk.gray('Project path:'), projectPath);
|
|
59
|
+
}
|
|
60
|
+
// Load configuration
|
|
61
|
+
const config = await loadConfig(cliOptions, projectPath);
|
|
62
|
+
if (verbose) {
|
|
63
|
+
console.log(chalk.gray('Configuration loaded:'));
|
|
64
|
+
console.log(chalk.gray(' Include patterns:'), config.include.join(', '));
|
|
65
|
+
console.log(chalk.gray(' Exclude patterns:'), config.exclude.join(', '));
|
|
66
|
+
console.log(chalk.gray(' Story patterns:'), config.storyPatterns.join(', '));
|
|
67
|
+
console.log(chalk.gray(' Git analysis:'), config.enableGitAnalysis ? `enabled (base: ${config.baseBranch})` : 'disabled');
|
|
68
|
+
console.log(chalk.gray(' Story execution:'), config.execute ? 'enabled' : 'disabled');
|
|
69
|
+
console.log();
|
|
70
|
+
}
|
|
71
|
+
// Run analysis
|
|
72
|
+
if (verbose) {
|
|
73
|
+
console.log(chalk.blue('Analyzing...'));
|
|
74
|
+
}
|
|
75
|
+
const report = await analyze(projectPath, config, verbose);
|
|
76
|
+
// Output report
|
|
77
|
+
const reportJson = JSON.stringify(report, null, 2);
|
|
78
|
+
if (config.outputPath) {
|
|
79
|
+
const outputPath = path.isAbsolute(config.outputPath)
|
|
80
|
+
? config.outputPath
|
|
81
|
+
: path.resolve(projectPath, config.outputPath);
|
|
82
|
+
fs.mkdirSync(path.dirname(outputPath), { recursive: true });
|
|
83
|
+
fs.writeFileSync(outputPath, reportJson);
|
|
84
|
+
if (verbose) {
|
|
85
|
+
console.log(chalk.green('Report written to:'), outputPath);
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
else if (!ciMode || verbose) {
|
|
89
|
+
// Only output full JSON if not in CI mode or if verbose
|
|
90
|
+
console.log(reportJson);
|
|
91
|
+
}
|
|
92
|
+
// Print summary
|
|
93
|
+
if (ciMode || verbose) {
|
|
94
|
+
printSummary(report);
|
|
95
|
+
}
|
|
96
|
+
// Exit with appropriate code in CI mode
|
|
97
|
+
if (ciMode) {
|
|
98
|
+
if (!report.qualityGate.passed) {
|
|
99
|
+
console.log(chalk.red('\nQuality gate FAILED'));
|
|
100
|
+
process.exit(1);
|
|
101
|
+
}
|
|
102
|
+
else {
|
|
103
|
+
console.log(chalk.green('\nQuality gate PASSED'));
|
|
104
|
+
}
|
|
105
|
+
}
|
|
106
|
+
}
|
|
107
|
+
function printSummary(report) {
|
|
108
|
+
console.log('\n' + chalk.bold('Coverage Summary'));
|
|
109
|
+
console.log(chalk.gray('─'.repeat(50)));
|
|
110
|
+
const { summary, newCode, qualityGate } = report;
|
|
111
|
+
console.log(`Components: ${summary.componentsWithStories}/${summary.totalComponents} with stories (${summary.metrics.componentCoverage.toFixed(1)}%)`);
|
|
112
|
+
console.log(`Props: ${summary.metrics.propCoverage.toFixed(1)}% covered`);
|
|
113
|
+
console.log(`Variants: ${summary.metrics.variantCoverage.toFixed(1)}% covered`);
|
|
114
|
+
console.log(`Scenarios: ${summary.metrics.scenarioCoverage.toFixed(1)}% covered`);
|
|
115
|
+
if (newCode.enabled) {
|
|
116
|
+
console.log(chalk.gray('─'.repeat(50)));
|
|
117
|
+
console.log(chalk.bold('New Code (since ' + newCode.since + ')'));
|
|
118
|
+
console.log(`New components: ${newCode.newComponents.withStories}/${newCode.newComponents.total} with stories (${newCode.newComponents.coverage.toFixed(1)}%)`);
|
|
119
|
+
console.log(`Modified: ${newCode.modifiedComponents.newPropsCovered}/${newCode.modifiedComponents.newPropsAdded} new props covered (${newCode.modifiedComponents.coverage.toFixed(1)}%)`);
|
|
120
|
+
}
|
|
121
|
+
if (report.execution?.executed) {
|
|
122
|
+
console.log(chalk.gray('─'.repeat(50)));
|
|
123
|
+
console.log(chalk.bold('Story Execution'));
|
|
124
|
+
const exec = report.execution.summary;
|
|
125
|
+
console.log(`Stories: ${exec.passed}/${exec.total} passed (${((exec.passed / exec.total) * 100).toFixed(1)}%)`);
|
|
126
|
+
if (exec.failed > 0) {
|
|
127
|
+
console.log(chalk.red(`Failed: ${exec.failed} stories`));
|
|
128
|
+
}
|
|
129
|
+
}
|
|
130
|
+
console.log(chalk.gray('─'.repeat(50)));
|
|
131
|
+
console.log(chalk.bold('Quality Gate'));
|
|
132
|
+
for (const check of qualityGate.checks) {
|
|
133
|
+
const icon = check.passed ? chalk.green('✓') : chalk.red('✗');
|
|
134
|
+
const status = check.passed
|
|
135
|
+
? chalk.green(`${check.actual.toFixed(1)}% >= ${check.threshold}%`)
|
|
136
|
+
: chalk.red(`${check.actual.toFixed(1)}% < ${check.threshold}%`);
|
|
137
|
+
console.log(`${icon} ${check.name}: ${status}`);
|
|
138
|
+
}
|
|
139
|
+
if (report.missingScenarios.length > 0) {
|
|
140
|
+
console.log(chalk.gray('─'.repeat(50)));
|
|
141
|
+
console.log(chalk.bold(`Missing Scenarios (${report.missingScenarios.length} total)`));
|
|
142
|
+
const highPriority = report.missingScenarios.filter(s => s.priority === 'critical' || s.priority === 'high');
|
|
143
|
+
for (const scenario of highPriority.slice(0, 5)) {
|
|
144
|
+
const priorityColor = scenario.priority === 'critical' ? chalk.red : chalk.yellow;
|
|
145
|
+
console.log(` ${priorityColor(scenario.priority.toUpperCase())}: ${scenario.componentName} - ${scenario.description}`);
|
|
146
|
+
}
|
|
147
|
+
if (highPriority.length > 5) {
|
|
148
|
+
console.log(chalk.gray(` ... and ${highPriority.length - 5} more high-priority items`));
|
|
149
|
+
}
|
|
150
|
+
}
|
|
151
|
+
if (report.uncoveredComponents.length > 0) {
|
|
152
|
+
console.log(chalk.gray('─'.repeat(50)));
|
|
153
|
+
console.log(chalk.bold(`Uncovered Components (${report.uncoveredComponents.length})`));
|
|
154
|
+
for (const component of report.uncoveredComponents.slice(0, 5)) {
|
|
155
|
+
const isNewBadge = component.isNew ? chalk.blue(' [NEW]') : '';
|
|
156
|
+
console.log(` - ${component.componentName}${isNewBadge} (${component.relativePath})`);
|
|
157
|
+
}
|
|
158
|
+
if (report.uncoveredComponents.length > 5) {
|
|
159
|
+
console.log(chalk.gray(` ... and ${report.uncoveredComponents.length - 5} more`));
|
|
160
|
+
}
|
|
161
|
+
}
|
|
162
|
+
}
|
|
163
|
+
program.parse();
|
|
164
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/cli/index.ts"],"names":[],"mappings":";AACA;;;GAGG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,KAAK,EAAE,MAAM,SAAS,CAAC;AAC9B,OAAO,KAAK,IAAI,MAAM,WAAW,CAAC;AAClC,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACzC,OAAO,EAAE,OAAO,EAAE,MAAM,qBAAqB,CAAC;AAG9C,MAAM,eAAe,GAAG,IAAI,GAAG,CAAC,oBAAoB,EAAE,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AACvE,IAAI,OAAO,GAAG,OAAO,CAAC;AACtB,IAAI,CAAC;IACH,MAAM,WAAW,GAAG,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,YAAY,CAAC,eAAe,EAAE,OAAO,CAAC,CAAC,CAAC;IAC1E,OAAO,GAAG,WAAW,CAAC,OAAO,CAAC;AAChC,CAAC;AAAC,MAAM,CAAC;IACP,sBAAsB;AACxB,CAAC;AAED,MAAM,OAAO,GAAG,IAAI,OAAO,EAAE,CAAC;AAE9B,OAAO;KACJ,IAAI,CAAC,YAAY,CAAC;KAClB,WAAW,CAAC,iEAAiE,CAAC;KAC9E,OAAO,CAAC,OAAO,CAAC;KAChB,MAAM,CAAC,qBAAqB,EAAE,qDAAqD,CAAC;KACpF,MAAM,CAAC,qBAAqB,EAAE,2CAA2C,CAAC;KAC1E,MAAM,CAAC,kBAAkB,EAAE,2CAA2C,CAAC;KACvE,MAAM,CAAC,kBAAkB,EAAE,uCAAuC,CAAC;KACnE,MAAM,CAAC,kBAAkB,EAAE,uCAAuC,CAAC;KACnE,MAAM,CAAC,iBAAiB,EAAE,mDAAmD,CAAC;KAC9E,MAAM,CAAC,UAAU,EAAE,qCAAqC,CAAC;KACzD,MAAM,CAAC,WAAW,EAAE,kCAAkC,CAAC;KACvD,MAAM,CAAC,uBAAuB,EAAE,8DAA8D,CAAC;KAC/F,MAAM,CAAC,0BAA0B,EAAE,gCAAgC,CAAC;KACpE,MAAM,CAAC,MAAM,EAAE,4CAA4C,CAAC;KAC5D,MAAM,CAAC,2BAA2B,EAAE,gCAAgC,EAAE,UAAU,CAAC;KACjF,MAAM,CAAC,0BAA0B,EAAE,+BAA+B,EAAE,UAAU,CAAC;KAC/E,MAAM,CAAC,eAAe,EAAE,gBAAgB,CAAC;KACzC,MAAM,CAAC,KAAK,EAAE,OAAmB,EAAE,EAAE;IACpC,IAAI,CAAC;QACH,MAAM,GAAG,CAAC,OAAO,CAAC,CAAC;IACrB,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,QAAQ,CAAC,EAAE,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC;QACnF,IAAI,OAAO,CAAC,OAAO,IAAI,KAAK,YAAY,KAAK,EAAE,CAAC;YAC9C,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;QAC7B,CAAC;QACD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;AACH,CAAC,CAAC,CAAC;AAEL,KAAK,UAAU,GAAG,CAAC,UAAsB;IACvC,MAAM,OAAO,GAAG,UAAU,CAAC,OAAO,IAAI,KAAK,CAAC;IAC5C,MAAM,MAAM,GAAG,UAAU,CAAC,EAAE,IAAI,KAAK,CAAC;IACtC,MAAM,WAAW,GAAG,OAAO,CAAC,GAAG,EAAE,CAAC;IAElC,IAAI,OAAO,EAAE,CAAC;QACZ,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,YAAY,CAAC,GAAG,wCAAwC,CAAC,CAAC;QACjF,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,eAAe,CAAC,EAAE,WAAW,CAAC,CAAC;IACxD,CAAC;IAED,qBAAqB;IACrB,MAAM,MAAM,GAAG,MAAM,UAAU,CAAC,UAAU,EAAE,WAAW,CAAC,CAAC;IAEzD,IAAI,OAAO,EAAE,CAAC;QACZ,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,uBAAuB,CAAC,CAAC,CAAC;QACjD,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,qBAAqB,CAAC,EAAE,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;QAC1E,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,qBAAqB,CAAC,EAAE,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;QAC1E,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,mBAAmB,CAAC,EAAE,MAAM,CAAC,aAAa,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;QAC9E,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,iBAAiB,CAAC,EAAE,MAAM,CAAC,iBAAiB,CAAC,CAAC,CAAC,kBAAkB,MAAM,CAAC,UAAU,GAAG,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC;QAC3H,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,oBAAoB,CAAC,EAAE,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC;QACvF,OAAO,CAAC,GAAG,EAAE,CAAC;IAChB,CAAC;IAED,eAAe;IACf,IAAI,OAAO,EAAE,CAAC;QACZ,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC,CAAC;IAC1C,CAAC;IAED,MAAM,MAAM,GAAG,MAAM,OAAO,CAAC,WAAW,EAAE,MAAM,EAAE,OAAO,CAAC,CAAC;IAE3D,gBAAgB;IAChB,MAAM,UAAU,GAAG,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC;IAEnD,IAAI,MAAM,CAAC,UAAU,EAAE,CAAC;QACtB,MAAM,UAAU,GAAG,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC,UAAU,CAAC;YACnD,CAAC,CAAC,MAAM,CAAC,UAAU;YACnB,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,WAAW,EAAE,MAAM,CAAC,UAAU,CAAC,CAAC;QAEjD,EAAE,CAAC,SAAS,CAAC,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QAC5D,EAAE,CAAC,aAAa,CAAC,UAAU,EAAE,UAAU,CAAC,CAAC;QAEzC,IAAI,OAAO,EAAE,CAAC;YACZ,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,oBAAoB,CAAC,EAAE,UAAU,CAAC,CAAC;QAC7D,CAAC;IACH,CAAC;SAAM,IAAI,CAAC,MAAM,IAAI,OAAO,EAAE,CAAC;QAC9B,wDAAwD;QACxD,OAAO,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC;IAC1B,CAAC;IAED,gBAAgB;IAChB,IAAI,MAAM,IAAI,OAAO,EAAE,CAAC;QACtB,YAAY,CAAC,MAAM,CAAC,CAAC;IACvB,CAAC;IAED,wCAAwC;IACxC,IAAI,MAAM,EAAE,CAAC;QACX,IAAI,CAAC,MAAM,CAAC,WAAW,CAAC,MAAM,EAAE,CAAC;YAC/B,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,uBAAuB,CAAC,CAAC,CAAC;YAChD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;aAAM,CAAC;YACN,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,uBAAuB,CAAC,CAAC,CAAC;QACpD,CAAC;IACH,CAAC;AACH,CAAC;AAED,SAAS,YAAY,CAAC,MAA2B;IAC/C,OAAO,CAAC,GAAG,CAAC,IAAI,GAAG,KAAK,CAAC,IAAI,CAAC,kBAAkB,CAAC,CAAC,CAAC;IACnD,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;IAExC,MAAM,EAAE,OAAO,EAAE,OAAO,EAAE,WAAW,EAAE,GAAG,MAAM,CAAC;IAEjD,OAAO,CAAC,GAAG,CAAC,eAAe,OAAO,CAAC,qBAAqB,IAAI,OAAO,CAAC,eAAe,kBAAkB,OAAO,CAAC,OAAO,CAAC,iBAAiB,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;IACvJ,OAAO,CAAC,GAAG,CAAC,eAAe,OAAO,CAAC,OAAO,CAAC,YAAY,CAAC,OAAO,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC;IAC/E,OAAO,CAAC,GAAG,CAAC,eAAe,OAAO,CAAC,OAAO,CAAC,eAAe,CAAC,OAAO,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC;IAClF,OAAO,CAAC,GAAG,CAAC,eAAe,OAAO,CAAC,OAAO,CAAC,gBAAgB,CAAC,OAAO,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC;IAEnF,IAAI,OAAO,CAAC,OAAO,EAAE,CAAC;QACpB,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;QACxC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,kBAAkB,GAAG,OAAO,CAAC,KAAK,GAAG,GAAG,CAAC,CAAC,CAAC;QAClE,OAAO,CAAC,GAAG,CAAC,mBAAmB,OAAO,CAAC,aAAa,CAAC,WAAW,IAAI,OAAO,CAAC,aAAa,CAAC,KAAK,kBAAkB,OAAO,CAAC,aAAa,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;QAChK,OAAO,CAAC,GAAG,CAAC,mBAAmB,OAAO,CAAC,kBAAkB,CAAC,eAAe,IAAI,OAAO,CAAC,kBAAkB,CAAC,aAAa,uBAAuB,OAAO,CAAC,kBAAkB,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;IAClM,CAAC;IAED,IAAI,MAAM,CAAC,SAAS,EAAE,QAAQ,EAAE,CAAC;QAC/B,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;QACxC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,iBAAiB,CAAC,CAAC,CAAC;QAC3C,MAAM,IAAI,GAAG,MAAM,CAAC,SAAS,CAAC,OAAO,CAAC;QACtC,OAAO,CAAC,GAAG,CAAC,YAAY,IAAI,CAAC,MAAM,IAAI,IAAI,CAAC,KAAK,YAAY,CAAC,CAAC,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,GAAG,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;QAChH,IAAI,IAAI,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACpB,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,YAAY,IAAI,CAAC,MAAM,UAAU,CAAC,CAAC,CAAC;QAC5D,CAAC;IACH,CAAC;IAED,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;IACxC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC,CAAC;IAExC,KAAK,MAAM,KAAK,IAAI,WAAW,CAAC,MAAM,EAAE,CAAC;QACvC,MAAM,IAAI,GAAG,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;QAC9D,MAAM,MAAM,GAAG,KAAK,CAAC,MAAM;YACzB,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,KAAK,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,QAAQ,KAAK,CAAC,SAAS,GAAG,CAAC;YACnE,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,OAAO,KAAK,CAAC,SAAS,GAAG,CAAC,CAAC;QACnE,OAAO,CAAC,GAAG,CAAC,GAAG,IAAI,IAAI,KAAK,CAAC,IAAI,KAAK,MAAM,EAAE,CAAC,CAAC;IAClD,CAAC;IAED,IAAI,MAAM,CAAC,gBAAgB,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACvC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;QACxC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,sBAAsB,MAAM,CAAC,gBAAgB,CAAC,MAAM,SAAS,CAAC,CAAC,CAAC;QAEvF,MAAM,YAAY,GAAG,MAAM,CAAC,gBAAgB,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,QAAQ,KAAK,UAAU,IAAI,CAAC,CAAC,QAAQ,KAAK,MAAM,CAAC,CAAC;QAC7G,KAAK,MAAM,QAAQ,IAAI,YAAY,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC;YAChD,MAAM,aAAa,GAAG,QAAQ,CAAC,QAAQ,KAAK,UAAU,CAAC,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,KAAK,CAAC,MAAM,CAAC;YAClF,OAAO,CAAC,GAAG,CAAC,KAAK,aAAa,CAAC,QAAQ,CAAC,QAAQ,CAAC,WAAW,EAAE,CAAC,KAAK,QAAQ,CAAC,aAAa,MAAM,QAAQ,CAAC,WAAW,EAAE,CAAC,CAAC;QAC1H,CAAC;QAED,IAAI,YAAY,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAC5B,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,aAAa,YAAY,CAAC,MAAM,GAAG,CAAC,2BAA2B,CAAC,CAAC,CAAC;QAC3F,CAAC;IACH,CAAC;IAED,IAAI,MAAM,CAAC,mBAAmB,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAC1C,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;QACxC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,yBAAyB,MAAM,CAAC,mBAAmB,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;QAEvF,KAAK,MAAM,SAAS,IAAI,MAAM,CAAC,mBAAmB,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC;YAC/D,MAAM,UAAU,GAAG,SAAS,CAAC,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;YAC/D,OAAO,CAAC,GAAG,CAAC,OAAO,SAAS,CAAC,aAAa,GAAG,UAAU,KAAK,SAAS,CAAC,YAAY,GAAG,CAAC,CAAC;QACzF,CAAC;QAED,IAAI,MAAM,CAAC,mBAAmB,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAC1C,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,aAAa,MAAM,CAAC,mBAAmB,CAAC,MAAM,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC;QACrF,CAAC;IACH,CAAC;AACH,CAAC;AAED,OAAO,CAAC,KAAK,EAAE,CAAC"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Main Analyzer (Orchestrator)
|
|
3
|
+
* Coordinates all modules and produces the final coverage report
|
|
4
|
+
*/
|
|
5
|
+
import type { StoryCoverageReport, ScryConfig } from '../types/index.js';
|
|
6
|
+
/**
|
|
7
|
+
* Run the complete analysis pipeline
|
|
8
|
+
*/
|
|
9
|
+
export declare function analyze(projectPath: string, config: ScryConfig, verbose?: boolean): Promise<StoryCoverageReport>;
|
|
10
|
+
/**
|
|
11
|
+
* Quick analysis without execution
|
|
12
|
+
*/
|
|
13
|
+
export declare function analyzeQuick(projectPath: string, config: ScryConfig, verbose?: boolean): Promise<StoryCoverageReport>;
|
|
14
|
+
/**
|
|
15
|
+
* Analyze specific files only
|
|
16
|
+
*/
|
|
17
|
+
export declare function analyzeFiles(projectPath: string, files: string[], config: ScryConfig, verbose?: boolean): Promise<StoryCoverageReport>;
|
|
18
|
+
export type { StoryCoverageReport, ScryConfig };
|
|
19
|
+
//# sourceMappingURL=analyzer.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"analyzer.d.ts","sourceRoot":"","sources":["../../src/core/analyzer.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,EAAE,mBAAmB,EAAE,UAAU,EAAoB,MAAM,mBAAmB,CAAC;AAQ3F;;GAEG;AACH,wBAAsB,OAAO,CAC3B,WAAW,EAAE,MAAM,EACnB,MAAM,EAAE,UAAU,EAClB,OAAO,UAAQ,GACd,OAAO,CAAC,mBAAmB,CAAC,CAiG9B;AAED;;GAEG;AACH,wBAAsB,YAAY,CAChC,WAAW,EAAE,MAAM,EACnB,MAAM,EAAE,UAAU,EAClB,OAAO,UAAQ,GACd,OAAO,CAAC,mBAAmB,CAAC,CAI9B;AAED;;GAEG;AACH,wBAAsB,YAAY,CAChC,WAAW,EAAE,MAAM,EACnB,KAAK,EAAE,MAAM,EAAE,EACf,MAAM,EAAE,UAAU,EAClB,OAAO,UAAQ,GACd,OAAO,CAAC,mBAAmB,CAAC,CAQ9B;AAGD,YAAY,EAAE,mBAAmB,EAAE,UAAU,EAAE,CAAC"}
|
|
@@ -0,0 +1,117 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Main Analyzer (Orchestrator)
|
|
3
|
+
* Coordinates all modules and produces the final coverage report
|
|
4
|
+
*/
|
|
5
|
+
import { detectComponents } from '../detectors/component-detector.js';
|
|
6
|
+
import { parseStoryFiles } from '../parsers/story-parser.js';
|
|
7
|
+
import { analyzeGitChanges } from '../analyzers/git-analyzer.js';
|
|
8
|
+
import { calculateCoverage } from './coverage-calculator.js';
|
|
9
|
+
import { executeStories, isPlaywrightAvailable } from './story-executor.js';
|
|
10
|
+
import { generateReport } from './report-generator.js';
|
|
11
|
+
/**
|
|
12
|
+
* Run the complete analysis pipeline
|
|
13
|
+
*/
|
|
14
|
+
export async function analyze(projectPath, config, verbose = false) {
|
|
15
|
+
// Step 1: Detect React components
|
|
16
|
+
if (verbose) {
|
|
17
|
+
console.log('Step 1/5: Detecting React components...');
|
|
18
|
+
}
|
|
19
|
+
const components = await detectComponents(projectPath, config, verbose);
|
|
20
|
+
if (verbose) {
|
|
21
|
+
console.log(` Found ${components.length} components`);
|
|
22
|
+
}
|
|
23
|
+
// Step 2: Parse story files
|
|
24
|
+
if (verbose) {
|
|
25
|
+
console.log('Step 2/5: Parsing story files...');
|
|
26
|
+
}
|
|
27
|
+
const storyFiles = await parseStoryFiles(projectPath, config, verbose);
|
|
28
|
+
if (verbose) {
|
|
29
|
+
console.log(` Found ${storyFiles.length} story files with ${storyFiles.reduce((acc, f) => acc + f.stories.length, 0)} stories`);
|
|
30
|
+
}
|
|
31
|
+
// Step 3: Analyze git changes (if enabled)
|
|
32
|
+
let gitAnalysis = null;
|
|
33
|
+
if (config.enableGitAnalysis) {
|
|
34
|
+
if (verbose) {
|
|
35
|
+
console.log('Step 3/5: Analyzing git changes...');
|
|
36
|
+
}
|
|
37
|
+
gitAnalysis = await analyzeGitChanges(projectPath, config.baseBranch, verbose);
|
|
38
|
+
if (verbose) {
|
|
39
|
+
if (gitAnalysis.enabled) {
|
|
40
|
+
console.log(` Comparing to ${gitAnalysis.baseBranch} (${gitAnalysis.baseCommitSha.substring(0, 7)})`);
|
|
41
|
+
console.log(` Found ${gitAnalysis.changedFiles.length} changed files`);
|
|
42
|
+
}
|
|
43
|
+
else {
|
|
44
|
+
console.log(' Git analysis disabled or unavailable');
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
else if (verbose) {
|
|
49
|
+
console.log('Step 3/5: Skipping git analysis (disabled)');
|
|
50
|
+
}
|
|
51
|
+
// Step 4: Calculate coverage
|
|
52
|
+
if (verbose) {
|
|
53
|
+
console.log('Step 4/5: Calculating coverage...');
|
|
54
|
+
}
|
|
55
|
+
const coverageResults = calculateCoverage(components, storyFiles, gitAnalysis, config);
|
|
56
|
+
if (verbose) {
|
|
57
|
+
const withStories = coverageResults.filter(r => r.stories.length > 0).length;
|
|
58
|
+
console.log(` ${withStories}/${coverageResults.length} components have stories`);
|
|
59
|
+
}
|
|
60
|
+
// Step 5: Execute stories (if enabled)
|
|
61
|
+
let executionResults = null;
|
|
62
|
+
if (config.execute) {
|
|
63
|
+
if (verbose) {
|
|
64
|
+
console.log('Step 5/5: Executing stories...');
|
|
65
|
+
}
|
|
66
|
+
const playwrightAvailable = await isPlaywrightAvailable();
|
|
67
|
+
if (!playwrightAvailable) {
|
|
68
|
+
console.warn('Warning: Playwright is not installed. Story execution is disabled.');
|
|
69
|
+
console.warn('Install playwright with: npm install playwright');
|
|
70
|
+
}
|
|
71
|
+
else {
|
|
72
|
+
executionResults = await executeStories(storyFiles, {
|
|
73
|
+
storybookUrl: config.storybookUrl,
|
|
74
|
+
staticDir: config.storybookStaticDir || undefined,
|
|
75
|
+
timeout: config.executionTimeout,
|
|
76
|
+
screenshotOnFailure: true,
|
|
77
|
+
}, verbose);
|
|
78
|
+
if (verbose) {
|
|
79
|
+
const { passed, failed, total } = executionResults.summary;
|
|
80
|
+
console.log(` Executed ${total} stories: ${passed} passed, ${failed} failed`);
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
else if (verbose) {
|
|
85
|
+
console.log('Step 5/5: Skipping story execution (disabled)');
|
|
86
|
+
}
|
|
87
|
+
// Generate final report
|
|
88
|
+
if (verbose) {
|
|
89
|
+
console.log('Generating report...');
|
|
90
|
+
}
|
|
91
|
+
const report = generateReport(coverageResults, storyFiles, gitAnalysis, executionResults, config);
|
|
92
|
+
if (verbose) {
|
|
93
|
+
console.log('Analysis complete!');
|
|
94
|
+
}
|
|
95
|
+
return report;
|
|
96
|
+
}
|
|
97
|
+
/**
|
|
98
|
+
* Quick analysis without execution
|
|
99
|
+
*/
|
|
100
|
+
export async function analyzeQuick(projectPath, config, verbose = false) {
|
|
101
|
+
// Override execution setting
|
|
102
|
+
const quickConfig = { ...config, execute: false };
|
|
103
|
+
return analyze(projectPath, quickConfig, verbose);
|
|
104
|
+
}
|
|
105
|
+
/**
|
|
106
|
+
* Analyze specific files only
|
|
107
|
+
*/
|
|
108
|
+
export async function analyzeFiles(projectPath, files, config, verbose = false) {
|
|
109
|
+
// Create a config that only includes the specified files
|
|
110
|
+
const fileConfig = {
|
|
111
|
+
...config,
|
|
112
|
+
include: files,
|
|
113
|
+
exclude: [],
|
|
114
|
+
};
|
|
115
|
+
return analyze(projectPath, fileConfig, verbose);
|
|
116
|
+
}
|
|
117
|
+
//# sourceMappingURL=analyzer.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"analyzer.js","sourceRoot":"","sources":["../../src/core/analyzer.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Coverage Calculator
|
|
3
|
+
* Matches components to stories and calculates coverage metrics
|
|
4
|
+
*/
|
|
5
|
+
import type { DetectedComponent, ParsedStoryFile, GitAnalysis, CoverageResult, ScryConfig } from '../types/index.js';
|
|
6
|
+
/**
|
|
7
|
+
* Calculate coverage for all components
|
|
8
|
+
*/
|
|
9
|
+
export declare function calculateCoverage(components: DetectedComponent[], storyFiles: ParsedStoryFile[], gitAnalysis: GitAnalysis | null, config: ScryConfig): CoverageResult[];
|
|
10
|
+
/**
|
|
11
|
+
* Calculate aggregate coverage metrics across all components
|
|
12
|
+
*/
|
|
13
|
+
export declare function calculateAggregateCoverage(results: CoverageResult[]): {
|
|
14
|
+
componentCoverage: number;
|
|
15
|
+
propCoverage: number;
|
|
16
|
+
variantCoverage: number;
|
|
17
|
+
scenarioCoverage: number;
|
|
18
|
+
};
|
|
19
|
+
/**
|
|
20
|
+
* Calculate new code coverage metrics
|
|
21
|
+
*/
|
|
22
|
+
export declare function calculateNewCodeCoverage(results: CoverageResult[]): {
|
|
23
|
+
newComponents: {
|
|
24
|
+
total: number;
|
|
25
|
+
withStories: number;
|
|
26
|
+
withoutStories: number;
|
|
27
|
+
coverage: number;
|
|
28
|
+
};
|
|
29
|
+
modifiedComponents: {
|
|
30
|
+
total: number;
|
|
31
|
+
newPropsAdded: number;
|
|
32
|
+
newPropsCovered: number;
|
|
33
|
+
coverage: number;
|
|
34
|
+
};
|
|
35
|
+
newComponentPaths: string[];
|
|
36
|
+
modifiedComponentPaths: string[];
|
|
37
|
+
};
|
|
38
|
+
//# sourceMappingURL=coverage-calculator.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"coverage-calculator.d.ts","sourceRoot":"","sources":["../../src/core/coverage-calculator.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,EACV,iBAAiB,EAGjB,eAAe,EAEf,WAAW,EACX,cAAc,EAKd,UAAU,EACX,MAAM,mBAAmB,CAAC;AAS3B;;GAEG;AACH,wBAAgB,iBAAiB,CAC/B,UAAU,EAAE,iBAAiB,EAAE,EAC/B,UAAU,EAAE,eAAe,EAAE,EAC7B,WAAW,EAAE,WAAW,GAAG,IAAI,EAC/B,MAAM,EAAE,UAAU,GACjB,cAAc,EAAE,CAsClB;AA0PD;;GAEG;AACH,wBAAgB,0BAA0B,CACxC,OAAO,EAAE,cAAc,EAAE,GACxB;IACD,iBAAiB,EAAE,MAAM,CAAC;IAC1B,YAAY,EAAE,MAAM,CAAC;IACrB,eAAe,EAAE,MAAM,CAAC;IACxB,gBAAgB,EAAE,MAAM,CAAC;CAC1B,CAuDA;AAED;;GAEG;AACH,wBAAgB,wBAAwB,CACtC,OAAO,EAAE,cAAc,EAAE,GACxB;IACD,aAAa,EAAE;QACb,KAAK,EAAE,MAAM,CAAC;QACd,WAAW,EAAE,MAAM,CAAC;QACpB,cAAc,EAAE,MAAM,CAAC;QACvB,QAAQ,EAAE,MAAM,CAAC;KAClB,CAAC;IACF,kBAAkB,EAAE;QAClB,KAAK,EAAE,MAAM,CAAC;QACd,aAAa,EAAE,MAAM,CAAC;QACtB,eAAe,EAAE,MAAM,CAAC;QACxB,QAAQ,EAAE,MAAM,CAAC;KAClB,CAAC;IACF,iBAAiB,EAAE,MAAM,EAAE,CAAC;IAC5B,sBAAsB,EAAE,MAAM,EAAE,CAAC;CAClC,CA2CA"}
|