@anselmdk/feature-spec-md 0.6.2 → 0.7.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/dist/playwright.d.ts +3 -3
- package/dist/playwright.d.ts.map +1 -1
- package/dist/playwright.js +62 -15
- package/dist/playwright.js.map +1 -1
- package/dist/reportTemplate.d.ts.map +1 -1
- package/dist/reportTemplate.js +57 -97
- package/dist/reportTemplate.js.map +1 -1
- package/dist/screenshots.d.ts +1 -3
- package/dist/screenshots.d.ts.map +1 -1
- package/dist/screenshots.js +20 -23
- package/dist/screenshots.js.map +1 -1
- package/dist/types.d.ts +3 -23
- package/dist/types.d.ts.map +1 -1
- package/package.json +1 -1
- package/src/mocks/current/screenshots/screenshots.json +19 -1
- package/src/mocks/previous/screenshots/screenshots.json +10 -1
package/dist/playwright.d.ts
CHANGED
|
@@ -9,9 +9,11 @@ export type SpecEvidenceStep = {
|
|
|
9
9
|
export type SpecEvidenceScreenshot = {
|
|
10
10
|
specPath: string;
|
|
11
11
|
line: number;
|
|
12
|
-
|
|
12
|
+
changed: boolean;
|
|
13
|
+
path?: string;
|
|
13
14
|
title: string;
|
|
14
15
|
testPath: string;
|
|
16
|
+
comparedWithLine?: number;
|
|
15
17
|
};
|
|
16
18
|
export type PlaywrightSpecEvidenceOptions = {
|
|
17
19
|
specs: string[];
|
|
@@ -36,10 +38,8 @@ export type PlaywrightTestInfoLike = {
|
|
|
36
38
|
export type PlaywrightTestLike = {
|
|
37
39
|
step<T>(title: string, body: () => Promise<T>): Promise<T>;
|
|
38
40
|
};
|
|
39
|
-
/** Create a Playwright helper that captures screenshot evidence for spec step lines. */
|
|
40
41
|
export declare function createPlaywrightSpecEvidence(test: PlaywrightTestLike, options: PlaywrightSpecEvidenceOptions): {
|
|
41
42
|
specStep(page: PlaywrightPageLike, testInfo: PlaywrightTestInfoLike, scenarioId: string, stepText: string, body: () => Promise<void>): Promise<void>;
|
|
42
43
|
};
|
|
43
|
-
/** Parse spec files and return all scenario step lines addressable by Playwright tests. */
|
|
44
44
|
export declare function loadSpecSteps(patterns: string[], cwd?: string): Promise<SpecEvidenceStep[]>;
|
|
45
45
|
//# sourceMappingURL=playwright.d.ts.map
|
package/dist/playwright.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"playwright.d.ts","sourceRoot":"","sources":["../src/playwright.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"playwright.d.ts","sourceRoot":"","sources":["../src/playwright.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAE9C,MAAM,MAAM,gBAAgB,GAAG;IAC7B,UAAU,EAAE,MAAM,CAAC;IACnB,QAAQ,EAAE,MAAM,CAAC;IACjB,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,WAAW,CAAC;IACrB,IAAI,EAAE,MAAM,CAAC;CACd,CAAC;AAEF,MAAM,MAAM,sBAAsB,GAAG;IACnC,QAAQ,EAAE,MAAM,CAAC;IACjB,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,OAAO,CAAC;IACjB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,MAAM,CAAC;IACjB,gBAAgB,CAAC,EAAE,MAAM,CAAC;CAC3B,CAAC;AAEF,MAAM,MAAM,6BAA6B,GAAG;IAC1C,KAAK,EAAE,MAAM,EAAE,CAAC;IAChB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,kBAAkB,CAAC,EAAE,MAAM,CAAC;IAC5B,GAAG,CAAC,EAAE,MAAM,CAAC;CACd,CAAC;AAEF,MAAM,MAAM,kBAAkB,GAAG;IAC/B,UAAU,CAAC,OAAO,EAAE;QAAE,QAAQ,CAAC,EAAE,OAAO,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;CAC7E,CAAC;AAEF,MAAM,MAAM,sBAAsB,GAAG;IACnC,MAAM,CACJ,IAAI,EAAE,MAAM,EACZ,OAAO,EAAE;QAAE,WAAW,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,GAC7C,OAAO,CAAC,OAAO,CAAC,CAAC;IACpB,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;CACrB,CAAC;AAEF,MAAM,MAAM,kBAAkB,GAAG;IAC/B,IAAI,CAAC,CAAC,EAAE,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,OAAO,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC;CAC5D,CAAC;AAOF,wBAAgB,4BAA4B,CAC1C,IAAI,EAAE,kBAAkB,EACxB,OAAO,EAAE,6BAA6B;mBAe5B,kBAAkB,YACd,sBAAsB,cACpB,MAAM,YACR,MAAM,QACV,MAAM,OAAO,CAAC,IAAI,CAAC;EA0B9B;AAED,wBAAsB,aAAa,CAAC,QAAQ,EAAE,MAAM,EAAE,EAAE,GAAG,SAAgB,+BA2B1E"}
|
package/dist/playwright.js
CHANGED
|
@@ -1,12 +1,8 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
* and capturing screenshot evidence tied to exact spec lines.
|
|
4
|
-
*/
|
|
5
|
-
import { mkdir, readFile, writeFile } from "node:fs/promises";
|
|
1
|
+
import { createHash } from "node:crypto";
|
|
2
|
+
import { mkdir, readFile, rm, writeFile } from "node:fs/promises";
|
|
6
3
|
import path from "node:path";
|
|
7
4
|
import { parseFeatureSpec } from "./featureSpecs.js";
|
|
8
5
|
import { expandFilePatterns } from "./filePatterns.js";
|
|
9
|
-
/** Create a Playwright helper that captures screenshot evidence for spec step lines. */
|
|
10
6
|
export function createPlaywrightSpecEvidence(test, options) {
|
|
11
7
|
const cwd = options.cwd ?? process.cwd();
|
|
12
8
|
const reportDir = path.resolve(cwd, options.reportDir ?? "test-results/spec-report");
|
|
@@ -14,17 +10,25 @@ export function createPlaywrightSpecEvidence(test, options) {
|
|
|
14
10
|
const screenshotDir = path.join(reportDir, screenshotsDirName);
|
|
15
11
|
const stepsPromise = loadSpecSteps(options.specs, cwd);
|
|
16
12
|
const entriesByWorker = new Map();
|
|
13
|
+
const screenStateByScenario = new Map();
|
|
17
14
|
return {
|
|
18
15
|
async specStep(page, testInfo, scenarioId, stepText, body) {
|
|
19
16
|
const step = await findSpecStep(stepsPromise, scenarioId, stepText);
|
|
20
17
|
await test.step(`${step.keyword} ${step.text}`, async () => {
|
|
18
|
+
const stateKey = screenStateKey(testInfo, scenarioId);
|
|
19
|
+
if (!screenStateByScenario.has(stateKey)) {
|
|
20
|
+
const baseline = await capturePageBuffer(page, reportDir, "baseline");
|
|
21
|
+
screenStateByScenario.set(stateKey, { hash: screenshotHash(baseline) });
|
|
22
|
+
}
|
|
21
23
|
await body();
|
|
22
|
-
await
|
|
24
|
+
await captureStepEvidence({
|
|
23
25
|
entriesByWorker,
|
|
24
26
|
page,
|
|
25
27
|
reportDir,
|
|
26
28
|
screenshotDir,
|
|
27
29
|
screenshotsDirName,
|
|
30
|
+
screenStateByScenario,
|
|
31
|
+
stateKey,
|
|
28
32
|
step,
|
|
29
33
|
testInfo,
|
|
30
34
|
});
|
|
@@ -32,7 +36,6 @@ export function createPlaywrightSpecEvidence(test, options) {
|
|
|
32
36
|
},
|
|
33
37
|
};
|
|
34
38
|
}
|
|
35
|
-
/** Parse spec files and return all scenario step lines addressable by Playwright tests. */
|
|
36
39
|
export async function loadSpecSteps(patterns, cwd = process.cwd()) {
|
|
37
40
|
const previousCwd = process.cwd();
|
|
38
41
|
const steps = [];
|
|
@@ -65,31 +68,75 @@ async function findSpecStep(stepsPromise, scenarioId, stepText) {
|
|
|
65
68
|
}
|
|
66
69
|
return step;
|
|
67
70
|
}
|
|
68
|
-
async function
|
|
71
|
+
async function captureStepEvidence(options) {
|
|
72
|
+
const currentBuffer = await capturePageBuffer(options.page, options.reportDir, `line-${options.step.line}`);
|
|
73
|
+
const currentHash = screenshotHash(currentBuffer);
|
|
74
|
+
const previousState = options.screenStateByScenario.get(options.stateKey);
|
|
75
|
+
const title = `${options.step.scenarioId}:${options.step.line} ${options.step.keyword} ${options.step.text}`;
|
|
76
|
+
if (previousState?.hash === currentHash && previousState.line !== undefined) {
|
|
77
|
+
await recordEvidence(options, {
|
|
78
|
+
specPath: options.step.specPath,
|
|
79
|
+
line: options.step.line,
|
|
80
|
+
changed: false,
|
|
81
|
+
title: `${title} (unchanged)`,
|
|
82
|
+
testPath: options.testInfo.file,
|
|
83
|
+
comparedWithLine: previousState.line,
|
|
84
|
+
});
|
|
85
|
+
options.screenStateByScenario.set(options.stateKey, {
|
|
86
|
+
hash: currentHash,
|
|
87
|
+
line: options.step.line,
|
|
88
|
+
});
|
|
89
|
+
return;
|
|
90
|
+
}
|
|
69
91
|
await mkdir(options.screenshotDir, { recursive: true });
|
|
70
92
|
const fileName = `${options.step.scenarioId}-line-${options.step.line}-${slug(options.step.text)}.png`;
|
|
71
93
|
const screenshotPath = path.join(options.screenshotDir, fileName);
|
|
72
94
|
const relativePath = `${options.screenshotsDirName}/${fileName}`;
|
|
73
|
-
|
|
74
|
-
await options.page.screenshot({ fullPage: true, path: screenshotPath });
|
|
95
|
+
await writeFile(screenshotPath, currentBuffer);
|
|
75
96
|
await options.testInfo.attach(title, {
|
|
76
97
|
contentType: "image/png",
|
|
77
98
|
path: screenshotPath,
|
|
78
99
|
});
|
|
79
|
-
|
|
80
|
-
entries.push({
|
|
100
|
+
await recordEvidence(options, {
|
|
81
101
|
specPath: options.step.specPath,
|
|
82
102
|
line: options.step.line,
|
|
103
|
+
changed: true,
|
|
83
104
|
path: relativePath,
|
|
84
105
|
title,
|
|
85
106
|
testPath: options.testInfo.file,
|
|
86
107
|
});
|
|
108
|
+
options.screenStateByScenario.set(options.stateKey, {
|
|
109
|
+
hash: currentHash,
|
|
110
|
+
line: options.step.line,
|
|
111
|
+
});
|
|
112
|
+
}
|
|
113
|
+
async function recordEvidence(options, entry) {
|
|
114
|
+
const entries = options.entriesByWorker.get(options.testInfo.workerIndex) ?? [];
|
|
115
|
+
entries.push(entry);
|
|
87
116
|
options.entriesByWorker.set(options.testInfo.workerIndex, entries);
|
|
88
117
|
await writeWorkerManifest(options.reportDir, options.testInfo.workerIndex, entries);
|
|
89
118
|
}
|
|
90
|
-
async function
|
|
119
|
+
async function capturePageBuffer(page, reportDir, label) {
|
|
120
|
+
const tempDir = path.join(reportDir, ".visual-evidence-tmp");
|
|
121
|
+
await mkdir(tempDir, { recursive: true });
|
|
122
|
+
const tempPath = path.join(tempDir, `${process.pid}-${Date.now()}-${slug(label)}.png`);
|
|
123
|
+
try {
|
|
124
|
+
await page.screenshot({ fullPage: true, path: tempPath });
|
|
125
|
+
return await readFile(tempPath);
|
|
126
|
+
}
|
|
127
|
+
finally {
|
|
128
|
+
await rm(tempPath, { force: true });
|
|
129
|
+
}
|
|
130
|
+
}
|
|
131
|
+
function screenshotHash(buffer) {
|
|
132
|
+
return createHash("sha256").update(buffer).digest("hex");
|
|
133
|
+
}
|
|
134
|
+
function screenStateKey(testInfo, scenarioId) {
|
|
135
|
+
return `${testInfo.workerIndex}:${testInfo.file}:${scenarioId}`;
|
|
136
|
+
}
|
|
137
|
+
async function writeWorkerManifest(reportDir, workerIndex, evidence) {
|
|
91
138
|
await mkdir(reportDir, { recursive: true });
|
|
92
|
-
await writeFile(path.join(reportDir, `screenshots-${workerIndex}.json`), JSON.stringify({
|
|
139
|
+
await writeFile(path.join(reportDir, `screenshots-${workerIndex}.json`), JSON.stringify({ evidence }, null, 2), "utf8");
|
|
93
140
|
}
|
|
94
141
|
function slug(value) {
|
|
95
142
|
return value
|
package/dist/playwright.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"playwright.js","sourceRoot":"","sources":["../src/playwright.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"playwright.js","sourceRoot":"","sources":["../src/playwright.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"reportTemplate.d.ts","sourceRoot":"","sources":["../src/reportTemplate.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAEV,eAAe,EACf,UAAU,EACV,WAAW,EAEX,SAAS,EACT,cAAc,EACd,SAAS,EAET,eAAe,EAChB,MAAM,YAAY,CAAC;AAEpB,MAAM,MAAM,aAAa,GAAG;IAC1B,QAAQ,CAAC,EAAE,eAAe,CAAC;IAC3B,MAAM,CAAC,EAAE,SAAS,EAAE,CAAC;IACrB,MAAM,CAAC,EAAE,SAAS,EAAE,CAAC;IACrB,OAAO,CAAC,EAAE,UAAU,EAAE,CAAC;IACvB,WAAW,CAAC,EAAE,cAAc,EAAE,CAAC;IAC/B,gBAAgB,CAAC,EAAE,eAAe,EAAE,CAAC;IACrC,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,aAAa,CAAC,EAAE,MAAM,CAAC;CACxB,CAAC;AAYF,wBAAgB,gBAAgB,
|
|
1
|
+
{"version":3,"file":"reportTemplate.d.ts","sourceRoot":"","sources":["../src/reportTemplate.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAEV,eAAe,EACf,UAAU,EACV,WAAW,EAEX,SAAS,EACT,cAAc,EACd,SAAS,EAET,eAAe,EAChB,MAAM,YAAY,CAAC;AAEpB,MAAM,MAAM,aAAa,GAAG;IAC1B,QAAQ,CAAC,EAAE,eAAe,CAAC;IAC3B,MAAM,CAAC,EAAE,SAAS,EAAE,CAAC;IACrB,MAAM,CAAC,EAAE,SAAS,EAAE,CAAC;IACrB,OAAO,CAAC,EAAE,UAAU,EAAE,CAAC;IACvB,WAAW,CAAC,EAAE,cAAc,EAAE,CAAC;IAC/B,gBAAgB,CAAC,EAAE,eAAe,EAAE,CAAC;IACrC,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,aAAa,CAAC,EAAE,MAAM,CAAC;CACxB,CAAC;AAYF,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,WAAW,EAAE,EAAE,OAAO,GAAE,aAAkB,UAcjF"}
|
package/dist/reportTemplate.js
CHANGED
|
@@ -3,7 +3,7 @@ import { renderHtmlPage } from "./reportHtml.js";
|
|
|
3
3
|
import { screenshotKey } from "./screenshots.js";
|
|
4
4
|
export function renderHtmlReport(specs, options = {}) {
|
|
5
5
|
const title = options.title ?? "Feature Spec Report";
|
|
6
|
-
const
|
|
6
|
+
const evidence = options.screenshots ?? [];
|
|
7
7
|
const sourceLinks = {
|
|
8
8
|
githubBaseUrl: options.githubBaseUrl,
|
|
9
9
|
githubRef: options.githubRef,
|
|
@@ -12,21 +12,21 @@ export function renderHtmlReport(specs, options = {}) {
|
|
|
12
12
|
title,
|
|
13
13
|
styles: featureReportStyles(),
|
|
14
14
|
scripts: featureReportScripts(),
|
|
15
|
-
body: featureReportBody({ specs, options,
|
|
15
|
+
body: featureReportBody({ specs, options, evidence, sourceLinks, title }),
|
|
16
16
|
});
|
|
17
17
|
}
|
|
18
|
-
function featureReportBody({ specs, options,
|
|
18
|
+
function featureReportBody({ specs, options, evidence, sourceLinks, title, }) {
|
|
19
19
|
return `
|
|
20
20
|
<h1>${renderReportTitle(title, options.repositoryUrl)}</h1>
|
|
21
21
|
<p>Generated ${html(formatGeneratedAt(options.generatedAt))}.</p>
|
|
22
22
|
${renderIssues(options.validationIssues ?? [])}
|
|
23
23
|
${renderModels(options.models ?? [], options.coverage, sourceLinks)}
|
|
24
|
-
${specs.map((spec) => renderSpec(spec, options.coverage,
|
|
24
|
+
${specs.map((spec) => renderSpec(spec, options.coverage, evidence, sourceLinks)).join("\n")}
|
|
25
25
|
`;
|
|
26
26
|
}
|
|
27
27
|
function featureReportStyles() {
|
|
28
28
|
return `.panel{border:1px solid #d0d7de;border-radius:8px;padding:20px;margin:18px 0}
|
|
29
|
-
.ok{color:#1a7f37}.missing,.error{color:#cf222e}.warning{color:#9a6700}
|
|
29
|
+
.ok{color:#1a7f37}.missing,.error{color:#cf222e}.warning{color:#9a6700}.muted{color:#57606a}
|
|
30
30
|
.badge{border:1px solid #d0d7de;border-radius:999px;padding:2px 8px;font-size:12px;white-space:nowrap}
|
|
31
31
|
.feature-header{display:flex;gap:12px;align-items:center;justify-content:space-between}
|
|
32
32
|
.scenario{border:1px solid #d0d7de;border-radius:8px;margin:12px 0;background:#fff}
|
|
@@ -81,20 +81,7 @@ function formatGeneratedAt(value) {
|
|
|
81
81
|
if (Number.isNaN(date.getTime()))
|
|
82
82
|
return value ?? "";
|
|
83
83
|
const day = date.getDate();
|
|
84
|
-
const month = [
|
|
85
|
-
"January",
|
|
86
|
-
"February",
|
|
87
|
-
"March",
|
|
88
|
-
"April",
|
|
89
|
-
"May",
|
|
90
|
-
"June",
|
|
91
|
-
"July",
|
|
92
|
-
"August",
|
|
93
|
-
"September",
|
|
94
|
-
"October",
|
|
95
|
-
"November",
|
|
96
|
-
"December",
|
|
97
|
-
][date.getMonth()];
|
|
84
|
+
const month = ["January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December"][date.getMonth()];
|
|
98
85
|
const hours = String(date.getHours()).padStart(2, "0");
|
|
99
86
|
const minutes = String(date.getMinutes()).padStart(2, "0");
|
|
100
87
|
return `${day}${ordinalSuffix(day)} ${month} ${date.getFullYear()} at ${hours}:${minutes}`;
|
|
@@ -159,8 +146,8 @@ function renderModelRules(model, ruleCoverage, ruleScenarioLinks, sourceLinks) {
|
|
|
159
146
|
})
|
|
160
147
|
.join("")}</ul>`;
|
|
161
148
|
}
|
|
162
|
-
function renderSpec(spec, coverage,
|
|
163
|
-
const
|
|
149
|
+
function renderSpec(spec, coverage, evidence = [], sourceLinks = {}) {
|
|
150
|
+
const evidenceByLine = groupEvidenceByLine(evidence);
|
|
164
151
|
const ruleCoverage = coverage?.ruleCoverage ?? [];
|
|
165
152
|
const scenarioCoverage = coverage?.scenarioCoverage ?? [];
|
|
166
153
|
const ruleScenarioLinks = buildRuleScenarioLinks(ruleCoverage, scenarioCoverage);
|
|
@@ -173,32 +160,36 @@ function renderSpec(spec, coverage, screenshots = [], sourceLinks = {}) {
|
|
|
173
160
|
<h3>Rules</h3>
|
|
174
161
|
<ul>${spec.rules.map((rule) => renderFeatureRule(rule.id, rule.text, ruleCoverage, ruleScenarioLinks, sourceLinks)).join("")}</ul>
|
|
175
162
|
<h3>Scenarios</h3>
|
|
176
|
-
${spec.scenarios
|
|
177
|
-
.map((scenario) => renderScenario(spec, scenario, scenarioCoverage, ruleScenarioLinks, screenshotsByLine, sourceLinks))
|
|
178
|
-
.join("\n")}
|
|
163
|
+
${spec.scenarios.map((scenario) => renderScenario(spec, scenario, scenarioCoverage, ruleScenarioLinks, evidenceByLine, sourceLinks)).join("\n")}
|
|
179
164
|
</section>`;
|
|
180
165
|
}
|
|
181
166
|
function renderFeatureRule(id, text, ruleCoverage, ruleScenarioLinks, sourceLinks) {
|
|
182
167
|
const item = ruleCoverage.find((coverageItem) => coverageItem.id === id);
|
|
183
168
|
return `<li><code>${html(id)}</code>: ${html(text)} ${ruleCoverageBadge(item, ruleScenarioIds(id, ruleScenarioLinks), sourceLinks)}</li>`;
|
|
184
169
|
}
|
|
185
|
-
function renderScenario(spec, scenario, scenarioCoverage, ruleScenarioLinks,
|
|
186
|
-
const
|
|
187
|
-
|
|
170
|
+
function renderScenario(spec, scenario, scenarioCoverage, ruleScenarioLinks, evidenceByLine, sourceLinks) {
|
|
171
|
+
const scenarioEvidence = scenario.steps.flatMap((step) => evidenceByLine.get(screenshotKey(spec.filePath, step.line)) ?? []);
|
|
172
|
+
const changedCount = scenarioEvidence.filter((entry) => entry.changed && entry.path).length;
|
|
173
|
+
const unchangedCount = scenarioEvidence.filter((entry) => !entry.changed).length;
|
|
188
174
|
const scenarioRuleIds = ruleIdsForScenario(scenario.id, spec.rules.map((rule) => rule.id), ruleScenarioLinks);
|
|
189
175
|
const scenarioCoverageItem = scenarioCoverage.find((item) => item.id === scenario.id);
|
|
190
|
-
return `<details class="scenario" data-has-images="${
|
|
191
|
-
<summary><code>${html(scenario.id)}</code>: ${html(scenario.title)} ${coverageBadge(scenarioCoverageItem?.covered, [], scenarioCoverageItem, sourceLinks)}
|
|
192
|
-
<div class="scenario-body">${renderScenarioRuleCoverage(scenarioRuleIds)}${scenario.steps.map((step) => renderStep(spec, step,
|
|
176
|
+
return `<details class="scenario" data-has-images="${changedCount > 0 ? "true" : "false"}">
|
|
177
|
+
<summary><code>${html(scenario.id)}</code>: ${html(scenario.title)} ${coverageBadge(scenarioCoverageItem?.covered, [], scenarioCoverageItem, sourceLinks)} ${renderEvidenceSummary(changedCount, unchangedCount)}</summary>
|
|
178
|
+
<div class="scenario-body">${renderScenarioRuleCoverage(scenarioRuleIds)}${scenario.steps.map((step) => renderStep(spec, step, evidenceByLine, sourceLinks)).join("")}</div>
|
|
193
179
|
</details>`;
|
|
194
180
|
}
|
|
195
|
-
function
|
|
196
|
-
if (
|
|
197
|
-
return `<
|
|
181
|
+
function renderEvidenceSummary(changedCount, unchangedCount) {
|
|
182
|
+
if (changedCount === 0 && unchangedCount === 0) {
|
|
183
|
+
return `<span class="badge muted">no visual evidence recorded</span>`;
|
|
198
184
|
}
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
|
|
185
|
+
const changedLabel = `${changedCount} visual change${changedCount === 1 ? "" : "s"}`;
|
|
186
|
+
const unchangedLabel = `${unchangedCount} unchanged screen${unchangedCount === 1 ? "" : "s"}`;
|
|
187
|
+
return `<span class="badge">${html([changedLabel, unchangedLabel].join(" · "))}</span>`;
|
|
188
|
+
}
|
|
189
|
+
function renderScenarioRuleCoverage(ruleIds) {
|
|
190
|
+
if (!ruleIds.length)
|
|
191
|
+
return `<p><strong>Rules covered by this scenario:</strong> <span class="muted">none referenced</span></p>`;
|
|
192
|
+
return `<p><strong>Rules covered by this scenario:</strong> ${ruleIds.map((ruleId) => `<code>${html(ruleId)}</code>`).join(" ")}</p>`;
|
|
202
193
|
}
|
|
203
194
|
function renderModelItemBody(body) {
|
|
204
195
|
const lines = body.split("\n");
|
|
@@ -236,49 +227,40 @@ function renderModelItemBody(body) {
|
|
|
236
227
|
function renderInlineMarkdown(source) {
|
|
237
228
|
return source
|
|
238
229
|
.split(/(`[^`]+`)/g)
|
|
239
|
-
.map((part) => part.startsWith("`") && part.endsWith("`")
|
|
240
|
-
? `<code>${html(part.slice(1, -1))}</code>`
|
|
241
|
-
: html(part))
|
|
230
|
+
.map((part) => part.startsWith("`") && part.endsWith("`") ? `<code>${html(part.slice(1, -1))}</code>` : html(part))
|
|
242
231
|
.join("");
|
|
243
232
|
}
|
|
244
233
|
function isTableStart(lines, index) {
|
|
245
|
-
return
|
|
246
|
-
index + 1 < lines.length &&
|
|
247
|
-
isTableSeparator(lines[index + 1]));
|
|
234
|
+
return isPipeTableRow(lines[index]) && index + 1 < lines.length && isTableSeparator(lines[index + 1]);
|
|
248
235
|
}
|
|
249
236
|
function isPipeTableRow(line) {
|
|
250
237
|
return line.trim().startsWith("|") && line.trim().endsWith("|");
|
|
251
238
|
}
|
|
252
239
|
function isTableSeparator(line) {
|
|
253
|
-
return
|
|
254
|
-
splitTableRow(line).every((cell) => /^:?-{3,}:?$/.test(cell)));
|
|
240
|
+
return isPipeTableRow(line) && splitTableRow(line).every((cell) => /^:?-{3,}:?$/.test(cell));
|
|
255
241
|
}
|
|
256
242
|
function splitTableRow(line) {
|
|
257
|
-
return line
|
|
258
|
-
.trim()
|
|
259
|
-
.replace(/^\|/, "")
|
|
260
|
-
.replace(/\|$/, "")
|
|
261
|
-
.split("|")
|
|
262
|
-
.map((cell) => cell.trim());
|
|
243
|
+
return line.trim().replace(/^\|/, "").replace(/\|$/, "").split("|").map((cell) => cell.trim());
|
|
263
244
|
}
|
|
264
245
|
function renderTable(lines) {
|
|
265
246
|
const headers = splitTableRow(lines[0]);
|
|
266
247
|
const rows = lines.slice(1).map(splitTableRow);
|
|
267
|
-
return `<div class="table-wrap"><table><thead><tr>${headers
|
|
268
|
-
|
|
269
|
-
|
|
270
|
-
|
|
271
|
-
|
|
272
|
-
|
|
273
|
-
.join("")}</tbody></table></div>`;
|
|
274
|
-
}
|
|
275
|
-
function renderStep(spec, step, screenshotsByLine, sourceLinks) {
|
|
276
|
-
const screenshots = screenshotsByLine.get(screenshotKey(spec.filePath, step.line)) ?? [];
|
|
248
|
+
return `<div class="table-wrap"><table><thead><tr>${headers.map((header) => `<th>${renderInlineMarkdown(header)}</th>`).join("")}</tr></thead><tbody>${rows.map((row) => `<tr>${row.map((cell) => `<td>${renderInlineMarkdown(cell)}</td>`).join("")}</tr>`).join("")}</tbody></table></div>`;
|
|
249
|
+
}
|
|
250
|
+
function renderStep(spec, step, evidenceByLine, sourceLinks) {
|
|
251
|
+
const evidence = evidenceByLine.get(screenshotKey(spec.filePath, step.line)) ?? [];
|
|
252
|
+
const screenshots = evidence.filter((entry) => entry.changed && entry.path);
|
|
253
|
+
const unchanged = evidence.filter((entry) => !entry.changed);
|
|
277
254
|
const evidenceBadge = screenshots.length
|
|
278
|
-
? `<span class="badge ok"
|
|
279
|
-
:
|
|
255
|
+
? `<span class="badge ok">screen changed · screenshot captured</span>`
|
|
256
|
+
: unchanged.length
|
|
257
|
+
? `<span class="badge muted">same screen${renderComparedWith(unchanged[0])}</span>`
|
|
258
|
+
: `<span class="badge muted" title="missing screenshot evidence is informational">no screenshot captured</span>`;
|
|
280
259
|
return `<div class="step"><p><strong>${html(step.keyword)}</strong> ${html(step.text)} ${renderLineBadge(spec.filePath, step.line, sourceLinks)} ${evidenceBadge}</p>${renderScreenshots(screenshots)}</div>`;
|
|
281
260
|
}
|
|
261
|
+
function renderComparedWith(entry) {
|
|
262
|
+
return entry.comparedWithLine ? ` as line ${html(String(entry.comparedWithLine))}` : " as previous screen";
|
|
263
|
+
}
|
|
282
264
|
function renderLineBadge(filePath, line, sourceLinks) {
|
|
283
265
|
const label = `line ${line}`;
|
|
284
266
|
const url = sourceLineUrl(filePath, line, sourceLinks);
|
|
@@ -289,30 +271,21 @@ function renderLineBadge(filePath, line, sourceLinks) {
|
|
|
289
271
|
function renderScreenshots(screenshots) {
|
|
290
272
|
if (!screenshots.length)
|
|
291
273
|
return "";
|
|
292
|
-
return `<div class="screenshots">${screenshots
|
|
293
|
-
.map((screenshot) => `<figure class="screenshot"><img src="${html(screenshot.path)}" alt="${html(screenshot.title ?? `Screenshot for ${screenshot.specPath}:${screenshot.line}`)}"><figcaption>${html(screenshot.title ?? `${screenshot.specPath}:${screenshot.line}`)}</figcaption></figure>`)
|
|
294
|
-
.join("")}</div>`;
|
|
274
|
+
return `<div class="screenshots">${screenshots.map((screenshot) => `<figure class="screenshot"><img src="${html(screenshot.path ?? "")}" alt="${html(screenshot.title ?? `Screenshot for ${screenshot.specPath}:${screenshot.line}`)}"><figcaption>${html(screenshot.title ?? `${screenshot.specPath}:${screenshot.line}`)}</figcaption></figure>`).join("")}</div>`;
|
|
295
275
|
}
|
|
296
276
|
function coverageBadge(covered, suffixes = [], item, sourceLinks = {}) {
|
|
297
|
-
return covered === undefined
|
|
298
|
-
? ""
|
|
299
|
-
: covered
|
|
300
|
-
? `<span class="badge ok">covered${suffixes.length ? ` by ${suffixes.map(html).join(" ")}` : ""}${renderCoverageReferenceMarkers(item, sourceLinks)}</span>`
|
|
301
|
-
: `<span class="badge missing">missing coverage</span>`;
|
|
277
|
+
return covered === undefined ? "" : covered ? `<span class="badge ok">covered${suffixes.length ? ` by ${suffixes.map(html).join(" ")}` : ""}${renderCoverageReferenceMarkers(item, sourceLinks)}</span>` : `<span class="badge missing">missing coverage</span>`;
|
|
302
278
|
}
|
|
303
279
|
function ruleCoverageBadge(ruleCoverage, scenarioIds, sourceLinks) {
|
|
304
|
-
if (ruleCoverage?.covered && !scenarioIds.length)
|
|
280
|
+
if (ruleCoverage?.covered && !scenarioIds.length)
|
|
305
281
|
return coverageBadge(true, ["direct test"], ruleCoverage, sourceLinks);
|
|
306
|
-
}
|
|
307
282
|
return coverageBadge(ruleCoverage?.covered, scenarioIds, ruleCoverage, sourceLinks);
|
|
308
283
|
}
|
|
309
284
|
function renderCoverageReferenceMarkers(item, sourceLinks) {
|
|
310
285
|
const references = uniqueCoverageReferences(item);
|
|
311
286
|
if (!references.length)
|
|
312
287
|
return "";
|
|
313
|
-
return ` <span class="coverage-refs">${references
|
|
314
|
-
.map((reference, index) => renderCoverageReferenceMarker(reference, index + 1, sourceLinks))
|
|
315
|
-
.join(",")}</span>`;
|
|
288
|
+
return ` <span class="coverage-refs">${references.map((reference, index) => renderCoverageReferenceMarker(reference, index + 1, sourceLinks)).join(",")}</span>`;
|
|
316
289
|
}
|
|
317
290
|
function renderCoverageReferenceMarker(reference, index, sourceLinks) {
|
|
318
291
|
const label = coverageReferenceLabel(reference);
|
|
@@ -347,29 +320,18 @@ function sourceLineUrl(filePath, line, sourceLinks) {
|
|
|
347
320
|
return undefined;
|
|
348
321
|
const baseUrl = sourceLinks.githubBaseUrl.replace(/\/$/, "");
|
|
349
322
|
const ref = encodeURIComponent(sourceLinks.githubRef);
|
|
350
|
-
const encodedFilePath = filePath
|
|
351
|
-
.split("/")
|
|
352
|
-
.map((segment) => encodeURIComponent(segment))
|
|
353
|
-
.join("/");
|
|
323
|
+
const encodedFilePath = filePath.split("/").map((segment) => encodeURIComponent(segment)).join("/");
|
|
354
324
|
return `${baseUrl}/blob/${ref}/${encodedFilePath}#L${line}`;
|
|
355
325
|
}
|
|
356
326
|
function ruleScenarioIds(ruleId, ruleScenarioLinks) {
|
|
357
|
-
return Array.from(new Set(ruleScenarioLinks
|
|
358
|
-
.filter((link) => link.ruleId === ruleId)
|
|
359
|
-
.map((link) => link.scenarioId))).sort();
|
|
327
|
+
return Array.from(new Set(ruleScenarioLinks.filter((link) => link.ruleId === ruleId).map((link) => link.scenarioId))).sort();
|
|
360
328
|
}
|
|
361
329
|
function ruleIdsForScenario(scenarioId, specRuleIds, ruleScenarioLinks) {
|
|
362
|
-
const ruleIds = new Set(ruleScenarioLinks
|
|
363
|
-
.filter((link) => link.scenarioId === scenarioId)
|
|
364
|
-
.map((link) => link.ruleId));
|
|
330
|
+
const ruleIds = new Set(ruleScenarioLinks.filter((link) => link.scenarioId === scenarioId).map((link) => link.ruleId));
|
|
365
331
|
return specRuleIds.filter((ruleId) => ruleIds.has(ruleId));
|
|
366
332
|
}
|
|
367
333
|
function buildRuleScenarioLinks(ruleCoverage, scenarioCoverage) {
|
|
368
|
-
const scenarioReferences = scenarioCoverage.flatMap((scenario) => scenario.references.map((reference) => ({
|
|
369
|
-
scenarioId: scenario.id,
|
|
370
|
-
filePath: reference.filePath,
|
|
371
|
-
line: reference.line,
|
|
372
|
-
})));
|
|
334
|
+
const scenarioReferences = scenarioCoverage.flatMap((scenario) => scenario.references.map((reference) => ({ scenarioId: scenario.id, filePath: reference.filePath, line: reference.line })));
|
|
373
335
|
const links = [];
|
|
374
336
|
const seen = new Set();
|
|
375
337
|
for (const rule of ruleCoverage) {
|
|
@@ -389,16 +351,14 @@ function buildRuleScenarioLinks(ruleCoverage, scenarioCoverage) {
|
|
|
389
351
|
function nearestScenarioReference(filePath, line, scenarioReferences) {
|
|
390
352
|
const maxLineDistance = 8;
|
|
391
353
|
return scenarioReferences
|
|
392
|
-
.filter((reference) => reference.filePath === filePath &&
|
|
393
|
-
reference.line <= line &&
|
|
394
|
-
line - reference.line <= maxLineDistance)
|
|
354
|
+
.filter((reference) => reference.filePath === filePath && reference.line <= line && line - reference.line <= maxLineDistance)
|
|
395
355
|
.sort((left, right) => right.line - left.line)[0];
|
|
396
356
|
}
|
|
397
|
-
function
|
|
357
|
+
function groupEvidenceByLine(evidence) {
|
|
398
358
|
const grouped = new Map();
|
|
399
|
-
for (const
|
|
400
|
-
const key = screenshotKey(
|
|
401
|
-
grouped.set(key, [...(grouped.get(key) ?? []),
|
|
359
|
+
for (const entry of evidence) {
|
|
360
|
+
const key = screenshotKey(entry.specPath, entry.line);
|
|
361
|
+
grouped.set(key, [...(grouped.get(key) ?? []), entry]);
|
|
402
362
|
}
|
|
403
363
|
return grouped;
|
|
404
364
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"reportTemplate.js","sourceRoot":"","sources":["../src/reportTemplate.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"reportTemplate.js","sourceRoot":"","sources":["../src/reportTemplate.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,cAAc,EAAE,MAAM,iBAAiB,CAAC;AACjD,OAAO,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AAsCjD,MAAM,UAAU,gBAAgB,CAAC,KAAoB,EAAE,UAAyB,EAAE;IAChF,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,IAAI,qBAAqB,CAAC;IACrD,MAAM,QAAQ,GAAG,OAAO,CAAC,WAAW,IAAI,EAAE,CAAC;IAC3C,MAAM,WAAW,GAAsB;QACrC,aAAa,EAAE,OAAO,CAAC,aAAa;QACpC,SAAS,EAAE,OAAO,CAAC,SAAS;KAC7B,CAAC;IAEF,OAAO,cAAc,CAAC;QACpB,KAAK;QACL,MAAM,EAAE,mBAAmB,EAAE;QAC7B,OAAO,EAAE,oBAAoB,EAAE;QAC/B,IAAI,EAAE,iBAAiB,CAAC,EAAE,KAAK,EAAE,OAAO,EAAE,QAAQ,EAAE,WAAW,EAAE,KAAK,EAAE,CAAC;KAC1E,CAAC,CAAC;AACL,CAAC;AAED,SAAS,iBAAiB,CAAC,EACzB,KAAK,EACL,OAAO,EACP,QAAQ,EACR,WAAW,EACX,KAAK,GAON;IACC,OAAO;MACH,iBAAiB,CAAC,KAAK,EAAE,OAAO,CAAC,aAAa,CAAC;eACtC,IAAI,CAAC,iBAAiB,CAAC,OAAO,CAAC,WAAW,CAAC,CAAC;EACzD,YAAY,CAAC,OAAO,CAAC,gBAAgB,IAAI,EAAE,CAAC;EAC5C,YAAY,CAAC,OAAO,CAAC,MAAM,IAAI,EAAE,EAAE,OAAO,CAAC,QAAQ,EAAE,WAAW,CAAC;EACjE,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,UAAU,CAAC,IAAI,EAAE,OAAO,CAAC,QAAQ,EAAE,QAAQ,EAAE,WAAW,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC;CAC1F,CAAC;AACF,CAAC;AAED,SAAS,mBAAmB;IAC1B,OAAO;;;;;;;;;;;;;;;;;;8EAkBqE,CAAC;AAC/E,CAAC;AAED,SAAS,oBAAoB;IAC3B,MAAM,OAAO,GAAG,GAAG,GAAG,SAAS,CAAC;IAChC,MAAM,QAAQ,GAAG,GAAG,GAAG,UAAU,CAAC;IAClC,OAAO,GAAG,OAAO;;;;;;;;;;;;;;;;EAgBjB,QAAQ,EAAE,CAAC;AACb,CAAC;AAED,SAAS,iBAAiB,CAAC,KAAa,EAAE,aAAiC;IACzE,IAAI,CAAC,aAAa;QAAE,OAAO,IAAI,CAAC,KAAK,CAAC,CAAC;IACvC,MAAM,MAAM,GAAG,0BAA0B,CAAC;IAC1C,MAAM,UAAU,GAAG,SAAS,IAAI,CAAC,aAAa,CAAC,6CAA6C,CAAC;IAC7F,IAAI,KAAK,CAAC,UAAU,CAAC,MAAM,CAAC,IAAI,KAAK,CAAC,MAAM,GAAG,MAAM,CAAC,MAAM,EAAE,CAAC;QAC7D,OAAO,GAAG,IAAI,CAAC,MAAM,CAAC,MAAM,UAAU,IAAI,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,MAAM,CAAC;IACnF,CAAC;IACD,OAAO,MAAM,UAAU,IAAI,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC;AAC/C,CAAC;AAED,SAAS,iBAAiB,CAAC,KAAyB;IAClD,MAAM,IAAI,GAAG,KAAK,CAAC,CAAC,CAAC,IAAI,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,IAAI,EAAE,CAAC;IAClD,IAAI,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC;QAAE,OAAO,KAAK,IAAI,EAAE,CAAC;IACrD,MAAM,GAAG,GAAG,IAAI,CAAC,OAAO,EAAE,CAAC;IAC3B,MAAM,KAAK,GAAG,CAAC,SAAS,EAAE,UAAU,EAAE,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,WAAW,EAAE,SAAS,EAAE,UAAU,EAAE,UAAU,CAAC,CAAC,IAAI,CAAC,QAAQ,EAAE,CAAC,CAAC;IAC1J,MAAM,KAAK,GAAG,MAAM,CAAC,IAAI,CAAC,QAAQ,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC;IACvD,MAAM,OAAO,GAAG,MAAM,CAAC,IAAI,CAAC,UAAU,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC;IAC3D,OAAO,GAAG,GAAG,GAAG,aAAa,CAAC,GAAG,CAAC,IAAI,KAAK,IAAI,IAAI,CAAC,WAAW,EAAE,OAAO,KAAK,IAAI,OAAO,EAAE,CAAC;AAC7F,CAAC;AAED,SAAS,aAAa,CAAC,GAAW;IAChC,IAAI,GAAG,IAAI,EAAE,IAAI,GAAG,IAAI,EAAE;QAAE,OAAO,IAAI,CAAC;IACxC,IAAI,GAAG,GAAG,EAAE,KAAK,CAAC;QAAE,OAAO,IAAI,CAAC;IAChC,IAAI,GAAG,GAAG,EAAE,KAAK,CAAC;QAAE,OAAO,IAAI,CAAC;IAChC,IAAI,GAAG,GAAG,EAAE,KAAK,CAAC;QAAE,OAAO,IAAI,CAAC;IAChC,OAAO,IAAI,CAAC;AACd,CAAC;AAED,SAAS,YAAY,CAAC,MAAyB;IAC7C,IAAI,CAAC,MAAM,CAAC,MAAM;QAAE,OAAO,EAAE,CAAC;IAC9B,OAAO,iDAAiD,MAAM;SAC3D,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,cAAc,KAAK,CAAC,QAAQ,WAAW,IAAI,CAAC,GAAG,KAAK,CAAC,QAAQ,IAAI,EAAE,GAAG,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,KAAK,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,WAAW,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC;SAChK,IAAI,CAAC,EAAE,CAAC,iBAAiB,CAAC;AAC/B,CAAC;AAED,SAAS,YAAY,CAAC,MAAmB,EAAE,QAA0B,EAAE,cAAiC,EAAE;IACxG,IAAI,CAAC,MAAM,CAAC,MAAM;QAAE,OAAO,EAAE,CAAC;IAC9B,MAAM,aAAa,GAAG,QAAQ,EAAE,aAAa,IAAI,EAAE,CAAC;IACpD,MAAM,YAAY,GAAG,QAAQ,EAAE,YAAY,IAAI,EAAE,CAAC;IAClD,MAAM,gBAAgB,GAAG,QAAQ,EAAE,gBAAgB,IAAI,EAAE,CAAC;IAC1D,MAAM,iBAAiB,GAAG,sBAAsB,CAAC,YAAY,EAAE,gBAAgB,CAAC,CAAC;IACjF,OAAO;;IAEL,MAAM,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,WAAW,CAAC,KAAK,EAAE,aAAa,EAAE,YAAY,EAAE,iBAAiB,EAAE,WAAW,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC;WAC1G,CAAC;AACZ,CAAC;AAED,SAAS,WAAW,CAAC,KAAgB,EAAE,aAA6B,EAAE,YAA4B,EAAE,iBAAqC,EAAE,WAA8B;IACvK,OAAO;;UAEC,IAAI,CAAC,KAAK,CAAC,WAAW,CAAC,EAAE,CAAC,IAAI,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC;0BAC/B,IAAI,CAAC,KAAK,CAAC,WAAW,CAAC,MAAM,IAAI,OAAO,CAAC;;OAE5D,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC;;IAEtB,KAAK,CAAC,UAAU;SACf,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE;QACZ,MAAM,YAAY,GAAG,aAAa,CAAC,IAAI,CAAC,CAAC,SAAS,EAAE,EAAE,CAAC,SAAS,CAAC,EAAE,KAAK,IAAI,CAAC,EAAE,CAAC,CAAC;QACjF,OAAO;qBACQ,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,YAAY,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,aAAa,CAAC,YAAY,EAAE,OAAO,EAAE,EAAE,EAAE,YAAY,EAAE,WAAW,CAAC;mCAClG,mBAAmB,CAAC,IAAI,CAAC,IAAI,CAAC;aACpD,CAAC;IACV,CAAC,CAAC;SACD,IAAI,CAAC,EAAE,CAAC;IACT,gBAAgB,CAAC,KAAK,EAAE,YAAY,EAAE,iBAAiB,EAAE,WAAW,CAAC;WAC9D,CAAC;AACZ,CAAC;AAED,SAAS,gBAAgB,CAAC,KAAgB,EAAE,YAA4B,EAAE,iBAAqC,EAAE,WAA8B;IAC7I,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,MAAM;QAAE,OAAO,EAAE,CAAC;IACnC,OAAO,qBAAqB,KAAK,CAAC,KAAK;SACpC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE;QACZ,MAAM,IAAI,GAAG,YAAY,CAAC,IAAI,CAAC,CAAC,YAAY,EAAE,EAAE,CAAC,YAAY,CAAC,EAAE,KAAK,IAAI,CAAC,EAAE,CAAC,CAAC;QAC9E,OAAO,aAAa,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,YAAY,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,iBAAiB,CAAC,IAAI,EAAE,eAAe,CAAC,IAAI,CAAC,EAAE,EAAE,iBAAiB,CAAC,EAAE,WAAW,CAAC,OAAO,CAAC;IAC3J,CAAC,CAAC;SACD,IAAI,CAAC,EAAE,CAAC,OAAO,CAAC;AACrB,CAAC;AAED,SAAS,UAAU,CAAC,IAAiB,EAAE,QAA0B,EAAE,WAA6B,EAAE,EAAE,cAAiC,EAAE;IACrI,MAAM,cAAc,GAAG,mBAAmB,CAAC,QAAQ,CAAC,CAAC;IACrD,MAAM,YAAY,GAAG,QAAQ,EAAE,YAAY,IAAI,EAAE,CAAC;IAClD,MAAM,gBAAgB,GAAG,QAAQ,EAAE,gBAAgB,IAAI,EAAE,CAAC;IAC1D,MAAM,iBAAiB,GAAG,sBAAsB,CAAC,YAAY,EAAE,gBAAgB,CAAC,CAAC;IACjF,OAAO;;UAEC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC;0BACA,IAAI,CAAC,IAAI,CAAC,WAAW,CAAC,MAAM,IAAI,OAAO,CAAC;;OAE3D,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC;;QAEjB,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,iBAAiB,CAAC,IAAI,CAAC,EAAE,EAAE,IAAI,CAAC,IAAI,EAAE,YAAY,EAAE,iBAAiB,EAAE,WAAW,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC;;IAE1H,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,QAAQ,EAAE,EAAE,CAAC,cAAc,CAAC,IAAI,EAAE,QAAQ,EAAE,gBAAgB,EAAE,iBAAiB,EAAE,cAAc,EAAE,WAAW,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC;WACtI,CAAC;AACZ,CAAC;AAED,SAAS,iBAAiB,CAAC,EAAU,EAAE,IAAY,EAAE,YAA4B,EAAE,iBAAqC,EAAE,WAA8B;IACtJ,MAAM,IAAI,GAAG,YAAY,CAAC,IAAI,CAAC,CAAC,YAAY,EAAE,EAAE,CAAC,YAAY,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC;IACzE,OAAO,aAAa,IAAI,CAAC,EAAE,CAAC,YAAY,IAAI,CAAC,IAAI,CAAC,IAAI,iBAAiB,CAAC,IAAI,EAAE,eAAe,CAAC,EAAE,EAAE,iBAAiB,CAAC,EAAE,WAAW,CAAC,OAAO,CAAC;AAC5I,CAAC;AAED,SAAS,cAAc,CAAC,IAAiB,EAAE,QAA0C,EAAE,gBAAgC,EAAE,iBAAqC,EAAE,cAA6C,EAAE,WAA8B;IAC3O,MAAM,gBAAgB,GAAG,QAAQ,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,cAAc,CAAC,GAAG,CAAC,aAAa,CAAC,IAAI,CAAC,QAAQ,EAAE,IAAI,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC;IAC7H,MAAM,YAAY,GAAG,gBAAgB,CAAC,MAAM,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,OAAO,IAAI,KAAK,CAAC,IAAI,CAAC,CAAC,MAAM,CAAC;IAC5F,MAAM,cAAc,GAAG,gBAAgB,CAAC,MAAM,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,MAAM,CAAC;IACjF,MAAM,eAAe,GAAG,kBAAkB,CAAC,QAAQ,CAAC,EAAE,EAAE,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,iBAAiB,CAAC,CAAC;IAC9G,MAAM,oBAAoB,GAAG,gBAAgB,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,EAAE,KAAK,QAAQ,CAAC,EAAE,CAAC,CAAC;IACtF,OAAO,8CAA8C,YAAY,GAAG,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,OAAO;mBACvE,IAAI,CAAC,QAAQ,CAAC,EAAE,CAAC,YAAY,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,aAAa,CAAC,oBAAoB,EAAE,OAAO,EAAE,EAAE,EAAE,oBAAoB,EAAE,WAAW,CAAC,IAAI,qBAAqB,CAAC,YAAY,EAAE,cAAc,CAAC;+BACnL,0BAA0B,CAAC,eAAe,CAAC,GAAG,QAAQ,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,UAAU,CAAC,IAAI,EAAE,IAAI,EAAE,cAAc,EAAE,WAAW,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC;WAC5J,CAAC;AACZ,CAAC;AAED,SAAS,qBAAqB,CAAC,YAAoB,EAAE,cAAsB;IACzE,IAAI,YAAY,KAAK,CAAC,IAAI,cAAc,KAAK,CAAC,EAAE,CAAC;QAC/C,OAAO,8DAA8D,CAAC;IACxE,CAAC;IACD,MAAM,YAAY,GAAG,GAAG,YAAY,iBAAiB,YAAY,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,EAAE,CAAC;IACrF,MAAM,cAAc,GAAG,GAAG,cAAc,oBAAoB,cAAc,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,EAAE,CAAC;IAC9F,OAAO,uBAAuB,IAAI,CAAC,CAAC,YAAY,EAAE,cAAc,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,SAAS,CAAC;AAC1F,CAAC;AAED,SAAS,0BAA0B,CAAC,OAAiB;IACnD,IAAI,CAAC,OAAO,CAAC,MAAM;QAAE,OAAO,oGAAoG,CAAC;IACjI,OAAO,uDAAuD,OAAO,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,SAAS,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC;AACxI,CAAC;AAED,SAAS,mBAAmB,CAAC,IAAY;IACvC,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IAC/B,MAAM,MAAM,GAAa,EAAE,CAAC;IAC5B,IAAI,SAAS,GAAa,EAAE,CAAC;IAC7B,MAAM,cAAc,GAAG,GAAG,EAAE;QAC1B,IAAI,CAAC,SAAS,CAAC,MAAM;YAAE,OAAO;QAC9B,MAAM,CAAC,IAAI,CAAC,MAAM,oBAAoB,CAAC,SAAS,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,MAAM,CAAC,CAAC;QACnE,SAAS,GAAG,EAAE,CAAC;IACjB,CAAC,CAAC;IACF,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC;QACzC,MAAM,IAAI,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC;QACtB,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,EAAE,CAAC;YACjB,cAAc,EAAE,CAAC;YACjB,SAAS;QACX,CAAC;QACD,IAAI,YAAY,CAAC,KAAK,EAAE,CAAC,CAAC,EAAE,CAAC;YAC3B,cAAc,EAAE,CAAC;YACjB,MAAM,UAAU,GAAG,CAAC,IAAI,CAAC,CAAC;YAC1B,CAAC,IAAI,CAAC,CAAC;YACP,OAAO,CAAC,GAAG,KAAK,CAAC,MAAM,IAAI,cAAc,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;gBACpD,UAAU,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;gBAC1B,CAAC,IAAI,CAAC,CAAC;YACT,CAAC;YACD,CAAC,IAAI,CAAC,CAAC;YACP,MAAM,CAAC,IAAI,CAAC,WAAW,CAAC,UAAU,CAAC,CAAC,CAAC;YACrC,SAAS;QACX,CAAC;QACD,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC;IAC9B,CAAC;IACD,cAAc,EAAE,CAAC;IACjB,OAAO,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;AACzB,CAAC;AAED,SAAS,oBAAoB,CAAC,MAAc;IAC1C,OAAO,MAAM;SACV,KAAK,CAAC,YAAY,CAAC;SACnB,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,SAAS,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;SAClH,IAAI,CAAC,EAAE,CAAC,CAAC;AACd,CAAC;AAED,SAAS,YAAY,CAAC,KAAe,EAAE,KAAa;IAClD,OAAO,cAAc,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,IAAI,KAAK,GAAG,CAAC,GAAG,KAAK,CAAC,MAAM,IAAI,gBAAgB,CAAC,KAAK,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC,CAAC;AACxG,CAAC;AAED,SAAS,cAAc,CAAC,IAAY;IAClC,OAAO,IAAI,CAAC,IAAI,EAAE,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,IAAI,CAAC,IAAI,EAAE,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC;AAClE,CAAC;AAED,SAAS,gBAAgB,CAAC,IAAY;IACpC,OAAO,cAAc,CAAC,IAAI,CAAC,IAAI,aAAa,CAAC,IAAI,CAAC,CAAC,KAAK,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,aAAa,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;AAC/F,CAAC;AAED,SAAS,aAAa,CAAC,IAAY;IACjC,OAAO,IAAI,CAAC,IAAI,EAAE,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC;AACjG,CAAC;AAED,SAAS,WAAW,CAAC,KAAe;IAClC,MAAM,OAAO,GAAG,aAAa,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;IACxC,MAAM,IAAI,GAAG,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,aAAa,CAAC,CAAC;IAC/C,OAAO,6CAA6C,OAAO,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,OAAO,oBAAoB,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,uBAAuB,IAAI,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,OAAO,GAAG,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,OAAO,oBAAoB,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,wBAAwB,CAAC;AAChS,CAAC;AAED,SAAS,UAAU,CAAC,IAAiB,EAAE,IAAiB,EAAE,cAA6C,EAAE,WAA8B;IACrI,MAAM,QAAQ,GAAG,cAAc,CAAC,GAAG,CAAC,aAAa,CAAC,IAAI,CAAC,QAAQ,EAAE,IAAI,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,CAAC;IACnF,MAAM,WAAW,GAAG,QAAQ,CAAC,MAAM,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,OAAO,IAAI,KAAK,CAAC,IAAI,CAAC,CAAC;IAC5E,MAAM,SAAS,GAAG,QAAQ,CAAC,MAAM,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;IAC7D,MAAM,aAAa,GAAG,WAAW,CAAC,MAAM;QACtC,CAAC,CAAC,oEAAoE;QACtE,CAAC,CAAC,SAAS,CAAC,MAAM;YAChB,CAAC,CAAC,wCAAwC,kBAAkB,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,SAAS;YACnF,CAAC,CAAC,8GAA8G,CAAC;IACrH,OAAO,gCAAgC,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,aAAa,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,eAAe,CAAC,IAAI,CAAC,QAAQ,EAAE,IAAI,CAAC,IAAI,EAAE,WAAW,CAAC,IAAI,aAAa,OAAO,iBAAiB,CAAC,WAAW,CAAC,QAAQ,CAAC;AAChN,CAAC;AAED,SAAS,kBAAkB,CAAC,KAAqB;IAC/C,OAAO,KAAK,CAAC,gBAAgB,CAAC,CAAC,CAAC,YAAY,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,gBAAgB,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,qBAAqB,CAAC;AAC7G,CAAC;AAED,SAAS,eAAe,CAAC,QAAgB,EAAE,IAAY,EAAE,WAA8B;IACrF,MAAM,KAAK,GAAG,QAAQ,IAAI,EAAE,CAAC;IAC7B,MAAM,GAAG,GAAG,aAAa,CAAC,QAAQ,EAAE,IAAI,EAAE,WAAW,CAAC,CAAC;IACvD,IAAI,CAAC,GAAG;QAAE,OAAO,uBAAuB,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC;IAC7D,OAAO,oCAAoC,IAAI,CAAC,GAAG,CAAC,YAAY,IAAI,CAAC,GAAG,QAAQ,IAAI,IAAI,EAAE,CAAC,+CAA+C,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC;AAC9J,CAAC;AAED,SAAS,iBAAiB,CAAC,WAA6B;IACtD,IAAI,CAAC,WAAW,CAAC,MAAM;QAAE,OAAO,EAAE,CAAC;IACnC,OAAO,4BAA4B,WAAW,CAAC,GAAG,CAAC,CAAC,UAAU,EAAE,EAAE,CAAC,wCAAwC,IAAI,CAAC,UAAU,CAAC,IAAI,IAAI,EAAE,CAAC,UAAU,IAAI,CAAC,UAAU,CAAC,KAAK,IAAI,kBAAkB,UAAU,CAAC,QAAQ,IAAI,UAAU,CAAC,IAAI,EAAE,CAAC,iBAAiB,IAAI,CAAC,UAAU,CAAC,KAAK,IAAI,GAAG,UAAU,CAAC,QAAQ,IAAI,UAAU,CAAC,IAAI,EAAE,CAAC,wBAAwB,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,QAAQ,CAAC;AACvW,CAAC;AAED,SAAS,aAAa,CAAC,OAAiB,EAAE,WAAqB,EAAE,EAAE,IAAmB,EAAE,cAAiC,EAAE;IACzH,OAAO,OAAO,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,iCAAiC,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,OAAO,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,GAAG,8BAA8B,CAAC,IAAI,EAAE,WAAW,CAAC,SAAS,CAAC,CAAC,CAAC,qDAAqD,CAAC;AACnQ,CAAC;AAED,SAAS,iBAAiB,CAAC,YAAsC,EAAE,WAAqB,EAAE,WAA8B;IACtH,IAAI,YAAY,EAAE,OAAO,IAAI,CAAC,WAAW,CAAC,MAAM;QAAE,OAAO,aAAa,CAAC,IAAI,EAAE,CAAC,aAAa,CAAC,EAAE,YAAY,EAAE,WAAW,CAAC,CAAC;IACzH,OAAO,aAAa,CAAC,YAAY,EAAE,OAAO,EAAE,WAAW,EAAE,YAAY,EAAE,WAAW,CAAC,CAAC;AACtF,CAAC;AAED,SAAS,8BAA8B,CAAC,IAA8B,EAAE,WAA8B;IACpG,MAAM,UAAU,GAAG,wBAAwB,CAAC,IAAI,CAAC,CAAC;IAClD,IAAI,CAAC,UAAU,CAAC,MAAM;QAAE,OAAO,EAAE,CAAC;IAClC,OAAO,gCAAgC,UAAU,CAAC,GAAG,CAAC,CAAC,SAAS,EAAE,KAAK,EAAE,EAAE,CAAC,6BAA6B,CAAC,SAAS,EAAE,KAAK,GAAG,CAAC,EAAE,WAAW,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,SAAS,CAAC;AACnK,CAAC;AAED,SAAS,6BAA6B,CAAC,SAAwB,EAAE,KAAa,EAAE,WAA8B;IAC5G,MAAM,KAAK,GAAG,sBAAsB,CAAC,SAAS,CAAC,CAAC;IAChD,MAAM,GAAG,GAAG,oBAAoB,CAAC,SAAS,EAAE,WAAW,CAAC,CAAC;IACzD,IAAI,CAAC,GAAG;QAAE,OAAO,qCAAqC,IAAI,CAAC,KAAK,CAAC,KAAK,KAAK,SAAS,CAAC;IACrF,OAAO,iCAAiC,IAAI,CAAC,GAAG,CAAC,YAAY,IAAI,CAAC,KAAK,CAAC,+CAA+C,KAAK,MAAM,CAAC;AACrI,CAAC;AAED,SAAS,wBAAwB,CAAC,IAA8B;IAC9D,IAAI,CAAC,IAAI;QAAE,OAAO,EAAE,CAAC;IACrB,MAAM,IAAI,GAAG,IAAI,GAAG,EAAU,CAAC;IAC/B,MAAM,UAAU,GAAoB,EAAE,CAAC;IACvC,KAAK,MAAM,SAAS,IAAI,IAAI,CAAC,UAAU,EAAE,CAAC;QACxC,MAAM,GAAG,GAAG,sBAAsB,CAAC,SAAS,CAAC,CAAC;QAC9C,IAAI,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC;YAAE,SAAS;QAC5B,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;QACd,UAAU,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;IAC7B,CAAC;IACD,OAAO,UAAU,CAAC;AACpB,CAAC;AAED,SAAS,sBAAsB,CAAC,SAAwB;IACtD,MAAM,IAAI,GAAG,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,SAAS,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;IACxD,OAAO,GAAG,SAAS,CAAC,QAAQ,GAAG,IAAI,EAAE,CAAC;AACxC,CAAC;AAED,SAAS,oBAAoB,CAAC,SAAwB,EAAE,WAA8B;IACpF,OAAO,aAAa,CAAC,SAAS,CAAC,QAAQ,EAAE,SAAS,CAAC,IAAI,EAAE,WAAW,CAAC,CAAC;AACxE,CAAC;AAED,SAAS,aAAa,CAAC,QAAgB,EAAE,IAAY,EAAE,WAA8B;IACnF,IAAI,CAAC,WAAW,CAAC,aAAa,IAAI,CAAC,WAAW,CAAC,SAAS;QAAE,OAAO,SAAS,CAAC;IAC3E,MAAM,OAAO,GAAG,WAAW,CAAC,aAAa,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;IAC7D,MAAM,GAAG,GAAG,kBAAkB,CAAC,WAAW,CAAC,SAAS,CAAC,CAAC;IACtD,MAAM,eAAe,GAAG,QAAQ,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,kBAAkB,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IACpG,OAAO,GAAG,OAAO,SAAS,GAAG,IAAI,eAAe,KAAK,IAAI,EAAE,CAAC;AAC9D,CAAC;AAED,SAAS,eAAe,CAAC,MAAc,EAAE,iBAAqC;IAC5E,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,GAAG,CAAC,iBAAiB,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,MAAM,KAAK,MAAM,CAAC,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;AAC/H,CAAC;AAED,SAAS,kBAAkB,CAAC,UAAkB,EAAE,WAAqB,EAAE,iBAAqC;IAC1G,MAAM,OAAO,GAAG,IAAI,GAAG,CAAC,iBAAiB,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,UAAU,KAAK,UAAU,CAAC,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC;IACvH,OAAO,WAAW,CAAC,MAAM,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC;AAC7D,CAAC;AAED,SAAS,sBAAsB,CAAC,YAA4B,EAAE,gBAAgC;IAC5F,MAAM,kBAAkB,GAAG,gBAAgB,CAAC,OAAO,CAAC,CAAC,QAAQ,EAAE,EAAE,CAC/D,QAAQ,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,SAAS,EAAE,EAAE,CAAC,CAAC,EAAE,UAAU,EAAE,QAAQ,CAAC,EAAE,EAAE,QAAQ,EAAE,SAAS,CAAC,QAAQ,EAAE,IAAI,EAAE,SAAS,CAAC,IAAI,EAAE,CAAC,CAAC,CAC1H,CAAC;IACF,MAAM,KAAK,GAAuB,EAAE,CAAC;IACrC,MAAM,IAAI,GAAG,IAAI,GAAG,EAAU,CAAC;IAC/B,KAAK,MAAM,IAAI,IAAI,YAAY,EAAE,CAAC;QAChC,KAAK,MAAM,aAAa,IAAI,IAAI,CAAC,UAAU,EAAE,CAAC;YAC5C,MAAM,iBAAiB,GAAG,wBAAwB,CAAC,aAAa,CAAC,QAAQ,EAAE,aAAa,CAAC,IAAI,EAAE,kBAAkB,CAAC,CAAC;YACnH,IAAI,CAAC,iBAAiB;gBAAE,SAAS;YACjC,MAAM,GAAG,GAAG,GAAG,IAAI,CAAC,EAAE,IAAI,iBAAiB,CAAC,UAAU,EAAE,CAAC;YACzD,IAAI,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC;gBAAE,SAAS;YAC5B,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;YACd,KAAK,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,EAAE,UAAU,EAAE,iBAAiB,CAAC,UAAU,EAAE,CAAC,CAAC;QAC5E,CAAC;IACH,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC;AAED,SAAS,wBAAwB,CAAC,QAAgB,EAAE,IAAY,EAAE,kBAA4E;IAC5I,MAAM,eAAe,GAAG,CAAC,CAAC;IAC1B,OAAO,kBAAkB;SACtB,MAAM,CAAC,CAAC,SAAS,EAAE,EAAE,CAAC,SAAS,CAAC,QAAQ,KAAK,QAAQ,IAAI,SAAS,CAAC,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,SAAS,CAAC,IAAI,IAAI,eAAe,CAAC;SAC5H,IAAI,CAAC,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC;AACtD,CAAC;AAED,SAAS,mBAAmB,CAAC,QAA0B;IACrD,MAAM,OAAO,GAAG,IAAI,GAAG,EAA4B,CAAC;IACpD,KAAK,MAAM,KAAK,IAAI,QAAQ,EAAE,CAAC;QAC7B,MAAM,GAAG,GAAG,aAAa,CAAC,KAAK,CAAC,QAAQ,EAAE,KAAK,CAAC,IAAI,CAAC,CAAC;QACtD,OAAO,CAAC,GAAG,CAAC,GAAG,EAAE,CAAC,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,EAAE,CAAC,EAAE,KAAK,CAAC,CAAC,CAAC;IACzD,CAAC;IACD,OAAO,OAAO,CAAC;AACjB,CAAC"}
|
package/dist/screenshots.d.ts
CHANGED
|
@@ -1,8 +1,6 @@
|
|
|
1
1
|
import type { FeatureSpec, SpecScreenshot, ValidationIssue } from "./types.js";
|
|
2
|
-
/** Load screenshot evidence manifests and normalize entries for report rendering. */
|
|
3
2
|
export declare function collectSpecScreenshots(patterns: string[]): Promise<SpecScreenshot[]>;
|
|
4
|
-
|
|
5
|
-
export declare function validateScenarioScreenshots(specs: FeatureSpec[], screenshots: SpecScreenshot[]): ValidationIssue[];
|
|
3
|
+
export declare function validateScenarioScreenshots(specs: FeatureSpec[], evidence: SpecScreenshot[]): ValidationIssue[];
|
|
6
4
|
export declare function screenshotKey(filePath: string, line: number): string;
|
|
7
5
|
export declare function normalizeFilePath(filePath: string): string;
|
|
8
6
|
//# sourceMappingURL=screenshots.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"screenshots.d.ts","sourceRoot":"","sources":["../src/screenshots.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"screenshots.d.ts","sourceRoot":"","sources":["../src/screenshots.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,WAAW,EAAE,cAAc,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AAE/E,wBAAsB,sBAAsB,CAAC,QAAQ,EAAE,MAAM,EAAE,6BAgB9D;AAED,wBAAgB,2BAA2B,CACzC,KAAK,EAAE,WAAW,EAAE,EACpB,QAAQ,EAAE,cAAc,EAAE,qBA0B3B;AAED,wBAAgB,aAAa,CAAC,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,UAE3D;AAED,wBAAgB,iBAAiB,CAAC,QAAQ,EAAE,MAAM,UAEjD"}
|
package/dist/screenshots.js
CHANGED
|
@@ -1,42 +1,36 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Screenshot evidence manifest loading and normalization for generated spec
|
|
3
|
-
* implementation reports.
|
|
4
|
-
*/
|
|
5
1
|
import { readFile } from "node:fs/promises";
|
|
6
2
|
import { expandArtifactPatterns } from "./filePatterns.js";
|
|
7
|
-
/** Load screenshot evidence manifests and normalize entries for report rendering. */
|
|
8
3
|
export async function collectSpecScreenshots(patterns) {
|
|
9
|
-
const
|
|
4
|
+
const evidence = [];
|
|
10
5
|
for (const file of await expandArtifactPatterns(patterns)) {
|
|
11
6
|
const parsed = JSON.parse(await readFile(file, "utf8"));
|
|
12
|
-
const entries = Array.isArray(parsed)
|
|
13
|
-
? parsed
|
|
7
|
+
const entries = isRecord(parsed) && Array.isArray(parsed.evidence)
|
|
8
|
+
? parsed.evidence
|
|
14
9
|
: isRecord(parsed) && Array.isArray(parsed.screenshots)
|
|
15
10
|
? parsed.screenshots
|
|
16
11
|
: [];
|
|
17
12
|
for (const entry of entries) {
|
|
18
|
-
const
|
|
19
|
-
if (
|
|
20
|
-
|
|
13
|
+
const normalized = normalizeEvidence(entry);
|
|
14
|
+
if (normalized)
|
|
15
|
+
evidence.push(normalized);
|
|
21
16
|
}
|
|
22
17
|
}
|
|
23
|
-
return
|
|
18
|
+
return evidence;
|
|
24
19
|
}
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
const screenshotKeys = new Set(screenshots.map((screenshot) => screenshotKey(screenshot.specPath, screenshot.line)));
|
|
20
|
+
export function validateScenarioScreenshots(specs, evidence) {
|
|
21
|
+
const evidenceKeys = new Set(evidence.map((entry) => screenshotKey(entry.specPath, entry.line)));
|
|
28
22
|
const issues = [];
|
|
29
23
|
for (const spec of specs) {
|
|
30
24
|
for (const scenario of spec.scenarios) {
|
|
31
25
|
if (scenario.evidence.screenshots === "required") {
|
|
32
26
|
for (const step of scenario.steps) {
|
|
33
|
-
if (!
|
|
27
|
+
if (!evidenceKeys.has(screenshotKey(spec.filePath, step.line))) {
|
|
34
28
|
issues.push({
|
|
35
29
|
code: "missing-screenshot-evidence",
|
|
36
30
|
severity: "error",
|
|
37
31
|
filePath: spec.filePath,
|
|
38
32
|
line: step.line,
|
|
39
|
-
message: `
|
|
33
|
+
message: `Visual evidence is required for ${scenario.id} ${step.keyword} ${step.text}`,
|
|
40
34
|
});
|
|
41
35
|
}
|
|
42
36
|
}
|
|
@@ -51,23 +45,26 @@ export function screenshotKey(filePath, line) {
|
|
|
51
45
|
export function normalizeFilePath(filePath) {
|
|
52
46
|
return filePath.replace(/\\/g, "/").replace(/^\.\//, "");
|
|
53
47
|
}
|
|
54
|
-
function
|
|
48
|
+
function normalizeEvidence(value) {
|
|
55
49
|
if (!isRecord(value))
|
|
56
50
|
return null;
|
|
57
51
|
const specPath = value.specPath;
|
|
58
52
|
const line = value.line;
|
|
53
|
+
const changed = value.changed;
|
|
59
54
|
const imagePath = value.path ?? value.imagePath;
|
|
60
|
-
if (typeof specPath !== "string" ||
|
|
61
|
-
|
|
62
|
-
|
|
55
|
+
if (typeof specPath !== "string" || typeof line !== "number")
|
|
56
|
+
return null;
|
|
57
|
+
const changedValue = typeof changed === "boolean" ? changed : true;
|
|
58
|
+
if (changedValue && typeof imagePath !== "string")
|
|
63
59
|
return null;
|
|
64
|
-
}
|
|
65
60
|
return {
|
|
66
61
|
specPath: normalizeFilePath(specPath),
|
|
67
62
|
line,
|
|
68
|
-
|
|
63
|
+
changed: changedValue,
|
|
64
|
+
path: typeof imagePath === "string" ? imagePath : undefined,
|
|
69
65
|
title: typeof value.title === "string" ? value.title : undefined,
|
|
70
66
|
testPath: typeof value.testPath === "string" ? value.testPath : undefined,
|
|
67
|
+
comparedWithLine: typeof value.comparedWithLine === "number" ? value.comparedWithLine : undefined,
|
|
71
68
|
};
|
|
72
69
|
}
|
|
73
70
|
function isRecord(value) {
|
package/dist/screenshots.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"screenshots.js","sourceRoot":"","sources":["../src/screenshots.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"screenshots.js","sourceRoot":"","sources":["../src/screenshots.ts"],"names":[],"mappings":"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"}
|
package/dist/types.d.ts
CHANGED
|
@@ -1,15 +1,9 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Shared TypeScript types for parsed spec documents, validation issues,
|
|
3
|
-
* coverage summaries, test references, and screenshot evidence.
|
|
4
|
-
*/
|
|
5
|
-
/** Shared frontmatter fields supported by all spec documents. */
|
|
6
1
|
export type SpecFrontmatter = {
|
|
7
2
|
id: string;
|
|
8
3
|
title: string;
|
|
9
4
|
status?: "draft" | "active" | "deprecated";
|
|
10
5
|
owner?: string;
|
|
11
6
|
};
|
|
12
|
-
/** Frontmatter fields supported by documents that may reference models. */
|
|
13
7
|
export type ModelReferenceFrontmatter = SpecFrontmatter & {
|
|
14
8
|
model?: string;
|
|
15
9
|
models?: string[] | string;
|
|
@@ -20,14 +14,11 @@ export type ScenarioEvidencePolicy = {
|
|
|
20
14
|
test: ScenarioTestType;
|
|
21
15
|
screenshots: ScreenshotPolicy;
|
|
22
16
|
};
|
|
23
|
-
/** Frontmatter fields supported by `*.feature.md` files. */
|
|
24
17
|
export type FeatureFrontmatter = ModelReferenceFrontmatter & {
|
|
25
18
|
test?: ScenarioTestType;
|
|
26
19
|
screenshots?: ScreenshotPolicy;
|
|
27
20
|
};
|
|
28
|
-
/** Frontmatter fields supported by `*.design.md` files. */
|
|
29
21
|
export type DesignFrontmatter = ModelReferenceFrontmatter;
|
|
30
|
-
/** Parsed contents of one `*.model.md` file. */
|
|
31
22
|
export type ModelSpec = {
|
|
32
23
|
kind: "model";
|
|
33
24
|
filePath: string;
|
|
@@ -38,7 +29,6 @@ export type ModelSpec = {
|
|
|
38
29
|
rules: FeatureRule[];
|
|
39
30
|
source: string;
|
|
40
31
|
};
|
|
41
|
-
/** Parsed contents of one `*.feature.md` file. */
|
|
42
32
|
export type FeatureSpec = {
|
|
43
33
|
kind?: "feature";
|
|
44
34
|
filePath: string;
|
|
@@ -49,7 +39,6 @@ export type FeatureSpec = {
|
|
|
49
39
|
scenarios: FeatureScenario[];
|
|
50
40
|
source: string;
|
|
51
41
|
};
|
|
52
|
-
/** Parsed contents of one `*.stack.md` file. */
|
|
53
42
|
export type StackSpec = {
|
|
54
43
|
kind: "stack";
|
|
55
44
|
filePath: string;
|
|
@@ -63,7 +52,6 @@ export type StackSpec = {
|
|
|
63
52
|
rules: FeatureRule[];
|
|
64
53
|
source: string;
|
|
65
54
|
};
|
|
66
|
-
/** Parsed contents of one `*.design.md` file. */
|
|
67
55
|
export type DesignSpec = {
|
|
68
56
|
kind: "design";
|
|
69
57
|
filePath: string;
|
|
@@ -78,16 +66,13 @@ export type DesignSpec = {
|
|
|
78
66
|
rules: FeatureRule[];
|
|
79
67
|
source: string;
|
|
80
68
|
};
|
|
81
|
-
/** Any parsed spec document. */
|
|
82
69
|
export type SpecDocument = ModelSpec | FeatureSpec | StackSpec | DesignSpec;
|
|
83
|
-
/** A model concept declared in the `## Model` section. */
|
|
84
70
|
export type ModelItem = {
|
|
85
71
|
id: string;
|
|
86
72
|
title: string;
|
|
87
73
|
body: string;
|
|
88
74
|
line: number;
|
|
89
75
|
};
|
|
90
|
-
/** A rule declared in the `## Rules` section. */
|
|
91
76
|
export type FeatureRule = {
|
|
92
77
|
id: string;
|
|
93
78
|
text: string;
|
|
@@ -95,7 +80,6 @@ export type FeatureRule = {
|
|
|
95
80
|
strength: "required" | "recommended" | "optional" | "unspecified";
|
|
96
81
|
line: number;
|
|
97
82
|
};
|
|
98
|
-
/** A concrete example declared in the `## Scenarios` section. */
|
|
99
83
|
export type FeatureScenario = {
|
|
100
84
|
id: string;
|
|
101
85
|
title: string;
|
|
@@ -103,7 +87,6 @@ export type FeatureScenario = {
|
|
|
103
87
|
evidence: ScenarioEvidencePolicy;
|
|
104
88
|
steps: FeatureStep[];
|
|
105
89
|
};
|
|
106
|
-
/** A single Given / When / Then style step inside a scenario. */
|
|
107
90
|
export type FeatureStep = {
|
|
108
91
|
keyword: StepKeyword;
|
|
109
92
|
text: string;
|
|
@@ -111,7 +94,6 @@ export type FeatureStep = {
|
|
|
111
94
|
};
|
|
112
95
|
export type RuleKeyword = "MUST" | "MUST NOT" | "SHOULD" | "SHOULD NOT" | "MAY" | "OPTIONAL";
|
|
113
96
|
export type StepKeyword = "Given" | "When" | "Then" | "And" | "But";
|
|
114
|
-
/** Validation problem found in a spec, test reference, or report input. */
|
|
115
97
|
export type ValidationIssue = {
|
|
116
98
|
code: string;
|
|
117
99
|
severity: "error" | "warning";
|
|
@@ -119,7 +101,6 @@ export type ValidationIssue = {
|
|
|
119
101
|
filePath?: string;
|
|
120
102
|
line?: number;
|
|
121
103
|
};
|
|
122
|
-
/** A model item, rule, or scenario ID found in executable tests. */
|
|
123
104
|
export type TestReference = {
|
|
124
105
|
id: string;
|
|
125
106
|
filePath: string;
|
|
@@ -127,7 +108,6 @@ export type TestReference = {
|
|
|
127
108
|
kind: "model" | "rule" | "scenario";
|
|
128
109
|
source: "title" | "tag" | "covers" | "annotation" | "free-text";
|
|
129
110
|
};
|
|
130
|
-
/** Coverage state for one expected model item, rule, or scenario. */
|
|
131
111
|
export type CoverageItem = {
|
|
132
112
|
id: string;
|
|
133
113
|
title?: string;
|
|
@@ -136,7 +116,6 @@ export type CoverageItem = {
|
|
|
136
116
|
covered: boolean;
|
|
137
117
|
references: TestReference[];
|
|
138
118
|
};
|
|
139
|
-
/** Complete test coverage mapping for a set of spec documents. */
|
|
140
119
|
export type CoverageSummary = {
|
|
141
120
|
modelCoverage?: CoverageItem[];
|
|
142
121
|
ruleCoverage: CoverageItem[];
|
|
@@ -145,12 +124,13 @@ export type CoverageSummary = {
|
|
|
145
124
|
orphanRuleReferences: TestReference[];
|
|
146
125
|
orphanScenarioReferences: TestReference[];
|
|
147
126
|
};
|
|
148
|
-
/** Screenshot evidence associated with an exact spec line. */
|
|
149
127
|
export type SpecScreenshot = {
|
|
150
128
|
specPath: string;
|
|
151
129
|
line: number;
|
|
152
|
-
|
|
130
|
+
changed?: boolean;
|
|
131
|
+
path?: string;
|
|
153
132
|
title?: string;
|
|
154
133
|
testPath?: string;
|
|
134
|
+
comparedWithLine?: number;
|
|
155
135
|
};
|
|
156
136
|
//# sourceMappingURL=types.d.ts.map
|
package/dist/types.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,18 +1,36 @@
|
|
|
1
1
|
{
|
|
2
|
-
"
|
|
2
|
+
"evidence": [
|
|
3
3
|
{
|
|
4
4
|
"specPath": "src/mocks/current/specs/ticket-inbox.feature.md",
|
|
5
5
|
"line": 27,
|
|
6
|
+
"changed": true,
|
|
6
7
|
"path": "screenshots/SUPPORT-INBOX-S001-line-27-current.svg",
|
|
7
8
|
"title": "Inbox with priority badges",
|
|
8
9
|
"testPath": "src/mocks/current/tests/supportDesk.spec.ts"
|
|
9
10
|
},
|
|
11
|
+
{
|
|
12
|
+
"specPath": "src/mocks/current/specs/ticket-inbox.feature.md",
|
|
13
|
+
"line": 28,
|
|
14
|
+
"changed": false,
|
|
15
|
+
"title": "Inbox remains visually unchanged after selecting the first ticket",
|
|
16
|
+
"testPath": "src/mocks/current/tests/supportDesk.spec.ts",
|
|
17
|
+
"comparedWithLine": 27
|
|
18
|
+
},
|
|
10
19
|
{
|
|
11
20
|
"specPath": "src/mocks/current/specs/ticket-reply.feature.md",
|
|
12
21
|
"line": 27,
|
|
22
|
+
"changed": true,
|
|
13
23
|
"path": "screenshots/SUPPORT-REPLY-S001-line-27-current.svg",
|
|
14
24
|
"title": "Reply composer with suggested answer",
|
|
15
25
|
"testPath": "src/mocks/current/tests/supportDesk.spec.ts"
|
|
26
|
+
},
|
|
27
|
+
{
|
|
28
|
+
"specPath": "src/mocks/current/specs/ticket-reply.feature.md",
|
|
29
|
+
"line": 28,
|
|
30
|
+
"changed": false,
|
|
31
|
+
"title": "Reply composer stays visually unchanged while text is reviewed",
|
|
32
|
+
"testPath": "src/mocks/current/tests/supportDesk.spec.ts",
|
|
33
|
+
"comparedWithLine": 27
|
|
16
34
|
}
|
|
17
35
|
]
|
|
18
36
|
}
|
|
@@ -1,11 +1,20 @@
|
|
|
1
1
|
{
|
|
2
|
-
"
|
|
2
|
+
"evidence": [
|
|
3
3
|
{
|
|
4
4
|
"specPath": "src/mocks/previous/specs/ticket-inbox.feature.md",
|
|
5
5
|
"line": 27,
|
|
6
|
+
"changed": true,
|
|
6
7
|
"path": "screenshots/SUPPORT-INBOX-S001-line-27-previous.svg",
|
|
7
8
|
"title": "Inbox before priority badges",
|
|
8
9
|
"testPath": "src/mocks/previous/tests/supportDesk.spec.ts"
|
|
10
|
+
},
|
|
11
|
+
{
|
|
12
|
+
"specPath": "src/mocks/previous/specs/ticket-inbox.feature.md",
|
|
13
|
+
"line": 28,
|
|
14
|
+
"changed": false,
|
|
15
|
+
"title": "Inbox remains visually unchanged after selecting the first ticket",
|
|
16
|
+
"testPath": "src/mocks/previous/tests/supportDesk.spec.ts",
|
|
17
|
+
"comparedWithLine": 27
|
|
9
18
|
}
|
|
10
19
|
]
|
|
11
20
|
}
|