@@ -81,8 +81,8 @@ function handleTypeParameters(value: Value | Node) {
8181 } ;
8282}
8383
84- function undefinedIfEmpty ( object : object , output : object ) {
85- return Object . entries ( object ) . length ? output : undefined ;
84+ function optionalNestedMember < T > ( prop : string , object : object , output : T ) {
85+ return Object . entries ( object ) . length ? { [ prop ] : output } : { } ;
8686}
8787
8888/**
@@ -119,10 +119,12 @@ function convertKDLNodes(nodes: Node[]): DeepPartial<WebIdl> {
119119 }
120120
121121 return {
122- enums : undefinedIfEmpty ( enums , { enum : enums } ) ,
123- mixins : undefinedIfEmpty ( mixin , { mixin } ) ,
124- interfaces : undefinedIfEmpty ( interfaces , { interface : interfaces } ) ,
125- dictionaries : undefinedIfEmpty ( dictionary , { dictionary } ) ,
122+ ...optionalNestedMember ( "enums" , enums , { enum : enums } ) ,
123+ ...optionalNestedMember ( "mixins" , mixin , { mixin } ) ,
124+ ...optionalNestedMember ( "interfaces" , interfaces , {
125+ interface : interfaces ,
126+ } ) ,
127+ ...optionalNestedMember ( "dictionaries" , dictionary , { dictionary } ) ,
126128 } ;
127129}
128130
@@ -202,7 +204,7 @@ function handleMixinAndInterfaces(
202204 } ;
203205 return {
204206 name,
205- events : { event } ,
207+ ... optionalNestedMember ( " events" , event , { event } ) ,
206208 properties : { property } ,
207209 methods : { method } ,
208210 ...optionalMember ( "extends" , "string" , node . properties ?. extends ) ,
@@ -256,7 +258,7 @@ function handleProperty(child: Node): Partial<Property> {
256258 ? handleTyped ( typeNode )
257259 : optionalMember ( "type" , "string" , child . properties ?. type ) ) ,
258260 ...optionalMember ( "readonly" , "boolean" , child . properties ?. readonly ) ,
259- ...optionalMember ( "deprecated" , "boolean " , child . properties ?. deprecated ) ,
261+ ...optionalMember ( "deprecated" , "string " , child . properties ?. deprecated ) ,
260262 } ;
261263}
262264
@@ -379,7 +381,7 @@ function handleMember(c: Node): Partial<Member> {
379381 name,
380382 ...optionalMember ( "type" , "string" , c . properties ?. type ) ,
381383 ...optionalMember ( "required" , "boolean" , c . properties ?. required ) ,
382- ...optionalMember ( "deprecated" , "boolean " , c . properties ?. deprecated ) ,
384+ ...optionalMember ( "deprecated" , "string " , c . properties ?. deprecated ) ,
383385 ...optionalMember ( "overrideType" , "string" , c . properties ?. overrideType ) ,
384386 } ;
385387}
@@ -411,16 +413,18 @@ async function readPatchDocument(fileUrl: URL): Promise<Document> {
411413 */
412414function convertForRemovals ( obj : unknown ) : unknown {
413415 if ( Array . isArray ( obj ) ) {
414- const result = obj . map ( convertForRemovals ) . filter ( ( v ) => v !== undefined ) ;
415- return result . length === 0 ? null : result ;
416+ return obj . map ( convertForRemovals ) . filter ( ( v ) => v !== undefined ) ;
416417 }
417418 if ( obj && typeof obj === "object" ) {
418419 const newObj : Record < string , unknown > = { } ;
419420 for ( const [ key , value ] of Object . entries ( obj ) ) {
420421 if ( key !== "name" ) {
421422 const cleaned = convertForRemovals ( value ) ;
422- if ( cleaned !== undefined ) {
423+ // (intentionally covers null too)
424+ if ( typeof cleaned === "object" ) {
423425 newObj [ key ] = cleaned ;
426+ } else if ( cleaned !== undefined ) {
427+ newObj [ key ] = null ;
424428 }
425429 }
426430 }
0 commit comments