@page-scanner/cli 0.1.1 → 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.
Files changed (51) hide show
  1. package/README.md +53 -4
  2. package/dist/api.d.ts +82 -2
  3. package/dist/api.d.ts.map +1 -1
  4. package/dist/api.js +147 -18
  5. package/dist/api.js.map +1 -1
  6. package/dist/batch.d.ts +60 -0
  7. package/dist/batch.d.ts.map +1 -0
  8. package/dist/batch.js +116 -0
  9. package/dist/batch.js.map +1 -0
  10. package/dist/cli/args.d.ts +21 -4
  11. package/dist/cli/args.d.ts.map +1 -1
  12. package/dist/cli/args.js +94 -10
  13. package/dist/cli/args.js.map +1 -1
  14. package/dist/cli/commands.d.ts +2 -0
  15. package/dist/cli/commands.d.ts.map +1 -1
  16. package/dist/cli/commands.js +143 -14
  17. package/dist/cli/commands.js.map +1 -1
  18. package/dist/daemon/rpc-server.d.ts.map +1 -1
  19. package/dist/daemon/rpc-server.js +17 -1
  20. package/dist/daemon/rpc-server.js.map +1 -1
  21. package/dist/diff/image.d.ts +42 -0
  22. package/dist/diff/image.d.ts.map +1 -0
  23. package/dist/diff/image.js +144 -0
  24. package/dist/diff/image.js.map +1 -0
  25. package/dist/diff/index.d.ts +46 -0
  26. package/dist/diff/index.d.ts.map +1 -0
  27. package/dist/diff/index.js +108 -0
  28. package/dist/diff/index.js.map +1 -0
  29. package/dist/diff/png.d.ts +12 -0
  30. package/dist/diff/png.d.ts.map +1 -0
  31. package/dist/diff/png.js +169 -0
  32. package/dist/diff/png.js.map +1 -0
  33. package/dist/diff/text.d.ts +54 -0
  34. package/dist/diff/text.d.ts.map +1 -0
  35. package/dist/diff/text.js +198 -0
  36. package/dist/diff/text.js.map +1 -0
  37. package/dist/index.d.ts +5 -3
  38. package/dist/index.d.ts.map +1 -1
  39. package/dist/index.js +5 -3
  40. package/dist/index.js.map +1 -1
  41. package/dist/output.d.ts +10 -0
  42. package/dist/output.d.ts.map +1 -1
  43. package/dist/output.js +24 -4
  44. package/dist/output.js.map +1 -1
  45. package/dist/protocol.d.ts +37 -2
  46. package/dist/protocol.d.ts.map +1 -1
  47. package/dist/protocol.js +23 -2
  48. package/dist/protocol.js.map +1 -1
  49. package/dist/version.d.ts +1 -1
  50. package/dist/version.js +1 -1
  51. package/package.json +3 -2
@@ -16,7 +16,7 @@
16
16
  import { createServer } from 'node:http';
17
17
  import { toPageScannerError } from '../errors.js';
18
18
  import { PageScannerError } from '../errors.js';
19
- import { DEFAULT_PAGE_SIZE, EXPORT_FORMAT_IDS, PAGE_SIZE_IDS, VIDEO_HANDLINGS, } from '../protocol.js';
19
+ import { DEFAULT_PAGE_SIZE, EXPORT_FORMAT_IDS, PAGE_SIZE_IDS, CAPTURE_WIDTHS, COLOR_SCHEME_PREFERENCES, VIDEO_HANDLINGS, STRUCTURED_MODES, } from '../protocol.js';
20
20
  import { CLI_VERSION } from '../version.js';
21
21
  import { tokensMatch } from '../bridge/tokens.js';
22
22
  /** A body larger than this is not a request we would understand anyway. */
@@ -159,7 +159,22 @@ async function dispatch(method, params, options) {
159
159
  videoHandling: oneOf(params, 'videoHandling', VIDEO_HANDLINGS, 'frame'),
160
160
  }
161
161
  : {}),
