renderdiff 0.1.0 → 0.2.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/README.md CHANGED
@@ -23,15 +23,22 @@ Routes: 3
23
23
  clean: /
24
24
  /about clean @1152,896,704,375
25
25
  @1440 97.41% h-24 band -24@y196 aligned 100.00% text -"Pricing"
26
+ dom -nav > a[href="/pricing"] "Pricing"
27
+ crops about.1440.c1.png
26
28
  /pricing
27
29
  @1440,1152,896,704,375 99.12%–99.87% 1 reg
30
+ dom @1440 div.plans > a.cta margin-left 24px→16px
31
+ crops pricing.1440.c1.png pricing.1152.c1.png pricing.896.c1.png pricing.704.c1.png pricing.375.c1.png
28
32
  renderdiff: 2 of 3 routes differ (6 of 15 shots), 0 errors, worst 97.41% /about@1440 — /Users/you/site/renderdiff-out/results.json
29
33
  ```
30
34
 
31
35
  A row covers the widths that agree on everything but the score (shown as a range): height
32
36
  delta (`h`), bands (`+` rows only left has, `-` rows only right has, at `y`; `~` when the
33
37
  widths put it in different places), aligned score, region count, unstable pixels and up to
34
- three text-diff lines (`-"x"` only on the right, `+"x"` only on the left). Errors print in
38
+ three text-diff lines (`-"x"` only on the right, `+"x"` only on the left). Under a row,
39
+ `dom` names up to three elements behind the changes (see **Elements** below; `@w` when the
40
+ row covers several widths: the first one's), and `crops` lists that row's crop files,
41
+ relative to the directory `results.json` is in. Errors print in
35
42
  full, grouped across the widths that share a message. Clean means not one pixel differs
36
43
  and none went unmeasured as unstable; a route with unstable pixels gets its own row. With
37
44
  `--threshold`, the verdict line ends `, B below 97.00%`. `--progress` gets the per-shot
@@ -44,7 +51,9 @@ npm install -g renderdiff
44
51
  npx playwright install chromium # once, if you don't already have it
45
52
  ```
46
53
 
47
- Requires Node >= 22.18.
54
+ Requires Node >= 22.18. If the bundled Chromium won't launch, renderdiff falls back to an
55
+ installed Google Chrome on both sides and prints a line saying so; `meta.browser` in
56
+ `results.json` records which browser ran.
48
57
 
49
58
  ### Agent skill
50
59
 
