@testivai/witness 2.4.0 → 2.5.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/baselines/store.d.ts +17 -0
- package/dist/baselines/store.d.ts.map +1 -1
- package/dist/baselines/store.js +30 -1
- package/dist/baselines/store.js.map +1 -1
- package/dist/bin/testivai.js +2 -0
- package/dist/bin/testivai.js.map +1 -1
- package/dist/capture/environment.d.ts +217 -0
- package/dist/capture/environment.d.ts.map +1 -0
- package/dist/capture/environment.js +399 -0
- package/dist/capture/environment.js.map +1 -0
- package/dist/commands/env.d.ts +37 -0
- package/dist/commands/env.d.ts.map +1 -0
- package/dist/commands/env.js +113 -0
- package/dist/commands/env.js.map +1 -0
- package/dist/config/local-config.d.ts +14 -0
- package/dist/config/local-config.d.ts.map +1 -1
- package/dist/config/local-config.js +1 -0
- package/dist/config/local-config.js.map +1 -1
- package/dist/config/validate-config.d.ts.map +1 -1
- package/dist/config/validate-config.js +12 -0
- package/dist/config/validate-config.js.map +1 -1
- package/dist/index.d.ts +3 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +20 -1
- package/dist/index.js.map +1 -1
- package/dist/report/anchor.d.ts +18 -0
- package/dist/report/anchor.d.ts.map +1 -0
- package/dist/report/anchor.js +51 -0
- package/dist/report/anchor.js.map +1 -0
- package/dist/report/compare.d.ts +7 -0
- package/dist/report/compare.d.ts.map +1 -1
- package/dist/report/compare.js +22 -2
- package/dist/report/compare.js.map +1 -1
- package/dist/report/environment.d.ts +101 -0
- package/dist/report/environment.d.ts.map +1 -0
- package/dist/report/environment.js +331 -0
- package/dist/report/environment.js.map +1 -0
- package/dist/report/generator.d.ts +7 -2
- package/dist/report/generator.d.ts.map +1 -1
- package/dist/report/generator.js +33 -6
- package/dist/report/generator.js.map +1 -1
- package/dist/report/index.d.ts +5 -2
- package/dist/report/index.d.ts.map +1 -1
- package/dist/report/index.js +11 -1
- package/dist/report/index.js.map +1 -1
- package/dist/report/results.d.ts +33 -0
- package/dist/report/results.d.ts.map +1 -1
- package/dist/report/template.d.ts +28 -1
- package/dist/report/template.d.ts.map +1 -1
- package/dist/report/template.js +127 -15
- package/dist/report/template.js.map +1 -1
- package/dist/report/validate.d.ts +50 -0
- package/dist/report/validate.d.ts.map +1 -0
- package/dist/report/validate.js +343 -0
- package/dist/report/validate.js.map +1 -0
- package/dist/standalone/run.d.ts +12 -0
- package/dist/standalone/run.d.ts.map +1 -1
- package/dist/standalone/run.js +37 -1
- package/dist/standalone/run.js.map +1 -1
- package/package.json +1 -1
|
@@ -0,0 +1,331 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* TestivAI Report — what changed in the capture environment
|
|
4
|
+
*
|
|
5
|
+
* The compare reads the environment the baseline was captured in next to the
|
|
6
|
+
* current capture's (capture/environment.ts) and lists every field that
|
|
7
|
+
* differs. Only some of those can change how a page renders. A new browser
|
|
8
|
+
* build, another OS, distro or architecture, another device scale, viewport,
|
|
9
|
+
* color scheme, locale or time zone, another capture method, a container or a
|
|
10
|
+
* relabelled environment can; a newer test framework, adapter or driver, a
|
|
11
|
+
* new CI runner image or another project name cannot on its own (a browser
|
|
12
|
+
* that came with a framework upgrade shows up as the browser change).
|
|
13
|
+
*
|
|
14
|
+
* When pixels differ, the DOM and the computed styles are identical and the
|
|
15
|
+
* rendering environment changed, the diff is RENDERING DRIFT: the machine
|
|
16
|
+
* changed, not the page. The report, @testivai/mcp and the GitHub Action
|
|
17
|
+
* word it that way instead of "likely render noise", and say it once at the
|
|
18
|
+
* top when several snapshots share the same change.
|
|
19
|
+
*
|
|
20
|
+
* Read from results.json fields only, so every surface agrees.
|
|
21
|
+
*/
|
|
22
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
23
|
+
exports.diffEnvironments = diffEnvironments;
|
|
24
|
+
exports.describeCaptureMethod = describeCaptureMethod;
|
|
25
|
+
exports.describeEnvironmentChange = describeEnvironmentChange;
|
|
26
|
+
exports.isRenderingDrift = isRenderingDrift;
|
|
27
|
+
exports.snapshotEnvironmentChange = snapshotEnvironmentChange;
|
|
28
|
+
exports.commonEnvironment = commonEnvironment;
|
|
29
|
+
exports.environmentChangeGroups = environmentChangeGroups;
|
|
30
|
+
exports.environmentChangeLine = environmentChangeLine;
|
|
31
|
+
const diff_shape_1 = require("./diff-shape");
|
|
32
|
+
/** Fields whose absence means "no": the collector always decides them. */
|
|
33
|
+
const PRESENCE_DEFAULTS = { container: 'false', label: '', 'ci.provider': 'none' };
|
|
34
|
+
/** Fields that can change rendering on any platform. */
|
|
35
|
+
const RENDERING_FIELDS = new Set([
|
|
36
|
+
'browser.name',
|
|
37
|
+
'browser.version',
|
|
38
|
+
'browser.channel',
|
|
39
|
+
'browser.headless',
|
|
40
|
+
'os.platform',
|
|
41
|
+
'os.arch',
|
|
42
|
+
'os.distro',
|
|
43
|
+
'render.viewport',
|
|
44
|
+
'render.deviceScaleFactor',
|
|
45
|
+
'render.colorScheme',
|
|
46
|
+
'render.reducedMotion',
|
|
47
|
+
'render.locale',
|
|
48
|
+
'render.timezone',
|
|
49
|
+
'adapter.captureMethod',
|
|
50
|
+
'container',
|
|
51
|
+
'label',
|
|
52
|
+
]);
|
|
53
|
+
/** Platforms whose os.release is the OS version (and so the text renderer). */
|
|
54
|
+
const RELEASE_IS_OS_VERSION = new Set(['darwin', 'win32']);
|
|
55
|
+
function flatten(env) {
|
|
56
|
+
const flat = new Map();
|
|
57
|
+
const put = (key, value) => {
|
|
58
|
+
if (value === undefined || value === null)
|
|
59
|
+
return;
|
|
60
|
+
flat.set(key, String(value));
|
|
61
|
+
};
|
|
62
|
+
for (const [section, value] of Object.entries(env)) {
|
|
63
|
+
if (value && typeof value === 'object' && !Array.isArray(value)) {
|
|
64
|
+
for (const [field, inner] of Object.entries(value)) {
|
|
65
|
+
if (section === 'render' && field === 'viewport' && inner && typeof inner === 'object') {
|
|
66
|
+
const vp = inner;
|
|
67
|
+
put('render.viewport', `${vp.width}x${vp.height}`);
|
|
68
|
+
}
|
|
69
|
+
else if (inner === null || typeof inner !== 'object') {
|
|
70
|
+
put(`${section}.${field}`, inner);
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
else {
|
|
75
|
+
put(section, value);
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
return flat;
|
|
79
|
+
}
|
|
80
|
+
/** Whether one differing field can change how the page renders. */
|
|
81
|
+
function isRenderingField(field, baseline, candidate) {
|
|
82
|
+
if (field.startsWith('render.'))
|
|
83
|
+
return true;
|
|
84
|
+
if (field === 'os.release') {
|
|
85
|
+
return baseline.os.platform === candidate.os.platform && RELEASE_IS_OS_VERSION.has(candidate.os.platform);
|
|
86
|
+
}
|
|
87
|
+
return RENDERING_FIELDS.has(field);
|
|
88
|
+
}
|
|
89
|
+
/**
|
|
90
|
+
* Every field that differs between two recorded environments, and the subset
|
|
91
|
+
* that can change rendering, both sorted. A field recorded on one side only
|
|
92
|
+
* is unknown (an older adapter did not record it), not a change; the
|
|
93
|
+
* container, the label and the CI provider are always decided by the
|
|
94
|
+
* collector, so their absence means "no".
|
|
95
|
+
*/
|
|
96
|
+
function diffEnvironments(baseline, candidate) {
|
|
97
|
+
const a = flatten(baseline);
|
|
98
|
+
const b = flatten(candidate);
|
|
99
|
+
const keys = new Set([...a.keys(), ...b.keys(), ...Object.keys(PRESENCE_DEFAULTS)]);
|
|
100
|
+
const delta = [];
|
|
101
|
+
for (const key of keys) {
|
|
102
|
+
const fallback = PRESENCE_DEFAULTS[key];
|
|
103
|
+
const left = a.get(key) ?? fallback;
|
|
104
|
+
const right = b.get(key) ?? fallback;
|
|
105
|
+
if (left === undefined || right === undefined)
|
|
106
|
+
continue;
|
|
107
|
+
if (left !== right)
|
|
108
|
+
delta.push(key);
|
|
109
|
+
}
|
|
110
|
+
delta.sort();
|
|
111
|
+
return { delta, renderingDelta: delta.filter((f) => isRenderingField(f, baseline, candidate)) };
|
|
112
|
+
}
|
|
113
|
+
const MECHANISMS = {
|
|
114
|
+
cdp: 'CDP',
|
|
115
|
+
playwright: 'Playwright',
|
|
116
|
+
stitched: 'scroll and stitch',
|
|
117
|
+
firefox: 'Firefox',
|
|
118
|
+
webdriver: 'WebDriver',
|
|
119
|
+
};
|
|
120
|
+
/** "full-page:cdp" → "full page (CDP)"; an unknown method passes through. */
|
|
121
|
+
function describeCaptureMethod(method) {
|
|
122
|
+
const m = /^(full-page|viewport):([a-z0-9-]+)$/.exec(method);
|
|
123
|
+
if (!m)
|
|
124
|
+
return method;
|
|
125
|
+
return `${m[1] === 'full-page' ? 'full page' : 'viewport'} (${MECHANISMS[m[2]] ?? m[2]})`;
|
|
126
|
+
}
|
|
127
|
+
/** The order changes are listed in: what renders first, context last. */
|
|
128
|
+
const ORDER = [
|
|
129
|
+
'browser',
|
|
130
|
+
'browser.channel',
|
|
131
|
+
'browser.headless',
|
|
132
|
+
'os.platform',
|
|
133
|
+
'os.distro',
|
|
134
|
+
'os.release',
|
|
135
|
+
'os.arch',
|
|
136
|
+
'render.viewport',
|
|
137
|
+
'render.deviceScaleFactor',
|
|
138
|
+
'render.colorScheme',
|
|
139
|
+
'render.reducedMotion',
|
|
140
|
+
'render.locale',
|
|
141
|
+
'render.timezone',
|
|
142
|
+
'adapter.captureMethod',
|
|
143
|
+
'container',
|
|
144
|
+
'label',
|
|
145
|
+
];
|
|
146
|
+
const LABELS = {
|
|
147
|
+
'browser.channel': 'channel',
|
|
148
|
+
'browser.headless': 'headless',
|
|
149
|
+
'os.platform': 'OS',
|
|
150
|
+
'os.release': 'OS release',
|
|
151
|
+
'os.arch': 'arch',
|
|
152
|
+
'render.viewport': 'viewport',
|
|
153
|
+
'render.deviceScaleFactor': 'device scale',
|
|
154
|
+
'render.colorScheme': 'color scheme',
|
|
155
|
+
'render.reducedMotion': 'reduced motion',
|
|
156
|
+
'render.locale': 'locale',
|
|
157
|
+
'render.timezone': 'time zone',
|
|
158
|
+
'ci.provider': 'CI',
|
|
159
|
+
'ci.runnerImage': 'runner image',
|
|
160
|
+
project: 'project',
|
|
161
|
+
};
|
|
162
|
+
const yesNo = (v) => (v === 'true' ? 'yes' : 'no');
|
|
163
|
+
/**
|
|
164
|
+
* The listed fields as one readable clause, each with its values, in a fixed
|
|
165
|
+
* order: "chromium 130.0.6723.58 → 141.0.7390.37, ubuntu 22.04 → ubuntu
|
|
166
|
+
* 24.04, capture method full page (CDP) → viewport (WebDriver)".
|
|
167
|
+
*/
|
|
168
|
+
function describeEnvironmentChange(baseline, candidate, fields) {
|
|
169
|
+
const a = flatten(baseline);
|
|
170
|
+
const b = flatten(candidate);
|
|
171
|
+
const set = new Set(fields);
|
|
172
|
+
const parts = [];
|
|
173
|
+
const rank = (key) => {
|
|
174
|
+
const i = ORDER.indexOf(key);
|
|
175
|
+
return i === -1 ? ORDER.length : i;
|
|
176
|
+
};
|
|
177
|
+
if (set.has('browser.name') || set.has('browser.version')) {
|
|
178
|
+
const side = (f, withName) => [withName ? f.get('browser.name') : undefined, f.get('browser.version')].filter(Boolean).join(' ');
|
|
179
|
+
const sameName = a.get('browser.name') === b.get('browser.name');
|
|
180
|
+
parts.push({ rank: rank('browser'), text: `${side(a, true)} → ${side(b, !sameName)}` });
|
|
181
|
+
}
|
|
182
|
+
for (const field of set) {
|
|
183
|
+
if (field === 'browser.name' || field === 'browser.version')
|
|
184
|
+
continue;
|
|
185
|
+
const left = a.get(field);
|
|
186
|
+
const right = b.get(field);
|
|
187
|
+
let text;
|
|
188
|
+
if (field === 'browser.headless' || field === 'container') {
|
|
189
|
+
text = `${field === 'container' ? 'container' : 'headless'} ${yesNo(left)} → ${yesNo(right)}`;
|
|
190
|
+
}
|
|
191
|
+
else if (field === 'label') {
|
|
192
|
+
text = `environment label ${left || 'none'} → ${right || 'none'}`;
|
|
193
|
+
}
|
|
194
|
+
else if (field === 'os.distro') {
|
|
195
|
+
text = `${left ?? 'unknown'} → ${right ?? 'unknown'}`;
|
|
196
|
+
}
|
|
197
|
+
else if (field === 'adapter.captureMethod') {
|
|
198
|
+
text = `capture method ${describeCaptureMethod(left ?? '?')} → ${describeCaptureMethod(right ?? '?')}`;
|
|
199
|
+
}
|
|
200
|
+
else if (/^(framework|adapter|driver)\.version$/.test(field)) {
|
|
201
|
+
const owner = field.split('.')[0];
|
|
202
|
+
text = `${b.get(`${owner}.name`) ?? owner} ${left ?? '?'} → ${right ?? '?'}`;
|
|
203
|
+
}
|
|
204
|
+
else {
|
|
205
|
+
text = `${LABELS[field] ?? field} ${left ?? 'none'} → ${right ?? 'none'}`;
|
|
206
|
+
}
|
|
207
|
+
parts.push({ rank: rank(field), text });
|
|
208
|
+
}
|
|
209
|
+
return parts
|
|
210
|
+
.sort((x, y) => x.rank - y.rank)
|
|
211
|
+
.map((p) => p.text)
|
|
212
|
+
.join(', ');
|
|
213
|
+
}
|
|
214
|
+
/** Rendering fields that also explain a size change. */
|
|
215
|
+
const SIZE_FIELDS = ['render.viewport', 'render.deviceScaleFactor', 'adapter.captureMethod'];
|
|
216
|
+
/**
|
|
217
|
+
* Rendering drift: pixels differ (the snapshot is changed, or was auto-passed
|
|
218
|
+
* by a tolerance), the DOM is identical, the computed styles were compared and
|
|
219
|
+
* match, and the rendering environment changed since the baseline. Never for
|
|
220
|
+
* a diff concentrated in one area (a new browser or OS redraws text
|
|
221
|
+
* everywhere; one area is a bad capture or a change the style check does not
|
|
222
|
+
* cover). A size change counts only when the environment explains it (the
|
|
223
|
+
* viewport, the device scale or the capture method changed).
|
|
224
|
+
*/
|
|
225
|
+
function isRenderingDrift(snapshot) {
|
|
226
|
+
if (snapshot.status !== 'changed' && !(snapshot.status === 'passed' && snapshot.autoPassed))
|
|
227
|
+
return false;
|
|
228
|
+
const rendering = snapshot.environment?.renderingDelta ?? [];
|
|
229
|
+
if (rendering.length === 0)
|
|
230
|
+
return false;
|
|
231
|
+
const dom = snapshot.dom;
|
|
232
|
+
if (!dom || dom.changed || dom.styleCheck !== 'match')
|
|
233
|
+
return false;
|
|
234
|
+
if (snapshot.sizeMismatch)
|
|
235
|
+
return rendering.some((f) => SIZE_FIELDS.includes(f));
|
|
236
|
+
return (0, diff_shape_1.diffShape)(snapshot).kind !== 'concentrated';
|
|
237
|
+
}
|
|
238
|
+
/** The rendering change of one snapshot, worded, or null when there is none. */
|
|
239
|
+
function snapshotEnvironmentChange(snapshot) {
|
|
240
|
+
const e = snapshot.environment;
|
|
241
|
+
if (!e || e.renderingDelta.length === 0 || !e.baseline || !e.candidate)
|
|
242
|
+
return null;
|
|
243
|
+
return describeEnvironmentChange(e.baseline, e.candidate, e.renderingDelta);
|
|
244
|
+
}
|
|
245
|
+
const SECTIONS_ORDER = [
|
|
246
|
+
'os',
|
|
247
|
+
'browser',
|
|
248
|
+
'framework',
|
|
249
|
+
'adapter',
|
|
250
|
+
'driver',
|
|
251
|
+
'render',
|
|
252
|
+
'ci',
|
|
253
|
+
'container',
|
|
254
|
+
'label',
|
|
255
|
+
'project',
|
|
256
|
+
];
|
|
257
|
+
/**
|
|
258
|
+
* The fields every listed environment agrees on: the run-level block in
|
|
259
|
+
* results.json. One environment is its own; none is null.
|
|
260
|
+
*/
|
|
261
|
+
function commonEnvironment(envs) {
|
|
262
|
+
if (envs.length === 0)
|
|
263
|
+
return null;
|
|
264
|
+
const same = (values) => values.every((v) => JSON.stringify(v) === JSON.stringify(values[0]));
|
|
265
|
+
const out = {};
|
|
266
|
+
for (const section of SECTIONS_ORDER) {
|
|
267
|
+
const values = envs.map((e) => e[section]);
|
|
268
|
+
if (values.every((v) => v === undefined))
|
|
269
|
+
continue;
|
|
270
|
+
const first = values[0];
|
|
271
|
+
if (first && typeof first === 'object' && !Array.isArray(first)) {
|
|
272
|
+
if (values.some((v) => !v || typeof v !== 'object'))
|
|
273
|
+
continue;
|
|
274
|
+
const shared = {};
|
|
275
|
+
for (const key of Object.keys(first)) {
|
|
276
|
+
const inner = values.map((v) => v[key]);
|
|
277
|
+
if (same(inner))
|
|
278
|
+
shared[key] = inner[0];
|
|
279
|
+
}
|
|
280
|
+
if (Object.keys(shared).length > 0)
|
|
281
|
+
out[section] = shared;
|
|
282
|
+
}
|
|
283
|
+
else if (same(values)) {
|
|
284
|
+
out[section] = first;
|
|
285
|
+
}
|
|
286
|
+
}
|
|
287
|
+
return out;
|
|
288
|
+
}
|
|
289
|
+
/**
|
|
290
|
+
* Changed (and auto-passed) snapshots grouped by the same rendering
|
|
291
|
+
* environment change, largest group first. A passed snapshot with no pixel
|
|
292
|
+
* diff is not counted: nothing to explain.
|
|
293
|
+
*/
|
|
294
|
+
function environmentChangeGroups(snapshots) {
|
|
295
|
+
const groups = new Map();
|
|
296
|
+
for (const s of snapshots) {
|
|
297
|
+
if (s.status !== 'changed' && !(s.status === 'passed' && s.autoPassed))
|
|
298
|
+
continue;
|
|
299
|
+
const change = snapshotEnvironmentChange(s);
|
|
300
|
+
if (!change)
|
|
301
|
+
continue;
|
|
302
|
+
const group = groups.get(change) ?? { change, snapshots: [], drift: [] };
|
|
303
|
+
group.snapshots.push(s.name);
|
|
304
|
+
if (isRenderingDrift(s))
|
|
305
|
+
group.drift.push(s.name);
|
|
306
|
+
groups.set(change, group);
|
|
307
|
+
}
|
|
308
|
+
return [...groups.values()].sort((x, y) => y.snapshots.length - x.snapshots.length);
|
|
309
|
+
}
|
|
310
|
+
const plural = (n, one, many) => `${n} ${n === 1 ? one : many}`;
|
|
311
|
+
/**
|
|
312
|
+
* The line said once at the top of the report, the PR comment and
|
|
313
|
+
* get_visual_results for a group of two or more snapshots, with an honest
|
|
314
|
+
* count of how many are drift alone.
|
|
315
|
+
*/
|
|
316
|
+
function environmentChangeLine(group) {
|
|
317
|
+
const n = group.snapshots.length;
|
|
318
|
+
const d = group.drift.length;
|
|
319
|
+
const head = `Environment changed since the baselines (${group.change})`;
|
|
320
|
+
if (d === n) {
|
|
321
|
+
return (`${head}: ${plural(n, 'diff is', 'diffs are')} rendering drift (DOM and computed styles identical), not page changes; ` +
|
|
322
|
+
`re-baseline ${n === 1 ? 'it' : 'them'} once the images are confirmed.`);
|
|
323
|
+
}
|
|
324
|
+
if (d === 0) {
|
|
325
|
+
return `${head} for ${plural(n, 'snapshot', 'snapshots')}; each also has a change the environment does not explain, so review ${n === 1 ? 'it' : 'them'} on ${n === 1 ? 'its' : 'their'} own.`;
|
|
326
|
+
}
|
|
327
|
+
const rest = n - d;
|
|
328
|
+
return (`${head} for ${plural(n, 'snapshot', 'snapshots')}: ${d} ${d === 1 ? 'is' : 'are'} rendering drift (DOM and computed styles identical); ` +
|
|
329
|
+
`${rest} also ${rest === 1 ? 'has' : 'have'} a change the environment does not explain, review ${rest === 1 ? 'it' : 'them'} on ${rest === 1 ? 'its' : 'their'} own.`);
|
|
330
|
+
}
|
|
331
|
+
//# sourceMappingURL=environment.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"environment.js","sourceRoot":"","sources":["../../src/report/environment.ts"],"names":[],"mappings":";AAAA;;;;;;;;;;;;;;;;;;;GAmBG;;AA2FH,4CAiBC;AAWD,sDAIC;AA8CD,8DA6CC;AAcD,4CAQC;AAGD,8DAIC;AAmBD,8CAqBC;AAiBD,0DAYC;AASD,sDAkBC;AAhVD,6CAA8D;AAuB9D,0EAA0E;AAC1E,MAAM,iBAAiB,GAA2B,EAAE,SAAS,EAAE,OAAO,EAAE,KAAK,EAAE,EAAE,EAAE,aAAa,EAAE,MAAM,EAAE,CAAC;AAE3G,wDAAwD;AACxD,MAAM,gBAAgB,GAAG,IAAI,GAAG,CAAC;IAC/B,cAAc;IACd,iBAAiB;IACjB,iBAAiB;IACjB,kBAAkB;IAClB,aAAa;IACb,SAAS;IACT,WAAW;IACX,iBAAiB;IACjB,0BAA0B;IAC1B,oBAAoB;IACpB,sBAAsB;IACtB,eAAe;IACf,iBAAiB;IACjB,uBAAuB;IACvB,WAAW;IACX,OAAO;CACR,CAAC,CAAC;AAEH,+EAA+E;AAC/E,MAAM,qBAAqB,GAAG,IAAI,GAAG,CAAC,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC,CAAC;AAE3D,SAAS,OAAO,CAAC,GAAuB;IACtC,MAAM,IAAI,GAAS,IAAI,GAAG,EAAE,CAAC;IAC7B,MAAM,GAAG,GAAG,CAAC,GAAW,EAAE,KAAc,EAAE,EAAE;QAC1C,IAAI,KAAK,KAAK,SAAS,IAAI,KAAK,KAAK,IAAI;YAAE,OAAO;QAClD,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC;IAC/B,CAAC,CAAC;IACF,KAAK,MAAM,CAAC,OAAO,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC;QACnD,IAAI,KAAK,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC;YAChE,KAAK,MAAM,CAAC,KAAK,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,KAAgC,CAAC,EAAE,CAAC;gBAC9E,IAAI,OAAO,KAAK,QAAQ,IAAI,KAAK,KAAK,UAAU,IAAI,KAAK,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;oBACvF,MAAM,EAAE,GAAG,KAA4C,CAAC;oBACxD,GAAG,CAAC,iBAAiB,EAAE,GAAG,EAAE,CAAC,KAAK,IAAI,EAAE,CAAC,MAAM,EAAE,CAAC,CAAC;gBACrD,CAAC;qBAAM,IAAI,KAAK,KAAK,IAAI,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;oBACvD,GAAG,CAAC,GAAG,OAAO,IAAI,KAAK,EAAE,EAAE,KAAK,CAAC,CAAC;gBACpC,CAAC;YACH,CAAC;QACH,CAAC;aAAM,CAAC;YACN,GAAG,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC;QACtB,CAAC;IACH,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC;AAED,mEAAmE;AACnE,SAAS,gBAAgB,CAAC,KAAa,EAAE,QAA4B,EAAE,SAA6B;IAClG,IAAI,KAAK,CAAC,UAAU,CAAC,SAAS,CAAC;QAAE,OAAO,IAAI,CAAC;IAC7C,IAAI,KAAK,KAAK,YAAY,EAAE,CAAC;QAC3B,OAAO,QAAQ,CAAC,EAAE,CAAC,QAAQ,KAAK,SAAS,CAAC,EAAE,CAAC,QAAQ,IAAI,qBAAqB,CAAC,GAAG,CAAC,SAAS,CAAC,EAAE,CAAC,QAAQ,CAAC,CAAC;IAC5G,CAAC;IACD,OAAO,gBAAgB,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;AACrC,CAAC;AAED;;;;;;GAMG;AACH,SAAgB,gBAAgB,CAC9B,QAA4B,EAC5B,SAA6B;IAE7B,MAAM,CAAC,GAAG,OAAO,CAAC,QAAQ,CAAC,CAAC;IAC5B,MAAM,CAAC,GAAG,OAAO,CAAC,SAAS,CAAC,CAAC;IAC7B,MAAM,IAAI,GAAG,IAAI,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,GAAG,MAAM,CAAC,IAAI,CAAC,iBAAiB,CAAC,CAAC,CAAC,CAAC;IACpF,MAAM,KAAK,GAAa,EAAE,CAAC;IAC3B,KAAK,MAAM,GAAG,IAAI,IAAI,EAAE,CAAC;QACvB,MAAM,QAAQ,GAAG,iBAAiB,CAAC,GAAG,CAAC,CAAC;QACxC,MAAM,IAAI,GAAG,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,QAAQ,CAAC;QACpC,MAAM,KAAK,GAAG,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,QAAQ,CAAC;QACrC,IAAI,IAAI,KAAK,SAAS,IAAI,KAAK,KAAK,SAAS;YAAE,SAAS;QACxD,IAAI,IAAI,KAAK,KAAK;YAAE,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IACtC,CAAC;IACD,KAAK,CAAC,IAAI,EAAE,CAAC;IACb,OAAO,EAAE,KAAK,EAAE,cAAc,EAAE,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,gBAAgB,CAAC,CAAC,EAAE,QAAQ,EAAE,SAAS,CAAC,CAAC,EAAE,CAAC;AAClG,CAAC;AAED,MAAM,UAAU,GAA2B;IACzC,GAAG,EAAE,KAAK;IACV,UAAU,EAAE,YAAY;IACxB,QAAQ,EAAE,mBAAmB;IAC7B,OAAO,EAAE,SAAS;IAClB,SAAS,EAAE,WAAW;CACvB,CAAC;AAEF,6EAA6E;AAC7E,SAAgB,qBAAqB,CAAC,MAAc;IAClD,MAAM,CAAC,GAAG,qCAAqC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;IAC7D,IAAI,CAAC,CAAC;QAAE,OAAO,MAAM,CAAC;IACtB,OAAO,GAAG,CAAC,CAAC,CAAC,CAAC,KAAK,WAAW,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,UAAU,KAAK,UAAU,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC;AAC5F,CAAC;AAED,yEAAyE;AACzE,MAAM,KAAK,GAAG;IACZ,SAAS;IACT,iBAAiB;IACjB,kBAAkB;IAClB,aAAa;IACb,WAAW;IACX,YAAY;IACZ,SAAS;IACT,iBAAiB;IACjB,0BAA0B;IAC1B,oBAAoB;IACpB,sBAAsB;IACtB,eAAe;IACf,iBAAiB;IACjB,uBAAuB;IACvB,WAAW;IACX,OAAO;CACR,CAAC;AAEF,MAAM,MAAM,GAA2B;IACrC,iBAAiB,EAAE,SAAS;IAC5B,kBAAkB,EAAE,UAAU;IAC9B,aAAa,EAAE,IAAI;IACnB,YAAY,EAAE,YAAY;IAC1B,SAAS,EAAE,MAAM;IACjB,iBAAiB,EAAE,UAAU;IAC7B,0BAA0B,EAAE,cAAc;IAC1C,oBAAoB,EAAE,cAAc;IACpC,sBAAsB,EAAE,gBAAgB;IACxC,eAAe,EAAE,QAAQ;IACzB,iBAAiB,EAAE,WAAW;IAC9B,aAAa,EAAE,IAAI;IACnB,gBAAgB,EAAE,cAAc;IAChC,OAAO,EAAE,SAAS;CACnB,CAAC;AAEF,MAAM,KAAK,GAAG,CAAC,CAAqB,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;AAEvE;;;;GAIG;AACH,SAAgB,yBAAyB,CACvC,QAA4B,EAC5B,SAA6B,EAC7B,MAAgB;IAEhB,MAAM,CAAC,GAAG,OAAO,CAAC,QAAQ,CAAC,CAAC;IAC5B,MAAM,CAAC,GAAG,OAAO,CAAC,SAAS,CAAC,CAAC;IAC7B,MAAM,GAAG,GAAG,IAAI,GAAG,CAAC,MAAM,CAAC,CAAC;IAC5B,MAAM,KAAK,GAA0C,EAAE,CAAC;IACxD,MAAM,IAAI,GAAG,CAAC,GAAW,EAAE,EAAE;QAC3B,MAAM,CAAC,GAAG,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;QAC7B,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC;IACrC,CAAC,CAAC;IAEF,IAAI,GAAG,CAAC,GAAG,CAAC,cAAc,CAAC,IAAI,GAAG,CAAC,GAAG,CAAC,iBAAiB,CAAC,EAAE,CAAC;QAC1D,MAAM,IAAI,GAAG,CAAC,CAAO,EAAE,QAAiB,EAAE,EAAE,CAC1C,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,cAAc,CAAC,CAAC,CAAC,CAAC,SAAS,EAAE,CAAC,CAAC,GAAG,CAAC,iBAAiB,CAAC,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QACrG,MAAM,QAAQ,GAAG,CAAC,CAAC,GAAG,CAAC,cAAc,CAAC,KAAK,CAAC,CAAC,GAAG,CAAC,cAAc,CAAC,CAAC;QACjE,KAAK,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,EAAE,IAAI,EAAE,GAAG,IAAI,CAAC,CAAC,EAAE,IAAI,CAAC,MAAM,IAAI,CAAC,CAAC,EAAE,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC,CAAC;IAC1F,CAAC;IACD,KAAK,MAAM,KAAK,IAAI,GAAG,EAAE,CAAC;QACxB,IAAI,KAAK,KAAK,cAAc,IAAI,KAAK,KAAK,iBAAiB;YAAE,SAAS;QACtE,MAAM,IAAI,GAAG,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;QAC1B,MAAM,KAAK,GAAG,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;QAC3B,IAAI,IAAY,CAAC;QACjB,IAAI,KAAK,KAAK,kBAAkB,IAAI,KAAK,KAAK,WAAW,EAAE,CAAC;YAC1D,IAAI,GAAG,GAAG,KAAK,KAAK,WAAW,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,UAAU,IAAI,KAAK,CAAC,IAAI,CAAC,MAAM,KAAK,CAAC,KAAK,CAAC,EAAE,CAAC;QAChG,CAAC;aAAM,IAAI,KAAK,KAAK,OAAO,EAAE,CAAC;YAC7B,IAAI,GAAG,qBAAqB,IAAI,IAAI,MAAM,MAAM,KAAK,IAAI,MAAM,EAAE,CAAC;QACpE,CAAC;aAAM,IAAI,KAAK,KAAK,WAAW,EAAE,CAAC;YACjC,IAAI,GAAG,GAAG,IAAI,IAAI,SAAS,MAAM,KAAK,IAAI,SAAS,EAAE,CAAC;QACxD,CAAC;aAAM,IAAI,KAAK,KAAK,uBAAuB,EAAE,CAAC;YAC7C,IAAI,GAAG,kBAAkB,qBAAqB,CAAC,IAAI,IAAI,GAAG,CAAC,MAAM,qBAAqB,CAAC,KAAK,IAAI,GAAG,CAAC,EAAE,CAAC;QACzG,CAAC;aAAM,IAAI,uCAAuC,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC;YAC/D,MAAM,KAAK,GAAG,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;YAClC,IAAI,GAAG,GAAG,CAAC,CAAC,GAAG,CAAC,GAAG,KAAK,OAAO,CAAC,IAAI,KAAK,IAAI,IAAI,IAAI,GAAG,MAAM,KAAK,IAAI,GAAG,EAAE,CAAC;QAC/E,CAAC;aAAM,CAAC;YACN,IAAI,GAAG,GAAG,MAAM,CAAC,KAAK,CAAC,IAAI,KAAK,IAAI,IAAI,IAAI,MAAM,MAAM,KAAK,IAAI,MAAM,EAAE,CAAC;QAC5E,CAAC;QACD,KAAK,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,IAAI,CAAC,KAAK,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC;IAC1C,CAAC;IACD,OAAO,KAAK;SACT,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,GAAG,CAAC,CAAC,IAAI,CAAC;SAC/B,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC;SAClB,IAAI,CAAC,IAAI,CAAC,CAAC;AAChB,CAAC;AAED,wDAAwD;AACxD,MAAM,WAAW,GAAG,CAAC,iBAAiB,EAAE,0BAA0B,EAAE,uBAAuB,CAAC,CAAC;AAE7F;;;;;;;;GAQG;AACH,SAAgB,gBAAgB,CAAC,QAAkC;IACjE,IAAI,QAAQ,CAAC,MAAM,KAAK,SAAS,IAAI,CAAC,CAAC,QAAQ,CAAC,MAAM,KAAK,QAAQ,IAAI,QAAQ,CAAC,UAAU,CAAC;QAAE,OAAO,KAAK,CAAC;IAC1G,MAAM,SAAS,GAAG,QAAQ,CAAC,WAAW,EAAE,cAAc,IAAI,EAAE,CAAC;IAC7D,IAAI,SAAS,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,KAAK,CAAC;IACzC,MAAM,GAAG,GAAG,QAAQ,CAAC,GAAG,CAAC;IACzB,IAAI,CAAC,GAAG,IAAI,GAAG,CAAC,OAAO,IAAI,GAAG,CAAC,UAAU,KAAK,OAAO;QAAE,OAAO,KAAK,CAAC;IACpE,IAAI,QAAQ,CAAC,YAAY;QAAE,OAAO,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,WAAW,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC;IACjF,OAAO,IAAA,sBAAS,EAAC,QAAQ,CAAC,CAAC,IAAI,KAAK,cAAc,CAAC;AACrD,CAAC;AAED,gFAAgF;AAChF,SAAgB,yBAAyB,CAAC,QAAkC;IAC1E,MAAM,CAAC,GAAG,QAAQ,CAAC,WAAW,CAAC;IAC/B,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC,cAAc,CAAC,MAAM,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,QAAQ,IAAI,CAAC,CAAC,CAAC,SAAS;QAAE,OAAO,IAAI,CAAC;IACpF,OAAO,yBAAyB,CAAC,CAAC,CAAC,QAAQ,EAAE,CAAC,CAAC,SAAS,EAAE,CAAC,CAAC,cAAc,CAAC,CAAC;AAC9E,CAAC;AAED,MAAM,cAAc,GAAoC;IACtD,IAAI;IACJ,SAAS;IACT,WAAW;IACX,SAAS;IACT,QAAQ;IACR,QAAQ;IACR,IAAI;IACJ,WAAW;IACX,OAAO;IACP,SAAS;CACV,CAAC;AAEF;;;GAGG;AACH,SAAgB,iBAAiB,CAAC,IAA0B;IAC1D,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,IAAI,CAAC;IACnC,MAAM,IAAI,GAAG,CAAC,MAAiB,EAAE,EAAE,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,KAAK,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IACzG,MAAM,GAAG,GAA4B,EAAE,CAAC;IACxC,KAAK,MAAM,OAAO,IAAI,cAAc,EAAE,CAAC;QACrC,MAAM,MAAM,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC;QAC3C,IAAI,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,KAAK,SAAS,CAAC;YAAE,SAAS;QACnD,MAAM,KAAK,GAAG,MAAM,CAAC,CAAC,CAAC,CAAC;QACxB,IAAI,KAAK,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC;YAChE,IAAI,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,OAAO,CAAC,KAAK,QAAQ,CAAC;gBAAE,SAAS;YAC9D,MAAM,MAAM,GAA4B,EAAE,CAAC;YAC3C,KAAK,MAAM,GAAG,IAAI,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC;gBACrC,MAAM,KAAK,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAE,CAA6B,CAAC,GAAG,CAAC,CAAC,CAAC;gBACrE,IAAI,IAAI,CAAC,KAAK,CAAC;oBAAE,MAAM,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC;YAC1C,CAAC;YACD,IAAI,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,MAAM,GAAG,CAAC;gBAAE,GAAG,CAAC,OAAO,CAAC,GAAG,MAAM,CAAC;QAC5D,CAAC;aAAM,IAAI,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC;YACxB,GAAG,CAAC,OAAO,CAAC,GAAG,KAAK,CAAC;QACvB,CAAC;IACH,CAAC;IACD,OAAO,GAAkC,CAAC;AAC5C,CAAC;AAYD;;;;GAIG;AACH,SAAgB,uBAAuB,CAAC,SAAqC;IAC3E,MAAM,MAAM,GAAG,IAAI,GAAG,EAAkC,CAAC;IACzD,KAAK,MAAM,CAAC,IAAI,SAAS,EAAE,CAAC;QAC1B,IAAI,CAAC,CAAC,MAAM,KAAK,SAAS,IAAI,CAAC,CAAC,CAAC,CAAC,MAAM,KAAK,QAAQ,IAAI,CAAC,CAAC,UAAU,CAAC;YAAE,SAAS;QACjF,MAAM,MAAM,GAAG,yBAAyB,CAAC,CAAC,CAAC,CAAC;QAC5C,IAAI,CAAC,MAAM;YAAE,SAAS;QACtB,MAAM,KAAK,GAAG,MAAM,CAAC,GAAG,CAAC,MAAM,CAAC,IAAI,EAAE,MAAM,EAAE,SAAS,EAAE,EAAE,EAAE,KAAK,EAAE,EAAE,EAAE,CAAC;QACzE,KAAK,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;QAC7B,IAAI,gBAAgB,CAAC,CAAC,CAAC;YAAE,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;QAClD,MAAM,CAAC,GAAG,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC;IAC5B,CAAC;IACD,OAAO,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC,MAAM,GAAG,CAAC,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC;AACtF,CAAC;AAED,MAAM,MAAM,GAAG,CAAC,CAAS,EAAE,GAAW,EAAE,IAAY,EAAE,EAAE,CAAC,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;AAExF;;;;GAIG;AACH,SAAgB,qBAAqB,CAAC,KAA6B;IACjE,MAAM,CAAC,GAAG,KAAK,CAAC,SAAS,CAAC,MAAM,CAAC;IACjC,MAAM,CAAC,GAAG,KAAK,CAAC,KAAK,CAAC,MAAM,CAAC;IAC7B,MAAM,IAAI,GAAG,4CAA4C,KAAK,CAAC,MAAM,GAAG,CAAC;IACzE,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC;QACZ,OAAO,CACL,GAAG,IAAI,KAAK,MAAM,CAAC,CAAC,EAAE,SAAS,EAAE,WAAW,CAAC,0EAA0E;YACvH,eAAe,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,MAAM,iCAAiC,CACxE,CAAC;IACJ,CAAC;IACD,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC;QACZ,OAAO,GAAG,IAAI,QAAQ,MAAM,CAAC,CAAC,EAAE,UAAU,EAAE,WAAW,CAAC,wEAAwE,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,MAAM,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,OAAO,OAAO,CAAC;IACjM,CAAC;IACD,MAAM,IAAI,GAAG,CAAC,GAAG,CAAC,CAAC;IACnB,OAAO,CACL,GAAG,IAAI,QAAQ,MAAM,CAAC,CAAC,EAAE,UAAU,EAAE,WAAW,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,wDAAwD;QACzI,GAAG,IAAI,SAAS,IAAI,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,sDAAsD,IAAI,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,MAAM,OAAO,IAAI,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,OAAO,OAAO,CACtK,CAAC;AACJ,CAAC"}
|
|
@@ -36,7 +36,12 @@ export interface GenerateReportOptions {
|
|
|
36
36
|
* @returns The report data
|
|
37
37
|
*/
|
|
38
38
|
/**
|
|
39
|
-
* results.json schema version. 2.
|
|
39
|
+
* results.json schema version. 2.5.0 adds capture provenance: per-snapshot
|
|
40
|
+
* `environment` (what changed between the environment the baseline was
|
|
41
|
+
* captured in and the current capture's: `delta`, `renderingDelta`, both
|
|
42
|
+
* blocks when they differ, and `policy: "strict"` when that policy made the
|
|
43
|
+
* snapshot changed) and the run-level `environment` (the fields every capture
|
|
44
|
+
* of the run agrees on). 2.4.0 added per-snapshot `sizeMismatch`
|
|
40
45
|
* (the baseline's and the candidate's dimensions when they differ; the diff
|
|
41
46
|
* is then on a canvas of max width × max height with every padded pixel
|
|
42
47
|
* counted as changed). 2.3.0 added top-level `missingBaselines[]`
|
|
@@ -45,7 +50,7 @@ export interface GenerateReportOptions {
|
|
|
45
50
|
* diff bounding boxes), `masks[]` (applied masks with their source — the
|
|
46
51
|
* audit trail), and `maskWarnings[]`. All additive.
|
|
47
52
|
*/
|
|
48
|
-
export declare const RESULTS_SCHEMA_VERSION = "2.
|
|
53
|
+
export declare const RESULTS_SCHEMA_VERSION = "2.5.0";
|
|
49
54
|
/**
|
|
50
55
|
* Write results.json for an already-computed set of snapshot results.
|
|
51
56
|
* Exposed for callers that manage comparison and rendering separately.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"generator.d.ts","sourceRoot":"","sources":["../../src/report/generator.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAKH,OAAO,EAAmC,KAAK,YAAY,EAAE,MAAM,WAAW,CAAC;AAC/E,OAAO,KAAK,EAAE,UAAU,EAAiB,cAAc,EAAC,MAAM,WAAW,CAAC;
|
|
1
|
+
{"version":3,"file":"generator.d.ts","sourceRoot":"","sources":["../../src/report/generator.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAKH,OAAO,EAAmC,KAAK,YAAY,EAAE,MAAM,WAAW,CAAC;AAC/E,OAAO,KAAK,EAAE,UAAU,EAAiB,cAAc,EAAC,MAAM,WAAW,CAAC;AAO1E,MAAM,WAAW,qBAAqB;IACpC,WAAW,EAAE,MAAM,CAAC;IACpB,4DAA4D;IAC5D,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,yCAAyC;IACzC,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,wDAAwD;IACxD,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,+CAA+C;IAC/C,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB;;;;;OAKG;IACH,YAAY,CAAC,EAAE,YAAY,CAAC;CAC7B;AAED;;;;;;;;;;GAUG;AACH;;;;;;;;;;;;;;GAcG;AACH,eAAO,MAAM,sBAAsB,UAAU,CAAC;AAE9C;;;GAGG;AACH,wBAAgB,eAAe,CAC7B,OAAO,EAAE,cAAc,EAAE,EACzB,SAAS,EAAE,MAAM,EACjB,OAAO,GAAE,MAA+B,GACvC,IAAI,CAGN;AAED,wBAAgB,cAAc,CAAC,OAAO,EAAE,qBAAqB,GAAG,UAAU,CAqFzE;AA0BD;;;;;;;;GAQG;AACH,wBAAgB,iBAAiB,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM,CAoB3D;AAED;;;;;;;;;GASG;AACH,wBAAgB,eAAe,CAAC,eAAe,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAOzF"}
|
package/dist/report/generator.js
CHANGED
|
@@ -51,6 +51,8 @@ const compare_1 = require("./compare");
|
|
|
51
51
|
const template_1 = require("./template");
|
|
52
52
|
const local_config_1 = require("../config/local-config");
|
|
53
53
|
const store_1 = require("../baselines/store");
|
|
54
|
+
const environment_1 = require("../capture/environment");
|
|
55
|
+
const environment_2 = require("./environment");
|
|
54
56
|
/**
|
|
55
57
|
* Generate a complete visual regression report.
|
|
56
58
|
*
|
|
@@ -63,7 +65,12 @@ const store_1 = require("../baselines/store");
|
|
|
63
65
|
* @returns The report data
|
|
64
66
|
*/
|
|
65
67
|
/**
|
|
66
|
-
* results.json schema version. 2.
|
|
68
|
+
* results.json schema version. 2.5.0 adds capture provenance: per-snapshot
|
|
69
|
+
* `environment` (what changed between the environment the baseline was
|
|
70
|
+
* captured in and the current capture's: `delta`, `renderingDelta`, both
|
|
71
|
+
* blocks when they differ, and `policy: "strict"` when that policy made the
|
|
72
|
+
* snapshot changed) and the run-level `environment` (the fields every capture
|
|
73
|
+
* of the run agrees on). 2.4.0 added per-snapshot `sizeMismatch`
|
|
67
74
|
* (the baseline's and the candidate's dimensions when they differ; the diff
|
|
68
75
|
* is then on a canvas of max width × max height with every padded pixel
|
|
69
76
|
* counted as changed). 2.3.0 added top-level `missingBaselines[]`
|
|
@@ -72,7 +79,7 @@ const store_1 = require("../baselines/store");
|
|
|
72
79
|
* diff bounding boxes), `masks[]` (applied masks with their source — the
|
|
73
80
|
* audit trail), and `maskWarnings[]`. All additive.
|
|
74
81
|
*/
|
|
75
|
-
exports.RESULTS_SCHEMA_VERSION = '2.
|
|
82
|
+
exports.RESULTS_SCHEMA_VERSION = '2.5.0';
|
|
76
83
|
/**
|
|
77
84
|
* Write results.json for an already-computed set of snapshot results.
|
|
78
85
|
* Exposed for callers that manage comparison and rendering separately.
|
|
@@ -106,17 +113,36 @@ function generateReport(options) {
|
|
|
106
113
|
mask: localConfig.mask,
|
|
107
114
|
diffRegions: localConfig.diffRegions,
|
|
108
115
|
volatileAttributes: localConfig.volatileAttributes,
|
|
116
|
+
environmentPolicy: localConfig.environmentPolicy,
|
|
109
117
|
};
|
|
110
118
|
const snapshots = (0, compare_1.compareAll)(compareOptions);
|
|
111
119
|
// 1.5. Coverage-loss signal: baselines that received no capture this run
|
|
112
120
|
// (a deleted/renamed test silently stops guarding its page). Reported
|
|
113
121
|
// always; gated only via `--fail-on-missing` / config `failOnMissing`,
|
|
114
122
|
// because filtered runs (`--grep`) legitimately skip most baselines.
|
|
123
|
+
// Under environmentPolicy "separate", a baseline keyed for another
|
|
124
|
+
// environment (another browser or platform) is not this run's to capture,
|
|
125
|
+
// so only baselines of an environment this run captured can be missing.
|
|
115
126
|
const store = new store_1.BaselineStore(projectRoot);
|
|
116
|
-
const capturedNames =
|
|
117
|
-
const
|
|
127
|
+
const capturedNames = store.listTemp();
|
|
128
|
+
const captured = new Set(capturedNames);
|
|
129
|
+
const variantKey = (v) => `${v.browser}__${v.platform}`;
|
|
130
|
+
const capturedVariants = new Set(capturedNames.map(environment_1.parseEnvironmentVariant).filter((v) => v !== null).map(variantKey));
|
|
131
|
+
const missingBaselines = store.list().filter((n) => {
|
|
132
|
+
if (captured.has(n))
|
|
133
|
+
return false;
|
|
134
|
+
if (localConfig.environmentPolicy !== 'separate')
|
|
135
|
+
return true;
|
|
136
|
+
const variant = (0, environment_1.parseEnvironmentVariant)(n);
|
|
137
|
+
return variant === null || capturedVariants.has(variantKey(variant));
|
|
138
|
+
});
|
|
139
|
+
// 1.6. Run-level capture provenance: the fields every capture of this run
|
|
140
|
+
// that recorded an environment agrees on.
|
|
141
|
+
const environment = (0, environment_2.commonEnvironment)(capturedNames
|
|
142
|
+
.map((n) => (0, environment_1.readEnvironment)(store.readTempMetadata(n)?.environment))
|
|
143
|
+
.filter((e) => e !== null));
|
|
118
144
|
// 2-3. Build summary + report data
|
|
119
|
-
const reportData = buildReportData(snapshots, version, missingBaselines);
|
|
145
|
+
const reportData = buildReportData(snapshots, version, missingBaselines, environment);
|
|
120
146
|
// 4. Write results.json
|
|
121
147
|
const resultsPath = path.join(reportDir, 'results.json');
|
|
122
148
|
fs.writeFileSync(resultsPath, JSON.stringify(reportData, null, 2));
|
|
@@ -131,7 +157,7 @@ function generateReport(options) {
|
|
|
131
157
|
return reportData;
|
|
132
158
|
}
|
|
133
159
|
/** Assemble the ReportData envelope for a set of snapshot results. */
|
|
134
|
-
function buildReportData(snapshots, version, missingBaselines = []) {
|
|
160
|
+
function buildReportData(snapshots, version, missingBaselines = [], environment = null) {
|
|
135
161
|
const summary = {
|
|
136
162
|
total: snapshots.length,
|
|
137
163
|
passed: snapshots.filter((s) => s.status === 'passed').length,
|
|
@@ -145,6 +171,7 @@ function buildReportData(snapshots, version, missingBaselines = []) {
|
|
|
145
171
|
summary,
|
|
146
172
|
snapshots,
|
|
147
173
|
missingBaselines,
|
|
174
|
+
...(environment ? { environment } : {}),
|
|
148
175
|
};
|
|
149
176
|
}
|
|
150
177
|
/**
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"generator.js","sourceRoot":"","sources":["../../src/report/generator.ts"],"names":[],"mappings":";AAAA;;;;;GAKG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
|
1
|
+
{"version":3,"file":"generator.js","sourceRoot":"","sources":["../../src/report/generator.ts"],"names":[],"mappings":"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"}
|
package/dist/report/index.d.ts
CHANGED
|
@@ -5,10 +5,13 @@ export { generateReport } from './generator';
|
|
|
5
5
|
export type { GenerateReportOptions } from './generator';
|
|
6
6
|
export { compareAll } from './compare';
|
|
7
7
|
export type { CompareOptions, PassCriteria } from './compare';
|
|
8
|
-
export { renderHtml } from './template';
|
|
8
|
+
export { renderHtml, snapshotAnchorId } from './template';
|
|
9
9
|
export { diffShape, describeRegions, NOISE_MAX_DIFF_PERCENT, CONCENTRATED_MAX_PAGE_SHARE, STYLE_CHECK_DOES_NOT_COVER, } from './diff-shape';
|
|
10
10
|
export type { DiffShape, DiffShapeBox, DiffShapeInput } from './diff-shape';
|
|
11
11
|
export { describeSizeChange, explainHeightChange, formatSizeMismatch, formatSizes, sizeMismatchKind } from './size-mismatch';
|
|
12
12
|
export type { Dimensions, HeightChangeContext, SizeMismatchInfo } from './size-mismatch';
|
|
13
|
-
export
|
|
13
|
+
export { commonEnvironment, describeCaptureMethod, describeEnvironmentChange, diffEnvironments, environmentChangeGroups, environmentChangeLine, isRenderingDrift, snapshotEnvironmentChange, } from './environment';
|
|
14
|
+
export type { EnvironmentChangeGroup, EnvironmentSnapshotInput } from './environment';
|
|
15
|
+
export type { CaptureEnvironment, RenderEnvironment } from '../capture/environment';
|
|
16
|
+
export type { ReportData, ReportSummary, SnapshotResult, SnapshotStatus, SnapshotDomSignal, SnapshotEnvironment, } from './results';
|
|
14
17
|
//# sourceMappingURL=index.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/report/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAC7C,YAAY,EAAE,qBAAqB,EAAE,MAAM,aAAa,CAAC;AACzD,OAAO,EAAE,UAAU,EAAE,MAAM,WAAW,CAAC;AACvC,YAAY,EAAE,cAAc,EAAE,YAAY,EAAE,MAAM,WAAW,CAAC;AAC9D,OAAO,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/report/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAC7C,YAAY,EAAE,qBAAqB,EAAE,MAAM,aAAa,CAAC;AACzD,OAAO,EAAE,UAAU,EAAE,MAAM,WAAW,CAAC;AACvC,YAAY,EAAE,cAAc,EAAE,YAAY,EAAE,MAAM,WAAW,CAAC;AAC9D,OAAO,EAAE,UAAU,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAC;AAC1D,OAAO,EACL,SAAS,EACT,eAAe,EACf,sBAAsB,EACtB,2BAA2B,EAC3B,0BAA0B,GAC3B,MAAM,cAAc,CAAC;AACtB,YAAY,EAAE,SAAS,EAAE,YAAY,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AAC5E,OAAO,EAAE,kBAAkB,EAAE,mBAAmB,EAAE,kBAAkB,EAAE,WAAW,EAAE,gBAAgB,EAAE,MAAM,iBAAiB,CAAC;AAC7H,YAAY,EAAE,UAAU,EAAE,mBAAmB,EAAE,gBAAgB,EAAE,MAAM,iBAAiB,CAAC;AACzF,OAAO,EACL,iBAAiB,EACjB,qBAAqB,EACrB,yBAAyB,EACzB,gBAAgB,EAChB,uBAAuB,EACvB,qBAAqB,EACrB,gBAAgB,EAChB,yBAAyB,GAC1B,MAAM,eAAe,CAAC;AACvB,YAAY,EAAE,sBAAsB,EAAE,wBAAwB,EAAE,MAAM,eAAe,CAAC;AACtF,YAAY,EAAE,kBAAkB,EAAE,iBAAiB,EAAE,MAAM,wBAAwB,CAAC;AACpF,YAAY,EACV,UAAU,EACV,aAAa,EACb,cAAc,EACd,cAAc,EACd,iBAAiB,EACjB,mBAAmB,GACpB,MAAM,WAAW,CAAC"}
|
package/dist/report/index.js
CHANGED
|
@@ -3,13 +3,14 @@
|
|
|
3
3
|
* TestivAI Report Generator
|
|
4
4
|
*/
|
|
5
5
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
-
exports.sizeMismatchKind = exports.formatSizes = exports.formatSizeMismatch = exports.explainHeightChange = exports.describeSizeChange = exports.STYLE_CHECK_DOES_NOT_COVER = exports.CONCENTRATED_MAX_PAGE_SHARE = exports.NOISE_MAX_DIFF_PERCENT = exports.describeRegions = exports.diffShape = exports.renderHtml = exports.compareAll = exports.generateReport = void 0;
|
|
6
|
+
exports.snapshotEnvironmentChange = exports.isRenderingDrift = exports.environmentChangeLine = exports.environmentChangeGroups = exports.diffEnvironments = exports.describeEnvironmentChange = exports.describeCaptureMethod = exports.commonEnvironment = exports.sizeMismatchKind = exports.formatSizes = exports.formatSizeMismatch = exports.explainHeightChange = exports.describeSizeChange = exports.STYLE_CHECK_DOES_NOT_COVER = exports.CONCENTRATED_MAX_PAGE_SHARE = exports.NOISE_MAX_DIFF_PERCENT = exports.describeRegions = exports.diffShape = exports.snapshotAnchorId = exports.renderHtml = exports.compareAll = exports.generateReport = void 0;
|
|
7
7
|
var generator_1 = require("./generator");
|
|
8
8
|
Object.defineProperty(exports, "generateReport", { enumerable: true, get: function () { return generator_1.generateReport; } });
|
|
9
9
|
var compare_1 = require("./compare");
|
|
10
10
|
Object.defineProperty(exports, "compareAll", { enumerable: true, get: function () { return compare_1.compareAll; } });
|
|
11
11
|
var template_1 = require("./template");
|
|
12
12
|
Object.defineProperty(exports, "renderHtml", { enumerable: true, get: function () { return template_1.renderHtml; } });
|
|
13
|
+
Object.defineProperty(exports, "snapshotAnchorId", { enumerable: true, get: function () { return template_1.snapshotAnchorId; } });
|
|
13
14
|
var diff_shape_1 = require("./diff-shape");
|
|
14
15
|
Object.defineProperty(exports, "diffShape", { enumerable: true, get: function () { return diff_shape_1.diffShape; } });
|
|
15
16
|
Object.defineProperty(exports, "describeRegions", { enumerable: true, get: function () { return diff_shape_1.describeRegions; } });
|
|
@@ -22,4 +23,13 @@ Object.defineProperty(exports, "explainHeightChange", { enumerable: true, get: f
|
|
|
22
23
|
Object.defineProperty(exports, "formatSizeMismatch", { enumerable: true, get: function () { return size_mismatch_1.formatSizeMismatch; } });
|
|
23
24
|
Object.defineProperty(exports, "formatSizes", { enumerable: true, get: function () { return size_mismatch_1.formatSizes; } });
|
|
24
25
|
Object.defineProperty(exports, "sizeMismatchKind", { enumerable: true, get: function () { return size_mismatch_1.sizeMismatchKind; } });
|
|
26
|
+
var environment_1 = require("./environment");
|
|
27
|
+
Object.defineProperty(exports, "commonEnvironment", { enumerable: true, get: function () { return environment_1.commonEnvironment; } });
|
|
28
|
+
Object.defineProperty(exports, "describeCaptureMethod", { enumerable: true, get: function () { return environment_1.describeCaptureMethod; } });
|
|
29
|
+
Object.defineProperty(exports, "describeEnvironmentChange", { enumerable: true, get: function () { return environment_1.describeEnvironmentChange; } });
|
|
30
|
+
Object.defineProperty(exports, "diffEnvironments", { enumerable: true, get: function () { return environment_1.diffEnvironments; } });
|
|
31
|
+
Object.defineProperty(exports, "environmentChangeGroups", { enumerable: true, get: function () { return environment_1.environmentChangeGroups; } });
|
|
32
|
+
Object.defineProperty(exports, "environmentChangeLine", { enumerable: true, get: function () { return environment_1.environmentChangeLine; } });
|
|
33
|
+
Object.defineProperty(exports, "isRenderingDrift", { enumerable: true, get: function () { return environment_1.isRenderingDrift; } });
|
|
34
|
+
Object.defineProperty(exports, "snapshotEnvironmentChange", { enumerable: true, get: function () { return environment_1.snapshotEnvironmentChange; } });
|
|
25
35
|
//# sourceMappingURL=index.js.map
|
package/dist/report/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/report/index.ts"],"names":[],"mappings":";AAAA;;GAEG;;;AAEH,yCAA6C;AAApC,2GAAA,cAAc,OAAA;AAEvB,qCAAuC;AAA9B,qGAAA,UAAU,OAAA;AAEnB,
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/report/index.ts"],"names":[],"mappings":";AAAA;;GAEG;;;AAEH,yCAA6C;AAApC,2GAAA,cAAc,OAAA;AAEvB,qCAAuC;AAA9B,qGAAA,UAAU,OAAA;AAEnB,uCAA0D;AAAjD,sGAAA,UAAU,OAAA;AAAE,4GAAA,gBAAgB,OAAA;AACrC,2CAMsB;AALpB,uGAAA,SAAS,OAAA;AACT,6GAAA,eAAe,OAAA;AACf,oHAAA,sBAAsB,OAAA;AACtB,yHAAA,2BAA2B,OAAA;AAC3B,wHAAA,0BAA0B,OAAA;AAG5B,iDAA6H;AAApH,mHAAA,kBAAkB,OAAA;AAAE,oHAAA,mBAAmB,OAAA;AAAE,mHAAA,kBAAkB,OAAA;AAAE,4GAAA,WAAW,OAAA;AAAE,iHAAA,gBAAgB,OAAA;AAEnG,6CASuB;AARrB,gHAAA,iBAAiB,OAAA;AACjB,oHAAA,qBAAqB,OAAA;AACrB,wHAAA,yBAAyB,OAAA;AACzB,+GAAA,gBAAgB,OAAA;AAChB,sHAAA,uBAAuB,OAAA;AACvB,oHAAA,qBAAqB,OAAA;AACrB,+GAAA,gBAAgB,OAAA;AAChB,wHAAA,yBAAyB,OAAA"}
|
package/dist/report/results.d.ts
CHANGED
|
@@ -121,6 +121,34 @@ export interface SnapshotResult {
|
|
|
121
121
|
height: number;
|
|
122
122
|
};
|
|
123
123
|
};
|
|
124
|
+
/**
|
|
125
|
+
* Capture provenance (schema 2.5.0): present when the baseline and the
|
|
126
|
+
* current capture both recorded the environment they were captured in
|
|
127
|
+
* (metadata.json `environment`). See report/environment.ts.
|
|
128
|
+
*/
|
|
129
|
+
environment?: SnapshotEnvironment;
|
|
130
|
+
}
|
|
131
|
+
/** How the environment of the current capture differs from the baseline's. */
|
|
132
|
+
export interface SnapshotEnvironment {
|
|
133
|
+
/** Every field that differs, as dotted paths ("browser.version"), sorted. Empty when nothing differs. */
|
|
134
|
+
delta: string[];
|
|
135
|
+
/**
|
|
136
|
+
* The subset of `delta` that can change how the page renders: the
|
|
137
|
+
* browser, the OS platform, distro and architecture (the OS release on
|
|
138
|
+
* macOS and Windows), the render settings, the capture method, a
|
|
139
|
+
* container and the environment label. Framework, adapter and driver
|
|
140
|
+
* versions, the CI runner image and the project are context only.
|
|
141
|
+
*/
|
|
142
|
+
renderingDelta: string[];
|
|
143
|
+
/** The baseline's recorded environment. Present when `delta` is non-empty. */
|
|
144
|
+
baseline?: import('../capture/environment').CaptureEnvironment;
|
|
145
|
+
/** The current capture's recorded environment. Present when `delta` is non-empty. */
|
|
146
|
+
candidate?: import('../capture/environment').CaptureEnvironment;
|
|
147
|
+
/**
|
|
148
|
+
* 'strict' when environmentPolicy "strict" made this snapshot changed
|
|
149
|
+
* because its rendering environment changed, whatever its pixels say.
|
|
150
|
+
*/
|
|
151
|
+
policy?: 'strict';
|
|
124
152
|
}
|
|
125
153
|
export interface ReportSummary {
|
|
126
154
|
total: number;
|
|
@@ -141,5 +169,10 @@ export interface ReportData {
|
|
|
141
169
|
snapshots: SnapshotResult[];
|
|
142
170
|
/** Names of baselines with no capture this run (schema 2.3.0+). */
|
|
143
171
|
missingBaselines?: string[];
|
|
172
|
+
/**
|
|
173
|
+
* The environment of this run's captures (schema 2.5.0): the fields every
|
|
174
|
+
* capture that recorded one agrees on. Absent when none recorded one.
|
|
175
|
+
*/
|
|
176
|
+
environment?: Partial<import('../capture/environment').CaptureEnvironment>;
|
|
144
177
|
}
|
|
145
178
|
//# sourceMappingURL=results.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"results.d.ts","sourceRoot":"","sources":["../../src/report/results.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,MAAM,MAAM,cAAc,GAAG,QAAQ,GAAG,SAAS,GAAG,KAAK,CAAC;AAE1D,MAAM,WAAW,iBAAiB;IAChC,2EAA2E;IAC3E,OAAO,EAAE,OAAO,CAAC;IACjB,qDAAqD;IACrD,OAAO,EAAE;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAC;QAAC,gBAAgB,EAAE,MAAM,CAAC;QAAC,WAAW,CAAC,EAAE,MAAM,CAAA;KAAE,GAAG,IAAI,CAAC;IACnG;;;;;;;;;;;OAWG;IACH,SAAS,EAAE,OAAO,CAAC;IACnB;;;;;;;;;;OAUG;IACH,UAAU,CAAC,EAAE,OAAO,GAAG,UAAU,GAAG,aAAa,CAAC;IAClD,wEAAwE;IACxE,YAAY,CAAC,EAAE;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,MAAM,EAAE,CAAA;KAAE,CAAC;CACtD;AAED,MAAM,WAAW,cAAc;IAC7B,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,cAAc,CAAC;IACvB,iDAAiD;IACjD,WAAW,EAAE,MAAM,CAAC;IACpB,+BAA+B;IAC/B,SAAS,EAAE,MAAM,CAAC;IAClB,4BAA4B;IAC5B,WAAW,EAAE,MAAM,CAAC;IACpB,+CAA+C;IAC/C,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,iDAAiD;IACjD,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,2CAA2C;IAC3C,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB;;;OAGG;IACH,GAAG,CAAC,EAAE,iBAAiB,CAAC;IACxB;;;OAGG;IACH,OAAO,CAAC,EAAE,OAAO,qBAAqB,EAAE,gBAAgB,EAAE,CAAC;IAC3D;;;OAGG;IACH,KAAK,CAAC,EAAE,OAAO,cAAc,EAAE,QAAQ,EAAE,CAAC;IAC1C,sFAAsF;IACtF,YAAY,CAAC,EAAE,MAAM,EAAE,CAAC;IACxB;;;;OAIG;IACH,SAAS,CAAC,EAAE,OAAO,qBAAqB,EAAE,SAAS,CAAC;IACpD;;;;;;;;;;OAUG;IACH,UAAU,CAAC,EAAE,WAAW,GAAG,OAAO,GAAG,OAAO,CAAC;IAC7C;;;;OAIG;IACH,kBAAkB,CAAC,EAAE,MAAM,CAAC;IAC5B;;;;;;;;;OASG;IACH,YAAY,CAAC,EAAE;QAAE,QAAQ,EAAE;YAAE,KAAK,EAAE,MAAM,CAAC;YAAC,MAAM,EAAE,MAAM,CAAA;SAAE,CAAC;QAAC,SAAS,EAAE;YAAE,KAAK,EAAE,MAAM,CAAC;YAAC,MAAM,EAAE,MAAM,CAAA;SAAE,CAAA;KAAE,CAAC;
|
|
1
|
+
{"version":3,"file":"results.d.ts","sourceRoot":"","sources":["../../src/report/results.ts"],"names":[],"mappings":"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"}
|