162
+ ...(params.colorScheme !== undefined
163
+ ? {
164
+ colorScheme: oneOf(params, 'colorScheme', COLOR_SCHEME_PREFERENCES, 'auto'),
165
+ }
166
+ : {}),
167
+ ...(params.captureWidth !== undefined
168
+ ? {
169
+ captureWidth: oneOf(params, 'captureWidth', CAPTURE_WIDTHS, 'window'),
170
+ }
171
+ : {}),
162
172
  ...(params.openEditor !== undefined ? { openEditor: params.openEditor === true } : {}),
173
+ ...(params.structured !== undefined
174
+ ? {
175
+ structured: oneOf(params, 'structured', STRUCTURED_MODES, 'alongside'),
176
+ }
177
+ : {}),
163
178
  }, timeoutFrom({ timeoutMs: params.scanTimeoutMs }, 120_000));
164
179
  return {
165
180
  browserId: resolved,
@@ -169,6 +184,7 @@ async function dispatch(method, params, options) {
169
184
  fileName: answer.fileName,
170
185
  truncated: answer.truncated ?? null,
171
186
  bytesBase64: answer.bytesBase64,
187
+ ...(answer.structured ? { structured: answer.structured } : {}),
172
188
  };
173
189
  }
174
190
  case 'shutdown':
