@testivai/witness 1.0.3 → 1.0.4
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.
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"compare.d.ts","sourceRoot":"","sources":["../../src/report/compare.ts"],"names":[],"mappings":"AAAA;;;;GAIG;
|
|
1
|
+
{"version":3,"file":"compare.d.ts","sourceRoot":"","sources":["../../src/report/compare.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAQH,OAAO,EAAqB,cAAc,EAAkB,MAAM,WAAW,CAAC;AAE9E,MAAM,WAAW,cAAc;IAC7B,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,WAAW,EAAE,MAAM,CAAC;IACpB,SAAS,EAAE,MAAM,CAAC;CACnB;AAED;;;;GAIG;AACH,wBAAgB,UAAU,CAAC,OAAO,EAAE,cAAc,GAAG,cAAc,EAAE,CAmEpE"}
|
package/dist/report/compare.js
CHANGED
|
@@ -41,6 +41,7 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|
|
41
41
|
exports.compareAll = compareAll;
|
|
42
42
|
const fs = __importStar(require("fs"));
|
|
43
43
|
const path = __importStar(require("path"));
|
|
44
|
+
const pngjs_1 = require("pngjs");
|
|
44
45
|
const diff_1 = require("../diff");
|
|
45
46
|
const dom_diff_1 = require("../diff/dom-diff");
|
|
46
47
|
const store_1 = require("../baselines/store");
|
|
@@ -120,14 +121,29 @@ function computeDomSignal(baselineDom, candidateDom) {
|
|
|
120
121
|
noiseHint: !result.domChanged,
|
|
121
122
|
};
|
|
122
123
|
}
|
|
124
|
+
/**
|
|
125
|
+
* Decode a PNG buffer to raw RGBA pixel data using pngjs.
|
|
126
|
+
*/
|
|
127
|
+
function decodePng(buffer) {
|
|
128
|
+
const png = pngjs_1.PNG.sync.read(buffer);
|
|
129
|
+
return { data: png.data, width: png.width, height: png.height };
|
|
130
|
+
}
|
|
131
|
+
/**
|
|
132
|
+
* Encode raw RGBA pixel data back to a PNG buffer.
|
|
133
|
+
*/
|
|
134
|
+
function encodePng(data, width, height) {
|
|
135
|
+
const png = new pngjs_1.PNG({ width, height });
|
|
136
|
+
png.data = data;
|
|
137
|
+
return pngjs_1.PNG.sync.write(png);
|
|
138
|
+
}
|
|
123
139
|
/**
|
|
124
140
|
* Compare two PNG buffers.
|
|
125
141
|
*
|
|
126
|
-
*
|
|
127
|
-
*
|
|
142
|
+
* Decodes both PNGs to raw RGBA, runs the pixel-level diff engine,
|
|
143
|
+
* writes a valid diff PNG, and returns a SnapshotResult.
|
|
128
144
|
*/
|
|
129
145
|
function compareBuffers(baselineBuffer, candidateBuffer, name, snapshotImagesDir, threshold) {
|
|
130
|
-
// Quick byte-level comparison
|
|
146
|
+
// Quick byte-level comparison — identical files need no decoding
|
|
131
147
|
if (baselineBuffer.equals(candidateBuffer)) {
|
|
132
148
|
return {
|
|
133
149
|
name,
|
|
@@ -139,31 +155,24 @@ function compareBuffers(baselineBuffer, candidateBuffer, name, snapshotImagesDir
|
|
|
139
155
|
currentPath: `images/${name}/current.png`,
|
|
140
156
|
};
|
|
141
157
|
}
|
|
142
|
-
// Buffers differ — attempt pixel-level diff
|
|
143
|
-
// We assume raw RGBA pixel data with known dimensions
|
|
144
|
-
// In practice, we need to decode PNGs first. For now, treat as raw RGBA.
|
|
145
|
-
// The actual PNG decoding will be added when fast-png is available.
|
|
146
158
|
try {
|
|
147
|
-
//
|
|
148
|
-
|
|
149
|
-
const
|
|
150
|
-
|
|
151
|
-
const
|
|
159
|
+
// Decode PNG → raw RGBA so the diff engine gets real pixel data
|
|
160
|
+
const baseline = decodePng(baselineBuffer);
|
|
161
|
+
const candidate = decodePng(candidateBuffer);
|
|
162
|
+
// Use baseline dimensions for the diff canvas; pad/crop candidate if needed
|
|
163
|
+
const width = baseline.width;
|
|
164
|
+
const height = baseline.height;
|
|
152
165
|
const expectedLen = width * height * 4;
|
|
153
|
-
// Pad buffers if needed
|
|
154
166
|
const baseline8 = new Uint8ClampedArray(expectedLen);
|
|
155
|
-
baseline8.set(new Uint8ClampedArray(
|
|
167
|
+
baseline8.set(new Uint8ClampedArray(baseline.data.buffer, baseline.data.byteOffset, Math.min(baseline.data.length, expectedLen)));
|
|
156
168
|
const candidate8 = new Uint8ClampedArray(expectedLen);
|
|
157
|
-
candidate8.set(new Uint8ClampedArray(
|
|
169
|
+
candidate8.set(new Uint8ClampedArray(candidate.data.buffer, candidate.data.byteOffset, Math.min(candidate.data.length, expectedLen)));
|
|
158
170
|
const diffOutput = new Uint8ClampedArray(expectedLen);
|
|
159
171
|
const diffResult = (0, diff_1.diff)(baseline8, candidate8, diffOutput, width, height, { threshold });
|
|
160
|
-
//
|
|
172
|
+
// Encode the diff RGBA back to a valid PNG and write it
|
|
173
|
+
const diffPngBuffer = encodePng(Buffer.from(diffOutput.buffer), width, height);
|
|
161
174
|
const diffPath = path.join(snapshotImagesDir, 'diff.png');
|
|
162
|
-
fs.writeFileSync(diffPath,
|
|
163
|
-
// We already know the raw bytes differ (byte-equal returns early above).
|
|
164
|
-
// If the pixel diff still reports identical (sub-threshold), the images
|
|
165
|
-
// are visually equivalent but binary-different — still flag as "changed"
|
|
166
|
-
// so the user is aware.
|
|
175
|
+
fs.writeFileSync(diffPath, diffPngBuffer);
|
|
167
176
|
const status = 'changed';
|
|
168
177
|
const diffPercent = diffResult.diffPercent > 0 ? diffResult.diffPercent : 0.01;
|
|
169
178
|
return {
|
|
@@ -177,8 +186,9 @@ function compareBuffers(baselineBuffer, candidateBuffer, name, snapshotImagesDir
|
|
|
177
186
|
diffPath: `images/${name}/diff.png`,
|
|
178
187
|
};
|
|
179
188
|
}
|
|
180
|
-
catch {
|
|
181
|
-
//
|
|
189
|
+
catch (err) {
|
|
190
|
+
// PNG decode failed (corrupt file, unexpected format) — report as changed
|
|
191
|
+
// without a diff image so the user can investigate manually
|
|
182
192
|
return {
|
|
183
193
|
name,
|
|
184
194
|
status: 'changed',
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"compare.js","sourceRoot":"","sources":["../../src/report/compare.ts"],"names":[],"mappings":";AAAA;;;;GAIG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
|
1
|
+
{"version":3,"file":"compare.js","sourceRoot":"","sources":["../../src/report/compare.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@testivai/witness",
|
|
3
|
-
"version": "1.0.
|
|
3
|
+
"version": "1.0.4",
|
|
4
4
|
"description": "Framework-agnostic visual regression testing CLI for TestivAI",
|
|
5
5
|
"main": "dist/index.js",
|
|
6
6
|
"types": "dist/index.d.ts",
|
|
@@ -77,18 +77,20 @@
|
|
|
77
77
|
},
|
|
78
78
|
"dependencies": {
|
|
79
79
|
"chalk": "^4.1.2",
|
|
80
|
-
"chrome-remote-interface": "^0.
|
|
80
|
+
"chrome-remote-interface": "^0.34.0",
|
|
81
81
|
"commander": "^11.0.0",
|
|
82
82
|
"inquirer": "^8.2.6",
|
|
83
|
-
"ora": "^
|
|
83
|
+
"ora": "^9.4.0",
|
|
84
|
+
"pngjs": "^7.0.0",
|
|
84
85
|
"simple-git": "^3.20.0",
|
|
85
|
-
"ws": "^8.
|
|
86
|
+
"ws": "^8.20.1",
|
|
86
87
|
"@testivai/common": "0.2.2"
|
|
87
88
|
},
|
|
88
89
|
"devDependencies": {
|
|
89
90
|
"@types/inquirer": "^8.2.10",
|
|
90
91
|
"@types/jest": "^29.0.0",
|
|
91
92
|
"@types/node": "^20.0.0",
|
|
93
|
+
"@types/pngjs": "^6.0.5",
|
|
92
94
|
"@types/ws": "^8.0.0",
|
|
93
95
|
"jest": "^29.0.0",
|
|
94
96
|
"ts-jest": "^29.2.5",
|