@@ -67,9 +76,6 @@ For other agents (Codex, Cursor and so on), with [skills](https://skills.sh):
67
76
  npx skills add tmashara/renderdiff
68
77
  ```
69
78
 
70
- Until renderdiff is on npm, `npx renderdiff@latest` won't resolve; install the CLI with
71
- `npm install -g github:tmashara/renderdiff`.
72
-
73
79
  ## Usage
74
80
 
75
81
  ```
@@ -85,10 +91,12 @@ renderdiff <left-origin> <right-origin> <route…> [options]
85
91
  | `--width <n>` | Viewport width; repeatable. Replaces the defaults. |
86
92
  | `--threshold <0..1>` | Exit non-zero if any comparison scores below this. |
87
93
  | `--out <dir>` | Output directory, wiped at the start of a run. Default `./renderdiff-out`. A directory holding files renderdiff didn't write is refused. |
88
- | `--concurrency <n>` | Parallel workers. Default 2. |
94
+ | `--concurrency <n>` | Parallel workers. Default half the CPU cores, between 2 and 8. Lower it when one side is someone's live site. |
89
95
  | `--config <path>` | Config file. Default: `renderdiff.config.{ts,mts,js,mjs}` in cwd. |
90
96
  | `--selector <sel>` | Compare the one element this Playwright selector matches, on both sides, instead of the whole page. Applies to every route, over the config's per-route `selector`. |
91
97
  | `--left-selector <sel>`, `--right-selector <sel>` | That side's selector, over `--selector`. One without the other side (or `--selector`) is an error. |
98
+ | `--storage-state <file>` | Start both sides with this Playwright storage state (cookies, localStorage), e.g. signed in. Relative to cwd. Over the config's `storageState`. |
99
+ | `--left-storage-state <file>`, `--right-storage-state <file>` | That side's storage state, over `--storage-state`. One side alone is fine. |
92
100
  | `--dry-run` | Print the URL pairs and exit. No browser. |
93
101
  | `--open` | Open the report when the run finishes. |
94
102
  | `--progress` | A line per shot as it finishes, then the worst scores. The default on a terminal; piped, renderdiff prints one compact summary at the end. |
@@ -101,8 +109,10 @@ route is loaded on both origins, unless it's a pair.
101
109
  Default widths are `1440, 1152, 896, 704, 375` — one inside each common responsive band
102
110
  rather than on a breakpoint boundary, so a layout switch never flaps between captures.
103
111
 
104
- Exit codes: `0` all good · `1` a route errored or scored below `--threshold` ·
105
- `2` bad arguments, bad config, or an origin that isn't responding.
112
+ Exit codes: `0` no route errored and none scored below `--threshold` (without one, a diff
113
+ still exits 0) · `1` a route scored below `--threshold` · `2` bad arguments, bad config, or an
114
+ origin that isn't responding · `3` a route errored, so it went unmeasured, or the run
115
+ crashed (e.g. no Chromium). `1` wins over `3` when both happen.
106
116
 
107
117
  ## Comparing different routes or components
108
118
 
@@ -157,6 +167,49 @@ Things to know:
157
167
  - A selector that matches an element with no box (`display: none`) or one off the page is
158
168
  an error. The render gate stays page-level: a textless element on a rendered page is fine.
159
169
 
170
+ ## Interactions and signed-in pages
171
+
172
+ When the state worth comparing is behind a click (an open menu, a dismissed modal both
173
+ sides show), give the route a `before` hook in the config. It runs on each side after the
174
+ page loads and its HTTP status is checked, and before renderdiff settles, masks and shoots
175
+ it, with the clock and seeded `Math.random` already in force:
176
+
177
+ ```ts
178
+ export default {
179
+ routes: [
180
+ { left: "/", before: async (page) => { await page.click("[aria-label=Menu]"); } },
181
+ ],
182
+ // For every route without its own `before` (which replaces it), CLI routes included.
183
+ before: async (page, { side, route, width }) => {
184
+ const accept = page.getByRole("button", { name: "Accept" });
185
+ if (await accept.isVisible()) await accept.click();
186
+ },
187
+ };
188
+ ```
189
+
190
+ `side` is `"left"` or `"right"`, `route` the route's name (`/a` or `/a::/b`), `width` the
191
+ viewport width. Use `side` only where the markup legitimately differs (the button has a
192
+ different selector on each side), never to make the sides look alike. A hook that throws
193
+ is a route error, `before hook failed on left: …`, and isn't retried. A route that ran one
194
+ has `"hook": true` in `results.json` and a `before hook` badge on its report card.
195
+ Actions in a hook use Playwright's 30s default timeout, so check before clicking what may
196
+ not be there (as above); `hideSelectors` and `extraCss` apply after the hook.
197
+
198
+ For pages behind a login, save a Playwright storage state once and pass it:
199
+
200
+ ```
201
+ npx playwright codegen --save-storage=auth.json https://example.com/login
202
+ renderdiff http://localhost:3000 https://example.com /account --storage-state auth.json
203
+ ```
204
+
205
+ `--left-storage-state` / `--right-storage-state` give each side its own file, and the
206
+ config takes `storageState: "auth.json"` or `{ left, right }`, relative to the config file.
207
+ A missing or non-JSON file, or one that isn't a storage state, exits 2 before the browser starts. The file's contents are never
208
+ printed; `meta.storageState` and the report name only each side's file. It holds live
209
+ session tokens: **never commit it**, and add it to `.gitignore`. The out dir then holds
210
+ signed-in screenshots, and their text in `results.json`, so don't publish or commit that
211
+ either; add the out dir to `.gitignore` too.
212
+
160
213
  ## Config file
161
214
 
162
215
  Flags cover a one-off run. A `renderdiff.config.ts` (or `.mjs`) in the working directory
@@ -183,6 +236,8 @@ export default {
183
236
  masks: [
184
237
  { selector: "[data-star-count]", reason: "live star count", urlPath: "/pricing" },
185
238
  ],
239
+
240
+ storageState: "auth.json", // relative to this file; never commit it
186
241
  };
187
242
  ```
188
243
 
@@ -229,6 +284,19 @@ Under each score, `--progress` output and the report card say where to look:
229
284
  different to align`. A horizontal shift is never a band. Alignment works on exact row
230
285
  matches, so it gives up when the edits total more than 2,000 rows (a single inserted or
231
286
  removed block aligns at any height), or when sub-threshold shade noise touches every row.
287
+ - **Elements** name what is under the first five bands and regions, up to three each, read
288
+ from the live pages right after the shot. Each is a CSS selector unique on its side, so
289
+ `--selector` takes it. `-sel "text"` exists only on the right, `+sel` only on the left;
290
+ `sel margin-left 24px→16px` is on both, with the computed properties that differ, left
291
+ first; `sel x+8` moved without a style of its own changing, so the cause is a neighbour or
292
+ its parent, which is listed after it when one of them changed; a bare `sel` is on both
293
+ sides with nothing compared changed or moved, so its own pixels did (an image's source, a
294
+ canvas). An element without text is only paired when its box is the same size on both
295
+ sides; `rightSelector` is set when the right side was found by its text under another
296
+ selector. A band names only what one side added, not what it pushed down, so it can name
297
+ nothing; what fixed chrome covers isn't named. Probing gives up after 5s, leaving the
298
+ elements out. A computed
299
+ value is a symptom: find the rule that set it. Shadow DOM and iframes aren't searched.
232
300
  - **Text** is a line diff of each side's `document.body.innerText` (the element's, with a
233
301
  selector). Left is the changed version: *added* lines are on the left only, *removed* lines on the right only. The card
