diff --git a/inputfiles/addedTypes.jsonc b/inputfiles/addedTypes.jsonc index 9260d0783..bfa25c385 100644 --- a/inputfiles/addedTypes.jsonc +++ b/inputfiles/addedTypes.jsonc @@ -511,24 +511,6 @@ "name": "EventListenerOrEventListenerObject", "overrideType": "EventListener | EventListenerObject" }, - { - "name": "OptionalPrefixToken", - "typeParameters": [ - { - "name": "T extends string" - } - ], - "overrideType": "`${T} ` | \"\"" - }, - { - "name": "OptionalPostfixToken", - "typeParameters": [ - { - "name": "T extends string" - } - ], - "overrideType": "` ${T}` | \"\"" - }, { "name": "AutoFillSection", // Note: this will also eagerly match any invalid string diff --git a/inputfiles/patches/html-autocomplete.kdl b/inputfiles/patches/html-autocomplete.kdl index a73f49aac..986541bcb 100644 --- a/inputfiles/patches/html-autocomplete.kdl +++ b/inputfiles/patches/html-autocomplete.kdl @@ -72,3 +72,11 @@ enum AutoFillContactField { enum AutoFillCredentialField { webauthn } + +typedef OptionalPrefixToken overrideType=#"`${T} ` | """# { + typeParameters T extends=string +} + +typedef OptionalPostfixToken overrideType=#"` ${T}` | """# { + typeParameters T extends=string +} diff --git a/src/build/patches.ts b/src/build/patches.ts index f2484e436..ec9fa5954 100644 --- a/src/build/patches.ts +++ b/src/build/patches.ts @@ -104,6 +104,7 @@ function handleTypeParameters(value: Value | Node) { { name: string(node.values[0]), ...optionalMember("default", "string", node.properties?.default), + ...optionalMember("extends", "string", node.properties?.extends), }, ], }; @@ -448,7 +449,23 @@ function handleMember(c: Node): DeepPartial { * @param node The typedef node to handle. */ function handleTypedef(node: Node): DeepPartial { - const typeNodes = node.children.filter((c) => c.name === "type"); + const typeNodes: Node[] = []; + let typeParameters = {}; + for (const child of node.children) { + switch (child.name) { + case "type": + typeNodes.push(child); + break; + case "typeParameters": { + typeParameters = handleTypeParameters(child); + break; + } + default: + throw new Error( + `Unexpected child "${child.name}" in typedef "${node.values[0]}"`, + ); + } + } return { name: string(node.values[0]), ...handleTyped(typeNodes), @@ -458,6 +475,7 @@ function handleTypedef(node: Node): DeepPartial { node.properties?.legacyNamespace, ), ...optionalMember("overrideType", "string", node.properties?.overrideType), + ...typeParameters, }; }