@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,335 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Coverage Calculator
|
|
3
|
+
* Matches components to stories and calculates coverage metrics
|
|
4
|
+
*/
|
|
5
|
+
import { matchStoryToComponent } from '../parsers/story-parser.js';
|
|
6
|
+
import { isFileNew, isFileModified, getAddedLineCount, getModifiedLineCount, } from '../analyzers/git-analyzer.js';
|
|
7
|
+
/**
|
|
8
|
+
* Calculate coverage for all components
|
|
9
|
+
*/
|
|
10
|
+
export function calculateCoverage(components, storyFiles, gitAnalysis, config) {
|
|
11
|
+
const results = [];
|
|
12
|
+
// Create a map of component paths to their matching story files
|
|
13
|
+
const componentToStoryMap = createComponentStoryMap(components, storyFiles, config.componentStoryMapping);
|
|
14
|
+
for (const component of components) {
|
|
15
|
+
const matchedStoryFile = componentToStoryMap.get(component.filePath) || null;
|
|
16
|
+
const stories = matchedStoryFile?.stories || [];
|
|
17
|
+
// Calculate prop coverage
|
|
18
|
+
const propCoverage = calculatePropCoverage(component.props, stories);
|
|
19
|
+
// Calculate scenario coverage
|
|
20
|
+
const scenarioCoverage = calculateScenarioCoverage(component.scenarios, stories);
|
|
21
|
+
// Calculate metrics
|
|
22
|
+
const metrics = calculateMetrics(propCoverage, scenarioCoverage);
|
|
23
|
+
// Determine change status
|
|
24
|
+
const changeStatus = calculateChangeStatus(component, propCoverage, gitAnalysis);
|
|
25
|
+
results.push({
|
|
26
|
+
component,
|
|
27
|
+
storyFile: matchedStoryFile,
|
|
28
|
+
stories,
|
|
29
|
+
propCoverage,
|
|
30
|
+
scenarioCoverage,
|
|
31
|
+
metrics,
|
|
32
|
+
changeStatus,
|
|
33
|
+
});
|
|
34
|
+
}
|
|
35
|
+
return results;
|
|
36
|
+
}
|
|
37
|
+
/**
|
|
38
|
+
* Create a map from component file paths to their matching story files
|
|
39
|
+
*/
|
|
40
|
+
function createComponentStoryMap(components, storyFiles, manualMapping) {
|
|
41
|
+
const map = new Map();
|
|
42
|
+
// First, apply manual mappings
|
|
43
|
+
for (const [componentPath, storyPath] of Object.entries(manualMapping)) {
|
|
44
|
+
const storyFile = storyFiles.find(s => s.filePath.endsWith(storyPath) || s.relativePath === storyPath);
|
|
45
|
+
if (storyFile) {
|
|
46
|
+
map.set(componentPath, storyFile);
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
// Then, automatically match remaining components
|
|
50
|
+
for (const storyFile of storyFiles) {
|
|
51
|
+
const matchedComponent = matchStoryToComponent(storyFile, components);
|
|
52
|
+
if (matchedComponent && !map.has(matchedComponent.filePath)) {
|
|
53
|
+
map.set(matchedComponent.filePath, storyFile);
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
return map;
|
|
57
|
+
}
|
|
58
|
+
/**
|
|
59
|
+
* Calculate coverage for each prop
|
|
60
|
+
*/
|
|
61
|
+
function calculatePropCoverage(props, stories) {
|
|
62
|
+
return props.map(prop => {
|
|
63
|
+
const coveredBy = [];
|
|
64
|
+
let variantCoverage = null;
|
|
65
|
+
// Check which stories set this prop
|
|
66
|
+
for (const story of stories) {
|
|
67
|
+
if (prop.name in story.args) {
|
|
68
|
+
coveredBy.push(story.storyName);
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
// If prop has variants, calculate variant coverage
|
|
72
|
+
if (prop.variants) {
|
|
73
|
+
variantCoverage = calculateVariantCoverage(prop, stories);
|
|
74
|
+
}
|
|
75
|
+
return {
|
|
76
|
+
prop,
|
|
77
|
+
isCovered: coveredBy.length > 0,
|
|
78
|
+
coveredBy,
|
|
79
|
+
variantCoverage,
|
|
80
|
+
};
|
|
81
|
+
});
|
|
82
|
+
}
|
|
83
|
+
/**
|
|
84
|
+
* Calculate coverage for prop variants
|
|
85
|
+
*/
|
|
86
|
+
function calculateVariantCoverage(prop, stories) {
|
|
87
|
+
if (!prop.variants) {
|
|
88
|
+
return {
|
|
89
|
+
totalVariants: 0,
|
|
90
|
+
coveredVariants: 0,
|
|
91
|
+
coverage: 0,
|
|
92
|
+
values: [],
|
|
93
|
+
};
|
|
94
|
+
}
|
|
95
|
+
const values = prop.variants.values.map(value => {
|
|
96
|
+
const coveredBy = [];
|
|
97
|
+
for (const story of stories) {
|
|
98
|
+
const argValue = story.args[prop.name];
|
|
99
|
+
// Check for matching value
|
|
100
|
+
if (argValue !== undefined) {
|
|
101
|
+
const argString = String(argValue);
|
|
102
|
+
if (argString === value || argString === `'${value}'` || argString === `"${value}"`) {
|
|
103
|
+
coveredBy.push(story.storyName);
|
|
104
|
+
}
|
|
105
|
+
}
|
|
106
|
+
}
|
|
107
|
+
return {
|
|
108
|
+
value,
|
|
109
|
+
isCovered: coveredBy.length > 0,
|
|
110
|
+
coveredBy,
|
|
111
|
+
};
|
|
112
|
+
});
|
|
113
|
+
const coveredVariants = values.filter(v => v.isCovered).length;
|
|
114
|
+
const totalVariants = values.length;
|
|
115
|
+
return {
|
|
116
|
+
totalVariants,
|
|
117
|
+
coveredVariants,
|
|
118
|
+
coverage: totalVariants > 0 ? (coveredVariants / totalVariants) * 100 : 0,
|
|
119
|
+
values,
|
|
120
|
+
};
|
|
121
|
+
}
|
|
122
|
+
/**
|
|
123
|
+
* Calculate coverage for scenarios
|
|
124
|
+
*/
|
|
125
|
+
function calculateScenarioCoverage(scenarios, stories) {
|
|
126
|
+
return scenarios.map(scenario => {
|
|
127
|
+
let coveredBy = null;
|
|
128
|
+
// Check if any story covers this scenario
|
|
129
|
+
for (const story of stories) {
|
|
130
|
+
// A story covers a scenario if it sets the controlling props to "active" values
|
|
131
|
+
const coversScenario = scenario.controllingProps.some(propName => {
|
|
132
|
+
const argValue = story.args[propName];
|
|
133
|
+
if (argValue === undefined)
|
|
134
|
+
return false;
|
|
135
|
+
// Check for truthy values that would activate the scenario
|
|
136
|
+
if (argValue === true)
|
|
137
|
+
return true;
|
|
138
|
+
if (typeof argValue === 'string' && argValue.toLowerCase() !== 'false')
|
|
139
|
+
return true;
|
|
140
|
+
if (typeof argValue === 'number' && argValue !== 0)
|
|
141
|
+
return true;
|
|
142
|
+
return false;
|
|
143
|
+
});
|
|
144
|
+
if (coversScenario) {
|
|
145
|
+
coveredBy = story.storyName;
|
|
146
|
+
break;
|
|
147
|
+
}
|
|
148
|
+
}
|
|
149
|
+
return {
|
|
150
|
+
scenario,
|
|
151
|
+
isCovered: coveredBy !== null,
|
|
152
|
+
coveredBy,
|
|
153
|
+
};
|
|
154
|
+
});
|
|
155
|
+
}
|
|
156
|
+
/**
|
|
157
|
+
* Calculate aggregate metrics
|
|
158
|
+
*/
|
|
159
|
+
function calculateMetrics(propCoverage, scenarioCoverage) {
|
|
160
|
+
// Prop coverage
|
|
161
|
+
const coveredProps = propCoverage.filter(p => p.isCovered).length;
|
|
162
|
+
const totalProps = propCoverage.length;
|
|
163
|
+
const propCoveragePercent = totalProps > 0 ? (coveredProps / totalProps) * 100 : 100;
|
|
164
|
+
// Variant coverage
|
|
165
|
+
let totalVariants = 0;
|
|
166
|
+
let coveredVariants = 0;
|
|
167
|
+
for (const prop of propCoverage) {
|
|
168
|
+
if (prop.variantCoverage) {
|
|
169
|
+
totalVariants += prop.variantCoverage.totalVariants;
|
|
170
|
+
coveredVariants += prop.variantCoverage.coveredVariants;
|
|
171
|
+
}
|
|
172
|
+
}
|
|
173
|
+
const variantCoveragePercent = totalVariants > 0 ? (coveredVariants / totalVariants) * 100 : 100;
|
|
174
|
+
// Scenario coverage
|
|
175
|
+
const coveredScenarios = scenarioCoverage.filter(s => s.isCovered).length;
|
|
176
|
+
const totalScenarios = scenarioCoverage.length;
|
|
177
|
+
const scenarioCoveragePercent = totalScenarios > 0 ? (coveredScenarios / totalScenarios) * 100 : 100;
|
|
178
|
+
// Overall score (weighted average)
|
|
179
|
+
const weights = {
|
|
180
|
+
prop: 0.4,
|
|
181
|
+
variant: 0.3,
|
|
182
|
+
scenario: 0.3,
|
|
183
|
+
};
|
|
184
|
+
const overallScore = propCoveragePercent * weights.prop +
|
|
185
|
+
variantCoveragePercent * weights.variant +
|
|
186
|
+
scenarioCoveragePercent * weights.scenario;
|
|
187
|
+
return {
|
|
188
|
+
propCoverage: propCoveragePercent,
|
|
189
|
+
variantCoverage: variantCoveragePercent,
|
|
190
|
+
scenarioCoverage: scenarioCoveragePercent,
|
|
191
|
+
overallScore,
|
|
192
|
+
};
|
|
193
|
+
}
|
|
194
|
+
/**
|
|
195
|
+
* Calculate change status for a component
|
|
196
|
+
*/
|
|
197
|
+
function calculateChangeStatus(component, propCoverage, gitAnalysis) {
|
|
198
|
+
if (!gitAnalysis || !gitAnalysis.enabled) {
|
|
199
|
+
return {
|
|
200
|
+
status: 'unchanged',
|
|
201
|
+
linesAdded: 0,
|
|
202
|
+
linesModified: 0,
|
|
203
|
+
newProps: [],
|
|
204
|
+
};
|
|
205
|
+
}
|
|
206
|
+
const filePath = component.relativePath;
|
|
207
|
+
if (isFileNew(filePath, gitAnalysis)) {
|
|
208
|
+
// All props are new for new files
|
|
209
|
+
const newProps = propCoverage.map(p => p.prop.name);
|
|
210
|
+
return {
|
|
211
|
+
status: 'new',
|
|
212
|
+
linesAdded: getAddedLineCount(filePath, gitAnalysis),
|
|
213
|
+
linesModified: 0,
|
|
214
|
+
newProps,
|
|
215
|
+
};
|
|
216
|
+
}
|
|
217
|
+
if (isFileModified(filePath, gitAnalysis)) {
|
|
218
|
+
// For modified files, we'd ideally detect which specific props are new
|
|
219
|
+
// For now, we mark any props that are not covered as potentially new
|
|
220
|
+
const newProps = [];
|
|
221
|
+
return {
|
|
222
|
+
status: 'modified',
|
|
223
|
+
linesAdded: getAddedLineCount(filePath, gitAnalysis),
|
|
224
|
+
linesModified: getModifiedLineCount(filePath, gitAnalysis),
|
|
225
|
+
newProps,
|
|
226
|
+
};
|
|
227
|
+
}
|
|
228
|
+
return {
|
|
229
|
+
status: 'unchanged',
|
|
230
|
+
linesAdded: 0,
|
|
231
|
+
linesModified: 0,
|
|
232
|
+
newProps: [],
|
|
233
|
+
};
|
|
234
|
+
}
|
|
235
|
+
/**
|
|
236
|
+
* Calculate aggregate coverage metrics across all components
|
|
237
|
+
*/
|
|
238
|
+
export function calculateAggregateCoverage(results) {
|
|
239
|
+
if (results.length === 0) {
|
|
240
|
+
return {
|
|
241
|
+
componentCoverage: 100,
|
|
242
|
+
propCoverage: 100,
|
|
243
|
+
variantCoverage: 100,
|
|
244
|
+
scenarioCoverage: 100,
|
|
245
|
+
};
|
|
246
|
+
}
|
|
247
|
+
// Component coverage
|
|
248
|
+
const componentsWithStories = results.filter(r => r.stories.length > 0).length;
|
|
249
|
+
const componentCoverage = (componentsWithStories / results.length) * 100;
|
|
250
|
+
// Aggregate prop coverage
|
|
251
|
+
let totalProps = 0;
|
|
252
|
+
let coveredProps = 0;
|
|
253
|
+
for (const result of results) {
|
|
254
|
+
for (const prop of result.propCoverage) {
|
|
255
|
+
totalProps++;
|
|
256
|
+
if (prop.isCovered)
|
|
257
|
+
coveredProps++;
|
|
258
|
+
}
|
|
259
|
+
}
|
|
260
|
+
const propCoverage = totalProps > 0 ? (coveredProps / totalProps) * 100 : 100;
|
|
261
|
+
// Aggregate variant coverage
|
|
262
|
+
let totalVariants = 0;
|
|
263
|
+
let coveredVariants = 0;
|
|
264
|
+
for (const result of results) {
|
|
265
|
+
for (const prop of result.propCoverage) {
|
|
266
|
+
if (prop.variantCoverage) {
|
|
267
|
+
totalVariants += prop.variantCoverage.totalVariants;
|
|
268
|
+
coveredVariants += prop.variantCoverage.coveredVariants;
|
|
269
|
+
}
|
|
270
|
+
}
|
|
271
|
+
}
|
|
272
|
+
const variantCoverage = totalVariants > 0 ? (coveredVariants / totalVariants) * 100 : 100;
|
|
273
|
+
// Aggregate scenario coverage
|
|
274
|
+
let totalScenarios = 0;
|
|
275
|
+
let coveredScenarios = 0;
|
|
276
|
+
for (const result of results) {
|
|
277
|
+
for (const scenario of result.scenarioCoverage) {
|
|
278
|
+
totalScenarios++;
|
|
279
|
+
if (scenario.isCovered)
|
|
280
|
+
coveredScenarios++;
|
|
281
|
+
}
|
|
282
|
+
}
|
|
283
|
+
const scenarioCoverage = totalScenarios > 0 ? (coveredScenarios / totalScenarios) * 100 : 100;
|
|
284
|
+
return {
|
|
285
|
+
componentCoverage,
|
|
286
|
+
propCoverage,
|
|
287
|
+
variantCoverage,
|
|
288
|
+
scenarioCoverage,
|
|
289
|
+
};
|
|
290
|
+
}
|
|
291
|
+
/**
|
|
292
|
+
* Calculate new code coverage metrics
|
|
293
|
+
*/
|
|
294
|
+
export function calculateNewCodeCoverage(results) {
|
|
295
|
+
const newResults = results.filter(r => r.changeStatus.status === 'new');
|
|
296
|
+
const modifiedResults = results.filter(r => r.changeStatus.status === 'modified');
|
|
297
|
+
// New components
|
|
298
|
+
const newWithStories = newResults.filter(r => r.stories.length > 0).length;
|
|
299
|
+
const newWithoutStories = newResults.length - newWithStories;
|
|
300
|
+
const newCoverage = newResults.length > 0
|
|
301
|
+
? (newWithStories / newResults.length) * 100
|
|
302
|
+
: 100;
|
|
303
|
+
// Modified components - count new props
|
|
304
|
+
let totalNewProps = 0;
|
|
305
|
+
let coveredNewProps = 0;
|
|
306
|
+
for (const result of modifiedResults) {
|
|
307
|
+
for (const propName of result.changeStatus.newProps) {
|
|
308
|
+
totalNewProps++;
|
|
309
|
+
const propCov = result.propCoverage.find(p => p.prop.name === propName);
|
|
310
|
+
if (propCov?.isCovered) {
|
|
311
|
+
coveredNewProps++;
|
|
312
|
+
}
|
|
313
|
+
}
|
|
314
|
+
}
|
|
315
|
+
const modifiedCoverage = totalNewProps > 0
|
|
316
|
+
? (coveredNewProps / totalNewProps) * 100
|
|
317
|
+
: 100;
|
|
318
|
+
return {
|
|
319
|
+
newComponents: {
|
|
320
|
+
total: newResults.length,
|
|
321
|
+
withStories: newWithStories,
|
|
322
|
+
withoutStories: newWithoutStories,
|
|
323
|
+
coverage: newCoverage,
|
|
324
|
+
},
|
|
325
|
+
modifiedComponents: {
|
|
326
|
+
total: modifiedResults.length,
|
|
327
|
+
newPropsAdded: totalNewProps,
|
|
328
|
+
newPropsCovered: coveredNewProps,
|
|
329
|
+
coverage: modifiedCoverage,
|
|
330
|
+
},
|
|
331
|
+
newComponentPaths: newResults.map(r => r.component.relativePath),
|
|
332
|
+
modifiedComponentPaths: modifiedResults.map(r => r.component.relativePath),
|
|
333
|
+
};
|
|
334
|
+
}
|
|
335
|
+
//# sourceMappingURL=coverage-calculator.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"coverage-calculator.js","sourceRoot":"","sources":["../../src/core/coverage-calculator.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Report Generator
|
|
3
|
+
* Assembles the final JSON report and applies quality gates
|
|
4
|
+
*/
|
|
5
|
+
import type { StoryCoverageReport, ExecutionResults, CoverageResult, ParsedStoryFile, GitAnalysis, ScryConfig } from '../types/index.js';
|
|
6
|
+
/**
|
|
7
|
+
* Generate the full coverage report
|
|
8
|
+
*/
|
|
9
|
+
export declare function generateReport(coverageResults: CoverageResult[], storyFiles: ParsedStoryFile[], gitAnalysis: GitAnalysis | null, executionResults: ExecutionResults | null, config: ScryConfig): StoryCoverageReport;
|
|
10
|
+
//# sourceMappingURL=report-generator.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"report-generator.d.ts","sourceRoot":"","sources":["../../src/core/report-generator.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,EACV,mBAAmB,EAOnB,gBAAgB,EAShB,cAAc,EACd,eAAe,EACf,WAAW,EACX,UAAU,EACX,MAAM,mBAAmB,CAAC;AAI3B;;GAEG;AACH,wBAAgB,cAAc,CAC5B,eAAe,EAAE,cAAc,EAAE,EACjC,UAAU,EAAE,eAAe,EAAE,EAC7B,WAAW,EAAE,WAAW,GAAG,IAAI,EAC/B,gBAAgB,EAAE,gBAAgB,GAAG,IAAI,EACzC,MAAM,EAAE,UAAU,GACjB,mBAAmB,CAsDrB"}
|