@juxtapose/core 0.4.0 → 0.6.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/agent/handoff.d.ts +8 -1
- package/dist/agent/handoff.js +75 -7
- package/dist/agent/handoff.js.map +1 -1
- package/dist/analysis/affected.d.ts +37 -0
- package/dist/analysis/affected.js +97 -22
- package/dist/analysis/affected.js.map +1 -1
- package/dist/analysis/cause.d.ts +32 -0
- package/dist/analysis/cause.js +187 -0
- package/dist/analysis/cause.js.map +1 -0
- package/dist/baseline/approve.d.ts +24 -0
- package/dist/baseline/approve.js +54 -0
- package/dist/baseline/approve.js.map +1 -0
- package/dist/baseline/git-store.d.ts +4 -0
- package/dist/baseline/git-store.js +22 -0
- package/dist/baseline/git-store.js.map +1 -1
- package/dist/browser/acquire.d.ts +15 -0
- package/dist/browser/acquire.js +26 -0
- package/dist/browser/acquire.js.map +1 -0
- package/dist/browser/browser.d.ts +53 -0
- package/dist/browser/browser.js +122 -0
- package/dist/browser/browser.js.map +1 -0
- package/dist/browser/cdp.d.ts +81 -0
- package/dist/browser/cdp.js +230 -0
- package/dist/browser/cdp.js.map +1 -0
- package/dist/browser/daemon/client.d.ts +145 -0
- package/dist/browser/daemon/client.js +764 -0
- package/dist/browser/daemon/client.js.map +1 -0
- package/dist/browser/daemon/state.d.ts +99 -0
- package/dist/browser/daemon/state.js +297 -0
- package/dist/browser/daemon/state.js.map +1 -0
- package/dist/browser/daemon/supervisor-main.d.ts +1 -0
- package/dist/browser/daemon/supervisor-main.js +54 -0
- package/dist/browser/daemon/supervisor-main.js.map +1 -0
- package/dist/browser/daemon/supervisor.d.ts +37 -0
- package/dist/browser/daemon/supervisor.js +777 -0
- package/dist/browser/daemon/supervisor.js.map +1 -0
- package/dist/{capture/launch.d.ts → browser/flags.d.ts} +19 -1
- package/dist/browser/flags.js +146 -0
- package/dist/browser/flags.js.map +1 -0
- package/dist/browser/index.d.ts +14 -0
- package/dist/browser/index.js +14 -0
- package/dist/browser/index.js.map +1 -0
- package/dist/browser/install.d.ts +33 -0
- package/dist/browser/install.js +167 -0
- package/dist/browser/install.js.map +1 -0
- package/dist/browser/launch.d.ts +37 -0
- package/dist/browser/launch.js +254 -0
- package/dist/browser/launch.js.map +1 -0
- package/dist/browser/page.d.ts +125 -0
- package/dist/browser/page.js +564 -0
- package/dist/browser/page.js.map +1 -0
- package/dist/browser/pins.d.ts +12 -0
- package/dist/browser/pins.js +57 -0
- package/dist/browser/pins.js.map +1 -0
- package/dist/browser/private-dir.d.ts +7 -0
- package/dist/browser/private-dir.js +24 -0
- package/dist/browser/private-dir.js.map +1 -0
- package/dist/browser/resolve.d.ts +31 -0
- package/dist/browser/resolve.js +126 -0
- package/dist/browser/resolve.js.map +1 -0
- package/dist/browser/selectors.d.ts +10 -0
- package/dist/browser/selectors.js +60 -0
- package/dist/browser/selectors.js.map +1 -0
- package/dist/browser/transport.d.ts +51 -0
- package/dist/browser/transport.js +124 -0
- package/dist/browser/transport.js.map +1 -0
- package/dist/browser/types.d.ts +4 -0
- package/dist/browser/types.js +2 -0
- package/dist/browser/types.js.map +1 -0
- package/dist/browser/zip.d.ts +27 -0
- package/dist/browser/zip.js +241 -0
- package/dist/browser/zip.js.map +1 -0
- package/dist/capture/capture.d.ts +7 -1
- package/dist/capture/capture.js +25 -8
- package/dist/capture/capture.js.map +1 -1
- package/dist/capture/env.d.ts +1 -1
- package/dist/capture/pool.d.ts +1 -1
- package/dist/capture/pool.js +41 -8
- package/dist/capture/pool.js.map +1 -1
- package/dist/capture/settle.d.ts +1 -1
- package/dist/capture/settle.js +2 -0
- package/dist/capture/settle.js.map +1 -1
- package/dist/capture/snap.d.ts +43 -0
- package/dist/capture/snap.js +103 -0
- package/dist/capture/snap.js.map +1 -0
- package/dist/capture/structure.d.ts +77 -0
- package/dist/capture/structure.js +498 -0
- package/dist/capture/structure.js.map +1 -0
- package/dist/diff/compare.d.ts +19 -0
- package/dist/diff/compare.js +19 -0
- package/dist/diff/compare.js.map +1 -0
- package/dist/diff/crops.d.ts +26 -0
- package/dist/diff/crops.js +92 -0
- package/dist/diff/crops.js.map +1 -0
- package/dist/diff/structural/classify.d.ts +29 -0
- package/dist/diff/structural/classify.js +113 -0
- package/dist/diff/structural/classify.js.map +1 -0
- package/dist/diff/structural/coverage.d.ts +11 -0
- package/dist/diff/structural/coverage.js +37 -0
- package/dist/diff/structural/coverage.js.map +1 -0
- package/dist/diff/structural/deltas.d.ts +29 -0
- package/dist/diff/structural/deltas.js +218 -0
- package/dist/diff/structural/deltas.js.map +1 -0
- package/dist/diff/structural/disambiguate.d.ts +3 -0
- package/dist/diff/structural/disambiguate.js +89 -0
- package/dist/diff/structural/disambiguate.js.map +1 -0
- package/dist/diff/structural/label.d.ts +15 -0
- package/dist/diff/structural/label.js +64 -0
- package/dist/diff/structural/label.js.map +1 -0
- package/dist/diff/structural/match.d.ts +13 -0
- package/dist/diff/structural/match.js +135 -0
- package/dist/diff/structural/match.js.map +1 -0
- package/dist/diff/structural/shift.d.ts +2 -0
- package/dist/diff/structural/shift.js +144 -0
- package/dist/diff/structural/shift.js.map +1 -0
- package/dist/diff/structural/summary.d.ts +31 -0
- package/dist/diff/structural/summary.js +420 -0
- package/dist/diff/structural/summary.js.map +1 -0
- package/dist/diff/structural.d.ts +40 -0
- package/dist/diff/structural.js +219 -0
- package/dist/diff/structural.js.map +1 -0
- package/dist/index.d.ts +28 -4
- package/dist/index.js +32 -3
- package/dist/index.js.map +1 -1
- package/dist/platform.d.ts +1 -1
- package/dist/platforms/urls.d.ts +3 -0
- package/dist/platforms/urls.js +89 -0
- package/dist/platforms/urls.js.map +1 -0
- package/dist/report/comment.js +9 -3
- package/dist/report/comment.js.map +1 -1
- package/dist/report/format.d.ts +18 -0
- package/dist/report/format.js +20 -0
- package/dist/report/format.js.map +1 -1
- package/dist/report/html.js +2 -2
- package/dist/report/html.js.map +1 -1
- package/dist/run/groups.d.ts +2 -0
- package/dist/run/groups.js +45 -0
- package/dist/run/groups.js.map +1 -0
- package/dist/run/run.d.ts +6 -2
- package/dist/run/run.js +74 -6
- package/dist/run/run.js.map +1 -1
- package/dist/shell-quote.d.ts +2 -0
- package/dist/shell-quote.js +10 -0
- package/dist/shell-quote.js.map +1 -0
- package/dist/types.d.ts +201 -5
- package/dist/types.js +0 -2
- package/dist/types.js.map +1 -1
- package/dist/url-platform.d.ts +2 -2
- package/dist/url-platform.js +2 -2
- package/dist/url-platform.js.map +1 -1
- package/package.json +6 -10
- package/dist/capture/launch.js +0 -56
- package/dist/capture/launch.js.map +0 -1
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"structure.js","sourceRoot":"","sources":["../../src/capture/structure.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import type { ChangedRegion, StructureSnapshot, StructuralVerdict } from '../types.js';
|
|
2
|
+
import { type DiffOutput } from './diff.js';
|
|
3
|
+
export interface SnapSide {
|
|
4
|
+
image: Buffer;
|
|
5
|
+
structure?: StructureSnapshot;
|
|
6
|
+
}
|
|
7
|
+
export interface SnapComparison {
|
|
8
|
+
pixels: DiffOutput;
|
|
9
|
+
verdict: StructuralVerdict;
|
|
10
|
+
/** Every region no delta explains, in diff order, not the budget-fitted
|
|
11
|
+
* prefix on the verdict. `--crops` orders and labels from this. */
|
|
12
|
+
unexplainedRegions: ChangedRegion[];
|
|
13
|
+
/** The changed elements' boxes, in delta order: `--crops` falls back to
|
|
14
|
+
* these when the pixel diff marked nothing. */
|
|
15
|
+
elementRegions: ChangedRegion[];
|
|
16
|
+
}
|
|
17
|
+
export declare function compareSnaps(a: SnapSide, b: SnapSide, escalate: {
|
|
18
|
+
command: string;
|
|
19
|
+
}): Promise<SnapComparison>;
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
// Two snaps on disk → pixels + verdict. The public seam for `jux diff`: it
|
|
2
|
+
// keeps diffImages and the structural internals unexported while giving the
|
|
3
|
+
// CLI the one call it needs. No browser is involved anywhere below this line.
|
|
4
|
+
import { diffImages } from './diff.js';
|
|
5
|
+
import { structuralDiffWithCoverage } from './structural.js';
|
|
6
|
+
export async function compareSnaps(a, b, escalate) {
|
|
7
|
+
const pixels = await diffImages(a.image, b.image);
|
|
8
|
+
const { verdict, unexplainedRegions, elementRegions } = structuralDiffWithCoverage({
|
|
9
|
+
baseline: a.structure,
|
|
10
|
+
current: b.structure,
|
|
11
|
+
// Byte equality, not mismatchPixels === 0: a sub-threshold colour change
|
|
12
|
+
// has no mismatching pixels but is still a different image.
|
|
13
|
+
imagesIdentical: a.image.equals(b.image),
|
|
14
|
+
pixels,
|
|
15
|
+
escalate,
|
|
16
|
+
});
|
|
17
|
+
return { pixels, verdict, unexplainedRegions, elementRegions };
|
|
18
|
+
}
|
|
19
|
+
//# sourceMappingURL=compare.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"compare.js","sourceRoot":"","sources":["../../src/diff/compare.ts"],"names":[],"mappings":"AAAA,2EAA2E;AAC3E,4EAA4E;AAC5E,8EAA8E;AAG9E,OAAO,EAAE,UAAU,EAAmB,MAAM,WAAW,CAAC;AACxD,OAAO,EAAE,0BAA0B,EAAE,MAAM,iBAAiB,CAAC;AAkB7D,MAAM,CAAC,KAAK,UAAU,YAAY,CAChC,CAAW,EACX,CAAW,EACX,QAA6B;IAE7B,MAAM,MAAM,GAAG,MAAM,UAAU,CAAC,CAAC,CAAC,KAAK,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC;IAClD,MAAM,EAAE,OAAO,EAAE,kBAAkB,EAAE,cAAc,EAAE,GAAG,0BAA0B,CAAC;QACjF,QAAQ,EAAE,CAAC,CAAC,SAAS;QACrB,OAAO,EAAE,CAAC,CAAC,SAAS;QACpB,yEAAyE;QACzE,4DAA4D;QAC5D,eAAe,EAAE,CAAC,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC;QACxC,MAAM;QACN,QAAQ;KACT,CAAC,CAAC;IACH,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,kBAAkB,EAAE,cAAc,EAAE,CAAC;AACjE,CAAC"}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
import type { ChangedRegion } from '../types.js';
|
|
2
|
+
export declare const MAX_CROPS = 8;
|
|
3
|
+
export declare const MAX_CROP_SIDE = 512;
|
|
4
|
+
export interface Crop {
|
|
5
|
+
/** The changed region this strip shows, page px. */
|
|
6
|
+
region: ChangedRegion;
|
|
7
|
+
/** What was cropped: the region doubled about its centre, clamped to both frames. */
|
|
8
|
+
box: ChangedRegion;
|
|
9
|
+
/** Output px per page px: an integer above 1 when enlarged, under 1 when reduced. */
|
|
10
|
+
scale: number;
|
|
11
|
+
/** The whole strip: left side, gutter, right side. */
|
|
12
|
+
width: number;
|
|
13
|
+
height: number;
|
|
14
|
+
png: Buffer;
|
|
15
|
+
}
|
|
16
|
+
export declare function renderCrops(a: Buffer, b: Buffer, regions: ChangedRegion[]): Promise<Crop[]>;
|
|
17
|
+
/** The region doubled about its centre, at least MIN_BOX a side, clamped to
|
|
18
|
+
* the frame, integer px. A zero-size box means the region lies outside the
|
|
19
|
+
* frame. */
|
|
20
|
+
export declare function cropBox(r: ChangedRegion, frame: {
|
|
21
|
+
width: number;
|
|
22
|
+
height: number;
|
|
23
|
+
}): ChangedRegion;
|
|
24
|
+
/** An integer enlargement that keeps the longer side within MAX_CROP_SIDE,
|
|
25
|
+
* or a fractional reduction once the box itself is past it. */
|
|
26
|
+
export declare function scaleFor(box: ChangedRegion): number;
|
|
@@ -0,0 +1,92 @@
|
|
|
1
|
+
// Tier-3: the pixels, but only where they changed and only as much as an
|
|
2
|
+
// agent needs. One PNG per changed region — baseline | current, side by
|
|
3
|
+
// side — with the region's bounding box doubled about its centre for
|
|
4
|
+
// context and scaled so the longer side is at most 512px. Nearest-neighbour
|
|
5
|
+
// when scaling up, so a 1px border reads as a hard 6px step and not a blur.
|
|
6
|
+
// No browser; sharp only, which `diffImages` already loads.
|
|
7
|
+
import sharp from 'sharp';
|
|
8
|
+
export const MAX_CROPS = 8;
|
|
9
|
+
export const MAX_CROP_SIDE = 512;
|
|
10
|
+
const GUTTER = 4;
|
|
11
|
+
/** A 1×1 region still needs enough around it to recognise. */
|
|
12
|
+
const MIN_BOX = 16;
|
|
13
|
+
/** Pinned so the same input is the same bytes: sharp strips metadata by
|
|
14
|
+
* default; the level and filter fix the zlib stream. */
|
|
15
|
+
const PNG = { compressionLevel: 9, adaptiveFiltering: false };
|
|
16
|
+
/** The gutter colour: magenta is in no UI palette, so it never reads as content. */
|
|
17
|
+
const GUTTER_RGBA = { r: 255, g: 0, b: 255, alpha: 1 };
|
|
18
|
+
export async function renderCrops(a, b, regions) {
|
|
19
|
+
const [ma, mb] = await Promise.all([sharp(a).metadata(), sharp(b).metadata()]);
|
|
20
|
+
// Only the overlap exists on both sides; after a size change that is the
|
|
21
|
+
// smaller frame's extent.
|
|
22
|
+
const frame = {
|
|
23
|
+
width: Math.min(ma.width ?? 0, mb.width ?? 0),
|
|
24
|
+
height: Math.min(ma.height ?? 0, mb.height ?? 0),
|
|
25
|
+
};
|
|
26
|
+
// Nothing marked (sub-threshold, or a size change): the whole frame is
|
|
27
|
+
// the one thing worth looking at.
|
|
28
|
+
const wanted = regions.length > 0 ? regions : [{ x: 0, y: 0, ...frame }];
|
|
29
|
+
const out = [];
|
|
30
|
+
for (const region of wanted) {
|
|
31
|
+
// The cap counts rendered crops, not candidates: off-frame regions at the
|
|
32
|
+
// front must not starve a valid later one.
|
|
33
|
+
if (out.length >= MAX_CROPS)
|
|
34
|
+
break;
|
|
35
|
+
const box = cropBox(region, frame);
|
|
36
|
+
if (box.width === 0 || box.height === 0)
|
|
37
|
+
continue;
|
|
38
|
+
const scale = scaleFor(box);
|
|
39
|
+
const sw = Math.max(1, Math.round(box.width * scale));
|
|
40
|
+
const sh = Math.max(1, Math.round(box.height * scale));
|
|
41
|
+
const side = (img) => sharp(img)
|
|
42
|
+
.extract({ left: box.x, top: box.y, width: box.width, height: box.height })
|
|
43
|
+
.resize(sw, sh, { kernel: scale >= 1 ? 'nearest' : 'lanczos3', fit: 'fill' })
|
|
44
|
+
.ensureAlpha()
|
|
45
|
+
.png(PNG)
|
|
46
|
+
.toBuffer();
|
|
47
|
+
const [left, right] = await Promise.all([side(a), side(b)]);
|
|
48
|
+
const width = sw * 2 + GUTTER;
|
|
49
|
+
const png = await sharp({
|
|
50
|
+
create: { width, height: sh, channels: 4, background: GUTTER_RGBA },
|
|
51
|
+
})
|
|
52
|
+
.composite([
|
|
53
|
+
{ input: left, left: 0, top: 0 },
|
|
54
|
+
{ input: right, left: sw + GUTTER, top: 0 },
|
|
55
|
+
])
|
|
56
|
+
.png(PNG)
|
|
57
|
+
.toBuffer();
|
|
58
|
+
out.push({ region, box, scale, width, height: sh, png });
|
|
59
|
+
}
|
|
60
|
+
return out;
|
|
61
|
+
}
|
|
62
|
+
/** The region doubled about its centre, at least MIN_BOX a side, clamped to
|
|
63
|
+
* the frame, integer px. A zero-size box means the region lies outside the
|
|
64
|
+
* frame. */
|
|
65
|
+
export function cropBox(r, frame) {
|
|
66
|
+
// Clamping alone would drag a region left of / above the frame back to the
|
|
67
|
+
// origin and crop something unrelated, so outside means no box. The edges
|
|
68
|
+
// are exclusive: a region starting at x == width covers no pixel. A
|
|
69
|
+
// zero-area region counts as one px, so (0, 0, 0, 0) is still inside.
|
|
70
|
+
if (r.x + Math.max(1, r.width) <= 0 ||
|
|
71
|
+
r.y + Math.max(1, r.height) <= 0 ||
|
|
72
|
+
r.x >= frame.width ||
|
|
73
|
+
r.y >= frame.height) {
|
|
74
|
+
return { x: 0, y: 0, width: 0, height: 0 };
|
|
75
|
+
}
|
|
76
|
+
const w = Math.max(MIN_BOX, r.width * 2);
|
|
77
|
+
const h = Math.max(MIN_BOX, r.height * 2);
|
|
78
|
+
const x0 = Math.min(frame.width, Math.max(0, Math.floor(r.x + r.width / 2 - w / 2)));
|
|
79
|
+
const y0 = Math.min(frame.height, Math.max(0, Math.floor(r.y + r.height / 2 - h / 2)));
|
|
80
|
+
const x1 = Math.min(frame.width, Math.ceil(x0 + w));
|
|
81
|
+
const y1 = Math.min(frame.height, Math.ceil(y0 + h));
|
|
82
|
+
return { x: x0, y: y0, width: Math.max(0, x1 - x0), height: Math.max(0, y1 - y0) };
|
|
83
|
+
}
|
|
84
|
+
/** An integer enlargement that keeps the longer side within MAX_CROP_SIDE,
|
|
85
|
+
* or a fractional reduction once the box itself is past it. */
|
|
86
|
+
export function scaleFor(box) {
|
|
87
|
+
const longer = Math.max(box.width, box.height);
|
|
88
|
+
return longer <= MAX_CROP_SIDE
|
|
89
|
+
? Math.max(1, Math.floor(MAX_CROP_SIDE / longer))
|
|
90
|
+
: MAX_CROP_SIDE / longer;
|
|
91
|
+
}
|
|
92
|
+
//# sourceMappingURL=crops.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"crops.js","sourceRoot":"","sources":["../../src/diff/crops.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
import type { ChangedRegion, Classification, Flag, StructureElement, StructureSnapshot, StyleTag } from '../../types.js';
|
|
2
|
+
import type { Fact } from './deltas.js';
|
|
3
|
+
export interface ClassifyContext {
|
|
4
|
+
baseline?: StructureSnapshot;
|
|
5
|
+
current?: StructureSnapshot;
|
|
6
|
+
facts: Fact[];
|
|
7
|
+
explained: 'full' | 'partial' | 'none';
|
|
8
|
+
unexplainedRegions: ChangedRegion[];
|
|
9
|
+
pixels: {
|
|
10
|
+
/** Byte-identical images: the only pixel evidence of "no change". */
|
|
11
|
+
imagesIdentical: boolean;
|
|
12
|
+
dimensionMismatch: boolean;
|
|
13
|
+
/** The pixel diff marked at least one region with area. */
|
|
14
|
+
hasRegions: boolean;
|
|
15
|
+
/** The images differ but the pixel diff marked no region. */
|
|
16
|
+
subThreshold: boolean;
|
|
17
|
+
};
|
|
18
|
+
}
|
|
19
|
+
export declare function styleTagOf(prop: string): StyleTag;
|
|
20
|
+
export declare function classify(ctx: ClassifyContext): {
|
|
21
|
+
classification: Classification;
|
|
22
|
+
styleTags: StyleTag[];
|
|
23
|
+
};
|
|
24
|
+
/** The first self-painting element (canvas, video, img…) on the current side
|
|
25
|
+
* under an unexplained region: its content changes without the DOM or styles
|
|
26
|
+
* changing, so the pixels there are content, not drift. */
|
|
27
|
+
export declare function selfPaintingAt(current: StructureSnapshot, unexplained: ChangedRegion[]): StructureElement | undefined;
|
|
28
|
+
/** In a fixed order, so the flag list serializes identically every run. */
|
|
29
|
+
export declare function computeFlags(ctx: ClassifyContext): Flag[];
|
|
@@ -0,0 +1,113 @@
|
|
|
1
|
+
// Classification and risk flags. First match wins, in an order that puts
|
|
2
|
+
// causes before consequences: a padding change that reflows the page is a
|
|
3
|
+
// spacing change with a shift in its deltas, not a "reflow" — the spec's own
|
|
4
|
+
// summary example says so.
|
|
5
|
+
import { SELF_PAINTING } from './label.js';
|
|
6
|
+
import { intersects } from './coverage.js';
|
|
7
|
+
const TAG_ORDER = ['color', 'typography', 'spacing', 'border', 'effects'];
|
|
8
|
+
export function styleTagOf(prop) {
|
|
9
|
+
if (/^(padding|margin)-|^gap$/.test(prop))
|
|
10
|
+
return 'spacing';
|
|
11
|
+
if (/^border-.*-(width|radius)$/.test(prop) || /^border-.*-color$/.test(prop))
|
|
12
|
+
return 'border';
|
|
13
|
+
if (/^(font-|line-height|letter-spacing|text-|content$)/.test(prop))
|
|
14
|
+
return 'typography';
|
|
15
|
+
if (/^(opacity|transform|box-shadow|z-index|stroke-width)$/.test(prop))
|
|
16
|
+
return 'effects';
|
|
17
|
+
return 'color'; // color, background-*, fill, stroke
|
|
18
|
+
}
|
|
19
|
+
export function classify(ctx) {
|
|
20
|
+
const none = [];
|
|
21
|
+
const { pixels, baseline, current, facts } = ctx;
|
|
22
|
+
// Never "0 mismatch pixels": pixelmatch's tolerance hides real changes
|
|
23
|
+
// (the corpus `background` case changes the bytes and marks 0 pixels).
|
|
24
|
+
if (pixels.imagesIdentical &&
|
|
25
|
+
!pixels.dimensionMismatch &&
|
|
26
|
+
!pixels.hasRegions &&
|
|
27
|
+
facts.length === 0)
|
|
28
|
+
return { classification: 'identical', styleTags: none };
|
|
29
|
+
// Before the structure checks: a size change is a size change whether or
|
|
30
|
+
// not either side captured structure.
|
|
31
|
+
if (pixels.dimensionMismatch)
|
|
32
|
+
return { classification: 'dimension-change', styleTags: none };
|
|
33
|
+
if (!baseline || !current)
|
|
34
|
+
return { classification: 'unknown', styleTags: none };
|
|
35
|
+
if (baseline.viewport.width !== current.viewport.width ||
|
|
36
|
+
baseline.viewport.height !== current.viewport.height) {
|
|
37
|
+
return { classification: 'dimension-change', styleTags: none };
|
|
38
|
+
}
|
|
39
|
+
// Equal hashes and no facts: the DOM and styles did not change, so the
|
|
40
|
+
// pixels are drift or self-painted content. The facts come from the
|
|
41
|
+
// elements themselves, so they outrank a hash that disagrees with them.
|
|
42
|
+
if (facts.length === 0 && baseline.structureHash === current.structureHash) {
|
|
43
|
+
const selfPainted = selfPaintingAt(current, ctx.unexplainedRegions) !== undefined;
|
|
44
|
+
return { classification: selfPainted ? 'unknown' : 'render-drift', styleTags: none };
|
|
45
|
+
}
|
|
46
|
+
const kinds = new Set(facts.map((f) => f.delta.kind));
|
|
47
|
+
if (kinds.has('removed'))
|
|
48
|
+
return { classification: 'element-removed', styleTags: none };
|
|
49
|
+
if (kinds.has('added'))
|
|
50
|
+
return { classification: 'element-added', styleTags: none };
|
|
51
|
+
const primary = ['text', 'style', 'attr'].filter((k) => kinds.has(k));
|
|
52
|
+
const styleTags = kinds.has('style')
|
|
53
|
+
? TAG_ORDER.filter((t) => facts.some((f) => f.delta.kind === 'style' && styleTagOf(f.delta.prop) === t))
|
|
54
|
+
: none;
|
|
55
|
+
if (primary.length > 1)
|
|
56
|
+
return { classification: 'mixed', styleTags };
|
|
57
|
+
if (primary[0] === 'text')
|
|
58
|
+
return { classification: 'text-only', styleTags: none };
|
|
59
|
+
if (primary[0] === 'style')
|
|
60
|
+
return { classification: 'style-only', styleTags };
|
|
61
|
+
if (primary[0] === 'attr')
|
|
62
|
+
return { classification: 'attr-only', styleTags: none };
|
|
63
|
+
if (kinds.has('shift'))
|
|
64
|
+
return { classification: 'reflow', styleTags: none };
|
|
65
|
+
if (kinds.has('moved') || kinds.has('resized'))
|
|
66
|
+
return { classification: 'geometry', styleTags: none };
|
|
67
|
+
// Bytes differ, nothing marked, nothing structural: antialiasing-scale drift.
|
|
68
|
+
if (pixels.subThreshold)
|
|
69
|
+
return { classification: 'render-drift', styleTags: none };
|
|
70
|
+
return { classification: 'unknown', styleTags: none };
|
|
71
|
+
}
|
|
72
|
+
/** The first self-painting element (canvas, video, img…) on the current side
|
|
73
|
+
* under an unexplained region: its content changes without the DOM or styles
|
|
74
|
+
* changing, so the pixels there are content, not drift. */
|
|
75
|
+
export function selfPaintingAt(current, unexplained) {
|
|
76
|
+
for (const r of unexplained) {
|
|
77
|
+
const e = current.elements.find((e) => SELF_PAINTING.has(e.tag) && intersects(r, e.rect));
|
|
78
|
+
if (e)
|
|
79
|
+
return e;
|
|
80
|
+
}
|
|
81
|
+
return undefined;
|
|
82
|
+
}
|
|
83
|
+
const LARGE_SHIFT_COUNT = 10;
|
|
84
|
+
const LARGE_SHIFT_PX = 50;
|
|
85
|
+
/** In a fixed order, so the flag list serializes identically every run. */
|
|
86
|
+
export function computeFlags(ctx) {
|
|
87
|
+
const flags = [];
|
|
88
|
+
const { baseline, current, facts } = ctx;
|
|
89
|
+
const has = (k) => facts.some((f) => f.delta.kind === k);
|
|
90
|
+
if (has('removed'))
|
|
91
|
+
flags.push('element-removed');
|
|
92
|
+
if (has('text'))
|
|
93
|
+
flags.push('text-changed');
|
|
94
|
+
if (facts.some((f) => f.delta.kind === 'shift' &&
|
|
95
|
+
(f.delta.count >= LARGE_SHIFT_COUNT || Math.abs(f.delta.dy) >= LARGE_SHIFT_PX))) {
|
|
96
|
+
flags.push('large-reflow');
|
|
97
|
+
}
|
|
98
|
+
if (ctx.explained !== 'full')
|
|
99
|
+
flags.push('unexplained-pixels');
|
|
100
|
+
if (ctx.pixels.subThreshold)
|
|
101
|
+
flags.push('sub-threshold');
|
|
102
|
+
if (baseline?.truncated || current?.truncated)
|
|
103
|
+
flags.push('structure-truncated');
|
|
104
|
+
if (!baseline)
|
|
105
|
+
flags.push('no-baseline-structure');
|
|
106
|
+
if (!current)
|
|
107
|
+
flags.push('no-current-structure');
|
|
108
|
+
const belowFold = (s) => s !== undefined && s.contentHeight > s.viewport.height;
|
|
109
|
+
if (belowFold(baseline) || belowFold(current))
|
|
110
|
+
flags.push('below-fold');
|
|
111
|
+
return flags;
|
|
112
|
+
}
|
|
113
|
+
//# sourceMappingURL=classify.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"classify.js","sourceRoot":"","sources":["../../../src/diff/structural/classify.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import type { ChangedRegion, StructureRect } from '../../types.js';
|
|
2
|
+
import type { Fact } from './deltas.js';
|
|
3
|
+
export interface Coverage {
|
|
4
|
+
/** Changed regions with area; zero-area boxes carry no pixels. */
|
|
5
|
+
regionCount: number;
|
|
6
|
+
coverage: number;
|
|
7
|
+
explained: 'full' | 'partial' | 'none';
|
|
8
|
+
unexplainedRegions: ChangedRegion[];
|
|
9
|
+
}
|
|
10
|
+
export declare function intersects(r: ChangedRegion, rect: StructureRect): boolean;
|
|
11
|
+
export declare function computeCoverage(regions: ChangedRegion[], facts: Fact[]): Coverage;
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
// Does the structure explain the pixels? A changed region is explained when
|
|
2
|
+
// it intersects the old or new rect of some delta's element. Coverage is by
|
|
3
|
+
// region area: the diff carries bounding boxes, not per-pixel membership, and
|
|
4
|
+
// boxes are what an agent reads back.
|
|
5
|
+
export function intersects(r, rect) {
|
|
6
|
+
return (r.x < rect.x + rect.w &&
|
|
7
|
+
r.x + r.width > rect.x &&
|
|
8
|
+
r.y < rect.y + rect.h &&
|
|
9
|
+
r.y + r.height > rect.y);
|
|
10
|
+
}
|
|
11
|
+
export function computeCoverage(regions, facts) {
|
|
12
|
+
// No marked regions: nothing is left unexplained. That includes a change
|
|
13
|
+
// below the pixel diff's tolerance, where the deltas are the whole story.
|
|
14
|
+
const real = regions.filter((r) => r.width > 0 && r.height > 0);
|
|
15
|
+
if (real.length === 0)
|
|
16
|
+
return { regionCount: 0, coverage: 1, explained: 'full', unexplainedRegions: [] };
|
|
17
|
+
const rects = facts.flatMap((f) => f.rects);
|
|
18
|
+
let total = 0;
|
|
19
|
+
let explained = 0;
|
|
20
|
+
const unexplainedRegions = [];
|
|
21
|
+
for (const r of real) {
|
|
22
|
+
const area = r.width * r.height;
|
|
23
|
+
total += area;
|
|
24
|
+
if (rects.some((rect) => intersects(r, rect)))
|
|
25
|
+
explained += area;
|
|
26
|
+
else
|
|
27
|
+
unexplainedRegions.push(r);
|
|
28
|
+
}
|
|
29
|
+
const coverage = total === 0 ? 1 : Math.round((explained / total) * 1000) / 1000;
|
|
30
|
+
return {
|
|
31
|
+
regionCount: real.length,
|
|
32
|
+
coverage,
|
|
33
|
+
explained: coverage >= 0.98 ? 'full' : coverage >= 0.5 ? 'partial' : 'none',
|
|
34
|
+
unexplainedRegions,
|
|
35
|
+
};
|
|
36
|
+
}
|
|
37
|
+
//# sourceMappingURL=coverage.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"coverage.js","sourceRoot":"","sources":["../../../src/diff/structural/coverage.ts"],"names":[],"mappings":"AAAA,4EAA4E;AAC5E,4EAA4E;AAC5E,8EAA8E;AAC9E,sCAAsC;AAatC,MAAM,UAAU,UAAU,CAAC,CAAgB,EAAE,IAAmB;IAC9D,OAAO,CACL,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC;QACrB,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,KAAK,GAAG,IAAI,CAAC,CAAC;QACtB,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC;QACrB,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,MAAM,GAAG,IAAI,CAAC,CAAC,CACxB,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,eAAe,CAAC,OAAwB,EAAE,KAAa;IACrE,yEAAyE;IACzE,0EAA0E;IAC1E,MAAM,IAAI,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,GAAG,CAAC,IAAI,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;IAChE,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC;QACnB,OAAO,EAAE,WAAW,EAAE,CAAC,EAAE,QAAQ,EAAE,CAAC,EAAE,SAAS,EAAE,MAAM,EAAE,kBAAkB,EAAE,EAAE,EAAE,CAAC;IACpF,MAAM,KAAK,GAAG,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC;IAC5C,IAAI,KAAK,GAAG,CAAC,CAAC;IACd,IAAI,SAAS,GAAG,CAAC,CAAC;IAClB,MAAM,kBAAkB,GAAoB,EAAE,CAAC;IAC/C,KAAK,MAAM,CAAC,IAAI,IAAI,EAAE,CAAC;QACrB,MAAM,IAAI,GAAG,CAAC,CAAC,KAAK,GAAG,CAAC,CAAC,MAAM,CAAC;QAChC,KAAK,IAAI,IAAI,CAAC;QACd,IAAI,KAAK,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,UAAU,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC;YAAE,SAAS,IAAI,IAAI,CAAC;;YAC5D,kBAAkB,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClC,CAAC;IACD,MAAM,QAAQ,GAAG,KAAK,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,SAAS,GAAG,KAAK,CAAC,GAAG,IAAI,CAAC,GAAG,IAAI,CAAC;IACjF,OAAO;QACL,WAAW,EAAE,IAAI,CAAC,MAAM;QACxB,QAAQ;QACR,SAAS,EAAE,QAAQ,IAAI,IAAI,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,QAAQ,IAAI,GAAG,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,MAAM;QAC3E,kBAAkB;KACnB,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
import type { Delta, StructureRect, StructureSnapshot } from '../../types.js';
|
|
2
|
+
import type { ElementMatch } from './match.js';
|
|
3
|
+
export interface Fact {
|
|
4
|
+
delta: Delta;
|
|
5
|
+
/** Old and new rects of the element(s) this fact is about, for coverage. */
|
|
6
|
+
rects: StructureRect[];
|
|
7
|
+
/** `role|tag` of the element, for the signature. */
|
|
8
|
+
abstract: string;
|
|
9
|
+
/** Position in the current document; for `removed`, that of the preceding
|
|
10
|
+
* matched element. Keeps output order stable across runs. */
|
|
11
|
+
order: number;
|
|
12
|
+
/** The element this fact is about, as an index into one side's snapshot:
|
|
13
|
+
* the baseline for matched and removed elements (their label comes from
|
|
14
|
+
* it), the current side for added ones; a shift carries its anchor's.
|
|
15
|
+
* Labels are not identities — two `div.card`s are two elements — so
|
|
16
|
+
* anything that groups facts by element keys on this. */
|
|
17
|
+
source: Source;
|
|
18
|
+
}
|
|
19
|
+
export interface Source {
|
|
20
|
+
side: 'baseline' | 'current';
|
|
21
|
+
index: number;
|
|
22
|
+
}
|
|
23
|
+
/** Within one position, which fact reads first. */
|
|
24
|
+
export declare const KIND_RANK: Record<Delta['kind'], number>;
|
|
25
|
+
export declare function computeFacts(a: StructureSnapshot, b: StructureSnapshot, match: ElementMatch): Fact[];
|
|
26
|
+
export declare function sortFacts(facts: Fact[]): Fact[];
|
|
27
|
+
/** Byte-identical output across machines needs a locale-free order;
|
|
28
|
+
* `localeCompare` is not one. */
|
|
29
|
+
export declare const compareCodeUnits: (a: string, b: string) => number;
|