renderdiff 0.0.0-stage → 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/LICENSE +21 -0
- package/README.md +490 -2
- package/dist/capture.d.ts +34 -0
- package/dist/capture.js +338 -0
- package/dist/capture.js.map +1 -0
- package/dist/cli.d.ts +2 -0
- package/dist/cli.js +288 -0
- package/dist/cli.js.map +1 -0
- package/dist/compare.d.ts +93 -0
- package/dist/compare.js +537 -0
- package/dist/compare.js.map +1 -0
- package/dist/config.d.ts +223 -0
- package/dist/config.js +388 -0
- package/dist/config.js.map +1 -0
- package/dist/format.d.ts +20 -0
- package/dist/format.js +26 -0
- package/dist/format.js.map +1 -0
- package/dist/index.d.ts +15 -0
- package/dist/index.js +16 -0
- package/dist/index.js.map +1 -0
- package/dist/locate.d.ts +24 -0
- package/dist/locate.js +316 -0
- package/dist/locate.js.map +1 -0
- package/dist/report.d.ts +118 -0
- package/dist/report.js +192 -0
- package/dist/report.js.map +1 -0
- package/dist/run.d.ts +17 -0
- package/dist/run.js +390 -0
- package/dist/run.js.map +1 -0
- package/package.json +59 -4
- package/renderdiff.config.example.ts +111 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"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"}
|
package/dist/format.d.ts
ADDED
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import type { ElementDiff } from "./locate.ts";
|
|
2
|
+
/** Number formatting shared by the console summary (`run.ts`) and the HTML report. */
|
|
3
|
+
/** Down to 4 decimals, so a shot that differs never reads as 100% or clears a threshold it missed. The epsilon absorbs float error like 0.29 * 1e4 = 2899.99…. */
|
|
4
|
+
export declare const floor4: (n: number) => number;
|
|
5
|
+
export declare const pct: (n: number) => string;
|
|
6
|
+
export declare const signed: (n: number) => string;
|
|
7
|
+
export declare const fmtRegion: (r: {
|
|
8
|
+
x: number;
|
|
9
|
+
y: number;
|
|
10
|
+
w: number;
|
|
11
|
+
h: number;
|
|
12
|
+
}) => string;
|
|
13
|
+
/** Signed like the height delta: + when left has the extra rows, − when right does. */
|
|
14
|
+
export declare const fmtBand: (b: {
|
|
15
|
+
side: "left" | "right";
|
|
16
|
+
y: number;
|
|
17
|
+
h: number;
|
|
18
|
+
}) => string;
|
|
19
|
+
/** `+sel "text"` / `-sel "text"` for one side only, `sel prop l→r`, else its box deltas (left − right). */
|
|
20
|
+
export declare const fmtElements: (els: ElementDiff[], props?: number) => string;
|
package/dist/format.js
ADDED
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
/** Number formatting shared by the console summary (`run.ts`) and the HTML report. */
|
|
2
|
+
/** Down to 4 decimals, so a shot that differs never reads as 100% or clears a threshold it missed. The epsilon absorbs float error like 0.29 * 1e4 = 2899.99…. */
|
|
3
|
+
export const floor4 = (n) => Math.floor(n * 1e4 + 1e-7) / 1e4;
|
|
4
|
+
export const pct = (n) => `${(floor4(n) * 100).toFixed(2)}%`;
|
|
5
|
+
export const signed = (n) => (n > 0 ? `+${n}` : `${n}`);
|
|
6
|
+
export const fmtRegion = (r) => `${r.w}×${r.h} at (${r.x},${r.y})`;
|
|
7
|
+
/** Signed like the height delta: + when left has the extra rows, − when right does. */
|
|
8
|
+
export const fmtBand = (b) => `${b.side === "left" ? "+" : "-"}${b.h}px at y=${b.y} (${b.side})`;
|
|
9
|
+
/** `+sel "text"` / `-sel "text"` for one side only, `sel prop l→r`, else its box deltas (left − right). */
|
|
10
|
+
export const fmtElements = (els, props = 2) => els
|
|
11
|
+
.map((e) => {
|
|
12
|
+
if (e.side !== "both")
|
|
13
|
+
return `${e.side === "left" ? "+" : "-"}${e.selector}${e.text ? ` "${e.text}"` : ""}`;
|
|
14
|
+
const changed = Object.entries(e.changed)
|
|
15
|
+
.slice(0, props)
|
|
16
|
+
.map(([p, [l, r]]) => (p === "text" ? `"${l}"→"${r}"` : `${p} ${l}→${r}`));
|
|
17
|
+
if (changed.length)
|
|
18
|
+
return `${e.selector} ${changed.join(", ")}`;
|
|
19
|
+
const moved = ["x", "y", "w", "h"].flatMap((k) => {
|
|
20
|
+
const d = e.left[k] - e.right[k];
|
|
21
|
+
return d ? [`${k}${signed(d)}`] : [];
|
|
22
|
+
});
|
|
23
|
+
return [e.selector, ...moved].join(" ");
|
|
24
|
+
})
|
|
25
|
+
.join("; ");
|
|
26
|
+
//# sourceMappingURL=format.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"format.js","sourceRoot":"","sources":["../src/format.ts"],"names":[],"mappings":"AAEA,sFAAsF;AACtF,kKAAkK;AAClK,MAAM,CAAC,MAAM,MAAM,GAAG,CAAC,CAAS,EAAE,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,GAAG,GAAG,GAAG,IAAI,CAAC,GAAG,GAAG,CAAC;AACtE,MAAM,CAAC,MAAM,GAAG,GAAG,CAAC,CAAS,EAAE,EAAE,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,GAAG,GAAG,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,CAAC;AACrE,MAAM,CAAC,MAAM,MAAM,GAAG,CAAC,CAAS,EAAE,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;AAChE,MAAM,CAAC,MAAM,SAAS,GAAG,CAAC,CAAiD,EAAE,EAAE,CAC7E,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,GAAG,CAAC;AACrC,uFAAuF;AACvF,MAAM,CAAC,MAAM,OAAO,GAAG,CAAC,CAAmD,EAAE,EAAE,CAC7E,GAAG,CAAC,CAAC,IAAI,KAAK,MAAM,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,IAAI,GAAG,CAAC;AAErE,2GAA2G;AAC3G,MAAM,CAAC,MAAM,WAAW,GAAG,CAAC,GAAkB,EAAE,KAAK,GAAG,CAAC,EAAE,EAAE,CAC3D,GAAG;KACA,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE;IACT,IAAI,CAAC,CAAC,IAAI,KAAK,MAAM;QACnB,OAAO,GAAG,CAAC,CAAC,IAAI,KAAK,MAAM,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,GAAG,CAAC,CAAC,QAAQ,GAAG,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,IAAI,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC;IACxF,MAAM,OAAO,GAAG,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,OAAO,CAAC;SACtC,KAAK,CAAC,CAAC,EAAE,KAAK,CAAC;SACf,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC;IAC7E,IAAI,OAAO,CAAC,MAAM;QAAE,OAAO,GAAG,CAAC,CAAC,QAAQ,IAAI,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;IACjE,MAAM,KAAK,GAAI,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,CAAW,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,EAAE;QAC1D,MAAM,CAAC,GAAG,CAAC,CAAC,IAAK,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,KAAM,CAAC,CAAC,CAAC,CAAC;QACnC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,GAAG,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;IACvC,CAAC,CAAC,CAAC;IACH,OAAO,CAAC,CAAC,CAAC,QAAQ,EAAE,GAAG,KAAK,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AAC1C,CAAC,CAAC;KACD,IAAI,CAAC,IAAI,CAAC,CAAC"}
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Library entry point. The CLI (`dist/cli.js`) is the primary interface; this exists so
|
|
3
|
+
* a config file can be type-checked:
|
|
4
|
+
*
|
|
5
|
+
* import { defineConfig } from "renderdiff";
|
|
6
|
+
* export default defineConfig({ … });
|
|
7
|
+
*
|
|
8
|
+
* That import only resolves when `renderdiff` is also installed in the project (or linked) —
|
|
9
|
+
* a globally-installed CLI is not importable from an arbitrary directory. A plain
|
|
10
|
+
* object export works everywhere and needs nothing from this module.
|
|
11
|
+
*/
|
|
12
|
+
export { defineConfig, DEFAULT_BLOCK_URL_PATTERNS, DEFAULT_CONCURRENCY, DEFAULT_HIDE_SELECTORS, DEFAULT_OUT_DIR, DEFAULT_WIDTHS, MASK_COLOR, type Hook, type Mask, type ResolvedConfig, type Route, type RouteSpec, type Sides, type RenderdiffConfig, } from "./config.ts";
|
|
13
|
+
export { type ComparedResult, type CropResult, type ErrorResult, type Results, type RouteResult, type RunMeta, type Summary, } from "./report.ts";
|
|
14
|
+
export { type Band, type Box, type Region, type TextDiff } from "./compare.ts";
|
|
15
|
+
export { type ElementDiff } from "./locate.ts";
|
package/dist/index.js
ADDED
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Library entry point. The CLI (`dist/cli.js`) is the primary interface; this exists so
|
|
3
|
+
* a config file can be type-checked:
|
|
4
|
+
*
|
|
5
|
+
* import { defineConfig } from "renderdiff";
|
|
6
|
+
* export default defineConfig({ … });
|
|
7
|
+
*
|
|
8
|
+
* That import only resolves when `renderdiff` is also installed in the project (or linked) —
|
|
9
|
+
* a globally-installed CLI is not importable from an arbitrary directory. A plain
|
|
10
|
+
* object export works everywhere and needs nothing from this module.
|
|
11
|
+
*/
|
|
12
|
+
export { defineConfig, DEFAULT_BLOCK_URL_PATTERNS, DEFAULT_CONCURRENCY, DEFAULT_HIDE_SELECTORS, DEFAULT_OUT_DIR, DEFAULT_WIDTHS, MASK_COLOR, } from "./config.js";
|
|
13
|
+
export {} from "./report.js";
|
|
14
|
+
export {} from "./compare.js";
|
|
15
|
+
export {} from "./locate.js";
|
|
16
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AACH,OAAO,EACL,YAAY,EACZ,0BAA0B,EAC1B,mBAAmB,EACnB,sBAAsB,EACtB,eAAe,EACf,cAAc,EACd,UAAU,GAQX,MAAM,aAAa,CAAC;AAErB,OAAO,EAQN,MAAM,aAAa,CAAC;AAErB,OAAO,EAAmD,MAAM,cAAc,CAAC;AAC/E,OAAO,EAAoB,MAAM,aAAa,CAAC"}
|
package/dist/locate.d.ts
ADDED
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import type { Locator, Page } from "playwright";
|
|
2
|
+
import type { Shot } from "./capture.ts";
|
|
3
|
+
import type { Box, Spot } from "./compare.ts";
|
|
4
|
+
/** Names the DOM elements behind each change, from the pages still holding the shot's document. */
|
|
5
|
+
/** A DOM element behind a change. Boxes in that side's page px (element px for a selector route). */
|
|
6
|
+
export interface ElementDiff {
|
|
7
|
+
/** CSS selector, unique on the side(s) it names; usable as --selector or querySelector. */
|
|
8
|
+
selector: string;
|
|
9
|
+
/** Where it exists: "left" only in your change, "right" only in the reference. */
|
|
10
|
+
side: "both" | "left" | "right";
|
|
11
|
+
left: Box | null;
|
|
12
|
+
right: Box | null;
|
|
13
|
+
/** Computed properties that differ, [left, right], most telling first; `text` when its text does. */
|
|
14
|
+
changed: Record<string, [string, string]>;
|
|
15
|
+
/** The start of its text (left's when both), "" if none. */
|
|
16
|
+
text: string;
|
|
17
|
+
/** The right side's selector, when it was found by its text under a different one. */
|
|
18
|
+
rightSelector?: string;
|
|
19
|
+
}
|
|
20
|
+
/**
|
|
21
|
+
* The elements behind each of the first `MAX_SPOTS` spots, in spot order. Each side picks the
|
|
22
|
+
* elements that best fill its box, then the other side looks for each by selector.
|
|
23
|
+
*/
|
|
24
|
+
export declare function locate(pages: [Page, Page], shots: [Shot, Shot], spots: Spot[], masks: [Locator[], Locator[]]): Promise<ElementDiff[][]>;
|
package/dist/locate.js
ADDED
|
@@ -0,0 +1,316 @@
|
|
|
1
|
+
const MAX_SPOTS = 5;
|
|
2
|
+
const PER_SPOT = 3;
|
|
3
|
+
const MAX_CHANGED = 6;
|
|
4
|
+
/** Layout first; width and height last, since they are usually a consequence. */
|
|
5
|
+
const PROPS = [
|
|
6
|
+
"display",
|
|
7
|
+
"position",
|
|
8
|
+
"float",
|
|
9
|
+
"flex-direction",
|
|
10
|
+
"flex-wrap",
|
|
11
|
+
"justify-content",
|
|
12
|
+
"align-items",
|
|
13
|
+
"gap",
|
|
14
|
+
"grid-template-columns",
|
|
15
|
+
"margin-top",
|
|
16
|
+
"margin-right",
|
|
17
|
+
"margin-bottom",
|
|
18
|
+
"margin-left",
|
|
19
|
+
"padding-top",
|
|
20
|
+
"padding-right",
|
|
21
|
+
"padding-bottom",
|
|
22
|
+
"padding-left",
|
|
23
|
+
"border-top-width",
|
|
24
|
+
"border-right-width",
|
|
25
|
+
"border-bottom-width",
|
|
26
|
+
"border-left-width",
|
|
27
|
+
"font-family",
|
|
28
|
+
"font-size",
|
|
29
|
+
"font-weight",
|
|
30
|
+
"line-height",
|
|
31
|
+
"letter-spacing",
|
|
32
|
+
"text-align",
|
|
33
|
+
"text-transform",
|
|
34
|
+
"white-space",
|
|
35
|
+
"color",
|
|
36
|
+
"background-color",
|
|
37
|
+
"background-image",
|
|
38
|
+
"border-top-color",
|
|
39
|
+
"border-top-left-radius",
|
|
40
|
+
"box-shadow",
|
|
41
|
+
"opacity",
|
|
42
|
+
"transform",
|
|
43
|
+
"visibility",
|
|
44
|
+
"z-index",
|
|
45
|
+
"width",
|
|
46
|
+
"height",
|
|
47
|
+
];
|
|
48
|
+
/** Runs in the page. At scroll 0 a client rect is page px, below the fold too. */
|
|
49
|
+
function probe({ boxes, find, masked, props, perSpot }) {
|
|
50
|
+
const MAX_SCAN = 50_000;
|
|
51
|
+
const HASHED = /\d{3,}|^(css|sc|jsx|svelte)-|__[\w-]{5,}$|^_/;
|
|
52
|
+
const TEST = ["data-testid", "data-test", "data-test-id", "data-cy", "data-qa"];
|
|
53
|
+
const quote = (n, v) =>
|
|
54
|
+
// oxlint-disable-next-line no-control-regex -- CSS strings must escape control characters
|
|
55
|
+
`[${n}="${v.replace(/["\\]/g, "\\$&").replace(/[\0-\x1f\x7f]/g, (c) => `\\${c.charCodeAt(0).toString(16)} `)}"]`;
|
|
56
|
+
const unique = (s) => document.querySelectorAll(s).length === 1;
|
|
57
|
+
const snippet = (e) => (e.innerText ?? e.textContent ?? "").replace(/\s+/g, " ").trim().slice(0, 40);
|
|
58
|
+
const part = (e) => {
|
|
59
|
+
const tag = e.localName;
|
|
60
|
+
let s = CSS.escape(tag);
|
|
61
|
+
const href = e.getAttribute("href");
|
|
62
|
+
if (tag === "a" && href && href.length < 60 && !href.startsWith("javascript:"))
|
|
63
|
+
s += quote("href", href);
|
|
64
|
+
else {
|
|
65
|
+
for (const n of ["name", "aria-label", ...(tag === "input" ? ["type"] : [])]) {
|
|
66
|
+
const v = e.getAttribute(n);
|
|
67
|
+
if (v && v.length < 60) {
|
|
68
|
+
s += quote(n, v);
|
|
69
|
+
break;
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
// ponytail: hashed-class heuristic, attributes and nth-of-type are the fallback
|
|
74
|
+
s += Array.from(e.classList)
|
|
75
|
+
.filter((c) => !HASHED.test(c))
|
|
76
|
+
.slice(0, 2)
|
|
77
|
+
.map((c) => `.${CSS.escape(c)}`)
|
|
78
|
+
.join("");
|
|
79
|
+
const siblings = e.parentElement ? Array.from(e.parentElement.children) : [];
|
|
80
|
+
if (siblings.some((c) => c !== e && c.matches(s))) {
|
|
81
|
+
s += `:nth-of-type(${siblings.filter((c) => c.localName === tag).indexOf(e) + 1})`;
|
|
82
|
+
}
|
|
83
|
+
return s;
|
|
84
|
+
};
|
|
85
|
+
const selector = (e) => {
|
|
86
|
+
if (e.id && unique(`#${CSS.escape(e.id)}`))
|
|
87
|
+
return `#${CSS.escape(e.id)}`;
|
|
88
|
+
for (const n of TEST) {
|
|
89
|
+
const v = e.getAttribute(n);
|
|
90
|
+
if (v && unique(e.localName + quote(n, v)))
|
|
91
|
+
return e.localName + quote(n, v);
|
|
92
|
+
}
|
|
93
|
+
let path = "";
|
|
94
|
+
for (let n = e; n && n !== document.documentElement; n = n.parentElement) {
|
|
95
|
+
if (n !== e && n.id && unique(`#${CSS.escape(n.id)}`))
|
|
96
|
+
return `#${CSS.escape(n.id)} > ${path}`;
|
|
97
|
+
path = path ? `${part(n)} > ${path}` : part(n);
|
|
98
|
+
if (unique(path))
|
|
99
|
+
break;
|
|
100
|
+
}
|
|
101
|
+
return path;
|
|
102
|
+
};
|
|
103
|
+
const seen = (e) => {
|
|
104
|
+
const r = e.getBoundingClientRect();
|
|
105
|
+
const cs = getComputedStyle(e);
|
|
106
|
+
return {
|
|
107
|
+
sel: selector(e),
|
|
108
|
+
tag: e.localName,
|
|
109
|
+
text: snippet(e),
|
|
110
|
+
box: {
|
|
111
|
+
x: Math.round(r.x),
|
|
112
|
+
y: Math.round(r.y),
|
|
113
|
+
w: Math.round(r.width),
|
|
114
|
+
h: Math.round(r.height),
|
|
115
|
+
},
|
|
116
|
+
styles: props.map((p) => cs.getPropertyValue(p)),
|
|
117
|
+
};
|
|
118
|
+
};
|
|
119
|
+
const hit = (e) => {
|
|
120
|
+
const parent = e.parentElement;
|
|
121
|
+
return {
|
|
122
|
+
...seen(e),
|
|
123
|
+
prev: e.previousElementSibling ? seen(e.previousElementSibling) : null,
|
|
124
|
+
parent: parent && parent !== document.body ? seen(parent) : null,
|
|
125
|
+
};
|
|
126
|
+
};
|
|
127
|
+
const all = [];
|
|
128
|
+
const hidden = new Set();
|
|
129
|
+
for (const m of masked)
|
|
130
|
+
[m, ...Array.from(m.querySelectorAll("*"))].forEach((e) => hidden.add(e));
|
|
131
|
+
const els = document.body?.querySelectorAll("*") ?? [];
|
|
132
|
+
for (let i = 0; i < els.length && i < MAX_SCAN; i++) {
|
|
133
|
+
const e = els[i];
|
|
134
|
+
if (e.ownerSVGElement || hidden.has(e))
|
|
135
|
+
continue;
|
|
136
|
+
const r = e.getBoundingClientRect();
|
|
137
|
+
if (r.width && r.height)
|
|
138
|
+
all.push({ e, r });
|
|
139
|
+
}
|
|
140
|
+
const picks = boxes.map((b) => {
|
|
141
|
+
if (!b)
|
|
142
|
+
return [];
|
|
143
|
+
const ranked = all
|
|
144
|
+
.map(({ e, r }) => {
|
|
145
|
+
const ix = Math.min(r.right, b.x + b.w) - Math.max(r.left, b.x);
|
|
146
|
+
const iy = Math.min(r.bottom, b.y + b.h) - Math.max(r.top, b.y);
|
|
147
|
+
return {
|
|
148
|
+
e,
|
|
149
|
+
r,
|
|
150
|
+
ix,
|
|
151
|
+
iy,
|
|
152
|
+
area: r.width * r.height,
|
|
153
|
+
score: ix > 0 && iy > 0 ? (ix * iy) / Math.max(r.width * r.height, b.w * b.h) : 0,
|
|
154
|
+
};
|
|
155
|
+
})
|
|
156
|
+
.filter((c) => c.score > 0)
|
|
157
|
+
.sort((p, q) => q.score - p.score || p.area - q.area)
|
|
158
|
+
.slice(0, 10)
|
|
159
|
+
.filter((c) => c.e.checkVisibility?.({ opacityProperty: true, visibilityProperty: true }) ?? true);
|
|
160
|
+
for (const c of ranked) {
|
|
161
|
+
const cx = Math.max(c.r.left, b.x) + c.ix / 2;
|
|
162
|
+
const cy = Math.max(c.r.top, b.y) + c.iy / 2;
|
|
163
|
+
if (cy >= innerHeight || cx >= innerWidth)
|
|
164
|
+
continue;
|
|
165
|
+
// Something painted over it there, e.g. fixed chrome.
|
|
166
|
+
const top = document.elementFromPoint(cx, cy);
|
|
167
|
+
if (top && top !== c.e && !c.e.contains(top) && !top.contains(c.e))
|
|
168
|
+
c.score *= 0.25;
|
|
169
|
+
}
|
|
170
|
+
ranked.sort((p, q) => q.score - p.score || p.area - q.area);
|
|
171
|
+
const chosen = [];
|
|
172
|
+
for (const { e } of ranked) {
|
|
173
|
+
if (chosen.length === perSpot)
|
|
174
|
+
break;
|
|
175
|
+
if (chosen.some((p) => p.contains(e) || e.contains(p)))
|
|
176
|
+
continue;
|
|
177
|
+
chosen.push(e);
|
|
178
|
+
}
|
|
179
|
+
return chosen.map(hit);
|
|
180
|
+
});
|
|
181
|
+
const found = find.map(({ sel, tag, text, y, w, h, box }) => {
|
|
182
|
+
let e = null;
|
|
183
|
+
try {
|
|
184
|
+
e = document.querySelector(sel);
|
|
185
|
+
}
|
|
186
|
+
catch { }
|
|
187
|
+
if (e && text && snippet(e) !== text)
|
|
188
|
+
e = null;
|
|
189
|
+
// With no text to check, nth-of-type may now name a different element: require its shape and place.
|
|
190
|
+
if (e && !text) {
|
|
191
|
+
const r = e.getBoundingClientRect();
|
|
192
|
+
const near = !box ||
|
|
193
|
+
(r.right > box.x && r.left < box.x + box.w && r.bottom > box.y && r.top < box.y + box.h);
|
|
194
|
+
if (e.localName !== tag || Math.abs(r.width - w) > 4 || Math.abs(r.height - h) > 4 || !near)
|
|
195
|
+
e = null;
|
|
196
|
+
}
|
|
197
|
+
// An insertion shifts nth-of-type, so fall back to the same tag with the same text.
|
|
198
|
+
if (!e && text) {
|
|
199
|
+
const same = Array.from(document.querySelectorAll(tag)).filter((c) => snippet(c) === text);
|
|
200
|
+
e =
|
|
201
|
+
same.sort((p, q) => Math.abs(p.getBoundingClientRect().y - y) - Math.abs(q.getBoundingClientRect().y - y))[0] ?? null;
|
|
202
|
+
}
|
|
203
|
+
return e ? hit(e) : null;
|
|
204
|
+
});
|
|
205
|
+
return { picks, found };
|
|
206
|
+
}
|
|
207
|
+
function element([l, r], origins) {
|
|
208
|
+
const changed = {};
|
|
209
|
+
if (l && r) {
|
|
210
|
+
if (l.text !== r.text)
|
|
211
|
+
changed.text = [l.text, r.text];
|
|
212
|
+
PROPS.forEach((p, i) => {
|
|
213
|
+
if (l.styles[i] !== r.styles[i])
|
|
214
|
+
changed[p] = [l.styles[i], r.styles[i]];
|
|
215
|
+
});
|
|
216
|
+
}
|
|
217
|
+
const at = (s, o) => s && { ...s.box, x: s.box.x - o.x, y: s.box.y - o.y };
|
|
218
|
+
return {
|
|
219
|
+
selector: (l ?? r).sel,
|
|
220
|
+
side: l && r ? "both" : l ? "left" : "right",
|
|
221
|
+
left: at(l, origins[0]),
|
|
222
|
+
right: at(r, origins[1]),
|
|
223
|
+
changed: Object.fromEntries(Object.entries(changed).slice(0, MAX_CHANGED)),
|
|
224
|
+
text: (l ?? r).text,
|
|
225
|
+
...(l && r && l.sel !== r.sel ? { rightSelector: r.sel } : {}),
|
|
226
|
+
};
|
|
227
|
+
}
|
|
228
|
+
/** Without text to compare, a selector naming both is only the same element if the box agrees. */
|
|
229
|
+
const same = (a, b) => !!(a.text || b.text) ||
|
|
230
|
+
(a.tag === b.tag && Math.abs(a.box.w - b.box.w) <= 4 && Math.abs(a.box.h - b.box.h) <= 4);
|
|
231
|
+
const moved = (a, b) => a.x !== b.x || a.y !== b.y || a.w !== b.w || a.h !== b.h;
|
|
232
|
+
/**
|
|
233
|
+
* The elements behind each of the first `MAX_SPOTS` spots, in spot order. Each side picks the
|
|
234
|
+
* elements that best fill its box, then the other side looks for each by selector.
|
|
235
|
+
*/
|
|
236
|
+
export async function locate(pages, shots, spots, masks) {
|
|
237
|
+
const todo = spots.slice(0, MAX_SPOTS);
|
|
238
|
+
if (!todo.length)
|
|
239
|
+
return [];
|
|
240
|
+
const masked = await Promise.all(masks.map(async (ls) => (await Promise.all(ls.map((l) => l.elementHandles()))).flat()));
|
|
241
|
+
const boxes = (s) => todo.map((t) => {
|
|
242
|
+
const b = s ? t.right : t.left;
|
|
243
|
+
const o = shots[s].origin;
|
|
244
|
+
return b.w && b.h ? { ...b, x: b.x + o.x, y: b.y + o.y } : null;
|
|
245
|
+
});
|
|
246
|
+
const run = (s, find) => pages[s].evaluate(probe, {
|
|
247
|
+
boxes: find.length ? [] : boxes(s),
|
|
248
|
+
find,
|
|
249
|
+
masked: masked[s],
|
|
250
|
+
props: PROPS,
|
|
251
|
+
perSpot: PER_SPOT,
|
|
252
|
+
});
|
|
253
|
+
const [l, r] = await Promise.all([run(0, []), run(1, [])]);
|
|
254
|
+
const picks = [l.picks, r.picks];
|
|
255
|
+
// Each side looks for what only the other picked.
|
|
256
|
+
const asks = [0, 1].map((s) => picks[1 - s].flatMap((hits, i) => hits
|
|
257
|
+
.filter((h) => !picks[s][i].some((o) => o.sel === h.sel && same(o, h)))
|
|
258
|
+
.map((h) => ({ i, h }))));
|
|
259
|
+
const answers = await Promise.all([0, 1].map((s) => asks[s].length
|
|
260
|
+
? run(s, asks[s].map(({ i, h }) => ({
|
|
261
|
+
sel: h.sel,
|
|
262
|
+
tag: h.tag,
|
|
263
|
+
text: h.text,
|
|
264
|
+
y: h.box.y,
|
|
265
|
+
w: h.box.w,
|
|
266
|
+
h: h.box.h,
|
|
267
|
+
box: boxes(s)[i],
|
|
268
|
+
}))).then((a) => a.found)
|
|
269
|
+
: []));
|
|
270
|
+
return todo.map((spot, i) => {
|
|
271
|
+
const pairs = [];
|
|
272
|
+
const keys = new Set();
|
|
273
|
+
for (const s of [0, 1]) {
|
|
274
|
+
for (const h of picks[s][i]) {
|
|
275
|
+
const k = asks[1 - s].findIndex((a) => a.i === i && a.h === h);
|
|
276
|
+
const other = picks[1 - s][i].find((o) => o.sel === h.sel && same(o, h)) ??
|
|
277
|
+
(k >= 0 ? answers[1 - s][k] : null);
|
|
278
|
+
const pair = s ? [other, h] : [h, other];
|
|
279
|
+
const key = `${pair[0]?.sel}\n${pair[1]?.sel}`;
|
|
280
|
+
if (!keys.has(key)) {
|
|
281
|
+
keys.add(key);
|
|
282
|
+
pairs.push(pair);
|
|
283
|
+
}
|
|
284
|
+
}
|
|
285
|
+
}
|
|
286
|
+
const out = [];
|
|
287
|
+
for (const [a, b] of pairs.slice(0, PER_SPOT)) {
|
|
288
|
+
const el = element([a, b], [shots[0].origin, shots[1].origin]);
|
|
289
|
+
out.push(el);
|
|
290
|
+
// ponytail: one level of cause; a deeper cascade search if agents ask for it
|
|
291
|
+
if (el.left && el.right && !Object.keys(el.changed).length && moved(el.left, el.right)) {
|
|
292
|
+
for (const [p, q] of [
|
|
293
|
+
[a.prev, b.prev],
|
|
294
|
+
[a.parent, b.parent],
|
|
295
|
+
]) {
|
|
296
|
+
if (!p || !q || p.sel !== q.sel)
|
|
297
|
+
continue;
|
|
298
|
+
const cause = element([p, q], [shots[0].origin, shots[1].origin]);
|
|
299
|
+
if (Object.keys(cause.changed).length &&
|
|
300
|
+
!out.some((o) => o.selector === cause.selector)) {
|
|
301
|
+
out.push(cause);
|
|
302
|
+
break;
|
|
303
|
+
}
|
|
304
|
+
}
|
|
305
|
+
}
|
|
306
|
+
}
|
|
307
|
+
const unique = out.filter((e, j) => out.findIndex((o) => o.selector === e.selector) === j);
|
|
308
|
+
// A band's rows are what one side added; an element on both sides there was only pushed.
|
|
309
|
+
if (spot.kind === "band")
|
|
310
|
+
return unique.filter((e) => e.side !== "both");
|
|
311
|
+
// Unchanged and unmoved, e.g. covered by what changed: noise beside anything that explains.
|
|
312
|
+
const telling = unique.filter((e) => e.side !== "both" || Object.keys(e.changed).length || moved(e.left, e.right));
|
|
313
|
+
return telling.length ? telling : unique;
|
|
314
|
+
});
|
|
315
|
+
}
|
|
316
|
+
//# sourceMappingURL=locate.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"locate.js","sourceRoot":"","sources":["../src/locate.ts"],"names":[],"mappings":"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"}
|
package/dist/report.d.ts
ADDED
|
@@ -0,0 +1,118 @@
|
|
|
1
|
+
import type { Band, Box, Region, TextDiff } from "./compare.ts";
|
|
2
|
+
import { type ResolvedConfig, type Sides } from "./config.ts";
|
|
3
|
+
interface BaseResult {
|
|
4
|
+
/** The route: `/a`, or `/a::/b` for a pair. */
|
|
5
|
+
url: string;
|
|
6
|
+
/** The path loaded on each side; both equal `url` unless it is a pair. */
|
|
7
|
+
left: string;
|
|
8
|
+
right: string;
|
|
9
|
+
/** The element compared on each side; null for the whole page. */
|
|
10
|
+
selector: Sides | null;
|
|
11
|
+
/** A `before` hook ran on both sides before the shot, so the page was measured in its state. */
|
|
12
|
+
hook: boolean;
|
|
13
|
+
width: number;
|
|
14
|
+
}
|
|
15
|
+
/** A route that was captured on both sides and diffed. */
|
|
16
|
+
export interface ComparedResult extends BaseResult {
|
|
17
|
+
status: "compared";
|
|
18
|
+
score: number;
|
|
19
|
+
diffPixels: number;
|
|
20
|
+
totalPixels: number;
|
|
21
|
+
heightDelta: number;
|
|
22
|
+
widthDelta: number;
|
|
23
|
+
/** Pixels that changed between shots of the same load, painted out on both sides. */
|
|
24
|
+
unstablePixels: number;
|
|
25
|
+
/** Connected diff patches, largest first. */
|
|
26
|
+
regions: Region[];
|
|
27
|
+
/** Rows only one side has; null when the rows were too different to align. */
|
|
28
|
+
bands: Band[] | null;
|
|
29
|
+
/** Score over the rows the alignment pairs; null unless there are bands. */
|
|
30
|
+
alignedScore: number | null;
|
|
31
|
+
/** innerText line diff; `added` is on left only, `removed` on right only. */
|
|
32
|
+
text: TextDiff;
|
|
33
|
+
/** Paths relative to the out dir. */
|
|
34
|
+
images: {
|
|
35
|
+
left: string;
|
|
36
|
+
right: string;
|
|
37
|
+
diff: string;
|
|
38
|
+
};
|
|
39
|
+
/** At most three: bands, tallest first, then the largest regions. Not one per region. */
|
|
40
|
+
crops: CropResult[];
|
|
41
|
+
}
|
|
42
|
+
/** A crop of one change: left and right panels, a 1px red box round it, or a 2px red seam. */
|
|
43
|
+
export interface CropResult {
|
|
44
|
+
/** `{slug}.{width}.c{n}.png`, relative to the out dir. */
|
|
45
|
+
path: string;
|
|
46
|
+
kind: "band" | "region";
|
|
47
|
+
/** The change on each side, in that side's page px. `h` 0 is where the other side's band would go. */
|
|
48
|
+
left: Box;
|
|
49
|
+
right: Box;
|
|
50
|
+
/** Left is always on top (`stacked`) or on the left (`side`). */
|
|
51
|
+
layout: "stacked" | "side";
|
|
52
|
+
/** 1 is native; never below 0.75. */
|
|
53
|
+
scale: number;
|
|
54
|
+
/** Only the top rows (or left columns) of the change fit. */
|
|
55
|
+
clipped: boolean;
|
|
56
|
+
}
|
|
57
|
+
/** A route that threw before it could be diffed — neither a pass nor a fail. */
|
|
58
|
+
export interface ErrorResult extends BaseResult {
|
|
59
|
+
status: "error";
|
|
60
|
+
error: string;
|
|
61
|
+
}
|
|
62
|
+
export type RouteResult = ComparedResult | ErrorResult;
|
|
63
|
+
export interface RunMeta {
|
|
64
|
+
tool: "renderdiff";
|
|
65
|
+
version: string;
|
|
66
|
+
generatedAt: string;
|
|
67
|
+
left: string;
|
|
68
|
+
right: string;
|
|
69
|
+
widths: number[];
|
|
70
|
+
threshold: number | null;
|
|
71
|
+
/** The instant both sides' clocks start at on every load, ISO. */
|
|
72
|
+
clock: string;
|
|
73
|
+
blockUrlPatterns: string[];
|
|
74
|
+
hideSelectors: string[];
|
|
75
|
+
/** `urlPath` is absent for a mask that applies to every route. */
|
|
76
|
+
masks: {
|
|
77
|
+
urlPath?: string;
|
|
78
|
+
reason: string;
|
|
79
|
+
}[];
|
|
80
|
+
/** `chromium` (bundled), or `chrome` when that failed to launch and the system Chrome did. */
|
|
81
|
+
browser: {
|
|
82
|
+
name: string;
|
|
83
|
+
version: string;
|
|
84
|
+
};
|
|
85
|
+
/** The storage state file's basename per side, or null. Never its contents. */
|
|
86
|
+
storageState: {
|
|
87
|
+
left: string | null;
|
|
88
|
+
right: string | null;
|
|
89
|
+
};
|
|
90
|
+
}
|
|
91
|
+
export interface Summary {
|
|
92
|
+
compared: number;
|
|
93
|
+
errors: number;
|
|
94
|
+
/** Null when nothing was compared. */
|
|
95
|
+
mean: number | null;
|
|
96
|
+
worst: {
|
|
97
|
+
url: string;
|
|
98
|
+
width: number;
|
|
99
|
+
score: number;
|
|
100
|
+
} | null;
|
|
101
|
+
/** Comparisons under `meta.threshold`; 0 when no threshold was set. */
|
|
102
|
+
belowThreshold: number;
|
|
103
|
+
}
|
|
104
|
+
/** The shape of `results.json`, written to the out dir on every run. */
|
|
105
|
+
export interface Results {
|
|
106
|
+
meta: RunMeta;
|
|
107
|
+
results: RouteResult[];
|
|
108
|
+
summary: Summary;
|
|
109
|
+
}
|
|
110
|
+
/** Sort ascending by score; surface the mean and the worst (lowest-scoring) row. */
|
|
111
|
+
export declare function stats(rows: ComparedResult[]): {
|
|
112
|
+
sorted: ComparedResult[];
|
|
113
|
+
mean: number;
|
|
114
|
+
worst: ComparedResult;
|
|
115
|
+
};
|
|
116
|
+
export declare function writeResults(results: RouteResult[], meta: RunMeta, outDir: string): string;
|
|
117
|
+
export declare function writeReport(results: RouteResult[], meta: RunMeta, cfg: ResolvedConfig): Promise<string>;
|
|
118
|
+
export {};
|