vitest-screenshot 3.0.1 โ 3.0.2
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/README.md +25 -17
- package/dist/index.d.ts +31 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +11 -1
- package/dist/index.js.map +1 -1
- package/dist/metrics.d.ts +1 -0
- package/dist/metrics.d.ts.map +1 -1
- package/dist/metrics.js.map +1 -1
- package/dist/update-policy.d.ts.map +1 -1
- package/dist/update-policy.js.map +1 -1
- package/package.json +5 -5
- package/src/index.ts +60 -8
- package/src/metrics.ts +1 -0
package/README.md
CHANGED
|
@@ -1,17 +1,31 @@
|
|
|
1
|
+
<p align="center">
|
|
2
|
+
<a href="https://npmjs.com/package/vitest-screenshot"><img src="https://img.shields.io/npm/v/vitest-screenshot.svg" alt="npm package"></a>
|
|
3
|
+
<a href="https://www.npmtrends.com/vitest-screenshot"><img src="https://img.shields.io/npm/dw/vitest-screenshot.svg" alt="npm downloads"></a>
|
|
4
|
+
<a href="https://codecov.io/gh/bhouston/vitest-gpu"><img src="https://codecov.io/gh/bhouston/vitest-gpu/branch/main/graph/badge.svg" alt="coverage"></a>
|
|
5
|
+
<a href="https://discord.gg/fwupDN493R"><img src="https://img.shields.io/badge/chat-discord-blue?style=flat&logo=discord" alt="discord chat"></a>
|
|
6
|
+
<a href="https://vitest-gpu.ben3d.ca/"><img src="https://img.shields.io/badge/docs-read-blue?style=flat" alt="documentation"></a>
|
|
7
|
+
</p>
|
|
8
|
+
<br/>
|
|
9
|
+
|
|
1
10
|
# vitest-screenshot
|
|
2
11
|
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
12
|
+
> Image snapshot testing for WebGL and WebGPU in Vitest.
|
|
13
|
+
|
|
14
|
+
- ๐ผ๏ธ Canvas, ImageData or Raw Pixels
|
|
15
|
+
- ๐ฌ pixelmatch and Metrics Comparators
|
|
16
|
+
- ๐งช Custom Comparators
|
|
17
|
+
- ๐ฉบ Diff Images on Failure
|
|
18
|
+
- ๐ PNG, JPG, GIF and WebP Baselines
|
|
8
19
|
|
|
9
|
-
Image snapshot testing for WebGL and WebGPU in Vitest on Node, without a browser or Playwright.
|
|
10
20
|
`await expect(image).toMatchScreenshot(reference)` compares a canvas, `ImageData` or raw pixels against a
|
|
11
21
|
baseline committed next to your tests, with the same options as Vitest browser mode's `toMatchScreenshot`.
|
|
12
22
|
Pair it with a native GPU environment and tests run up to 2.4x faster than in a browser, see the
|
|
13
23
|
[blog post](https://ben3d.ca/blog/native-gpu-testing-for-vitest-and-jest).
|
|
14
24
|
|
|
25
|
+
Part of [vitest-gpu](https://github.com/bhouston/vitest-gpu), which also provides the WebGL and WebGPU environments.
|
|
26
|
+
|
|
27
|
+
[Read the Docs to Learn More](https://vitest-gpu.ben3d.ca/docs/screenshots/) about `toMatchScreenshot()`: baselines, comparators, tolerances and failure artifacts.
|
|
28
|
+
|
|
15
29
|
```sh
|
|
16
30
|
pnpm add -D vitest vitest-screenshot vitest-environment-webgl-node
|
|
17
31
|
```
|
|
@@ -212,20 +226,14 @@ See [`demo/test/screenshots`](https://github.com/bhouston/vitest-gpu/tree/main/d
|
|
|
212
226
|
[`vitest-environment-webgpu-node`](https://github.com/bhouston/vitest-gpu/tree/main/packages/vitest-environment-webgpu-node) provide the canvases to compare.
|
|
213
227
|
- [`demo/test/screenshots`](https://github.com/bhouston/vitest-gpu/tree/main/demo/test/screenshots) and the [repository README](https://github.com/bhouston/vitest-gpu#readme).
|
|
214
228
|
|
|
215
|
-
##
|
|
229
|
+
## Contribution
|
|
216
230
|
|
|
217
|
-
|
|
231
|
+
See [Contributing Guide](https://github.com/bhouston/vitest-gpu/blob/main/CONTRIBUTING.md).
|
|
218
232
|
|
|
219
233
|
## License
|
|
220
234
|
|
|
221
235
|
MIT
|
|
222
236
|
|
|
223
|
-
|
|
224
|
-
|
|
225
|
-
[
|
|
226
|
-
[tests-badge]: https://github.com/bhouston/vitest-gpu/actions/workflows/ci.yml/badge.svg
|
|
227
|
-
[tests-url]: https://github.com/bhouston/vitest-gpu/actions/workflows/ci.yml
|
|
228
|
-
[discord-badge]: https://img.shields.io/badge/Discord-Join%20Chat-5865F2?logo=discord&logoColor=white
|
|
229
|
-
[discord-url]: https://discord.gg/fwupDN493R
|
|
230
|
-
[coverage-badge]: https://codecov.io/gh/bhouston/vitest-gpu/branch/main/graph/badge.svg
|
|
231
|
-
[coverage-url]: https://codecov.io/gh/bhouston/vitest-gpu
|
|
237
|
+
## Author
|
|
238
|
+
|
|
239
|
+
[Ben Houston](https://ben3d.ca), Sponsored by [Land of Assets](https://landofassets.com).
|
package/dist/index.d.ts
CHANGED
|
@@ -3,8 +3,11 @@ import { type MetricsOptions } from './metrics.js';
|
|
|
3
3
|
export type { Metric, MetricsOptions } from './metrics.js';
|
|
4
4
|
/** Anything with RGBA8 pixels, top row first: `ImageData`, node-webgl's `canvas.getImageData()`, or a WebGPU readback. */
|
|
5
5
|
export type RgbaImage = {
|
|
6
|
+
/** Width in pixels. */
|
|
6
7
|
width: number;
|
|
8
|
+
/** Height in pixels. */
|
|
7
9
|
height: number;
|
|
10
|
+
/** RGBA8 bytes, four per pixel, row by row from the top. */
|
|
8
11
|
data: Uint8Array | Uint8ClampedArray;
|
|
9
12
|
};
|
|
10
13
|
/**
|
|
@@ -12,21 +15,35 @@ export type RgbaImage = {
|
|
|
12
15
|
* `Canvas` (`getImageData()`), or a node-webgl `Image` (decoded with `decode()`).
|
|
13
16
|
*/
|
|
14
17
|
export type ImageSource = RgbaImage | {
|
|
18
|
+
/** Reads the pixels back from the GPU, as the WebGPU environment's `HeadlessCanvas` does. */
|
|
15
19
|
readPixels(): Promise<RgbaImage>;
|
|
16
20
|
} | {
|
|
21
|
+
/** Returns the canvas pixels synchronously, as node-webgl's `Canvas` does. */
|
|
17
22
|
getImageData(): RgbaImage;
|
|
18
23
|
} | {
|
|
24
|
+
/** Decodes the image so its pixels can be read, as node-webgl's `Image` does. */
|
|
19
25
|
decode(): Promise<void>;
|
|
20
26
|
};
|
|
21
27
|
/** A baseline: a file path with extension (relative to `baselineDir` or absolute), or an in-memory `ImageSource`. */
|
|
22
28
|
export type Reference = string | ImageSource;
|
|
23
29
|
/** What a comparator returns, as in Vitest browser mode: `diff` is written next to the baseline on failure. */
|
|
24
30
|
export type ComparatorResult = {
|
|
31
|
+
/** Whether the two images count as the same. */
|
|
25
32
|
pass: boolean;
|
|
33
|
+
/** An image of the differences, written as `<name>.diff.png` on failure, or `null` for none. */
|
|
26
34
|
diff: RgbaImage | null;
|
|
35
|
+
/** A description of the result, included in the failure message. */
|
|
27
36
|
message: string | null;
|
|
28
37
|
};
|
|
29
|
-
/**
|
|
38
|
+
/**
|
|
39
|
+
* A comparator, with the signature Vitest browser mode uses for `comparators`.
|
|
40
|
+
*
|
|
41
|
+
* @typeParam Options - The comparator's own options, taken from `comparatorOptions`.
|
|
42
|
+
* @param reference - The baseline image.
|
|
43
|
+
* @param actual - The image under test.
|
|
44
|
+
* @param options - The comparator options plus `createDiff`, which says whether a diff image is wanted.
|
|
45
|
+
* @returns Whether the images match, with an optional diff image and message.
|
|
46
|
+
*/
|
|
30
47
|
export type Comparator<Options extends object = Record<string, unknown>> = (reference: RgbaImage, actual: RgbaImage, options: Options & {
|
|
31
48
|
createDiff: boolean;
|
|
32
49
|
}) => ComparatorResult;
|
|
@@ -39,7 +56,9 @@ export type PixelmatchOptions = NonNullable<Parameters<typeof pixelmatch>[5]> &
|
|
|
39
56
|
};
|
|
40
57
|
/** Comparator names and their options. Augment this interface when registering a custom comparator. */
|
|
41
58
|
export interface ComparatorRegistry {
|
|
59
|
+
/** Options of the default `pixelmatch` comparator. */
|
|
42
60
|
pixelmatch: PixelmatchOptions;
|
|
61
|
+
/** Options of the `metrics` comparator. */
|
|
43
62
|
metrics: MetricsOptions;
|
|
44
63
|
}
|
|
45
64
|
type ComparatorName = Extract<keyof ComparatorRegistry, string>;
|
|
@@ -47,13 +66,18 @@ type ComparatorOptions<Name extends ComparatorName> = Extract<ComparatorRegistry
|
|
|
47
66
|
/** Which registered comparator judges the images. `pixelmatch` is the default. */
|
|
48
67
|
export type ComparatorSelection = {
|
|
49
68
|
[Name in ComparatorName]: {
|
|
69
|
+
/** The registered comparator to use. */
|
|
50
70
|
comparatorName: Name;
|
|
71
|
+
/** Options for that comparator. */
|
|
51
72
|
comparatorOptions?: ComparatorOptions<Name>;
|
|
52
73
|
};
|
|
53
74
|
}[ComparatorName] | {
|
|
75
|
+
/** Omitted: the comparator chosen in `extendMatchers()` applies, or `pixelmatch` by default. */
|
|
54
76
|
comparatorName?: undefined;
|
|
77
|
+
/** Options for the default comparator. */
|
|
55
78
|
comparatorOptions?: ComparatorOptions<ComparatorName>;
|
|
56
79
|
};
|
|
80
|
+
/** Options for one `toMatchScreenshot()` assertion: the comparator selection plus where baselines live. */
|
|
57
81
|
export type ScreenshotOptions = ComparatorSelection & {
|
|
58
82
|
/** Directory relative reference paths and diff images live in. Default: `__screenshots__` beside the test file. */
|
|
59
83
|
baselineDir?: string;
|
|
@@ -62,6 +86,7 @@ export type ScreenshotOptions = ComparatorSelection & {
|
|
|
62
86
|
};
|
|
63
87
|
/** Defaults for every assertion plus custom comparators, like `test.browser.expect.toMatchScreenshot` in Vitest config. */
|
|
64
88
|
export type ScreenshotConfig = ComparatorSelection & {
|
|
89
|
+
/** Custom comparators, keyed by the name used in `comparatorName`. */
|
|
65
90
|
comparators?: {
|
|
66
91
|
[Name in ComparatorName]?: Comparator<ComparatorOptions<Name>>;
|
|
67
92
|
};
|
|
@@ -73,5 +98,10 @@ declare module 'vitest' {
|
|
|
73
98
|
}
|
|
74
99
|
/** `comparatorName: 'pixelmatch'` (default): Vitest browser mode's built-in comparison. */
|
|
75
100
|
export declare const pixelmatchComparator: Comparator<PixelmatchOptions>;
|
|
101
|
+
/**
|
|
102
|
+
* Registers `toMatchScreenshot()` on Vitest's `expect`. Call it once per test file, or from a setup file.
|
|
103
|
+
*
|
|
104
|
+
* @param config - Default comparator and options for every assertion, and any custom comparators.
|
|
105
|
+
*/
|
|
76
106
|
export declare function extendMatchers(config?: ScreenshotConfig): void;
|
|
77
107
|
//# sourceMappingURL=index.d.ts.map
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","
|
|
1
|
+
{"version":3,"file":"index.d.ts","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
package/dist/index.js
CHANGED
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { existsSync, mkdirSync } from 'node:fs';
|
|
2
|
+
import { readFile } from 'node:fs/promises';
|
|
2
3
|
import { basename, dirname, extname, isAbsolute, join } from 'node:path';
|
|
3
4
|
import pixelmatch from 'pixelmatch';
|
|
4
5
|
import sharp from 'sharp';
|
|
@@ -9,7 +10,11 @@ const result = (pass, message) => ({ pass, message: () => message });
|
|
|
9
10
|
const raw = ({ width, height, data }) => sharp(data, { raw: { width, height, channels: 4 } });
|
|
10
11
|
/** Decodes any format sharp reads (png, jpg, gif, webp, ...) into RGBA8. */
|
|
11
12
|
const readImage = async (file) => {
|
|
12
|
-
|
|
13
|
+
// Decode from a buffer: sharp(path) leaves the handle in libvips' cache, which locks the file on Windows.
|
|
14
|
+
const { data, info } = await sharp(await readFile(file))
|
|
15
|
+
.ensureAlpha()
|
|
16
|
+
.raw()
|
|
17
|
+
.toBuffer({ resolveWithObject: true });
|
|
13
18
|
return { width: info.width, height: info.height, data };
|
|
14
19
|
};
|
|
15
20
|
/** Encodes by file extension; lossy formats (jpg, webp) alter pixels on write. */
|
|
@@ -47,6 +52,11 @@ export const pixelmatchComparator = (reference, actual, { createDiff, allowedMis
|
|
|
47
52
|
message: `${count} pixels (${((count / total) * 100).toFixed(3)}%) differ, ${Math.floor(allowed)} allowed`,
|
|
48
53
|
};
|
|
49
54
|
};
|
|
55
|
+
/**
|
|
56
|
+
* Registers `toMatchScreenshot()` on Vitest's `expect`. Call it once per test file, or from a setup file.
|
|
57
|
+
*
|
|
58
|
+
* @param config - Default comparator and options for every assertion, and any custom comparators.
|
|
59
|
+
*/
|
|
50
60
|
export function extendMatchers(config = {}) {
|
|
51
61
|
const comparators = {
|
|
52
62
|
pixelmatch: pixelmatchComparator,
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","
|
|
1
|
+
{"version":3,"file":"index.js","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
package/dist/metrics.d.ts
CHANGED
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import type { Comparator, RgbaImage } from './index.js';
|
|
2
2
|
/** ImageMagick `compare -metric` names. Upper bounds: AE PAE MAE MSE RMSE DSSIM. Lower bounds: PSNR SSIM. */
|
|
3
3
|
export type Metric = 'AE' | 'PAE' | 'MAE' | 'MSE' | 'RMSE' | 'PSNR' | 'SSIM' | 'DSSIM';
|
|
4
|
+
/** Options of the `metrics` comparator: error bounds named as in ImageMagick's `compare -metric`. Give any subset. */
|
|
4
5
|
export type MetricsOptions = {
|
|
5
6
|
/** ImageMagick `-fuzz`: per-channel RMS colour distance (0..1) within which two pixels count as equal. Default 0. */
|
|
6
7
|
fuzz?: number;
|
package/dist/metrics.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"metrics.d.ts","
|
|
1
|
+
{"version":3,"file":"metrics.d.ts","sources":["../src/metrics.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AAExD,6GAA6G;AAC7G,MAAM,MAAM,MAAM,GAAG,IAAI,GAAG,KAAK,GAAG,KAAK,GAAG,KAAK,GAAG,MAAM,GAAG,MAAM,GAAG,MAAM,GAAG,OAAO,CAAC;AAEvF,sHAAsH;AACtH,MAAM,MAAM,cAAc,GAAG;IAC3B,qHAAqH;IACrH,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,sGAAsG;IACtG,EAAE,CAAC,EAAE,MAAM,CAAC;IACZ,iCAAiC;IACjC,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,iCAAiC;IACjC,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,gCAAgC;IAChC,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,qCAAqC;IACrC,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,uFAAuF;IACvF,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,sGAAsG;IACtG,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,kDAAkD;IAClD,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB,CAAC;AAqBF;;;GAGG;AACH,wBAAgB,UAAU,CAAC,CAAC,EAAE,SAAS,EAAE,CAAC,EAAE,SAAS,EAAE,IAAI,EAAE,MAAM;;;;;;;;EAgClE;AA+BD,0GAA0G;AAC1G,wBAAgB,IAAI,CAAC,CAAC,EAAE,SAAS,EAAE,CAAC,EAAE,SAAS,GAAG,MAAM,CAmBvD;AAkBD;;;GAGG;AACH,eAAO,MAAM,iBAAiB,EAAE,UAAU,CAAC,cAAc,CAgCxD,CAAC"}
|
package/dist/metrics.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"metrics.js","
|
|
1
|
+
{"version":3,"file":"metrics.js","sources":["../src/metrics.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"update-policy.d.ts","
|
|
1
|
+
{"version":3,"file":"update-policy.d.ts","sources":["../src/update-policy.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,qBAAqB,GAAG,KAAK,GAAG,KAAK,GAAG,MAAM,CAAC;AAW3D,eAAO,MAAM,4BAA4B,kBACxB,OAAO,kBACN,OAAO,GAAG,SAAS,qBAChB,OAAO,QACpB,OAAO,KACZ,qBAMF,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"update-policy.js","
|
|
1
|
+
{"version":3,"file":"update-policy.js","sources":["../src/update-policy.ts"],"names":[],"mappings":"AAQA,MAAM,aAAa,GAAG,CAAC,KAAc,EAAkC,EAAE,CACvE,KAAK,KAAK,KAAK,IAAI,KAAK,KAAK,KAAK,IAAI,KAAK,KAAK,MAAM,CAAC;AAEzD,MAAM,CAAC,MAAM,4BAA4B,GAAG,CAC1C,aAAsB,EACtB,cAAmC,EACnC,iBAA0B,EAC1B,IAAa,EACU,EAAE;IACzB,IAAI,cAAc,KAAK,SAAS;QAAE,OAAO,cAAc,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,CAAC;IACzE,IAAI,iBAAiB;QAAE,OAAO,KAAK,CAAC;IACpC,MAAM,UAAU,GAAG,aAAoD,CAAC;IACxE,MAAM,KAAK,GAAG,UAAU,EAAE,mBAAmB,IAAI,UAAU,EAAE,eAAe,CAAC;IAC7E,OAAO,aAAa,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC;AAC9D,CAAC,CAAC"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "vitest-screenshot",
|
|
3
|
-
"version": "3.0.
|
|
3
|
+
"version": "3.0.2",
|
|
4
4
|
"description": "toMatchScreenshot() for Vitest: image-snapshot a WebGL/WebGPU canvas, Image or ImageData against a committed png/jpg/gif/webp baseline",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"canvas",
|
|
@@ -51,8 +51,8 @@
|
|
|
51
51
|
"access": "public"
|
|
52
52
|
},
|
|
53
53
|
"dependencies": {
|
|
54
|
-
"pixelmatch": "^7.
|
|
55
|
-
"sharp": "^0.35.
|
|
54
|
+
"pixelmatch": "^7.2.0",
|
|
55
|
+
"sharp": "^0.35.5"
|
|
56
56
|
},
|
|
57
57
|
"peerDependencies": {
|
|
58
58
|
"vitest": ">=4 <6"
|
|
@@ -61,7 +61,7 @@
|
|
|
61
61
|
"node": ">=22"
|
|
62
62
|
},
|
|
63
63
|
"scripts": {
|
|
64
|
-
"build": "tsc",
|
|
65
|
-
"tsc": "tsc && tsc -p tsconfig.type-tests.json"
|
|
64
|
+
"build": "tsc -p tsconfig.build.json",
|
|
65
|
+
"tsc": "tsc --noEmit && tsc -p tsconfig.type-tests.json"
|
|
66
66
|
}
|
|
67
67
|
}
|
package/src/index.ts
CHANGED
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { existsSync, mkdirSync } from 'node:fs';
|
|
2
|
+
import { readFile } from 'node:fs/promises';
|
|
2
3
|
import { basename, dirname, extname, isAbsolute, join } from 'node:path';
|
|
3
4
|
import pixelmatch from 'pixelmatch';
|
|
4
5
|
import sharp, { type FormatEnum } from 'sharp';
|
|
@@ -9,7 +10,14 @@ import { resolveScreenshotUpdateState } from './update-policy.js';
|
|
|
9
10
|
export type { Metric, MetricsOptions } from './metrics.js';
|
|
10
11
|
|
|
11
12
|
/** Anything with RGBA8 pixels, top row first: `ImageData`, node-webgl's `canvas.getImageData()`, or a WebGPU readback. */
|
|
12
|
-
export type RgbaImage = {
|
|
13
|
+
export type RgbaImage = {
|
|
14
|
+
/** Width in pixels. */
|
|
15
|
+
width: number;
|
|
16
|
+
/** Height in pixels. */
|
|
17
|
+
height: number;
|
|
18
|
+
/** RGBA8 bytes, four per pixel, row by row from the top. */
|
|
19
|
+
data: Uint8Array | Uint8ClampedArray;
|
|
20
|
+
};
|
|
13
21
|
|
|
14
22
|
/**
|
|
15
23
|
* A source of pixels: an `RgbaImage` / `ImageData`, a WebGPU `HeadlessCanvas` (`readPixels()`), a node-webgl
|
|
@@ -17,17 +25,41 @@ export type RgbaImage = { width: number; height: number; data: Uint8Array | Uint
|
|
|
17
25
|
*/
|
|
18
26
|
export type ImageSource =
|
|
19
27
|
| RgbaImage
|
|
20
|
-
| {
|
|
21
|
-
|
|
22
|
-
|
|
28
|
+
| {
|
|
29
|
+
/** Reads the pixels back from the GPU, as the WebGPU environment's `HeadlessCanvas` does. */
|
|
30
|
+
readPixels(): Promise<RgbaImage>;
|
|
31
|
+
}
|
|
32
|
+
| {
|
|
33
|
+
/** Returns the canvas pixels synchronously, as node-webgl's `Canvas` does. */
|
|
34
|
+
getImageData(): RgbaImage;
|
|
35
|
+
}
|
|
36
|
+
| {
|
|
37
|
+
/** Decodes the image so its pixels can be read, as node-webgl's `Image` does. */
|
|
38
|
+
decode(): Promise<void>;
|
|
39
|
+
};
|
|
23
40
|
|
|
24
41
|
/** A baseline: a file path with extension (relative to `baselineDir` or absolute), or an in-memory `ImageSource`. */
|
|
25
42
|
export type Reference = string | ImageSource;
|
|
26
43
|
|
|
27
44
|
/** What a comparator returns, as in Vitest browser mode: `diff` is written next to the baseline on failure. */
|
|
28
|
-
export type ComparatorResult = {
|
|
45
|
+
export type ComparatorResult = {
|
|
46
|
+
/** Whether the two images count as the same. */
|
|
47
|
+
pass: boolean;
|
|
48
|
+
/** An image of the differences, written as `<name>.diff.png` on failure, or `null` for none. */
|
|
49
|
+
diff: RgbaImage | null;
|
|
50
|
+
/** A description of the result, included in the failure message. */
|
|
51
|
+
message: string | null;
|
|
52
|
+
};
|
|
29
53
|
|
|
30
|
-
/**
|
|
54
|
+
/**
|
|
55
|
+
* A comparator, with the signature Vitest browser mode uses for `comparators`.
|
|
56
|
+
*
|
|
57
|
+
* @typeParam Options - The comparator's own options, taken from `comparatorOptions`.
|
|
58
|
+
* @param reference - The baseline image.
|
|
59
|
+
* @param actual - The image under test.
|
|
60
|
+
* @param options - The comparator options plus `createDiff`, which says whether a diff image is wanted.
|
|
61
|
+
* @returns Whether the images match, with an optional diff image and message.
|
|
62
|
+
*/
|
|
31
63
|
export type Comparator<Options extends object = Record<string, unknown>> = (
|
|
32
64
|
reference: RgbaImage,
|
|
33
65
|
actual: RgbaImage,
|
|
@@ -44,7 +76,9 @@ export type PixelmatchOptions = NonNullable<Parameters<typeof pixelmatch>[5]> &
|
|
|
44
76
|
|
|
45
77
|
/** Comparator names and their options. Augment this interface when registering a custom comparator. */
|
|
46
78
|
export interface ComparatorRegistry {
|
|
79
|
+
/** Options of the default `pixelmatch` comparator. */
|
|
47
80
|
pixelmatch: PixelmatchOptions;
|
|
81
|
+
/** Options of the `metrics` comparator. */
|
|
48
82
|
metrics: MetricsOptions;
|
|
49
83
|
}
|
|
50
84
|
|
|
@@ -55,12 +89,20 @@ type ComparatorOptions<Name extends ComparatorName> = Extract<ComparatorRegistry
|
|
|
55
89
|
export type ComparatorSelection =
|
|
56
90
|
| {
|
|
57
91
|
[Name in ComparatorName]: {
|
|
92
|
+
/** The registered comparator to use. */
|
|
58
93
|
comparatorName: Name;
|
|
94
|
+
/** Options for that comparator. */
|
|
59
95
|
comparatorOptions?: ComparatorOptions<Name>;
|
|
60
96
|
};
|
|
61
97
|
}[ComparatorName]
|
|
62
|
-
| {
|
|
98
|
+
| {
|
|
99
|
+
/** Omitted: the comparator chosen in `extendMatchers()` applies, or `pixelmatch` by default. */
|
|
100
|
+
comparatorName?: undefined;
|
|
101
|
+
/** Options for the default comparator. */
|
|
102
|
+
comparatorOptions?: ComparatorOptions<ComparatorName>;
|
|
103
|
+
};
|
|
63
104
|
|
|
105
|
+
/** Options for one `toMatchScreenshot()` assertion: the comparator selection plus where baselines live. */
|
|
64
106
|
export type ScreenshotOptions = ComparatorSelection & {
|
|
65
107
|
/** Directory relative reference paths and diff images live in. Default: `__screenshots__` beside the test file. */
|
|
66
108
|
baselineDir?: string;
|
|
@@ -70,6 +112,7 @@ export type ScreenshotOptions = ComparatorSelection & {
|
|
|
70
112
|
|
|
71
113
|
/** Defaults for every assertion plus custom comparators, like `test.browser.expect.toMatchScreenshot` in Vitest config. */
|
|
72
114
|
export type ScreenshotConfig = ComparatorSelection & {
|
|
115
|
+
/** Custom comparators, keyed by the name used in `comparatorName`. */
|
|
73
116
|
comparators?: { [Name in ComparatorName]?: Comparator<ComparatorOptions<Name>> };
|
|
74
117
|
};
|
|
75
118
|
|
|
@@ -88,7 +131,11 @@ const raw = ({ width, height, data }: RgbaImage) => sharp(data, { raw: { width,
|
|
|
88
131
|
|
|
89
132
|
/** Decodes any format sharp reads (png, jpg, gif, webp, ...) into RGBA8. */
|
|
90
133
|
const readImage = async (file: string): Promise<RgbaImage> => {
|
|
91
|
-
|
|
134
|
+
// Decode from a buffer: sharp(path) leaves the handle in libvips' cache, which locks the file on Windows.
|
|
135
|
+
const { data, info } = await sharp(await readFile(file))
|
|
136
|
+
.ensureAlpha()
|
|
137
|
+
.raw()
|
|
138
|
+
.toBuffer({ resolveWithObject: true });
|
|
92
139
|
return { width: info.width, height: info.height, data };
|
|
93
140
|
};
|
|
94
141
|
|
|
@@ -130,6 +177,11 @@ export const pixelmatchComparator: Comparator<PixelmatchOptions> = (
|
|
|
130
177
|
};
|
|
131
178
|
};
|
|
132
179
|
|
|
180
|
+
/**
|
|
181
|
+
* Registers `toMatchScreenshot()` on Vitest's `expect`. Call it once per test file, or from a setup file.
|
|
182
|
+
*
|
|
183
|
+
* @param config - Default comparator and options for every assertion, and any custom comparators.
|
|
184
|
+
*/
|
|
133
185
|
export function extendMatchers(config: ScreenshotConfig = {}): void {
|
|
134
186
|
const comparators = {
|
|
135
187
|
pixelmatch: pixelmatchComparator,
|
package/src/metrics.ts
CHANGED
|
@@ -3,6 +3,7 @@ import type { Comparator, RgbaImage } from './index.js';
|
|
|
3
3
|
/** ImageMagick `compare -metric` names. Upper bounds: AE PAE MAE MSE RMSE DSSIM. Lower bounds: PSNR SSIM. */
|
|
4
4
|
export type Metric = 'AE' | 'PAE' | 'MAE' | 'MSE' | 'RMSE' | 'PSNR' | 'SSIM' | 'DSSIM';
|
|
5
5
|
|
|
6
|
+
/** Options of the `metrics` comparator: error bounds named as in ImageMagick's `compare -metric`. Give any subset. */
|
|
6
7
|
export type MetricsOptions = {
|
|
7
8
|
/** ImageMagick `-fuzz`: per-channel RMS colour distance (0..1) within which two pixels count as equal. Default 0. */
|
|
8
9
|
fuzz?: number;
|