<?js
var events = obj;
for (let event in events){
  // will use the event type from src if exists and will not explode its members
  // will specify the type in the CustomEvent type params
  const detailTypeWithTypeParamsDeclaration = events[event]['evnDetailTypeParamsDeclaration'];
  const detailTypeNameWithTypeParams = events[event]['evnDetailNameTypeParams'];
  let eventInterfaceName = event;
  if (detailTypeNameWithTypeParams) {
    // if we have generics use that in the interface name
    if (detailTypeNameWithTypeParams.indexOf('<') > -1 && detailTypeNameWithTypeParams.indexOf('>') > 1){
      eventInterfaceName = `${event}${detailTypeWithTypeParamsDeclaration}`;
    }?>
  interface <?js= eventInterfaceName ?> extends CustomEvent<<?js= detailTypeNameWithTypeParams?> & {
  <?js
  if (events[event]['cancelable']){?>
    accept: (param: Promise<void>) => void;
  <?js
  }?>
  }>{}
  <?js
  }
  else { // event detail was specified as a type literal?>
  interface <?js= eventInterfaceName ?> extends CustomEvent<{
  <?js
  if (events[event]['detail']) {
    const details = events[event]['detail'];
    for (let detail in details) {?>
    <?js= detail ?>: <?js= details[detail]['reftype'] || details[detail]['type'] ?>;
    <?js
    }
  }?>
    }>{}
  <?js
  }
}?>
