@monoes/monobrowse 1.0.12 → 1.0.13

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 (175) hide show
  1. package/dist/src/__tests__/profiler-heap.test.d.ts +2 -0
  2. package/dist/src/__tests__/profiler-heap.test.d.ts.map +1 -0
  3. package/dist/src/__tests__/profiler-heap.test.js +154 -0
  4. package/dist/src/__tests__/profiler-heap.test.js.map +1 -0
  5. package/dist/src/__tests__/report-a11y.test.d.ts +2 -0
  6. package/dist/src/__tests__/report-a11y.test.d.ts.map +1 -0
  7. package/dist/src/__tests__/report-a11y.test.js +147 -0
  8. package/dist/src/__tests__/report-a11y.test.js.map +1 -0
  9. package/dist/src/__tests__/report-analyze.test.d.ts +2 -0
  10. package/dist/src/__tests__/report-analyze.test.d.ts.map +1 -0
  11. package/dist/src/__tests__/report-analyze.test.js +157 -0
  12. package/dist/src/__tests__/report-analyze.test.js.map +1 -0
  13. package/dist/src/__tests__/report-budget.test.d.ts +2 -0
  14. package/dist/src/__tests__/report-budget.test.d.ts.map +1 -0
  15. package/dist/src/__tests__/report-budget.test.js +80 -0
  16. package/dist/src/__tests__/report-budget.test.js.map +1 -0
  17. package/dist/src/__tests__/report-diff.test.d.ts +2 -0
  18. package/dist/src/__tests__/report-diff.test.d.ts.map +1 -0
  19. package/dist/src/__tests__/report-diff.test.js +231 -0
  20. package/dist/src/__tests__/report-diff.test.js.map +1 -0
  21. package/dist/src/__tests__/report-evidence.test.d.ts +2 -0
  22. package/dist/src/__tests__/report-evidence.test.d.ts.map +1 -0
  23. package/dist/src/__tests__/report-evidence.test.js +214 -0
  24. package/dist/src/__tests__/report-evidence.test.js.map +1 -0
  25. package/dist/src/__tests__/report-flake.test.d.ts +2 -0
  26. package/dist/src/__tests__/report-flake.test.d.ts.map +1 -0
  27. package/dist/src/__tests__/report-flake.test.js +182 -0
  28. package/dist/src/__tests__/report-flake.test.js.map +1 -0
  29. package/dist/src/__tests__/report-history.test.d.ts +2 -0
  30. package/dist/src/__tests__/report-history.test.d.ts.map +1 -0
  31. package/dist/src/__tests__/report-history.test.js +229 -0
  32. package/dist/src/__tests__/report-history.test.js.map +1 -0
  33. package/dist/src/__tests__/report-output.test.d.ts +2 -0
  34. package/dist/src/__tests__/report-output.test.d.ts.map +1 -0
  35. package/dist/src/__tests__/report-output.test.js +169 -0
  36. package/dist/src/__tests__/report-output.test.js.map +1 -0
  37. package/dist/src/__tests__/report-png.test.d.ts +2 -0
  38. package/dist/src/__tests__/report-png.test.d.ts.map +1 -0
  39. package/dist/src/__tests__/report-png.test.js +84 -0
  40. package/dist/src/__tests__/report-png.test.js.map +1 -0
  41. package/dist/src/__tests__/report-render-extras.test.d.ts +2 -0
  42. package/dist/src/__tests__/report-render-extras.test.d.ts.map +1 -0
  43. package/dist/src/__tests__/report-render-extras.test.js +285 -0
  44. package/dist/src/__tests__/report-render-extras.test.js.map +1 -0
  45. package/dist/src/__tests__/report-render.test.d.ts +2 -0
  46. package/dist/src/__tests__/report-render.test.d.ts.map +1 -0
  47. package/dist/src/__tests__/report-render.test.js +143 -0
  48. package/dist/src/__tests__/report-render.test.js.map +1 -0
  49. package/dist/src/__tests__/report-run.test.d.ts +2 -0
  50. package/dist/src/__tests__/report-run.test.d.ts.map +1 -0
  51. package/dist/src/__tests__/report-run.test.js +234 -0
  52. package/dist/src/__tests__/report-run.test.js.map +1 -0
  53. package/dist/src/browser/index.d.ts +1 -0
  54. package/dist/src/browser/index.d.ts.map +1 -1
  55. package/dist/src/browser/index.js +1 -0
  56. package/dist/src/browser/index.js.map +1 -1
  57. package/dist/src/browser/profiler.d.ts.map +1 -1
  58. package/dist/src/browser/profiler.js +19 -22
  59. package/dist/src/browser/profiler.js.map +1 -1
  60. package/dist/src/cli/commands.d.ts.map +1 -1
  61. package/dist/src/cli/commands.js +254 -0
  62. package/dist/src/cli/commands.js.map +1 -1
  63. package/dist/src/report/a11y.d.ts +52 -0
  64. package/dist/src/report/a11y.d.ts.map +1 -0
  65. package/dist/src/report/a11y.js +231 -0
  66. package/dist/src/report/a11y.js.map +1 -0
  67. package/dist/src/report/analyze.d.ts +20 -0
  68. package/dist/src/report/analyze.d.ts.map +1 -0
  69. package/dist/src/report/analyze.js +136 -0
  70. package/dist/src/report/analyze.js.map +1 -0
  71. package/dist/src/report/budget.d.ts +27 -0
  72. package/dist/src/report/budget.d.ts.map +1 -0
  73. package/dist/src/report/budget.js +143 -0
  74. package/dist/src/report/budget.js.map +1 -0
  75. package/dist/src/report/collect-a11y.d.ts +25 -0
  76. package/dist/src/report/collect-a11y.d.ts.map +1 -0
  77. package/dist/src/report/collect-a11y.js +154 -0
  78. package/dist/src/report/collect-a11y.js.map +1 -0
  79. package/dist/src/report/collect.d.ts +45 -0
  80. package/dist/src/report/collect.d.ts.map +1 -0
  81. package/dist/src/report/collect.js +275 -0
  82. package/dist/src/report/collect.js.map +1 -0
  83. package/dist/src/report/evidence.d.ts +80 -0
  84. package/dist/src/report/evidence.d.ts.map +1 -0
  85. package/dist/src/report/evidence.js +279 -0
  86. package/dist/src/report/evidence.js.map +1 -0
  87. package/dist/src/report/flake.d.ts +88 -0
  88. package/dist/src/report/flake.d.ts.map +1 -0
  89. package/dist/src/report/flake.js +232 -0
  90. package/dist/src/report/flake.js.map +1 -0
  91. package/dist/src/report/history.d.ts +85 -0
  92. package/dist/src/report/history.d.ts.map +1 -0
  93. package/dist/src/report/history.js +176 -0
  94. package/dist/src/report/history.js.map +1 -0
  95. package/dist/src/report/index.d.ts +102 -0
  96. package/dist/src/report/index.d.ts.map +1 -0
  97. package/dist/src/report/index.js +216 -0
  98. package/dist/src/report/index.js.map +1 -0
  99. package/dist/src/report/pixel-diff.d.ts +30 -0
  100. package/dist/src/report/pixel-diff.d.ts.map +1 -0
  101. package/dist/src/report/pixel-diff.js +175 -0
  102. package/dist/src/report/pixel-diff.js.map +1 -0
  103. package/dist/src/report/png.d.ts +28 -0
  104. package/dist/src/report/png.d.ts.map +1 -0
  105. package/dist/src/report/png.js +259 -0
  106. package/dist/src/report/png.js.map +1 -0
  107. package/dist/src/report/render-evidence.d.ts +16 -0
  108. package/dist/src/report/render-evidence.d.ts.map +1 -0
  109. package/dist/src/report/render-evidence.js +174 -0
  110. package/dist/src/report/render-evidence.js.map +1 -0
  111. package/dist/src/report/render-trend.d.ts +16 -0
  112. package/dist/src/report/render-trend.d.ts.map +1 -0
  113. package/dist/src/report/render-trend.js +194 -0
  114. package/dist/src/report/render-trend.js.map +1 -0
  115. package/dist/src/report/render.d.ts +21 -0
  116. package/dist/src/report/render.d.ts.map +1 -0
  117. package/dist/src/report/render.js +286 -0
  118. package/dist/src/report/render.js.map +1 -0
  119. package/dist/src/report/run-diff.d.ts +18 -0
  120. package/dist/src/report/run-diff.d.ts.map +1 -0
  121. package/dist/src/report/run-diff.js +51 -0
  122. package/dist/src/report/run-diff.js.map +1 -0
  123. package/dist/src/report/structure.d.ts +41 -0
  124. package/dist/src/report/structure.d.ts.map +1 -0
  125. package/dist/src/report/structure.js +210 -0
  126. package/dist/src/report/structure.js.map +1 -0
  127. package/dist/src/report/trend.d.ts +26 -0
  128. package/dist/src/report/trend.d.ts.map +1 -0
  129. package/dist/src/report/trend.js +164 -0
  130. package/dist/src/report/trend.js.map +1 -0
  131. package/dist/src/report/types.d.ts +320 -0
  132. package/dist/src/report/types.d.ts.map +1 -0
  133. package/dist/src/report/types.js +11 -0
  134. package/dist/src/report/types.js.map +1 -0
  135. package/dist/src/report/util.d.ts +17 -0
  136. package/dist/src/report/util.d.ts.map +1 -0
  137. package/dist/src/report/util.js +45 -0
  138. package/dist/src/report/util.js.map +1 -0
  139. package/dist/tsconfig.tsbuildinfo +1 -1
  140. package/package.json +1 -1
  141. package/src/__tests__/profiler-heap.test.ts +191 -0
  142. package/src/__tests__/report-a11y.test.ts +180 -0
  143. package/src/__tests__/report-analyze.test.ts +202 -0
  144. package/src/__tests__/report-budget.test.ts +92 -0
  145. package/src/__tests__/report-diff.test.ts +272 -0
  146. package/src/__tests__/report-evidence.test.ts +276 -0
  147. package/src/__tests__/report-flake.test.ts +214 -0
  148. package/src/__tests__/report-history.test.ts +293 -0
  149. package/src/__tests__/report-output.test.ts +210 -0
  150. package/src/__tests__/report-png.test.ts +95 -0
  151. package/src/__tests__/report-render-extras.test.ts +315 -0
  152. package/src/__tests__/report-render.test.ts +175 -0
  153. package/src/__tests__/report-run.test.ts +264 -0
  154. package/src/browser/index.ts +1 -0
  155. package/src/browser/profiler.ts +28 -21
  156. package/src/cli/commands.ts +272 -0
  157. package/src/report/a11y.ts +242 -0
  158. package/src/report/analyze.ts +181 -0
  159. package/src/report/budget.ts +155 -0
  160. package/src/report/collect-a11y.ts +200 -0
  161. package/src/report/collect.ts +408 -0
  162. package/src/report/evidence.ts +379 -0
  163. package/src/report/flake.ts +303 -0
  164. package/src/report/history.ts +219 -0
  165. package/src/report/index.ts +307 -0
  166. package/src/report/pixel-diff.ts +197 -0
  167. package/src/report/png.ts +290 -0
  168. package/src/report/render-evidence.ts +194 -0
  169. package/src/report/render-trend.ts +225 -0
  170. package/src/report/render.ts +314 -0
  171. package/src/report/run-diff.ts +63 -0
  172. package/src/report/structure.ts +212 -0
  173. package/src/report/trend.ts +189 -0
  174. package/src/report/types.ts +356 -0
  175. package/src/report/util.ts +48 -0
