vitest-environment-webgpu-node 1.0.1 → 2.0.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/CHANGELOG.md +10 -6
- package/README.md +48 -3
- package/dist/canvas.d.ts +8 -2
- package/dist/canvas.d.ts.map +1 -1
- package/dist/canvas.js +1 -1
- package/dist/canvas.js.map +1 -1
- package/package.json +7 -2
- package/src/canvas.ts +9 -3
package/CHANGELOG.md
CHANGED
|
@@ -1,8 +1,12 @@
|
|
|
1
|
-
## [vitest-environment-webgpu-node-
|
|
1
|
+
## [vitest-environment-webgpu-node-v2.0.0](https://github.com/bhouston/vitest-gpu/compare/vitest-environment-webgpu-node-v1.0.2...vitest-environment-webgpu-node-v2.0.0) (2026-09-23)
|
|
2
2
|
|
|
3
|
-
###
|
|
3
|
+
### ⚠ BREAKING CHANGES
|
|
4
4
|
|
|
5
|
-
*
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
5
|
+
* **webgpu-node:** TypeScript 5 projects no longer receive WebGPU types
|
|
6
|
+
from this package; upgrade to TypeScript 6 or add @webgpu/types.
|
|
7
|
+
|
|
8
|
+
### Features
|
|
9
|
+
|
|
10
|
+
* **webgl-node:** warn when backend or api options are ignored ([2cb09c0](https://github.com/bhouston/vitest-gpu/commit/2cb09c00fecd091dc5ec1d60ed149a3b54b6d902)), closes [#42](https://github.com/bhouston/vitest-gpu/issues/42)
|
|
11
|
+
* **webgpu-node:** require TypeScript 6 or later ([bfb2586](https://github.com/bhouston/vitest-gpu/commit/bfb258649b354420bd2961e005e48044ad9122b3)), closes [#43](https://github.com/bhouston/vitest-gpu/issues/43) [#44](https://github.com/bhouston/vitest-gpu/issues/44)
|
|
12
|
+
* **webgpu-node:** require TypeScript 6 or later ([daf463d](https://github.com/bhouston/vitest-gpu/commit/daf463d1e89193f4bf4e08e9646c328962a95c1b)), closes [#42](https://github.com/bhouston/vitest-gpu/issues/42)
|
package/README.md
CHANGED
|
@@ -1,21 +1,36 @@
|
|
|
1
1
|
# vitest-environment-webgpu-node
|
|
2
2
|
|
|
3
|
-
|
|
3
|
+
[![npm version][npm-badge]][npm-url]
|
|
4
|
+
[![npm downloads][downloads-badge]][npm-url]
|
|
5
|
+
[![Tests][tests-badge]][tests-url]
|
|
6
|
+
|
|
7
|
+
Real, headless WebGPU inside Vitest, with no browser. Native GPU testing is up to 2.4x faster
|
|
8
|
+
than running the same tests in a browser — see the
|
|
9
|
+
[blog post](https://ben3d.ca/blog/native-gpu-testing-for-vitest-and-jest) for details.
|
|
10
|
+
Powered by Google's Dawn through the
|
|
4
11
|
[`webgpu`](https://github.com/dawn-gpu/node-webgpu) npm package.
|
|
5
12
|
|
|
6
13
|
The environment puts `navigator.gpu` and every `GPU*` class and constant (`GPUBufferUsage`,
|
|
7
14
|
`GPUShaderStage`, ...) on the global object before each test file and removes them afterwards.
|
|
8
15
|
|
|
16
|
+
Using Jest instead? See the equivalent
|
|
17
|
+
[`jest-environment-webgpu-node`](https://github.com/bhouston/jest-gpu/tree/main/packages/jest-environment-webgpu-node)
|
|
18
|
+
in [jest-gpu](https://github.com/bhouston/jest-gpu).
|
|
19
|
+
|
|
9
20
|
## Install
|
|
10
21
|
|
|
11
22
|
```sh
|
|
12
23
|
pnpm add -D vitest vitest-environment-webgpu-node
|
|
13
24
|
```
|
|
14
25
|
|
|
26
|
+
Type checking needs TypeScript 6 or later (see [TypeScript types](#typescript-types)).
|
|
27
|
+
|
|
15
28
|
## Usage
|
|
16
29
|
|
|
17
30
|
```ts
|
|
18
31
|
// vitest.config.ts
|
|
32
|
+
import { defineConfig } from 'vitest/config';
|
|
33
|
+
|
|
19
34
|
export default defineConfig({
|
|
20
35
|
test: {
|
|
21
36
|
environment: 'webgpu-node',
|
|
@@ -24,6 +39,21 @@ export default defineConfig({
|
|
|
24
39
|
});
|
|
25
40
|
```
|
|
26
41
|
|
|
42
|
+
### TypeScript types
|
|
43
|
+
|
|
44
|
+
Requires TypeScript 6 or later, whose DOM library declares the WebGPU API. Include the DOM library in
|
|
45
|
+
`lib` (a project without it can add `@webgpu/types` to `types` instead):
|
|
46
|
+
|
|
47
|
+
```json
|
|
48
|
+
{
|
|
49
|
+
"compilerOptions": {
|
|
50
|
+
"lib": ["ES2024", "DOM"],
|
|
51
|
+
"types": ["node"],
|
|
52
|
+
"skipLibCheck": false
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
```
|
|
56
|
+
|
|
27
57
|
```ts
|
|
28
58
|
import { expect, it } from 'vitest';
|
|
29
59
|
|
|
@@ -57,5 +87,20 @@ await expect(canvas).toMatchScreenshot('scene.png');
|
|
|
57
87
|
`readPixels()` returns `{ width, height, data }` RGBA8 pixels, ready for
|
|
58
88
|
[`vitest-screenshot`](../vitest-screenshot). Readback supports `rgba8unorm`, `rgba8unorm-srgb`,
|
|
59
89
|
`bgra8unorm`, and `bgra8unorm-srgb`; other canvas formats remain valid for rendering but
|
|
60
|
-
`readPixels()` rejects them with an unsupported-format error. `asElement()`
|
|
61
|
-
|
|
90
|
+
`readPixels()` rejects them with an unsupported-format error. `asElement()` returns the same object and
|
|
91
|
+
defaults to `HTMLCanvasElement` when DOM types are available. You can also request a library-specific type
|
|
92
|
+
explicitly with `canvas.asElement<HTMLCanvasElement>()`.
|
|
93
|
+
|
|
94
|
+
## Author
|
|
95
|
+
|
|
96
|
+
Created by [Ben Houston](https://ben3d.ca) and sponsored by [Land of Assets](https://landofassets.com).
|
|
97
|
+
|
|
98
|
+
## License
|
|
99
|
+
|
|
100
|
+
MIT
|
|
101
|
+
|
|
102
|
+
[npm-badge]: https://img.shields.io/npm/v/vitest-environment-webgpu-node.svg
|
|
103
|
+
[npm-url]: https://www.npmjs.com/package/vitest-environment-webgpu-node
|
|
104
|
+
[downloads-badge]: https://img.shields.io/npm/dm/vitest-environment-webgpu-node.svg
|
|
105
|
+
[tests-badge]: https://github.com/bhouston/vitest-gpu/actions/workflows/ci.yml/badge.svg
|
|
106
|
+
[tests-url]: https://github.com/bhouston/vitest-gpu/actions/workflows/ci.yml
|
package/dist/canvas.d.ts
CHANGED
|
@@ -4,6 +4,11 @@ export type RgbaImage = {
|
|
|
4
4
|
height: number;
|
|
5
5
|
data: Uint8Array;
|
|
6
6
|
};
|
|
7
|
+
type DefaultCanvasElement = typeof globalThis extends {
|
|
8
|
+
HTMLCanvasElement: {
|
|
9
|
+
prototype: infer TElement;
|
|
10
|
+
};
|
|
11
|
+
} ? TElement : HeadlessCanvas;
|
|
7
12
|
/** Minimal `GPUCanvasContext`: `getCurrentTexture()` is a texture the size of the canvas, kept until reconfigured or resized. */
|
|
8
13
|
export declare class HeadlessCanvasContext {
|
|
9
14
|
#private;
|
|
@@ -28,8 +33,8 @@ export declare class HeadlessCanvas {
|
|
|
28
33
|
getContext(id: 'webgpu'): HeadlessCanvasContext;
|
|
29
34
|
getContext(id: string): HeadlessCanvasContext | null;
|
|
30
35
|
readPixels(): Promise<RgbaImage>;
|
|
31
|
-
/** This same object,
|
|
32
|
-
asElement():
|
|
36
|
+
/** This same object, cast to the element type a rendering library expects. */
|
|
37
|
+
asElement<TElement = DefaultCanvasElement>(): TElement;
|
|
33
38
|
getBoundingClientRect(): {
|
|
34
39
|
x: number;
|
|
35
40
|
y: number;
|
|
@@ -45,4 +50,5 @@ export declare class HeadlessCanvas {
|
|
|
45
50
|
dispatchEvent(): boolean;
|
|
46
51
|
}
|
|
47
52
|
export declare const createCanvas: (width: number, height: number) => HeadlessCanvas;
|
|
53
|
+
export {};
|
|
48
54
|
//# sourceMappingURL=canvas.d.ts.map
|
package/dist/canvas.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"canvas.d.ts","sourceRoot":"","sources":["../src/canvas.ts"],"names":[],"mappings":"AAAA,yFAAyF;AACzF,MAAM,MAAM,SAAS,GAAG;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,UAAU,CAAA;CAAE,CAAC;
|
|
1
|
+
{"version":3,"file":"canvas.d.ts","sourceRoot":"","sources":["../src/canvas.ts"],"names":[],"mappings":"AAAA,yFAAyF;AACzF,MAAM,MAAM,SAAS,GAAG;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,UAAU,CAAA;CAAE,CAAC;AAE5E,KAAK,oBAAoB,GAAG,OAAO,UAAU,SAAS;IACpD,iBAAiB,EAAE;QAAE,SAAS,EAAE,MAAM,QAAQ,CAAA;KAAE,CAAC;CAClD,GACG,QAAQ,GACR,cAAc,CAAC;AAanB,iIAAiI;AACjI,qBAAa,qBAAqB;;IAIpB,QAAQ,CAAC,MAAM,EAAE,cAAc;IAA3C,YAAqB,MAAM,EAAE,cAAc,EAAI;IAE/C,SAAS,CAAC,MAAM,EAAE,sBAAsB,GAAG,IAAI,CAG9C;IAED,WAAW,IAAI,IAAI,CAGlB;IAED,gBAAgB,IAAI,sBAAsB,GAAG,IAAI,CAEhD;IAED,iBAAiB,IAAI,UAAU,CAY9B;IAED,gFAAgF;IAC1E,UAAU,IAAI,OAAO,CAAC,SAAS,CAAC,CAmCrC;CAMF;AAED,6FAA6F;AAC7F,qBAAa,cAAc;;IAMhB,KAAK;IACL,MAAM;IALf,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAM;IAG5C,YACS,KAAK,SAAM,EACX,MAAM,SAAM,EACjB;IAEJ,IAAI,WAAW,IAAI,MAAM,CAExB;IAED,IAAI,YAAY,IAAI,MAAM,CAEzB;IAED,UAAU,CAAC,EAAE,EAAE,QAAQ,GAAG,qBAAqB,CAAC;IAChD,UAAU,CAAC,EAAE,EAAE,MAAM,GAAG,qBAAqB,GAAG,IAAI,CAAC;IAKrD,UAAU,IAAI,OAAO,CAAC,SAAS,CAAC,CAE/B;IAED,8EAA8E;IAC9E,SAAS,CAAC,QAAQ,GAAG,oBAAoB,KAAK,QAAQ,CAErD;IAED,qBAAqB,IAAI;QAAE,CAAC,EAAE,MAAM,CAAC;QAAC,CAAC,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAC;QAAC,GAAG,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,CAE1G;IAED,YAAY,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,IAAI,CAE9C;IAED,YAAY,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAExC;IAED,gBAAgB,IAAI,IAAI,CAAG;IAC3B,mBAAmB,IAAI,IAAI,CAAG;IAC9B,aAAa,IAAI,OAAO,CAEvB;CACF;AAED,eAAO,MAAM,YAAY,UAAW,MAAM,UAAU,MAAM,KAAG,cAAmD,CAAC"}
|
package/dist/canvas.js
CHANGED
|
@@ -110,7 +110,7 @@ export class HeadlessCanvas {
|
|
|
110
110
|
readPixels() {
|
|
111
111
|
return this.#context.readPixels();
|
|
112
112
|
}
|
|
113
|
-
/** This same object,
|
|
113
|
+
/** This same object, cast to the element type a rendering library expects. */
|
|
114
114
|
asElement() {
|
|
115
115
|
return this;
|
|
116
116
|
}
|
package/dist/canvas.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"canvas.js","sourceRoot":"","sources":["../src/canvas.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"canvas.js","sourceRoot":"","sources":["../src/canvas.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "vitest-environment-webgpu-node",
|
|
3
|
-
"version": "
|
|
3
|
+
"version": "2.0.0",
|
|
4
4
|
"description": "Vitest environment that provides real headless WebGPU (Dawn via the webgpu package) in Node",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"dawn",
|
|
@@ -47,12 +47,17 @@
|
|
|
47
47
|
"tsc": "tsc"
|
|
48
48
|
},
|
|
49
49
|
"dependencies": {
|
|
50
|
-
"@webgpu/types": "^0.1.72",
|
|
51
50
|
"webgpu": "^0.6.1"
|
|
52
51
|
},
|
|
53
52
|
"peerDependencies": {
|
|
53
|
+
"typescript": ">=6",
|
|
54
54
|
"vitest": ">=3 <5"
|
|
55
55
|
},
|
|
56
|
+
"peerDependenciesMeta": {
|
|
57
|
+
"typescript": {
|
|
58
|
+
"optional": true
|
|
59
|
+
}
|
|
60
|
+
},
|
|
56
61
|
"engines": {
|
|
57
62
|
"node": ">=20.0.0"
|
|
58
63
|
}
|
package/src/canvas.ts
CHANGED
|
@@ -1,6 +1,12 @@
|
|
|
1
1
|
/** RGBA8 pixels, top row first. Feed it to `vitest-screenshot`'s `toMatchScreenshot`. */
|
|
2
2
|
export type RgbaImage = { width: number; height: number; data: Uint8Array };
|
|
3
3
|
|
|
4
|
+
type DefaultCanvasElement = typeof globalThis extends {
|
|
5
|
+
HTMLCanvasElement: { prototype: infer TElement };
|
|
6
|
+
}
|
|
7
|
+
? TElement
|
|
8
|
+
: HeadlessCanvas;
|
|
9
|
+
|
|
4
10
|
const COPY_SRC = 0x01;
|
|
5
11
|
const RENDER_ATTACHMENT = 0x10;
|
|
6
12
|
const MAP_READ = 0x01;
|
|
@@ -120,9 +126,9 @@ export class HeadlessCanvas {
|
|
|
120
126
|
return this.#context.readPixels();
|
|
121
127
|
}
|
|
122
128
|
|
|
123
|
-
/** This same object,
|
|
124
|
-
asElement():
|
|
125
|
-
return this as unknown as
|
|
129
|
+
/** This same object, cast to the element type a rendering library expects. */
|
|
130
|
+
asElement<TElement = DefaultCanvasElement>(): TElement {
|
|
131
|
+
return this as unknown as TElement;
|
|
126
132
|
}
|
|
127
133
|
|
|
128
134
|
getBoundingClientRect(): { x: number; y: number; width: number; height: number; top: number; left: number } {
|