@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,477 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Report Generator
|
|
3
|
+
* Assembles the final JSON report and applies quality gates
|
|
4
|
+
*/
|
|
5
|
+
import { getExpectedStoryPath } from '../parsers/story-parser.js';
|
|
6
|
+
import { calculateAggregateCoverage, calculateNewCodeCoverage } from './coverage-calculator.js';
|
|
7
|
+
/**
|
|
8
|
+
* Generate the full coverage report
|
|
9
|
+
*/
|
|
10
|
+
export function generateReport(coverageResults, storyFiles, gitAnalysis, executionResults, config) {
|
|
11
|
+
// Calculate aggregate coverage metrics
|
|
12
|
+
const aggregateCoverage = calculateAggregateCoverage(coverageResults);
|
|
13
|
+
// Calculate new code metrics
|
|
14
|
+
const newCodeMetrics = calculateNewCodeCoverage(coverageResults);
|
|
15
|
+
// Build component coverage details
|
|
16
|
+
const components = buildComponentCoverage(coverageResults, executionResults);
|
|
17
|
+
// Identify missing scenarios
|
|
18
|
+
const missingScenarios = identifyMissingScenarios(coverageResults);
|
|
19
|
+
// Identify uncovered components
|
|
20
|
+
const uncoveredComponents = identifyUncoveredComponents(coverageResults);
|
|
21
|
+
// Build summary
|
|
22
|
+
const summary = buildSummary(coverageResults, storyFiles, aggregateCoverage, executionResults);
|
|
23
|
+
// Build git context
|
|
24
|
+
const gitContext = buildGitContext(gitAnalysis);
|
|
25
|
+
// Build new code analysis
|
|
26
|
+
const newCode = buildNewCodeAnalysis(gitAnalysis, newCodeMetrics);
|
|
27
|
+
// Build config for report
|
|
28
|
+
const reportConfig = buildReportConfig(config);
|
|
29
|
+
// Apply quality gates
|
|
30
|
+
const qualityGate = applyQualityGate(aggregateCoverage, newCodeMetrics, executionResults, config);
|
|
31
|
+
return {
|
|
32
|
+
version: '1.0.0',
|
|
33
|
+
generatedAt: new Date().toISOString(),
|
|
34
|
+
git: gitContext,
|
|
35
|
+
config: reportConfig,
|
|
36
|
+
summary,
|
|
37
|
+
newCode,
|
|
38
|
+
execution: executionResults,
|
|
39
|
+
components,
|
|
40
|
+
missingScenarios,
|
|
41
|
+
uncoveredComponents,
|
|
42
|
+
qualityGate,
|
|
43
|
+
};
|
|
44
|
+
}
|
|
45
|
+
/**
|
|
46
|
+
* Build component coverage details
|
|
47
|
+
*/
|
|
48
|
+
function buildComponentCoverage(coverageResults, executionResults) {
|
|
49
|
+
return coverageResults.map(result => {
|
|
50
|
+
const { component, storyFile, stories, propCoverage, scenarioCoverage, metrics, changeStatus } = result;
|
|
51
|
+
// Build prop coverage
|
|
52
|
+
const props = propCoverage.map(pc => ({
|
|
53
|
+
name: pc.prop.name,
|
|
54
|
+
type: pc.prop.type,
|
|
55
|
+
required: pc.prop.required,
|
|
56
|
+
hasDefault: pc.prop.hasDefault,
|
|
57
|
+
defaultValue: pc.prop.defaultValue,
|
|
58
|
+
description: pc.prop.description,
|
|
59
|
+
isCovered: pc.isCovered,
|
|
60
|
+
coveredBy: pc.coveredBy,
|
|
61
|
+
variants: pc.variantCoverage ? {
|
|
62
|
+
type: pc.prop.variants?.type || 'union',
|
|
63
|
+
totalVariants: pc.variantCoverage.totalVariants,
|
|
64
|
+
coveredVariants: pc.variantCoverage.coveredVariants,
|
|
65
|
+
coverage: pc.variantCoverage.coverage,
|
|
66
|
+
values: pc.variantCoverage.values,
|
|
67
|
+
} : null,
|
|
68
|
+
isNew: changeStatus.newProps.includes(pc.prop.name),
|
|
69
|
+
}));
|
|
70
|
+
// Build scenario coverage
|
|
71
|
+
const scenarios = scenarioCoverage.map(sc => ({
|
|
72
|
+
id: sc.scenario.id,
|
|
73
|
+
name: sc.scenario.name,
|
|
74
|
+
detectedBy: sc.scenario.detectedBy,
|
|
75
|
+
controllingProps: sc.scenario.controllingProps,
|
|
76
|
+
isCovered: sc.isCovered,
|
|
77
|
+
coveredBy: sc.coveredBy,
|
|
78
|
+
priority: sc.scenario.priority,
|
|
79
|
+
}));
|
|
80
|
+
// Calculate health from execution results
|
|
81
|
+
const health = calculateComponentHealth(component.componentName, stories, executionResults);
|
|
82
|
+
return {
|
|
83
|
+
filePath: component.filePath,
|
|
84
|
+
relativePath: component.relativePath,
|
|
85
|
+
componentName: component.componentName,
|
|
86
|
+
componentType: component.componentType,
|
|
87
|
+
storyFile: storyFile?.relativePath || null,
|
|
88
|
+
hasStories: stories.length > 0,
|
|
89
|
+
storyCount: stories.length,
|
|
90
|
+
storyNames: stories.map(s => s.storyName),
|
|
91
|
+
props,
|
|
92
|
+
scenarios,
|
|
93
|
+
coverage: {
|
|
94
|
+
propCoverage: metrics.propCoverage,
|
|
95
|
+
variantCoverage: metrics.variantCoverage,
|
|
96
|
+
scenarioCoverage: metrics.scenarioCoverage,
|
|
97
|
+
overallScore: metrics.overallScore,
|
|
98
|
+
},
|
|
99
|
+
health,
|
|
100
|
+
changeStatus,
|
|
101
|
+
};
|
|
102
|
+
});
|
|
103
|
+
}
|
|
104
|
+
/**
|
|
105
|
+
* Calculate component health from execution results
|
|
106
|
+
*/
|
|
107
|
+
function calculateComponentHealth(componentName, stories, executionResults) {
|
|
108
|
+
if (!executionResults || !executionResults.executed) {
|
|
109
|
+
return {
|
|
110
|
+
totalStories: stories.length,
|
|
111
|
+
passing: 0,
|
|
112
|
+
failing: 0,
|
|
113
|
+
skipped: 0,
|
|
114
|
+
status: 'unknown',
|
|
115
|
+
};
|
|
116
|
+
}
|
|
117
|
+
const componentStories = executionResults.stories.filter(s => s.componentName === componentName);
|
|
118
|
+
const passing = componentStories.filter(s => s.status === 'passed').length;
|
|
119
|
+
const failing = componentStories.filter(s => s.status === 'failed').length;
|
|
120
|
+
const skipped = componentStories.filter(s => s.status === 'skipped').length;
|
|
121
|
+
let status;
|
|
122
|
+
if (failing === 0) {
|
|
123
|
+
status = 'healthy';
|
|
124
|
+
}
|
|
125
|
+
else if (failing < componentStories.length) {
|
|
126
|
+
status = 'degraded';
|
|
127
|
+
}
|
|
128
|
+
else {
|
|
129
|
+
status = 'broken';
|
|
130
|
+
}
|
|
131
|
+
return {
|
|
132
|
+
totalStories: componentStories.length,
|
|
133
|
+
passing,
|
|
134
|
+
failing,
|
|
135
|
+
skipped,
|
|
136
|
+
status,
|
|
137
|
+
};
|
|
138
|
+
}
|
|
139
|
+
/**
|
|
140
|
+
* Identify missing scenarios
|
|
141
|
+
*/
|
|
142
|
+
function identifyMissingScenarios(coverageResults) {
|
|
143
|
+
const missing = [];
|
|
144
|
+
for (const result of coverageResults) {
|
|
145
|
+
const { component, stories, propCoverage, scenarioCoverage, changeStatus } = result;
|
|
146
|
+
const hasStories = stories.length > 0;
|
|
147
|
+
// No stories at all
|
|
148
|
+
if (!hasStories) {
|
|
149
|
+
missing.push({
|
|
150
|
+
componentName: component.componentName,
|
|
151
|
+
componentPath: component.relativePath,
|
|
152
|
+
description: `Component has no stories`,
|
|
153
|
+
reason: 'no_stories',
|
|
154
|
+
priority: 'critical',
|
|
155
|
+
suggestedArgs: {},
|
|
156
|
+
suggestedStoryName: 'Default',
|
|
157
|
+
affectsNewCode: changeStatus.status !== 'unchanged',
|
|
158
|
+
});
|
|
159
|
+
continue;
|
|
160
|
+
}
|
|
161
|
+
// Uncovered variants
|
|
162
|
+
for (const prop of propCoverage) {
|
|
163
|
+
if (prop.variantCoverage) {
|
|
164
|
+
for (const variant of prop.variantCoverage.values) {
|
|
165
|
+
if (!variant.isCovered) {
|
|
166
|
+
missing.push({
|
|
167
|
+
componentName: component.componentName,
|
|
168
|
+
componentPath: component.relativePath,
|
|
169
|
+
description: `${component.componentName} with ${prop.prop.name}='${variant.value}' is not covered by any story`,
|
|
170
|
+
reason: 'uncovered_variant',
|
|
171
|
+
priority: 'medium',
|
|
172
|
+
suggestedArgs: { [prop.prop.name]: variant.value },
|
|
173
|
+
suggestedStoryName: toPascalCase(variant.value),
|
|
174
|
+
affectsNewCode: changeStatus.status !== 'unchanged',
|
|
175
|
+
});
|
|
176
|
+
}
|
|
177
|
+
}
|
|
178
|
+
}
|
|
179
|
+
// New props that aren't covered
|
|
180
|
+
if (changeStatus.newProps.includes(prop.prop.name) && !prop.isCovered) {
|
|
181
|
+
missing.push({
|
|
182
|
+
componentName: component.componentName,
|
|
183
|
+
componentPath: component.relativePath,
|
|
184
|
+
description: `New prop '${prop.prop.name}' has no story coverage`,
|
|
185
|
+
reason: 'new_prop_uncovered',
|
|
186
|
+
priority: 'high',
|
|
187
|
+
suggestedArgs: buildSuggestedArgs(prop.prop.name, prop.prop.type),
|
|
188
|
+
suggestedStoryName: `With${toPascalCase(prop.prop.name)}`,
|
|
189
|
+
affectsNewCode: true,
|
|
190
|
+
});
|
|
191
|
+
}
|
|
192
|
+
// Required props that aren't covered
|
|
193
|
+
if (prop.prop.required && !prop.isCovered && !changeStatus.newProps.includes(prop.prop.name)) {
|
|
194
|
+
missing.push({
|
|
195
|
+
componentName: component.componentName,
|
|
196
|
+
componentPath: component.relativePath,
|
|
197
|
+
description: `Required prop '${prop.prop.name}' is not explicitly tested`,
|
|
198
|
+
reason: 'required_prop_uncovered',
|
|
199
|
+
priority: 'medium',
|
|
200
|
+
suggestedArgs: buildSuggestedArgs(prop.prop.name, prop.prop.type),
|
|
201
|
+
suggestedStoryName: `With${toPascalCase(prop.prop.name)}`,
|
|
202
|
+
affectsNewCode: changeStatus.status !== 'unchanged',
|
|
203
|
+
});
|
|
204
|
+
}
|
|
205
|
+
}
|
|
206
|
+
// Uncovered scenarios
|
|
207
|
+
for (const scenario of scenarioCoverage) {
|
|
208
|
+
if (!scenario.isCovered) {
|
|
209
|
+
const controllingProp = scenario.scenario.controllingProps[0];
|
|
210
|
+
missing.push({
|
|
211
|
+
componentName: component.componentName,
|
|
212
|
+
componentPath: component.relativePath,
|
|
213
|
+
description: `Scenario '${scenario.scenario.name}' is not covered`,
|
|
214
|
+
reason: 'uncovered_state',
|
|
215
|
+
priority: scenario.scenario.priority,
|
|
216
|
+
suggestedArgs: { [controllingProp]: true },
|
|
217
|
+
suggestedStoryName: toPascalCase(scenario.scenario.id.replace('-state', '')),
|
|
218
|
+
affectsNewCode: changeStatus.status !== 'unchanged',
|
|
219
|
+
});
|
|
220
|
+
}
|
|
221
|
+
}
|
|
222
|
+
}
|
|
223
|
+
// Sort by priority
|
|
224
|
+
const priorityOrder = { critical: 0, high: 1, medium: 2, low: 3 };
|
|
225
|
+
missing.sort((a, b) => priorityOrder[a.priority] - priorityOrder[b.priority]);
|
|
226
|
+
return missing;
|
|
227
|
+
}
|
|
228
|
+
/**
|
|
229
|
+
* Identify uncovered components
|
|
230
|
+
*/
|
|
231
|
+
function identifyUncoveredComponents(coverageResults) {
|
|
232
|
+
const uncovered = [];
|
|
233
|
+
for (const result of coverageResults) {
|
|
234
|
+
if (result.stories.length > 0)
|
|
235
|
+
continue;
|
|
236
|
+
const { component, changeStatus } = result;
|
|
237
|
+
const propCount = component.props.length;
|
|
238
|
+
const requiredPropCount = component.props.filter(p => p.required).length;
|
|
239
|
+
const detectedScenarios = component.scenarios.map(s => s.name);
|
|
240
|
+
// Estimate complexity
|
|
241
|
+
let complexity = 'low';
|
|
242
|
+
if (propCount > 10 || requiredPropCount > 5 || detectedScenarios.length > 3) {
|
|
243
|
+
complexity = 'high';
|
|
244
|
+
}
|
|
245
|
+
else if (propCount > 5 || requiredPropCount > 2 || detectedScenarios.length > 1) {
|
|
246
|
+
complexity = 'medium';
|
|
247
|
+
}
|
|
248
|
+
uncovered.push({
|
|
249
|
+
componentName: component.componentName,
|
|
250
|
+
filePath: component.filePath,
|
|
251
|
+
relativePath: component.relativePath,
|
|
252
|
+
componentType: component.componentType,
|
|
253
|
+
propCount,
|
|
254
|
+
requiredPropCount,
|
|
255
|
+
detectedScenarios,
|
|
256
|
+
isNew: changeStatus.status === 'new',
|
|
257
|
+
expectedStoryPath: getExpectedStoryPath(component.relativePath),
|
|
258
|
+
complexity,
|
|
259
|
+
});
|
|
260
|
+
}
|
|
261
|
+
// Sort by: new first, then by complexity
|
|
262
|
+
uncovered.sort((a, b) => {
|
|
263
|
+
if (a.isNew !== b.isNew)
|
|
264
|
+
return a.isNew ? -1 : 1;
|
|
265
|
+
const complexityOrder = { high: 0, medium: 1, low: 2 };
|
|
266
|
+
return complexityOrder[a.complexity] - complexityOrder[b.complexity];
|
|
267
|
+
});
|
|
268
|
+
return uncovered;
|
|
269
|
+
}
|
|
270
|
+
/**
|
|
271
|
+
* Build coverage summary
|
|
272
|
+
*/
|
|
273
|
+
function buildSummary(coverageResults, storyFiles, aggregateCoverage, executionResults) {
|
|
274
|
+
const totalComponents = coverageResults.length;
|
|
275
|
+
const componentsWithStories = coverageResults.filter(r => r.stories.length > 0).length;
|
|
276
|
+
const componentsWithoutStories = totalComponents - componentsWithStories;
|
|
277
|
+
const totalStories = storyFiles.reduce((acc, f) => acc + f.stories.length, 0);
|
|
278
|
+
const metrics = {
|
|
279
|
+
componentCoverage: aggregateCoverage.componentCoverage,
|
|
280
|
+
propCoverage: aggregateCoverage.propCoverage,
|
|
281
|
+
variantCoverage: aggregateCoverage.variantCoverage,
|
|
282
|
+
scenarioCoverage: aggregateCoverage.scenarioCoverage,
|
|
283
|
+
};
|
|
284
|
+
const health = buildHealthSummary(executionResults);
|
|
285
|
+
return {
|
|
286
|
+
totalComponents,
|
|
287
|
+
componentsWithStories,
|
|
288
|
+
componentsWithoutStories,
|
|
289
|
+
totalStoryFiles: storyFiles.length,
|
|
290
|
+
totalStories,
|
|
291
|
+
metrics,
|
|
292
|
+
health,
|
|
293
|
+
};
|
|
294
|
+
}
|
|
295
|
+
/**
|
|
296
|
+
* Build health summary
|
|
297
|
+
*/
|
|
298
|
+
function buildHealthSummary(executionResults) {
|
|
299
|
+
if (!executionResults || !executionResults.executed) {
|
|
300
|
+
return {
|
|
301
|
+
status: 'not_executed',
|
|
302
|
+
passingStories: 0,
|
|
303
|
+
failingStories: 0,
|
|
304
|
+
passRate: 0,
|
|
305
|
+
};
|
|
306
|
+
}
|
|
307
|
+
const { passed, failed, total } = executionResults.summary;
|
|
308
|
+
const passRate = total > 0 ? (passed / total) * 100 : 0;
|
|
309
|
+
let status;
|
|
310
|
+
if (failed === 0) {
|
|
311
|
+
status = 'healthy';
|
|
312
|
+
}
|
|
313
|
+
else if (passRate >= 90) {
|
|
314
|
+
status = 'degraded';
|
|
315
|
+
}
|
|
316
|
+
else {
|
|
317
|
+
status = 'broken';
|
|
318
|
+
}
|
|
319
|
+
return {
|
|
320
|
+
status,
|
|
321
|
+
passingStories: passed,
|
|
322
|
+
failingStories: failed,
|
|
323
|
+
passRate,
|
|
324
|
+
};
|
|
325
|
+
}
|
|
326
|
+
/**
|
|
327
|
+
* Build git context
|
|
328
|
+
*/
|
|
329
|
+
function buildGitContext(gitAnalysis) {
|
|
330
|
+
if (!gitAnalysis || !gitAnalysis.enabled) {
|
|
331
|
+
return {
|
|
332
|
+
commitSha: '',
|
|
333
|
+
branch: '',
|
|
334
|
+
baseBranch: null,
|
|
335
|
+
baseCommitSha: null,
|
|
336
|
+
};
|
|
337
|
+
}
|
|
338
|
+
return {
|
|
339
|
+
commitSha: gitAnalysis.currentCommitSha,
|
|
340
|
+
branch: gitAnalysis.currentBranch,
|
|
341
|
+
baseBranch: gitAnalysis.baseBranch,
|
|
342
|
+
baseCommitSha: gitAnalysis.baseCommitSha,
|
|
343
|
+
};
|
|
344
|
+
}
|
|
345
|
+
/**
|
|
346
|
+
* Build new code analysis
|
|
347
|
+
*/
|
|
348
|
+
function buildNewCodeAnalysis(gitAnalysis, metrics) {
|
|
349
|
+
const enabled = gitAnalysis?.enabled ?? false;
|
|
350
|
+
const since = enabled
|
|
351
|
+
? `${gitAnalysis.baseBranch} (${gitAnalysis.baseCommitSha.substring(0, 7)})`
|
|
352
|
+
: '';
|
|
353
|
+
return {
|
|
354
|
+
enabled,
|
|
355
|
+
since,
|
|
356
|
+
newComponents: metrics.newComponents,
|
|
357
|
+
modifiedComponents: metrics.modifiedComponents,
|
|
358
|
+
newComponentPaths: metrics.newComponentPaths,
|
|
359
|
+
modifiedComponentPaths: metrics.modifiedComponentPaths,
|
|
360
|
+
};
|
|
361
|
+
}
|
|
362
|
+
/**
|
|
363
|
+
* Build report config
|
|
364
|
+
*/
|
|
365
|
+
function buildReportConfig(config) {
|
|
366
|
+
return {
|
|
367
|
+
include: config.include,
|
|
368
|
+
exclude: config.exclude,
|
|
369
|
+
storyPatterns: config.storyPatterns,
|
|
370
|
+
newCodeAnalysis: config.enableGitAnalysis,
|
|
371
|
+
baseBranch: config.enableGitAnalysis ? config.baseBranch : null,
|
|
372
|
+
thresholds: config.thresholds,
|
|
373
|
+
};
|
|
374
|
+
}
|
|
375
|
+
/**
|
|
376
|
+
* Apply quality gate checks
|
|
377
|
+
*/
|
|
378
|
+
function applyQualityGate(aggregateCoverage, newCodeMetrics, executionResults, config) {
|
|
379
|
+
const checks = [];
|
|
380
|
+
// Component coverage check
|
|
381
|
+
checks.push({
|
|
382
|
+
name: 'Component Coverage',
|
|
383
|
+
threshold: config.thresholds.componentCoverage,
|
|
384
|
+
actual: aggregateCoverage.componentCoverage,
|
|
385
|
+
passed: aggregateCoverage.componentCoverage >= config.thresholds.componentCoverage,
|
|
386
|
+
message: aggregateCoverage.componentCoverage >= config.thresholds.componentCoverage
|
|
387
|
+
? `${aggregateCoverage.componentCoverage.toFixed(1)}% >= ${config.thresholds.componentCoverage}% threshold`
|
|
388
|
+
: `${aggregateCoverage.componentCoverage.toFixed(1)}% < ${config.thresholds.componentCoverage}% threshold`,
|
|
389
|
+
});
|
|
390
|
+
// Prop coverage check
|
|
391
|
+
checks.push({
|
|
392
|
+
name: 'Prop Coverage',
|
|
393
|
+
threshold: config.thresholds.propCoverage,
|
|
394
|
+
actual: aggregateCoverage.propCoverage,
|
|
395
|
+
passed: aggregateCoverage.propCoverage >= config.thresholds.propCoverage,
|
|
396
|
+
message: aggregateCoverage.propCoverage >= config.thresholds.propCoverage
|
|
397
|
+
? `${aggregateCoverage.propCoverage.toFixed(1)}% >= ${config.thresholds.propCoverage}% threshold`
|
|
398
|
+
: `${aggregateCoverage.propCoverage.toFixed(1)}% < ${config.thresholds.propCoverage}% threshold`,
|
|
399
|
+
});
|
|
400
|
+
// Variant coverage check
|
|
401
|
+
checks.push({
|
|
402
|
+
name: 'Variant Coverage',
|
|
403
|
+
threshold: config.thresholds.variantCoverage,
|
|
404
|
+
actual: aggregateCoverage.variantCoverage,
|
|
405
|
+
passed: aggregateCoverage.variantCoverage >= config.thresholds.variantCoverage,
|
|
406
|
+
message: aggregateCoverage.variantCoverage >= config.thresholds.variantCoverage
|
|
407
|
+
? `${aggregateCoverage.variantCoverage.toFixed(1)}% >= ${config.thresholds.variantCoverage}% threshold`
|
|
408
|
+
: `${aggregateCoverage.variantCoverage.toFixed(1)}% < ${config.thresholds.variantCoverage}% threshold`,
|
|
409
|
+
});
|
|
410
|
+
// New code coverage check (only if git analysis is enabled)
|
|
411
|
+
if (config.enableGitAnalysis) {
|
|
412
|
+
const newCodeCoverage = newCodeMetrics.newComponents.coverage;
|
|
413
|
+
checks.push({
|
|
414
|
+
name: 'New Code Coverage',
|
|
415
|
+
threshold: config.thresholds.newCodeCoverage,
|
|
416
|
+
actual: newCodeCoverage,
|
|
417
|
+
passed: newCodeCoverage >= config.thresholds.newCodeCoverage,
|
|
418
|
+
message: newCodeCoverage >= config.thresholds.newCodeCoverage
|
|
419
|
+
? `${newCodeCoverage.toFixed(1)}% >= ${config.thresholds.newCodeCoverage}% threshold`
|
|
420
|
+
: `${newCodeCoverage.toFixed(1)}% < ${config.thresholds.newCodeCoverage}% threshold`,
|
|
421
|
+
});
|
|
422
|
+
}
|
|
423
|
+
// Execution check (no new failures)
|
|
424
|
+
if (executionResults?.executed) {
|
|
425
|
+
const newFailures = executionResults.regression?.newFailures.length || 0;
|
|
426
|
+
checks.push({
|
|
427
|
+
name: 'No New Failures',
|
|
428
|
+
threshold: 0,
|
|
429
|
+
actual: newFailures,
|
|
430
|
+
passed: newFailures === 0,
|
|
431
|
+
message: newFailures === 0
|
|
432
|
+
? 'No new story failures introduced'
|
|
433
|
+
: `${newFailures} new story failure(s) introduced`,
|
|
434
|
+
});
|
|
435
|
+
}
|
|
436
|
+
const passed = checks.every(c => c.passed);
|
|
437
|
+
return {
|
|
438
|
+
passed,
|
|
439
|
+
checks,
|
|
440
|
+
};
|
|
441
|
+
}
|
|
442
|
+
/**
|
|
443
|
+
* Convert a string to PascalCase
|
|
444
|
+
*/
|
|
445
|
+
function toPascalCase(str) {
|
|
446
|
+
return str
|
|
447
|
+
.split(/[-_\s]+/)
|
|
448
|
+
.map(word => word.charAt(0).toUpperCase() + word.slice(1).toLowerCase())
|
|
449
|
+
.join('');
|
|
450
|
+
}
|
|
451
|
+
/**
|
|
452
|
+
* Build suggested args for a prop
|
|
453
|
+
*/
|
|
454
|
+
function buildSuggestedArgs(propName, propType) {
|
|
455
|
+
const args = {};
|
|
456
|
+
if (propType.includes('boolean')) {
|
|
457
|
+
args[propName] = true;
|
|
458
|
+
}
|
|
459
|
+
else if (propType.includes('string')) {
|
|
460
|
+
args[propName] = 'Example value';
|
|
461
|
+
}
|
|
462
|
+
else if (propType.includes('number')) {
|
|
463
|
+
args[propName] = 42;
|
|
464
|
+
}
|
|
465
|
+
else if (propType.includes('|')) {
|
|
466
|
+
// Union type - use first value
|
|
467
|
+
const match = propType.match(/'([^']+)'/);
|
|
468
|
+
if (match) {
|
|
469
|
+
args[propName] = match[1];
|
|
470
|
+
}
|
|
471
|
+
}
|
|
472
|
+
else {
|
|
473
|
+
args[propName] = '[value]';
|
|
474
|
+
}
|
|
475
|
+
return args;
|
|
476
|
+
}
|
|
477
|
+
//# sourceMappingURL=report-generator.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"report-generator.js","sourceRoot":"","sources":["../../src/core/report-generator.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAwBH,OAAO,EAAE,oBAAoB,EAAE,MAAM,4BAA4B,CAAC;AAClE,OAAO,EAAE,0BAA0B,EAAE,wBAAwB,EAAE,MAAM,0BAA0B,CAAC;AAEhG;;GAEG;AACH,MAAM,UAAU,cAAc,CAC5B,eAAiC,EACjC,UAA6B,EAC7B,WAA+B,EAC/B,gBAAyC,EACzC,MAAkB;IAElB,uCAAuC;IACvC,MAAM,iBAAiB,GAAG,0BAA0B,CAAC,eAAe,CAAC,CAAC;IAEtE,6BAA6B;IAC7B,MAAM,cAAc,GAAG,wBAAwB,CAAC,eAAe,CAAC,CAAC;IAEjE,mCAAmC;IACnC,MAAM,UAAU,GAAG,sBAAsB,CAAC,eAAe,EAAE,gBAAgB,CAAC,CAAC;IAE7E,6BAA6B;IAC7B,MAAM,gBAAgB,GAAG,wBAAwB,CAAC,eAAe,CAAC,CAAC;IAEnE,gCAAgC;IAChC,MAAM,mBAAmB,GAAG,2BAA2B,CAAC,eAAe,CAAC,CAAC;IAEzE,gBAAgB;IAChB,MAAM,OAAO,GAAG,YAAY,CAC1B,eAAe,EACf,UAAU,EACV,iBAAiB,EACjB,gBAAgB,CACjB,CAAC;IAEF,oBAAoB;IACpB,MAAM,UAAU,GAAG,eAAe,CAAC,WAAW,CAAC,CAAC;IAEhD,0BAA0B;IAC1B,MAAM,OAAO,GAAG,oBAAoB,CAAC,WAAW,EAAE,cAAc,CAAC,CAAC;IAElE,0BAA0B;IAC1B,MAAM,YAAY,GAAG,iBAAiB,CAAC,MAAM,CAAC,CAAC;IAE/C,sBAAsB;IACtB,MAAM,WAAW,GAAG,gBAAgB,CAClC,iBAAiB,EACjB,cAAc,EACd,gBAAgB,EAChB,MAAM,CACP,CAAC;IAEF,OAAO;QACL,OAAO,EAAE,OAAO;QAChB,WAAW,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;QACrC,GAAG,EAAE,UAAU;QACf,MAAM,EAAE,YAAY;QACpB,OAAO;QACP,OAAO;QACP,SAAS,EAAE,gBAAgB;QAC3B,UAAU;QACV,gBAAgB;QAChB,mBAAmB;QACnB,WAAW;KACZ,CAAC;AACJ,CAAC;AAED;;GAEG;AACH,SAAS,sBAAsB,CAC7B,eAAiC,EACjC,gBAAyC;IAEzC,OAAO,eAAe,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE;QAClC,MAAM,EAAE,SAAS,EAAE,SAAS,EAAE,OAAO,EAAE,YAAY,EAAE,gBAAgB,EAAE,OAAO,EAAE,YAAY,EAAE,GAAG,MAAM,CAAC;QAExG,sBAAsB;QACtB,MAAM,KAAK,GAAmB,YAAY,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC;YACpD,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,IAAI;YAClB,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,IAAI;YAClB,QAAQ,EAAE,EAAE,CAAC,IAAI,CAAC,QAAQ;YAC1B,UAAU,EAAE,EAAE,CAAC,IAAI,CAAC,UAAU;YAC9B,YAAY,EAAE,EAAE,CAAC,IAAI,CAAC,YAAY;YAClC,WAAW,EAAE,EAAE,CAAC,IAAI,CAAC,WAAW;YAChC,SAAS,EAAE,EAAE,CAAC,SAAS;YACvB,SAAS,EAAE,EAAE,CAAC,SAAS;YACvB,QAAQ,EAAE,EAAE,CAAC,eAAe,CAAC,CAAC,CAAC;gBAC7B,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,QAAQ,EAAE,IAAI,IAAI,OAAO;gBACvC,aAAa,EAAE,EAAE,CAAC,eAAe,CAAC,aAAa;gBAC/C,eAAe,EAAE,EAAE,CAAC,eAAe,CAAC,eAAe;gBACnD,QAAQ,EAAE,EAAE,CAAC,eAAe,CAAC,QAAQ;gBACrC,MAAM,EAAE,EAAE,CAAC,eAAe,CAAC,MAAwB;aACpD,CAAC,CAAC,CAAC,IAAI;YACR,KAAK,EAAE,YAAY,CAAC,QAAQ,CAAC,QAAQ,CAAC,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC;SACpD,CAAC,CAAC,CAAC;QAEJ,0BAA0B;QAC1B,MAAM,SAAS,GAAuB,gBAAgB,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC;YAChE,EAAE,EAAE,EAAE,CAAC,QAAQ,CAAC,EAAE;YAClB,IAAI,EAAE,EAAE,CAAC,QAAQ,CAAC,IAAI;YACtB,UAAU,EAAE,EAAE,CAAC,QAAQ,CAAC,UAAU;YAClC,gBAAgB,EAAE,EAAE,CAAC,QAAQ,CAAC,gBAAgB;YAC9C,SAAS,EAAE,EAAE,CAAC,SAAS;YACvB,SAAS,EAAE,EAAE,CAAC,SAAS;YACvB,QAAQ,EAAE,EAAE,CAAC,QAAQ,CAAC,QAAQ;SAC/B,CAAC,CAAC,CAAC;QAEJ,0CAA0C;QAC1C,MAAM,MAAM,GAAG,wBAAwB,CAAC,SAAS,CAAC,aAAa,EAAE,OAAO,EAAE,gBAAgB,CAAC,CAAC;QAE5F,OAAO;YACL,QAAQ,EAAE,SAAS,CAAC,QAAQ;YAC5B,YAAY,EAAE,SAAS,CAAC,YAAY;YACpC,aAAa,EAAE,SAAS,CAAC,aAAa;YACtC,aAAa,EAAE,SAAS,CAAC,aAAa;YACtC,SAAS,EAAE,SAAS,EAAE,YAAY,IAAI,IAAI;YAC1C,UAAU,EAAE,OAAO,CAAC,MAAM,GAAG,CAAC;YAC9B,UAAU,EAAE,OAAO,CAAC,MAAM;YAC1B,UAAU,EAAE,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC;YACzC,KAAK;YACL,SAAS;YACT,QAAQ,EAAE;gBACR,YAAY,EAAE,OAAO,CAAC,YAAY;gBAClC,eAAe,EAAE,OAAO,CAAC,eAAe;gBACxC,gBAAgB,EAAE,OAAO,CAAC,gBAAgB;gBAC1C,YAAY,EAAE,OAAO,CAAC,YAAY;aACnC;YACD,MAAM;YACN,YAAY;SACb,CAAC;IACJ,CAAC,CAAC,CAAC;AACL,CAAC;AAED;;GAEG;AACH,SAAS,wBAAwB,CAC/B,aAAqB,EACrB,OAAgC,EAChC,gBAAyC;IAQzC,IAAI,CAAC,gBAAgB,IAAI,CAAC,gBAAgB,CAAC,QAAQ,EAAE,CAAC;QACpD,OAAO;YACL,YAAY,EAAE,OAAO,CAAC,MAAM;YAC5B,OAAO,EAAE,CAAC;YACV,OAAO,EAAE,CAAC;YACV,OAAO,EAAE,CAAC;YACV,MAAM,EAAE,SAAS;SAClB,CAAC;IACJ,CAAC;IAED,MAAM,gBAAgB,GAAG,gBAAgB,CAAC,OAAO,CAAC,MAAM,CACtD,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,aAAa,KAAK,aAAa,CACvC,CAAC;IAEF,MAAM,OAAO,GAAG,gBAAgB,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,MAAM,KAAK,QAAQ,CAAC,CAAC,MAAM,CAAC;IAC3E,MAAM,OAAO,GAAG,gBAAgB,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,MAAM,KAAK,QAAQ,CAAC,CAAC,MAAM,CAAC;IAC3E,MAAM,OAAO,GAAG,gBAAgB,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,MAAM,KAAK,SAAS,CAAC,CAAC,MAAM,CAAC;IAE5E,IAAI,MAAqD,CAAC;IAC1D,IAAI,OAAO,KAAK,CAAC,EAAE,CAAC;QAClB,MAAM,GAAG,SAAS,CAAC;IACrB,CAAC;SAAM,IAAI,OAAO,GAAG,gBAAgB,CAAC,MAAM,EAAE,CAAC;QAC7C,MAAM,GAAG,UAAU,CAAC;IACtB,CAAC;SAAM,CAAC;QACN,MAAM,GAAG,QAAQ,CAAC;IACpB,CAAC;IAED,OAAO;QACL,YAAY,EAAE,gBAAgB,CAAC,MAAM;QACrC,OAAO;QACP,OAAO;QACP,OAAO;QACP,MAAM;KACP,CAAC;AACJ,CAAC;AAED;;GAEG;AACH,SAAS,wBAAwB,CAAC,eAAiC;IACjE,MAAM,OAAO,GAAsB,EAAE,CAAC;IAEtC,KAAK,MAAM,MAAM,IAAI,eAAe,EAAE,CAAC;QACrC,MAAM,EAAE,SAAS,EAAE,OAAO,EAAE,YAAY,EAAE,gBAAgB,EAAE,YAAY,EAAE,GAAG,MAAM,CAAC;QACpF,MAAM,UAAU,GAAG,OAAO,CAAC,MAAM,GAAG,CAAC,CAAC;QAEtC,oBAAoB;QACpB,IAAI,CAAC,UAAU,EAAE,CAAC;YAChB,OAAO,CAAC,IAAI,CAAC;gBACX,aAAa,EAAE,SAAS,CAAC,aAAa;gBACtC,aAAa,EAAE,SAAS,CAAC,YAAY;gBACrC,WAAW,EAAE,0BAA0B;gBACvC,MAAM,EAAE,YAAY;gBACpB,QAAQ,EAAE,UAAU;gBACpB,aAAa,EAAE,EAAE;gBACjB,kBAAkB,EAAE,SAAS;gBAC7B,cAAc,EAAE,YAAY,CAAC,MAAM,KAAK,WAAW;aACpD,CAAC,CAAC;YACH,SAAS;QACX,CAAC;QAED,qBAAqB;QACrB,KAAK,MAAM,IAAI,IAAI,YAAY,EAAE,CAAC;YAChC,IAAI,IAAI,CAAC,eAAe,EAAE,CAAC;gBACzB,KAAK,MAAM,OAAO,IAAI,IAAI,CAAC,eAAe,CAAC,MAAM,EAAE,CAAC;oBAClD,IAAI,CAAC,OAAO,CAAC,SAAS,EAAE,CAAC;wBACvB,OAAO,CAAC,IAAI,CAAC;4BACX,aAAa,EAAE,SAAS,CAAC,aAAa;4BACtC,aAAa,EAAE,SAAS,CAAC,YAAY;4BACrC,WAAW,EAAE,GAAG,SAAS,CAAC,aAAa,SAAS,IAAI,CAAC,IAAI,CAAC,IAAI,KAAK,OAAO,CAAC,KAAK,+BAA+B;4BAC/G,MAAM,EAAE,mBAAmB;4BAC3B,QAAQ,EAAE,QAAQ;4BAClB,aAAa,EAAE,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,OAAO,CAAC,KAAK,EAAE;4BAClD,kBAAkB,EAAE,YAAY,CAAC,OAAO,CAAC,KAAK,CAAC;4BAC/C,cAAc,EAAE,YAAY,CAAC,MAAM,KAAK,WAAW;yBACpD,CAAC,CAAC;oBACL,CAAC;gBACH,CAAC;YACH,CAAC;YAED,gCAAgC;YAChC,IAAI,YAAY,CAAC,QAAQ,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,CAAC;gBACtE,OAAO,CAAC,IAAI,CAAC;oBACX,aAAa,EAAE,SAAS,CAAC,aAAa;oBACtC,aAAa,EAAE,SAAS,CAAC,YAAY;oBACrC,WAAW,EAAE,aAAa,IAAI,CAAC,IAAI,CAAC,IAAI,yBAAyB;oBACjE,MAAM,EAAE,oBAAoB;oBAC5B,QAAQ,EAAE,MAAM;oBAChB,aAAa,EAAE,kBAAkB,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC;oBACjE,kBAAkB,EAAE,OAAO,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE;oBACzD,cAAc,EAAE,IAAI;iBACrB,CAAC,CAAC;YACL,CAAC;YAED,qCAAqC;YACrC,IAAI,IAAI,CAAC,IAAI,CAAC,QAAQ,IAAI,CAAC,IAAI,CAAC,SAAS,IAAI,CAAC,YAAY,CAAC,QAAQ,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;gBAC7F,OAAO,CAAC,IAAI,CAAC;oBACX,aAAa,EAAE,SAAS,CAAC,aAAa;oBACtC,aAAa,EAAE,SAAS,CAAC,YAAY;oBACrC,WAAW,EAAE,kBAAkB,IAAI,CAAC,IAAI,CAAC,IAAI,4BAA4B;oBACzE,MAAM,EAAE,yBAAyB;oBACjC,QAAQ,EAAE,QAAQ;oBAClB,aAAa,EAAE,kBAAkB,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC;oBACjE,kBAAkB,EAAE,OAAO,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE;oBACzD,cAAc,EAAE,YAAY,CAAC,MAAM,KAAK,WAAW;iBACpD,CAAC,CAAC;YACL,CAAC;QACH,CAAC;QAED,sBAAsB;QACtB,KAAK,MAAM,QAAQ,IAAI,gBAAgB,EAAE,CAAC;YACxC,IAAI,CAAC,QAAQ,CAAC,SAAS,EAAE,CAAC;gBACxB,MAAM,eAAe,GAAG,QAAQ,CAAC,QAAQ,CAAC,gBAAgB,CAAC,CAAC,CAAC,CAAC;gBAC9D,OAAO,CAAC,IAAI,CAAC;oBACX,aAAa,EAAE,SAAS,CAAC,aAAa;oBACtC,aAAa,EAAE,SAAS,CAAC,YAAY;oBACrC,WAAW,EAAE,aAAa,QAAQ,CAAC,QAAQ,CAAC,IAAI,kBAAkB;oBAClE,MAAM,EAAE,iBAAiB;oBACzB,QAAQ,EAAE,QAAQ,CAAC,QAAQ,CAAC,QAAQ;oBACpC,aAAa,EAAE,EAAE,CAAC,eAAe,CAAC,EAAE,IAAI,EAAE;oBAC1C,kBAAkB,EAAE,YAAY,CAAC,QAAQ,CAAC,QAAQ,CAAC,EAAE,CAAC,OAAO,CAAC,QAAQ,EAAE,EAAE,CAAC,CAAC;oBAC5E,cAAc,EAAE,YAAY,CAAC,MAAM,KAAK,WAAW;iBACpD,CAAC,CAAC;YACL,CAAC;QACH,CAAC;IACH,CAAC;IAED,mBAAmB;IACnB,MAAM,aAAa,GAAG,EAAE,QAAQ,EAAE,CAAC,EAAE,IAAI,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,GAAG,EAAE,CAAC,EAAE,CAAC;IAClE,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,aAAa,CAAC,CAAC,CAAC,QAAQ,CAAC,GAAG,aAAa,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC;IAE9E,OAAO,OAAO,CAAC;AACjB,CAAC;AAED;;GAEG;AACH,SAAS,2BAA2B,CAAC,eAAiC;IACpE,MAAM,SAAS,GAAyB,EAAE,CAAC;IAE3C,KAAK,MAAM,MAAM,IAAI,eAAe,EAAE,CAAC;QACrC,IAAI,MAAM,CAAC,OAAO,CAAC,MAAM,GAAG,CAAC;YAAE,SAAS;QAExC,MAAM,EAAE,SAAS,EAAE,YAAY,EAAE,GAAG,MAAM,CAAC;QAE3C,MAAM,SAAS,GAAG,SAAS,CAAC,KAAK,CAAC,MAAM,CAAC;QACzC,MAAM,iBAAiB,GAAG,SAAS,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC;QACzE,MAAM,iBAAiB,GAAG,SAAS,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;QAE/D,sBAAsB;QACtB,IAAI,UAAU,GAA8B,KAAK,CAAC;QAClD,IAAI,SAAS,GAAG,EAAE,IAAI,iBAAiB,GAAG,CAAC,IAAI,iBAAiB,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAC5E,UAAU,GAAG,MAAM,CAAC;QACtB,CAAC;aAAM,IAAI,SAAS,GAAG,CAAC,IAAI,iBAAiB,GAAG,CAAC,IAAI,iBAAiB,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAClF,UAAU,GAAG,QAAQ,CAAC;QACxB,CAAC;QAED,SAAS,CAAC,IAAI,CAAC;YACb,aAAa,EAAE,SAAS,CAAC,aAAa;YACtC,QAAQ,EAAE,SAAS,CAAC,QAAQ;YAC5B,YAAY,EAAE,SAAS,CAAC,YAAY;YACpC,aAAa,EAAE,SAAS,CAAC,aAAa;YACtC,SAAS;YACT,iBAAiB;YACjB,iBAAiB;YACjB,KAAK,EAAE,YAAY,CAAC,MAAM,KAAK,KAAK;YACpC,iBAAiB,EAAE,oBAAoB,CAAC,SAAS,CAAC,YAAY,CAAC;YAC/D,UAAU;SACX,CAAC,CAAC;IACL,CAAC;IAED,yCAAyC;IACzC,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE;QACtB,IAAI,CAAC,CAAC,KAAK,KAAK,CAAC,CAAC,KAAK;YAAE,OAAO,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QACjD,MAAM,eAAe,GAAG,EAAE,IAAI,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,GAAG,EAAE,CAAC,EAAE,CAAC;QACvD,OAAO,eAAe,CAAC,CAAC,CAAC,UAAU,CAAC,GAAG,eAAe,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC;IACvE,CAAC,CAAC,CAAC;IAEH,OAAO,SAAS,CAAC;AACnB,CAAC;AAED;;GAEG;AACH,SAAS,YAAY,CACnB,eAAiC,EACjC,UAA6B,EAC7B,iBAKC,EACD,gBAAyC;IAEzC,MAAM,eAAe,GAAG,eAAe,CAAC,MAAM,CAAC;IAC/C,MAAM,qBAAqB,GAAG,eAAe,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,MAAM,CAAC;IACvF,MAAM,wBAAwB,GAAG,eAAe,GAAG,qBAAqB,CAAC;IAEzE,MAAM,YAAY,GAAG,UAAU,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,CAAC,EAAE,EAAE,CAAC,GAAG,GAAG,CAAC,CAAC,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC;IAE9E,MAAM,OAAO,GAAoB;QAC/B,iBAAiB,EAAE,iBAAiB,CAAC,iBAAiB;QACtD,YAAY,EAAE,iBAAiB,CAAC,YAAY;QAC5C,eAAe,EAAE,iBAAiB,CAAC,eAAe;QAClD,gBAAgB,EAAE,iBAAiB,CAAC,gBAAgB;KACrD,CAAC;IAEF,MAAM,MAAM,GAAkB,kBAAkB,CAAC,gBAAgB,CAAC,CAAC;IAEnE,OAAO;QACL,eAAe;QACf,qBAAqB;QACrB,wBAAwB;QACxB,eAAe,EAAE,UAAU,CAAC,MAAM;QAClC,YAAY;QACZ,OAAO;QACP,MAAM;KACP,CAAC;AACJ,CAAC;AAED;;GAEG;AACH,SAAS,kBAAkB,CAAC,gBAAyC;IACnE,IAAI,CAAC,gBAAgB,IAAI,CAAC,gBAAgB,CAAC,QAAQ,EAAE,CAAC;QACpD,OAAO;YACL,MAAM,EAAE,cAAc;YACtB,cAAc,EAAE,CAAC;YACjB,cAAc,EAAE,CAAC;YACjB,QAAQ,EAAE,CAAC;SACZ,CAAC;IACJ,CAAC;IAED,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,GAAG,gBAAgB,CAAC,OAAO,CAAC;IAC3D,MAAM,QAAQ,GAAG,KAAK,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,MAAM,GAAG,KAAK,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;IAExD,IAAI,MAA0D,CAAC;IAC/D,IAAI,MAAM,KAAK,CAAC,EAAE,CAAC;QACjB,MAAM,GAAG,SAAS,CAAC;IACrB,CAAC;SAAM,IAAI,QAAQ,IAAI,EAAE,EAAE,CAAC;QAC1B,MAAM,GAAG,UAAU,CAAC;IACtB,CAAC;SAAM,CAAC;QACN,MAAM,GAAG,QAAQ,CAAC;IACpB,CAAC;IAED,OAAO;QACL,MAAM;QACN,cAAc,EAAE,MAAM;QACtB,cAAc,EAAE,MAAM;QACtB,QAAQ;KACT,CAAC;AACJ,CAAC;AAED;;GAEG;AACH,SAAS,eAAe,CAAC,WAA+B;IACtD,IAAI,CAAC,WAAW,IAAI,CAAC,WAAW,CAAC,OAAO,EAAE,CAAC;QACzC,OAAO;YACL,SAAS,EAAE,EAAE;YACb,MAAM,EAAE,EAAE;YACV,UAAU,EAAE,IAAI;YAChB,aAAa,EAAE,IAAI;SACpB,CAAC;IACJ,CAAC;IAED,OAAO;QACL,SAAS,EAAE,WAAW,CAAC,gBAAgB;QACvC,MAAM,EAAE,WAAW,CAAC,aAAa;QACjC,UAAU,EAAE,WAAW,CAAC,UAAU;QAClC,aAAa,EAAE,WAAW,CAAC,aAAa;KACzC,CAAC;AACJ,CAAC;AAED;;GAEG;AACH,SAAS,oBAAoB,CAC3B,WAA+B,EAC/B,OAKC;IAED,MAAM,OAAO,GAAG,WAAW,EAAE,OAAO,IAAI,KAAK,CAAC;IAC9C,MAAM,KAAK,GAAG,OAAO;QACnB,CAAC,CAAC,GAAG,WAAY,CAAC,UAAU,KAAK,WAAY,CAAC,aAAa,CAAC,SAAS,CAAC,CAAC,EAAE,CAAC,CAAC,GAAG;QAC9E,CAAC,CAAC,EAAE,CAAC;IAEP,OAAO;QACL,OAAO;QACP,KAAK;QACL,aAAa,EAAE,OAAO,CAAC,aAAa;QACpC,kBAAkB,EAAE,OAAO,CAAC,kBAAkB;QAC9C,iBAAiB,EAAE,OAAO,CAAC,iBAAiB;QAC5C,sBAAsB,EAAE,OAAO,CAAC,sBAAsB;KACvD,CAAC;AACJ,CAAC;AAED;;GAEG;AACH,SAAS,iBAAiB,CAAC,MAAkB;IAC3C,OAAO;QACL,OAAO,EAAE,MAAM,CAAC,OAAO;QACvB,OAAO,EAAE,MAAM,CAAC,OAAO;QACvB,aAAa,EAAE,MAAM,CAAC,aAAa;QACnC,eAAe,EAAE,MAAM,CAAC,iBAAiB;QACzC,UAAU,EAAE,MAAM,CAAC,iBAAiB,CAAC,CAAC,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC,CAAC,IAAI;QAC/D,UAAU,EAAE,MAAM,CAAC,UAAU;KAC9B,CAAC;AACJ,CAAC;AAED;;GAEG;AACH,SAAS,gBAAgB,CACvB,iBAKC,EACD,cAGC,EACD,gBAAyC,EACzC,MAAkB;IAElB,MAAM,MAAM,GAAmB,EAAE,CAAC;IAElC,2BAA2B;IAC3B,MAAM,CAAC,IAAI,CAAC;QACV,IAAI,EAAE,oBAAoB;QAC1B,SAAS,EAAE,MAAM,CAAC,UAAU,CAAC,iBAAiB;QAC9C,MAAM,EAAE,iBAAiB,CAAC,iBAAiB;QAC3C,MAAM,EAAE,iBAAiB,CAAC,iBAAiB,IAAI,MAAM,CAAC,UAAU,CAAC,iBAAiB;QAClF,OAAO,EAAE,iBAAiB,CAAC,iBAAiB,IAAI,MAAM,CAAC,UAAU,CAAC,iBAAiB;YACjF,CAAC,CAAC,GAAG,iBAAiB,CAAC,iBAAiB,CAAC,OAAO,CAAC,CAAC,CAAC,QAAQ,MAAM,CAAC,UAAU,CAAC,iBAAiB,aAAa;YAC3G,CAAC,CAAC,GAAG,iBAAiB,CAAC,iBAAiB,CAAC,OAAO,CAAC,CAAC,CAAC,OAAO,MAAM,CAAC,UAAU,CAAC,iBAAiB,aAAa;KAC7G,CAAC,CAAC;IAEH,sBAAsB;IACtB,MAAM,CAAC,IAAI,CAAC;QACV,IAAI,EAAE,eAAe;QACrB,SAAS,EAAE,MAAM,CAAC,UAAU,CAAC,YAAY;QACzC,MAAM,EAAE,iBAAiB,CAAC,YAAY;QACtC,MAAM,EAAE,iBAAiB,CAAC,YAAY,IAAI,MAAM,CAAC,UAAU,CAAC,YAAY;QACxE,OAAO,EAAE,iBAAiB,CAAC,YAAY,IAAI,MAAM,CAAC,UAAU,CAAC,YAAY;YACvE,CAAC,CAAC,GAAG,iBAAiB,CAAC,YAAY,CAAC,OAAO,CAAC,CAAC,CAAC,QAAQ,MAAM,CAAC,UAAU,CAAC,YAAY,aAAa;YACjG,CAAC,CAAC,GAAG,iBAAiB,CAAC,YAAY,CAAC,OAAO,CAAC,CAAC,CAAC,OAAO,MAAM,CAAC,UAAU,CAAC,YAAY,aAAa;KACnG,CAAC,CAAC;IAEH,yBAAyB;IACzB,MAAM,CAAC,IAAI,CAAC;QACV,IAAI,EAAE,kBAAkB;QACxB,SAAS,EAAE,MAAM,CAAC,UAAU,CAAC,eAAe;QAC5C,MAAM,EAAE,iBAAiB,CAAC,eAAe;QACzC,MAAM,EAAE,iBAAiB,CAAC,eAAe,IAAI,MAAM,CAAC,UAAU,CAAC,eAAe;QAC9E,OAAO,EAAE,iBAAiB,CAAC,eAAe,IAAI,MAAM,CAAC,UAAU,CAAC,eAAe;YAC7E,CAAC,CAAC,GAAG,iBAAiB,CAAC,eAAe,CAAC,OAAO,CAAC,CAAC,CAAC,QAAQ,MAAM,CAAC,UAAU,CAAC,eAAe,aAAa;YACvG,CAAC,CAAC,GAAG,iBAAiB,CAAC,eAAe,CAAC,OAAO,CAAC,CAAC,CAAC,OAAO,MAAM,CAAC,UAAU,CAAC,eAAe,aAAa;KACzG,CAAC,CAAC;IAEH,4DAA4D;IAC5D,IAAI,MAAM,CAAC,iBAAiB,EAAE,CAAC;QAC7B,MAAM,eAAe,GAAG,cAAc,CAAC,aAAa,CAAC,QAAQ,CAAC;QAC9D,MAAM,CAAC,IAAI,CAAC;YACV,IAAI,EAAE,mBAAmB;YACzB,SAAS,EAAE,MAAM,CAAC,UAAU,CAAC,eAAe;YAC5C,MAAM,EAAE,eAAe;YACvB,MAAM,EAAE,eAAe,IAAI,MAAM,CAAC,UAAU,CAAC,eAAe;YAC5D,OAAO,EAAE,eAAe,IAAI,MAAM,CAAC,UAAU,CAAC,eAAe;gBAC3D,CAAC,CAAC,GAAG,eAAe,CAAC,OAAO,CAAC,CAAC,CAAC,QAAQ,MAAM,CAAC,UAAU,CAAC,eAAe,aAAa;gBACrF,CAAC,CAAC,GAAG,eAAe,CAAC,OAAO,CAAC,CAAC,CAAC,OAAO,MAAM,CAAC,UAAU,CAAC,eAAe,aAAa;SACvF,CAAC,CAAC;IACL,CAAC;IAED,oCAAoC;IACpC,IAAI,gBAAgB,EAAE,QAAQ,EAAE,CAAC;QAC/B,MAAM,WAAW,GAAG,gBAAgB,CAAC,UAAU,EAAE,WAAW,CAAC,MAAM,IAAI,CAAC,CAAC;QACzE,MAAM,CAAC,IAAI,CAAC;YACV,IAAI,EAAE,iBAAiB;YACvB,SAAS,EAAE,CAAC;YACZ,MAAM,EAAE,WAAW;YACnB,MAAM,EAAE,WAAW,KAAK,CAAC;YACzB,OAAO,EAAE,WAAW,KAAK,CAAC;gBACxB,CAAC,CAAC,kCAAkC;gBACpC,CAAC,CAAC,GAAG,WAAW,kCAAkC;SACrD,CAAC,CAAC;IACL,CAAC;IAED,MAAM,MAAM,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC;IAE3C,OAAO;QACL,MAAM;QACN,MAAM;KACP,CAAC;AACJ,CAAC;AAED;;GAEG;AACH,SAAS,YAAY,CAAC,GAAW;IAC/B,OAAO,GAAG;SACP,KAAK,CAAC,SAAS,CAAC;SAChB,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,WAAW,EAAE,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,WAAW,EAAE,CAAC;SACvE,IAAI,CAAC,EAAE,CAAC,CAAC;AACd,CAAC;AAED;;GAEG;AACH,SAAS,kBAAkB,CAAC,QAAgB,EAAE,QAAgB;IAC5D,MAAM,IAAI,GAA4B,EAAE,CAAC;IAEzC,IAAI,QAAQ,CAAC,QAAQ,CAAC,SAAS,CAAC,EAAE,CAAC;QACjC,IAAI,CAAC,QAAQ,CAAC,GAAG,IAAI,CAAC;IACxB,CAAC;SAAM,IAAI,QAAQ,CAAC,QAAQ,CAAC,QAAQ,CAAC,EAAE,CAAC;QACvC,IAAI,CAAC,QAAQ,CAAC,GAAG,eAAe,CAAC;IACnC,CAAC;SAAM,IAAI,QAAQ,CAAC,QAAQ,CAAC,QAAQ,CAAC,EAAE,CAAC;QACvC,IAAI,CAAC,QAAQ,CAAC,GAAG,EAAE,CAAC;IACtB,CAAC;SAAM,IAAI,QAAQ,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC;QAClC,+BAA+B;QAC/B,MAAM,KAAK,GAAG,QAAQ,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC;QAC1C,IAAI,KAAK,EAAE,CAAC;YACV,IAAI,CAAC,QAAQ,CAAC,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC;QAC5B,CAAC;IACH,CAAC;SAAM,CAAC;QACN,IAAI,CAAC,QAAQ,CAAC,GAAG,SAAS,CAAC;IAC7B,CAAC;IAED,OAAO,IAAI,CAAC;AACd,CAAC"}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Story Executor
|
|
3
|
+
* Executes stories in a real browser to detect runtime failures using Playwright
|
|
4
|
+
*/
|
|
5
|
+
import type { ParsedStoryFile, ExecutionConfig, ExecutionResults, RegressionAnalysis } from '../types/index.js';
|
|
6
|
+
/**
|
|
7
|
+
* Execute stories and capture failures
|
|
8
|
+
*/
|
|
9
|
+
export declare function executeStories(storyFiles: ParsedStoryFile[], config: ExecutionConfig, verbose?: boolean): Promise<ExecutionResults>;
|
|
10
|
+
/**
|
|
11
|
+
* Compare execution results with a baseline for regression analysis
|
|
12
|
+
*/
|
|
13
|
+
export declare function analyzeRegression(currentResults: ExecutionResults, baselineResults: ExecutionResults | null, baselineRef: string): RegressionAnalysis;
|
|
14
|
+
/**
|
|
15
|
+
* Load baseline results from a file
|
|
16
|
+
*/
|
|
17
|
+
export declare function loadBaseline(baselinePath: string): ExecutionResults | null;
|
|
18
|
+
/**
|
|
19
|
+
* Check if Playwright is available
|
|
20
|
+
*/
|
|
21
|
+
export declare function isPlaywrightAvailable(): Promise<boolean>;
|
|
22
|
+
//# sourceMappingURL=story-executor.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"story-executor.d.ts","sourceRoot":"","sources":["../../src/core/story-executor.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAKH,OAAO,KAAK,EACV,eAAe,EAEf,eAAe,EAIf,gBAAgB,EAChB,kBAAkB,EACnB,MAAM,mBAAmB,CAAC;AAgB3B;;GAEG;AACH,wBAAsB,cAAc,CAClC,UAAU,EAAE,eAAe,EAAE,EAC7B,MAAM,EAAE,eAAe,EACvB,OAAO,UAAQ,GACd,OAAO,CAAC,gBAAgB,CAAC,CAyG3B;AAkQD;;GAEG;AACH,wBAAgB,iBAAiB,CAC/B,cAAc,EAAE,gBAAgB,EAChC,eAAe,EAAE,gBAAgB,GAAG,IAAI,EACxC,WAAW,EAAE,MAAM,GAClB,kBAAkB,CAyCpB;AAED;;GAEG;AACH,wBAAgB,YAAY,CAAC,YAAY,EAAE,MAAM,GAAG,gBAAgB,GAAG,IAAI,CAa1E;AAED;;GAEG;AACH,wBAAsB,qBAAqB,IAAI,OAAO,CAAC,OAAO,CAAC,CAG9D"}
|