@flighthq/capture 0.3.0-next.906.07cea63 → 0.3.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/captureBaseline.d.ts +1 -1
- package/dist/captureBaseline.d.ts.map +1 -1
- package/dist/captureBaseline.js +3 -1
- package/dist/captureBaseline.js.map +1 -1
- package/dist/captureComparison.d.ts +1 -1
- package/dist/captureComparison.js +5 -5
- package/dist/captureComparison.js.map +1 -1
- package/package.json +5 -3
- package/src/captureBaseline.test.ts +4 -0
|
@@ -3,7 +3,7 @@ import type { CaptureBaseline, CaptureColumnBaseline } from '@flighthq/types/con
|
|
|
3
3
|
export declare function createCaptureBaseline(): CaptureBaseline;
|
|
4
4
|
/**
|
|
5
5
|
* Serializes a baseline to its committed text form: JSON with columns in sorted key order, each
|
|
6
|
-
* column's fields in canonical `fingerprint` then `sha256` order, 2-space indent, and a trailing
|
|
6
|
+
* column's fields in canonical `fingerprint`, `sourceHash`, then `sha256` order, 2-space indent, and a trailing
|
|
7
7
|
* newline. Matches the tooling's on-disk baseline store byte-for-byte, so a re-baseline of one column
|
|
8
8
|
* produces a minimal diff and the format gate stays green. Only defined fields are emitted.
|
|
9
9
|
*/
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"captureBaseline.d.ts","sourceRoot":"","sources":["../src/captureBaseline.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,qBAAqB,EAAE,MAAM,0BAA0B,CAAC;AAEvF,yFAAyF;AACzF,wBAAgB,qBAAqB,IAAI,eAAe,CAEvD;AAED;;;;;GAKG;AACH,wBAAgB,qBAAqB,CAAC,QAAQ,EAAE,QAAQ,CAAC,eAAe,CAAC,GAAG,MAAM,
|
|
1
|
+
{"version":3,"file":"captureBaseline.d.ts","sourceRoot":"","sources":["../src/captureBaseline.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,qBAAqB,EAAE,MAAM,0BAA0B,CAAC;AAEvF,yFAAyF;AACzF,wBAAgB,qBAAqB,IAAI,eAAe,CAEvD;AAED;;;;;GAKG;AACH,wBAAgB,qBAAqB,CAAC,QAAQ,EAAE,QAAQ,CAAC,eAAe,CAAC,GAAG,MAAM,CAWjF;AAED;;;GAGG;AACH,wBAAgB,uBAAuB,CACrC,QAAQ,EAAE,QAAQ,CAAC,eAAe,CAAC,EACnC,MAAM,EAAE,MAAM,EACd,KAAK,EAAE,MAAM,qBAAqB,GACjC,MAAM,GAAG,IAAI,CAEf;AAED;;;;GAIG;AACH,wBAAgB,oBAAoB,CAAC,IAAI,EAAE,MAAM,GAAG,eAAe,GAAG,IAAI,CASzE;AAED,8FAA8F;AAC9F,wBAAgB,uBAAuB,CACrC,QAAQ,EAAE,eAAe,EACzB,MAAM,EAAE,MAAM,EACd,KAAK,EAAE,MAAM,qBAAqB,EAClC,KAAK,EAAE,MAAM,GACZ,IAAI,CAEN"}
|
package/dist/captureBaseline.js
CHANGED
|
@@ -4,7 +4,7 @@ export function createCaptureBaseline() {
|
|
|
4
4
|
}
|
|
5
5
|
/**
|
|
6
6
|
* Serializes a baseline to its committed text form: JSON with columns in sorted key order, each
|
|
7
|
-
* column's fields in canonical `fingerprint` then `sha256` order, 2-space indent, and a trailing
|
|
7
|
+
* column's fields in canonical `fingerprint`, `sourceHash`, then `sha256` order, 2-space indent, and a trailing
|
|
8
8
|
* newline. Matches the tooling's on-disk baseline store byte-for-byte, so a re-baseline of one column
|
|
9
9
|
* produces a minimal diff and the format gate stays green. Only defined fields are emitted.
|
|
10
10
|
*/
|
|
@@ -15,6 +15,8 @@ export function formatCaptureBaseline(baseline) {
|
|
|
15
15
|
const out = {};
|
|
16
16
|
if (entry.fingerprint !== undefined)
|
|
17
17
|
out.fingerprint = entry.fingerprint;
|
|
18
|
+
if (entry.sourceHash !== undefined)
|
|
19
|
+
out.sourceHash = entry.sourceHash;
|
|
18
20
|
if (entry.sha256 !== undefined)
|
|
19
21
|
out.sha256 = entry.sha256;
|
|
20
22
|
sorted[column] = out;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"captureBaseline.js","sourceRoot":"","sources":["../src/captureBaseline.ts"],"names":[],"mappings":"AAEA,yFAAyF;AACzF,MAAM,UAAU,qBAAqB;IACnC,OAAO,EAAE,CAAC;AACZ,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,qBAAqB,CAAC,QAAmC;IACvE,MAAM,MAAM,GAAoB,EAAE,CAAC;IACnC,KAAK,MAAM,MAAM,IAAI,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC;QAClD,MAAM,KAAK,GAAG,QAAQ,CAAC,MAAM,CAAC,CAAC;QAC/B,MAAM,GAAG,GAA0B,EAAE,CAAC;QACtC,IAAI,KAAK,CAAC,WAAW,KAAK,SAAS;YAAE,GAAG,CAAC,WAAW,GAAG,KAAK,CAAC,WAAW,CAAC;QACzE,IAAI,KAAK,CAAC,MAAM,KAAK,SAAS;YAAE,GAAG,CAAC,MAAM,GAAG,KAAK,CAAC,MAAM,CAAC;QAC1D,MAAM,CAAC,MAAM,CAAC,GAAG,GAAG,CAAC;IACvB,CAAC;IACD,OAAO,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,GAAG,IAAI,CAAC;AAChD,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,uBAAuB,CACrC,QAAmC,EACnC,MAAc,EACd,KAAkC;IAElC,OAAO,QAAQ,CAAC,MAAM,CAAC,EAAE,CAAC,KAAK,CAAC,IAAI,IAAI,CAAC;AAC3C,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,oBAAoB,CAAC,IAAY;IAC/C,IAAI,MAAe,CAAC;IACpB,IAAI,CAAC;QACH,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IAC5B,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAC;IACd,CAAC;IACD,IAAI,OAAO,MAAM,KAAK,QAAQ,IAAI,MAAM,KAAK,IAAI,IAAI,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC;QAAE,OAAO,IAAI,CAAC;IACxF,OAAO,MAAyB,CAAC;AACnC,CAAC;AAED,8FAA8F;AAC9F,MAAM,UAAU,uBAAuB,CACrC,QAAyB,EACzB,MAAc,EACd,KAAkC,EAClC,KAAa;IAEb,CAAC,QAAQ,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC,CAAC,KAAK,CAAC,GAAG,KAAK,CAAC;AAC3C,CAAC"}
|
|
1
|
+
{"version":3,"file":"captureBaseline.js","sourceRoot":"","sources":["../src/captureBaseline.ts"],"names":[],"mappings":"AAEA,yFAAyF;AACzF,MAAM,UAAU,qBAAqB;IACnC,OAAO,EAAE,CAAC;AACZ,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,qBAAqB,CAAC,QAAmC;IACvE,MAAM,MAAM,GAAoB,EAAE,CAAC;IACnC,KAAK,MAAM,MAAM,IAAI,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC;QAClD,MAAM,KAAK,GAAG,QAAQ,CAAC,MAAM,CAAC,CAAC;QAC/B,MAAM,GAAG,GAA0B,EAAE,CAAC;QACtC,IAAI,KAAK,CAAC,WAAW,KAAK,SAAS;YAAE,GAAG,CAAC,WAAW,GAAG,KAAK,CAAC,WAAW,CAAC;QACzE,IAAI,KAAK,CAAC,UAAU,KAAK,SAAS;YAAE,GAAG,CAAC,UAAU,GAAG,KAAK,CAAC,UAAU,CAAC;QACtE,IAAI,KAAK,CAAC,MAAM,KAAK,SAAS;YAAE,GAAG,CAAC,MAAM,GAAG,KAAK,CAAC,MAAM,CAAC;QAC1D,MAAM,CAAC,MAAM,CAAC,GAAG,GAAG,CAAC;IACvB,CAAC;IACD,OAAO,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,GAAG,IAAI,CAAC;AAChD,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,uBAAuB,CACrC,QAAmC,EACnC,MAAc,EACd,KAAkC;IAElC,OAAO,QAAQ,CAAC,MAAM,CAAC,EAAE,CAAC,KAAK,CAAC,IAAI,IAAI,CAAC;AAC3C,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,oBAAoB,CAAC,IAAY;IAC/C,IAAI,MAAe,CAAC;IACpB,IAAI,CAAC;QACH,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IAC5B,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAC;IACd,CAAC;IACD,IAAI,OAAO,MAAM,KAAK,QAAQ,IAAI,MAAM,KAAK,IAAI,IAAI,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC;QAAE,OAAO,IAAI,CAAC;IACxF,OAAO,MAAyB,CAAC;AACnC,CAAC;AAED,8FAA8F;AAC9F,MAAM,UAAU,uBAAuB,CACrC,QAAyB,EACzB,MAAc,EACd,KAAkC,EAClC,KAAa;IAEb,CAAC,QAAQ,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC,CAAC,KAAK,CAAC,GAAG,KAAK,CAAC;AAC3C,CAAC"}
|
|
@@ -3,7 +3,7 @@ export declare const CAPTURE_PARITY_TOLERANCE = 15;
|
|
|
3
3
|
export declare const CAPTURE_REGRESSION_TOLERANCE = 5;
|
|
4
4
|
/**
|
|
5
5
|
* The tolerant distance between two coarse render fingerprints in `<gridSize>:<hex>` text form (see
|
|
6
|
-
*
|
|
6
|
+
* formatBitmapFingerprint): the mean absolute per-channel difference (0..255), where ~0 is identical
|
|
7
7
|
* and larger values mean a real visual change. Returns `Number.POSITIVE_INFINITY` as a sentinel when
|
|
8
8
|
* either string fails to parse, or when the two fingerprints use different grid sizes and so are not
|
|
9
9
|
* comparable — Infinity fails any finite tolerance, so a corrupt or mismatched baseline reads as a
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { compareBitmapFingerprints, parseBitmapFingerprint } from '@flighthq/bitmap/contract';
|
|
2
2
|
// Default parity tolerance (mean absolute per-channel difference, 0..255). Cross-backend agreement is
|
|
3
3
|
// ≤ ~6.5 even for antialiasing-heavy scenes, so real divergence between two backends is well over 15.
|
|
4
4
|
export const CAPTURE_PARITY_TOLERANCE = 15;
|
|
@@ -8,18 +8,18 @@ export const CAPTURE_PARITY_TOLERANCE = 15;
|
|
|
8
8
|
export const CAPTURE_REGRESSION_TOLERANCE = 5;
|
|
9
9
|
/**
|
|
10
10
|
* The tolerant distance between two coarse render fingerprints in `<gridSize>:<hex>` text form (see
|
|
11
|
-
*
|
|
11
|
+
* formatBitmapFingerprint): the mean absolute per-channel difference (0..255), where ~0 is identical
|
|
12
12
|
* and larger values mean a real visual change. Returns `Number.POSITIVE_INFINITY` as a sentinel when
|
|
13
13
|
* either string fails to parse, or when the two fingerprints use different grid sizes and so are not
|
|
14
14
|
* comparable — Infinity fails any finite tolerance, so a corrupt or mismatched baseline reads as a
|
|
15
15
|
* failing check rather than crashing.
|
|
16
16
|
*/
|
|
17
17
|
export function compareCaptureFingerprints(a, b) {
|
|
18
|
-
const fa =
|
|
19
|
-
const fb =
|
|
18
|
+
const fa = parseBitmapFingerprint(a);
|
|
19
|
+
const fb = parseBitmapFingerprint(b);
|
|
20
20
|
if (fa === null || fb === null || fa.gridSize !== fb.gridSize)
|
|
21
21
|
return Number.POSITIVE_INFINITY;
|
|
22
|
-
return
|
|
22
|
+
return compareBitmapFingerprints(fa, fb);
|
|
23
23
|
}
|
|
24
24
|
/**
|
|
25
25
|
* Parity: whether two render backends rendering the same scene in the same run agree within
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"captureComparison.js","sourceRoot":"","sources":["../src/captureComparison.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"captureComparison.js","sourceRoot":"","sources":["../src/captureComparison.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,yBAAyB,EAAE,sBAAsB,EAAE,MAAM,2BAA2B,CAAC;AAG9F,sGAAsG;AACtG,sGAAsG;AACtG,MAAM,CAAC,MAAM,wBAAwB,GAAG,EAAE,CAAC;AAE3C,uGAAuG;AACvG,uGAAuG;AACvG,iEAAiE;AACjE,MAAM,CAAC,MAAM,4BAA4B,GAAG,CAAC,CAAC;AAE9C;;;;;;;GAOG;AACH,MAAM,UAAU,0BAA0B,CAAC,CAAS,EAAE,CAAS;IAC7D,MAAM,EAAE,GAAG,sBAAsB,CAAC,CAAC,CAAC,CAAC;IACrC,MAAM,EAAE,GAAG,sBAAsB,CAAC,CAAC,CAAC,CAAC;IACrC,IAAI,EAAE,KAAK,IAAI,IAAI,EAAE,KAAK,IAAI,IAAI,EAAE,CAAC,QAAQ,KAAK,EAAE,CAAC,QAAQ;QAAE,OAAO,MAAM,CAAC,iBAAiB,CAAC;IAC/F,OAAO,yBAAyB,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC;AAC3C,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,qBAAqB,CAAC,CAAS,EAAE,CAAS,EAAE,SAAS,GAAG,wBAAwB;IAC9F,MAAM,UAAU,GAAG,0BAA0B,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;IACpD,OAAO,EAAE,IAAI,EAAE,UAAU,IAAI,SAAS,EAAE,UAAU,EAAE,SAAS,EAAE,CAAC;AAClE,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,yBAAyB,CACvC,WAAmB,EACnB,mBAA2B,EAC3B,SAAS,GAAG,4BAA4B;IAExC,MAAM,UAAU,GAAG,0BAA0B,CAAC,WAAW,EAAE,mBAAmB,CAAC,CAAC;IAChF,OAAO,EAAE,IAAI,EAAE,UAAU,IAAI,SAAS,EAAE,UAAU,EAAE,SAAS,EAAE,CAAC;AAClE,CAAC"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,8 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@flighthq/capture",
|
|
3
|
-
"version": "0.3.0
|
|
3
|
+
"version": "0.3.0",
|
|
4
|
+
"author": "Joshua Granick and other contributors",
|
|
5
|
+
"license": "MIT",
|
|
4
6
|
"repository": {
|
|
5
7
|
"type": "git",
|
|
6
8
|
"url": "https://github.com/flighthq/flight.git",
|
|
@@ -36,8 +38,8 @@
|
|
|
36
38
|
"clean:dist": "tsx ../../scripts/clean-package-dist.ts"
|
|
37
39
|
},
|
|
38
40
|
"dependencies": {
|
|
39
|
-
"@flighthq/
|
|
40
|
-
"@flighthq/types": "0.3.0
|
|
41
|
+
"@flighthq/bitmap": "0.3.0",
|
|
42
|
+
"@flighthq/types": "0.3.0"
|
|
41
43
|
},
|
|
42
44
|
"devDependencies": {
|
|
43
45
|
"typescript": "^5.3.0"
|
|
@@ -27,6 +27,7 @@ describe('formatCaptureBaseline', () => {
|
|
|
27
27
|
it('sorts columns, orders fields, indents by two spaces, and ends with a newline', () => {
|
|
28
28
|
const baseline = createCaptureBaseline();
|
|
29
29
|
setCaptureBaselineField(baseline, 'flight:webgl', 'sha256', 'aaa');
|
|
30
|
+
setCaptureBaselineField(baseline, 'flight:webgl', 'sourceHash', 'source');
|
|
30
31
|
setCaptureBaselineField(baseline, 'flight:webgl', 'fingerprint', '1:ffffff');
|
|
31
32
|
setCaptureBaselineField(baseline, 'canvas', 'fingerprint', '1:000000');
|
|
32
33
|
expect(formatCaptureBaseline(baseline)).toBe(
|
|
@@ -36,6 +37,7 @@ describe('formatCaptureBaseline', () => {
|
|
|
36
37
|
' },\n' +
|
|
37
38
|
' "flight:webgl": {\n' +
|
|
38
39
|
' "fingerprint": "1:ffffff",\n' +
|
|
40
|
+
' "sourceHash": "source",\n' +
|
|
39
41
|
' "sha256": "aaa"\n' +
|
|
40
42
|
' }\n' +
|
|
41
43
|
'}\n',
|
|
@@ -98,8 +100,10 @@ describe('setCaptureBaselineField', () => {
|
|
|
98
100
|
it('creates the column entry on first write and merges later fields', () => {
|
|
99
101
|
const baseline = createCaptureBaseline();
|
|
100
102
|
setCaptureBaselineField(baseline, 'canvas', 'fingerprint', '1:000000');
|
|
103
|
+
setCaptureBaselineField(baseline, 'canvas', 'sourceHash', 'source');
|
|
101
104
|
setCaptureBaselineField(baseline, 'canvas', 'sha256', 'hash');
|
|
102
105
|
expect(getCaptureBaselineField(baseline, 'canvas', 'fingerprint')).toBe('1:000000');
|
|
106
|
+
expect(getCaptureBaselineField(baseline, 'canvas', 'sourceHash')).toBe('source');
|
|
103
107
|
expect(getCaptureBaselineField(baseline, 'canvas', 'sha256')).toBe('hash');
|
|
104
108
|
});
|
|
105
109
|
|