234
302
  lists the first 20. Masked elements are left out. Unmasked text that changes per load
@@ -241,8 +309,8 @@ than the one it's compared against has not reached parity. The `height ±Npx` ba
241
309
  row names the cause.
242
310
 
243
311
  **Errors are not failures.** A route that threw produced no measurement, so it is
244
- neither a pass nor a fail. It's listed separately in the report — and it still exits 1,
245
- because an unmeasured route is not a verified one.
312
+ neither a pass nor a fail. It's listed separately in the report — and it still exits non-zero
313
+ (`3`), because an unmeasured route is not a verified one.
246
314
 
247
315
  ## Output
248
316
 
@@ -268,23 +336,33 @@ Everything lands in the out dir (`./renderdiff-out` by default):
268
336
  ```jsonc
269
337
  {
270
338
  "meta": {
271
- "tool": "renderdiff", "version": "0.1.0", "generatedAt": "…",
339
+ "tool": "renderdiff", "version": "0.2.0", "generatedAt": "…",
272
340
  "left": "http://localhost:3000", "right": "https://example.com",
273
341
  "widths": [1440, 375], "threshold": null,
274
342
  "clock": "…", // the instant both sides' clocks start at
275
343
  "blockUrlPatterns": ["…"], "hideSelectors": ["…"],
276
- "masks": [{ "urlPath": "/pricing", "reason": "live star count" }] // no urlPath: every route
344
+ "masks": [{ "urlPath": "/pricing", "reason": "live star count" }], // no urlPath: every route
345
+ "browser": { "name": "chromium", "version": "…" }, // "chrome" when it fell back
346
+ "storageState": { "left": "auth.json", "right": null } // file names only
277
347
  },
278
348
  "results": [
279
349
  {
280
350
  "url": "/about", "left": "/about", "right": "/about", // a pair: "/a::/b", "/a", "/b"
351
+ "selector": null, "hook": false, // hook: a before hook ran
281
352
  "width": 1440, "status": "compared",
282
353
  "score": 0.9714, // share of measured pixels that match
283
354
  "alignedScore": 1, // score over the aligned rows; null unless there are bands
284
355
  "diffPixels": 33120, "totalPixels": 1158000, "unstablePixels": 0,
285
356
  "heightDelta": -24, "widthDelta": 0, // left − right
286
357
  "regions": [], // left-page px; with bands, from the realigned rows
287
- "bands": [{ "side": "right", "y": 196, "h": 24 }], // null: too different to align
358
+ "bands": [{ "side": "right", "y": 196, "h": 24, // null: too different to align
359
+ "elements": [{ // regions have them too; absent: not looked at
360
+ "selector": "nav > a[href=\"/pricing\"]", "side": "right", // or "left", "both"
361
+ "left": null, "right": { "x": 256, "y": 192, "w": 928, "h": 24 },
362
+ "changed": {}, // "margin-left": ["24px", "16px"], left first; "text" too
363
+ "text": "Pricing" // "rightSelector" when the right one differs
364
+ }]
365
+ }],
288
366
  "text": { "added": [], "removed": ["Pricing"] },
289
367
  "images": { "left": "about.1440.left.png", "right": "about.1440.right.png", "diff": "about.1440.diff.png" },
290
368
  "crops": [{
@@ -328,7 +406,8 @@ Paths are relative to the out dir. Results are in route-then-width order.
328
406
  dev toolbars.
329
407
  - **Settles the page** — makes native lazy images eager, scrolls every viewport-height
330
408
  slice a frame at a time so script lazy loaders fire, waits for every image to decode,
331
- `document.fonts.ready` and up to 3s of network idle, then re-injects the stylesheet to
409
+ `document.fonts.ready` and up to 3s for the network to go 250ms with nothing in flight
410
+ (server-sent events and beacons don't count), then re-injects the stylesheet to
332
411
  catch late-injected chrome.
333
412
  - **Shoots until stable** — repeats the screenshot until two in a row match (at most 3; 2
334
413
  for tiled pages). Pixels still changing between the last two shots of the same load are
@@ -336,10 +415,13 @@ Paths are relative to the out dir. Results are in route-then-width order.
336
415
  as `unstable`, and excluded from the measurement — the score is over the remaining
337
416
  pixels. A route more than 25% unstable errors as `page did not settle`.
338
417
  - **Isolates state** — one browser context per origin, so cookies and localStorage never
339
- cross. Both sides of a route load at the same time.
418
+ cross (a storage state file seeds each context on its own). Both sides of a route load at
419
+ the same time.
340
420
  - **Retries once** per shot; a live site can time out on a cold edge.
341
- - **Stitches tall pages.** Chromium silently truncates a single screenshot past 16,384px,
342
- so taller pages are captured as tiles through CDP and stitched back together. Masks are
421
+ - **Stitches tall pages.** A single screenshot past 16,384px can come out truncated or
422
+ wrapped (Chrome repeats the top of the page; recent headless Chromium does not), so taller
423
+ pages, and element shots taller than that, are captured as tiles through CDP and stitched
424
+ back together. Masks are
343
425
  painted onto the final image from each element's bounding box, so they apply the same
344
426
  way on both paths. Past 40,000px it errors — that's a broken layout, not a page.
345
427
 
@@ -387,13 +469,15 @@ ephemeral ports. Three groups:
387
469
  `place-items`, inline-block against flex. These assert a **zero-pixel** diff, not a
388
470
  threshold. They are the corpus's central claim: the score tracks pixels, not markup, so a
389
471
  refactor that changed nothing visible reads as nothing changed.
390
- - *Controls* — an 8px shift, an extra section, one recoloured box. These must score low.
391
- Without them a tool that returned 100% unconditionally would pass the suite.
472
+ - *Controls* — an 8px shift, an extra section, one recoloured box, one changed margin. These
473
+ must score low. Without them a tool that returned 100% unconditionally would pass the
474
+ suite. They also pin the elements each change names.
392
475
  - *Guard rails* — one per defence above: the blank-page refusal (and a short sign-in page
393
476
  that must not be refused), the 18,000px tiled capture with masks in both tiles, animation
394
477
  stilling, the shared clock start and seeded randomness, the unstable-pixel check, lazy-image
395
- settling (native and script-driven, 4,800px below the fold), consent hiding, masks, and
396
- network blocking. Masks
478
+ settling (native and script-driven, 4,800px below the fold), consent hiding, masks,
479
+ network blocking, `before` hooks, storage state, and naming fixed chrome over what it
480
+ covers. Masks
397
481
  and blocking each run twice, with and without their config, so the mechanism is shown doing
398
482
  something rather than a page merely happening to match.
399
483
 
package/dist/capture.d.ts CHANGED
@@ -12,10 +12,18 @@ export interface Shot {
12
12
  * line, empty lines dropped.
13
13
  */
14
14
  text: string[];
15
+ /** Page px of the shot's top-left: the element's for a selector route, else 0,0. */
16
+ origin: {
17
+ x: number;
18
+ y: number;
19
+ };
20
+ }
21
+ /** A `before` hook threw. Never retried: the hook may have half-run against the page. */
22
+ export declare class HookError extends Error {
15
23
  }
16
24
  /**
17
- * Install network blocking, the fake clock and seeded randomness. Once per page,
18
- * before any navigation.
25
+ * Install network blocking and tracking, the fake clock and seeded randomness. Once per
26
+ * page, before any navigation.
19
27
  */
20
28
  export declare function prepare(page: Page, cfg: ResolvedConfig, now: number): Promise<void>;
21
29
  export declare function capture(page: Page, url: string, route: Route, side: "left" | "right", width: number, cfg: ResolvedConfig, now: number): Promise<Shot>;
package/dist/capture.js CHANGED
@@ -1,10 +1,11 @@
1
+ import { setTimeout as sleep } from "node:timers/promises";
1
2
  import sharp from "sharp";
2
- import { MASK_COLOR, masksFor } from "./config.js";
3
+ import { label, MASK_COLOR, masksFor } from "./config.js";
3
4
  /**
4
5
  * Chromium's screenshot backing store caps at this in any dimension; a single
5
- * `fullPage` shot past it is silently truncated. Rather than refuse, a taller page is
6
- * captured in vertical tiles of at most this height and stitched back together
7
- * (`captureTiled`), so long pages still diff in full.
6
+ * `fullPage` or clip shot past it can come out truncated or wrapped. Rather than refuse, a
7
+ * taller page or element is captured in vertical tiles of at most this height and stitched
8
+ * back together (`captureTiled`), so it still diffs in full.
8
9
  */
9
10
  const MAX_CAPTURE_HEIGHT = 16_384;
10
11
  /** Tile height for the stitched path. Under the cap, with margin. */
@@ -14,11 +15,46 @@ const TILE_HEIGHT = 16_000;
14
15
  * one, and we would rather error than stitch a >100MB image. Named in the throw.
15
16
  */
16
17
  const MAX_PAGE_HEIGHT = 40_000;
18
+ /** Requests still open per page, and when the last one opened or closed. */
19
+ const network = new WeakMap();
20
+ /** Never finish, so they would hold network idle open until its timeout. */
21
+ const STREAMS = new Set(["eventsource", "websocket", "ping"]);
22
+ /** Playwright's `networkidle` waits a fixed 500ms; below 250ms, late request events under load slip past. */
23
+ async function networkIdle(page, quiet, timeout) {
24
+ const net = network.get(page);
25
+ const end = Date.now() + timeout;
26
+ while (Date.now() < end && (net.open.size || Date.now() - net.last < quiet))
27
+ await sleep(25);
28
+ }
29
+ /** A `before` hook threw. Never retried: the hook may have half-run against the page. */
30
+ export class HookError extends Error {
31
+ }
17
32
  /**
18
- * Install network blocking, the fake clock and seeded randomness. Once per page,
19
- * before any navigation.
33
+ * Install network blocking and tracking, the fake clock and seeded randomness. Once per
34
+ * page, before any navigation.
20
35
  */
21
36
  export async function prepare(page, cfg, now) {
37
+ const net = { open: new Set(), last: Date.now() };
38
+ network.set(page, net);
39
+ page.on("request", (r) => {
40
+ if (STREAMS.has(r.resourceType()))
41
+ return;
42
+ net.open.add(r);
43
+ net.last = Date.now();
44
+ });
45
+ const done = (r) => {
46
+ if (net.open.delete(r))
47
+ net.last = Date.now();
48
+ };
49
+ page.on("requestfinished", done);
50
+ page.on("requestfailed", done);
51
+ // A request the old document left open never finishes or fails, so it can't hold the next load.
52
+ page.on("framenavigated", (f) => {
53
+ if (f !== page.mainFrame())
54
+ return;
55
+ net.open.clear();
56
+ net.last = Date.now();
57
+ });
22
58
  for (const pattern of cfg.blockUrlPatterns) {
23
59
  await page.route(pattern, (route) => route.abort());
24
60
  }
@@ -45,6 +81,14 @@ export async function capture(page, url, route, side, width, cfg, now) {
45
81
  if (res && res.status() >= 400) {
46
82
  throw new Error(`HTTP ${res.status()} at ${url}`);
47
83
  }
84
+ if (route.before) {
85
+ try {
86
+ await route.before(page, { side, route: label(route), width });
87
+ }
88
+ catch (e) {
89
+ throw new HookError(`before hook failed on ${side}: ${e instanceof Error ? e.message : String(e)}`);
90
+ }
91
+ }
48
92
  await page.addStyleTag({ content: cfg.neutralizeCss });
49
93
  // Native lazy images go eager; JS lazy loaders see every viewport-height slice, one
50
94
  // frame each, since a scroll inside one synchronous loop never paints.
@@ -68,9 +112,7 @@ export async function capture(page, url, route, side, width, cfg, now) {
68
112
  await Promise.race([decoded, new Promise((r) => setTimeout(r, 5_000))]);
69
113
  }, MAX_PAGE_HEIGHT);
70
114
  await page.evaluate(() => document.fonts.ready);
71
- await page
72
- .waitForLoadState("networkidle", { timeout: 3_000 })
73
- .catch(() => { });
115
+ await networkIdle(page, 250, 3_000);
74
116
  await page.addStyleTag({ content: cfg.neutralizeCss }); // anything injected late
75
117
  const selector = route.selector?.[side];
76
118
  const where = `on ${side} (${route[side]})`;
@@ -115,8 +157,6 @@ export async function capture(page, url, route, side, width, cfg, now) {
115
157
  throw new Error(`page is ${scrollHeight}px tall, past the ${MAX_PAGE_HEIGHT}px sanity ceiling ` +
116
158
  `at ${url} — likely a broken layout, not a real page`);
117
159
  }
118
- // A clip of any height comes out whole, so only a page shot needs tiles.
119
- const tiled = !el && scrollHeight > MAX_CAPTURE_HEIGHT;
120
160
  const measure = async (l) => {
121
161
  const b = await l.boundingBox();
122
162
  if (!b?.width || !b.height)
@@ -140,24 +180,25 @@ export async function capture(page, url, route, side, width, cfg, now) {
140
180
  throw new Error(`selector "${selector}" is off the page ${where}`);
141
181
  }
142
182
  }
143
- const boxes = (await Promise.all((await Promise.all(masks.map((l) => l.all())))
144
- .flat()
145
- .map((m) => m.boundingBox())))
183
+ const boxes = (await Promise.all((await Promise.all(masks.map((l) => l.all()))).flat().map((m) => m.boundingBox())))
146
184
  .filter((b) => b !== null)
147
185
  .map((b) => (clip ? { ...b, x: b.x - clip.x, y: b.y - clip.y } : b));
186
+ const area = clip ?? { x: 0, y: 0, width, height: scrollHeight };
187
+ const tiled = area.height > MAX_CAPTURE_HEIGHT;
148
188
  const shoot = async () => paintBoxes(tiled
149
- ? await captureTiled(page, width, scrollHeight)
189
+ ? await captureTiled(page, area)
150
190
  : await page.screenshot({ fullPage: true, clip, animations: "disabled" }), boxes);
151
191
  // A tiled shot is expensive, so it gets one comparison.
152
192
  const tries = tiled ? 2 : 3;
193
+ const origin = { x: clip?.x ?? 0, y: clip?.y ?? 0 };
153
194
  let prev = await shoot();
154
195
  for (let n = 2;; n++) {
155
- await page.waitForTimeout(100);
196
+ await page.waitForTimeout(50);
156
197
  const png = await shoot();
157
198
  if (png.equals(prev))
158
- return { png, unstable: null, blank, text };
199
+ return { png, unstable: null, blank, text, origin };
159
200
  if (n === tries)
160
- return { png, unstable: await differing(prev, png), blank, text };
201
+ return { png, unstable: await differing(prev, png), blank, text, origin };
161
202
  prev = png;
162
203
  }
163
204
  }
@@ -253,8 +294,8 @@ async function paintBoxes(png, boxes) {
253
294
  return rects.length ? sharp(png).composite(rects).png().toBuffer() : png;
254
295
  }
255
296
  /**
256
- * Capture a page taller than Chromium's one-shot limit as vertical tiles, then stitch
257
- * them into a single full-height PNG.
297
+ * Capture a page, or an element's box, taller than Chromium's one-shot limit as vertical
298
+ * tiles, then stitch them into a single full-height PNG.
258
299
  *
259
300
  * Playwright's `page.screenshot({ clip })` clips against the viewport, so it cannot
260
301
  * reach a band below the fold. We drop to a raw CDP `Page.captureScreenshot` with
@@ -265,23 +306,23 @@ async function paintBoxes(png, boxes) {
265
306
  *
266
307
  * `deviceScaleFactor` is 1 (`CONTEXT_OPTIONS` in config.ts), so clip coords are CSS px.
267
308
  */
268
- async function captureTiled(page, width, scrollHeight) {
309
+ async function captureTiled(page, box) {
269
310
  const client = await page.context().newCDPSession(page);
270
311
  try {
271
312
  const tiles = [];
272
- for (let y = 0; y < scrollHeight; y += TILE_HEIGHT) {
273
- const height = Math.min(TILE_HEIGHT, scrollHeight - y);
313
+ for (let y = 0; y < box.height; y += TILE_HEIGHT) {
314
+ const height = Math.min(TILE_HEIGHT, box.height - y);
274
315
  const { data } = await client.send("Page.captureScreenshot", {
275
316
  format: "png",
276
317
  captureBeyondViewport: true,
277
- clip: { x: 0, y, width, height, scale: 1 },
318
+ clip: { x: box.x, y: box.y + y, width: box.width, height, scale: 1 },
278
319
  });
279
320
  tiles.push(Buffer.from(data, "base64"));
280
321
  }
281
322
  return sharp({
282
323
  create: {
283
- width,
284
- height: scrollHeight,
324
+ width: box.width,
325
+ height: box.height,
285
326
  channels: 4,
286
327
  background: MASK_COLOR,
287
328
  },
@@ -1 +1 @@
1
- {"version":3,"file":"capture.js","sourceRoot":"","sources":["../src/capture.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"capture.js","sourceRoot":"","sources":["../src/capture.ts"],"names":[],"mappings":"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"}
package/dist/cli.js CHANGED
@@ -29,6 +29,7 @@ function parseArgs(argv) {
29
29
  };
30
30
  const origins = [];
31
31
  const sel = {};
32
+ const state = {};
32
33
  for (let i = 0; i < argv.length; i++) {
33
34
  const raw = argv[i];
34
35
  // Accept both `--flag value` and `--flag=value`.
@@ -73,6 +74,14 @@ function parseArgs(argv) {
73
74
  throw new Error(`${v} needs a value`);
74
75
  sel[v === "--selector" ? "both" : v === "--left-selector" ? "left" : "right"] = s;
75
76
  }
77
+ else if (v === "--storage-state" ||
78
+ v === "--left-storage-state" ||
79
+ v === "--right-storage-state") {
80
+ const s = next();
81
+ if (!s)
82
+ throw new Error(`${v} needs a value`);
83
+ state[v === "--storage-state" ? "both" : v === "--left-storage-state" ? "left" : "right"] = s;
84
+ }
76
85
  else if (v === "--width") {
77
86
  const w = num("--width", next());
78
87
  if (w <= 0)
@@ -118,6 +127,9 @@ function parseArgs(argv) {
118
127
  }
119
128
  if (left && right)
120
129
  a.selector = { left, right };
130
+ if (state.both || state.left || state.right) {
131
+ a.storageState = { left: state.left ?? state.both, right: state.right ?? state.both };
132
+ }
121
133
  return a;
122
134
  }
123
135
  const HELP = `
