vitest-environment-webgl-node 0.1.2 → 1.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 -5
- package/README.md +38 -2
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +12 -2
- package/dist/index.js.map +1 -1
- package/package.json +1 -1
- package/src/index.ts +15 -2
package/CHANGELOG.md
CHANGED
|
@@ -1,7 +1,12 @@
|
|
|
1
|
-
## [vitest-environment-webgl-node-
|
|
1
|
+
## [vitest-environment-webgl-node-v1.0.0](https://github.com/bhouston/vitest-gpu/compare/vitest-environment-webgl-node-v0.1.3...vitest-environment-webgl-node-v1.0.0) (2026-09-23)
|
|
2
2
|
|
|
3
|
-
###
|
|
3
|
+
### ⚠ BREAKING CHANGES
|
|
4
4
|
|
|
5
|
-
*
|
|
6
|
-
|
|
7
|
-
|
|
5
|
+
* **webgl-node:** vitest-environment-webgl-node's public API is now
|
|
6
|
+
considered stable; future breaking changes will bump the major version.
|
|
7
|
+
No functional change in this release.
|
|
8
|
+
|
|
9
|
+
### Features
|
|
10
|
+
|
|
11
|
+
* **webgl-node:** declare public API stable ([1439909](https://github.com/bhouston/vitest-gpu/commit/14399090849c3f1bf2fd1ffbfc077f81d6d64fa5)), closes [#50](https://github.com/bhouston/vitest-gpu/issues/50)
|
|
12
|
+
* **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)
|
package/README.md
CHANGED
|
@@ -1,6 +1,13 @@
|
|
|
1
1
|
# vitest-environment-webgl-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 WebGL 1 and WebGL 2 inside Vitest, with no browser. Native GPU testing is up to
|
|
8
|
+
2.4x faster 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
|
|
4
11
|
[`@onirenaud/node-webgl`](https://github.com/RenaudRohlinger/node-webgl) (Chrome's ANGLE, statically linked).
|
|
5
12
|
|
|
6
13
|
The environment installs `window`, `document`, `HTMLCanvasElement`, `Image`, `requestAnimationFrame`,
|
|
@@ -8,6 +15,15 @@ the `WebGL*` classes and a file-reading `fetch()` before each test file, and rem
|
|
|
8
15
|
`document.createElement('canvas').getContext('webgl2')` returns a GPU-backed context, so three.js,
|
|
9
16
|
regl, pixi and plain WebGL code run unchanged.
|
|
10
17
|
|
|
18
|
+
Using Jest instead? See the equivalent
|
|
19
|
+
[`jest-environment-webgl-node`](https://github.com/bhouston/jest-gpu/tree/main/packages/jest-environment-webgl-node)
|
|
20
|
+
in [jest-gpu](https://github.com/bhouston/jest-gpu).
|
|
21
|
+
|
|
22
|
+
## Stability
|
|
23
|
+
|
|
24
|
+
As of 1.0.0, the public API (the environment export and its options) is considered stable.
|
|
25
|
+
Breaking changes will be released as a new major version.
|
|
26
|
+
|
|
11
27
|
## Install
|
|
12
28
|
|
|
13
29
|
```sh
|
|
@@ -18,6 +34,8 @@ pnpm add -D vitest vitest-environment-webgl-node
|
|
|
18
34
|
|
|
19
35
|
```ts
|
|
20
36
|
// vitest.config.ts
|
|
37
|
+
import { defineConfig } from 'vitest/config';
|
|
38
|
+
|
|
21
39
|
export default defineConfig({
|
|
22
40
|
test: {
|
|
23
41
|
environment: 'webgl-node',
|
|
@@ -43,7 +61,25 @@ Options are those of node-webgl's `init()` (`backend`, `api`) and `installDOM()`
|
|
|
43
61
|
(`baseDir`, `fetch`, `devicePixelRatio`, `innerWidth`, `innerHeight`, `frameInterval`).
|
|
44
62
|
Pair with [`vitest-screenshot`](../vitest-screenshot) for pixel-diff assertions.
|
|
45
63
|
|
|
46
|
-
|
|
64
|
+
For a Node-only TypeScript project, opt into types for the installed globals by adding
|
|
65
|
+
`import 'vitest-environment-webgl-node/globals';` to a `.d.ts` file your tsconfig includes. Do not include
|
|
66
|
+
this entry in projects that load TypeScript's DOM library: the real browser globals and node-webgl's shims
|
|
67
|
+
intentionally have different types. DOM projects can use their standard global declarations and cast a
|
|
68
|
+
node-webgl canvas at the library boundary when necessary.
|
|
47
69
|
|
|
48
70
|
On Linux CI install Mesa (`apt-get install libegl1 libgles2 libgl1-mesa-dri`) and set
|
|
49
71
|
`LIBGL_ALWAYS_SOFTWARE=1`. macOS and Windows use prebuilt binaries.
|
|
72
|
+
|
|
73
|
+
## Author
|
|
74
|
+
|
|
75
|
+
Created by [Ben Houston](https://ben3d.ca) and sponsored by [Land of Assets](https://landofassets.com).
|
|
76
|
+
|
|
77
|
+
## License
|
|
78
|
+
|
|
79
|
+
MIT
|
|
80
|
+
|
|
81
|
+
[npm-badge]: https://img.shields.io/npm/v/vitest-environment-webgl-node.svg
|
|
82
|
+
[npm-url]: https://www.npmjs.com/package/vitest-environment-webgl-node
|
|
83
|
+
[downloads-badge]: https://img.shields.io/npm/dm/vitest-environment-webgl-node.svg
|
|
84
|
+
[tests-badge]: https://github.com/bhouston/vitest-gpu/actions/workflows/ci.yml/badge.svg
|
|
85
|
+
[tests-url]: https://github.com/bhouston/vitest-gpu/actions/workflows/ci.yml
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAoC,KAAK,WAAW,EAAE,KAAK,iBAAiB,EAAE,MAAM,uBAAuB,CAAC;AAMnH,2EAA2E;AAC3E,MAAM,MAAM,gBAAgB,GAAG,WAAW,GAAG,iBAAiB,CAAC;;;;;kBAmF/C,OAAO,UAAU,iBAAsB;QAAE,SAAS,CAAC,EAAE,gBAAgB,CAAA;KAAE;oBAwCrE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC"}
|
package/dist/index.js
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { init, installDOM } from '@onirenaud/node-webgl';
|
|
1
|
+
import { getDisplayInfo, init, installDOM } from '@onirenaud/node-webgl';
|
|
2
2
|
import { readFile } from 'node:fs/promises';
|
|
3
3
|
import { extname, resolve } from 'node:path';
|
|
4
4
|
import { fileURLToPath } from 'node:url';
|
|
@@ -79,8 +79,18 @@ export default {
|
|
|
79
79
|
viteEnvironment: 'ssr',
|
|
80
80
|
setup(global, { webglNode = {} }) {
|
|
81
81
|
const { backend, api, ...dom } = webglNode;
|
|
82
|
-
if (backend || api)
|
|
82
|
+
if (backend || api) {
|
|
83
|
+
// node-webgl initialises its EGL display once per process; later options cannot change it.
|
|
84
|
+
const display = getDisplayInfo();
|
|
85
|
+
const ignored = [
|
|
86
|
+
backend && backend !== 'default' && backend !== display?.backend && `backend "${backend}"`,
|
|
87
|
+
api && api !== 'auto' && api !== display?.api && `api "${api}"`,
|
|
88
|
+
].filter(Boolean);
|
|
89
|
+
if (display && ignored.length) {
|
|
90
|
+
console.warn(`vitest-environment-webgl-node: ignoring ${ignored.join(' and ')}: the GL display was already initialised in this process (backend "${display.backend}", api "${display.api}"). Give every test file the same options, or run files in isolation.`);
|
|
91
|
+
}
|
|
83
92
|
init({ backend, api });
|
|
93
|
+
}
|
|
84
94
|
const before = snapshot(global);
|
|
85
95
|
const nested = [];
|
|
86
96
|
try {
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,UAAU,EAA4C,MAAM,uBAAuB,CAAC;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
package/src/index.ts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { init, installDOM, type InitOptions, type InstallDOMOptions } from '@onirenaud/node-webgl';
|
|
1
|
+
import { getDisplayInfo, init, installDOM, type InitOptions, type InstallDOMOptions } from '@onirenaud/node-webgl';
|
|
2
2
|
import { readFile } from 'node:fs/promises';
|
|
3
3
|
import { extname, resolve } from 'node:path';
|
|
4
4
|
import { fileURLToPath } from 'node:url';
|
|
@@ -90,7 +90,20 @@ export default {
|
|
|
90
90
|
viteEnvironment: 'ssr',
|
|
91
91
|
setup(global: typeof globalThis, { webglNode = {} }: { webglNode?: WebglNodeOptions }) {
|
|
92
92
|
const { backend, api, ...dom } = webglNode;
|
|
93
|
-
if (backend || api)
|
|
93
|
+
if (backend || api) {
|
|
94
|
+
// node-webgl initialises its EGL display once per process; later options cannot change it.
|
|
95
|
+
const display = getDisplayInfo();
|
|
96
|
+
const ignored = [
|
|
97
|
+
backend && backend !== 'default' && backend !== display?.backend && `backend "${backend}"`,
|
|
98
|
+
api && api !== 'auto' && api !== display?.api && `api "${api}"`,
|
|
99
|
+
].filter(Boolean);
|
|
100
|
+
if (display && ignored.length) {
|
|
101
|
+
console.warn(
|
|
102
|
+
`vitest-environment-webgl-node: ignoring ${ignored.join(' and ')}: the GL display was already initialised in this process (backend "${display.backend}", api "${display.api}"). Give every test file the same options, or run files in isolation.`,
|
|
103
|
+
);
|
|
104
|
+
}
|
|
105
|
+
init({ backend, api });
|
|
106
|
+
}
|
|
94
107
|
const before = snapshot(global);
|
|
95
108
|
const nested: { target: object; before: PropertySnapshot; changed?: Set<PropertyKey> }[] = [];
|
|
96
109
|
try {
|