Skip to content

Commit cb58f1f

Browse files
authored
Auto gen update (#166)
Here's a version that tries to massage the generated/index.d.ts code closer to the dist/index.d.ts. It also separates out the easy parts into extra.d.ts but rather than have 2 files in dist it preprends the contents when making generated/index.d.ts
1 parent db5bf71 commit cb58f1f

File tree

7 files changed

+423
-87
lines changed

7 files changed

+423
-87
lines changed

README.md

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -83,9 +83,8 @@ Please contribute a PR to add instructions for other setups or improve existing
8383
- Make sure the submodule is checked out: `git submodule update --init`
8484
- Pull `gpuweb` changes: `pushd gpuweb && git checkout main && git pull && popd`
8585
- Install dependencies: `npm ci`
86-
- Bug workaround: paste the `copies.bs` contents in place of its include in `index.bs` (generator doesn't support includes).
87-
- Generate `generated/index.d.ts`: `npm run generate`
88-
- Open a diff between `generated/index.d.ts` and `dist/index.d.ts`.
86+
- Generate `generated/index-fixed.d.ts`: `npm run generate`
87+
- Open a diff between `generated/index-fixed.d.ts` and `dist/index.d.ts`.
8988
The generated file is tracked by Git so you can see what has changed.
9089
Update the latter according to changes from the former.
9190
Note the `generated/` and `dist/` files are not the same.

dist/index.d.ts

Lines changed: 35 additions & 35 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33
// *********************************************************************************************
44

55
// *********************************************************************************************
6-
// Manually-written
6+
// Manually-written - auto copied from extra.d.ts
77
// *********************************************************************************************
88

99
// AllowSharedBufferSource wasn't introduced until TypeScript 5.2.
@@ -107,6 +107,40 @@ interface GPUDevice {
107107
): void;
108108
}
109109

110+
interface GPUCanvasConfigurationOut
111+
extends Required<
112+
Omit<
113+
GPUCanvasConfiguration,
114+
"toneMapping"
115+
>
116+
> {
117+
/** {@inheritDoc GPUCanvasConfiguration.viewFormats} */
118+
viewFormats: GPUTextureFormat[];
119+
/**
120+
* {@inheritDoc GPUCanvasConfiguration.toneMapping}
121+
*/
122+
toneMapping?: GPUCanvasToneMapping;
123+
}
124+
125+
/** @deprecated Use {@link GPUTexelCopyBufferLayout} */
126+
type GPUImageDataLayout =
127+
GPUTexelCopyBufferLayout;
128+
/** @deprecated Use {@link GPUTexelCopyBufferInfo} */
129+
type GPUImageCopyBuffer =
130+
GPUTexelCopyBufferInfo;
131+
/** @deprecated Use {@link GPUTexelCopyTextureInfo} */
132+
type GPUImageCopyTexture =
133+
GPUTexelCopyTextureInfo;
134+
/** @deprecated Use {@link GPUCopyExternalImageDestInfo} */
135+
type GPUImageCopyTextureTagged =
136+
GPUCopyExternalImageDestInfo;
137+
/** @deprecated Use {@link GPUCopyExternalImageSourceInfo} */
138+
type GPUImageCopyExternalImage =
139+
GPUCopyExternalImageSourceInfo;
140+
/** @deprecated Use {@link GPUCopyExternalImageSource} */
141+
type GPUImageCopyExternalImageSource =
142+
GPUCopyExternalImageSource;
143+
110144
// *********************************************************************************************
111145
// Semi-auto-generated (by manual diff with autogenerated types)
112146
// *********************************************************************************************
@@ -730,21 +764,6 @@ interface GPUCanvasConfiguration {
730764
alphaMode?: GPUCanvasAlphaMode;
731765
}
732766

733-
interface GPUCanvasConfigurationOut
734-
extends Required<
735-
Omit<
736-
GPUCanvasConfiguration,
737-
"toneMapping"
738-
>
739-
> {
740-
/** {@inheritDoc GPUCanvasConfiguration.viewFormats} */
741-
viewFormats: GPUTextureFormat[];
742-
/**
743-
* {@inheritDoc GPUCanvasConfiguration.toneMapping}
744-
*/
745-
toneMapping?: GPUCanvasToneMapping;
746-
}
747-
748767
interface GPUCanvasToneMapping {
749768
mode?: GPUCanvasToneMappingMode;
750769
}
@@ -3291,22 +3310,3 @@ interface GPUTextureUsage {
32913310
}
32923311

32933312
declare var GPUTextureUsage: GPUTextureUsage;
3294-
3295-
/** @deprecated Use {@link GPUTexelCopyBufferLayout} */
3296-
type GPUImageDataLayout =
3297-
GPUTexelCopyBufferLayout;
3298-
/** @deprecated Use {@link GPUTexelCopyBufferInfo} */
3299-
type GPUImageCopyBuffer =
3300-
GPUTexelCopyBufferInfo;
3301-
/** @deprecated Use {@link GPUTexelCopyTextureInfo} */
3302-
type GPUImageCopyTexture =
3303-
GPUTexelCopyTextureInfo;
3304-
/** @deprecated Use {@link GPUCopyExternalImageDestInfo} */
3305-
type GPUImageCopyTextureTagged =
3306-
GPUCopyExternalImageDestInfo;
3307-
/** @deprecated Use {@link GPUCopyExternalImageSourceInfo} */
3308-
type GPUImageCopyExternalImage =
3309-
GPUCopyExternalImageSourceInfo;
3310-
/** @deprecated Use {@link GPUCopyExternalImageSource} */
3311-
type GPUImageCopyExternalImageSource =
3312-
GPUCopyExternalImageSource;

extra.d.ts

Lines changed: 134 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,134 @@
1+
// AllowSharedBufferSource wasn't introduced until TypeScript 5.2.
2+
// But it also didn't include SharedArrayBuffer in the union.
3+
// This broke in ES2024 when ArrayBuffer gained some properties that SharedArrayBuffer didn't.
4+
// So, we use our own definition for AllowSharedBufferSource.
5+
6+
type GPUAllowSharedBufferSource =
7+
8+
| BufferSource
9+
| SharedArrayBuffer;
10+
11+
// Stronger typing for getContext()
12+
13+
interface HTMLCanvasElement {
14+
getContext(
15+
contextId:
16+
| "webgpu"
17+
): GPUCanvasContext | null;
18+
}
19+
interface OffscreenCanvas {
20+
getContext(
21+
contextId:
22+
| "webgpu"
23+
): GPUCanvasContext | null;
24+
}
25+
26+
// Defined as an empty interface here to prevent errors when using these types in a worker.
27+
28+
interface HTMLVideoElement {}
29+
30+
// Strict types defined to help developers catch a common class of errors.
31+
// This interface defines depth as an undefined, which will cause a type check failure if someone
32+
// attempts to set depth rather than depthOrArrayLayers on a GPUExtent3D (an easy mistake to make.)
33+
34+
type GPUOrigin2DStrict =
35+
36+
| Iterable<GPUIntegerCoordinate>
37+
| GPUOrigin2DDictStrict;
38+
interface GPUOrigin2DDictStrict
39+
extends GPUOrigin2DDict {
40+
/** @deprecated Does not exist for GPUOrigin2D. */
41+
z?: undefined;
42+
}
43+
type GPUExtent3DStrict =
44+
45+
| Iterable<GPUIntegerCoordinate>
46+
| GPUExtent3DDictStrict;
47+
interface GPUExtent3DDictStrict
48+
extends GPUExtent3DDict {
49+
/** @deprecated The correct name is `depthOrArrayLayers`. */
50+
depth?: undefined;
51+
}
52+
53+
// Stronger typing for event listeners.
54+
55+
/** @internal */
56+
interface __GPUDeviceEventMap {
57+
uncapturederror: GPUUncapturedErrorEvent;
58+
}
59+
60+
// Extensions to the generated definition below.
61+
interface GPUDevice {
62+
addEventListener<
63+
K extends keyof __GPUDeviceEventMap
64+
>(
65+
type: K,
66+
listener: (
67+
this: GPUDevice,
68+
ev: __GPUDeviceEventMap[K]
69+
) => any,
70+
options?:
71+
| boolean
72+
| AddEventListenerOptions
73+
): void;
74+
addEventListener(
75+
type: string,
76+
listener: EventListenerOrEventListenerObject,
77+
options?:
78+
| boolean
79+
| AddEventListenerOptions
80+
): void;
81+
removeEventListener<
82+
K extends keyof __GPUDeviceEventMap
83+
>(
84+
type: K,
85+
listener: (
86+
this: GPUDevice,
87+
ev: __GPUDeviceEventMap[K]
88+
) => any,
89+
options?:
90+
| boolean
91+
| EventListenerOptions
92+
): void;
93+
removeEventListener(
94+
type: string,
95+
listener: EventListenerOrEventListenerObject,
96+
options?:
97+
| boolean
98+
| EventListenerOptions
99+
): void;
100+
}
101+
102+
interface GPUCanvasConfigurationOut
103+
extends Required<
104+
Omit<
105+
GPUCanvasConfiguration,
106+
"toneMapping"
107+
>
108+
> {
109+
/** {@inheritDoc GPUCanvasConfiguration.viewFormats} */
110+
viewFormats: GPUTextureFormat[];
111+
/**
112+
* {@inheritDoc GPUCanvasConfiguration.toneMapping}
113+
*/
114+
toneMapping?: GPUCanvasToneMapping;
115+
}
116+
117+
/** @deprecated Use {@link GPUTexelCopyBufferLayout} */
118+
type GPUImageDataLayout =
119+
GPUTexelCopyBufferLayout;
120+
/** @deprecated Use {@link GPUTexelCopyBufferInfo} */
121+
type GPUImageCopyBuffer =
122+
GPUTexelCopyBufferInfo;
123+
/** @deprecated Use {@link GPUTexelCopyTextureInfo} */
124+
type GPUImageCopyTexture =
125+
GPUTexelCopyTextureInfo;
126+
/** @deprecated Use {@link GPUCopyExternalImageDestInfo} */
127+
type GPUImageCopyTextureTagged =
128+
GPUCopyExternalImageDestInfo;
129+
/** @deprecated Use {@link GPUCopyExternalImageSourceInfo} */
130+
type GPUImageCopyExternalImage =
131+
GPUCopyExternalImageSourceInfo;
132+
/** @deprecated Use {@link GPUCopyExternalImageSource} */
133+
type GPUImageCopyExternalImageSource =
134+
GPUCopyExternalImageSource;

fix-generated.mjs

Lines changed: 0 additions & 42 deletions
This file was deleted.

generate.mjs

Lines changed: 98 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,98 @@
1+
2+
import {spawnSync} from 'node:child_process';
3+
import fs from 'node:fs';
4+
import path from 'node:path';
5+
6+
function execute(cmd, args, options) {
7+
const { error, status } = spawnSync(cmd, args, {...options || {}, shell: true, stdio: 'inherit'});
8+
if (error) {
9+
throw new(Error);
10+
}
11+
if (status !== 0) {
12+
throw new Error(`${cmd} exited with status code: ${status}`);
13+
}
14+
}
15+
16+
function readFileAsUTF8(filename) {
17+
return fs.readFileSync(filename, { encoding: 'utf-8' });
18+
}
19+
20+
function fixupGenerated(srcFilename, dstFilename) {
21+
//execute('git')
22+
let ts = `\
23+
// *********************************************************************************************
24+
// This file is manually-edited by diffing against an autogenerated file. See README.md.
25+
// *********************************************************************************************
26+
27+
// *********************************************************************************************
28+
// Manually-written - auto copied from extra.d.ts
29+
// *********************************************************************************************
30+
31+
${readFileAsUTF8('extra.d.ts')}
32+
33+
// *********************************************************************************************
34+
// Semi-auto-generated (by manual diff with autogenerated types)
35+
// *********************************************************************************************
36+
37+
${readFileAsUTF8(srcFilename)}
38+
`
39+
ts = ts
40+
// Replace broken AllowSharedBufferSource with GPUAllowSharedBufferSource
41+
.replace(/(?<!\/\/.*)\bAllowSharedBufferSource\b/g, 'GPUAllowSharedBufferSource')
42+
43+
// convert [[#anchor]] to {@link spec_url}
44+
// convert [[#anchor|text]] to {@link spec_url|text}
45+
.replace(/([^#])\[\[([^\[].*?)\]\]/g, '$1{@link https://www.w3.org/TR/webgpu/$2}')
46+
47+
// convert {{ref}} to {@link ref}
48+
// convert {{ref|text}} to {@link ref|text}
49+
.replace(/\{\{(.*?)\}\}/g, '{@link $1}')
50+
51+
// convert {@link foo/method(...)} to {@link foo#method}
52+
.replace(/\{@link ([^[}]+)\/(.*?)\(.*?\)}/g, '{@link $1#$2}')
53+
54+
// convert {@link foo#[[bar]]} to {@link foo}.`[[bar]]`
55+
.replace(/\{@link ([^[}]+)#\[\[(.*?)]]}/g, '{@link $1}.`[[$2]]`')
56+
57+
// convert {@link foo#"bar"} to {@link foo} `"bar"`
58+
.replace(/\{@link ([^[}]+)#"(.*?)"}/g, '{@link $1} `"$2"`')
59+
60+
// fix links of the form {@link foo|text} -> {@link foo | text}
61+
.replace(/\{@link ([^}|]+)\|([^}|]+)\}/g, '{@link $1 | $2}')
62+
63+
// remove items that are known not to be linkable
64+
.replace(/{@link Promise}/g, 'Promise')
65+
.replace(/{@link ArrayBuffer}/g, 'ArrayBuffer')
66+
.replace(/{@link Uint32Array}/g, 'Uint32Array')
67+
.replace(/{@link RenderState}/g, 'RenderState')
68+
.replace(/{@link double}/g, '`double`')
69+
70+
.replace(/<pre highlight=['"]?(.*)['"]?>/g, '```$1')
71+
.replace(/<\/pre>/g, '```')
72+
73+
// add new(): never;
74+
.replace(/(\ndeclare\svar\s\w+:\s\{\n\s+prototype:.*?\n)\};/g, '$1 new(): never;\n};')
75+
76+
// replace : GPUExtent3D -> : GPUExtent3DStrict
77+
.replace(/: GPUExtent3D\b/g, ': GPUExtent3DStrict')
78+
79+
// replace Promise<... | undefined> with Promise<...>
80+
.replace(/( Promise<[^>]*?)\s+\|\s+undefined\s*>/g, '$1>')
81+
82+
; // end of replacements
83+
84+
fs.writeFileSync(dstFilename, ts);
85+
console.log(`wrote ${dstFilename}`);
86+
}
87+
88+
execute(
89+
'./node_modules/.bin/bikeshed-to-ts',
90+
[
91+
'--in', './gpuweb/spec/index.bs',
92+
'--out', './generated/index.d.ts',
93+
'--forceGlobal',
94+
'--nominal',
95+
]
96+
);
97+
fixupGenerated('./generated/index.d.ts', './generated/index.d.ts');
98+
execute('./node_modules/.bin/prettier', ['-w', 'generated/index.d.ts']);

0 commit comments

Comments
 (0)