@testivai/witness 2.3.1 → 2.4.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/capture/settle.d.ts +7 -0
- package/dist/capture/settle.d.ts.map +1 -1
- package/dist/capture/settle.js +7 -0
- package/dist/capture/settle.js.map +1 -1
- package/dist/capture/stable-capture.d.ts +80 -0
- package/dist/capture/stable-capture.d.ts.map +1 -0
- package/dist/capture/stable-capture.js +106 -0
- package/dist/capture/stable-capture.js.map +1 -0
- package/dist/index.d.ts +2 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +9 -1
- package/dist/index.js.map +1 -1
- package/dist/standalone/run.d.ts.map +1 -1
- package/dist/standalone/run.js +18 -52
- package/dist/standalone/run.js.map +1 -1
- package/package.json +1 -1
package/dist/capture/settle.d.ts
CHANGED
|
@@ -22,6 +22,13 @@
|
|
|
22
22
|
* content that had not *loaded* yet — which is a load question, not a pixel
|
|
23
23
|
* question.
|
|
24
24
|
*
|
|
25
|
+
* One pixel question remains, and it is Chrome's, not the page's: a
|
|
26
|
+
* beyond-viewport capture can return a frame painted for the wrong viewport
|
|
27
|
+
* while the measured page is unchanged. That is guarded at capture time in
|
|
28
|
+
* capture/stable-capture.ts (fresh frame, then capture until two in a row
|
|
29
|
+
* match), which costs one extra screenshot on a stable page. This probe still
|
|
30
|
+
* decides when to start capturing.
|
|
31
|
+
*
|
|
25
32
|
* WHAT THIS DOES
|
|
26
33
|
* --------------
|
|
27
34
|
* A cheap synchronous probe the adapter polls from the host language, exactly
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"settle.d.ts","sourceRoot":"","sources":["../../src/capture/settle.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"settle.d.ts","sourceRoot":"","sources":["../../src/capture/settle.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA0CG;AAEH,MAAM,WAAW,WAAW;IAC1B,yCAAyC;IACzC,KAAK,EAAE,OAAO,CAAC;IACf,2FAA2F;IAC3F,aAAa,EAAE,MAAM,CAAC;IACtB,uEAAuE;IACvE,YAAY,EAAE,OAAO,CAAC;IACtB,gDAAgD;IAChD,QAAQ,EAAE,MAAM,CAAC;IACjB,iEAAiE;IACjE,OAAO,EAAE,OAAO,CAAC;CAClB;AAED,2DAA2D;AAC3D,eAAO,MAAM,gBAAgB,0BAA0B,CAAC;AAExD;;;GAGG;AACH,wBAAgB,WAAW,CACzB,GAAG,EAAE;IACH,UAAU,EAAE,MAAM,CAAC;IACnB,eAAe,EAAE,OAAO,CAAC;IACzB,MAAM,EAAE,SAAS,CAAC;QAAE,QAAQ,EAAE,OAAO,CAAA;KAAE,CAAC,CAAC;IACzC,KAAK,CAAC,EAAE;QAAE,MAAM,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;CAC7B,EACD,GAAG,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG;IAAE,gBAAgB,CAAC,EAAE,KAAK,EAAE,EAAE,MAAM,IAAI,KAAK;QAAE,OAAO,EAAE,CAAC,CAAC,EAAE,OAAO,EAAE,CAAC,EAAE,OAAO,KAAK,IAAI,CAAA;KAAE,CAAA;CAAE,EAC3H,OAAO,EAAE,MAAM,GACd,WAAW,CAoDb;AAED,8FAA8F;AAC9F,eAAO,MAAM,gBAAgB,MAAM,CAAC;AAEpC,qFAAqF;AACrF,eAAO,MAAM,yBAAyB,OAAO,CAAC;AAE9C,wDAAwD;AACxD,wBAAgB,0BAA0B,CAAC,OAAO,GAAE,MAAyB,GAAG,MAAM,CAErF;AAED;;;;;GAKG;AACH,eAAO,MAAM,sBAAsB,0SAMxB,CAAC"}
|
package/dist/capture/settle.js
CHANGED
|
@@ -23,6 +23,13 @@
|
|
|
23
23
|
* content that had not *loaded* yet — which is a load question, not a pixel
|
|
24
24
|
* question.
|
|
25
25
|
*
|
|
26
|
+
* One pixel question remains, and it is Chrome's, not the page's: a
|
|
27
|
+
* beyond-viewport capture can return a frame painted for the wrong viewport
|
|
28
|
+
* while the measured page is unchanged. That is guarded at capture time in
|
|
29
|
+
* capture/stable-capture.ts (fresh frame, then capture until two in a row
|
|
30
|
+
* match), which costs one extra screenshot on a stable page. This probe still
|
|
31
|
+
* decides when to start capturing.
|
|
32
|
+
*
|
|
26
33
|
* WHAT THIS DOES
|
|
27
34
|
* --------------
|
|
28
35
|
* A cheap synchronous probe the adapter polls from the host language, exactly
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"settle.js","sourceRoot":"","sources":["../../src/capture/settle.ts"],"names":[],"mappings":";AAAA
|
|
1
|
+
{"version":3,"file":"settle.js","sourceRoot":"","sources":["../../src/capture/settle.ts"],"names":[],"mappings":";AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA0CG;;;AAsBH,kCA6DC;AASD,gEAEC;AA/ED,2DAA2D;AAC9C,QAAA,gBAAgB,GAAG,uBAAuB,CAAC;AAExD;;;GAGG;AACH,SAAgB,WAAW,CACzB,GAKC,EACD,GAA2H,EAC3H,OAAe;IAEf,IAAI,GAAG,GAAG,uBAAuB,CAAC;IAClC,IAAI,KAAK,GAAG,GAAG,CAAC,GAAG,CAAiC,CAAC;IAErD,IAAI,CAAC,KAAK,EAAE,CAAC;QACX,KAAK,GAAG,EAAE,IAAI,EAAE,IAAI,CAAC,GAAG,EAAE,EAAE,CAAC;QAC7B,IAAI,CAAC;YACH,IAAI,OAAO,GAAG,CAAC,gBAAgB,KAAK,UAAU,EAAE,CAAC;gBAC/C,IAAI,QAAQ,GAAG,IAAI,GAAG,CAAC,gBAAgB,CAAC;oBACrC,GAAG,CAAC,GAAG,CAAsB,CAAC,IAAI,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;gBACnD,CAAC,CAAC,CAAC;gBACH,QAAQ,CAAC,OAAO,CAAC,GAAG,CAAC,eAAe,EAAE;oBACpC,OAAO,EAAE,IAAI;oBACb,SAAS,EAAE,IAAI;oBACf,UAAU,EAAE,IAAI;oBAChB,aAAa,EAAE,IAAI;iBACpB,CAAC,CAAC;gBACF,KAAgC,CAAC,QAAQ,GAAG,QAAQ,CAAC;YACxD,CAAC;QACH,CAAC;QAAC,OAAO,CAAC,EAAE,CAAC;YACX,qEAAqE;YACrE,mDAAmD;QACrD,CAAC;QACD,GAAG,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC;IACnB,CAAC;IAED,IAAI,aAAa,GAAG,CAAC,CAAC;IACtB,IAAI,CAAC;QACH,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,GAAG,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;YAC3C,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,QAAQ;gBAAE,aAAa,EAAE,CAAC;QAC/C,CAAC;IACH,CAAC;IAAC,OAAO,CAAC,EAAE,CAAC;QACX,aAAa,GAAG,CAAC,CAAC;IACpB,CAAC;IAED,IAAI,YAAY,GAAG,KAAK,CAAC;IACzB,IAAI,CAAC;QACH,YAAY,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,KAAK,IAAI,GAAG,CAAC,KAAK,CAAC,MAAM,IAAI,GAAG,CAAC,KAAK,CAAC,MAAM,KAAK,QAAQ,CAAC,CAAC;IACpF,CAAC;IAAC,OAAO,CAAC,EAAE,CAAC;QACX,YAAY,GAAG,KAAK,CAAC;IACvB,CAAC;IAED,IAAI,KAAK,GAAG,GAAG,CAAC,UAAU,KAAK,UAAU,CAAC;IAC1C,IAAI,QAAQ,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,KAAK,CAAC,IAAI,CAAC;IAEvC,OAAO;QACL,KAAK,EAAE,KAAK;QACZ,aAAa,EAAE,aAAa;QAC5B,YAAY,EAAE,YAAY;QAC1B,QAAQ,EAAE,QAAQ;QAClB,OAAO,EAAE,KAAK,IAAI,aAAa,KAAK,CAAC,IAAI,CAAC,YAAY,IAAI,QAAQ,IAAI,OAAO;KAC9E,CAAC;AACJ,CAAC;AAED,8FAA8F;AACjF,QAAA,gBAAgB,GAAG,GAAG,CAAC;AAEpC,qFAAqF;AACxE,QAAA,yBAAyB,GAAG,IAAI,CAAC;AAE9C,wDAAwD;AACxD,SAAgB,0BAA0B,CAAC,UAAkB,wBAAgB;IAC3E,OAAO,IAAI,WAAW,CAAC,QAAQ,EAAE,uBAAuB,OAAO,GAAG,CAAC;AACrE,CAAC;AAED;;;;;GAKG;AACU,QAAA,sBAAsB,GAAG;;iBAErB,wBAAgB;;;oBAGb,wBAAgB,wBAAwB,wBAAgB;WACjE,CAAC"}
|
|
@@ -0,0 +1,80 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Stable full-page capture — shared by every adapter that screenshots through
|
|
3
|
+
* CDP `Page.captureScreenshot` with `captureBeyondViewport`.
|
|
4
|
+
*
|
|
5
|
+
* THE PROBLEM
|
|
6
|
+
* -----------
|
|
7
|
+
* Chrome can hand back a frame painted with styles resolved against the wrong
|
|
8
|
+
* viewport while it sets up a beyond-viewport capture: narrow-viewport media
|
|
9
|
+
* rules, a collapsed `min-height: 100vh` hero, or text sized from a
|
|
10
|
+
* `@media (max-width: 480px)` body font. The page measures correctly (DOM,
|
|
11
|
+
* element map and computed styles all match the baseline) but the pixels do
|
|
12
|
+
* not, so an unchanged page flips between two renders from run to run and is
|
|
13
|
+
* reported as changed. Measured on the standalone CLI (an e2e fixture failed
|
|
14
|
+
* on nearly every attempt) and on a Playwright suite in CI (testivai-site's
|
|
15
|
+
* home page: 4.13% "changed" on one run, the same commit passing on re-run).
|
|
16
|
+
*
|
|
17
|
+
* THE GUARD
|
|
18
|
+
* ---------
|
|
19
|
+
* 1. Wait for a fresh frame — two animation frames, so every style and layout
|
|
20
|
+
* change made so far has been painted — before measuring and capturing.
|
|
21
|
+
* A forced layout alone does not prevent a stale frame; a rendered one does.
|
|
22
|
+
* 2. Capture until two captures in a row are identical, at most
|
|
23
|
+
* MAX_STABLE_CAPTURES. The capture after a wrong frame is almost always
|
|
24
|
+
* right. A stable page costs one extra screenshot; a page that never stops
|
|
25
|
+
* changing costs MAX_STABLE_CAPTURES, never an endless loop. The same wrong
|
|
26
|
+
* frame twice in a row would still be kept: rare, as it takes two misses.
|
|
27
|
+
*
|
|
28
|
+
* The helpers are transport-agnostic: the adapter supplies how to evaluate the
|
|
29
|
+
* frame wait in its page and how to take one capture.
|
|
30
|
+
*/
|
|
31
|
+
/** How long the in-page frame wait waits for two frames before giving up. */
|
|
32
|
+
export declare const FRESH_FRAME_TIMEOUT_MS = 1000;
|
|
33
|
+
/**
|
|
34
|
+
* In-page expression an adapter awaits before capturing: resolves `true` once
|
|
35
|
+
* the page has rendered two animation frames (a frame produced after every
|
|
36
|
+
* style and layout change made so far has been painted), or `false` after
|
|
37
|
+
* FRESH_FRAME_TIMEOUT_MS for a page that renders no frames at all.
|
|
38
|
+
*/
|
|
39
|
+
export declare const FRESH_FRAME_EXPRESSION = "new Promise((resolve) => {\n const timer = setTimeout(() => resolve(false), 1000);\n requestAnimationFrame(() => requestAnimationFrame(() => {\n clearTimeout(timer);\n resolve(true);\n }));\n})";
|
|
40
|
+
/**
|
|
41
|
+
* The most captures of one page while waiting for two in a row to match.
|
|
42
|
+
* Every stale-capture pattern measured settles within four (stale, good,
|
|
43
|
+
* good / good, stale, good, good).
|
|
44
|
+
*/
|
|
45
|
+
export declare const MAX_STABLE_CAPTURES = 4;
|
|
46
|
+
/** Where the helpers report what they did; adapters route it to their debug output. */
|
|
47
|
+
export type CaptureLog = (message: string) => void;
|
|
48
|
+
/**
|
|
49
|
+
* Wait for a fresh frame, retrying once when none arrived in time (a loaded
|
|
50
|
+
* machine can stall a frame past the in-page timeout). Best-effort, never
|
|
51
|
+
* blocking and never throwing: if neither attempt sees a frame, the capture
|
|
52
|
+
* proceeds and the log says it may be stale.
|
|
53
|
+
*
|
|
54
|
+
* @param waitOnce Evaluates FRESH_FRAME_EXPRESSION in the page and resolves
|
|
55
|
+
* whether it saw two frames. A rejection (e.g. the page navigated away)
|
|
56
|
+
* counts as no frame.
|
|
57
|
+
* @param log Optional debug sink.
|
|
58
|
+
*/
|
|
59
|
+
export declare function settleFreshFrame(waitOnce: () => Promise<boolean>, log?: CaptureLog): Promise<void>;
|
|
60
|
+
/** Options for {@link captureUntilStable}. */
|
|
61
|
+
export interface CaptureUntilStableOptions<T> {
|
|
62
|
+
/** Takes one capture of the page (e.g. base64 PNG data from CDP). */
|
|
63
|
+
capture: () => Promise<T>;
|
|
64
|
+
/** Runs before every recapture; typically `settleFreshFrame`. Not run before the first capture. */
|
|
65
|
+
settle: () => Promise<void>;
|
|
66
|
+
/** Whether two captures are the same pixels. Default: strict equality (right for base64 strings). */
|
|
67
|
+
same?: (a: T, b: T) => boolean;
|
|
68
|
+
/** Most captures to take. Default: MAX_STABLE_CAPTURES. */
|
|
69
|
+
maxCaptures?: number;
|
|
70
|
+
/** Optional debug sink. */
|
|
71
|
+
log?: CaptureLog;
|
|
72
|
+
}
|
|
73
|
+
/**
|
|
74
|
+
* Capture until two captures in a row match, at most `maxCaptures`, and return
|
|
75
|
+
* the matching capture (or the last one when none matched the one before it).
|
|
76
|
+
* The caller waits for a fresh frame before the first capture, usually before
|
|
77
|
+
* measuring the page; this settles again before every recapture.
|
|
78
|
+
*/
|
|
79
|
+
export declare function captureUntilStable<T>(options: CaptureUntilStableOptions<T>): Promise<T>;
|
|
80
|
+
//# sourceMappingURL=stable-capture.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"stable-capture.d.ts","sourceRoot":"","sources":["../../src/capture/stable-capture.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA6BG;AAEH,6EAA6E;AAC7E,eAAO,MAAM,sBAAsB,OAAO,CAAC;AAE3C;;;;;GAKG;AACH,eAAO,MAAM,sBAAsB,+MAMhC,CAAC;AAEJ;;;;GAIG;AACH,eAAO,MAAM,mBAAmB,IAAI,CAAC;AAErC,uFAAuF;AACvF,MAAM,MAAM,UAAU,GAAG,CAAC,OAAO,EAAE,MAAM,KAAK,IAAI,CAAC;AAEnD;;;;;;;;;;GAUG;AACH,wBAAsB,gBAAgB,CAAC,QAAQ,EAAE,MAAM,OAAO,CAAC,OAAO,CAAC,EAAE,GAAG,CAAC,EAAE,UAAU,GAAG,OAAO,CAAC,IAAI,CAAC,CAYxG;AAED,8CAA8C;AAC9C,MAAM,WAAW,yBAAyB,CAAC,CAAC;IAC1C,qEAAqE;IACrE,OAAO,EAAE,MAAM,OAAO,CAAC,CAAC,CAAC,CAAC;IAC1B,mGAAmG;IACnG,MAAM,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;IAC5B,qGAAqG;IACrG,IAAI,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,KAAK,OAAO,CAAC;IAC/B,2DAA2D;IAC3D,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,2BAA2B;IAC3B,GAAG,CAAC,EAAE,UAAU,CAAC;CAClB;AAED;;;;;GAKG;AACH,wBAAsB,kBAAkB,CAAC,CAAC,EAAE,OAAO,EAAE,yBAAyB,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC,CAe7F"}
|
|
@@ -0,0 +1,106 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Stable full-page capture — shared by every adapter that screenshots through
|
|
4
|
+
* CDP `Page.captureScreenshot` with `captureBeyondViewport`.
|
|
5
|
+
*
|
|
6
|
+
* THE PROBLEM
|
|
7
|
+
* -----------
|
|
8
|
+
* Chrome can hand back a frame painted with styles resolved against the wrong
|
|
9
|
+
* viewport while it sets up a beyond-viewport capture: narrow-viewport media
|
|
10
|
+
* rules, a collapsed `min-height: 100vh` hero, or text sized from a
|
|
11
|
+
* `@media (max-width: 480px)` body font. The page measures correctly (DOM,
|
|
12
|
+
* element map and computed styles all match the baseline) but the pixels do
|
|
13
|
+
* not, so an unchanged page flips between two renders from run to run and is
|
|
14
|
+
* reported as changed. Measured on the standalone CLI (an e2e fixture failed
|
|
15
|
+
* on nearly every attempt) and on a Playwright suite in CI (testivai-site's
|
|
16
|
+
* home page: 4.13% "changed" on one run, the same commit passing on re-run).
|
|
17
|
+
*
|
|
18
|
+
* THE GUARD
|
|
19
|
+
* ---------
|
|
20
|
+
* 1. Wait for a fresh frame — two animation frames, so every style and layout
|
|
21
|
+
* change made so far has been painted — before measuring and capturing.
|
|
22
|
+
* A forced layout alone does not prevent a stale frame; a rendered one does.
|
|
23
|
+
* 2. Capture until two captures in a row are identical, at most
|
|
24
|
+
* MAX_STABLE_CAPTURES. The capture after a wrong frame is almost always
|
|
25
|
+
* right. A stable page costs one extra screenshot; a page that never stops
|
|
26
|
+
* changing costs MAX_STABLE_CAPTURES, never an endless loop. The same wrong
|
|
27
|
+
* frame twice in a row would still be kept: rare, as it takes two misses.
|
|
28
|
+
*
|
|
29
|
+
* The helpers are transport-agnostic: the adapter supplies how to evaluate the
|
|
30
|
+
* frame wait in its page and how to take one capture.
|
|
31
|
+
*/
|
|
32
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
33
|
+
exports.MAX_STABLE_CAPTURES = exports.FRESH_FRAME_EXPRESSION = exports.FRESH_FRAME_TIMEOUT_MS = void 0;
|
|
34
|
+
exports.settleFreshFrame = settleFreshFrame;
|
|
35
|
+
exports.captureUntilStable = captureUntilStable;
|
|
36
|
+
/** How long the in-page frame wait waits for two frames before giving up. */
|
|
37
|
+
exports.FRESH_FRAME_TIMEOUT_MS = 1000;
|
|
38
|
+
/**
|
|
39
|
+
* In-page expression an adapter awaits before capturing: resolves `true` once
|
|
40
|
+
* the page has rendered two animation frames (a frame produced after every
|
|
41
|
+
* style and layout change made so far has been painted), or `false` after
|
|
42
|
+
* FRESH_FRAME_TIMEOUT_MS for a page that renders no frames at all.
|
|
43
|
+
*/
|
|
44
|
+
exports.FRESH_FRAME_EXPRESSION = `new Promise((resolve) => {
|
|
45
|
+
const timer = setTimeout(() => resolve(false), ${exports.FRESH_FRAME_TIMEOUT_MS});
|
|
46
|
+
requestAnimationFrame(() => requestAnimationFrame(() => {
|
|
47
|
+
clearTimeout(timer);
|
|
48
|
+
resolve(true);
|
|
49
|
+
}));
|
|
50
|
+
})`;
|
|
51
|
+
/**
|
|
52
|
+
* The most captures of one page while waiting for two in a row to match.
|
|
53
|
+
* Every stale-capture pattern measured settles within four (stale, good,
|
|
54
|
+
* good / good, stale, good, good).
|
|
55
|
+
*/
|
|
56
|
+
exports.MAX_STABLE_CAPTURES = 4;
|
|
57
|
+
/**
|
|
58
|
+
* Wait for a fresh frame, retrying once when none arrived in time (a loaded
|
|
59
|
+
* machine can stall a frame past the in-page timeout). Best-effort, never
|
|
60
|
+
* blocking and never throwing: if neither attempt sees a frame, the capture
|
|
61
|
+
* proceeds and the log says it may be stale.
|
|
62
|
+
*
|
|
63
|
+
* @param waitOnce Evaluates FRESH_FRAME_EXPRESSION in the page and resolves
|
|
64
|
+
* whether it saw two frames. A rejection (e.g. the page navigated away)
|
|
65
|
+
* counts as no frame.
|
|
66
|
+
* @param log Optional debug sink.
|
|
67
|
+
*/
|
|
68
|
+
async function settleFreshFrame(waitOnce, log) {
|
|
69
|
+
const attempt = async () => {
|
|
70
|
+
try {
|
|
71
|
+
return (await waitOnce()) === true;
|
|
72
|
+
}
|
|
73
|
+
catch {
|
|
74
|
+
return false;
|
|
75
|
+
}
|
|
76
|
+
};
|
|
77
|
+
if (await attempt())
|
|
78
|
+
return;
|
|
79
|
+
log?.('no fresh frame within the wait; waiting once more');
|
|
80
|
+
if (await attempt())
|
|
81
|
+
return;
|
|
82
|
+
log?.('no fresh frame after a retry; capturing anyway, the screenshot may be stale');
|
|
83
|
+
}
|
|
84
|
+
/**
|
|
85
|
+
* Capture until two captures in a row match, at most `maxCaptures`, and return
|
|
86
|
+
* the matching capture (or the last one when none matched the one before it).
|
|
87
|
+
* The caller waits for a fresh frame before the first capture, usually before
|
|
88
|
+
* measuring the page; this settles again before every recapture.
|
|
89
|
+
*/
|
|
90
|
+
async function captureUntilStable(options) {
|
|
91
|
+
const { capture, settle, log } = options;
|
|
92
|
+
const same = options.same ?? ((a, b) => a === b);
|
|
93
|
+
const maxCaptures = options.maxCaptures ?? exports.MAX_STABLE_CAPTURES;
|
|
94
|
+
let previous = await capture();
|
|
95
|
+
for (let captures = 1; captures < maxCaptures; captures++) {
|
|
96
|
+
await settle();
|
|
97
|
+
const current = await capture();
|
|
98
|
+
if (same(current, previous))
|
|
99
|
+
return current;
|
|
100
|
+
log?.('two captures in a row differed; capturing again');
|
|
101
|
+
previous = current;
|
|
102
|
+
}
|
|
103
|
+
log?.(`no two captures in a row matched in ${maxCaptures}; keeping the last`);
|
|
104
|
+
return previous;
|
|
105
|
+
}
|
|
106
|
+
//# sourceMappingURL=stable-capture.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"stable-capture.js","sourceRoot":"","sources":["../../src/capture/stable-capture.ts"],"names":[],"mappings":";AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA6BG;;;AAwCH,4CAYC;AAsBD,gDAeC;AAvFD,6EAA6E;AAChE,QAAA,sBAAsB,GAAG,IAAI,CAAC;AAE3C;;;;;GAKG;AACU,QAAA,sBAAsB,GAAG;mDACa,8BAAsB;;;;;GAKtE,CAAC;AAEJ;;;;GAIG;AACU,QAAA,mBAAmB,GAAG,CAAC,CAAC;AAKrC;;;;;;;;;;GAUG;AACI,KAAK,UAAU,gBAAgB,CAAC,QAAgC,EAAE,GAAgB;IACvF,MAAM,OAAO,GAAG,KAAK,IAAsB,EAAE;QAC3C,IAAI,CAAC;YACH,OAAO,CAAC,MAAM,QAAQ,EAAE,CAAC,KAAK,IAAI,CAAC;QACrC,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,KAAK,CAAC;QACf,CAAC;IACH,CAAC,CAAC;IACF,IAAI,MAAM,OAAO,EAAE;QAAE,OAAO;IAC5B,GAAG,EAAE,CAAC,mDAAmD,CAAC,CAAC;IAC3D,IAAI,MAAM,OAAO,EAAE;QAAE,OAAO;IAC5B,GAAG,EAAE,CAAC,6EAA6E,CAAC,CAAC;AACvF,CAAC;AAgBD;;;;;GAKG;AACI,KAAK,UAAU,kBAAkB,CAAI,OAAqC;IAC/E,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,GAAG,EAAE,GAAG,OAAO,CAAC;IACzC,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,IAAI,CAAC,CAAC,CAAI,EAAE,CAAI,EAAE,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC;IACvD,MAAM,WAAW,GAAG,OAAO,CAAC,WAAW,IAAI,2BAAmB,CAAC;IAE/D,IAAI,QAAQ,GAAG,MAAM,OAAO,EAAE,CAAC;IAC/B,KAAK,IAAI,QAAQ,GAAG,CAAC,EAAE,QAAQ,GAAG,WAAW,EAAE,QAAQ,EAAE,EAAE,CAAC;QAC1D,MAAM,MAAM,EAAE,CAAC;QACf,MAAM,OAAO,GAAG,MAAM,OAAO,EAAE,CAAC;QAChC,IAAI,IAAI,CAAC,OAAO,EAAE,QAAQ,CAAC;YAAE,OAAO,OAAO,CAAC;QAC5C,GAAG,EAAE,CAAC,iDAAiD,CAAC,CAAC;QACzD,QAAQ,GAAG,OAAO,CAAC;IACrB,CAAC;IACD,GAAG,EAAE,CAAC,uCAAuC,WAAW,oBAAoB,CAAC,CAAC;IAC9E,OAAO,QAAQ,CAAC;AAClB,CAAC"}
|
package/dist/index.d.ts
CHANGED
|
@@ -18,6 +18,8 @@ export { parseShardEnv, resolveCaptureOnly, writeShardManifest, SHARD_MANIFEST }
|
|
|
18
18
|
export type { ShardInfo, ShardManifest } from './capture/shard';
|
|
19
19
|
export { settleProbe, buildSettleProbeExpression, SETTLE_STOP_EXPRESSION, SETTLE_STATE_KEY, DEFAULT_QUIET_MS, DEFAULT_SETTLE_TIMEOUT_MS, } from './capture/settle';
|
|
20
20
|
export type { SettleState } from './capture/settle';
|
|
21
|
+
export { FRESH_FRAME_EXPRESSION, FRESH_FRAME_TIMEOUT_MS, MAX_STABLE_CAPTURES, settleFreshFrame, captureUntilStable, } from './capture/stable-capture';
|
|
22
|
+
export type { CaptureLog, CaptureUntilStableOptions } from './capture/stable-capture';
|
|
21
23
|
export { BaselineStore } from './baselines';
|
|
22
24
|
export type { BaselineMetadata } from './baselines';
|
|
23
25
|
export { loadLocalConfig, createDefaultConfig, localConfigExists, getConfigPath, getDefaultConfig, } from './config';
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAGH,cAAc,SAAS,CAAC;AAGxB,OAAO,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AACjD,OAAO,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AACnD,OAAO,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AACnD,OAAO,EAAE,gBAAgB,EAAE,qBAAqB,EAAE,MAAM,qBAAqB,CAAC;AAG9E,OAAO,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AACtD,OAAO,EAAE,cAAc,EAAE,sBAAsB,EAAE,kBAAkB,EAAE,gBAAgB,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AACnI,OAAO,EAAE,cAAc,EAAE,YAAY,EAAE,mBAAmB,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AACnG,OAAO,EAAE,iBAAiB,EAAE,MAAM,0BAA0B,CAAC;AAG7D,cAAc,QAAQ,CAAC;AAIvB,OAAO,EAAE,iBAAiB,EAAE,yBAAyB,EAAE,oBAAoB,EAAE,MAAM,uBAAuB,CAAC;AAC3G,YAAY,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAC;AAG9D,OAAO,EAAE,aAAa,EAAE,kBAAkB,EAAE,kBAAkB,EAAE,cAAc,EAAE,MAAM,iBAAiB,CAAC;AACxG,YAAY,EAAE,SAAS,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AAGhE,OAAO,EACL,WAAW,EACX,0BAA0B,EAC1B,sBAAsB,EACtB,gBAAgB,EAChB,gBAAgB,EAChB,yBAAyB,GAC1B,MAAM,kBAAkB,CAAC;AAC1B,YAAY,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAGH,cAAc,SAAS,CAAC;AAGxB,OAAO,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AACjD,OAAO,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AACnD,OAAO,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AACnD,OAAO,EAAE,gBAAgB,EAAE,qBAAqB,EAAE,MAAM,qBAAqB,CAAC;AAG9E,OAAO,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AACtD,OAAO,EAAE,cAAc,EAAE,sBAAsB,EAAE,kBAAkB,EAAE,gBAAgB,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AACnI,OAAO,EAAE,cAAc,EAAE,YAAY,EAAE,mBAAmB,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AACnG,OAAO,EAAE,iBAAiB,EAAE,MAAM,0BAA0B,CAAC;AAG7D,cAAc,QAAQ,CAAC;AAIvB,OAAO,EAAE,iBAAiB,EAAE,yBAAyB,EAAE,oBAAoB,EAAE,MAAM,uBAAuB,CAAC;AAC3G,YAAY,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAC;AAG9D,OAAO,EAAE,aAAa,EAAE,kBAAkB,EAAE,kBAAkB,EAAE,cAAc,EAAE,MAAM,iBAAiB,CAAC;AACxG,YAAY,EAAE,SAAS,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AAGhE,OAAO,EACL,WAAW,EACX,0BAA0B,EAC1B,sBAAsB,EACtB,gBAAgB,EAChB,gBAAgB,EAChB,yBAAyB,GAC1B,MAAM,kBAAkB,CAAC;AAC1B,YAAY,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAIpD,OAAO,EACL,sBAAsB,EACtB,sBAAsB,EACtB,mBAAmB,EACnB,gBAAgB,EAChB,kBAAkB,GACnB,MAAM,0BAA0B,CAAC;AAClC,YAAY,EAAE,UAAU,EAAE,yBAAyB,EAAE,MAAM,0BAA0B,CAAC;AAEtF,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAC5C,YAAY,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;AAGpD,OAAO,EACL,eAAe,EACf,mBAAmB,EACnB,iBAAiB,EACjB,aAAa,EACb,gBAAgB,GACjB,MAAM,UAAU,CAAC;AAClB,YAAY,EAAE,WAAW,EAAE,MAAM,UAAU,CAAC;AAG5C,OAAO,EAAE,cAAc,EAAE,UAAU,EAAE,UAAU,EAAE,MAAM,UAAU,CAAC;AAClE,YAAY,EAAE,qBAAqB,EAAE,cAAc,EAAE,UAAU,EAAE,aAAa,EAAE,cAAc,EAAE,cAAc,EAAE,MAAM,UAAU,CAAC;AAGjI,OAAO,EAAE,WAAW,EAAE,MAAM,iBAAiB,CAAC;AAC9C,OAAO,EAAE,UAAU,EAAE,MAAM,gBAAgB,CAAC;AAC5C,OAAO,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAC;AACpD,OAAO,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAC;AAIpD,eAAO,MAAM,OAAO,KAAqC,CAAC"}
|
package/dist/index.js
CHANGED
|
@@ -18,7 +18,7 @@ var __exportStar = (this && this.__exportStar) || function(m, exports) {
|
|
|
18
18
|
for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
|
|
19
19
|
};
|
|
20
20
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
21
|
-
exports.VERSION = exports.approveCommand = exports.witnessCommand = exports.runCommand = exports.initCommand = exports.renderHtml = exports.compareAll = exports.generateReport = exports.getDefaultConfig = exports.getConfigPath = exports.localConfigExists = exports.createDefaultConfig = exports.loadLocalConfig = exports.BaselineStore = exports.DEFAULT_SETTLE_TIMEOUT_MS = exports.DEFAULT_QUIET_MS = exports.SETTLE_STATE_KEY = exports.SETTLE_STOP_EXPRESSION = exports.buildSettleProbeExpression = exports.settleProbe = exports.SHARD_MANIFEST = exports.writeShardManifest = exports.resolveCaptureOnly = exports.parseShardEnv = exports.DEFAULT_MAX_ELEMENTS = exports.buildElementMapExpression = exports.collectElementMap = exports.FrameworkDetector = exports.commandExists = exports.setupSignalHandlers = exports.spawnProcess = exports.ProcessManager = exports.isSafeFilename = exports.sanitizeTestName = exports.extractNameFromUrl = exports.generateUniqueFilename = exports.toSafeFilename = exports.createLogger = exports.logger = exports.BrowserDiscoveryError = exports.BrowserDiscovery = exports.BrowserBinding = exports.BrowserCapture = exports.BrowserClient = void 0;
|
|
21
|
+
exports.VERSION = exports.approveCommand = exports.witnessCommand = exports.runCommand = exports.initCommand = exports.renderHtml = exports.compareAll = exports.generateReport = exports.getDefaultConfig = exports.getConfigPath = exports.localConfigExists = exports.createDefaultConfig = exports.loadLocalConfig = exports.BaselineStore = exports.captureUntilStable = exports.settleFreshFrame = exports.MAX_STABLE_CAPTURES = exports.FRESH_FRAME_TIMEOUT_MS = exports.FRESH_FRAME_EXPRESSION = exports.DEFAULT_SETTLE_TIMEOUT_MS = exports.DEFAULT_QUIET_MS = exports.SETTLE_STATE_KEY = exports.SETTLE_STOP_EXPRESSION = exports.buildSettleProbeExpression = exports.settleProbe = exports.SHARD_MANIFEST = exports.writeShardManifest = exports.resolveCaptureOnly = exports.parseShardEnv = exports.DEFAULT_MAX_ELEMENTS = exports.buildElementMapExpression = exports.collectElementMap = exports.FrameworkDetector = exports.commandExists = exports.setupSignalHandlers = exports.spawnProcess = exports.ProcessManager = exports.isSafeFilename = exports.sanitizeTestName = exports.extractNameFromUrl = exports.generateUniqueFilename = exports.toSafeFilename = exports.createLogger = exports.logger = exports.BrowserDiscoveryError = exports.BrowserDiscovery = exports.BrowserBinding = exports.BrowserCapture = exports.BrowserClient = void 0;
|
|
22
22
|
// Export types
|
|
23
23
|
__exportStar(require("./types"), exports);
|
|
24
24
|
// Export browser modules
|
|
@@ -70,6 +70,14 @@ Object.defineProperty(exports, "SETTLE_STOP_EXPRESSION", { enumerable: true, get
|
|
|
70
70
|
Object.defineProperty(exports, "SETTLE_STATE_KEY", { enumerable: true, get: function () { return settle_1.SETTLE_STATE_KEY; } });
|
|
71
71
|
Object.defineProperty(exports, "DEFAULT_QUIET_MS", { enumerable: true, get: function () { return settle_1.DEFAULT_QUIET_MS; } });
|
|
72
72
|
Object.defineProperty(exports, "DEFAULT_SETTLE_TIMEOUT_MS", { enumerable: true, get: function () { return settle_1.DEFAULT_SETTLE_TIMEOUT_MS; } });
|
|
73
|
+
// Stable full-page capture (fresh frame + capture until two in a row match) —
|
|
74
|
+
// shared by every adapter that captures through CDP captureBeyondViewport.
|
|
75
|
+
var stable_capture_1 = require("./capture/stable-capture");
|
|
76
|
+
Object.defineProperty(exports, "FRESH_FRAME_EXPRESSION", { enumerable: true, get: function () { return stable_capture_1.FRESH_FRAME_EXPRESSION; } });
|
|
77
|
+
Object.defineProperty(exports, "FRESH_FRAME_TIMEOUT_MS", { enumerable: true, get: function () { return stable_capture_1.FRESH_FRAME_TIMEOUT_MS; } });
|
|
78
|
+
Object.defineProperty(exports, "MAX_STABLE_CAPTURES", { enumerable: true, get: function () { return stable_capture_1.MAX_STABLE_CAPTURES; } });
|
|
79
|
+
Object.defineProperty(exports, "settleFreshFrame", { enumerable: true, get: function () { return stable_capture_1.settleFreshFrame; } });
|
|
80
|
+
Object.defineProperty(exports, "captureUntilStable", { enumerable: true, get: function () { return stable_capture_1.captureUntilStable; } });
|
|
73
81
|
var baselines_1 = require("./baselines");
|
|
74
82
|
Object.defineProperty(exports, "BaselineStore", { enumerable: true, get: function () { return baselines_1.BaselineStore; } });
|
|
75
83
|
// Export local config
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AAAA;;;GAGG;;;;;;;;;;;;;;;;;AAEH,eAAe;AACf,0CAAwB;AAExB,yBAAyB;AACzB,2CAAiD;AAAxC,uGAAA,aAAa,OAAA;AACtB,6CAAmD;AAA1C,yGAAA,cAAc,OAAA;AACvB,6CAAmD;AAA1C,yGAAA,cAAc,OAAA;AACvB,iDAA8E;AAArE,6GAAA,gBAAgB,OAAA;AAAE,kHAAA,qBAAqB,OAAA;AAEhD,mBAAmB;AACnB,yCAAsD;AAA7C,gGAAA,MAAM,OAAA;AAAE,sGAAA,YAAY,OAAA;AAC7B,mDAAmI;AAA1H,6GAAA,cAAc,OAAA;AAAE,qHAAA,sBAAsB,OAAA;AAAE,iHAAA,kBAAkB,OAAA;AAAE,+GAAA,gBAAgB,OAAA;AAAE,6GAAA,cAAc,OAAA;AACrG,2CAAmG;AAA1F,yGAAA,cAAc,OAAA;AAAE,uGAAA,YAAY,OAAA;AAAE,8GAAA,mBAAmB,OAAA;AAAE,wGAAA,aAAa,OAAA;AACzE,6DAA6D;AAApD,qHAAA,iBAAiB,OAAA;AAE1B,qBAAqB;AACrB,yCAAuB;AAEvB,mBAAmB;AACnB,yEAAyE;AACzE,qDAA2G;AAAlG,gHAAA,iBAAiB,OAAA;AAAE,wHAAA,yBAAyB,OAAA;AAAE,mHAAA,oBAAoB,OAAA;AAG3E,oEAAoE;AACpE,yCAAwG;AAA/F,sGAAA,aAAa,OAAA;AAAE,2GAAA,kBAAkB,OAAA;AAAE,2GAAA,kBAAkB,OAAA;AAAE,uGAAA,cAAc,OAAA;AAG9E,gDAAgD;AAChD,2CAO0B;AANxB,qGAAA,WAAW,OAAA;AACX,oHAAA,0BAA0B,OAAA;AAC1B,gHAAA,sBAAsB,OAAA;AACtB,0GAAA,gBAAgB,OAAA;AAChB,0GAAA,gBAAgB,OAAA;AAChB,mHAAA,yBAAyB,OAAA;AAI3B,yCAA4C;AAAnC,0GAAA,aAAa,OAAA;AAGtB,sBAAsB;AACtB,mCAMkB;AALhB,yGAAA,eAAe,OAAA;AACf,6GAAA,mBAAmB,OAAA;AACnB,2GAAA,iBAAiB,OAAA;AACjB,uGAAA,aAAa,OAAA;AACb,0GAAA,gBAAgB,OAAA;AAIlB,0BAA0B;AAC1B,mCAAkE;AAAzD,wGAAA,cAAc,OAAA;AAAE,oGAAA,UAAU,OAAA;AAAE,oGAAA,UAAU,OAAA;AAG/C,yCAAyC;AACzC,wCAA8C;AAArC,mGAAA,WAAW,OAAA;AACpB,sCAA4C;AAAnC,iGAAA,UAAU,OAAA;AACnB,8CAAoD;AAA3C,yGAAA,cAAc,OAAA;AACvB,8CAAoD;AAA3C,yGAAA,cAAc,OAAA;AAEvB,UAAU;AACV,8DAA8D;AACjD,QAAA,OAAO,GAAG,OAAO,CAAC,iBAAiB,CAAC,CAAC,OAAO,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AAAA;;;GAGG;;;;;;;;;;;;;;;;;AAEH,eAAe;AACf,0CAAwB;AAExB,yBAAyB;AACzB,2CAAiD;AAAxC,uGAAA,aAAa,OAAA;AACtB,6CAAmD;AAA1C,yGAAA,cAAc,OAAA;AACvB,6CAAmD;AAA1C,yGAAA,cAAc,OAAA;AACvB,iDAA8E;AAArE,6GAAA,gBAAgB,OAAA;AAAE,kHAAA,qBAAqB,OAAA;AAEhD,mBAAmB;AACnB,yCAAsD;AAA7C,gGAAA,MAAM,OAAA;AAAE,sGAAA,YAAY,OAAA;AAC7B,mDAAmI;AAA1H,6GAAA,cAAc,OAAA;AAAE,qHAAA,sBAAsB,OAAA;AAAE,iHAAA,kBAAkB,OAAA;AAAE,+GAAA,gBAAgB,OAAA;AAAE,6GAAA,cAAc,OAAA;AACrG,2CAAmG;AAA1F,yGAAA,cAAc,OAAA;AAAE,uGAAA,YAAY,OAAA;AAAE,8GAAA,mBAAmB,OAAA;AAAE,wGAAA,aAAa,OAAA;AACzE,6DAA6D;AAApD,qHAAA,iBAAiB,OAAA;AAE1B,qBAAqB;AACrB,yCAAuB;AAEvB,mBAAmB;AACnB,yEAAyE;AACzE,qDAA2G;AAAlG,gHAAA,iBAAiB,OAAA;AAAE,wHAAA,yBAAyB,OAAA;AAAE,mHAAA,oBAAoB,OAAA;AAG3E,oEAAoE;AACpE,yCAAwG;AAA/F,sGAAA,aAAa,OAAA;AAAE,2GAAA,kBAAkB,OAAA;AAAE,2GAAA,kBAAkB,OAAA;AAAE,uGAAA,cAAc,OAAA;AAG9E,gDAAgD;AAChD,2CAO0B;AANxB,qGAAA,WAAW,OAAA;AACX,oHAAA,0BAA0B,OAAA;AAC1B,gHAAA,sBAAsB,OAAA;AACtB,0GAAA,gBAAgB,OAAA;AAChB,0GAAA,gBAAgB,OAAA;AAChB,mHAAA,yBAAyB,OAAA;AAI3B,8EAA8E;AAC9E,2EAA2E;AAC3E,2DAMkC;AALhC,wHAAA,sBAAsB,OAAA;AACtB,wHAAA,sBAAsB,OAAA;AACtB,qHAAA,mBAAmB,OAAA;AACnB,kHAAA,gBAAgB,OAAA;AAChB,oHAAA,kBAAkB,OAAA;AAIpB,yCAA4C;AAAnC,0GAAA,aAAa,OAAA;AAGtB,sBAAsB;AACtB,mCAMkB;AALhB,yGAAA,eAAe,OAAA;AACf,6GAAA,mBAAmB,OAAA;AACnB,2GAAA,iBAAiB,OAAA;AACjB,uGAAA,aAAa,OAAA;AACb,0GAAA,gBAAgB,OAAA;AAIlB,0BAA0B;AAC1B,mCAAkE;AAAzD,wGAAA,cAAc,OAAA;AAAE,oGAAA,UAAU,OAAA;AAAE,oGAAA,UAAU,OAAA;AAG/C,yCAAyC;AACzC,wCAA8C;AAArC,mGAAA,WAAW,OAAA;AACpB,sCAA4C;AAAnC,iGAAA,UAAU,OAAA;AACnB,8CAAoD;AAA3C,yGAAA,cAAc,OAAA;AACvB,8CAAoD;AAA3C,yGAAA,cAAc,OAAA;AAEvB,UAAU;AACV,8DAA8D;AACjD,QAAA,OAAO,GAAG,OAAO,CAAC,iBAAiB,CAAC,CAAC,OAAO,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"run.d.ts","sourceRoot":"","sources":["../../src/standalone/run.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;
|
|
1
|
+
{"version":3,"file":"run.d.ts","sourceRoot":"","sources":["../../src/standalone/run.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AAoBH,MAAM,WAAW,iBAAiB;IAChC,4DAA4D;IAC5D,KAAK,CAAC,EAAE,MAAM,EAAE,CAAC;IACjB,oDAAoD;IACpD,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,QAAQ,CAAC,EAAE;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAA;KAAE,CAAC;IAC7C,+DAA+D;IAC/D,IAAI,CAAC,EAAE,MAAM,CAAC;CACf;AAED,UAAU,UAAU;IAClB,MAAM,EAAE,GAAG,CAAC;IACZ,QAAQ,EAAE,MAAM,CAAC;CAClB;AAmCD;;;;;;;;;;;;;GAaG;AACH,wBAAsB,QAAQ,CAC5B,IAAI,EAAE,MAAM,EACZ,GAAG,EAAE,MAAM,EACX,QAAQ,CAAC,EAAE;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,GAC3C,OAAO,CAAC,UAAU,CAAC,CAqBrB;AA+HD,2HAA2H;AAC3H,wBAAsB,eAAe,CAAC,MAAM,EAAE,GAAG,GAAG,OAAO,CAAC,MAAM,CAAC,CAmClE;AAED,wBAAsB,oBAAoB,CACxC,QAAQ,EAAE,MAAM,EAChB,OAAO,EAAE,iBAAiB,GACzB,OAAO,CAAC,IAAI,CAAC,CAiGf"}
|
package/dist/standalone/run.js
CHANGED
|
@@ -28,6 +28,7 @@ const store_1 = require("../baselines/store");
|
|
|
28
28
|
const local_config_1 = require("../config/local-config");
|
|
29
29
|
const generator_1 = require("../report/generator");
|
|
30
30
|
const logger_1 = require("../utils/logger");
|
|
31
|
+
const stable_capture_1 = require("../capture/stable-capture");
|
|
31
32
|
const crawl_1 = require("./crawl");
|
|
32
33
|
const launcher_1 = require("./launcher");
|
|
33
34
|
/** Mirrors the adapters' stabilization CSS (see packages/playwright config/stabilize):
|
|
@@ -179,33 +180,17 @@ async function revealPage(client) {
|
|
|
179
180
|
// best-effort: capture proceeds from the top either way
|
|
180
181
|
}
|
|
181
182
|
}
|
|
183
|
+
/** Debug sink for the shared capture helpers, prefixed for this mode. */
|
|
184
|
+
const captureLog = (message) => logger_1.logger.debug(`standalone capture: ${message}`);
|
|
182
185
|
/**
|
|
183
|
-
*
|
|
184
|
-
*
|
|
185
|
-
*
|
|
186
|
-
*/
|
|
187
|
-
const FRESH_FRAME_SCRIPT = `new Promise((resolve) => {
|
|
188
|
-
const timer = setTimeout(() => resolve(false), 1000);
|
|
189
|
-
requestAnimationFrame(() => requestAnimationFrame(() => {
|
|
190
|
-
clearTimeout(timer);
|
|
191
|
-
resolve(true);
|
|
192
|
-
}));
|
|
193
|
-
})`;
|
|
194
|
-
/**
|
|
195
|
-
* Wait for a freshly rendered frame before capturing. Without it,
|
|
196
|
-
* Page.captureScreenshot could return a stale frame: the page measured
|
|
197
|
-
* correctly, but the pixels showed styles resolved against an earlier
|
|
198
|
-
* viewport (a collapsed 100vh hero, narrow-viewport media rules), so
|
|
199
|
-
* identical pages flipped between two renders from run to run. A forced
|
|
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.
|
|
186
|
+
* Evaluate the shared fresh-frame wait (FRESH_FRAME_EXPRESSION) in the page.
|
|
187
|
+
* Resolves whether two frames were rendered: false when the in-page wait timed
|
|
188
|
+
* out, or failed because the page navigated.
|
|
204
189
|
*/
|
|
205
190
|
async function waitForFreshFrame(client) {
|
|
206
191
|
try {
|
|
207
192
|
const result = await client.Runtime.evaluate({
|
|
208
|
-
expression:
|
|
193
|
+
expression: stable_capture_1.FRESH_FRAME_EXPRESSION,
|
|
209
194
|
awaitPromise: true,
|
|
210
195
|
returnByValue: true,
|
|
211
196
|
});
|
|
@@ -216,25 +201,13 @@ async function waitForFreshFrame(client) {
|
|
|
216
201
|
}
|
|
217
202
|
}
|
|
218
203
|
/**
|
|
219
|
-
* Wait for a
|
|
220
|
-
*
|
|
221
|
-
*
|
|
204
|
+
* Wait for a freshly rendered frame before capturing (retried once; see
|
|
205
|
+
* capture/stable-capture.ts for why a stale frame happens). Best-effort,
|
|
206
|
+
* never blocking.
|
|
222
207
|
*/
|
|
223
|
-
|
|
224
|
-
|
|
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');
|
|
208
|
+
function settleFrame(client) {
|
|
209
|
+
return (0, stable_capture_1.settleFreshFrame)(() => waitForFreshFrame(client), captureLog);
|
|
230
210
|
}
|
|
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
211
|
async function screenshot(client, width, height) {
|
|
239
212
|
const shot = await client.Page.captureScreenshot({
|
|
240
213
|
format: 'png',
|
|
@@ -273,19 +246,12 @@ async function captureFullPage(client) {
|
|
|
273
246
|
// collapsed 100vh hero), most likely from the 1x1 view Chrome emulates for
|
|
274
247
|
// a moment while it sets up a beyond-viewport capture. The capture after
|
|
275
248
|
// it is almost always right, so capture until two captures in a row match.
|
|
276
|
-
|
|
277
|
-
|
|
278
|
-
|
|
279
|
-
|
|
280
|
-
|
|
281
|
-
|
|
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');
|
|
249
|
+
const data = await (0, stable_capture_1.captureUntilStable)({
|
|
250
|
+
capture: () => screenshot(client, width, height),
|
|
251
|
+
settle: () => settleFrame(client),
|
|
252
|
+
log: captureLog,
|
|
253
|
+
});
|
|
254
|
+
return Buffer.from(data, 'base64');
|
|
289
255
|
}
|
|
290
256
|
async function runStandaloneWitness(startUrl, options) {
|
|
291
257
|
const projectRoot = process.cwd();
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"run.js","sourceRoot":"","sources":["../../src/standalone/run.ts"],"names":[],"mappings":";AAAA;;;;;;;;;;;;;;;GAeG;;;;;
|
|
1
|
+
{"version":3,"file":"run.js","sourceRoot":"","sources":["../../src/standalone/run.ts"],"names":[],"mappings":";AAAA;;;;;;;;;;;;;;;GAeG;;;;;AAkFH,4BAyBC;AAgID,0CAmCC;AAED,oDAoGC;AAlXD,sFAA0C;AAC1C,kDAA0B;AAC1B,8CAAmD;AACnD,yDAAyD;AACzD,mDAAqD;AACrD,4CAAyC;AACzC,8DAAyG;AACzG,mCAA4E;AAC5E,yCAA2E;AAE3E;;oEAEoE;AACpE,MAAM,aAAa,GACjB,kGAAkG;IAClG,mFAAmF;IACnF,2GAA2G,CAAC;AAiB9G,KAAK,UAAU,QAAQ,CAAI,MAAW,EAAE,UAAkB;IACxD,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,OAAO,CAAC,QAAQ,CAAC,EAAE,UAAU,EAAE,aAAa,EAAE,IAAI,EAAE,CAAC,CAAC;IAClF,OAAO,MAAM,EAAE,MAAM,EAAE,KAAsB,CAAC;AAChD,CAAC;AAED,KAAK,UAAU,OAAO,CACpB,MAAW,EACX,UAAkB,EAClB,SAAiB,EACjB,UAAU,GAAG,GAAG;IAEhB,MAAM,QAAQ,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,SAAS,CAAC;IACxC,OAAO,IAAI,CAAC,GAAG,EAAE,GAAG,QAAQ,EAAE,CAAC;QAC7B,IAAI,CAAC;YACH,IAAI,CAAC,MAAM,QAAQ,CAAU,MAAM,EAAE,UAAU,CAAC,CAAC,KAAK,IAAI;gBAAE,OAAO;QACrE,CAAC;QAAC,MAAM,CAAC;YACP,6BAA6B;QAC/B,CAAC;QACD,MAAM,IAAI,OAAO,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,UAAU,CAAC,CAAC,EAAE,UAAU,CAAC,CAAC,CAAC;IACtD,CAAC;AACH,CAAC;AAED,sEAAsE;AACtE,MAAM,oBAAoB,GAAG,KAAM,CAAC;AAEpC;;;;;GAKG;AACH,MAAM,WAAW,GAAG,uEAAuE,CAAC;AAE5F;;;;;;;;;;;;;GAaG;AACI,KAAK,UAAU,QAAQ,CAC5B,IAAY,EACZ,GAAW,EACX,QAA4C;IAE5C,MAAM,MAAM,GAAG,MAAM,iCAAG,CAAC,GAAG,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC;IACvC,MAAM,IAAI,GAAe,EAAE,MAAM,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,CAAC,EAAE,EAAE,CAAC;IAC/D,IAAI,CAAC;QACH,IAAI,CAAC,MAAM,GAAG,MAAM,IAAA,iCAAG,EAAC,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,EAAE,CAAC,CAAC;QACrD,MAAM,OAAO,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,MAAM,EAAE,EAAE,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC;QAC7E,IAAI,QAAQ,EAAE,CAAC;YACb,MAAM,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,wBAAwB,CAAC;gBACnD,KAAK,EAAE,QAAQ,CAAC,KAAK;gBACrB,MAAM,EAAE,QAAQ,CAAC,MAAM;gBACvB,iBAAiB,EAAE,CAAC;gBACpB,MAAM,EAAE,KAAK;aACd,CAAC,CAAC;QACL,CAAC;QACD,MAAM,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,EAAE,GAAG,EAAE,CAAC,CAAC;QACzC,MAAM,OAAO,CAAC,IAAI,CAAC,MAAM,EAAE,WAAW,EAAE,oBAAoB,CAAC,CAAC;QAC9D,OAAO,IAAI,CAAC;IACd,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,MAAM,SAAS,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;QAC5B,MAAM,GAAG,CAAC;IACZ,CAAC;AACH,CAAC;AAED,KAAK,UAAU,SAAS,CAAC,IAAY,EAAE,IAAgB;IACrD,IAAI,CAAC;QACH,IAAI,IAAI,CAAC,MAAM;YAAE,MAAM,IAAI,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC;IAC7C,CAAC;IAAC,MAAM,CAAC;QACP,oBAAoB;IACtB,CAAC;IACD,IAAI,CAAC;QACH,MAAM,iCAAG,CAAC,KAAK,CAAC,EAAE,IAAI,EAAE,EAAE,EAAE,IAAI,CAAC,QAAQ,EAAE,CAAC,CAAC;IAC/C,CAAC;IAAC,MAAM,CAAC;QACP,yBAAyB;IAC3B,CAAC;AACH,CAAC;AAED,uFAAuF;AACvF,KAAK,UAAU,QAAQ,CACrB,MAAW,EACX,SAAkB,EAClB,eAAyB;IAEzB,MAAM,QAAQ,GAAa,EAAE,CAAC;IAC9B,IAAI,SAAS;QAAE,QAAQ,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC;IAC5C,IAAI,eAAe,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAC/B,QAAQ,CAAC,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,GAAG,CAAC,qCAAqC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;IAClG,CAAC;IACD,IAAI,QAAQ,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO;IAElC,MAAM,QAAQ,CACZ,MAAM,EACN,sDAAsD;QACpD,qBAAqB,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,GAAG;QAC3D,mDAAmD,CACtD,CAAC;IACF,IAAI,SAAS,EAAE,CAAC;QACd,wEAAwE;QACxE,sEAAsE;QACtE,qEAAqE;QACrE,2BAA2B;QAC3B,MAAM,OAAO,CAAC,MAAM,EAAE,6DAA6D,EAAE,KAAM,CAAC,CAAC;QAC7F,MAAM,QAAQ,CAAC,MAAM,EAAE,wCAAwC,CAAC,CAAC,CAAC,SAAS;IAC7E,CAAC;AACH,CAAC;AAED;;;;;GAKG;AACH,SAAS,qBAAqB,CAAC,eAAyB;IACtD,OAAO;;wBAEe,IAAI,CAAC,SAAS,CAAC,eAAe,CAAC;;;;OAIhD,CAAC;AACR,CAAC;AAED;;;;;GAKG;AACH,KAAK,UAAU,UAAU,CAAC,MAAW;IACnC,IAAI,CAAC;QACH,MAAM,MAAM,CAAC,OAAO,CAAC,QAAQ,CAAC;YAC5B,UAAU,EAAE;;;;;;;;;;WAUP;YACL,aAAa,EAAE,IAAI;YACnB,YAAY,EAAE,IAAI;SACnB,CAAC,CAAC;IACL,CAAC;IAAC,MAAM,CAAC;QACP,wDAAwD;IAC1D,CAAC;AACH,CAAC;AAED,yEAAyE;AACzE,MAAM,UAAU,GAAG,CAAC,OAAe,EAAE,EAAE,CAAC,eAAM,CAAC,KAAK,CAAC,uBAAuB,OAAO,EAAE,CAAC,CAAC;AAEvF;;;;GAIG;AACH,KAAK,UAAU,iBAAiB,CAAC,MAAW;IAC1C,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,OAAO,CAAC,QAAQ,CAAC;YAC3C,UAAU,EAAE,uCAAsB;YAClC,YAAY,EAAE,IAAI;YAClB,aAAa,EAAE,IAAI;SACpB,CAAC,CAAC;QACH,OAAO,MAAM,EAAE,MAAM,EAAE,KAAK,KAAK,IAAI,CAAC;IACxC,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,KAAK,CAAC;IACf,CAAC;AACH,CAAC;AAED;;;;GAIG;AACH,SAAS,WAAW,CAAC,MAAW;IAC9B,OAAO,IAAA,iCAAgB,EAAC,GAAG,EAAE,CAAC,iBAAiB,CAAC,MAAM,CAAC,EAAE,UAAU,CAAC,CAAC;AACvE,CAAC;AAED,KAAK,UAAU,UAAU,CAAC,MAAW,EAAE,KAAa,EAAE,MAAc;IAClE,MAAM,IAAI,GAAG,MAAM,MAAM,CAAC,IAAI,CAAC,iBAAiB,CAAC;QAC/C,MAAM,EAAE,KAAK;QACb,qBAAqB,EAAE,IAAI;QAC3B,IAAI,EAAE,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC,EAAE;KAC9C,CAAC,CAAC;IACH,OAAO,IAAI,CAAC,IAAI,CAAC;AACnB,CAAC;AAED,2HAA2H;AACpH,KAAK,UAAU,eAAe,CAAC,MAAW;IAC/C,MAAM,WAAW,CAAC,MAAM,CAAC,CAAC;IAE1B,wEAAwE;IACxE,uDAAuD;IACvD,IAAI,KAAK,GAAG,CAAC,CAAC;IACd,IAAI,MAAM,GAAG,CAAC,CAAC;IACf,IAAI,MAAM,GAAG,KAAK,CAAC;IACnB,MAAM,QAAQ,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC;IACnC,SAAS,CAAC;QACR,MAAM,OAAO,GAAG,MAAM,MAAM,CAAC,IAAI,CAAC,gBAAgB,EAAE,CAAC;QACrD,KAAK,GAAG,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,cAAc,EAAE,KAAK,IAAI,OAAO,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC;QAC9E,MAAM,GAAG,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,cAAc,EAAE,MAAM,IAAI,OAAO,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC;QACjF,IAAI,CAAC,KAAK,GAAG,CAAC,IAAI,MAAM,GAAG,CAAC,CAAC,IAAI,IAAI,CAAC,GAAG,EAAE,IAAI,QAAQ;YAAE,MAAM;QAC/D,MAAM,GAAG,IAAI,CAAC;QACd,MAAM,IAAI,OAAO,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,UAAU,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,CAAC;IAC/C,CAAC;IACD,IAAI,KAAK,IAAI,CAAC,IAAI,MAAM,IAAI,CAAC,EAAE,CAAC;QAC9B,MAAM,IAAI,KAAK,CAAC,uCAAuC,KAAK,IAAI,MAAM,EAAE,CAAC,CAAC;IAC5E,CAAC;IACD,yEAAyE;IACzE,mEAAmE;IACnE,IAAI,MAAM;QAAE,MAAM,WAAW,CAAC,MAAM,CAAC,CAAC;IAEtC,2EAA2E;IAC3E,oEAAoE;IACpE,2EAA2E;IAC3E,yEAAyE;IACzE,2EAA2E;IAC3E,MAAM,IAAI,GAAG,MAAM,IAAA,mCAAkB,EAAC;QACpC,OAAO,EAAE,GAAG,EAAE,CAAC,UAAU,CAAC,MAAM,EAAE,KAAK,EAAE,MAAM,CAAC;QAChD,MAAM,EAAE,GAAG,EAAE,CAAC,WAAW,CAAC,MAAM,CAAC;QACjC,GAAG,EAAE,UAAU;KAChB,CAAC,CAAC;IACH,OAAO,MAAM,CAAC,IAAI,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC;AACrC,CAAC;AAEM,KAAK,UAAU,oBAAoB,CACxC,QAAgB,EAChB,OAA0B;IAE1B,MAAM,WAAW,GAAG,OAAO,CAAC,GAAG,EAAE,CAAC;IAClC,MAAM,MAAM,GAAG,IAAA,8BAAe,EAAC,WAAW,CAAC,CAAC;IAC5C,MAAM,QAAQ,GAAG,OAAO,CAAC,QAAQ,IAAI,MAAM,CAAC,QAAQ,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,MAAM,EAAE,GAAG,EAAE,CAAC;IACrF,MAAM,QAAQ,GAAG,OAAO,CAAC,QAAQ,IAAI,MAAM,CAAC,QAAQ,IAAI,EAAE,CAAC;IAC3D,MAAM,aAAa,GAAG,OAAO,CAAC,KAAK,IAAI,MAAM,CAAC,KAAK,CAAC;IAEpD,yEAAyE;IACzE,IAAI,QAAQ,GAA0B,IAAI,CAAC;IAC3C,IAAI,IAAI,GAAG,OAAO,CAAC,IAAI,IAAI,CAAC,CAAC;IAC7B,IAAI,CAAC,IAAI,EAAE,CAAC;QACV,MAAM,UAAU,GAAG,IAAA,qBAAU,GAAE,CAAC;QAChC,IAAI,CAAC,UAAU,EAAE,CAAC;YAChB,MAAM,IAAI,KAAK,CACb,kGAAkG;gBAChG,4EAA4E,CAC/E,CAAC;QACJ,CAAC;QACD,IAAI,GAAG,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM,EAAE,GAAG,GAAG,CAAC,CAAC;QAC9C,QAAQ,GAAG,MAAM,IAAA,uBAAY,EAAC,UAAU,EAAE,IAAI,CAAC,CAAC;IAClD,CAAC;IAED,MAAM,KAAK,GAAG,IAAI,qBAAa,CAAC,WAAW,CAAC,CAAC;IAC7C,MAAM,QAAQ,GAAa,EAAE,CAAC;IAE9B,IAAI,CAAC;QACH,2BAA2B;QAC3B,IAAI,KAAe,CAAC;QACpB,IAAI,aAAa,IAAI,aAAa,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAC9C,KAAK,GAAG,IAAA,oBAAY,EAAC,QAAQ,EAAE,aAAa,CAAC,CAAC;QAChD,CAAC;aAAM,CAAC;YACN,MAAM,KAAK,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC;YAC7C,MAAM,KAAK,GACT,CAAC,MAAM,QAAQ,CACb,KAAK,CAAC,MAAM,EACZ,mEAAmE,CACpE,CAAC,IAAI,EAAE,CAAC;YACX,MAAM,SAAS,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;YAC7B,KAAK,GAAG,IAAA,0BAAkB,EAAC,QAAQ,EAAE,KAAK,EAAE,QAAQ,CAAC,CAAC;QACxD,CAAC;QAED,eAAM,CAAC,IAAI,CAAC,cAAc,KAAK,CAAC,MAAM,eAAe,QAAQ,CAAC,KAAK,IAAI,QAAQ,CAAC,MAAM,EAAE,CAAC,CAAC;QAE1F,wBAAwB;QACxB,KAAK,MAAM,GAAG,IAAI,KAAK,EAAE,CAAC;YACxB,MAAM,IAAI,GAAG,IAAA,uBAAe,EAAC,GAAG,CAAC,CAAC;YAClC,IAAI,IAA4B,CAAC;YACjC,IAAI,CAAC;gBACH,IAAI,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAE,GAAG,EAAE,QAAQ,CAAC,CAAC;gBAC3C,MAAM,QAAQ,CAAC,IAAI,CAAC,MAAM,EAAE,MAAM,CAAC,SAAS,EAAE,MAAM,CAAC,eAAe,IAAI,EAAE,CAAC,CAAC;gBAC5E,MAAM,UAAU,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;gBAE9B,MAAM,UAAU,GAAG,MAAM,eAAe,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;gBACtD,MAAM,GAAG,GAAG,MAAM,QAAQ,CAAS,IAAI,CAAC,MAAM,EAAE,qBAAqB,CAAC,MAAM,CAAC,eAAe,IAAI,EAAE,CAAC,CAAC,CAAC;gBACrG,KAAK,CAAC,SAAS,CAAC,IAAI,EAAE,UAAU,EAAE,OAAO,GAAG,KAAK,QAAQ,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC;gBAE7E,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;gBACpB,OAAO,CAAC,GAAG,CAAC,eAAK,CAAC,IAAI,CAAC,OAAO,IAAI,MAAM,GAAG,GAAG,CAAC,CAAC,CAAC;YACnD,CAAC;YAAC,OAAO,GAAG,EAAE,CAAC;gBACb,OAAO,CAAC,GAAG,CAAC,eAAK,CAAC,MAAM,CAAC,eAAe,IAAI,KAAM,GAAa,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC;YAC9E,CAAC;oBAAS,CAAC;gBACT,IAAI,IAAI;oBAAE,MAAM,SAAS,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;YACxC,CAAC;QACH,CAAC;IACH,CAAC;YAAS,CAAC;QACT,IAAI,QAAQ;YAAE,QAAQ,CAAC,IAAI,EAAE,CAAC;IAChC,CAAC;IAED,IAAI,QAAQ,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC1B,MAAM,IAAI,KAAK,CAAC,oDAAoD,CAAC,CAAC;IACxE,CAAC;IAED,+EAA+E;IAC/E,MAAM,MAAM,GAAG,IAAA,0BAAc,EAAC;QAC5B,WAAW;QACX,SAAS,EAAE,MAAM,CAAC,SAAS,IAAI,eAAe;QAC9C,SAAS,EAAE,MAAM,CAAC,SAAS;QAC3B,QAAQ,EAAE,MAAM,CAAC,QAAQ;QACzB,OAAO,EAAE,OAAO,CAAC,oBAAoB,CAAC,CAAC,OAAO;KAC/C,CAAC,CAAC;IAEH,MAAM,EAAE,OAAO,EAAE,GAAG,MAAM,CAAC;IAC3B,OAAO,CAAC,GAAG,EAAE,CAAC;IACd,OAAO,CAAC,GAAG,CAAC,eAAK,CAAC,IAAI,CAAC,IAAI,CAAC,kCAAkC,CAAC,CAAC,CAAC;IACjE,OAAO,CAAC,GAAG,CACT,YAAY,OAAO,CAAC,KAAK,gBAAgB,OAAO,CAAC,MAAM,iBAAiB,OAAO,CAAC,OAAO,aAAa,OAAO,CAAC,YAAY,EAAE,CAC3H,CAAC;IACF,IAAI,OAAO,CAAC,YAAY,GAAG,CAAC,EAAE,CAAC;QAC7B,OAAO,CAAC,GAAG,CAAC,eAAK,CAAC,IAAI,CAAC,kFAAkF,CAAC,CAAC,CAAC;IAC9G,CAAC;IACD,IAAI,OAAO,CAAC,OAAO,GAAG,CAAC,EAAE,CAAC;QACxB,OAAO,CAAC,GAAG,CAAC,eAAK,CAAC,IAAI,CAAC,aAAa,MAAM,CAAC,SAAS,IAAI,eAAe,yDAAyD,CAAC,CAAC,CAAC;IACrI,CAAC;IAED,IAAI,MAAM,CAAC,UAAU,IAAI,OAAO,CAAC,OAAO,GAAG,CAAC,EAAE,CAAC;QAC7C,OAAO,CAAC,QAAQ,GAAG,CAAC,CAAC;IACvB,CAAC;AACH,CAAC"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@testivai/witness",
|
|
3
|
-
"version": "2.
|
|
3
|
+
"version": "2.4.0",
|
|
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",
|