diff --git a/src/build.ts b/src/build.ts index 166971680..40a8304f0 100644 --- a/src/build.ts +++ b/src/build.ts @@ -252,6 +252,7 @@ async function emitDom() { allowUnrelatedSetterType: true, useGenericTypedArrays: true, includeIterable: true, + treatAsyncSequence: true, }, }, // ts5.7 (and later) @@ -262,6 +263,7 @@ async function emitDom() { useIteratorObject: true, allowUnrelatedSetterType: true, useGenericTypedArrays: true, + treatAsyncSequence: true, }, }, // ts5.6 diff --git a/src/build/emitter.ts b/src/build/emitter.ts index 3b2dd2191..bf89d42da 100644 --- a/src/build/emitter.ts +++ b/src/build/emitter.ts @@ -132,6 +132,8 @@ export interface CompilerBehavior { allowUnrelatedSetterType?: boolean; useGenericTypedArrays?: boolean; includeIterable?: boolean; + /** If true, treat async_sequence as AsyncIterable, otherwise as any (legacy < TS 4.4 emit). */ + treatAsyncSequence?: boolean; } export function emitWebIdl( @@ -405,6 +407,17 @@ export function emitWebIdl( forReturn: boolean, ): string { function convertBaseType() { + // Support async_sequence (see https://github.com/whatwg/streams/pull/1372) + if (obj.type === "async_sequence") { + // AsyncIterable requires separate asynciterable.d.ts until TS 6.0. + // To make it correct, we need to defer any functions using async_sequence to the asynciterable variant. + // For now, skip generation and warn. + console.warn( + "Skipping generation for a function or property with async_sequence type: " + + JSON.stringify(obj), + ); + return "never"; // Use 'never' to signal omission in type generation + } if (obj.type === "sequence" && !forReturn && iterator !== "") { return "Iterable"; } @@ -442,6 +455,9 @@ export function emitWebIdl( } const type = convertBaseType(); + if (type === "any") { + return type; + } let subtypeString = arrayify(obj.subtype) .map((t) => convertDomTypeToTsTypeBase(t, forReturn)) .join(", ");