@@ -136,8 +148,14 @@ const HELP = `
136
148
  With --selector, each side compares the one element it matches instead of the page;
137
149
  it must match exactly one. It applies to every route, over the config's own selectors.
138
150
 
151
+ With --storage-state, each side starts with that Playwright storage state (cookies,
152
+ localStorage), e.g. signed in. Make one with:
153
+ npx playwright codegen --save-storage=auth.json <url>
154
+ A before hook in the config runs on each page before it is shot, e.g. to open a menu.
155
+
139
156
  Writes report.html, results.json and crops of each change to --out. Exits 1 if a
140
- route errors or falls below --threshold, 2 on bad arguments or an origin that is down.
157
+ route falls below --threshold, 3 if one errored (unmeasured) or the run crashed, 2 on
158
+ bad arguments or an origin that is down. A diff without --threshold exits 0.
141
159
 
142
160
  Options
143
161
  --left <url> Left origin, instead of the first positional one.
@@ -145,11 +163,15 @@ const HELP = `
145
163
  --width <n> Viewport width; repeatable. Replaces the defaults.
146
164
  --threshold <0..1> Fail if any comparison scores below this.
147
165
  --out <dir> Output directory (default: ./renderdiff-out)
148
- --concurrency <n> Parallel workers (default: 2)
166
+ --concurrency <n> Parallel workers (default: half the cores, 2–8)
149
167
  --config <path> Config file. Default: renderdiff.config.{ts,mts,js,mjs} in cwd.
