@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.
Files changed (47) hide show
  1. package/README.md +410 -0
  2. package/bin/scry-sbcov.js +3 -0
  3. package/dist/analyzers/git-analyzer.d.ts +49 -0
  4. package/dist/analyzers/git-analyzer.d.ts.map +1 -0
  5. package/dist/analyzers/git-analyzer.js +265 -0
  6. package/dist/analyzers/git-analyzer.js.map +1 -0
  7. package/dist/cli/config.d.ts +12 -0
  8. package/dist/cli/config.d.ts.map +1 -0
  9. package/dist/cli/config.js +197 -0
  10. package/dist/cli/config.js.map +1 -0
  11. package/dist/cli/index.d.ts +7 -0
  12. package/dist/cli/index.d.ts.map +1 -0
  13. package/dist/cli/index.js +164 -0
  14. package/dist/cli/index.js.map +1 -0
  15. package/dist/core/analyzer.d.ts +19 -0
  16. package/dist/core/analyzer.d.ts.map +1 -0
  17. package/dist/core/analyzer.js +117 -0
  18. package/dist/core/analyzer.js.map +1 -0
  19. package/dist/core/coverage-calculator.d.ts +38 -0
  20. package/dist/core/coverage-calculator.d.ts.map +1 -0
  21. package/dist/core/coverage-calculator.js +335 -0
  22. package/dist/core/coverage-calculator.js.map +1 -0
  23. package/dist/core/report-generator.d.ts +10 -0
  24. package/dist/core/report-generator.d.ts.map +1 -0
  25. package/dist/core/report-generator.js +477 -0
  26. package/dist/core/report-generator.js.map +1 -0
  27. package/dist/core/story-executor.d.ts +22 -0
  28. package/dist/core/story-executor.d.ts.map +1 -0
  29. package/dist/core/story-executor.js +379 -0
  30. package/dist/core/story-executor.js.map +1 -0
  31. package/dist/detectors/component-detector.d.ts +15 -0
  32. package/dist/detectors/component-detector.d.ts.map +1 -0
  33. package/dist/detectors/component-detector.js +632 -0
  34. package/dist/detectors/component-detector.js.map +1 -0
  35. package/dist/index.d.ts +16 -0
  36. package/dist/index.d.ts.map +1 -0
  37. package/dist/index.js +18 -0
  38. package/dist/index.js.map +1 -0
  39. package/dist/parsers/story-parser.d.ts +18 -0
  40. package/dist/parsers/story-parser.d.ts.map +1 -0
  41. package/dist/parsers/story-parser.js +353 -0
  42. package/dist/parsers/story-parser.js.map +1 -0
  43. package/dist/types/index.d.ts +502 -0
  44. package/dist/types/index.d.ts.map +1 -0
  45. package/dist/types/index.js +6 -0
  46. package/dist/types/index.js.map +1 -0
  47. 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":"AAAA;;;GAGG;AAgBH,OAAO,EAAE,qBAAqB,EAAE,MAAM,4BAA4B,CAAC;AACnE,OAAO,EACL,SAAS,EACT,cAAc,EACd,iBAAiB,EACjB,oBAAoB,GACrB,MAAM,8BAA8B,CAAC;AAEtC;;GAEG;AACH,MAAM,UAAU,iBAAiB,CAC/B,UAA+B,EAC/B,UAA6B,EAC7B,WAA+B,EAC/B,MAAkB;IAElB,MAAM,OAAO,GAAqB,EAAE,CAAC;IAErC,gEAAgE;IAChE,MAAM,mBAAmB,GAAG,uBAAuB,CACjD,UAAU,EACV,UAAU,EACV,MAAM,CAAC,qBAAqB,CAC7B,CAAC;IAEF,KAAK,MAAM,SAAS,IAAI,UAAU,EAAE,CAAC;QACnC,MAAM,gBAAgB,GAAG,mBAAmB,CAAC,GAAG,CAAC,SAAS,CAAC,QAAQ,CAAC,IAAI,IAAI,CAAC;QAC7E,MAAM,OAAO,GAAG,gBAAgB,EAAE,OAAO,IAAI,EAAE,CAAC;QAEhD,0BAA0B;QAC1B,MAAM,YAAY,GAAG,qBAAqB,CAAC,SAAS,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC;QAErE,8BAA8B;QAC9B,MAAM,gBAAgB,GAAG,yBAAyB,CAAC,SAAS,CAAC,SAAS,EAAE,OAAO,CAAC,CAAC;QAEjF,oBAAoB;QACpB,MAAM,OAAO,GAAG,gBAAgB,CAAC,YAAY,EAAE,gBAAgB,CAAC,CAAC;QAEjE,0BAA0B;QAC1B,MAAM,YAAY,GAAG,qBAAqB,CAAC,SAAS,EAAE,YAAY,EAAE,WAAW,CAAC,CAAC;QAEjF,OAAO,CAAC,IAAI,CAAC;YACX,SAAS;YACT,SAAS,EAAE,gBAAgB;YAC3B,OAAO;YACP,YAAY;YACZ,gBAAgB;YAChB,OAAO;YACP,YAAY;SACb,CAAC,CAAC;IACL,CAAC;IAED,OAAO,OAAO,CAAC;AACjB,CAAC;AAED;;GAEG;AACH,SAAS,uBAAuB,CAC9B,UAA+B,EAC/B,UAA6B,EAC7B,aAAqC;IAErC,MAAM,GAAG,GAAG,IAAI,GAAG,EAA2B,CAAC;IAE/C,+BAA+B;IAC/B,KAAK,MAAM,CAAC,aAAa,EAAE,SAAS,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,aAAa,CAAC,EAAE,CAAC;QACvE,MAAM,SAAS,GAAG,UAAU,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,QAAQ,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,YAAY,KAAK,SAAS,CAAC,CAAC;QACvG,IAAI,SAAS,EAAE,CAAC;YACd,GAAG,CAAC,GAAG,CAAC,aAAa,EAAE,SAAS,CAAC,CAAC;QACpC,CAAC;IACH,CAAC;IAED,iDAAiD;IACjD,KAAK,MAAM,SAAS,IAAI,UAAU,EAAE,CAAC;QACnC,MAAM,gBAAgB,GAAG,qBAAqB,CAAC,SAAS,EAAE,UAAU,CAAC,CAAC;QACtE,IAAI,gBAAgB,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,gBAAgB,CAAC,QAAQ,CAAC,EAAE,CAAC;YAC5D,GAAG,CAAC,GAAG,CAAC,gBAAgB,CAAC,QAAQ,EAAE,SAAS,CAAC,CAAC;QAChD,CAAC;IACH,CAAC;IAED,OAAO,GAAG,CAAC;AACb,CAAC;AAED;;GAEG;AACH,SAAS,qBAAqB,CAC5B,KAAqB,EACrB,OAAsB;IAEtB,OAAO,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE;QACtB,MAAM,SAAS,GAAa,EAAE,CAAC;QAC/B,IAAI,eAAe,GAAiC,IAAI,CAAC;QAEzD,oCAAoC;QACpC,KAAK,MAAM,KAAK,IAAI,OAAO,EAAE,CAAC;YAC5B,IAAI,IAAI,CAAC,IAAI,IAAI,KAAK,CAAC,IAAI,EAAE,CAAC;gBAC5B,SAAS,CAAC,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC;YAClC,CAAC;QACH,CAAC;QAED,mDAAmD;QACnD,IAAI,IAAI,CAAC,QAAQ,EAAE,CAAC;YAClB,eAAe,GAAG,wBAAwB,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;QAC5D,CAAC;QAED,OAAO;YACL,IAAI;YACJ,SAAS,EAAE,SAAS,CAAC,MAAM,GAAG,CAAC;YAC/B,SAAS;YACT,eAAe;SAChB,CAAC;IACJ,CAAC,CAAC,CAAC;AACL,CAAC;AAED;;GAEG;AACH,SAAS,wBAAwB,CAC/B,IAAkB,EAClB,OAAsB;IAEtB,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,CAAC;QACnB,OAAO;YACL,aAAa,EAAE,CAAC;YAChB,eAAe,EAAE,CAAC;YAClB,QAAQ,EAAE,CAAC;YACX,MAAM,EAAE,EAAE;SACX,CAAC;IACJ,CAAC;IAED,MAAM,MAAM,GAAG,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE;QAC9C,MAAM,SAAS,GAAa,EAAE,CAAC;QAE/B,KAAK,MAAM,KAAK,IAAI,OAAO,EAAE,CAAC;YAC5B,MAAM,QAAQ,GAAG,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YAEvC,2BAA2B;YAC3B,IAAI,QAAQ,KAAK,SAAS,EAAE,CAAC;gBAC3B,MAAM,SAAS,GAAG,MAAM,CAAC,QAAQ,CAAC,CAAC;gBACnC,IAAI,SAAS,KAAK,KAAK,IAAI,SAAS,KAAK,IAAI,KAAK,GAAG,IAAI,SAAS,KAAK,IAAI,KAAK,GAAG,EAAE,CAAC;oBACpF,SAAS,CAAC,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC;gBAClC,CAAC;YACH,CAAC;QACH,CAAC;QAED,OAAO;YACL,KAAK;YACL,SAAS,EAAE,SAAS,CAAC,MAAM,GAAG,CAAC;YAC/B,SAAS;SACV,CAAC;IACJ,CAAC,CAAC,CAAC;IAEH,MAAM,eAAe,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,MAAM,CAAC;IAC/D,MAAM,aAAa,GAAG,MAAM,CAAC,MAAM,CAAC;IAEpC,OAAO;QACL,aAAa;QACb,eAAe;QACf,QAAQ,EAAE,aAAa,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,eAAe,GAAG,aAAa,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC,CAAC;QACzE,MAAM;KACP,CAAC;AACJ,CAAC;AAED;;GAEG;AACH,SAAS,yBAAyB,CAChC,SAA6B,EAC7B,OAAsB;IAEtB,OAAO,SAAS,CAAC,GAAG,CAAC,QAAQ,CAAC,EAAE;QAC9B,IAAI,SAAS,GAAkB,IAAI,CAAC;QAEpC,0CAA0C;QAC1C,KAAK,MAAM,KAAK,IAAI,OAAO,EAAE,CAAC;YAC5B,gFAAgF;YAChF,MAAM,cAAc,GAAG,QAAQ,CAAC,gBAAgB,CAAC,IAAI,CAAC,QAAQ,CAAC,EAAE;gBAC/D,MAAM,QAAQ,GAAG,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;gBACtC,IAAI,QAAQ,KAAK,SAAS;oBAAE,OAAO,KAAK,CAAC;gBAEzC,2DAA2D;gBAC3D,IAAI,QAAQ,KAAK,IAAI;oBAAE,OAAO,IAAI,CAAC;gBACnC,IAAI,OAAO,QAAQ,KAAK,QAAQ,IAAI,QAAQ,CAAC,WAAW,EAAE,KAAK,OAAO;oBAAE,OAAO,IAAI,CAAC;gBACpF,IAAI,OAAO,QAAQ,KAAK,QAAQ,IAAI,QAAQ,KAAK,CAAC;oBAAE,OAAO,IAAI,CAAC;gBAEhE,OAAO,KAAK,CAAC;YACf,CAAC,CAAC,CAAC;YAEH,IAAI,cAAc,EAAE,CAAC;gBACnB,SAAS,GAAG,KAAK,CAAC,SAAS,CAAC;gBAC5B,MAAM;YACR,CAAC;QACH,CAAC;QAED,OAAO;YACL,QAAQ;YACR,SAAS,EAAE,SAAS,KAAK,IAAI;YAC7B,SAAS;SACV,CAAC;IACJ,CAAC,CAAC,CAAC;AACL,CAAC;AAED;;GAEG;AACH,SAAS,gBAAgB,CACvB,YAAkC,EAClC,gBAA0C;IAE1C,gBAAgB;IAChB,MAAM,YAAY,GAAG,YAAY,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,MAAM,CAAC;IAClE,MAAM,UAAU,GAAG,YAAY,CAAC,MAAM,CAAC;IACvC,MAAM,mBAAmB,GAAG,UAAU,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,YAAY,GAAG,UAAU,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC;IAErF,mBAAmB;IACnB,IAAI,aAAa,GAAG,CAAC,CAAC;IACtB,IAAI,eAAe,GAAG,CAAC,CAAC;IACxB,KAAK,MAAM,IAAI,IAAI,YAAY,EAAE,CAAC;QAChC,IAAI,IAAI,CAAC,eAAe,EAAE,CAAC;YACzB,aAAa,IAAI,IAAI,CAAC,eAAe,CAAC,aAAa,CAAC;YACpD,eAAe,IAAI,IAAI,CAAC,eAAe,CAAC,eAAe,CAAC;QAC1D,CAAC;IACH,CAAC;IACD,MAAM,sBAAsB,GAAG,aAAa,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,eAAe,GAAG,aAAa,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC;IAEjG,oBAAoB;IACpB,MAAM,gBAAgB,GAAG,gBAAgB,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,MAAM,CAAC;IAC1E,MAAM,cAAc,GAAG,gBAAgB,CAAC,MAAM,CAAC;IAC/C,MAAM,uBAAuB,GAAG,cAAc,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,gBAAgB,GAAG,cAAc,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC;IAErG,mCAAmC;IACnC,MAAM,OAAO,GAAG;QACd,IAAI,EAAE,GAAG;QACT,OAAO,EAAE,GAAG;QACZ,QAAQ,EAAE,GAAG;KACd,CAAC;IAEF,MAAM,YAAY,GAChB,mBAAmB,GAAG,OAAO,CAAC,IAAI;QAClC,sBAAsB,GAAG,OAAO,CAAC,OAAO;QACxC,uBAAuB,GAAG,OAAO,CAAC,QAAQ,CAAC;IAE7C,OAAO;QACL,YAAY,EAAE,mBAAmB;QACjC,eAAe,EAAE,sBAAsB;QACvC,gBAAgB,EAAE,uBAAuB;QACzC,YAAY;KACb,CAAC;AACJ,CAAC;AAED;;GAEG;AACH,SAAS,qBAAqB,CAC5B,SAA4B,EAC5B,YAAkC,EAClC,WAA+B;IAE/B,IAAI,CAAC,WAAW,IAAI,CAAC,WAAW,CAAC,OAAO,EAAE,CAAC;QACzC,OAAO;YACL,MAAM,EAAE,WAAW;YACnB,UAAU,EAAE,CAAC;YACb,aAAa,EAAE,CAAC;YAChB,QAAQ,EAAE,EAAE;SACb,CAAC;IACJ,CAAC;IAED,MAAM,QAAQ,GAAG,SAAS,CAAC,YAAY,CAAC;IAExC,IAAI,SAAS,CAAC,QAAQ,EAAE,WAAW,CAAC,EAAE,CAAC;QACrC,kCAAkC;QAClC,MAAM,QAAQ,GAAG,YAAY,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACpD,OAAO;YACL,MAAM,EAAE,KAAK;YACb,UAAU,EAAE,iBAAiB,CAAC,QAAQ,EAAE,WAAW,CAAC;YACpD,aAAa,EAAE,CAAC;YAChB,QAAQ;SACT,CAAC;IACJ,CAAC;IAED,IAAI,cAAc,CAAC,QAAQ,EAAE,WAAW,CAAC,EAAE,CAAC;QAC1C,uEAAuE;QACvE,qEAAqE;QACrE,MAAM,QAAQ,GAAa,EAAE,CAAC;QAE9B,OAAO;YACL,MAAM,EAAE,UAAU;YAClB,UAAU,EAAE,iBAAiB,CAAC,QAAQ,EAAE,WAAW,CAAC;YACpD,aAAa,EAAE,oBAAoB,CAAC,QAAQ,EAAE,WAAW,CAAC;YAC1D,QAAQ;SACT,CAAC;IACJ,CAAC;IAED,OAAO;QACL,MAAM,EAAE,WAAW;QACnB,UAAU,EAAE,CAAC;QACb,aAAa,EAAE,CAAC;QAChB,QAAQ,EAAE,EAAE;KACb,CAAC;AACJ,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,0BAA0B,CACxC,OAAyB;IAOzB,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACzB,OAAO;YACL,iBAAiB,EAAE,GAAG;YACtB,YAAY,EAAE,GAAG;YACjB,eAAe,EAAE,GAAG;YACpB,gBAAgB,EAAE,GAAG;SACtB,CAAC;IACJ,CAAC;IAED,qBAAqB;IACrB,MAAM,qBAAqB,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,MAAM,CAAC;IAC/E,MAAM,iBAAiB,GAAG,CAAC,qBAAqB,GAAG,OAAO,CAAC,MAAM,CAAC,GAAG,GAAG,CAAC;IAEzE,0BAA0B;IAC1B,IAAI,UAAU,GAAG,CAAC,CAAC;IACnB,IAAI,YAAY,GAAG,CAAC,CAAC;IACrB,KAAK,MAAM,MAAM,IAAI,OAAO,EAAE,CAAC;QAC7B,KAAK,MAAM,IAAI,IAAI,MAAM,CAAC,YAAY,EAAE,CAAC;YACvC,UAAU,EAAE,CAAC;YACb,IAAI,IAAI,CAAC,SAAS;gBAAE,YAAY,EAAE,CAAC;QACrC,CAAC;IACH,CAAC;IACD,MAAM,YAAY,GAAG,UAAU,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,YAAY,GAAG,UAAU,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC;IAE9E,6BAA6B;IAC7B,IAAI,aAAa,GAAG,CAAC,CAAC;IACtB,IAAI,eAAe,GAAG,CAAC,CAAC;IACxB,KAAK,MAAM,MAAM,IAAI,OAAO,EAAE,CAAC;QAC7B,KAAK,MAAM,IAAI,IAAI,MAAM,CAAC,YAAY,EAAE,CAAC;YACvC,IAAI,IAAI,CAAC,eAAe,EAAE,CAAC;gBACzB,aAAa,IAAI,IAAI,CAAC,eAAe,CAAC,aAAa,CAAC;gBACpD,eAAe,IAAI,IAAI,CAAC,eAAe,CAAC,eAAe,CAAC;YAC1D,CAAC;QACH,CAAC;IACH,CAAC;IACD,MAAM,eAAe,GAAG,aAAa,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,eAAe,GAAG,aAAa,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC;IAE1F,8BAA8B;IAC9B,IAAI,cAAc,GAAG,CAAC,CAAC;IACvB,IAAI,gBAAgB,GAAG,CAAC,CAAC;IACzB,KAAK,MAAM,MAAM,IAAI,OAAO,EAAE,CAAC;QAC7B,KAAK,MAAM,QAAQ,IAAI,MAAM,CAAC,gBAAgB,EAAE,CAAC;YAC/C,cAAc,EAAE,CAAC;YACjB,IAAI,QAAQ,CAAC,SAAS;gBAAE,gBAAgB,EAAE,CAAC;QAC7C,CAAC;IACH,CAAC;IACD,MAAM,gBAAgB,GAAG,cAAc,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,gBAAgB,GAAG,cAAc,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC;IAE9F,OAAO;QACL,iBAAiB;QACjB,YAAY;QACZ,eAAe;QACf,gBAAgB;KACjB,CAAC;AACJ,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,wBAAwB,CACtC,OAAyB;IAiBzB,MAAM,UAAU,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,YAAY,CAAC,MAAM,KAAK,KAAK,CAAC,CAAC;IACxE,MAAM,eAAe,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,YAAY,CAAC,MAAM,KAAK,UAAU,CAAC,CAAC;IAElF,iBAAiB;IACjB,MAAM,cAAc,GAAG,UAAU,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,MAAM,CAAC;IAC3E,MAAM,iBAAiB,GAAG,UAAU,CAAC,MAAM,GAAG,cAAc,CAAC;IAC7D,MAAM,WAAW,GAAG,UAAU,CAAC,MAAM,GAAG,CAAC;QACvC,CAAC,CAAC,CAAC,cAAc,GAAG,UAAU,CAAC,MAAM,CAAC,GAAG,GAAG;QAC5C,CAAC,CAAC,GAAG,CAAC;IAER,wCAAwC;IACxC,IAAI,aAAa,GAAG,CAAC,CAAC;IACtB,IAAI,eAAe,GAAG,CAAC,CAAC;IACxB,KAAK,MAAM,MAAM,IAAI,eAAe,EAAE,CAAC;QACrC,KAAK,MAAM,QAAQ,IAAI,MAAM,CAAC,YAAY,CAAC,QAAQ,EAAE,CAAC;YACpD,aAAa,EAAE,CAAC;YAChB,MAAM,OAAO,GAAG,MAAM,CAAC,YAAY,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,KAAK,QAAQ,CAAC,CAAC;YACxE,IAAI,OAAO,EAAE,SAAS,EAAE,CAAC;gBACvB,eAAe,EAAE,CAAC;YACpB,CAAC;QACH,CAAC;IACH,CAAC;IACD,MAAM,gBAAgB,GAAG,aAAa,GAAG,CAAC;QACxC,CAAC,CAAC,CAAC,eAAe,GAAG,aAAa,CAAC,GAAG,GAAG;QACzC,CAAC,CAAC,GAAG,CAAC;IAER,OAAO;QACL,aAAa,EAAE;YACb,KAAK,EAAE,UAAU,CAAC,MAAM;YACxB,WAAW,EAAE,cAAc;YAC3B,cAAc,EAAE,iBAAiB;YACjC,QAAQ,EAAE,WAAW;SACtB;QACD,kBAAkB,EAAE;YAClB,KAAK,EAAE,eAAe,CAAC,MAAM;YAC7B,aAAa,EAAE,aAAa;YAC5B,eAAe,EAAE,eAAe;YAChC,QAAQ,EAAE,gBAAgB;SAC3B;QACD,iBAAiB,EAAE,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC,YAAY,CAAC;QAChE,sBAAsB,EAAE,eAAe,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC,YAAY,CAAC;KAC3E,CAAC;AACJ,CAAC"}
@@ -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"}