vitest-environment-webgl-node 0.1.3 → 1.0.1
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 +2 -2
- package/README.md +24 -1
- package/dist/index.d.ts +0 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +12 -3
- package/dist/index.js.map +1 -1
- package/package.json +1 -1
- package/src/index.ts +15 -3
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
## [vitest-environment-webgl-node-
|
|
1
|
+
## [vitest-environment-webgl-node-v1.0.1](https://github.com/bhouston/vitest-gpu/compare/vitest-environment-webgl-node-v1.0.0...vitest-environment-webgl-node-v1.0.1) (2026-09-25)
|
|
2
2
|
|
|
3
3
|
### Bug Fixes
|
|
4
4
|
|
|
5
|
-
*
|
|
5
|
+
* drop deprecated transformMode from GPU environments ([28f736a](https://github.com/bhouston/vitest-gpu/commit/28f736ad629a2a3ca023839cadce460d0d5c6937)), closes [#54](https://github.com/bhouston/vitest-gpu/issues/54)
|
package/README.md
CHANGED
|
@@ -1,6 +1,14 @@
|
|
|
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
|
+
[![Discord][discord-badge]][discord-url]
|
|
7
|
+
|
|
8
|
+
Real, headless WebGL 1 and WebGL 2 inside Vitest, with no browser. Native GPU testing is up to
|
|
9
|
+
2.4x faster than running the same tests in a browser — see the
|
|
10
|
+
[blog post](https://ben3d.ca/blog/native-gpu-testing-for-vitest-and-jest) for details.
|
|
11
|
+
Powered by
|
|
4
12
|
[`@onirenaud/node-webgl`](https://github.com/RenaudRohlinger/node-webgl) (Chrome's ANGLE, statically linked).
|
|
5
13
|
|
|
6
14
|
The environment installs `window`, `document`, `HTMLCanvasElement`, `Image`, `requestAnimationFrame`,
|
|
@@ -12,6 +20,11 @@ Using Jest instead? See the equivalent
|
|
|
12
20
|
[`jest-environment-webgl-node`](https://github.com/bhouston/jest-gpu/tree/main/packages/jest-environment-webgl-node)
|
|
13
21
|
in [jest-gpu](https://github.com/bhouston/jest-gpu).
|
|
14
22
|
|
|
23
|
+
## Stability
|
|
24
|
+
|
|
25
|
+
As of 1.0.0, the public API (the environment export and its options) is considered stable.
|
|
26
|
+
Breaking changes will be released as a new major version.
|
|
27
|
+
|
|
15
28
|
## Install
|
|
16
29
|
|
|
17
30
|
```sh
|
|
@@ -22,6 +35,8 @@ pnpm add -D vitest vitest-environment-webgl-node
|
|
|
22
35
|
|
|
23
36
|
```ts
|
|
24
37
|
// vitest.config.ts
|
|
38
|
+
import { defineConfig } from 'vitest/config';
|
|
39
|
+
|
|
25
40
|
export default defineConfig({
|
|
26
41
|
test: {
|
|
27
42
|
environment: 'webgl-node',
|
|
@@ -63,3 +78,11 @@ Created by [Ben Houston](https://ben3d.ca) and sponsored by [Land of Assets](htt
|
|
|
63
78
|
## License
|
|
64
79
|
|
|
65
80
|
MIT
|
|
81
|
+
|
|
82
|
+
[npm-badge]: https://img.shields.io/npm/v/vitest-environment-webgl-node.svg
|
|
83
|
+
[npm-url]: https://www.npmjs.com/package/vitest-environment-webgl-node
|
|
84
|
+
[downloads-badge]: https://img.shields.io/npm/dm/vitest-environment-webgl-node.svg
|
|
85
|
+
[tests-badge]: https://github.com/bhouston/vitest-gpu/actions/workflows/ci.yml/badge.svg
|
|
86
|
+
[tests-url]: https://github.com/bhouston/vitest-gpu/actions/workflows/ci.yml
|
|
87
|
+
[discord-badge]: https://img.shields.io/badge/Discord-Join%20Chat-5865F2?logo=discord&logoColor=white
|
|
88
|
+
[discord-url]: https://discord.gg/fwupDN493R
|
package/dist/index.d.ts
CHANGED
|
@@ -3,7 +3,6 @@ import { type InitOptions, type InstallDOMOptions } from '@onirenaud/node-webgl'
|
|
|
3
3
|
export type WebglNodeOptions = InitOptions & InstallDOMOptions;
|
|
4
4
|
declare const _default: {
|
|
5
5
|
name: string;
|
|
6
|
-
transformMode: "ssr";
|
|
7
6
|
viteEnvironment: "ssr";
|
|
8
7
|
setup(global: typeof globalThis, { webglNode }: {
|
|
9
8
|
webglNode?: WebglNodeOptions;
|
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;;;;kBAkF/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';
|
|
@@ -75,12 +75,21 @@ const installFetch = (global, baseDir) => {
|
|
|
75
75
|
};
|
|
76
76
|
export default {
|
|
77
77
|
name: 'webgl-node',
|
|
78
|
-
transformMode: 'ssr',
|
|
79
78
|
viteEnvironment: 'ssr',
|
|
80
79
|
setup(global, { webglNode = {} }) {
|
|
81
80
|
const { backend, api, ...dom } = webglNode;
|
|
82
|
-
if (backend || api)
|
|
81
|
+
if (backend || api) {
|
|
82
|
+
// node-webgl initialises its EGL display once per process; later options cannot change it.
|
|
83
|
+
const display = getDisplayInfo();
|
|
84
|
+
const ignored = [
|
|
85
|
+
backend && backend !== 'default' && backend !== display?.backend && `backend "${backend}"`,
|
|
86
|
+
api && api !== 'auto' && api !== display?.api && `api "${api}"`,
|
|
87
|
+
].filter(Boolean);
|
|
88
|
+
if (display && ignored.length) {
|
|
89
|
+
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.`);
|
|
90
|
+
}
|
|
83
91
|
init({ backend, api });
|
|
92
|
+
}
|
|
84
93
|
const before = snapshot(global);
|
|
85
94
|
const nested = [];
|
|
86
95
|
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';
|
|
@@ -86,11 +86,23 @@ const installFetch = (global: typeof globalThis, baseDir: string): void => {
|
|
|
86
86
|
|
|
87
87
|
export default {
|
|
88
88
|
name: 'webgl-node',
|
|
89
|
-
transformMode: 'ssr',
|
|
90
89
|
viteEnvironment: 'ssr',
|
|
91
90
|
setup(global: typeof globalThis, { webglNode = {} }: { webglNode?: WebglNodeOptions }) {
|
|
92
91
|
const { backend, api, ...dom } = webglNode;
|
|
93
|
-
if (backend || api)
|
|
92
|
+
if (backend || api) {
|
|
93
|
+
// node-webgl initialises its EGL display once per process; later options cannot change it.
|
|
94
|
+
const display = getDisplayInfo();
|
|
95
|
+
const ignored = [
|
|
96
|
+
backend && backend !== 'default' && backend !== display?.backend && `backend "${backend}"`,
|
|
97
|
+
api && api !== 'auto' && api !== display?.api && `api "${api}"`,
|
|
98
|
+
].filter(Boolean);
|
|
99
|
+
if (display && ignored.length) {
|
|
100
|
+
console.warn(
|
|
101
|
+
`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.`,
|
|
102
|
+
);
|
|
103
|
+
}
|
|
104
|
+
init({ backend, api });
|
|
105
|
+
}
|
|
94
106
|
const before = snapshot(global);
|
|
95
107
|
const nested: { target: object; before: PropertySnapshot; changed?: Set<PropertyKey> }[] = [];
|
|
96
108
|
try {
|