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":"compare.js","sourceRoot":"","sources":["../src/compare.ts"],"names":[],"mappings":"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"}
|
package/dist/config.d.ts
ADDED
|
@@ -0,0 +1,223 @@
|
|
|
1
|
+
import type { Locator, Page } from "playwright";
|
|
2
|
+
/**
|
|
3
|
+
* Configuration: built-in defaults, the user-facing `RenderdiffConfig` shape, and the
|
|
4
|
+
* loader that merges a `renderdiff.config.*` file into a `ResolvedConfig`.
|
|
5
|
+
*
|
|
6
|
+
* Precedence is always: CLI flag > config file > built-in default.
|
|
7
|
+
*/
|
|
8
|
+
/** A Playwright selector per side. */
|
|
9
|
+
export type Sides = {
|
|
10
|
+
left: string;
|
|
11
|
+
right: string;
|
|
12
|
+
};
|
|
13
|
+
/**
|
|
14
|
+
* A route to diff: the path loaded on each side, normalized (no trailing slash, `/` for the
|
|
15
|
+
* index). Both are the same path unless the route is a pair. With a selector, each side
|
|
16
|
+
* compares that one element instead of the whole page.
|
|
17
|
+
*/
|
|
18
|
+
export interface Route {
|
|
19
|
+
left: string;
|
|
20
|
+
right: string;
|
|
21
|
+
selector: Sides | null;
|
|
22
|
+
before: Hook | null;
|
|
23
|
+
}
|
|
24
|
+
/**
|
|
25
|
+
* Runs on each side after the page loads and before it settles and is shot, e.g. to open a
|
|
26
|
+
* menu. `route` is the route's name (`/a`, or `/a::/b` for a pair), the same on both sides.
|
|
27
|
+
*/
|
|
28
|
+
export type Hook = (page: Page, ctx: {
|
|
29
|
+
side: "left" | "right";
|
|
30
|
+
route: string;
|
|
31
|
+
width: number;
|
|
32
|
+
}) => Promise<void>;
|
|
33
|
+
/**
|
|
34
|
+
* A route as written: `/a`, the pair `/a::/b`, or `{ left, right?, selector? }` (right
|
|
35
|
+
* defaults to left).
|
|
36
|
+
*/
|
|
37
|
+
export type RouteSpec = string | {
|
|
38
|
+
left: string;
|
|
39
|
+
right?: string;
|
|
40
|
+
selector?: string | Sides;
|
|
41
|
+
before?: Hook;
|
|
42
|
+
};
|
|
43
|
+
/** `pricing` / `/pricing/` -> `/pricing`; `/` stays `/`. */
|
|
44
|
+
export declare const normalize: (url: string) => string;
|
|
45
|
+
/** `/a` for a plain route, `/a::/b` for a pair — the route's name in stdout and results.json. */
|
|
46
|
+
export declare const label: (r: Pick<Route, "left" | "right">) => string;
|
|
47
|
+
/** `.card`, or `.new | .old` when the sides differ. */
|
|
48
|
+
export declare const selectorText: (s: Sides) => string;
|
|
49
|
+
/** The label plus ` [selector]`: unique per route in a run, so the compact summary's group key. */
|
|
50
|
+
export declare const name: (r: Pick<Route, "left" | "right" | "selector">) => string;
|
|
51
|
+
/**
|
|
52
|
+
* Specs -> normalized, deduplicated routes; throws on an empty side or a glob. A string is a
|
|
53
|
+
* pair when it has a `::` followed by `/` (or ending it, so `/a::` is an empty side, not a
|
|
54
|
+
* literal), which keeps `?q=std::vector` and `/wiki/Talk:Foo` single routes. A CLI
|
|
55
|
+
* `selector` replaces every route's own; a route's own `before` replaces the top-level one.
|
|
56
|
+
*/
|
|
57
|
+
export declare function parseRoutes(specs: RouteSpec[], selector?: Sides, before?: Hook): Route[];
|
|
58
|
+
/**
|
|
59
|
+
* Viewports to compare at. Each value sits *inside* a common responsive band rather
|
|
60
|
+
* than on a boundary (640/768/1024/1280/1536 are the usual breakpoints), so a layout
|
|
61
|
+
* switch never flaps between the two captures.
|
|
62
|
+
*/
|
|
63
|
+
export declare const DEFAULT_WIDTHS: number[];
|
|
64
|
+
/** Directory a run writes its screenshots and `report.html` into. Relative to cwd. */
|
|
65
|
+
export declare const DEFAULT_OUT_DIR = "renderdiff-out";
|
|
66
|
+
/**
|
|
67
|
+
* Captures run in parallel: half the cores, between 2 and 8. A run is bound by waiting on
|
|
68
|
+
* pages, not CPU, and each worker holds two. No extra rate limiting needed: each worker
|
|
69
|
+
* holds at most one load per origin at a time, so this is also the most concurrent loads
|
|
70
|
+
* either origin sees — lower it when one side is someone's live site.
|
|
71
|
+
*/
|
|
72
|
+
export declare const DEFAULT_CONCURRENCY: number;
|
|
73
|
+
/**
|
|
74
|
+
* Third-party origins aborted at the network layer. Must stay symmetric — blocking on
|
|
75
|
+
* one side only is itself a diff.
|
|
76
|
+
*
|
|
77
|
+
* Blocked rather than hidden because A/B tooling rewrites arbitrary DOM to run
|
|
78
|
+
* experiments, and CSS cannot pre-empt an experiment you have not seen.
|
|
79
|
+
*
|
|
80
|
+
* User config appends to this list; it never replaces it.
|
|
81
|
+
*/
|
|
82
|
+
export declare const DEFAULT_BLOCK_URL_PATTERNS: string[];
|
|
83
|
+
/**
|
|
84
|
+
* Consent banners and dev-server chrome to hide. Common vendors only — add your own
|
|
85
|
+
* site's selectors via `hideSelectors` in the config file.
|
|
86
|
+
*
|
|
87
|
+
* Two constraints apply to anything added here:
|
|
88
|
+
*
|
|
89
|
+
* 1. Match the banner element EXACTLY. Consent scripts habitually also stamp a class
|
|
90
|
+
* on <html> (e.g. `…-notice-loaded`), so a substring selector like
|
|
91
|
+
* `[class*=cookie-notice]` hides the whole document — and blank matches blank, so
|
|
92
|
+
* every page then passes.
|
|
93
|
+
* 2. Hide, never remove. Removing these after the page's cookie script has run wedges
|
|
94
|
+
* the renderer and screenshots hang.
|
|
95
|
+
*
|
|
96
|
+
* Only for chrome that should be absent on both sides. Content that exists on both but
|
|
97
|
+
* drifts belongs in `masks`.
|
|
98
|
+
*/
|
|
99
|
+
export declare const DEFAULT_HIDE_SELECTORS: string[];
|
|
100
|
+
/**
|
|
101
|
+
* Browser-context settings pinned on both sides, so locale, timezone, theme and motion
|
|
102
|
+
* preferences can't differ between the two loads. Listed in the report.
|
|
103
|
+
*/
|
|
104
|
+
export declare const CONTEXT_OPTIONS: {
|
|
105
|
+
readonly deviceScaleFactor: 1;
|
|
106
|
+
readonly reducedMotion: "reduce";
|
|
107
|
+
readonly timezoneId: "UTC";
|
|
108
|
+
readonly locale: "en-US";
|
|
109
|
+
readonly colorScheme: "light";
|
|
110
|
+
};
|
|
111
|
+
/** Fill colour for masks and for height/width padding. Loud on purpose. */
|
|
112
|
+
export declare const MASK_COLOR = "#FF00FF";
|
|
113
|
+
/**
|
|
114
|
+
* Content that renders on both sides but whose value drifts — live counters, clocks,
|
|
115
|
+
* "N minutes ago". Painted over on both sides, so the noise cancels.
|
|
116
|
+
*
|
|
117
|
+
* Masks rather than CSS: these occupy a box, and hiding one reflows the page.
|
|
118
|
+
* `visibility:hidden` is no better — "9.9k" and "10.0k" size their box differently and
|
|
119
|
+
* shove their flex neighbours around.
|
|
120
|
+
*
|
|
121
|
+
* Declared as data, not branches, so the report can list the same `reason`s it masks
|
|
122
|
+
* instead of restating them in prose that silently goes stale.
|
|
123
|
+
*
|
|
124
|
+
* Keep the list short. Every mask is coverage given up, so add only what is proven to
|
|
125
|
+
* drift.
|
|
126
|
+
*/
|
|
127
|
+
export type Mask = {
|
|
128
|
+
/**
|
|
129
|
+
* The route path this applies to, e.g. `/pricing`; every route when omitted. On a pair
|
|
130
|
+
* it matches either side's path and paints both, so the noise still cancels.
|
|
131
|
+
*/
|
|
132
|
+
urlPath?: string;
|
|
133
|
+
/** Why it drifts — surfaced verbatim in the report. */
|
|
134
|
+
reason: string;
|
|
135
|
+
} & ({
|
|
136
|
+
selector: string;
|
|
137
|
+
} | {
|
|
138
|
+
locate: (page: Page) => Locator;
|
|
139
|
+
});
|
|
140
|
+
/** The shape a `renderdiff.config.*` file default-exports. Every field is optional. */
|
|
141
|
+
export interface RenderdiffConfig {
|
|
142
|
+
/** Left origin, e.g. `http://localhost:3000`. A trailing slash is stripped. */
|
|
143
|
+
left?: string;
|
|
144
|
+
/** Right origin, e.g. `https://example.com`. A trailing slash is stripped. */
|
|
145
|
+
right?: string;
|
|
146
|
+
/** Routes to diff when none are passed on the command line. A route object may take a `selector` and a `before`. */
|
|
147
|
+
routes?: RouteSpec[];
|
|
148
|
+
/** A {@link Hook} for every route without its own `before`, CLI routes included. */
|
|
149
|
+
before?: Hook;
|
|
150
|
+
/**
|
|
151
|
+
* Playwright storage state files (cookies, localStorage) to start each side with, e.g. to be
|
|
152
|
+
* signed in. One path for both sides, or per side. Relative to the config file.
|
|
153
|
+
*/
|
|
154
|
+
storageState?: string | {
|
|
155
|
+
left?: string;
|
|
156
|
+
right?: string;
|
|
157
|
+
};
|
|
158
|
+
/** Viewport widths. Replaces {@link DEFAULT_WIDTHS} outright. */
|
|
159
|
+
widths?: number[];
|
|
160
|
+
/** Fail the run if any comparison scores below this, 0..1. */
|
|
161
|
+
threshold?: number;
|
|
162
|
+
/** Where to write screenshots and `report.html`. Relative paths resolve from cwd. */
|
|
163
|
+
outDir?: string;
|
|
164
|
+
/** Parallel workers. */
|
|
165
|
+
concurrency?: number;
|
|
166
|
+
/** Extra URL globs to abort, appended to {@link DEFAULT_BLOCK_URL_PATTERNS}. */
|
|
167
|
+
blockUrlPatterns?: string[];
|
|
168
|
+
/** Extra selectors to hide, appended to {@link DEFAULT_HIDE_SELECTORS}. */
|
|
169
|
+
hideSelectors?: string[];
|
|
170
|
+
/** Raw CSS injected after the built-in rules. An escape hatch. */
|
|
171
|
+
extraCss?: string;
|
|
172
|
+
/** Per-route regions painted over on both sides. */
|
|
173
|
+
masks?: Mask[];
|
|
174
|
+
}
|
|
175
|
+
/** A fully merged config. Everything the run needs, nothing optional. */
|
|
176
|
+
export interface ResolvedConfig {
|
|
177
|
+
left: string;
|
|
178
|
+
right: string;
|
|
179
|
+
widths: number[];
|
|
180
|
+
threshold: number | null;
|
|
181
|
+
outDir: string;
|
|
182
|
+
concurrency: number;
|
|
183
|
+
blockUrlPatterns: string[];
|
|
184
|
+
/** Built-in plus configured selectors hidden on both sides. */
|
|
185
|
+
hideSelectors: string[];
|
|
186
|
+
/** The complete stylesheet injected into every page. */
|
|
187
|
+
neutralizeCss: string;
|
|
188
|
+
masks: Mask[];
|
|
189
|
+
/** Absolute storage state paths, checked to be JSON; null for a side without one. */
|
|
190
|
+
storageState: {
|
|
191
|
+
left: string | null;
|
|
192
|
+
right: string | null;
|
|
193
|
+
};
|
|
194
|
+
}
|
|
195
|
+
/** package.json's version; the same relative path resolves from `src/` and `dist/`. */
|
|
196
|
+
export declare function version(): string;
|
|
197
|
+
/** Identity helper — exists purely so editors type-check a config file. */
|
|
198
|
+
export declare function defineConfig(config: RenderdiffConfig): RenderdiffConfig;
|
|
199
|
+
export declare function masksFor(cfg: ResolvedConfig, page: Page, route: Route): Locator[];
|
|
200
|
+
/**
|
|
201
|
+
* Load a config file. An explicit `--config` path must exist; otherwise cwd is probed
|
|
202
|
+
* and finding nothing is fine — the CLI works with flags alone.
|
|
203
|
+
*/
|
|
204
|
+
export declare function loadConfig(explicitPath?: string): Promise<{
|
|
205
|
+
config: RenderdiffConfig;
|
|
206
|
+
path: string | null;
|
|
207
|
+
}>;
|
|
208
|
+
/** CLI-supplied values. `undefined` means "not passed", so the config file wins. */
|
|
209
|
+
export interface CliOverrides {
|
|
210
|
+
left?: string;
|
|
211
|
+
right?: string;
|
|
212
|
+
widths?: number[];
|
|
213
|
+
threshold?: number;
|
|
214
|
+
outDir?: string;
|
|
215
|
+
concurrency?: number;
|
|
216
|
+
/** Per side, from --storage-state / --left-storage-state / --right-storage-state. */
|
|
217
|
+
storageState?: {
|
|
218
|
+
left?: string;
|
|
219
|
+
right?: string;
|
|
220
|
+
};
|
|
221
|
+
}
|
|
222
|
+
/** Merge built-in defaults, the config file, and CLI flags into one resolved config. */
|
|
223
|
+
export declare function resolveConfig(file: RenderdiffConfig, cli: CliOverrides): ResolvedConfig;
|
package/dist/config.js
ADDED
|
@@ -0,0 +1,388 @@
|
|
|
1
|
+
var __rewriteRelativeImportExtension = (this && this.__rewriteRelativeImportExtension) || function (path, preserveJsx) {
|
|
2
|
+
if (typeof path === "string" && /^\.\.?\//.test(path)) {
|
|
3
|
+
return path.replace(/\.(tsx)$|((?:\.d)?)((?:\.[^./]+?)?)\.([cm]?)ts$/i, function (m, tsx, d, ext, cm) {
|
|
4
|
+
return tsx ? preserveJsx ? ".jsx" : ".js" : d && (!ext || !cm) ? m : (d + ext + "." + cm.toLowerCase() + "js");
|
|
5
|
+
});
|
|
6
|
+
}
|
|
7
|
+
return path;
|
|
8
|
+
};
|
|
9
|
+
import fs from "node:fs";
|
|
10
|
+
import os from "node:os";
|
|
11
|
+
import path from "node:path";
|
|
12
|
+
import { fileURLToPath, pathToFileURL } from "node:url";
|
|
13
|
+
/** `pricing` / `/pricing/` -> `/pricing`; `/` stays `/`. */
|
|
14
|
+
export const normalize = (url) => {
|
|
15
|
+
const trimmed = url.replace(/^\/+/, "").replace(/\/+$/, "");
|
|
16
|
+
return trimmed ? `/${trimmed}` : "/";
|
|
17
|
+
};
|
|
18
|
+
/** `/a` for a plain route, `/a::/b` for a pair — the route's name in stdout and results.json. */
|
|
19
|
+
export const label = (r) => r.left === r.right ? r.left : `${r.left}::${r.right}`;
|
|
20
|
+
/** `.card`, or `.new | .old` when the sides differ. */
|
|
21
|
+
export const selectorText = (s) => (s.left === s.right ? s.left : `${s.left} | ${s.right}`);
|
|
22
|
+
/** The label plus ` [selector]`: unique per route in a run, so the compact summary's group key. */
|
|
23
|
+
export const name = (r) => label(r) + (r.selector ? ` [${selectorText(r.selector)}]` : "");
|
|
24
|
+
/**
|
|
25
|
+
* Specs -> normalized, deduplicated routes; throws on an empty side or a glob. A string is a
|
|
26
|
+
* pair when it has a `::` followed by `/` (or ending it, so `/a::` is an empty side, not a
|
|
27
|
+
* literal), which keeps `?q=std::vector` and `/wiki/Talk:Foo` single routes. A CLI
|
|
28
|
+
* `selector` replaces every route's own; a route's own `before` replaces the top-level one.
|
|
29
|
+
*/
|
|
30
|
+
export function parseRoutes(specs, selector, before) {
|
|
31
|
+
const out = new Map();
|
|
32
|
+
for (const spec of specs) {
|
|
33
|
+
let sides;
|
|
34
|
+
if (typeof spec === "string") {
|
|
35
|
+
const i = spec.search(/::(?=\/|$)/);
|
|
36
|
+
sides = i === -1 ? [spec, spec] : [spec.slice(0, i), spec.slice(i + 2)];
|
|
37
|
+
}
|
|
38
|
+
else {
|
|
39
|
+
sides = [spec.left, spec.right ?? spec.left];
|
|
40
|
+
}
|
|
41
|
+
const shown = typeof spec === "string" ? spec : JSON.stringify(spec);
|
|
42
|
+
if (!sides[0] || !sides[1])
|
|
43
|
+
throw new Error(`route ${shown} has an empty side`);
|
|
44
|
+
// Its label would collide with the pair's, and dedupe would silently drop one of them.
|
|
45
|
+
if (typeof spec !== "string" && sides.some((s) => /::(?=\/|$)/.test(s))) {
|
|
46
|
+
throw new Error(`route ${shown}: a side containing "::/" reads as a pair`);
|
|
47
|
+
}
|
|
48
|
+
const glob = sides.find((s) => s.includes("*"));
|
|
49
|
+
if (glob)
|
|
50
|
+
throw new Error(`globs are not supported (${glob}) — pass literal paths.`);
|
|
51
|
+
const own = typeof spec === "string" ? undefined : spec.selector;
|
|
52
|
+
const route = {
|
|
53
|
+
left: normalize(sides[0]),
|
|
54
|
+
right: normalize(sides[1]),
|
|
55
|
+
selector: selector ?? (typeof own === "string" ? { left: own, right: own } : (own ?? null)),
|
|
56
|
+
before: (typeof spec === "string" ? undefined : spec.before) ?? before ?? null,
|
|
57
|
+
};
|
|
58
|
+
const same = out.get(name(route));
|
|
59
|
+
// JSON drops a function but keeps a null, so `before` is compared on its own below.
|
|
60
|
+
if (same &&
|
|
61
|
+
JSON.stringify({ ...same, before: 0 }) !== JSON.stringify({ ...route, before: 0 })) {
|
|
62
|
+
throw new Error(`two routes both read as ${name(route)}; change one of their selectors`);
|
|
63
|
+
}
|
|
64
|
+
if (same && same.before !== route.before) {
|
|
65
|
+
throw new Error(`two routes both read as ${name(route)}; they have different before hooks — merge them into one route`);
|
|
66
|
+
}
|
|
67
|
+
out.set(name(route), route);
|
|
68
|
+
}
|
|
69
|
+
return [...out.values()];
|
|
70
|
+
}
|
|
71
|
+
/**
|
|
72
|
+
* Viewports to compare at. Each value sits *inside* a common responsive band rather
|
|
73
|
+
* than on a boundary (640/768/1024/1280/1536 are the usual breakpoints), so a layout
|
|
74
|
+
* switch never flaps between the two captures.
|
|
75
|
+
*/
|
|
76
|
+
export const DEFAULT_WIDTHS = [1440, 1152, 896, 704, 375];
|
|
77
|
+
/** Directory a run writes its screenshots and `report.html` into. Relative to cwd. */
|
|
78
|
+
export const DEFAULT_OUT_DIR = "renderdiff-out";
|
|
79
|
+
/**
|
|
80
|
+
* Captures run in parallel: half the cores, between 2 and 8. A run is bound by waiting on
|
|
81
|
+
* pages, not CPU, and each worker holds two. No extra rate limiting needed: each worker
|
|
82
|
+
* holds at most one load per origin at a time, so this is also the most concurrent loads
|
|
83
|
+
* either origin sees — lower it when one side is someone's live site.
|
|
84
|
+
*/
|
|
85
|
+
export const DEFAULT_CONCURRENCY = Math.min(8, Math.max(2, Math.floor(os.availableParallelism() / 2)));
|
|
86
|
+
/**
|
|
87
|
+
* Third-party origins aborted at the network layer. Must stay symmetric — blocking on
|
|
88
|
+
* one side only is itself a diff.
|
|
89
|
+
*
|
|
90
|
+
* Blocked rather than hidden because A/B tooling rewrites arbitrary DOM to run
|
|
91
|
+
* experiments, and CSS cannot pre-empt an experiment you have not seen.
|
|
92
|
+
*
|
|
93
|
+
* User config appends to this list; it never replaces it.
|
|
94
|
+
*/
|
|
95
|
+
export const DEFAULT_BLOCK_URL_PATTERNS = [
|
|
96
|
+
"**://*.visualwebsiteoptimizer.com/**",
|
|
97
|
+
"**://*.googletagmanager.com/**",
|
|
98
|
+
"**://*.google-analytics.com/**",
|
|
99
|
+
"**://cdn.segment.com/**",
|
|
100
|
+
"**://*.intercom.io/**",
|
|
101
|
+
"**://*.intercomcdn.com/**",
|
|
102
|
+
"**://*.hotjar.com/**",
|
|
103
|
+
"**://snap.licdn.com/**",
|
|
104
|
+
"**://connect.facebook.net/**",
|
|
105
|
+
"**://*.onetrust.com/**",
|
|
106
|
+
"**://cdn.cookielaw.org/**",
|
|
107
|
+
];
|
|
108
|
+
/**
|
|
109
|
+
* Consent banners and dev-server chrome to hide. Common vendors only — add your own
|
|
110
|
+
* site's selectors via `hideSelectors` in the config file.
|
|
111
|
+
*
|
|
112
|
+
* Two constraints apply to anything added here:
|
|
113
|
+
*
|
|
114
|
+
* 1. Match the banner element EXACTLY. Consent scripts habitually also stamp a class
|
|
115
|
+
* on <html> (e.g. `…-notice-loaded`), so a substring selector like
|
|
116
|
+
* `[class*=cookie-notice]` hides the whole document — and blank matches blank, so
|
|
117
|
+
* every page then passes.
|
|
118
|
+
* 2. Hide, never remove. Removing these after the page's cookie script has run wedges
|
|
119
|
+
* the renderer and screenshots hang.
|
|
120
|
+
*
|
|
121
|
+
* Only for chrome that should be absent on both sides. Content that exists on both but
|
|
122
|
+
* drifts belongs in `masks`.
|
|
123
|
+
*/
|
|
124
|
+
export const DEFAULT_HIDE_SELECTORS = [
|
|
125
|
+
"#onetrust-consent-sdk",
|
|
126
|
+
".osano-cm-window",
|
|
127
|
+
"astro-dev-toolbar",
|
|
128
|
+
"#astro-dev-toolbar-root",
|
|
129
|
+
"nextjs-portal",
|
|
130
|
+
];
|
|
131
|
+
/** Kills motion so two captures taken seconds apart agree. Always applied. */
|
|
132
|
+
const STILL_CSS = `
|
|
133
|
+
*,*::before,*::after{animation:none!important;transition:none!important;caret-color:transparent!important}
|
|
134
|
+
html{scroll-behavior:auto!important}
|
|
135
|
+
`;
|
|
136
|
+
/**
|
|
137
|
+
* Browser-context settings pinned on both sides, so locale, timezone, theme and motion
|
|
138
|
+
* preferences can't differ between the two loads. Listed in the report.
|
|
139
|
+
*/
|
|
140
|
+
export const CONTEXT_OPTIONS = {
|
|
141
|
+
deviceScaleFactor: 1,
|
|
142
|
+
reducedMotion: "reduce",
|
|
143
|
+
timezoneId: "UTC",
|
|
144
|
+
locale: "en-US",
|
|
145
|
+
colorScheme: "light",
|
|
146
|
+
};
|
|
147
|
+
/** Fill colour for masks and for height/width padding. Loud on purpose. */
|
|
148
|
+
export const MASK_COLOR = "#FF00FF";
|
|
149
|
+
/** package.json's version; the same relative path resolves from `src/` and `dist/`. */
|
|
150
|
+
export function version() {
|
|
151
|
+
const pkg = path.join(path.dirname(fileURLToPath(import.meta.url)), "..", "package.json");
|
|
152
|
+
try {
|
|
153
|
+
return JSON.parse(fs.readFileSync(pkg, "utf8")).version ?? "unknown";
|
|
154
|
+
}
|
|
155
|
+
catch {
|
|
156
|
+
return "unknown";
|
|
157
|
+
}
|
|
158
|
+
}
|
|
159
|
+
/** Identity helper — exists purely so editors type-check a config file. */
|
|
160
|
+
export function defineConfig(config) {
|
|
161
|
+
return config;
|
|
162
|
+
}
|
|
163
|
+
export function masksFor(cfg, page, route) {
|
|
164
|
+
return cfg.masks
|
|
165
|
+
.filter((m) => m.urlPath === undefined || m.urlPath === route.left || m.urlPath === route.right)
|
|
166
|
+
.map((m) => ("selector" in m ? page.locator(m.selector) : m.locate(page)));
|
|
167
|
+
}
|
|
168
|
+
/** Config filenames probed in cwd, in order. */
|
|
169
|
+
const CONFIG_NAMES = [
|
|
170
|
+
"renderdiff.config.ts",
|
|
171
|
+
"renderdiff.config.mts",
|
|
172
|
+
"renderdiff.config.js",
|
|
173
|
+
"renderdiff.config.mjs",
|
|
174
|
+
];
|
|
175
|
+
const isStrArray = (v) => Array.isArray(v) && v.every((x) => typeof x === "string");
|
|
176
|
+
/**
|
|
177
|
+
* Load a config file. An explicit `--config` path must exist; otherwise cwd is probed
|
|
178
|
+
* and finding nothing is fine — the CLI works with flags alone.
|
|
179
|
+
*/
|
|
180
|
+
export async function loadConfig(explicitPath) {
|
|
181
|
+
let file = null;
|
|
182
|
+
if (explicitPath) {
|
|
183
|
+
file = path.resolve(process.cwd(), explicitPath);
|
|
184
|
+
if (!fs.existsSync(file)) {
|
|
185
|
+
throw new Error(`config file not found: ${file}`);
|
|
186
|
+
}
|
|
187
|
+
}
|
|
188
|
+
else {
|
|
189
|
+
for (const name of CONFIG_NAMES) {
|
|
190
|
+
const candidate = path.resolve(process.cwd(), name);
|
|
191
|
+
if (fs.existsSync(candidate)) {
|
|
192
|
+
file = candidate;
|
|
193
|
+
break;
|
|
194
|
+
}
|
|
195
|
+
}
|
|
196
|
+
}
|
|
197
|
+
if (!file)
|
|
198
|
+
return { config: {}, path: null };
|
|
199
|
+
let mod;
|
|
200
|
+
try {
|
|
201
|
+
mod = (await import(__rewriteRelativeImportExtension(pathToFileURL(file).href)));
|
|
202
|
+
}
|
|
203
|
+
catch (e) {
|
|
204
|
+
const msg = e instanceof Error ? e.message : String(e);
|
|
205
|
+
throw new Error(`could not load ${file}:\n ${msg}`);
|
|
206
|
+
}
|
|
207
|
+
const config = mod.default;
|
|
208
|
+
if (config === undefined) {
|
|
209
|
+
throw new Error(`${file} has no default export`);
|
|
210
|
+
}
|
|
211
|
+
if (typeof config !== "object" || config === null || Array.isArray(config)) {
|
|
212
|
+
throw new Error(`${file} must default-export an object`);
|
|
213
|
+
}
|
|
214
|
+
validate(config, file);
|
|
215
|
+
const c = config;
|
|
216
|
+
const s = c.storageState;
|
|
217
|
+
if (s === undefined)
|
|
218
|
+
return { config: c, path: file };
|
|
219
|
+
const at = (p) => p && path.resolve(path.dirname(file), p);
|
|
220
|
+
const storageState = typeof s === "string" ? at(s) : { left: at(s.left), right: at(s.right) };
|
|
221
|
+
return { config: { ...c, storageState }, path: file };
|
|
222
|
+
}
|
|
223
|
+
/** Reject a malformed config here, naming the key, rather than deep inside a run. */
|
|
224
|
+
function validate(c, file) {
|
|
225
|
+
const bad = (key, expected) => {
|
|
226
|
+
throw new Error(`${file}: \`${key}\` must be ${expected}`);
|
|
227
|
+
};
|
|
228
|
+
for (const key of ["left", "right", "outDir", "extraCss"]) {
|
|
229
|
+
if (c[key] !== undefined && typeof c[key] !== "string")
|
|
230
|
+
bad(key, "a string");
|
|
231
|
+
}
|
|
232
|
+
for (const key of ["blockUrlPatterns", "hideSelectors"]) {
|
|
233
|
+
if (c[key] !== undefined && !isStrArray(c[key])) {
|
|
234
|
+
bad(key, "an array of strings");
|
|
235
|
+
}
|
|
236
|
+
}
|
|
237
|
+
const hook = "a function (page, { side, route, width }) => Promise<void>";
|
|
238
|
+
if (c.before !== undefined && typeof c.before !== "function")
|
|
239
|
+
bad("before", hook);
|
|
240
|
+
const s = c.storageState;
|
|
241
|
+
if (s !== undefined &&
|
|
242
|
+
!(typeof s === "string" && s) &&
|
|
243
|
+
!(typeof s === "object" &&
|
|
244
|
+
s !== null &&
|
|
245
|
+
Object.keys(s).length &&
|
|
246
|
+
Object.entries(s).every(([k, v]) => ["left", "right"].includes(k) && typeof v === "string" && v))) {
|
|
247
|
+
bad("storageState", "a non-empty path, or { left?, right? } of non-empty paths");
|
|
248
|
+
}
|
|
249
|
+
if (c.routes !== undefined) {
|
|
250
|
+
if (!Array.isArray(c.routes))
|
|
251
|
+
bad("routes", "an array");
|
|
252
|
+
c.routes.forEach((r, i) => {
|
|
253
|
+
if (typeof r === "string")
|
|
254
|
+
return;
|
|
255
|
+
if (typeof r !== "object" || r === null || Array.isArray(r)) {
|
|
256
|
+
bad(`routes[${i}]`, "a string or an object { left, right?, selector?, before? }");
|
|
257
|
+
}
|
|
258
|
+
const o = r;
|
|
259
|
+
for (const key of Object.keys(o)) {
|
|
260
|
+
if (!["left", "right", "selector", "before"].includes(key)) {
|
|
261
|
+
throw new Error(`${file}: \`routes[${i}].${key}\` is not a route key (left, right, selector, before)`);
|
|
262
|
+
}
|
|
263
|
+
}
|
|
264
|
+
if (o.before !== undefined && typeof o.before !== "function")
|
|
265
|
+
bad(`routes[${i}].before`, hook);
|
|
266
|
+
const sel = o.selector;
|
|
267
|
+
if (sel !== undefined &&
|
|
268
|
+
!(typeof sel === "string" && sel) &&
|
|
269
|
+
!(typeof sel === "object" &&
|
|
270
|
+
sel !== null &&
|
|
271
|
+
Object.keys(sel).sort().join() === "left,right" &&
|
|
272
|
+
[sel.left, sel.right].every((v) => typeof v === "string" && v))) {
|
|
273
|
+
bad(`routes[${i}].selector`, "a non-empty string or { left, right } of non-empty strings");
|
|
274
|
+
}
|
|
275
|
+
if (typeof o.left !== "string" || !o.left)
|
|
276
|
+
bad(`routes[${i}].left`, "a non-empty string");
|
|
277
|
+
if (o.right !== undefined && (typeof o.right !== "string" || !o.right)) {
|
|
278
|
+
bad(`routes[${i}].right`, "a non-empty string");
|
|
279
|
+
}
|
|
280
|
+
});
|
|
281
|
+
}
|
|
282
|
+
if (c.widths !== undefined) {
|
|
283
|
+
if (!Array.isArray(c.widths) ||
|
|
284
|
+
!c.widths.every((w) => typeof w === "number" && Number.isFinite(w) && w > 0)) {
|
|
285
|
+
bad("widths", "an array of positive numbers");
|
|
286
|
+
}
|
|
287
|
+
}
|
|
288
|
+
if (c.threshold !== undefined) {
|
|
289
|
+
const t = c.threshold;
|
|
290
|
+
if (typeof t !== "number" || !Number.isFinite(t) || t < 0 || t > 1) {
|
|
291
|
+
bad("threshold", "a number between 0 and 1");
|
|
292
|
+
}
|
|
293
|
+
}
|
|
294
|
+
if (c.concurrency !== undefined) {
|
|
295
|
+
const n = c.concurrency;
|
|
296
|
+
if (typeof n !== "number" || !Number.isInteger(n) || n < 1) {
|
|
297
|
+
bad("concurrency", "a positive integer");
|
|
298
|
+
}
|
|
299
|
+
}
|
|
300
|
+
if (c.masks !== undefined) {
|
|
301
|
+
if (!Array.isArray(c.masks))
|
|
302
|
+
bad("masks", "an array");
|
|
303
|
+
c.masks.forEach((m, i) => {
|
|
304
|
+
const o = m;
|
|
305
|
+
if (typeof o !== "object" || o === null) {
|
|
306
|
+
bad(`masks[${i}]`, "an object");
|
|
307
|
+
return;
|
|
308
|
+
}
|
|
309
|
+
if (o.urlPath !== undefined && typeof o.urlPath !== "string") {
|
|
310
|
+
bad(`masks[${i}].urlPath`, "a string");
|
|
311
|
+
}
|
|
312
|
+
if (typeof o.reason !== "string")
|
|
313
|
+
bad(`masks[${i}].reason`, "a string");
|
|
314
|
+
if ("selector" in o === "locate" in o) {
|
|
315
|
+
throw new Error(`${file}: \`masks[${i}]\` needs exactly one of \`selector\` or \`locate\``);
|
|
316
|
+
}
|
|
317
|
+
if (o.selector !== undefined && typeof o.selector !== "string") {
|
|
318
|
+
bad(`masks[${i}].selector`, "a string");
|
|
319
|
+
}
|
|
320
|
+
if (o.locate !== undefined && typeof o.locate !== "function") {
|
|
321
|
+
bad(`masks[${i}].locate`, "a function (page) => Locator");
|
|
322
|
+
}
|
|
323
|
+
});
|
|
324
|
+
}
|
|
325
|
+
}
|
|
326
|
+
/** Merge built-in defaults, the config file, and CLI flags into one resolved config. */
|
|
327
|
+
export function resolveConfig(file, cli) {
|
|
328
|
+
const left = cli.left ?? file.left;
|
|
329
|
+
const right = cli.right ?? file.right;
|
|
330
|
+
if (!left || !right) {
|
|
331
|
+
throw new Error(!left && !right
|
|
332
|
+
? "left and right origins are required (two positional URLs, --left and --right, " +
|
|
333
|
+
"or left and right in renderdiff.config.*)"
|
|
334
|
+
: !left
|
|
335
|
+
? "left origin is required (first positional URL, --left, or left in renderdiff.config.*)"
|
|
336
|
+
: "right origin is required (second positional URL, --right, or right in renderdiff.config.*)");
|
|
337
|
+
}
|
|
338
|
+
const fileState = typeof file.storageState === "string"
|
|
339
|
+
? { left: file.storageState, right: file.storageState }
|
|
340
|
+
: file.storageState;
|
|
341
|
+
const hideSelectors = [...DEFAULT_HIDE_SELECTORS, ...(file.hideSelectors ?? [])];
|
|
342
|
+
return {
|
|
343
|
+
left: left.replace(/\/+$/, ""),
|
|
344
|
+
right: right.replace(/\/+$/, ""),
|
|
345
|
+
widths: cli.widths ?? file.widths ?? [...DEFAULT_WIDTHS],
|
|
346
|
+
threshold: cli.threshold ?? file.threshold ?? null,
|
|
347
|
+
outDir: path.resolve(process.cwd(), cli.outDir ?? file.outDir ?? DEFAULT_OUT_DIR),
|
|
348
|
+
concurrency: cli.concurrency ?? file.concurrency ?? DEFAULT_CONCURRENCY,
|
|
349
|
+
blockUrlPatterns: [...DEFAULT_BLOCK_URL_PATTERNS, ...(file.blockUrlPatterns ?? [])],
|
|
350
|
+
hideSelectors,
|
|
351
|
+
neutralizeCss: STILL_CSS + `${hideSelectors.join(",")}{display:none!important}\n` + (file.extraCss ?? ""),
|
|
352
|
+
masks: (file.masks ?? []).map((m) => m.urlPath === undefined ? m : { ...m, urlPath: normalize(m.urlPath) }),
|
|
353
|
+
storageState: {
|
|
354
|
+
left: storageFile(cli.storageState?.left ?? fileState?.left),
|
|
355
|
+
right: storageFile(cli.storageState?.right ?? fileState?.right),
|
|
356
|
+
},
|
|
357
|
+
};
|
|
358
|
+
}
|
|
359
|
+
/** Absolute path to a storage state file that parses as a JSON object. Never echoes its contents. */
|
|
360
|
+
function storageFile(p) {
|
|
361
|
+
if (!p)
|
|
362
|
+
return null;
|
|
363
|
+
const file = path.resolve(process.cwd(), p);
|
|
364
|
+
let text;
|
|
365
|
+
try {
|
|
366
|
+
text = fs.readFileSync(file, "utf8");
|
|
367
|
+
}
|
|
368
|
+
catch {
|
|
369
|
+
throw new Error(`storage state file not found: ${file}`);
|
|
370
|
+
}
|
|
371
|
+
let json;
|
|
372
|
+
try {
|
|
373
|
+
json = JSON.parse(text);
|
|
374
|
+
}
|
|
375
|
+
catch {
|
|
376
|
+
// Not the parse error's message: it quotes the file, which holds session tokens.
|
|
377
|
+
throw new Error(`storage state file is not valid JSON: ${file}`);
|
|
378
|
+
}
|
|
379
|
+
if (typeof json !== "object" || json === null || Array.isArray(json)) {
|
|
380
|
+
throw new Error(`storage state file is not a JSON object: ${file}`);
|
|
381
|
+
}
|
|
382
|
+
const { cookies = [], origins = [] } = json;
|
|
383
|
+
if (!Array.isArray(cookies) || !Array.isArray(origins)) {
|
|
384
|
+
throw new Error(`storage state file is not a Playwright storage state (cookies/origins must be arrays): ${file}`);
|
|
385
|
+
}
|
|
386
|
+
return file;
|
|
387
|
+
}
|
|
388
|
+
//# sourceMappingURL=config.js.map
|