Skip to content

Commit 02eb871

Browse files
committed
Support generic Uint8Array<ArrayBuffer>
1 parent 7191a93 commit 02eb871

File tree

6 files changed

+191
-18
lines changed

6 files changed

+191
-18
lines changed

deploy/template/package.json

+2-1
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,8 @@
1111
"url": "https://github.com/microsoft/TypeScript-DOM-Lib-Generator.git"
1212
},
1313
"typesVersions": {
14-
"<=5.5": { "*": ["ts5.5/*"] }
14+
"<=5.5": { "*": ["ts5.5/*"] },
15+
"<=5.6": { "*": ["ts5.6/*"] }
1516
},
1617
"scripts": {},
1718
"dependencies": {}

eslint.config.mjs

+1
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@ export default typescriptEslint.config(
2222
"@typescript-eslint/no-explicit-any": 0,
2323
"@typescript-eslint/no-non-null-assertion": 0,
2424
"@typescript-eslint/no-var-requires": 0,
25+
"prettier/prettier": ["error", { "endOfLine": "auto" }] // match .gitattributes
2526
},
2627
},
2728
);

inputfiles/overridingTypes.jsonc

+36-5
Original file line numberDiff line numberDiff line change
@@ -259,7 +259,18 @@
259259
"properties": {
260260
"property": {
261261
"body": {
262-
"overrideType": "ReadableStream<Uint8Array>"
262+
"overrideType": "ReadableStream<Uint8Array<ArrayBuffer>>"
263+
}
264+
}
265+
},
266+
"methods": {
267+
"method": {
268+
"bytes": {
269+
"signature": {
270+
"0": {
271+
"overrideType": "Promise<Uint8Array<ArrayBuffer>>"
272+
}
273+
}
263274
}
264275
}
265276
}
@@ -2713,10 +2724,17 @@
27132724
"Blob": {
27142725
"methods": {
27152726
"method": {
2727+
"bytes": {
2728+
"signature": {
2729+
"0": {
2730+
"overrideType": "Promise<Uint8Array<ArrayBuffer>>"
2731+
}
2732+
}
2733+
},
27162734
"stream": {
27172735
"signature": {
27182736
"0": {
2719-
"overrideType": "ReadableStream<Uint8Array>"
2737+
"overrideType": "ReadableStream<Uint8Array<ArrayBuffer>>"
27202738
}
27212739
}
27222740
}
@@ -3173,7 +3191,7 @@
31733191
"readable": {
31743192
"name": "readable",
31753193
"readonly": true,
3176-
"overrideType": "ReadableStream<Uint8Array>"
3194+
"overrideType": "ReadableStream<Uint8Array<ArrayBuffer>>"
31773195
},
31783196
"writable": {
31793197
"name": "writable",
@@ -3189,7 +3207,7 @@
31893207
"readable": {
31903208
"name": "readable",
31913209
"readonly": true,
3192-
"overrideType": "ReadableStream<Uint8Array>"
3210+
"overrideType": "ReadableStream<Uint8Array<ArrayBuffer>>"
31933211
},
31943212
"writable": {
31953213
"name": "writable",
@@ -3215,13 +3233,26 @@
32153233
}
32163234
}
32173235
},
3236+
"TextEncoder": {
3237+
"methods": {
3238+
"method": {
3239+
"encode": {
3240+
"signature": {
3241+
"0": {
3242+
"overrideType": "Uint8Array<ArrayBuffer>"
3243+
}
3244+
}
3245+
}
3246+
}
3247+
}
3248+
},
32183249
"TextEncoderStream": {
32193250
"properties": {
32203251
"property": {
32213252
"readable": {
32223253
"name": "readable",
32233254
"readonly": true,
3224-
"overrideType": "ReadableStream<Uint8Array>"
3255+
"overrideType": "ReadableStream<Uint8Array<ArrayBuffer>>"
32253256
},
32263257
"writable": {
32273258
"name": "writable",
+90
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,90 @@
1+
{
2+
"mixins": {
3+
"mixin": {
4+
"Body": {
5+
"properties": {
6+
"property": {
7+
"body": {
8+
"overrideType": "ReadableStream<Uint8Array>"
9+
}
10+
}
11+
},
12+
"methods": {
13+
"method": {
14+
"bytes": {
15+
"signature": {
16+
"0": {
17+
"overrideType": "Promise<Uint8Array>"
18+
}
19+
}
20+
}
21+
}
22+
}
23+
}
24+
}
25+
},
26+
"interfaces": {
27+
"interface": {
28+
"Blob": {
29+
"methods": {
30+
"method": {
31+
"bytes": {
32+
"signature": {
33+
"0": {
34+
"overrideType": "Promise<Uint8Array>"
35+
}
36+
}
37+
},
38+
"stream": {
39+
"signature": {
40+
"0": {
41+
"overrideType": "ReadableStream<Uint8Array>"
42+
}
43+
}
44+
}
45+
}
46+
}
47+
},
48+
"CompressionStream": {
49+
"properties": {
50+
"property": {
51+
"readable": {
52+
"overrideType": "ReadableStream<Uint8Array>"
53+
}
54+
}
55+
}
56+
},
57+
"DecompressionStream": {
58+
"properties": {
59+
"property": {
60+
"readable": {
61+
"overrideType": "ReadableStream<Uint8Array>"
62+
}
63+
}
64+
}
65+
},
66+
"TextEncoder": {
67+
"methods": {
68+
"method": {
69+
"encode": {
70+
"signature": {
71+
"0": {
72+
"overrideType": "Uint8Array"
73+
}
74+
}
75+
}
76+
}
77+
}
78+
},
79+
"TextEncoderStream": {
80+
"properties": {
81+
"property": {
82+
"readable": {
83+
"overrideType": "ReadableStream<Uint8Array>"
84+
}
85+
}
86+
}
87+
}
88+
}
89+
}
90+
}

src/build.ts

+43-12
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
import * as Browser from "./build/types.js";
22
import { promises as fs } from "fs";
3-
import { merge, resolveExposure, arrayToMap } from "./build/helpers.js";
3+
import { merge, resolveExposure, arrayToMap, clone } from "./build/helpers.js";
44
import { type CompilerBehavior, emitWebIdl } from "./build/emitter.js";
55
import { convert } from "./build/widlprocess.js";
66
import { getExposedTypes } from "./build/expose.js";
@@ -291,52 +291,83 @@ async function emitDom() {
291291

292292
const knownTypes = await readInputJSON("knownTypes.json");
293293

294-
const emitVariations = [
294+
interface Variation {
295+
outputFolder: URL;
296+
compilerBehavior: CompilerBehavior;
297+
overriddenItems?: Browser.WebIdl;
298+
}
299+
300+
const emitVariations: Variation[] = [
301+
// ts5.7 (and later)
302+
// - introduced generic typed arrays over `ArrayBufferLike`
295303
{
296-
outputFolder: new URL("./ts5.5/", outputFolder),
297-
compilerBehavior: {},
304+
outputFolder,
305+
compilerBehavior: {
306+
useIteratorObject: true,
307+
allowUnrelatedSetterType: true,
308+
},
298309
},
310+
// ts5.6
311+
// - introduced support for `IteratorObject`/Iterator helpers and unrelated setter types
299312
{
300-
outputFolder,
313+
outputFolder: new URL("./ts5.6/", outputFolder),
314+
overriddenItems: await readInputJSON("overridingTypes.ts5.6.jsonc"), // ts5.6 does not support generic typed arrays
301315
compilerBehavior: {
302316
useIteratorObject: true,
303317
allowUnrelatedSetterType: true,
304-
} as CompilerBehavior,
318+
},
319+
},
320+
// ts5.5 (and earlier)
321+
{
322+
outputFolder: new URL("./ts5.5/", outputFolder),
323+
overriddenItems: await readInputJSON("overridingTypes.ts5.6.jsonc"), // ts5.5 does not support generic typed arrays
324+
compilerBehavior: {}, // ts5.5 does not support `IteratorObject` or unrelated setter types
305325
},
306326
];
307327

308-
for (const { outputFolder, compilerBehavior } of emitVariations) {
328+
for (const {
329+
outputFolder,
330+
compilerBehavior,
331+
overriddenItems,
332+
} of emitVariations) {
309333
// Create output folder
310334
await fs.mkdir(outputFolder, {
311335
// Doesn't need to be recursive, but this helpfully ignores EEXIST
312336
recursive: true,
313337
});
314338

315-
emitFlavor(webidl, new Set(knownTypes.Window), {
339+
// apply changes specific to the variation
340+
let variationWebidl = webidl;
341+
if (overriddenItems) {
342+
variationWebidl = clone(webidl);
343+
variationWebidl = merge(variationWebidl, overriddenItems);
344+
}
345+
346+
emitFlavor(variationWebidl, new Set(knownTypes.Window), {
316347
name: "dom",
317348
global: ["Window"],
318349
outputFolder,
319350
compilerBehavior,
320351
});
321-
emitFlavor(webidl, new Set(knownTypes.Worker), {
352+
emitFlavor(variationWebidl, new Set(knownTypes.Worker), {
322353
name: "webworker",
323354
global: ["Worker", "DedicatedWorker", "SharedWorker", "ServiceWorker"],
324355
outputFolder,
325356
compilerBehavior,
326357
});
327-
emitFlavor(webidl, new Set(knownTypes.Worker), {
358+
emitFlavor(variationWebidl, new Set(knownTypes.Worker), {
328359
name: "sharedworker",
329360
global: ["SharedWorker", "Worker"],
330361
outputFolder,
331362
compilerBehavior,
332363
});
333-
emitFlavor(webidl, new Set(knownTypes.Worker), {
364+
emitFlavor(variationWebidl, new Set(knownTypes.Worker), {
334365
name: "serviceworker",
335366
global: ["ServiceWorker", "Worker"],
336367
outputFolder,
337368
compilerBehavior,
338369
});
339-
emitFlavor(webidl, new Set(knownTypes.Worklet), {
370+
emitFlavor(variationWebidl, new Set(knownTypes.Worklet), {
340371
name: "audioworklet",
341372
global: ["AudioWorklet", "Worklet"],
342373
outputFolder,

src/build/helpers.ts

+19
Original file line numberDiff line numberDiff line change
@@ -114,6 +114,25 @@ export function exposesTo(o: { exposed?: string }, target: string[]): boolean {
114114
return o.exposed.split(" ").some((e) => target.includes(e));
115115
}
116116

117+
export function clone<T>(obj: T): T {
118+
if (typeof obj !== "object" || !obj) {
119+
return obj;
120+
}
121+
if (Array.isArray(obj)) {
122+
return obj.map(clone) as any as T;
123+
}
124+
if (obj instanceof Map) {
125+
return new Map([...obj.entries()].map(clone)) as any as T;
126+
}
127+
const result = {} as T;
128+
for (const k in obj) {
129+
if (Object.getOwnPropertyDescriptor(obj, k)) {
130+
result[k] = clone(obj[k]);
131+
}
132+
}
133+
return result;
134+
}
135+
117136
export function merge<T>(target: T, src: T, shallow?: boolean): T {
118137
if (typeof target !== "object" || typeof src !== "object") {
119138
return src;

0 commit comments

Comments
 (0)