@juxtapose/core 0.4.0 → 0.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/agent/handoff.d.ts +8 -1
- package/dist/agent/handoff.js +75 -7
- package/dist/agent/handoff.js.map +1 -1
- package/dist/analysis/affected.d.ts +37 -0
- package/dist/analysis/affected.js +97 -22
- package/dist/analysis/affected.js.map +1 -1
- package/dist/analysis/cause.d.ts +32 -0
- package/dist/analysis/cause.js +187 -0
- package/dist/analysis/cause.js.map +1 -0
- package/dist/baseline/approve.d.ts +24 -0
- package/dist/baseline/approve.js +54 -0
- package/dist/baseline/approve.js.map +1 -0
- package/dist/baseline/git-store.d.ts +4 -0
- package/dist/baseline/git-store.js +22 -0
- package/dist/baseline/git-store.js.map +1 -1
- package/dist/browser/acquire.d.ts +11 -0
- package/dist/browser/acquire.js +15 -0
- package/dist/browser/acquire.js.map +1 -0
- package/dist/browser/browser.d.ts +53 -0
- package/dist/browser/browser.js +122 -0
- package/dist/browser/browser.js.map +1 -0
- package/dist/browser/cdp.d.ts +81 -0
- package/dist/browser/cdp.js +230 -0
- package/dist/browser/cdp.js.map +1 -0
- package/dist/browser/index.d.ts +9 -0
- package/dist/browser/index.js +10 -0
- package/dist/browser/index.js.map +1 -0
- package/dist/browser/install.d.ts +33 -0
- package/dist/browser/install.js +167 -0
- package/dist/browser/install.js.map +1 -0
- package/dist/browser/launch.d.ts +37 -0
- package/dist/browser/launch.js +265 -0
- package/dist/browser/launch.js.map +1 -0
- package/dist/browser/page.d.ts +125 -0
- package/dist/browser/page.js +564 -0
- package/dist/browser/page.js.map +1 -0
- package/dist/browser/pins.d.ts +12 -0
- package/dist/browser/pins.js +57 -0
- package/dist/browser/pins.js.map +1 -0
- package/dist/browser/resolve.d.ts +25 -0
- package/dist/browser/resolve.js +115 -0
- package/dist/browser/resolve.js.map +1 -0
- package/dist/browser/selectors.d.ts +10 -0
- package/dist/browser/selectors.js +60 -0
- package/dist/browser/selectors.js.map +1 -0
- package/dist/browser/transport.d.ts +39 -0
- package/dist/browser/transport.js +99 -0
- package/dist/browser/transport.js.map +1 -0
- package/dist/browser/zip.d.ts +27 -0
- package/dist/browser/zip.js +241 -0
- package/dist/browser/zip.js.map +1 -0
- package/dist/capture/capture.d.ts +7 -1
- package/dist/capture/capture.js +25 -8
- package/dist/capture/capture.js.map +1 -1
- package/dist/capture/env.d.ts +1 -1
- package/dist/capture/launch.d.ts +19 -1
- package/dist/capture/launch.js +91 -1
- package/dist/capture/launch.js.map +1 -1
- package/dist/capture/pool.d.ts +1 -1
- package/dist/capture/pool.js +41 -8
- package/dist/capture/pool.js.map +1 -1
- package/dist/capture/settle.d.ts +1 -1
- package/dist/capture/settle.js +2 -0
- package/dist/capture/settle.js.map +1 -1
- package/dist/capture/snap.d.ts +43 -0
- package/dist/capture/snap.js +103 -0
- package/dist/capture/snap.js.map +1 -0
- package/dist/capture/structure.d.ts +77 -0
- package/dist/capture/structure.js +498 -0
- package/dist/capture/structure.js.map +1 -0
- package/dist/diff/compare.d.ts +19 -0
- package/dist/diff/compare.js +19 -0
- package/dist/diff/compare.js.map +1 -0
- package/dist/diff/crops.d.ts +26 -0
- package/dist/diff/crops.js +92 -0
- package/dist/diff/crops.js.map +1 -0
- package/dist/diff/structural/classify.d.ts +29 -0
- package/dist/diff/structural/classify.js +113 -0
- package/dist/diff/structural/classify.js.map +1 -0
- package/dist/diff/structural/coverage.d.ts +11 -0
- package/dist/diff/structural/coverage.js +37 -0
- package/dist/diff/structural/coverage.js.map +1 -0
- package/dist/diff/structural/deltas.d.ts +29 -0
- package/dist/diff/structural/deltas.js +218 -0
- package/dist/diff/structural/deltas.js.map +1 -0
- package/dist/diff/structural/disambiguate.d.ts +3 -0
- package/dist/diff/structural/disambiguate.js +89 -0
- package/dist/diff/structural/disambiguate.js.map +1 -0
- package/dist/diff/structural/label.d.ts +15 -0
- package/dist/diff/structural/label.js +64 -0
- package/dist/diff/structural/label.js.map +1 -0
- package/dist/diff/structural/match.d.ts +13 -0
- package/dist/diff/structural/match.js +135 -0
- package/dist/diff/structural/match.js.map +1 -0
- package/dist/diff/structural/shift.d.ts +2 -0
- package/dist/diff/structural/shift.js +144 -0
- package/dist/diff/structural/shift.js.map +1 -0
- package/dist/diff/structural/summary.d.ts +31 -0
- package/dist/diff/structural/summary.js +420 -0
- package/dist/diff/structural/summary.js.map +1 -0
- package/dist/diff/structural.d.ts +40 -0
- package/dist/diff/structural.js +219 -0
- package/dist/diff/structural.js.map +1 -0
- package/dist/index.d.ts +25 -3
- package/dist/index.js +29 -2
- package/dist/index.js.map +1 -1
- package/dist/platform.d.ts +1 -1
- package/dist/platforms/urls.d.ts +3 -0
- package/dist/platforms/urls.js +89 -0
- package/dist/platforms/urls.js.map +1 -0
- package/dist/report/comment.js +9 -3
- package/dist/report/comment.js.map +1 -1
- package/dist/report/format.d.ts +18 -0
- package/dist/report/format.js +20 -0
- package/dist/report/format.js.map +1 -1
- package/dist/report/html.js +2 -2
- package/dist/report/html.js.map +1 -1
- package/dist/run/groups.d.ts +2 -0
- package/dist/run/groups.js +45 -0
- package/dist/run/groups.js.map +1 -0
- package/dist/run/run.d.ts +6 -2
- package/dist/run/run.js +74 -6
- package/dist/run/run.js.map +1 -1
- package/dist/shell-quote.d.ts +2 -0
- package/dist/shell-quote.js +10 -0
- package/dist/shell-quote.js.map +1 -0
- package/dist/types.d.ts +199 -1
- package/dist/url-platform.d.ts +2 -2
- package/dist/url-platform.js +2 -2
- package/dist/url-platform.js.map +1 -1
- package/package.json +5 -10
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"zip.js","sourceRoot":"","sources":["../../src/browser/zip.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import type { Page } from '
|
|
1
|
+
import type { Page } from '../browser/page.js';
|
|
2
2
|
import type { Platform } from '../platform.js';
|
|
3
3
|
import type { Snapshot, StoryManifest, Viewport } from '../types.js';
|
|
4
4
|
export interface CaptureDeps {
|
|
@@ -28,5 +28,11 @@ export interface CaptureDeps {
|
|
|
28
28
|
* visual test that cries wolf is worse than a slow one.
|
|
29
29
|
*/
|
|
30
30
|
warmSwitch?: boolean;
|
|
31
|
+
/**
|
|
32
|
+
* Capture the structure snapshot beside the pixels. Default true. It costs
|
|
33
|
+
* one CDP call per story (budget: < 30 ms) and explains failures; it never
|
|
34
|
+
* decides one. `JUXTAPOSE_NO_STRUCTURE=1` turns it off for A/B timing.
|
|
35
|
+
*/
|
|
36
|
+
structure?: boolean;
|
|
31
37
|
}
|
|
32
38
|
export declare function captureStory(page: Page, story: StoryManifest, deps: CaptureDeps, viewport: Viewport): Promise<Snapshot | null>;
|
package/dist/capture/capture.js
CHANGED
|
@@ -2,7 +2,9 @@
|
|
|
2
2
|
// each step exists. Because pass/fail is a byte-exact hash, every source of
|
|
3
3
|
// nondeterminism left in this path becomes a false failure somewhere.
|
|
4
4
|
import sharp from 'sharp';
|
|
5
|
+
import { assertCssSelector } from '../browser/selectors.js';
|
|
5
6
|
import { armSettle, drain, FREEZE_ANIMATIONS_CSS, waitForPaint, waitForSelector, } from './settle.js';
|
|
7
|
+
import { captureStructure } from './structure.js';
|
|
6
8
|
const DEFAULT_CAPTURE_TIMEOUT_MS = 2000;
|
|
7
9
|
/** Per-page memo: skip work that only needs doing once per page. */
|
|
8
10
|
const styleInjected = new WeakSet();
|
|
@@ -16,6 +18,11 @@ export async function captureStory(page, story, deps, viewport) {
|
|
|
16
18
|
const effectiveViewport = params.viewport ?? viewport;
|
|
17
19
|
const timeoutMs = params.captureTimeout ?? DEFAULT_CAPTURE_TIMEOUT_MS;
|
|
18
20
|
const ctx = { story, params, timeoutMs };
|
|
21
|
+
// Selector syntax is validated before the page is touched: a Playwright-only
|
|
22
|
+
// selector (`text=`, `>>`) would otherwise match nothing and the story would
|
|
23
|
+
// be captured unmasked, or wait its whole timeout, and the baseline would
|
|
24
|
+
// record the wrong thing. Live params are re-checked below.
|
|
25
|
+
assertSelectors(params);
|
|
19
26
|
await ensureViewport(page, effectiveViewport);
|
|
20
27
|
// Arm before triggering the render, or the observer misses the mutations it
|
|
21
28
|
// exists to watch.
|
|
@@ -67,6 +74,7 @@ export async function captureStory(page, story, deps, viewport) {
|
|
|
67
74
|
const live = await deps.platform.readLiveParams?.(page, story.storyId);
|
|
68
75
|
if (live) {
|
|
69
76
|
Object.assign(params, live);
|
|
77
|
+
assertSelectors(params);
|
|
70
78
|
// Viewport is the one param that cannot be applied retroactively — the
|
|
71
79
|
// story has already laid out. Re-set it and let the platform settle
|
|
72
80
|
// again, so a story declaring its own viewport is captured at that size
|
|
@@ -90,21 +98,23 @@ export async function captureStory(page, story, deps, viewport) {
|
|
|
90
98
|
// Fixed delay is the escape hatch of last resort — it costs the same on
|
|
91
99
|
// every run whether or not it was needed. Prefer waitForSelector.
|
|
92
100
|
if (params.delay && params.delay > 0) {
|
|
93
|
-
await
|
|
101
|
+
await new Promise((r) => setTimeout(r, params.delay));
|
|
94
102
|
}
|
|
95
103
|
// Last barrier before the shutter: the DOM being quiet does not mean the
|
|
96
104
|
// pixels are final. Style, layout and paint still have to land, and without
|
|
97
105
|
// this the capture intermittently catches an intermediate frame — which a
|
|
98
106
|
// byte-exact hash reports as a failure.
|
|
99
107
|
await waitForPaint(page);
|
|
108
|
+
// Structure from the same frame the screenshot is about to take: after the
|
|
109
|
+
// paint barrier, before the shutter, with nothing in between that could
|
|
110
|
+
// mutate the page.
|
|
111
|
+
const effective = params.viewport ?? effectiveViewport;
|
|
112
|
+
const structure = deps.structure !== false && process.env.JUXTAPOSE_NO_STRUCTURE !== '1'
|
|
113
|
+
? await captureStructure(page, effective, params.mask ?? [])
|
|
114
|
+
: undefined;
|
|
100
115
|
// A selector matching nothing is not an error — a story that conditionally
|
|
101
116
|
// renders the element shouldn't fail on the branch where it's absent.
|
|
102
|
-
const png = await page.screenshot({
|
|
103
|
-
type: 'png',
|
|
104
|
-
...(params.mask?.length
|
|
105
|
-
? { mask: params.mask.map((selector) => page.locator(selector)) }
|
|
106
|
-
: {}),
|
|
107
|
-
});
|
|
117
|
+
const png = await page.screenshot(params.mask?.length ? { mask: params.mask } : {});
|
|
108
118
|
// LOSSLESS, deliberately, and it is not a size-vs-quality preference.
|
|
109
119
|
//
|
|
110
120
|
// Lossy WebP at q90 perturbs ~7.7% of pixels frame-wide. The hash comparison
|
|
@@ -126,9 +136,10 @@ export async function captureStory(page, story, deps, viewport) {
|
|
|
126
136
|
// The live params may have widened or narrowed this after first render,
|
|
127
137
|
// so report what we actually captured at — the agent handoff computes
|
|
128
138
|
// region area as a fraction of it.
|
|
129
|
-
viewport:
|
|
139
|
+
viewport: effective,
|
|
130
140
|
capturedAt: new Date().toISOString(),
|
|
131
141
|
durationMs: Date.now() - started,
|
|
142
|
+
...(structure ? { structure } : {}),
|
|
132
143
|
};
|
|
133
144
|
}
|
|
134
145
|
const sameViewport = (a, b) => a.width === b.width && a.height === b.height;
|
|
@@ -157,4 +168,10 @@ async function freezeAnimations(page, params) {
|
|
|
157
168
|
await page.addStyleTag({ content: FREEZE_ANIMATIONS_CSS }).catch(() => { });
|
|
158
169
|
styleInjected.add(page);
|
|
159
170
|
}
|
|
171
|
+
function assertSelectors(params) {
|
|
172
|
+
for (const sel of params.mask ?? [])
|
|
173
|
+
assertCssSelector(sel);
|
|
174
|
+
if (params.waitForSelector)
|
|
175
|
+
assertCssSelector(params.waitForSelector);
|
|
176
|
+
}
|
|
160
177
|
//# sourceMappingURL=capture.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"capture.js","sourceRoot":"","sources":["../../src/capture/capture.ts"],"names":[],"mappings":"AAAA,+EAA+E;AAC/E,4EAA4E;AAC5E,sEAAsE;AAEtE,OAAO,KAAK,MAAM,OAAO,CAAC;
|
|
1
|
+
{"version":3,"file":"capture.js","sourceRoot":"","sources":["../../src/capture/capture.ts"],"names":[],"mappings":"AAAA,+EAA+E;AAC/E,4EAA4E;AAC5E,sEAAsE;AAEtE,OAAO,KAAK,MAAM,OAAO,CAAC;AAE1B,OAAO,EAAE,iBAAiB,EAAE,MAAM,yBAAyB,CAAC;AAG5D,OAAO,EACL,SAAS,EACT,KAAK,EACL,qBAAqB,EACrB,YAAY,EACZ,eAAe,GAChB,MAAM,aAAa,CAAC;AACrB,OAAO,EAAE,gBAAgB,EAAE,MAAM,gBAAgB,CAAC;AAElD,MAAM,0BAA0B,GAAG,IAAI,CAAC;AAqCxC,oEAAoE;AACpE,MAAM,aAAa,GAAG,IAAI,OAAO,EAAQ,CAAC;AAC1C,MAAM,YAAY,GAAG,IAAI,OAAO,EAAgB,CAAC;AACjD,MAAM,SAAS,GAAG,IAAI,OAAO,EAAgB,CAAC;AAE9C,MAAM,CAAC,KAAK,UAAU,YAAY,CAChC,IAAU,EACV,KAAoB,EACpB,IAAiB,EACjB,QAAkB;IAGlB,MAAM,OAAO,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;IAC3B,yEAAyE;IACzE,kEAAkE;IAClE,MAAM,MAAM,GAAgB,EAAE,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC;IAChD,MAAM,iBAAiB,GAAG,MAAM,CAAC,QAAQ,IAAI,QAAQ,CAAC;IACtD,MAAM,SAAS,GAAG,MAAM,CAAC,cAAc,IAAI,0BAA0B,CAAC;IACtE,MAAM,GAAG,GAAG,EAAE,KAAK,EAAE,MAAM,EAAE,SAAS,EAAE,CAAC;IAEzC,6EAA6E;IAC7E,6EAA6E;IAC7E,0EAA0E;IAC1E,4DAA4D;IAC5D,eAAe,CAAC,MAAM,CAAC,CAAC;IAExB,MAAM,cAAc,CAAC,IAAI,EAAE,iBAAiB,CAAC,CAAC;IAE9C,4EAA4E;IAC5E,mBAAmB;IACnB,EAAE;IACF,4EAA4E;IAC5E,wDAAwD;IACxD,MAAM,IAAI,GACR,IAAI,CAAC,UAAU,KAAK,IAAI;QACxB,SAAS,CAAC,GAAG,CAAC,IAAI,CAAC,KAAK,IAAI,CAAC,OAAO;QACpC,CAAC,CAAC,MAAM,CAAC,UAAU,KAAK,MAAM,IAAI,aAAa,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC;IAC7D,IAAI,IAAI;QAAE,MAAM,SAAS,CAAC,IAAI,CAAC,CAAC;IAEhC,MAAM,QAAQ,GACZ,IAAI,IAAI,IAAI,CAAC,QAAQ,CAAC,WAAW;QAC/B,CAAC,CAAC,MAAM,IAAI,CAAC,QAAQ,CAAC,WAAW,CAAC,IAAI,EAAE,KAAK,CAAC,OAAO,EAAE,GAAG,CAAC;QAC3D,CAAC,CAAC,KAAK,CAAC;IAEZ,IAAI,CAAC,QAAQ,EAAE,CAAC;QACd,yEAAyE;QACzE,0EAA0E;QAC1E,MAAM,IAAI,CAAC,QAAQ,CAAC,SAAS,CAAC,IAAI,EAAE,KAAK,CAAC,OAAO,EAAE,IAAI,CAAC,OAAO,CAAC,CAAC;QACjE,mEAAmE;QACnE,+CAA+C;QAC/C,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;QAC3B,SAAS,CAAC,GAAG,CAAC,IAAI,EAAE,IAAI,CAAC,OAAO,CAAC,CAAC;QAClC,MAAM,SAAS,CAAC,IAAI,CAAC,CAAC;IACxB,CAAC;IAED,8CAA8C;IAC9C,EAAE;IACF,2EAA2E;IAC3E,wEAAwE;IACxE,sEAAsE;IACtE,yEAAyE;IACzE,4EAA4E;IAC5E,2EAA2E;IAC3E,kBAAkB;IAClB,EAAE;IACF,0EAA0E;IAC1E,0EAA0E;IAC1E,MAAM,gBAAgB,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;IAErC,MAAM,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC;IAEtC,wEAAwE;IACxE,wCAAwC;IACxC,EAAE;IACF,6EAA6E;IAC7E,yEAAyE;IACzE,sEAAsE;IACtE,6CAA6C;IAC7C,EAAE;IACF,6EAA6E;IAC7E,0DAA0D;IAC1D,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,QAAQ,CAAC,cAAc,EAAE,CAAC,IAAI,EAAE,KAAK,CAAC,OAAO,CAAC,CAAC;IACvE,IAAI,IAAI,EAAE,CAAC;QACT,MAAM,CAAC,MAAM,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC;QAC5B,eAAe,CAAC,MAAM,CAAC,CAAC;QAExB,uEAAuE;QACvE,oEAAoE;QACpE,wEAAwE;QACxE,mCAAmC;QACnC,MAAM,YAAY,GAAG,IAAI,CAAC,QAAQ,CAAC;QACnC,IAAI,YAAY,IAAI,CAAC,YAAY,CAAC,YAAY,EAAE,iBAAiB,CAAC,EAAE,CAAC;YACnE,MAAM,cAAc,CAAC,IAAI,EAAE,YAAY,CAAC,CAAC;YACzC,MAAM,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,IAAI,EAAE,EAAE,GAAG,GAAG,EAAE,MAAM,EAAE,CAAC,CAAC;QACvD,CAAC;IACH,CAAC;IAED,0EAA0E;IAC1E,4EAA4E;IAC5E,yEAAyE;IACzE,kDAAkD;IAClD,IAAI,MAAM,CAAC,IAAI,KAAK,IAAI;QAAE,OAAO,IAAI,CAAC;IAEtC,IAAI,MAAM,CAAC,eAAe,EAAE,CAAC;QAC3B,MAAM,eAAe,CAAC,IAAI,EAAE,MAAM,CAAC,eAAe,EAAE,SAAS,CAAC,CAAC;IACjE,CAAC;IAED,MAAM,KAAK,CAAC,IAAI,CAAC,CAAC;IAElB,wEAAwE;IACxE,kEAAkE;IAClE,IAAI,MAAM,CAAC,KAAK,IAAI,MAAM,CAAC,KAAK,GAAG,CAAC,EAAE,CAAC;QACrC,MAAM,IAAI,OAAO,CAAO,CAAC,CAAC,EAAE,EAAE,CAAC,UAAU,CAAC,CAAC,EAAE,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC;IAC9D,CAAC;IAED,yEAAyE;IACzE,4EAA4E;IAC5E,0EAA0E;IAC1E,wCAAwC;IACxC,MAAM,YAAY,CAAC,IAAI,CAAC,CAAC;IAEzB,2EAA2E;IAC3E,wEAAwE;IACxE,mBAAmB;IACnB,MAAM,SAAS,GAAG,MAAM,CAAC,QAAQ,IAAI,iBAAiB,CAAC;IACvD,MAAM,SAAS,GACb,IAAI,CAAC,SAAS,KAAK,KAAK,IAAI,OAAO,CAAC,GAAG,CAAC,sBAAsB,KAAK,GAAG;QACpE,CAAC,CAAC,MAAM,gBAAgB,CAAC,IAAI,EAAE,SAAS,EAAE,MAAM,CAAC,IAAI,IAAI,EAAE,CAAC;QAC5D,CAAC,CAAC,SAAS,CAAC;IAEhB,2EAA2E;IAC3E,sEAAsE;IACtE,MAAM,GAAG,GAAG,MAAM,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,MAAM,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;IAEpF,sEAAsE;IACtE,EAAE;IACF,6EAA6E;IAC7E,4EAA4E;IAC5E,6EAA6E;IAC7E,6EAA6E;IAC7E,yEAAyE;IACzE,2CAA2C;IAC3C,EAAE;IACF,4EAA4E;IAC5E,4EAA4E;IAC5E,qEAAqE;IACrE,MAAM,KAAK,GAAG,MAAM,KAAK,CAAC,GAAG,CAAC;SAC3B,IAAI,CAAC,EAAE,QAAQ,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,CAAC,UAAU,IAAI,CAAC,EAAE,CAAC;SACtD,QAAQ,EAAE,CAAC;IAEd,OAAO;QACL,OAAO,EAAE,KAAK,CAAC,OAAO;QACtB,KAAK;QACL,wEAAwE;QACxE,sEAAsE;QACtE,mCAAmC;QACnC,QAAQ,EAAE,SAAS;QACnB,UAAU,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;QACpC,UAAU,EAAE,IAAI,CAAC,GAAG,EAAE,GAAG,OAAO;QAChC,GAAG,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,SAAS,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;KACpC,CAAC;AACJ,CAAC;AAED,MAAM,YAAY,GAAG,CAAC,CAAW,EAAE,CAAW,EAAE,EAAE,CAChD,CAAC,CAAC,KAAK,KAAK,CAAC,CAAC,KAAK,IAAI,CAAC,CAAC,MAAM,KAAK,CAAC,CAAC,MAAM,CAAC;AAE/C,8EAA8E;AAC9E,KAAK,UAAU,cAAc,CAAC,IAAU,EAAE,QAAkB;IAC1D,MAAM,GAAG,GAAG,GAAG,QAAQ,CAAC,KAAK,IAAI,QAAQ,CAAC,MAAM,EAAE,CAAC;IACnD,IAAI,YAAY,CAAC,GAAG,CAAC,IAAI,CAAC,KAAK,GAAG;QAAE,OAAO;IAC3C,MAAM,IAAI,CAAC,eAAe,CAAC,QAAQ,CAAC,CAAC;IACrC,YAAY,CAAC,GAAG,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC;AAC9B,CAAC;AAED;;;;;;;;GAQG;AACH,KAAK,UAAU,gBAAgB,CAAC,IAAU,EAAE,MAAmB;IAC7D,IAAI,MAAM,CAAC,UAAU,KAAK,MAAM;QAAE,OAAO;IACzC,IAAI,aAAa,CAAC,GAAG,CAAC,IAAI,CAAC;QAAE,OAAO;IACpC,MAAM,IAAI,CAAC,WAAW,CAAC,EAAE,OAAO,EAAE,qBAAqB,EAAE,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC,CAAC;IAC3E,aAAa,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;AAC1B,CAAC;AAED,SAAS,eAAe,CAAC,MAAmB;IAC1C,KAAK,MAAM,GAAG,IAAI,MAAM,CAAC,IAAI,IAAI,EAAE;QAAE,iBAAiB,CAAC,GAAG,CAAC,CAAC;IAC5D,IAAI,MAAM,CAAC,eAAe;QAAE,iBAAiB,CAAC,MAAM,CAAC,eAAe,CAAC,CAAC;AACxE,CAAC"}
|
package/dist/capture/env.d.ts
CHANGED
package/dist/capture/launch.d.ts
CHANGED
|
@@ -28,8 +28,26 @@ export interface LaunchOptions {
|
|
|
28
28
|
args?: string[];
|
|
29
29
|
headless?: boolean;
|
|
30
30
|
}
|
|
31
|
-
/**
|
|
31
|
+
/** Our own flags; `chromeArgs` wraps them with the parity set. */
|
|
32
32
|
export declare function deterministicLaunchOptions(opts?: LaunchOptions): {
|
|
33
33
|
headless: boolean;
|
|
34
34
|
args: string[];
|
|
35
35
|
};
|
|
36
|
+
/**
|
|
37
|
+
* playwright-core 1.62.0's `chromiumSwitches()` plus its headless additions
|
|
38
|
+
* (`lib/coreBundle.js` L34630–34690, L43067–43097), copied verbatim.
|
|
39
|
+
*
|
|
40
|
+
* The byte-identity spike (spec, 2026-10-13) matched 29/29 example stories
|
|
41
|
+
* against the Playwright pipeline with exactly this list. It was not pruned:
|
|
42
|
+
* a Blink feature flag that changes rasterization — PaintHolding,
|
|
43
|
+
* CDPScreenshotNewSurface — would turn every baseline red, and the gain from
|
|
44
|
+
* dropping any of these is unmeasurable. Change only with a determinism run
|
|
45
|
+
* per removed flag.
|
|
46
|
+
*/
|
|
47
|
+
export declare const PARITY_CHROMIUM_ARGS: readonly string[];
|
|
48
|
+
/** The full command line, in Playwright's order so the spike's evidence transfers. */
|
|
49
|
+
export declare function chromeArgs(opts: {
|
|
50
|
+
userDataDir: string;
|
|
51
|
+
args?: string[];
|
|
52
|
+
headless?: boolean;
|
|
53
|
+
}): string[];
|
package/dist/capture/launch.js
CHANGED
|
@@ -46,11 +46,101 @@ export const DETERMINISTIC_CHROMIUM_ARGS = [
|
|
|
46
46
|
'--disable-renderer-backgrounding',
|
|
47
47
|
'--force-device-scale-factor=1',
|
|
48
48
|
];
|
|
49
|
-
/**
|
|
49
|
+
/** Our own flags; `chromeArgs` wraps them with the parity set. */
|
|
50
50
|
export function deterministicLaunchOptions(opts = {}) {
|
|
51
51
|
return {
|
|
52
52
|
headless: opts.headless ?? true,
|
|
53
53
|
args: [...DETERMINISTIC_CHROMIUM_ARGS, ...(opts.args ?? [])],
|
|
54
54
|
};
|
|
55
55
|
}
|
|
56
|
+
/**
|
|
57
|
+
* playwright-core 1.62.0's `chromiumSwitches()` plus its headless additions
|
|
58
|
+
* (`lib/coreBundle.js` L34630–34690, L43067–43097), copied verbatim.
|
|
59
|
+
*
|
|
60
|
+
* The byte-identity spike (spec, 2026-10-13) matched 29/29 example stories
|
|
61
|
+
* against the Playwright pipeline with exactly this list. It was not pruned:
|
|
62
|
+
* a Blink feature flag that changes rasterization — PaintHolding,
|
|
63
|
+
* CDPScreenshotNewSurface — would turn every baseline red, and the gain from
|
|
64
|
+
* dropping any of these is unmeasurable. Change only with a determinism run
|
|
65
|
+
* per removed flag.
|
|
66
|
+
*/
|
|
67
|
+
export const PARITY_CHROMIUM_ARGS = [
|
|
68
|
+
'--disable-field-trial-config',
|
|
69
|
+
'--disable-background-networking',
|
|
70
|
+
'--disable-background-timer-throttling',
|
|
71
|
+
'--disable-backgrounding-occluded-windows',
|
|
72
|
+
'--disable-back-forward-cache',
|
|
73
|
+
'--disable-breakpad',
|
|
74
|
+
'--disable-client-side-phishing-detection',
|
|
75
|
+
'--disable-component-extensions-with-background-pages',
|
|
76
|
+
'--disable-component-update',
|
|
77
|
+
'--no-default-browser-check',
|
|
78
|
+
'--disable-default-apps',
|
|
79
|
+
'--disable-dev-shm-usage',
|
|
80
|
+
'--disable-edgeupdater',
|
|
81
|
+
'--disable-extensions',
|
|
82
|
+
'--disable-features=' +
|
|
83
|
+
[
|
|
84
|
+
'AvoidUnnecessaryBeforeUnloadCheckSync',
|
|
85
|
+
'BoundaryEventDispatchTracksNodeRemoval',
|
|
86
|
+
'DestroyProfileOnBrowserClose',
|
|
87
|
+
'DialMediaRouteProvider',
|
|
88
|
+
'GlobalMediaControls',
|
|
89
|
+
'HttpsUpgrades',
|
|
90
|
+
'LensOverlay',
|
|
91
|
+
'MediaRouter',
|
|
92
|
+
'PaintHolding',
|
|
93
|
+
'ThirdPartyStoragePartitioning',
|
|
94
|
+
'BlockOriginHeaderModificationOnRedirect',
|
|
95
|
+
'Translate',
|
|
96
|
+
'AutoDeElevate',
|
|
97
|
+
'OptimizationHints',
|
|
98
|
+
'msForceBrowserSignIn',
|
|
99
|
+
'msEdgeUpdateLaunchServicesPreferredVersion',
|
|
100
|
+
].join(','),
|
|
101
|
+
'--enable-features=CDPScreenshotNewSurface',
|
|
102
|
+
'--allow-pre-commit-input',
|
|
103
|
+
'--disable-hang-monitor',
|
|
104
|
+
'--disable-ipc-flooding-protection',
|
|
105
|
+
'--disable-popup-blocking',
|
|
106
|
+
'--disable-prompt-on-repost',
|
|
107
|
+
'--disable-renderer-backgrounding',
|
|
108
|
+
'--disable-updater-scheduler',
|
|
109
|
+
'--force-color-profile=srgb',
|
|
110
|
+
'--metrics-recording-only',
|
|
111
|
+
'--no-first-run',
|
|
112
|
+
'--password-store=basic',
|
|
113
|
+
'--use-mock-keychain',
|
|
114
|
+
'--no-service-autorun',
|
|
115
|
+
'--export-tagged-pdf',
|
|
116
|
+
'--disable-search-engine-choice-screen',
|
|
117
|
+
'--unsafely-disable-devtools-self-xss-warnings',
|
|
118
|
+
'--edge-skip-compat-layer-relaunch',
|
|
119
|
+
'--disable-infobars',
|
|
120
|
+
'--disable-search-engine-choice-screen',
|
|
121
|
+
'--disable-sync',
|
|
122
|
+
];
|
|
123
|
+
const HEADLESS_ARGS = [
|
|
124
|
+
'--headless',
|
|
125
|
+
'--hide-scrollbars',
|
|
126
|
+
'--mute-audio',
|
|
127
|
+
'--blink-settings=primaryHoverType=2,availableHoverTypes=2,primaryPointerType=4,availablePointerTypes=4',
|
|
128
|
+
];
|
|
129
|
+
/** The full command line, in Playwright's order so the spike's evidence transfers. */
|
|
130
|
+
export function chromeArgs(opts) {
|
|
131
|
+
const { headless, args } = deterministicLaunchOptions({
|
|
132
|
+
headless: opts.headless,
|
|
133
|
+
args: opts.args,
|
|
134
|
+
});
|
|
135
|
+
return [
|
|
136
|
+
...PARITY_CHROMIUM_ARGS,
|
|
137
|
+
'--enable-unsafe-swiftshader',
|
|
138
|
+
...(headless ? HEADLESS_ARGS : []),
|
|
139
|
+
'--no-sandbox',
|
|
140
|
+
...args,
|
|
141
|
+
`--user-data-dir=${opts.userDataDir}`,
|
|
142
|
+
'--remote-debugging-pipe',
|
|
143
|
+
'--no-startup-window',
|
|
144
|
+
];
|
|
145
|
+
}
|
|
56
146
|
//# sourceMappingURL=launch.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"launch.js","sourceRoot":"","sources":["../../src/capture/launch.ts"],"names":[],"mappings":"AAAA,uDAAuD;AACvD,EAAE;AACF,wEAAwE;AACxE,wEAAwE;AACxE,2EAA2E;AAC3E,gBAAgB;AAChB,EAAE;AACF,0EAA0E;AAC1E,wEAAwE;AACxE,6EAA6E;AAC7E,aAAa;AAEb;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AACH,MAAM,CAAC,MAAM,2BAA2B,GAAsB;IAC5D,eAAe;IACf,6BAA6B;IAC7B,6BAA6B;IAC7B,oBAAoB;IACpB,qCAAqC;IACrC,4BAA4B;IAC5B,mBAAmB;IACnB,uCAAuC;IACvC,0CAA0C;IAC1C,kCAAkC;IAClC,+BAA+B;CAChC,CAAC;AAQF,
|
|
1
|
+
{"version":3,"file":"launch.js","sourceRoot":"","sources":["../../src/capture/launch.ts"],"names":[],"mappings":"AAAA,uDAAuD;AACvD,EAAE;AACF,wEAAwE;AACxE,wEAAwE;AACxE,2EAA2E;AAC3E,gBAAgB;AAChB,EAAE;AACF,0EAA0E;AAC1E,wEAAwE;AACxE,6EAA6E;AAC7E,aAAa;AAEb;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AACH,MAAM,CAAC,MAAM,2BAA2B,GAAsB;IAC5D,eAAe;IACf,6BAA6B;IAC7B,6BAA6B;IAC7B,oBAAoB;IACpB,qCAAqC;IACrC,4BAA4B;IAC5B,mBAAmB;IACnB,uCAAuC;IACvC,0CAA0C;IAC1C,kCAAkC;IAClC,+BAA+B;CAChC,CAAC;AAQF,kEAAkE;AAClE,MAAM,UAAU,0BAA0B,CAAC,OAAsB,EAAE;IAIjE,OAAO;QACL,QAAQ,EAAE,IAAI,CAAC,QAAQ,IAAI,IAAI;QAC/B,IAAI,EAAE,CAAC,GAAG,2BAA2B,EAAE,GAAG,CAAC,IAAI,CAAC,IAAI,IAAI,EAAE,CAAC,CAAC;KAC7D,CAAC;AACJ,CAAC;AAED;;;;;;;;;;GAUG;AACH,MAAM,CAAC,MAAM,oBAAoB,GAAsB;IACrD,8BAA8B;IAC9B,iCAAiC;IACjC,uCAAuC;IACvC,0CAA0C;IAC1C,8BAA8B;IAC9B,oBAAoB;IACpB,0CAA0C;IAC1C,sDAAsD;IACtD,4BAA4B;IAC5B,4BAA4B;IAC5B,wBAAwB;IACxB,yBAAyB;IACzB,uBAAuB;IACvB,sBAAsB;IACtB,qBAAqB;QACnB;YACE,uCAAuC;YACvC,wCAAwC;YACxC,8BAA8B;YAC9B,wBAAwB;YACxB,qBAAqB;YACrB,eAAe;YACf,aAAa;YACb,aAAa;YACb,cAAc;YACd,+BAA+B;YAC/B,yCAAyC;YACzC,WAAW;YACX,eAAe;YACf,mBAAmB;YACnB,sBAAsB;YACtB,4CAA4C;SAC7C,CAAC,IAAI,CAAC,GAAG,CAAC;IACb,2CAA2C;IAC3C,0BAA0B;IAC1B,wBAAwB;IACxB,mCAAmC;IACnC,0BAA0B;IAC1B,4BAA4B;IAC5B,kCAAkC;IAClC,6BAA6B;IAC7B,4BAA4B;IAC5B,0BAA0B;IAC1B,gBAAgB;IAChB,wBAAwB;IACxB,qBAAqB;IACrB,sBAAsB;IACtB,qBAAqB;IACrB,uCAAuC;IACvC,+CAA+C;IAC/C,mCAAmC;IACnC,oBAAoB;IACpB,uCAAuC;IACvC,gBAAgB;CACjB,CAAC;AAEF,MAAM,aAAa,GAAG;IACpB,YAAY;IACZ,mBAAmB;IACnB,cAAc;IACd,wGAAwG;CACzG,CAAC;AAEF,sFAAsF;AACtF,MAAM,UAAU,UAAU,CAAC,IAI1B;IACC,MAAM,EAAE,QAAQ,EAAE,IAAI,EAAE,GAAG,0BAA0B,CAAC;QACpD,QAAQ,EAAE,IAAI,CAAC,QAAQ;QACvB,IAAI,EAAE,IAAI,CAAC,IAAI;KAChB,CAAC,CAAC;IACH,OAAO;QACL,GAAG,oBAAoB;QACvB,6BAA6B;QAC7B,GAAG,CAAC,QAAQ,CAAC,CAAC,CAAC,aAAa,CAAC,CAAC,CAAC,EAAE,CAAC;QAClC,cAAc;QACd,GAAG,IAAI;QACP,mBAAmB,IAAI,CAAC,WAAW,EAAE;QACrC,yBAAyB;QACzB,qBAAqB;KACtB,CAAC;AACJ,CAAC"}
|
package/dist/capture/pool.d.ts
CHANGED
package/dist/capture/pool.js
CHANGED
|
@@ -1,6 +1,9 @@
|
|
|
1
1
|
// Worker pool: fan stories across N parallel pages, yielding results as they
|
|
2
2
|
// complete. Used by both the CLI and the dev-server review API, which is why
|
|
3
3
|
// it takes a Browser rather than owning one.
|
|
4
|
+
import { BrowserDiedError, } from '../browser/browser.js';
|
|
5
|
+
import { TargetClosedError } from '../browser/cdp.js';
|
|
6
|
+
import { PageCrashedError } from '../browser/page.js';
|
|
4
7
|
import { captureStory } from './capture.js';
|
|
5
8
|
/**
|
|
6
9
|
* Default parallelism.
|
|
@@ -38,13 +41,23 @@ export async function* capturePool(stories, opts) {
|
|
|
38
41
|
notify?.();
|
|
39
42
|
notify = null;
|
|
40
43
|
};
|
|
44
|
+
// Set once the browser itself is gone: every story not yet taken fails with
|
|
45
|
+
// it, without touching a page, so a dead browser reads as one failure.
|
|
46
|
+
let died = null;
|
|
47
|
+
const open = async () => {
|
|
48
|
+
// No Retina: it quadruples buffer size for no diff signal. deviceScaleFactor
|
|
49
|
+
// is pinned to 1 by the driver and `--force-device-scale-factor=1`.
|
|
50
|
+
const context = await opts.browser.newContext({ viewport: opts.viewport });
|
|
51
|
+
try {
|
|
52
|
+
return { context, page: await context.newPage() };
|
|
53
|
+
}
|
|
54
|
+
catch (err) {
|
|
55
|
+
await context.close().catch(() => { });
|
|
56
|
+
throw err;
|
|
57
|
+
}
|
|
58
|
+
};
|
|
41
59
|
const workers = Array.from({ length: workerCount }, async () => {
|
|
42
|
-
|
|
43
|
-
viewport: opts.viewport,
|
|
44
|
-
// No Retina. Quadruples buffer size for no diff signal.
|
|
45
|
-
deviceScaleFactor: 1,
|
|
46
|
-
});
|
|
47
|
-
const page = await context.newPage();
|
|
60
|
+
let session = await open();
|
|
48
61
|
const deps = {
|
|
49
62
|
platform: opts.platform,
|
|
50
63
|
baseUrl: opts.baseUrl,
|
|
@@ -58,8 +71,13 @@ export async function* capturePool(stories, opts) {
|
|
|
58
71
|
if (i >= work.length)
|
|
59
72
|
break;
|
|
60
73
|
const story = work[i];
|
|
74
|
+
if (died || !session) {
|
|
75
|
+
push({ story, error: died ?? new BrowserDiedError() });
|
|
76
|
+
opts.onProgress?.(++done, work.length, story.storyId);
|
|
77
|
+
continue;
|
|
78
|
+
}
|
|
61
79
|
try {
|
|
62
|
-
const snapshot = await captureStory(page, story, deps, opts.viewport);
|
|
80
|
+
const snapshot = await captureStory(session.page, story, deps, opts.viewport);
|
|
63
81
|
// null means the story declared `skip` in params only visible once
|
|
64
82
|
// it had rendered. Report it as skipped, not as a failure.
|
|
65
83
|
push(snapshot ? { story, snapshot } : { story, skipped: true });
|
|
@@ -68,12 +86,27 @@ export async function* capturePool(stories, opts) {
|
|
|
68
86
|
// One bad story must never kill a run of 700. Report it as a failure
|
|
69
87
|
// for this story and keep the worker going.
|
|
70
88
|
push({ story, error: err instanceof Error ? err : new Error(String(err)) });
|
|
89
|
+
// A crashed renderer or a closed target is permanent for that page:
|
|
90
|
+
// left alone, every later story on this worker failed instantly
|
|
91
|
+
// (concurrency 2, one crash: 6 of 8 stories failed). Replace the
|
|
92
|
+
// worker's context and page; if the browser itself is gone, stop.
|
|
93
|
+
if (!opts.browser.isConnected()) {
|
|
94
|
+
died ??= new BrowserDiedError(err);
|
|
95
|
+
}
|
|
96
|
+
else if (err instanceof PageCrashedError ||
|
|
97
|
+
err instanceof TargetClosedError) {
|
|
98
|
+
await session.context.close().catch(() => { });
|
|
99
|
+
session = await open().catch((e) => {
|
|
100
|
+
died ??= new BrowserDiedError(e);
|
|
101
|
+
return null;
|
|
102
|
+
});
|
|
103
|
+
}
|
|
71
104
|
}
|
|
72
105
|
opts.onProgress?.(++done, work.length, story.storyId);
|
|
73
106
|
}
|
|
74
107
|
}
|
|
75
108
|
finally {
|
|
76
|
-
await context.close().catch(() => { });
|
|
109
|
+
await session?.context.close().catch(() => { });
|
|
77
110
|
}
|
|
78
111
|
});
|
|
79
112
|
const all = Promise.all(workers);
|
package/dist/capture/pool.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"pool.js","sourceRoot":"","sources":["../../src/capture/pool.ts"],"names":[],"mappings":"AAAA,6EAA6E;AAC7E,6EAA6E;AAC7E,6CAA6C;
|
|
1
|
+
{"version":3,"file":"pool.js","sourceRoot":"","sources":["../../src/capture/pool.ts"],"names":[],"mappings":"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"}
|
package/dist/capture/settle.d.ts
CHANGED
package/dist/capture/settle.js
CHANGED
|
@@ -119,6 +119,8 @@ export const FREEZE_ANIMATIONS_CSS = `
|
|
|
119
119
|
/** Wait for an explicit selector. Escape hatch for async content the network
|
|
120
120
|
* drain can't observe — SDK init, canvas paint, third-party widgets. */
|
|
121
121
|
export async function waitForSelector(page, selector, timeoutMs) {
|
|
122
|
+
// Timing out is swallowed (capture what rendered); a non-CSS selector is a
|
|
123
|
+
// configuration error and throws synchronously from the page before the wait.
|
|
122
124
|
await page.waitForSelector(selector, { timeout: timeoutMs }).catch(() => { });
|
|
123
125
|
}
|
|
124
126
|
/**
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"settle.js","sourceRoot":"","sources":["../../src/capture/settle.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"settle.js","sourceRoot":"","sources":["../../src/capture/settle.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
import type { Browser } from '../browser/browser.js';
|
|
2
|
+
import type { CaptureEnv, Snapshot, StoryParams, Viewport } from '../types.js';
|
|
3
|
+
export interface SnapOptions {
|
|
4
|
+
url: string;
|
|
5
|
+
viewport?: Viewport;
|
|
6
|
+
params?: StoryParams;
|
|
7
|
+
/** Acquired by the caller (acquireBrowser); not closed here. */
|
|
8
|
+
browser: Browser;
|
|
9
|
+
}
|
|
10
|
+
export interface SnapResult {
|
|
11
|
+
snapshot: Snapshot;
|
|
12
|
+
env: CaptureEnv;
|
|
13
|
+
/** HTTP status of the main document, null for non-HTTP URLs. */
|
|
14
|
+
status: number | null;
|
|
15
|
+
}
|
|
16
|
+
export interface SnapPagesOptions {
|
|
17
|
+
urls: string[];
|
|
18
|
+
viewport?: Viewport;
|
|
19
|
+
params?: StoryParams;
|
|
20
|
+
/** Acquired by the caller (acquireBrowser); not closed here. */
|
|
21
|
+
browser: Browser;
|
|
22
|
+
}
|
|
23
|
+
export interface SnapPageResult {
|
|
24
|
+
url: string;
|
|
25
|
+
/** Absent when this page failed; `error` says why. */
|
|
26
|
+
snapshot?: Snapshot;
|
|
27
|
+
status: number | null;
|
|
28
|
+
error?: string;
|
|
29
|
+
}
|
|
30
|
+
/**
|
|
31
|
+
* Capture several URLs with one context and one page, in order.
|
|
32
|
+
* A page that fails records its error and the rest still capture: the agent
|
|
33
|
+
* asked for all of them and wants to know which ones it got.
|
|
34
|
+
*
|
|
35
|
+
* One page, navigated, is the cold path captureStory already takes: a
|
|
36
|
+
* navigation discards injected styles and captureStory re-applies them.
|
|
37
|
+
* Origin state is cleared between pages by resetBetweenPages.
|
|
38
|
+
*/
|
|
39
|
+
export declare function snapPages(opts: SnapPagesOptions): Promise<{
|
|
40
|
+
env: CaptureEnv;
|
|
41
|
+
pages: SnapPageResult[];
|
|
42
|
+
}>;
|
|
43
|
+
export declare function snapPage(opts: SnapOptions): Promise<SnapResult>;
|
|
@@ -0,0 +1,103 @@
|
|
|
1
|
+
// Capture one URL through the full settle pipeline, outside any run.
|
|
2
|
+
//
|
|
3
|
+
// The public entry point for `jux snap` and for anything else that needs a
|
|
4
|
+
// single deterministic capture. It exists so captureStory and the settle
|
|
5
|
+
// pipeline can stay unexported (see index.ts): callers get the result of the
|
|
6
|
+
// load-bearing ordering without being able to reorder it.
|
|
7
|
+
import { createUrlPlatform } from '../platforms/urls.js';
|
|
8
|
+
import { captureStory } from './capture.js';
|
|
9
|
+
import { captureEnv } from './env.js';
|
|
10
|
+
const DEFAULT_SNAP_VIEWPORT = { width: 1280, height: 800 };
|
|
11
|
+
/**
|
|
12
|
+
* Capture several URLs with one context and one page, in order.
|
|
13
|
+
* A page that fails records its error and the rest still capture: the agent
|
|
14
|
+
* asked for all of them and wants to know which ones it got.
|
|
15
|
+
*
|
|
16
|
+
* One page, navigated, is the cold path captureStory already takes: a
|
|
17
|
+
* navigation discards injected styles and captureStory re-applies them.
|
|
18
|
+
* Origin state is cleared between pages by resetBetweenPages.
|
|
19
|
+
*/
|
|
20
|
+
export async function snapPages(opts) {
|
|
21
|
+
const viewport = opts.viewport ?? DEFAULT_SNAP_VIEWPORT;
|
|
22
|
+
const context = await opts.browser.newContext({ viewport, blockServiceWorkers: true });
|
|
23
|
+
try {
|
|
24
|
+
const page = await context.newPage();
|
|
25
|
+
let status = null;
|
|
26
|
+
const off = page.onMainResponse((s) => (status = s));
|
|
27
|
+
const pages = [];
|
|
28
|
+
for (const [k, url] of opts.urls.entries()) {
|
|
29
|
+
status = null;
|
|
30
|
+
const id = `snap-${k}`;
|
|
31
|
+
const platform = createUrlPlatform([
|
|
32
|
+
{ id, url, ...(opts.params ? { params: opts.params } : {}) },
|
|
33
|
+
]);
|
|
34
|
+
try {
|
|
35
|
+
const [story] = await platform.enumerate({ projectRoot: process.cwd() });
|
|
36
|
+
const snapshot = await captureStory(page, story, { platform, baseUrl: url }, viewport);
|
|
37
|
+
if (!snapshot)
|
|
38
|
+
throw new Error('page declared skip');
|
|
39
|
+
pages.push({ url, snapshot, status });
|
|
40
|
+
}
|
|
41
|
+
catch (err) {
|
|
42
|
+
pages.push({
|
|
43
|
+
url,
|
|
44
|
+
status,
|
|
45
|
+
error: err instanceof Error ? err.message : String(err),
|
|
46
|
+
});
|
|
47
|
+
}
|
|
48
|
+
await resetBetweenPages(context, page, url);
|
|
49
|
+
}
|
|
50
|
+
off();
|
|
51
|
+
return { env: captureEnv(opts.browser), pages };
|
|
52
|
+
}
|
|
53
|
+
finally {
|
|
54
|
+
await context.close().catch(() => { });
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
/**
|
|
58
|
+
* A navigation keeps everything origin-scoped: cookies, localStorage,
|
|
59
|
+
* IndexedDB, Cache Storage and service workers. One context is shared by every
|
|
60
|
+
* page (a context per page would cost the launch savings back), so the
|
|
61
|
+
* previous page's origin is wiped through the page's own CDP session
|
|
62
|
+
* (Storage.clearDataForOrigin, as before) instead; otherwise a page's pixels
|
|
63
|
+
* could depend on which page was captured before it. Service workers
|
|
64
|
+
* are blocked at context creation, since clearing cannot stop one that has
|
|
65
|
+
* already intercepted the next navigation.
|
|
66
|
+
*
|
|
67
|
+
* The origin comes from the requested URL, not only the page: after a failed
|
|
68
|
+
* load the page is an error page with an opaque origin. The page's final URL
|
|
69
|
+
* is cleared too, for redirects. Covers IndexedDB, Cache Storage, service
|
|
70
|
+
* workers and local storage. Best effort: nothing here
|
|
71
|
+
* may fail a capture that already succeeded.
|
|
72
|
+
*/
|
|
73
|
+
async function resetBetweenPages(context, page, requestedUrl) {
|
|
74
|
+
await context.clearCookies().catch(() => { });
|
|
75
|
+
// A redirect lands on another origin (a login host, a canonical port) that
|
|
76
|
+
// holds state of its own.
|
|
77
|
+
const origins = new Set();
|
|
78
|
+
for (const u of [requestedUrl, page.url()]) {
|
|
79
|
+
try {
|
|
80
|
+
const o = new URL(u);
|
|
81
|
+
if (o.protocol === 'http:' || o.protocol === 'https:')
|
|
82
|
+
origins.add(o.origin);
|
|
83
|
+
}
|
|
84
|
+
catch {
|
|
85
|
+
// about:blank, chrome-error:// — no origin to clear.
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
for (const origin of origins)
|
|
89
|
+
await page.clearOrigin(origin).catch(() => { });
|
|
90
|
+
}
|
|
91
|
+
export async function snapPage(opts) {
|
|
92
|
+
const { env, pages } = await snapPages({
|
|
93
|
+
urls: [opts.url],
|
|
94
|
+
browser: opts.browser,
|
|
95
|
+
...(opts.viewport ? { viewport: opts.viewport } : {}),
|
|
96
|
+
...(opts.params ? { params: opts.params } : {}),
|
|
97
|
+
});
|
|
98
|
+
const [r] = pages;
|
|
99
|
+
if (!r.snapshot)
|
|
100
|
+
throw new Error(r.error ?? 'jux: could not capture');
|
|
101
|
+
return { snapshot: r.snapshot, env, status: r.status };
|
|
102
|
+
}
|
|
103
|
+
//# sourceMappingURL=snap.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"snap.js","sourceRoot":"","sources":["../../src/capture/snap.ts"],"names":[],"mappings":"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"}
|