@@ -0,0 +1,175 @@
1
+ /**
2
+ * Pixel diff between two screenshots (RIG-10), with no image dependency —
3
+ * png.ts decodes and re-encodes using node's own zlib.
4
+ *
5
+ * Two design choices worth stating:
6
+ *
7
+ * - A per-channel tolerance, not exact equality. Chrome's rasteriser is not
8
+ * bit-deterministic across runs (font hinting, GPU vs. software paths), so
9
+ * an exact compare reports 4% of every screenshot as "changed" and the
10
+ * number becomes noise nobody reads.
11
+ * - Differing dimensions are a result, not an error. A page that grew 200px
12
+ * taller is exactly the regression this is for, so we compare the
13
+ * overlapping region, count the rest as changed, and say so.
14
+ */
15
+ import { decodePng, encodePng, pngToDataUrl } from './png.js';
16
+ /** Per-channel delta below which two pixels are "the same". */
17
+ const DEFAULT_THRESHOLD = 16;
18
+ /**
19
+ * Cap on the highlight image, in pixels. A full-page shot of a long article
20
+ * can be 1440x20000; inlining that as a data URI would add ~20MB to a report
21
+ * that is supposed to stay openable.
22
+ */
23
+ const DEFAULT_MAX_PIXELS = 1_400_000;
24
+ function changedAt(a, ai, b, bi, threshold) {
25
+ return (Math.abs(a[ai] - b[bi]) > threshold ||
26
+ Math.abs(a[ai + 1] - b[bi + 1]) > threshold ||
27
+ Math.abs(a[ai + 2] - b[bi + 2]) > threshold ||
28
+ Math.abs(a[ai + 3] - b[bi + 3]) > threshold);
29
+ }
30
+ /**
31
+ * Build the highlight image: the current screenshot faded towards white so it
32
+ * reads as context, with changed pixels painted a saturated magenta. Scaled
33
+ * down by an integer factor when the shot is large, ORing the change mask so
34
+ * a one-pixel-wide change survives the downscale instead of being averaged
35
+ * into invisibility.
36
+ */
37
+ function renderHighlight(current, mask, maxPixels) {
38
+ const { width, height, data } = current;
39
+ const scale = Math.max(1, Math.ceil(Math.sqrt((width * height) / maxPixels)));
40
+ const outW = Math.max(1, Math.ceil(width / scale));
41
+ const outH = Math.max(1, Math.ceil(height / scale));
42
+ const out = new Uint8Array(outW * outH * 4);
43
+ for (let oy = 0; oy < outH; oy++) {
44
+ for (let ox = 0; ox < outW; ox++) {
45
+ let r = 0;
46
+ let g = 0;
47
+ let b = 0;
48
+ let n = 0;
49
+ let hit = false;
50
+ for (let dy = 0; dy < scale; dy++) {
51
+ const y = oy * scale + dy;
52
+ if (y >= height)
53
+ break;
54
+ for (let dx = 0; dx < scale; dx++) {
55
+ const x = ox * scale + dx;
56
+ if (x >= width)
57
+ break;
58
+ const i = (y * width + x) * 4;
59
+ r += data[i];
60
+ g += data[i + 1];
61
+ b += data[i + 2];
62
+ n++;
63
+ if (mask[y * width + x])
64
+ hit = true;
65
+ }
66
+ }
67
+ const o = (oy * outW + ox) * 4;
68
+ if (!n) {
69
+ out[o + 3] = 255;
70
+ continue;
71
+ }
72
+ if (hit) {
73
+ out[o] = 214;
74
+ out[o + 1] = 31;
75
+ out[o + 2] = 105;
76
+ }
77
+ else {
78
+ // Fade to white: keeps the layout legible without competing with the
79
+ // magenta, and compresses far better than the original.
80
+ out[o] = Math.round(255 - (255 - r / n) * 0.28);
81
+ out[o + 1] = Math.round(255 - (255 - g / n) * 0.28);
82
+ out[o + 2] = Math.round(255 - (255 - b / n) * 0.28);
83
+ }
84
+ out[o + 3] = 255;
85
+ }
86
+ }
87
+ return { image: { width: outW, height: outH, data: out }, scale };
88
+ }
89
+ /**
90
+ * Compare two PNGs. Never throws for image-shaped reasons — an undecodable
91
+ * screenshot produces a result carrying `note` and no counts, because a
92
+ * report that renders minus one section beats a report that fails to build.
93
+ */
94
+ export function pixelDiff(previousPng, currentPng, options = {}) {
95
+ const threshold = options.threshold ?? DEFAULT_THRESHOLD;
96
+ const maxPixels = options.maxPixels ?? DEFAULT_MAX_PIXELS;
97
+ let prev;
98
+ let curr;
99
+ try {
100
+ prev = decodePng(previousPng);
101
+ curr = decodePng(currentPng);
102
+ }
103
+ catch (err) {
104
+ return {
105
+ comparable: false,
106
+ note: `Pixel diff skipped: ${err.message}`,
107
+ changedPixels: 0,
108
+ totalPixels: 0,
109
+ changedPercent: 0,
110
+ previousSize: null,
111
+ currentSize: null,
112
+ sizeChanged: false,
113
+ };
114
+ }
115
+ const overlapW = Math.min(prev.width, curr.width);
116
+ const overlapH = Math.min(prev.height, curr.height);
117
+ const sizeChanged = prev.width !== curr.width || prev.height !== curr.height;
118
+ // Denominator is the union, not the overlap: if the page doubled in height,
119
+ // "0.1% of pixels changed" would be a lie told by a small denominator.
120
+ const totalPixels = Math.max(prev.width * prev.height, curr.width * curr.height);
121
+ const mask = new Uint8Array(curr.width * curr.height);
122
+ let changed = 0;
123
+ for (let y = 0; y < curr.height; y++) {
124
+ for (let x = 0; x < curr.width; x++) {
125
+ const ci = (y * curr.width + x) * 4;
126
+ if (x >= overlapW || y >= overlapH) {
127
+ // Outside the overlap there is nothing to compare against: the pixel
128
+ // is new by definition.
129
+ mask[y * curr.width + x] = 1;
130
+ changed++;
131
+ continue;
132
+ }
133
+ const pi = (y * prev.width + x) * 4;
134
+ if (changedAt(prev.data, pi, curr.data, ci, threshold)) {
135
+ mask[y * curr.width + x] = 1;
136
+ changed++;
137
+ }
138
+ }
139
+ }
140
+ // Pixels the previous shot had and this one does not are changes too.
141
+ changed += Math.max(0, prev.width * prev.height - overlapW * overlapH);
142
+ const result = {
143
+ comparable: true,
144
+ changedPixels: changed,
145
+ totalPixels,
146
+ changedPercent: totalPixels ? (changed / totalPixels) * 100 : 0,
147
+ previousSize: { width: prev.width, height: prev.height },
148
+ currentSize: { width: curr.width, height: curr.height },
149
+ sizeChanged,
150
+ };
151
+ if (options.renderImage !== false && changed > 0) {
152
+ try {
153
+ const { image, scale } = renderHighlight(curr, mask, maxPixels);
154
+ result.diffDataUrl = pngToDataUrl(encodePng(image));
155
+ if (scale > 1)
156
+ result.scale = scale;
157
+ }
158
+ catch (err) {
159
+ result.note = `Highlight image not rendered: ${err.message}`;
160
+ }
161
+ }
162
+ return result;
163
+ }
164
+ /** One line for a CI log. */
165
+ export function summarizePixelDiff(diff) {
166
+ if (!diff.comparable)
167
+ return diff.note ?? 'pixel diff unavailable';
168
+ const pct = diff.changedPercent;
169
+ const shown = pct === 0 ? '0' : pct < 0.01 ? '<0.01' : pct.toFixed(2);
170
+ const size = diff.sizeChanged
171
+ ? ` (size ${diff.previousSize?.width}x${diff.previousSize?.height} -> ${diff.currentSize?.width}x${diff.currentSize?.height})`
172
+ : '';
173
+ return `${shown}% of pixels changed${size}`;
174
+ }
175
+ //# sourceMappingURL=pixel-diff.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pixel-diff.js","sourceRoot":"","sources":["../../../src/report/pixel-diff.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,28 @@
1
+ /**
2
+ * A minimal PNG decoder and encoder built on node's own `zlib`.
3
+ *
4
+ * This exists so the pixel diff (RIG-10) can compare two screenshots without
5
+ * adding an image dependency to a package whose whole point is to be a small
6
+ * self-contained CDP client. PNG is simple enough to justify it: the format
7
+ * is a chunk list wrapping one zlib stream, and node ships the zlib.
8
+ *
9
+ * Scope is deliberately narrow — what `Page.captureScreenshot` actually
10
+ * emits. Non-interlaced, bit depth 8 (16 is accepted by taking the high
11
+ * byte), colour types 0/2/3/4/6. Anything else throws a message that names
12
+ * what it saw, so the caller can degrade to "pixel diff unavailable" instead
13
+ * of rendering a wrong picture.
14
+ */
15
+ export interface RgbaImage {
16
+ width: number;
17
+ height: number;
18
+ /** Row-major RGBA, 4 bytes per pixel, length === width * height * 4. */
19
+ data: Uint8Array;
20
+ }
21
+ export declare function crc32(buf: Uint8Array): number;
22
+ export declare function decodePng(input: Uint8Array): RgbaImage;
23
+ /** Encode RGBA bytes as a non-interlaced, 8-bit truecolour-with-alpha PNG. */
24
+ export declare function encodePng(image: RgbaImage): Buffer;
25
+ /** `data:image/png;base64,...` -> bytes. Accepts a bare base64 payload too. */
26
+ export declare function pngFromDataUrl(dataUrl: string): Uint8Array;
27
+ export declare function pngToDataUrl(png: Uint8Array): string;
28
+ //# sourceMappingURL=png.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"png.d.ts","sourceRoot":"","sources":["../../../src/report/png.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAMH,MAAM,WAAW,SAAS;IACxB,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;IACf,wEAAwE;IACxE,IAAI,EAAE,UAAU,CAAC;CAClB;AAgBD,wBAAgB,KAAK,CAAC,GAAG,EAAE,UAAU,GAAG,MAAM,CAI7C;AAoID,wBAAgB,SAAS,CAAC,KAAK,EAAE,UAAU,GAAG,SAAS,CAwDtD;AAgBD,8EAA8E;AAC9E,wBAAgB,SAAS,CAAC,KAAK,EAAE,SAAS,GAAG,MAAM,CA6BlD;AAED,+EAA+E;AAC/E,wBAAgB,cAAc,CAAC,OAAO,EAAE,MAAM,GAAG,UAAU,CAI1D;AAED,wBAAgB,YAAY,CAAC,GAAG,EAAE,UAAU,GAAG,MAAM,CAEpD"}
@@ -0,0 +1,259 @@
1
+ /**
2
+ * A minimal PNG decoder and encoder built on node's own `zlib`.
3
+ *
4
+ * This exists so the pixel diff (RIG-10) can compare two screenshots without
5
+ * adding an image dependency to a package whose whole point is to be a small
6
+ * self-contained CDP client. PNG is simple enough to justify it: the format
7
+ * is a chunk list wrapping one zlib stream, and node ships the zlib.
8
+ *
9
+ * Scope is deliberately narrow — what `Page.captureScreenshot` actually
10
+ * emits. Non-interlaced, bit depth 8 (16 is accepted by taking the high
11
+ * byte), colour types 0/2/3/4/6. Anything else throws a message that names
12
+ * what it saw, so the caller can degrade to "pixel diff unavailable" instead
13
+ * of rendering a wrong picture.
14
+ */
15
+ import { deflateSync, inflateSync } from 'node:zlib';
16
+ const SIGNATURE = Buffer.from([0x89, 0x50, 0x4e, 0x47, 0x0d, 0x0a, 0x1a, 0x0a]);
17
+ // ---------------------------------------------------------------------------
18
+ // CRC32 — PNG chunks carry their own checksum, and zlib does not expose one.
19
+ // ---------------------------------------------------------------------------
20
+ const CRC_TABLE = (() => {
21
+ const table = new Uint32Array(256);
22
+ for (let n = 0; n < 256; n++) {
23
+ let c = n;
24
+ for (let k = 0; k < 8; k++)
25
+ c = c & 1 ? 0xedb88320 ^ (c >>> 1) : c >>> 1;
26
+ table[n] = c >>> 0;
27
+ }
28
+ return table;
29
+ })();
30
+ export function crc32(buf) {
31
+ let c = 0xffffffff;
32
+ for (let i = 0; i < buf.length; i++)
33
+ c = CRC_TABLE[(c ^ buf[i]) & 0xff] ^ (c >>> 8);
34
+ return (c ^ 0xffffffff) >>> 0;
35
+ }
36
+ // ---------------------------------------------------------------------------
37
+ // Decode
38
+ // ---------------------------------------------------------------------------
39
+ const CHANNELS = { 0: 1, 2: 3, 3: 1, 4: 2, 6: 4 };
40
+ function paeth(a, b, c) {
41
+ const p = a + b - c;
42
+ const pa = Math.abs(p - a);
43
+ const pb = Math.abs(p - b);
44
+ const pc = Math.abs(p - c);
45
+ if (pa <= pb && pa <= pc)
46
+ return a;
47
+ return pb <= pc ? b : c;
48
+ }
49
+ /** Undo the per-scanline filters in place, returning the raw sample bytes. */
50
+ function unfilter(raw, width, height, bpp, stride) {
51
+ const out = Buffer.alloc(height * stride);
52
+ let pos = 0;
53
+ for (let y = 0; y < height; y++) {
54
+ const filter = raw[pos++];
55
+ const line = raw.subarray(pos, pos + stride);
56
+ pos += stride;
57
+ const cur = out.subarray(y * stride, (y + 1) * stride);
58
+ const prev = y > 0 ? out.subarray((y - 1) * stride, y * stride) : null;
59
+ for (let x = 0; x < stride; x++) {
60
+ const a = x >= bpp ? cur[x - bpp] : 0;
61
+ const b = prev ? prev[x] : 0;
62
+ const c = prev && x >= bpp ? prev[x - bpp] : 0;
63
+ const v = line[x];
64
+ switch (filter) {
65
+ case 0:
66
+ cur[x] = v;
67
+ break;
68
+ case 1:
69
+ cur[x] = (v + a) & 0xff;
70
+ break;
71
+ case 2:
72
+ cur[x] = (v + b) & 0xff;
73
+ break;
74
+ case 3:
75
+ cur[x] = (v + ((a + b) >> 1)) & 0xff;
76
+ break;
77
+ case 4:
78
+ cur[x] = (v + paeth(a, b, c)) & 0xff;
79
+ break;
80
+ default:
81
+ throw new Error(`PNG: unknown scanline filter ${filter} on row ${y}`);
82
+ }
83
+ }
84
+ }
85
+ void width;
86
+ return out;
87
+ }
88
+ function readHeader(buf, offset) {
89
+ return {
90
+ width: buf.readUInt32BE(offset),
91
+ height: buf.readUInt32BE(offset + 4),
92
+ bitDepth: buf[offset + 8],
93
+ colorType: buf[offset + 9],
94
+ interlace: buf[offset + 12],
95
+ };
96
+ }
97
+ /**
98
+ * Expand one row of decoded samples into RGBA. `step` is the byte stride of
99
+ * one sample (1 for bit depth 8, 2 for 16 — where we keep the high byte).
100
+ */
101
+ function toRgba(samples, header, palette, transparency) {
102
+ const { width, height, bitDepth, colorType } = header;
103
+ const channels = CHANNELS[colorType];
104
+ const step = bitDepth === 16 ? 2 : 1;
105
+ const stride = width * channels * step;
106
+ const out = new Uint8Array(width * height * 4);
107
+ for (let y = 0; y < height; y++) {
108
+ for (let x = 0; x < width; x++) {
109
+ const s = y * stride + x * channels * step;
110
+ const d = (y * width + x) * 4;
111
+ if (colorType === 3) {
112
+ const index = samples[s];
113
+ if (!palette || index * 3 + 2 >= palette.length) {
114
+ throw new Error(`PNG: palette index ${index} out of range`);
115
+ }
116
+ out[d] = palette[index * 3];
117
+ out[d + 1] = palette[index * 3 + 1];
118
+ out[d + 2] = palette[index * 3 + 2];
119
+ out[d + 3] = transparency && index < transparency.length ? transparency[index] : 255;
120
+ }
121
+ else if (colorType === 0) {
122
+ const g = samples[s];
123
+ out[d] = g;
124
+ out[d + 1] = g;
125
+ out[d + 2] = g;
126
+ out[d + 3] = 255;
127
+ }
128
+ else if (colorType === 4) {
129
+ const g = samples[s];
130
+ out[d] = g;
131
+ out[d + 1] = g;
132
+ out[d + 2] = g;
133
+ out[d + 3] = samples[s + step];
134
+ }
135
+ else if (colorType === 2) {
136
+ out[d] = samples[s];
137
+ out[d + 1] = samples[s + step];
138
+ out[d + 2] = samples[s + 2 * step];
139
+ out[d + 3] = 255;
140
+ }
141
+ else {
142
+ out[d] = samples[s];
143
+ out[d + 1] = samples[s + step];
144
+ out[d + 2] = samples[s + 2 * step];
145
+ out[d + 3] = samples[s + 3 * step];
146
+ }
147
+ }
148
+ }
149
+ return out;
150
+ }
151
+ export function decodePng(input) {
152
+ const buf = Buffer.from(input.buffer, input.byteOffset, input.byteLength);
153
+ if (buf.length < 8 || !buf.subarray(0, 8).equals(SIGNATURE)) {
154
+ throw new Error('PNG: not a PNG (bad signature)');
155
+ }
156
+ let header = null;
157
+ let palette = null;
158
+ let transparency = null;
159
+ const idat = [];
160
+ let pos = 8;
161
+ while (pos + 8 <= buf.length) {
162
+ const length = buf.readUInt32BE(pos);
163
+ const type = buf.toString('ascii', pos + 4, pos + 8);
164
+ const dataStart = pos + 8;
165
+ if (dataStart + length > buf.length)
166
+ throw new Error(`PNG: truncated ${type} chunk`);
167
+ if (type === 'IHDR')
168
+ header = readHeader(buf, dataStart);
169
+ else if (type === 'PLTE')
170
+ palette = buf.subarray(dataStart, dataStart + length);
171
+ else if (type === 'tRNS')
172
+ transparency = buf.subarray(dataStart, dataStart + length);
173
+ else if (type === 'IDAT')
174
+ idat.push(buf.subarray(dataStart, dataStart + length));
175
+ else if (type === 'IEND')
176
+ break;
177
+ pos = dataStart + length + 4;
178
+ }
179
+ if (!header)
180
+ throw new Error('PNG: no IHDR chunk');
181
+ if (header.interlace !== 0) {
182
+ throw new Error('PNG: interlaced (Adam7) images are not supported');
183
+ }
184
+ if (header.bitDepth !== 8 && header.bitDepth !== 16) {
185
+ throw new Error(`PNG: unsupported bit depth ${header.bitDepth} (need 8 or 16)`);
186
+ }
187
+ const channels = CHANNELS[header.colorType];
188
+ if (channels === undefined) {
189
+ throw new Error(`PNG: unsupported colour type ${header.colorType}`);
190
+ }
191
+ if (header.colorType === 3 && header.bitDepth !== 8) {
192
+ throw new Error(`PNG: palette images below bit depth 8 are not supported`);
193
+ }
194
+ if (!idat.length)
195
+ throw new Error('PNG: no IDAT data');
196
+ const sampleBytes = header.bitDepth === 16 ? 2 : 1;
197
+ const stride = header.width * channels * sampleBytes;
198
+ const bpp = Math.max(1, channels * sampleBytes);
199
+ const inflated = inflateSync(Buffer.concat(idat));
200
+ const expected = header.height * (stride + 1);
201
+ if (inflated.length < expected) {
202
+ throw new Error(`PNG: pixel data short by ${expected - inflated.length} bytes`);
203
+ }
204
+ const samples = unfilter(inflated, header.width, header.height, bpp, stride);
205
+ return {
206
+ width: header.width,
207
+ height: header.height,
208
+ data: toRgba(samples, header, palette, transparency),
209
+ };
210
+ }
211
+ // ---------------------------------------------------------------------------
212
+ // Encode
213
+ // ---------------------------------------------------------------------------
214
+ function chunk(type, data) {
215
+ const head = Buffer.alloc(8);
216
+ head.writeUInt32BE(data.length, 0);
217
+ head.write(type, 4, 'ascii');
218
+ const body = Buffer.concat([head.subarray(4), Buffer.from(data)]);
219
+ const crc = Buffer.alloc(4);
220
+ crc.writeUInt32BE(crc32(body), 0);
221
+ return Buffer.concat([head.subarray(0, 4), body, crc]);
222
+ }
223
+ /** Encode RGBA bytes as a non-interlaced, 8-bit truecolour-with-alpha PNG. */
224
+ export function encodePng(image) {
225
+ const { width, height, data } = image;
226
+ if (data.length !== width * height * 4) {
227
+ throw new Error(`PNG: encode expected ${width * height * 4} bytes for ${width}x${height}, got ${data.length}`);
228
+ }
229
+ const stride = width * 4;
230
+ const raw = Buffer.alloc(height * (stride + 1));
231
+ for (let y = 0; y < height; y++) {
232
+ raw[y * (stride + 1)] = 0; // filter: None. Simplest, and deflate still wins.
233
+ Buffer.from(data.buffer, data.byteOffset + y * stride, stride).copy(raw, y * (stride + 1) + 1);
234
+ }
235
+ const ihdr = Buffer.alloc(13);
236
+ ihdr.writeUInt32BE(width, 0);
237
+ ihdr.writeUInt32BE(height, 4);
238
+ ihdr[8] = 8; // bit depth
239
+ ihdr[9] = 6; // colour type: RGBA
240
+ ihdr[10] = 0; // compression
241
+ ihdr[11] = 0; // filter
242
+ ihdr[12] = 0; // interlace
243
+ return Buffer.concat([
244
+ SIGNATURE,
245
+ chunk('IHDR', ihdr),
246
+ chunk('IDAT', deflateSync(raw, { level: 6 })),
247
+ chunk('IEND', new Uint8Array(0)),
248
+ ]);
249
+ }
250
+ /** `data:image/png;base64,...` -> bytes. Accepts a bare base64 payload too. */
251
+ export function pngFromDataUrl(dataUrl) {
252
+ const comma = dataUrl.indexOf(',');
253
+ const payload = dataUrl.startsWith('data:') && comma >= 0 ? dataUrl.slice(comma + 1) : dataUrl;
254
+ return new Uint8Array(Buffer.from(payload, 'base64'));
255
+ }
256
+ export function pngToDataUrl(png) {
257
+ return `data:image/png;base64,${Buffer.from(png).toString('base64')}`;
258
+ }
259
+ //# sourceMappingURL=png.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"png.js","sourceRoot":"","sources":["../../../src/report/png.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAEH,OAAO,EAAE,WAAW,EAAE,WAAW,EAAE,MAAM,WAAW,CAAC;AAErD,MAAM,SAAS,GAAG,MAAM,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,CAAC,CAAC,CAAC;AAShF,8EAA8E;AAC9E,6EAA6E;AAC7E,8EAA8E;AAE9E,MAAM,SAAS,GAAG,CAAC,GAAG,EAAE;IACtB,MAAM,KAAK,GAAG,IAAI,WAAW,CAAC,GAAG,CAAC,CAAC;IACnC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,GAAG,EAAE,CAAC,EAAE,EAAE,CAAC;QAC7B,IAAI,CAAC,GAAG,CAAC,CAAC;QACV,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE;YAAE,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,UAAU,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC;QACzE,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;IACrB,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC,CAAC,EAAE,CAAC;AAEL,MAAM,UAAU,KAAK,CAAC,GAAe;IACnC,IAAI,CAAC,GAAG,UAAU,CAAC;IACnB,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,GAAG,CAAC,MAAM,EAAE,CAAC,EAAE;QAAE,CAAC,GAAG,SAAS,CAAC,CAAC,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC;IACpF,OAAO,CAAC,CAAC,GAAG,UAAU,CAAC,KAAK,CAAC,CAAC;AAChC,CAAC;AAED,8EAA8E;AAC9E,SAAS;AACT,8EAA8E;AAE9E,MAAM,QAAQ,GAA2B,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC;AAE1E,SAAS,KAAK,CAAC,CAAS,EAAE,CAAS,EAAE,CAAS;IAC5C,MAAM,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;IACpB,MAAM,EAAE,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;IAC3B,MAAM,EAAE,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;IAC3B,MAAM,EAAE,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;IAC3B,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE;QAAE,OAAO,CAAC,CAAC;IACnC,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;AAC1B,CAAC;AAED,8EAA8E;AAC9E,SAAS,QAAQ,CAAC,GAAW,EAAE,KAAa,EAAE,MAAc,EAAE,GAAW,EAAE,MAAc;IACvF,MAAM,GAAG,GAAG,MAAM,CAAC,KAAK,CAAC,MAAM,GAAG,MAAM,CAAC,CAAC;IAC1C,IAAI,GAAG,GAAG,CAAC,CAAC;IACZ,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QAChC,MAAM,MAAM,GAAG,GAAG,CAAC,GAAG,EAAE,CAAC,CAAC;QAC1B,MAAM,IAAI,GAAG,GAAG,CAAC,QAAQ,CAAC,GAAG,EAAE,GAAG,GAAG,MAAM,CAAC,CAAC;QAC7C,GAAG,IAAI,MAAM,CAAC;QACd,MAAM,GAAG,GAAG,GAAG,CAAC,QAAQ,CAAC,CAAC,GAAG,MAAM,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,MAAM,CAAC,CAAC;QACvD,MAAM,IAAI,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,MAAM,EAAE,CAAC,GAAG,MAAM,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;QACvE,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;YAChC,MAAM,CAAC,GAAG,CAAC,IAAI,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;YACtC,MAAM,CAAC,GAAG,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;YAC7B,MAAM,CAAC,GAAG,IAAI,IAAI,CAAC,IAAI,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;YAC/C,MAAM,CAAC,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC;YAClB,QAAQ,MAAM,EAAE,CAAC;gBACf,KAAK,CAAC;oBACJ,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC;oBACX,MAAM;gBACR,KAAK,CAAC;oBACJ,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,IAAI,CAAC;oBACxB,MAAM;gBACR,KAAK,CAAC;oBACJ,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,IAAI,CAAC;oBACxB,MAAM;gBACR,KAAK,CAAC;oBACJ,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC;oBACrC,MAAM;gBACR,KAAK,CAAC;oBACJ,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,KAAK,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC;oBACrC,MAAM;gBACR;oBACE,MAAM,IAAI,KAAK,CAAC,gCAAgC,MAAM,WAAW,CAAC,EAAE,CAAC,CAAC;YAC1E,CAAC;QACH,CAAC;IACH,CAAC;IACD,KAAK,KAAK,CAAC;IACX,OAAO,GAAG,CAAC;AACb,CAAC;AAUD,SAAS,UAAU,CAAC,GAAW,EAAE,MAAc;IAC7C,OAAO;QACL,KAAK,EAAE,GAAG,CAAC,YAAY,CAAC,MAAM,CAAC;QAC/B,MAAM,EAAE,GAAG,CAAC,YAAY,CAAC,MAAM,GAAG,CAAC,CAAC;QACpC,QAAQ,EAAE,GAAG,CAAC,MAAM,GAAG,CAAC,CAAC;QACzB,SAAS,EAAE,GAAG,CAAC,MAAM,GAAG,CAAC,CAAC;QAC1B,SAAS,EAAE,GAAG,CAAC,MAAM,GAAG,EAAE,CAAC;KAC5B,CAAC;AACJ,CAAC;AAED;;;GAGG;AACH,SAAS,MAAM,CACb,OAAe,EACf,MAAc,EACd,OAAsB,EACtB,YAA2B;IAE3B,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,SAAS,EAAE,GAAG,MAAM,CAAC;IACtD,MAAM,QAAQ,GAAG,QAAQ,CAAC,SAAS,CAAC,CAAC;IACrC,MAAM,IAAI,GAAG,QAAQ,KAAK,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IACrC,MAAM,MAAM,GAAG,KAAK,GAAG,QAAQ,GAAG,IAAI,CAAC;IACvC,MAAM,GAAG,GAAG,IAAI,UAAU,CAAC,KAAK,GAAG,MAAM,GAAG,CAAC,CAAC,CAAC;IAE/C,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QAChC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,EAAE,CAAC,EAAE,EAAE,CAAC;YAC/B,MAAM,CAAC,GAAG,CAAC,GAAG,MAAM,GAAG,CAAC,GAAG,QAAQ,GAAG,IAAI,CAAC;YAC3C,MAAM,CAAC,GAAG,CAAC,CAAC,GAAG,KAAK,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC;YAC9B,IAAI,SAAS,KAAK,CAAC,EAAE,CAAC;gBACpB,MAAM,KAAK,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC;gBACzB,IAAI,CAAC,OAAO,IAAI,KAAK,GAAG,CAAC,GAAG,CAAC,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC;oBAChD,MAAM,IAAI,KAAK,CAAC,sBAAsB,KAAK,eAAe,CAAC,CAAC;gBAC9D,CAAC;gBACD,GAAG,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC;gBAC5B,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,OAAO,CAAC,KAAK,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC;gBACpC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,OAAO,CAAC,KAAK,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC;gBACpC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,YAAY,IAAI,KAAK,GAAG,YAAY,CAAC,MAAM,CAAC,CAAC,CAAC,YAAY,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC;YACvF,CAAC;iBAAM,IAAI,SAAS,KAAK,CAAC,EAAE,CAAC;gBAC3B,MAAM,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC;gBACrB,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC;gBACX,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC;gBACf,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC;gBACf,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,GAAG,CAAC;YACnB,CAAC;iBAAM,IAAI,SAAS,KAAK,CAAC,EAAE,CAAC;gBAC3B,MAAM,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC;gBACrB,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC;gBACX,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC;gBACf,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC;gBACf,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,OAAO,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC;YACjC,CAAC;iBAAM,IAAI,SAAS,KAAK,CAAC,EAAE,CAAC;gBAC3B,GAAG,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC;gBACpB,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,OAAO,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC;gBAC/B,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,OAAO,CAAC,CAAC,GAAG,CAAC,GAAG,IAAI,CAAC,CAAC;gBACnC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,GAAG,CAAC;YACnB,CAAC;iBAAM,CAAC;gBACN,GAAG,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC;gBACpB,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,OAAO,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC;gBAC/B,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,OAAO,CAAC,CAAC,GAAG,CAAC,GAAG,IAAI,CAAC,CAAC;gBACnC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,OAAO,CAAC,CAAC,GAAG,CAAC,GAAG,IAAI,CAAC,CAAC;YACrC,CAAC;QACH,CAAC;IACH,CAAC;IACD,OAAO,GAAG,CAAC;AACb,CAAC;AAED,MAAM,UAAU,SAAS,CAAC,KAAiB;IACzC,MAAM,GAAG,GAAG,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,MAAM,EAAE,KAAK,CAAC,UAAU,EAAE,KAAK,CAAC,UAAU,CAAC,CAAC;IAC1E,IAAI,GAAG,CAAC,MAAM,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,SAAS,CAAC,EAAE,CAAC;QAC5D,MAAM,IAAI,KAAK,CAAC,gCAAgC,CAAC,CAAC;IACpD,CAAC;IAED,IAAI,MAAM,GAAkB,IAAI,CAAC;IACjC,IAAI,OAAO,GAAkB,IAAI,CAAC;IAClC,IAAI,YAAY,GAAkB,IAAI,CAAC;IACvC,MAAM,IAAI,GAAa,EAAE,CAAC;IAE1B,IAAI,GAAG,GAAG,CAAC,CAAC;IACZ,OAAO,GAAG,GAAG,CAAC,IAAI,GAAG,CAAC,MAAM,EAAE,CAAC;QAC7B,MAAM,MAAM,GAAG,GAAG,CAAC,YAAY,CAAC,GAAG,CAAC,CAAC;QACrC,MAAM,IAAI,GAAG,GAAG,CAAC,QAAQ,CAAC,OAAO,EAAE,GAAG,GAAG,CAAC,EAAE,GAAG,GAAG,CAAC,CAAC,CAAC;QACrD,MAAM,SAAS,GAAG,GAAG,GAAG,CAAC,CAAC;QAC1B,IAAI,SAAS,GAAG,MAAM,GAAG,GAAG,CAAC,MAAM;YAAE,MAAM,IAAI,KAAK,CAAC,kBAAkB,IAAI,QAAQ,CAAC,CAAC;QACrF,IAAI,IAAI,KAAK,MAAM;YAAE,MAAM,GAAG,UAAU,CAAC,GAAG,EAAE,SAAS,CAAC,CAAC;aACpD,IAAI,IAAI,KAAK,MAAM;YAAE,OAAO,GAAG,GAAG,CAAC,QAAQ,CAAC,SAAS,EAAE,SAAS,GAAG,MAAM,CAAC,CAAC;aAC3E,IAAI,IAAI,KAAK,MAAM;YAAE,YAAY,GAAG,GAAG,CAAC,QAAQ,CAAC,SAAS,EAAE,SAAS,GAAG,MAAM,CAAC,CAAC;aAChF,IAAI,IAAI,KAAK,MAAM;YAAE,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,QAAQ,CAAC,SAAS,EAAE,SAAS,GAAG,MAAM,CAAC,CAAC,CAAC;aAC5E,IAAI,IAAI,KAAK,MAAM;YAAE,MAAM;QAChC,GAAG,GAAG,SAAS,GAAG,MAAM,GAAG,CAAC,CAAC;IAC/B,CAAC;IAED,IAAI,CAAC,MAAM;QAAE,MAAM,IAAI,KAAK,CAAC,oBAAoB,CAAC,CAAC;IACnD,IAAI,MAAM,CAAC,SAAS,KAAK,CAAC,EAAE,CAAC;QAC3B,MAAM,IAAI,KAAK,CAAC,kDAAkD,CAAC,CAAC;IACtE,CAAC;IACD,IAAI,MAAM,CAAC,QAAQ,KAAK,CAAC,IAAI,MAAM,CAAC,QAAQ,KAAK,EAAE,EAAE,CAAC;QACpD,MAAM,IAAI,KAAK,CAAC,8BAA8B,MAAM,CAAC,QAAQ,iBAAiB,CAAC,CAAC;IAClF,CAAC;IACD,MAAM,QAAQ,GAAG,QAAQ,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;IAC5C,IAAI,QAAQ,KAAK,SAAS,EAAE,CAAC;QAC3B,MAAM,IAAI,KAAK,CAAC,gCAAgC,MAAM,CAAC,SAAS,EAAE,CAAC,CAAC;IACtE,CAAC;IACD,IAAI,MAAM,CAAC,SAAS,KAAK,CAAC,IAAI,MAAM,CAAC,QAAQ,KAAK,CAAC,EAAE,CAAC;QACpD,MAAM,IAAI,KAAK,CAAC,yDAAyD,CAAC,CAAC;IAC7E,CAAC;IACD,IAAI,CAAC,IAAI,CAAC,MAAM;QAAE,MAAM,IAAI,KAAK,CAAC,mBAAmB,CAAC,CAAC;IAEvD,MAAM,WAAW,GAAG,MAAM,CAAC,QAAQ,KAAK,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IACnD,MAAM,MAAM,GAAG,MAAM,CAAC,KAAK,GAAG,QAAQ,GAAG,WAAW,CAAC;IACrD,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,QAAQ,GAAG,WAAW,CAAC,CAAC;IAChD,MAAM,QAAQ,GAAG,WAAW,CAAC,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC;IAClD,MAAM,QAAQ,GAAG,MAAM,CAAC,MAAM,GAAG,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;IAC9C,IAAI,QAAQ,CAAC,MAAM,GAAG,QAAQ,EAAE,CAAC;QAC/B,MAAM,IAAI,KAAK,CAAC,4BAA4B,QAAQ,GAAG,QAAQ,CAAC,MAAM,QAAQ,CAAC,CAAC;IAClF,CAAC;IACD,MAAM,OAAO,GAAG,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,EAAE,MAAM,CAAC,CAAC;IAE7E,OAAO;QACL,KAAK,EAAE,MAAM,CAAC,KAAK;QACnB,MAAM,EAAE,MAAM,CAAC,MAAM;QACrB,IAAI,EAAE,MAAM,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,YAAY,CAAC;KACrD,CAAC;AACJ,CAAC;AAED,8EAA8E;AAC9E,SAAS;AACT,8EAA8E;AAE9E,SAAS,KAAK,CAAC,IAAY,EAAE,IAAgB;IAC3C,MAAM,IAAI,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;IAC7B,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC;IACnC,IAAI,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC,EAAE,OAAO,CAAC,CAAC;IAC7B,MAAM,IAAI,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClE,MAAM,GAAG,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;IAC5B,GAAG,CAAC,aAAa,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC;IAClC,OAAO,MAAM,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,IAAI,EAAE,GAAG,CAAC,CAAC,CAAC;AACzD,CAAC;AAED,8EAA8E;AAC9E,MAAM,UAAU,SAAS,CAAC,KAAgB;IACxC,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,GAAG,KAAK,CAAC;IACtC,IAAI,IAAI,CAAC,MAAM,KAAK,KAAK,GAAG,MAAM,GAAG,CAAC,EAAE,CAAC;QACvC,MAAM,IAAI,KAAK,CACb,wBAAwB,KAAK,GAAG,MAAM,GAAG,CAAC,cAAc,KAAK,IAAI,MAAM,SAAS,IAAI,CAAC,MAAM,EAAE,CAC9F,CAAC;IACJ,CAAC;IACD,MAAM,MAAM,GAAG,KAAK,GAAG,CAAC,CAAC;IACzB,MAAM,GAAG,GAAG,MAAM,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC;IAChD,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QAChC,GAAG,CAAC,CAAC,GAAG,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,kDAAkD;QAC7E,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,IAAI,CAAC,UAAU,GAAG,CAAC,GAAG,MAAM,EAAE,MAAM,CAAC,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,GAAG,CAAC,MAAM,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;IACjG,CAAC;IAED,MAAM,IAAI,GAAG,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;IAC9B,IAAI,CAAC,aAAa,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC;IAC7B,IAAI,CAAC,aAAa,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC;IAC9B,IAAI,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,YAAY;IACzB,IAAI,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,oBAAoB;IACjC,IAAI,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,cAAc;IAC5B,IAAI,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,SAAS;IACvB,IAAI,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,YAAY;IAE1B,OAAO,MAAM,CAAC,MAAM,CAAC;QACnB,SAAS;QACT,KAAK,CAAC,MAAM,EAAE,IAAI,CAAC;QACnB,KAAK,CAAC,MAAM,EAAE,WAAW,CAAC,GAAG,EAAE,EAAE,KAAK,EAAE,CAAC,EAAE,CAAC,CAAC;QAC7C,KAAK,CAAC,MAAM,EAAE,IAAI,UAAU,CAAC,CAAC,CAAC,CAAC;KACjC,CAAC,CAAC;AACL,CAAC;AAED,+EAA+E;AAC/E,MAAM,UAAU,cAAc,CAAC,OAAe;IAC5C,MAAM,KAAK,GAAG,OAAO,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;IACnC,MAAM,OAAO,GAAG,OAAO,CAAC,UAAU,CAAC,OAAO,CAAC,IAAI,KAAK,IAAI,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,KAAK,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC;IAC/F,OAAO,IAAI,UAAU,CAAC,MAAM,CAAC,IAAI,CAAC,OAAO,EAAE,QAAQ,CAAC,CAAC,CAAC;AACxD,CAAC;AAED,MAAM,UAAU,YAAY,CAAC,GAAe;IAC1C,OAAO,yBAAyB,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,QAAQ,CAAC,QAAQ,CAAC,EAAE,CAAC;AACxE,CAAC"}
@@ -0,0 +1,16 @@
1
+ /**
2
+ * Report sections for the recorded evidence timeline (RIG-11) and the flake
3
+ * analysis (RIG-14).
4
+ *
5
+ * The evidence section is written to be read the way someone triages a bug:
6
+ * a filmstrip of what the page looked like either side of the failure, then
7
+ * one time-ordered list mixing frames, console output and network failures,
8
+ * so "the error fired, then the screen went blank" is visible rather than
9
+ * inferred.
10
+ */
11
+ import type { FlakeReport } from './flake.js';
12
+ import type { Evidence } from './types.js';
13
+ export declare const EVIDENCE_STYLES: string;
14
+ export declare function renderEvidence(evidence: Evidence | undefined): string;
15
+ export declare function renderFlake(flake: FlakeReport | undefined): string;
16
+ //# sourceMappingURL=render-evidence.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"render-evidence.d.ts","sourceRoot":"","sources":["../../../src/report/render-evidence.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,OAAO,KAAK,EAAc,WAAW,EAAE,MAAM,YAAY,CAAC;AAC1D,OAAO,KAAK,EAAE,QAAQ,EAAiB,MAAM,YAAY,CAAC;AAG1D,eAAO,MAAM,eAAe,QAqBpB,CAAC;AAsDT,wBAAgB,cAAc,CAAC,QAAQ,EAAE,QAAQ,GAAG,SAAS,GAAG,MAAM,CAmBrE;AAwED,wBAAgB,WAAW,CAAC,KAAK,EAAE,WAAW,GAAG,SAAS,GAAG,MAAM,CAYlE"}