diff --git a/package-lock.json b/package-lock.json index 1c57c24b4..eea7908b9 100644 --- a/package-lock.json +++ b/package-lock.json @@ -17,10 +17,10 @@ "@types/webidl2": "^24.4.3", "@typescript-eslint/eslint-plugin": "^8", "@typescript-eslint/parser": "^8", - "@webref/css": "^6.12.7", - "@webref/elements": "^2.3.0", - "@webref/events": "^1.11.3", - "@webref/idl": "^3.46.1", + "@webref/css": "^6.23.6", + "@webref/elements": "^2.5.0", + "@webref/events": "^1.18.6", + "@webref/idl": "^3.66.0", "bcd-idl-mapper": "^3.0.0", "cpx2": "^8.0.0", "danger": "^13.0.4", @@ -35,7 +35,7 @@ "print-diff": "^2.0.0", "typescript": "^5.6.0-dev.20240806", "typescript-eslint": "^8", - "webidl2": "^24.4.1" + "webidl2": "^24.5.0" } }, "node_modules/@aashutoshrathi/word-wrap": { @@ -1023,9 +1023,9 @@ } }, "node_modules/@webref/css": { - "version": "6.23.5", - "resolved": "https://registry.npmjs.org/@webref/css/-/css-6.23.5.tgz", - "integrity": "sha512-nfuL3P7t97Z/XrtJHqe6PduVLDWeXK6t45UyTTcLDdVNEOHajgm7vi0yMQ2vbB+mOSzDqMiJU7Cf2C6kZoi66g==", + "version": "6.23.6", + "resolved": "https://registry.npmjs.org/@webref/css/-/css-6.23.6.tgz", + "integrity": "sha512-PdgFNBJxoYc5WTJ5yxzpoxU6drWdtiXheaYmDh1YNiQc6sFxTJbUy5bfjHxXxQ37hhsLfWxuD3DG9L4GpRahoA==", "dev": true, "license": "MIT", "peerDependencies": { @@ -1033,9 +1033,9 @@ } }, "node_modules/@webref/elements": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/@webref/elements/-/elements-2.4.0.tgz", - "integrity": "sha512-KRD9xK9Wx6N1L0cVf1KiScmoyR5OCrM/tSCgJKFi5WdBZQ+aaIjqtkhU+STO2O9k2X1YiSRMC/+P4gNM1n4v9w==", + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/@webref/elements/-/elements-2.5.0.tgz", + "integrity": "sha512-8sOq8RgoQukYeuKi/lf1ioSrD2dla+0fnEWIr6PGp1Dc6sUHTL0AOc2LqcmAmjuICgaShSk6u72y0Uu4B5bF6Q==", "dev": true, "license": "MIT" }, @@ -1047,13 +1047,13 @@ "license": "MIT" }, "node_modules/@webref/idl": { - "version": "3.65.5", - "resolved": "https://registry.npmjs.org/@webref/idl/-/idl-3.65.5.tgz", - "integrity": "sha512-BycEvc0joBZVMLt1i1NDKL3JhXzJFfrY3/HP/cE3r+zvDwi8Ss5BV5De/MnFVsYq7YJoxjg41Ls5MQ/mJJd/zQ==", + "version": "3.66.0", + "resolved": "https://registry.npmjs.org/@webref/idl/-/idl-3.66.0.tgz", + "integrity": "sha512-q9RKlhuG/ALrfnGVIcTDFuLwoQAiQdy2qxbYYG0d8E3AQd+7FulrEtjtZy241B2pASYxk4cD2qDOLk1LKWSzhA==", "dev": true, "license": "MIT", "peerDependencies": { - "webidl2": "^24.4.1" + "webidl2": "^24.5.0" } }, "node_modules/acorn": { @@ -3882,12 +3882,13 @@ "license": "BSD-2-Clause" }, "node_modules/webidl2": { - "version": "24.4.1", - "resolved": "https://registry.npmjs.org/webidl2/-/webidl2-24.4.1.tgz", - "integrity": "sha512-cPToqvZlxTAlaMucZyU28XtFLJz3XPdTdIWK/r3IaP1jfkjqne3OTniJS8DZqfzee1aBUQn80d6s2vYert50kg==", + "version": "24.5.0", + "resolved": "https://registry.npmjs.org/webidl2/-/webidl2-24.5.0.tgz", + "integrity": "sha512-fxOigKkIem1iAgQ9t4cFOP+kWEA8y6Be/uh50FpJh0FijoeeT/VMrOyJzNLUgjy0rGMEcHeReKDCqj0g9dIe9A==", "dev": true, + "license": "W3C", "engines": { - "node": ">= 14" + "node": ">= 18" } }, "node_modules/whatwg-url": { diff --git a/package.json b/package.json index 57b831ffc..e387283cc 100644 --- a/package.json +++ b/package.json @@ -46,10 +46,10 @@ "@types/webidl2": "^24.4.3", "@typescript-eslint/eslint-plugin": "^8", "@typescript-eslint/parser": "^8", - "@webref/css": "^6.12.7", - "@webref/elements": "^2.3.0", - "@webref/events": "^1.11.3", - "@webref/idl": "^3.46.1", + "@webref/css": "^6.23.6", + "@webref/elements": "^2.5.0", + "@webref/events": "^1.18.6", + "@webref/idl": "^3.66.0", "bcd-idl-mapper": "^3.0.0", "cpx2": "^8.0.0", "danger": "^13.0.4", @@ -64,7 +64,7 @@ "print-diff": "^2.0.0", "typescript": "^5.6.0-dev.20240806", "typescript-eslint": "^8", - "webidl2": "^24.4.1" + "webidl2": "^24.5.0" }, "overrides": { "typescript@*": "$typescript" diff --git a/src/build/bcd/mapper.ts b/src/build/bcd/mapper.ts index fd50b1041..8f674eb20 100644 --- a/src/build/bcd/mapper.ts +++ b/src/build/bcd/mapper.ts @@ -91,7 +91,8 @@ function mapInterfaceLike( ); if (i.iterator) { - const iteratorKey = i.iterator.async ? "@@asyncIterator" : "@@iterator"; + const iteratorKey = + i.iterator.kind === "async_iterable" ? "@@asyncIterator" : "@@iterator"; // BCD often doesn't have an @@iterator entry, but it does usually have an entry // for iterable methods such as values(). Use that as a fallback. // See also: https://github.com/mdn/browser-compat-data/issues/6367 diff --git a/src/build/emitter.ts b/src/build/emitter.ts index 14189ed17..cd9f2cffe 100644 --- a/src/build/emitter.ts +++ b/src/build/emitter.ts @@ -1082,7 +1082,7 @@ export function emitWebIdl( // Emit forEach for iterators function emitIteratorForEach(i: Browser.Interface) { - if (!i.iterator || i.iterator.async) { + if (!i.iterator || i.iterator.kind === "async_iterable") { return; } const subtype = i.iterator.type.map(convertDomTypeToTsType); @@ -1619,7 +1619,7 @@ export function emitWebIdl( function emitSelfIterator(i: Browser.Interface) { if (!compilerBehavior.useIteratorObject) return; - const async = i.iterator?.async; + const async = i.iterator?.kind === "async_iterable"; const name = getName(i); const iteratorBaseType = `${async ? "Async" : ""}IteratorObject`; const iteratorType = `${name}${async ? "Async" : ""}Iterator`; @@ -1644,7 +1644,7 @@ export function emitWebIdl( case "setlike": return; } - const async = i.iterator?.async; + const async = i.iterator?.kind === "async_iterable"; const iteratorType = async ? !compilerBehavior.useIteratorObject ? "AsyncIterableIterator" @@ -1659,7 +1659,10 @@ export function emitWebIdl( name: `[Symbol.${async ? "asyncIterator" : "iterator"}]`, type: stringifySingleOrTupleTypes(subtypes), }); - if (i.iterator?.kind === "iterable") { + if ( + i.iterator?.kind === "iterable" || + i.iterator?.kind === "async_iterable" + ) { if (subtypes.length === 2) { const [keyType, valueType] = subtypes; methods.push( @@ -1718,7 +1721,7 @@ export function emitWebIdl( } function getIteratorSubtypes() { - if (i.iterator && !i.iterator.async) { + if (i.iterator && i.iterator.kind !== "async_iterable") { if (i.iterator.type.length === 1) { return [convertDomTypeToTsType(i.iterator.type[0])]; } @@ -1848,7 +1851,7 @@ export function emitWebIdl( function emitAsyncIterator(i: Browser.Interface) { function getAsyncIteratorSubtypes() { - if (i.iterator && i.iterator.kind === "iterable" && i.iterator.async) { + if (i.iterator && i.iterator.kind === "async_iterable") { if (i.iterator.type.length === 1) { return [convertDomTypeToTsType(i.iterator.type[0])]; } diff --git a/src/build/types.d.ts b/src/build/types.d.ts index 53bdece01..a1d5badf4 100644 --- a/src/build/types.d.ts +++ b/src/build/types.d.ts @@ -204,9 +204,8 @@ export interface Interface { } export interface Iterator { - kind: "iterable" | "setlike" | "maplike"; + kind: "async_iterable" | "iterable" | "setlike" | "maplike"; readonly: boolean; - async: boolean; type: Typed[]; param?: Param[]; comments?: { diff --git a/src/build/widlprocess.ts b/src/build/widlprocess.ts index 65ade897a..94f228dfd 100644 --- a/src/build/widlprocess.ts +++ b/src/build/widlprocess.ts @@ -203,16 +203,26 @@ function convertInterfaceCommon( addComments(method[member.name], commentMap, i.name, member.name); } } else if ( + (member.type as string) === "async_iterable" || member.type === "iterable" || member.type === "maplike" || member.type === "setlike" ) { + // TODO(saschanaz): @types/webidl2 doesn't support async_iterable + const iterableLike = member as + | webidl2.IterableDeclarationMemberType + | webidl2.MaplikeDeclarationMemberType + | webidl2.SetlikeDeclarationMemberType; + // Compatibility between `async_iterable` and `async iterable` + const kind = + iterableLike.type === "iterable" && iterableLike.async + ? "async_iterable" + : iterableLike.type; result.iterator = { - kind: member.type, - readonly: member.readonly, - async: member.async, - param: member.arguments.map(convertArgument), - type: member.idlType.map(convertIdlType), + kind, + readonly: iterableLike.readonly, + param: iterableLike.arguments.map(convertArgument), + type: iterableLike.idlType.map(convertIdlType), }; } }