150
168
  --selector <sel> Compare one element (a Playwright selector) on both sides.
151
169
  --left-selector <sel>, --right-selector <sel>
152
170
  That side's selector, over --selector.
171
+ --storage-state <file>
172
+ Start both sides with this storage state JSON. Never commit it.
173
+ --left-storage-state <file>, --right-storage-state <file>
174
+ That side's storage state, over --storage-state.
153
175
  --dry-run Print the URL pairs and exit. No browser.
154
176
  --open Open the report when the run finishes.
155
177
  --progress A line per shot as it finishes. The default on a terminal;
@@ -234,7 +256,7 @@ if (!rawRoutes.length) {
234
256
  }
235
257
  let routes;
236
258
  try {
237
- routes = parseRoutes(rawRoutes, args.selector);
259
+ routes = parseRoutes(rawRoutes, args.selector, fileConfig.before);
238
260
  }
239
261
  catch (e) {
240
262
  die(e instanceof Error ? e.message : String(e));
@@ -261,6 +283,6 @@ try {
261
283
  }
262
284
  catch (e) {
263
285
  console.error(`✗ ${e instanceof Error ? e.message : String(e)}`);
264
- process.exit(1);
286
+ process.exit(3);
265
287
  }
266
288
  //# sourceMappingURL=cli.js.map
package/dist/cli.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"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"}