@@ -1 +1 @@
1
- {"version":3,"file":"rpc-server.js","sourceRoot":"","sources":["../../src/daemon/rpc-server.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"rpc-server.js","sourceRoot":"","sources":["../../src/daemon/rpc-server.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,42 @@
1
+ /**
2
+ * What changed in a page's picture between two captures (#60): the pixels
3
+ * that differ, gathered into regions and outlined on the newer capture.
4
+ *
5
+ * A pixel counts as changed when its channels together move by more than
6
+ * `TOLERANCE`, which lets through the few levels of antialiasing that two
7
+ * renders of the same text can differ by. Changed pixels are counted in
8
+ * `CELL`-pixel squares, touching squares become one region, and regions
9
+ * closer than `MERGE_GAP` become one, so a reworded paragraph is one box
10
+ * rather than a box a letter. The comparison is position by position: a page
11
+ * that grew a banner at the top has everything below it moved, and that
12
+ * shows as changed all the way down. The text diff is the one that sees
13
+ * through a move.
14
+ */
15
+ import type { Rgba } from './png.js';
16
+ export declare const CELL = 8;
17
+ export declare const TOLERANCE = 48;
18
+ export declare const MERGE_GAP = 16;
19
+ export interface Region {
20
+ x: number;
21
+ y: number;
22
+ width: number;
23
+ height: number;
24
+ }
25
+ export interface ImageDiff {
26
+ changedPixels: number;
27
+ /** Of the newer capture's pixels, 0 to 1. */
28
+ changedFraction: number;
29
+ regions: Region[];
30
+ /** The newer capture with every region outlined. */
31
+ outlined: Rgba;
32
+ }
33
+ /** Regions within `gap` of each other, joined until none are. */
34
+ export declare function mergeRegions(regions: readonly Region[], gap?: number): Region[];
35
+ /**
36
+ * `after` compared with `before`, pixel for pixel where they overlap; any
37
+ * part of `after` that `before` does not reach counts as changed.
38
+ */
39
+ export declare function diffImages(before: Rgba, after: Rgba): ImageDiff;
40
+ /** A copy of `image` with a rectangle drawn just outside each region. */
41
+ export declare function outline(image: Rgba, regions: readonly Region[]): Rgba;
42
+ //# sourceMappingURL=image.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"image.d.ts","sourceRoot":"","sources":["../../src/diff/image.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AACH,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,UAAU,CAAC;AAErC,eAAO,MAAM,IAAI,IAAI,CAAC;AACtB,eAAO,MAAM,SAAS,KAAK,CAAC;AAC5B,eAAO,MAAM,SAAS,KAAK,CAAC;AAM5B,MAAM,WAAW,MAAM;IACrB,CAAC,EAAE,MAAM,CAAC;IACV,CAAC,EAAE,MAAM,CAAC;IACV,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,SAAS;IACxB,aAAa,EAAE,MAAM,CAAC;IACtB,6CAA6C;IAC7C,eAAe,EAAE,MAAM,CAAC;IACxB,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,oDAAoD;IACpD,QAAQ,EAAE,IAAI,CAAC;CAChB;AAgCD,iEAAiE;AACjE,wBAAgB,YAAY,CAAC,OAAO,EAAE,SAAS,MAAM,EAAE,EAAE,GAAG,SAAY,GAAG,MAAM,EAAE,CAgBlF;AAED;;;GAGG;AACH,wBAAgB,UAAU,CAAC,MAAM,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,GAAG,SAAS,CAiE/D;AAED,yEAAyE;AACzE,wBAAgB,OAAO,CAAC,KAAK,EAAE,IAAI,EAAE,OAAO,EAAE,SAAS,MAAM,EAAE,GAAG,IAAI,CAuBrE"}
@@ -0,0 +1,144 @@
1
+ export const CELL = 8;
2
+ export const TOLERANCE = 48;
3
+ export const MERGE_GAP = 16;
4
+ /** The outline's colour and width, and how far it sits outside its region. */
5
+ const OUTLINE = [230, 40, 40, 255];
6
+ const OUTLINE_WIDTH = 3;
7
+ const OUTLINE_MARGIN = 3;
8
+ function differs(a, at, b, bt) {
9
+ return (Math.abs(a[at] - b[bt]) +
10
+ Math.abs(a[at + 1] - b[bt + 1]) +
11
+ Math.abs(a[at + 2] - b[bt + 2]) +
12
+ Math.abs(a[at + 3] - b[bt + 3]) >
13
+ TOLERANCE);
14
+ }
15
+ function near(a, b, gap) {
16
+ return (a.x - gap <= b.x + b.width &&
17
+ b.x - gap <= a.x + a.width &&
18
+ a.y - gap <= b.y + b.height &&
19
+ b.y - gap <= a.y + a.height);
20
+ }
21
+ function union(a, b) {
22
+ const x = Math.min(a.x, b.x);
23
+ const y = Math.min(a.y, b.y);
24
+ return {
25
+ x,
26
+ y,
27
+ width: Math.max(a.x + a.width, b.x + b.width) - x,
28
+ height: Math.max(a.y + a.height, b.y + b.height) - y,
29
+ };
30
+ }
31
+ /** Regions within `gap` of each other, joined until none are. */
32
+ export function mergeRegions(regions, gap = MERGE_GAP) {
33
+ let merged = [...regions];
34
+ for (let changed = true; changed;) {
35
+ changed = false;
36
+ const next = [];
37
+ for (const region of merged) {
38
+ const into = next.findIndex((other) => near(other, region, gap));
39
+ if (into === -1)
40
+ next.push(region);
41
+ else {
42
+ next[into] = union(next[into], region);
43
+ changed = true;
44
+ }
45
+ }
46
+ merged = next;
47
+ }
48
+ return merged.sort((a, b) => a.y - b.y || a.x - b.x);
49
+ }
50
+ /**
51
+ * `after` compared with `before`, pixel for pixel where they overlap; any
52
+ * part of `after` that `before` does not reach counts as changed.
53
+ */
54
+ export function diffImages(before, after) {
55
+ const { width, height } = after;
56
+ const columns = Math.ceil(width / CELL);
57
+ const rows = Math.ceil(height / CELL);
58
+ const cells = new Uint8Array(columns * rows);
59
+ let changedPixels = 0;
60
+ for (let y = 0; y < height; y++) {
61
+ for (let x = 0; x < width; x++) {
62
+ const inside = x < before.width && y < before.height;
63
+ if (!inside ||
64
+ differs(after.data, (y * width + x) * 4, before.data, (y * before.width + x) * 4)) {
65
+ changedPixels++;
66
+ cells[Math.floor(y / CELL) * columns + Math.floor(x / CELL)] = 1;
67
+ }
68
+ }
69
+ }
70
+ // Touching cells, the eight around each, are one region.
71
+ const regions = [];
72
+ const seen = new Uint8Array(cells.length);
73
+ for (let start = 0; start < cells.length; start++) {
74
+ if (!cells[start] || seen[start])
75
+ continue;
76
+ let [left, top, right, bottom] = [columns, rows, 0, 0];
77
+ const queue = [start];
78
+ seen[start] = 1;
79
+ while (queue.length > 0) {
80
+ const cell = queue.pop();
81
+ const cx = cell % columns;
82
+ const cy = Math.floor(cell / columns);
83
+ left = Math.min(left, cx);
84
+ right = Math.max(right, cx);
85
+ top = Math.min(top, cy);
86
+ bottom = Math.max(bottom, cy);
87
+ for (let dy = -1; dy <= 1; dy++) {
88
+ for (let dx = -1; dx <= 1; dx++) {
89
+ const nx = cx + dx;
90
+ const ny = cy + dy;
91
+ if (nx < 0 || ny < 0 || nx >= columns || ny >= rows)
92
+ continue;
93
+ const next = ny * columns + nx;
94
+ if (cells[next] && !seen[next]) {
95
+ seen[next] = 1;
96
+ queue.push(next);
97
+ }
98
+ }
99
+ }
100
+ }
101
+ const x = left * CELL;
102
+ const y = top * CELL;
103
+ regions.push({
104
+ x,
105
+ y,
106
+ width: Math.min(width, (right + 1) * CELL) - x,
107
+ height: Math.min(height, (bottom + 1) * CELL) - y,
108
+ });
109
+ }
110
+ const merged = mergeRegions(regions);
111
+ return {
112
+ changedPixels,
113
+ changedFraction: width * height > 0 ? changedPixels / (width * height) : 0,
114
+ regions: merged,
115
+ outlined: outline(after, merged),
116
+ };
117
+ }
118
+ /** A copy of `image` with a rectangle drawn just outside each region. */
119
+ export function outline(image, regions) {
120
+ const data = Uint8Array.from(image.data);
121
+ const paint = (x, y) => {
122
+ if (x < 0 || y < 0 || x >= image.width || y >= image.height)
123
+ return;
124
+ data.set(OUTLINE, (y * image.width + x) * 4);
125
+ };
126
+ for (const region of regions) {
127
+ const left = region.x - OUTLINE_MARGIN - OUTLINE_WIDTH;
128
+ const top = region.y - OUTLINE_MARGIN - OUTLINE_WIDTH;
129
+ const right = region.x + region.width + OUTLINE_MARGIN + OUTLINE_WIDTH - 1;
130
+ const bottom = region.y + region.height + OUTLINE_MARGIN + OUTLINE_WIDTH - 1;
131
+ for (let band = 0; band < OUTLINE_WIDTH; band++) {
132
+ for (let x = left; x <= right; x++) {
133
+ paint(x, top + band);
134
+ paint(x, bottom - band);
135
+ }
136
+ for (let y = top; y <= bottom; y++) {
137
+ paint(left + band, y);
138
+ paint(right - band, y);
139
+ }
140
+ }
141
+ }
142
+ return { width: image.width, height: image.height, data };
143
+ }
144
+ //# sourceMappingURL=image.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"image.js","sourceRoot":"","sources":["../../src/diff/image.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,46 @@
1
+ import { type Region } from './image.js';
2
+ import { type Hunk } from './text.js';
3
+ export interface DiffOptions {
4
+ /** Where to write the outlined picture of a visual diff. Defaults to beside the newer file. */
5
+ out?: string;
6
+ /** What relative paths are relative to. Defaults to process.cwd(). */
7
+ cwd?: string;
8
+ }
9
+ export interface TextSide {
10
+ path: string;
11
+ /** From the Markdown's front matter, when it has one. */
12
+ source: string | null;
13
+ captured: string | null;
14
+ }
15
+ export interface TextDiffResult {
16
+ kind: 'text';
17
+ changed: boolean;
18
+ old: TextSide;
19
+ new: TextSide;
20
+ /** Whether the two front matters name the same address; null when either names none. */
21
+ sameAddress: boolean | null;
22
+ added: number;
23
+ removed: number;
24
+ hunks: Hunk[];
25
+ /** The same hunks as `diff -u` prints them. Empty when nothing changed. */
26
+ unified: string;
27
+ }
28
+ export interface ImageSide {
29
+ path: string;
30
+ width: number;
31
+ height: number;
32
+ }
33
+ export interface VisualDiffResult {
34
+ kind: 'visual';
35
+ changed: boolean;
36
+ old: ImageSide;
37
+ new: ImageSide;
38
+ changedFraction: number;
39
+ regions: Region[];
40
+ /** The newer capture with the regions outlined, or null when nothing changed. */
41
+ path: string | null;
42
+ }
43
+ export type DiffResult = TextDiffResult | VisualDiffResult;
44
+ /** Compares two captures and, for pictures, writes the outlined newer one. */
45
+ export declare function diffCaptures(oldPath: string, newPath: string, options?: DiffOptions): DiffResult;
46
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/diff/index.ts"],"names":[],"mappings":"AAgBA,OAAO,EAAc,KAAK,MAAM,EAAE,MAAM,YAAY,CAAC;AAErD,OAAO,EAA6C,KAAK,IAAI,EAAE,MAAM,WAAW,CAAC;AAEjF,MAAM,WAAW,WAAW;IAC1B,+FAA+F;IAC/F,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,sEAAsE;IACtE,GAAG,CAAC,EAAE,MAAM,CAAC;CACd;AAED,MAAM,WAAW,QAAQ;IACvB,IAAI,EAAE,MAAM,CAAC;IACb,yDAAyD;IACzD,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;IACtB,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;CACzB;AAED,MAAM,WAAW,cAAc;IAC7B,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,OAAO,CAAC;IACjB,GAAG,EAAE,QAAQ,CAAC;IACd,GAAG,EAAE,QAAQ,CAAC;IACd,wFAAwF;IACxF,WAAW,EAAE,OAAO,GAAG,IAAI,CAAC;IAC5B,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,EAAE,IAAI,EAAE,CAAC;IACd,2EAA2E;IAC3E,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,SAAS;IACxB,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,gBAAgB;IAC/B,IAAI,EAAE,QAAQ,CAAC;IACf,OAAO,EAAE,OAAO,CAAC;IACjB,GAAG,EAAE,SAAS,CAAC;IACf,GAAG,EAAE,SAAS,CAAC;IACf,eAAe,EAAE,MAAM,CAAC;IACxB,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,iFAAiF;IACjF,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC;CACrB;AAED,MAAM,MAAM,UAAU,GAAG,cAAc,GAAG,gBAAgB,CAAC;AAgD3D,8EAA8E;AAC9E,wBAAgB,YAAY,CAC1B,OAAO,EAAE,MAAM,EACf,OAAO,EAAE,MAAM,EACf,OAAO,GAAE,WAAgB,GACxB,UAAU,CAwDZ"}
@@ -0,0 +1,108 @@
1
+ /**
2
+ * `page-scanner diff` (#60): what changed between two captures of a page.
3
+ *
4
+ * Two kinds of comparison, picked by what the files are. Two Markdown files
5
+ * (`scan --markdown`, #61) are compared as text, a passage at a time. Two PNG
6
+ * captures are compared as pictures, and the newer one is written again with
7
+ * the changed regions outlined. A PDF is compared by the Markdown written
8
+ * beside it, because the text a PDF holds is where Chrome drew each glyph,
9
+ * not the passages a person reads. Nothing here needs the browser or the
10
+ * daemon: both captures are already on disk, which is the point of scanning
11
+ * a list on a schedule (#59) and diffing what it wrote.
12
+ */
13
+ import { existsSync, mkdirSync, readFileSync, writeFileSync } from 'node:fs';
14
+ import { basename, dirname, extname, resolve } from 'node:path';
15
+ import { PageScannerError } from '../errors.js';
16
+ import { withExtension } from '../output.js';
17
+ import { diffImages } from './image.js';
18
+ import { decodePng, encodePng, PngError } from './png.js';
19
+ import { diffText, formatUnified, splitFrontMatter } from './text.js';
20
+ function badRequest(message, hint) {
21
+ return new PageScannerError('BAD_REQUEST', message, hint);
22
+ }
23
+ /** The file a side is compared by, and how. */
24
+ function sideOf(path) {
25
+ const extension = extname(path).toLowerCase();
26
+ if (extension === '.md' || extension === '.markdown')
27
+ return { path, kind: 'text' };
28
+ if (extension === '.png')
29
+ return { path, kind: 'visual' };
30
+ if (extension === '.pdf') {
31
+ const beside = withExtension(path, 'md');
32
+ if (existsSync(beside))
33
+ return { path: beside, kind: 'text' };
34
+ throw badRequest(`${basename(path)} is a PDF, and there is no ${basename(beside)} beside it to compare.`, 'Scan with `--markdown beside` so each PDF has its text next to it, and diff those.');
35
+ }
36
+ if (extension === '.jpg' || extension === '.jpeg') {
37
+ throw badRequest(`${basename(path)} is a JPEG, whose compression changes pixels on its own.`, 'Scan with `--format png` to compare pictures, or `--markdown` to compare text.');
38
+ }
39
+ throw badRequest(`${basename(path)} is not a capture diff can read.`, 'It compares two Markdown files (.md), two PNGs, or two PDFs with Markdown beside them.');
40
+ }
41
+ function read(path) {
42
+ try {
43
+ return readFileSync(path);
44
+ }
45
+ catch (error) {
46
+ throw badRequest(`Could not read ${path}: ${error instanceof Error ? error.message : String(error)}`);
47
+ }
48
+ }
49
+ function textSide(path, text) {
50
+ const { fields } = splitFrontMatter(text);
51
+ return { path, source: fields.source ?? null, captured: fields.captured ?? null };
52
+ }
53
+ /** Compares two captures and, for pictures, writes the outlined newer one. */
54
+ export function diffCaptures(oldPath, newPath, options = {}) {
55
+ const cwd = options.cwd ?? process.cwd();
56
+ const before = sideOf(resolve(cwd, oldPath));
57
+ const after = sideOf(resolve(cwd, newPath));
58
+ if (before.kind !== after.kind) {
59
+ throw badRequest('The two captures are of different kinds: one is text and the other a picture.', 'Compare two Markdown files, or two PNGs.');
60
+ }
61
+ if (before.kind === 'text') {
62
+ const oldText = read(before.path).toString('utf8');
63
+ const newText = read(after.path).toString('utf8');
64
+ const diff = diffText(oldText, newText);
65
+ const old = textSide(before.path, oldText);
66
+ const next = textSide(after.path, newText);
67
+ return {
68
+ kind: 'text',
69
+ changed: diff.hunks.length > 0,
70
+ old,
71
+ new: next,
72
+ sameAddress: old.source && next.source ? old.source === next.source : null,
73
+ added: diff.added,
74
+ removed: diff.removed,
75
+ hunks: diff.hunks,
76
+ unified: formatUnified(diff, before.path, after.path),
77
+ };
78
+ }
79
+ let oldImage;
80
+ let newImage;
81
+ try {
82
+ oldImage = decodePng(read(before.path));
83
+ newImage = decodePng(read(after.path));
84
+ }
85
+ catch (error) {
86
+ if (error instanceof PngError)
87
+ throw badRequest(`Could not read the PNG: ${error.message}.`);
88
+ throw error;
89
+ }
90
+ const diff = diffImages(oldImage, newImage);
91
+ const changed = diff.regions.length > 0;
92
+ let path = null;
93
+ if (changed) {
94
+ path = options.out ? resolve(cwd, options.out) : withExtension(after.path, 'diff.png');
95
+ mkdirSync(dirname(path), { recursive: true });
96
+ writeFileSync(path, encodePng(diff.outlined));
97
+ }
98
+ return {
99
+ kind: 'visual',
100
+ changed,
101
+ old: { path: before.path, width: oldImage.width, height: oldImage.height },
102
+ new: { path: after.path, width: newImage.width, height: newImage.height },
103
+ changedFraction: diff.changedFraction,
104
+ regions: diff.regions,
105
+ path,
106
+ };
107
+ }
108
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/diff/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,12 @@
1
+ export interface Rgba {
2
+ width: number;
3
+ height: number;
4
+ /** Four bytes a pixel, row after row. */
5
+ data: Uint8Array;
6
+ }
7
+ export declare class PngError extends Error {
8
+ }
9
+ export declare function decodePng(bytes: Uint8Array): Rgba;
10
+ /** RGBA as a PNG, each row filtered Up, which suits a page's long runs of flat colour. */
11
+ export declare function encodePng(image: Rgba): Buffer;
12
+ //# sourceMappingURL=png.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"png.d.ts","sourceRoot":"","sources":["../../src/diff/png.ts"],"names":[],"mappings":"AAcA,MAAM,WAAW,IAAI;IACnB,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;IACf,yCAAyC;IACzC,IAAI,EAAE,UAAU,CAAC;CAClB;AAED,qBAAa,QAAS,SAAQ,KAAK;CAAG;AAYtC,wBAAgB,SAAS,CAAC,KAAK,EAAE,UAAU,GAAG,IAAI,CAwGjD;AAWD,0FAA0F;AAC1F,wBAAgB,SAAS,CAAC,KAAK,EAAE,IAAI,GAAG,MAAM,CAuB7C"}
@@ -0,0 +1,169 @@
1
+ /**
2
+ * PNG in and out, on `node:zlib` alone, for the visual diff (#60).
3
+ *
4
+ * The CLI ships one runtime dependency, and an image library would be a
5
+ * second for one command. A capture's PNG is the plainest kind there is: 8
6
+ * bits a channel, not interlaced. Decoding covers every colour type at 8 bits
7
+ * (grey, RGB, palette, grey with alpha, RGBA), which is what Chrome, a canvas
8
+ * and most tools write; anything else is refused by name. Encoding writes
9
+ * RGBA only.
10
+ */
11
+ import { crc32, deflateSync, inflateSync } from 'node:zlib';
12
+ const SIGNATURE = Buffer.from([0x89, 0x50, 0x4e, 0x47, 0x0d, 0x0a, 0x1a, 0x0a]);
13
+ export class PngError extends Error {
14
+ }
15
+ const CHANNELS = { 0: 1, 2: 3, 3: 1, 4: 2, 6: 4 };
16
+ function paeth(a, b, c) {
17
+ const p = a + b - c;
18
+ const pa = Math.abs(p - a);
19
+ const pb = Math.abs(p - b);
20
+ const pc = Math.abs(p - c);
21
+ return pa <= pb && pa <= pc ? a : pb <= pc ? b : c;
22
+ }
23
+ export function decodePng(bytes) {
24
+ const buffer = Buffer.from(bytes.buffer, bytes.byteOffset, bytes.byteLength);
25
+ if (buffer.length < 8 || !buffer.subarray(0, 8).equals(SIGNATURE)) {
26
+ throw new PngError('not a PNG file');
27
+ }
28
+ let width = 0;
29
+ let height = 0;
30
+ let colorType = -1;
31
+ let palette = null;
32
+ let transparency = null;
33
+ const data = [];
34
+ for (let at = 8; at + 8 <= buffer.length;) {
35
+ const length = buffer.readUInt32BE(at);
36
+ const type = buffer.toString('latin1', at + 4, at + 8);
37
+ const body = buffer.subarray(at + 8, at + 8 + length);
38
+ if (type === 'IHDR') {
39
+ width = body.readUInt32BE(0);
40
+ height = body.readUInt32BE(4);
41
+ const depth = body[8];
42
+ colorType = body[9];
43
+ const interlace = body[12];
44
+ if (depth !== 8)
45
+ throw new PngError(`a ${depth}-bit PNG, and only 8 bits a channel is read`);
46
+ if (interlace !== 0)
47
+ throw new PngError('an interlaced PNG, which is not read');
48
+ if (CHANNELS[colorType] === undefined)
49
+ throw new PngError(`PNG colour type ${colorType}`);
50
+ }
51
+ else if (type === 'PLTE')
52
+ palette = body;
53
+ else if (type === 'tRNS')
54
+ transparency = body;
55
+ else if (type === 'IDAT')
56
+ data.push(body);
57
+ else if (type === 'IEND')
58
+ break;
59
+ at += 12 + length;
60
+ }
61
+ if (width === 0 || height === 0)
62
+ throw new PngError('a PNG with no image header');
63
+ const channels = CHANNELS[colorType];
64
+ const stride = width * channels;
65
+ const raw = inflateSync(Buffer.concat(data));
66
+ if (raw.length < (stride + 1) * height)
67
+ throw new PngError('a PNG whose image data is cut short');
68
+ const rows = new Uint8Array(stride * height);
69
+ for (let y = 0; y < height; y++) {
70
+ const filter = raw[y * (stride + 1)];
71
+ const source = y * (stride + 1) + 1;
72
+ const row = y * stride;
73
+ for (let x = 0; x < stride; x++) {
74
+ const value = raw[source + x];
75
+ const left = x >= channels ? rows[row + x - channels] : 0;
76
+ const up = y > 0 ? rows[row - stride + x] : 0;
77
+ const upLeft = y > 0 && x >= channels ? rows[row - stride + x - channels] : 0;
78
+ let out;
79
+ switch (filter) {
80
+ case 0:
81
+ out = value;
82
+ break;
83
+ case 1:
84
+ out = value + left;
85
+ break;
86
+ case 2:
87
+ out = value + up;
88
+ break;
89
+ case 3:
90
+ out = value + ((left + up) >> 1);
91
+ break;
92
+ case 4:
93
+ out = value + paeth(left, up, upLeft);
94
+ break;
95
+ default:
96
+ throw new PngError(`a PNG row with filter ${filter}`);
97
+ }
98
+ rows[row + x] = out & 0xff;
99
+ }
100
+ }
101
+ const rgba = new Uint8Array(width * height * 4);
102
+ for (let pixel = 0; pixel < width * height; pixel++) {
103
+ const from = pixel * channels;
104
+ const to = pixel * 4;
105
+ switch (colorType) {
106
+ case 0:
107
+ rgba[to] = rgba[to + 1] = rgba[to + 2] = rows[from];
108
+ rgba[to + 3] = 255;
109
+ break;
110
+ case 2:
111
+ rgba[to] = rows[from];
112
+ rgba[to + 1] = rows[from + 1];
113
+ rgba[to + 2] = rows[from + 2];
114
+ rgba[to + 3] = 255;
115
+ break;
116
+ case 3: {
117
+ const index = rows[from];
118
+ if (!palette)
119
+ throw new PngError('a palette PNG with no palette');
120
+ rgba[to] = palette[index * 3] ?? 0;
121
+ rgba[to + 1] = palette[index * 3 + 1] ?? 0;
122
+ rgba[to + 2] = palette[index * 3 + 2] ?? 0;
123
+ rgba[to + 3] = transparency?.[index] ?? 255;
124
+ break;
125
+ }
126
+ case 4:
127
+ rgba[to] = rgba[to + 1] = rgba[to + 2] = rows[from];
128
+ rgba[to + 3] = rows[from + 1];
129
+ break;
130
+ default:
131
+ rgba.set(rows.subarray(from, from + 4), to);
132
+ }
133
+ }
134
+ return { width, height, data: rgba };
135
+ }
136
+ function chunk(type, body) {
137
+ const head = Buffer.alloc(8);
138
+ head.writeUInt32BE(body.length, 0);
139
+ head.write(type, 4, 'latin1');
140
+ const tail = Buffer.alloc(4);
141
+ tail.writeUInt32BE(crc32(Buffer.concat([head.subarray(4), body])) >>> 0, 0);
142
+ return Buffer.concat([head, body, tail]);
143
+ }
144
+ /** RGBA as a PNG, each row filtered Up, which suits a page's long runs of flat colour. */
145
+ export function encodePng(image) {
146
+ const stride = image.width * 4;
147
+ const raw = Buffer.alloc((stride + 1) * image.height);
148
+ for (let y = 0; y < image.height; y++) {
149
+ const out = y * (stride + 1);
150
+ raw[out] = 2;
151
+ for (let x = 0; x < stride; x++) {
152
+ const value = image.data[y * stride + x];
153
+ const up = y > 0 ? image.data[(y - 1) * stride + x] : 0;
154
+ raw[out + 1 + x] = (value - up) & 0xff;
155
+ }
156
+ }
157
+ const header = Buffer.alloc(13);
158
+ header.writeUInt32BE(image.width, 0);
159
+ header.writeUInt32BE(image.height, 4);
160
+ header[8] = 8;
161
+ header[9] = 6;
162
+ return Buffer.concat([
163
+ SIGNATURE,
164
+ chunk('IHDR', header),
165
+ chunk('IDAT', deflateSync(raw)),
166
+ chunk('IEND', new Uint8Array()),
167
+ ]);
168
+ }
169
+ //# sourceMappingURL=png.js.map