@testivai/witness 2.1.1 → 2.2.1
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/capture/settle.d.ts +8 -4
- package/dist/capture/settle.d.ts.map +1 -1
- package/dist/capture/settle.js +8 -4
- package/dist/capture/settle.js.map +1 -1
- package/dist/config/local-config.d.ts +16 -7
- package/dist/config/local-config.d.ts.map +1 -1
- package/dist/config/local-config.js.map +1 -1
- package/dist/diff/attribution.d.ts +4 -2
- package/dist/diff/attribution.d.ts.map +1 -1
- package/dist/diff/attribution.js +4 -2
- package/dist/diff/attribution.js.map +1 -1
- package/dist/diff/dom-diff.d.ts +11 -5
- package/dist/diff/dom-diff.d.ts.map +1 -1
- package/dist/diff/dom-diff.js +11 -5
- package/dist/diff/dom-diff.js.map +1 -1
- package/dist/report/compare.d.ts +9 -1
- package/dist/report/compare.d.ts.map +1 -1
- package/dist/report/compare.js +20 -4
- package/dist/report/compare.js.map +1 -1
- package/dist/report/diff-shape.d.ts +70 -0
- package/dist/report/diff-shape.d.ts.map +1 -0
- package/dist/report/diff-shape.js +67 -0
- package/dist/report/diff-shape.js.map +1 -0
- package/dist/report/index.d.ts +2 -0
- package/dist/report/index.d.ts.map +1 -1
- package/dist/report/index.js +7 -1
- package/dist/report/index.js.map +1 -1
- package/dist/report/results.d.ts +24 -10
- package/dist/report/results.d.ts.map +1 -1
- package/dist/report/template.d.ts.map +1 -1
- package/dist/report/template.js +114 -30
- package/dist/report/template.js.map +1 -1
- package/dist/standalone/run.d.ts +27 -1
- package/dist/standalone/run.d.ts.map +1 -1
- package/dist/standalone/run.js +119 -26
- package/dist/standalone/run.js.map +1 -1
- package/package.json +1 -1
package/dist/standalone/run.js
CHANGED
|
@@ -10,12 +10,16 @@
|
|
|
10
10
|
*
|
|
11
11
|
* Everything downstream of capture (diff, tolerances, noise hint, report,
|
|
12
12
|
* approve, GitHub Action) is the exact same pipeline the test-suite adapters
|
|
13
|
-
* feed.
|
|
13
|
+
* feed. The capture itself differs: no element map is written, so regions
|
|
14
|
+
* stay unattributed, no page shift is detected, and the computed-style check
|
|
15
|
+
* has nothing to compare (dom.styleCheck is 'unavailable', a stylesheet-only
|
|
16
|
+
* change is not ruled out, and noiseAutoPass never passes these snapshots).
|
|
14
17
|
*/
|
|
15
18
|
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
16
19
|
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
17
20
|
};
|
|
18
21
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
22
|
+
exports.openPage = openPage;
|
|
19
23
|
exports.captureFullPage = captureFullPage;
|
|
20
24
|
exports.runStandaloneWitness = runStandaloneWitness;
|
|
21
25
|
const chrome_remote_interface_1 = __importDefault(require("chrome-remote-interface"));
|
|
@@ -49,15 +53,56 @@ async function waitFor(client, expression, timeoutMs, intervalMs = 150) {
|
|
|
49
53
|
await new Promise((r) => setTimeout(r, intervalMs));
|
|
50
54
|
}
|
|
51
55
|
}
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
56
|
+
/** How long to wait for a page to load before capturing it anyway. */
|
|
57
|
+
const PAGE_LOAD_TIMEOUT_MS = 15000;
|
|
58
|
+
/**
|
|
59
|
+
* True once the tab shows the page it was sent to, fully loaded. A new tab
|
|
60
|
+
* starts on about:blank, which already reports readyState 'complete', and
|
|
61
|
+
* keeps showing it until the page's response arrives, so readyState alone
|
|
62
|
+
* would pass before the page has even started loading.
|
|
63
|
+
*/
|
|
64
|
+
const PAGE_LOADED = `location.href !== 'about:blank' && document.readyState === 'complete'`;
|
|
65
|
+
/**
|
|
66
|
+
* Open a tab, apply `viewport` when given, then load `url` and wait until the
|
|
67
|
+
* tab shows that page, loaded. Closes the tab again when that fails.
|
|
68
|
+
*
|
|
69
|
+
* Opening the tab on `url` directly and waiting for readyState 'complete'
|
|
70
|
+
* returned while the tab still showed about:blank: on the first page of a
|
|
71
|
+
* freshly launched Chrome, or any page of a server that takes a moment to
|
|
72
|
+
* answer. The stabilization CSS and ignoreSelectors then went into
|
|
73
|
+
* about:blank and were lost, the font wait and reveal pass ran on it, and
|
|
74
|
+
* the capture raced the real page's entry animations. The viewport is applied
|
|
75
|
+
* before the page is requested, so the page never loads at another size.
|
|
76
|
+
*
|
|
77
|
+
* Exported for testing.
|
|
78
|
+
*/
|
|
79
|
+
async function openPage(port, url, viewport) {
|
|
80
|
+
const target = await chrome_remote_interface_1.default.New({ port });
|
|
81
|
+
const page = { client: null, targetId: target.id };
|
|
82
|
+
try {
|
|
83
|
+
page.client = await (0, chrome_remote_interface_1.default)({ port, target: target.id });
|
|
84
|
+
await Promise.all([page.client.Page.enable(), page.client.Runtime.enable()]);
|
|
85
|
+
if (viewport) {
|
|
86
|
+
await page.client.Emulation.setDeviceMetricsOverride({
|
|
87
|
+
width: viewport.width,
|
|
88
|
+
height: viewport.height,
|
|
89
|
+
deviceScaleFactor: 1,
|
|
90
|
+
mobile: false,
|
|
91
|
+
});
|
|
92
|
+
}
|
|
93
|
+
await page.client.Page.navigate({ url });
|
|
94
|
+
await waitFor(page.client, PAGE_LOADED, PAGE_LOAD_TIMEOUT_MS);
|
|
95
|
+
return page;
|
|
96
|
+
}
|
|
97
|
+
catch (err) {
|
|
98
|
+
await closePage(port, page);
|
|
99
|
+
throw err;
|
|
100
|
+
}
|
|
57
101
|
}
|
|
58
102
|
async function closePage(port, page) {
|
|
59
103
|
try {
|
|
60
|
-
|
|
104
|
+
if (page.client)
|
|
105
|
+
await page.client.close();
|
|
61
106
|
}
|
|
62
107
|
catch {
|
|
63
108
|
/* already closed */
|
|
@@ -153,22 +198,59 @@ const FRESH_FRAME_SCRIPT = `new Promise((resolve) => {
|
|
|
153
198
|
* viewport (a collapsed 100vh hero, narrow-viewport media rules), so
|
|
154
199
|
* identical pages flipped between two renders from run to run. A forced
|
|
155
200
|
* layout alone does not prevent this; a rendered frame does.
|
|
201
|
+
*
|
|
202
|
+
* Returns whether two frames were rendered: false when the in-page wait
|
|
203
|
+
* timed out, or failed because the page navigated.
|
|
156
204
|
*/
|
|
157
205
|
async function waitForFreshFrame(client) {
|
|
158
206
|
try {
|
|
159
|
-
await client.Runtime.evaluate({
|
|
207
|
+
const result = await client.Runtime.evaluate({
|
|
208
|
+
expression: FRESH_FRAME_SCRIPT,
|
|
209
|
+
awaitPromise: true,
|
|
210
|
+
returnByValue: true,
|
|
211
|
+
});
|
|
212
|
+
return result?.result?.value === true;
|
|
160
213
|
}
|
|
161
214
|
catch {
|
|
162
|
-
|
|
215
|
+
return false;
|
|
163
216
|
}
|
|
164
217
|
}
|
|
218
|
+
/**
|
|
219
|
+
* Wait for a fresh frame, retrying once when none arrived in time (a loaded
|
|
220
|
+
* machine can stall a frame past the in-page timeout). If neither attempt
|
|
221
|
+
* sees one, the capture still proceeds: best-effort, never blocking.
|
|
222
|
+
*/
|
|
223
|
+
async function settleFrame(client) {
|
|
224
|
+
if (await waitForFreshFrame(client))
|
|
225
|
+
return;
|
|
226
|
+
logger_1.logger.debug('standalone capture: no fresh frame within the wait; waiting once more');
|
|
227
|
+
if (await waitForFreshFrame(client))
|
|
228
|
+
return;
|
|
229
|
+
logger_1.logger.debug('standalone capture: no fresh frame after a retry; capturing anyway, the screenshot may be stale');
|
|
230
|
+
}
|
|
231
|
+
/**
|
|
232
|
+
* The most captures of one page while waiting for two in a row to match.
|
|
233
|
+
* Every stale-capture pattern measured settles within four (stale, good,
|
|
234
|
+
* good / good, stale, good, good); a page that never stops animating costs
|
|
235
|
+
* four captures, not an endless loop.
|
|
236
|
+
*/
|
|
237
|
+
const MAX_CAPTURES = 4;
|
|
238
|
+
async function screenshot(client, width, height) {
|
|
239
|
+
const shot = await client.Page.captureScreenshot({
|
|
240
|
+
format: 'png',
|
|
241
|
+
captureBeyondViewport: true,
|
|
242
|
+
clip: { x: 0, y: 0, width, height, scale: 1 },
|
|
243
|
+
});
|
|
244
|
+
return shot.data;
|
|
245
|
+
}
|
|
165
246
|
/** Full-page screenshot via layout metrics (same technique as the Playwright adapter's CDP path). Exported for testing. */
|
|
166
247
|
async function captureFullPage(client) {
|
|
167
|
-
await
|
|
248
|
+
await settleFrame(client);
|
|
168
249
|
// Freshly-launched Chrome can report zero-size content before its first
|
|
169
250
|
// real layout — poll briefly until metrics are usable.
|
|
170
251
|
let width = 0;
|
|
171
252
|
let height = 0;
|
|
253
|
+
let polled = false;
|
|
172
254
|
const deadline = Date.now() + 5000;
|
|
173
255
|
for (;;) {
|
|
174
256
|
const metrics = await client.Page.getLayoutMetrics();
|
|
@@ -176,17 +258,34 @@ async function captureFullPage(client) {
|
|
|
176
258
|
height = Math.ceil(metrics.cssContentSize?.height ?? metrics.contentSize.height);
|
|
177
259
|
if ((width > 0 && height > 0) || Date.now() >= deadline)
|
|
178
260
|
break;
|
|
261
|
+
polled = true;
|
|
179
262
|
await new Promise((r) => setTimeout(r, 200));
|
|
180
263
|
}
|
|
181
264
|
if (width <= 0 || height <= 0) {
|
|
182
265
|
throw new Error(`page reported unusable content size ${width}x${height}`);
|
|
183
266
|
}
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
267
|
+
// The frame waited for above predates the layout the poll waited for, so
|
|
268
|
+
// it may not show it: wait for a frame rendered after that layout.
|
|
269
|
+
if (polled)
|
|
270
|
+
await settleFrame(client);
|
|
271
|
+
// Even after two fresh frames, Page.captureScreenshot now and then returns
|
|
272
|
+
// the page laid out for a near-zero viewport (narrow media rules, a
|
|
273
|
+
// collapsed 100vh hero), most likely from the 1x1 view Chrome emulates for
|
|
274
|
+
// a moment while it sets up a beyond-viewport capture. The capture after
|
|
275
|
+
// it is almost always right, so capture until two captures in a row match.
|
|
276
|
+
// That wrong frame is the same pixels every time, so two of them in a row
|
|
277
|
+
// still match and are kept: rare, since it takes two misses, but possible.
|
|
278
|
+
let previous = await screenshot(client, width, height);
|
|
279
|
+
for (let captures = 1; captures < MAX_CAPTURES; captures++) {
|
|
280
|
+
await settleFrame(client);
|
|
281
|
+
const current = await screenshot(client, width, height);
|
|
282
|
+
if (current === previous)
|
|
283
|
+
return Buffer.from(current, 'base64');
|
|
284
|
+
logger_1.logger.debug('standalone capture: two captures in a row differed; capturing again');
|
|
285
|
+
previous = current;
|
|
286
|
+
}
|
|
287
|
+
logger_1.logger.debug(`standalone capture: no two captures in a row matched in ${MAX_CAPTURES}; keeping the last`);
|
|
288
|
+
return Buffer.from(previous, 'base64');
|
|
190
289
|
}
|
|
191
290
|
async function runStandaloneWitness(startUrl, options) {
|
|
192
291
|
const projectRoot = process.cwd();
|
|
@@ -216,7 +315,6 @@ async function runStandaloneWitness(startUrl, options) {
|
|
|
216
315
|
}
|
|
217
316
|
else {
|
|
218
317
|
const first = await openPage(port, startUrl);
|
|
219
|
-
await waitFor(first.client, `document.readyState === 'complete'`, 15000);
|
|
220
318
|
const hrefs = (await evaluate(first.client, `Array.from(document.querySelectorAll('a[href]')).map(a => a.href)`)) ?? [];
|
|
221
319
|
await closePage(port, first);
|
|
222
320
|
pages = (0, crawl_1.filterCrawledLinks)(startUrl, hrefs, maxPages);
|
|
@@ -225,15 +323,9 @@ async function runStandaloneWitness(startUrl, options) {
|
|
|
225
323
|
// 3. Capture every page
|
|
226
324
|
for (const url of pages) {
|
|
227
325
|
const name = (0, crawl_1.pageNameFromUrl)(url);
|
|
228
|
-
|
|
326
|
+
let page;
|
|
229
327
|
try {
|
|
230
|
-
await
|
|
231
|
-
width: viewport.width,
|
|
232
|
-
height: viewport.height,
|
|
233
|
-
deviceScaleFactor: 1,
|
|
234
|
-
mobile: false,
|
|
235
|
-
});
|
|
236
|
-
await waitFor(page.client, `document.readyState === 'complete'`, 15000);
|
|
328
|
+
page = await openPage(port, url, viewport);
|
|
237
329
|
await prepPage(page.client, config.stabilize, config.ignoreSelectors ?? []);
|
|
238
330
|
await revealPage(page.client);
|
|
239
331
|
const screenshot = await captureFullPage(page.client);
|
|
@@ -246,7 +338,8 @@ async function runStandaloneWitness(startUrl, options) {
|
|
|
246
338
|
console.log(chalk_1.default.yellow(` ⚠ skipped ${name}: ${err.message}`));
|
|
247
339
|
}
|
|
248
340
|
finally {
|
|
249
|
-
|
|
341
|
+
if (page)
|
|
342
|
+
await closePage(port, page);
|
|
250
343
|
}
|
|
251
344
|
}
|
|
252
345
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"run.js","sourceRoot":"","sources":["../../src/standalone/run.ts"],"names":[],"mappings":";AAAA
|
|
1
|
+
{"version":3,"file":"run.js","sourceRoot":"","sources":["../../src/standalone/run.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@testivai/witness",
|
|
3
|
-
"version": "2.
|
|
3
|
+
"version": "2.2.1",
|
|
4
4
|
"description": "Local-first visual regression testing: CLI, diff engine, baselines and self-contained HTML report. No account, nothing uploaded.",
|
|
5
5
|
"main": "dist/index.js",
|
|
6
6
|
"types": "dist/index.d.ts",
|