@@ -19,15 +19,17 @@ export function* generateElementEvents(
1919 getCtxVar : ( ) => string ,
2020 getPropsVar : ( ) => string ,
2121) : Generator < Code > {
22- const definitions : {
23- prop : CompilerDOM . DirectiveNode ;
24- source : string ;
25- offset : number | undefined ;
26- emitPrefix : string ;
22+ const definitions : Record < string , {
2723 propPrefix : string ;
24+ emitPrefix : string ;
2825 propName : string ;
2926 emitName : string ;
30- } [ ] = [ ] ;
27+ items : {
28+ prop : CompilerDOM . DirectiveNode ;
29+ source : string ;
30+ offset : number | undefined ;
31+ } [ ] ;
32+ } > = { } ;
3133
3234 for ( const prop of node . props ) {
3335 if (
@@ -56,55 +58,57 @@ export function* generateElementEvents(
5658 }
5759 const propName = camelize ( propPrefix + source ) ;
5860 const emitName = emitPrefix + source ;
61+ const key = propName + (
62+ prop . modifiers . length
63+ ? `.${ prop . modifiers . map ( modifier => modifier . content ) . join ( '.' ) } `
64+ : ''
65+ ) ;
5966
60- definitions . push ( {
61- prop,
62- source,
63- offset,
64- emitPrefix,
67+ definitions [ key ] ??= {
6568 propPrefix,
69+ emitPrefix,
6670 propName,
6771 emitName,
72+ items : [ ] ,
73+ } ;
74+ definitions [ key ] . items . push ( {
75+ prop,
76+ source,
77+ offset,
6878 } ) ;
6979 }
7080 }
7181
72- if ( ! definitions . length ) {
82+ if ( ! Object . keys ( definitions ) . length ) {
7383 return ;
7484 }
7585
7686 const emitsVar = ctx . getInternalVariable ( ) ;
7787 yield `let ${ emitsVar } !: ${ names . ResolveEmits } <typeof ${ componentOriginalVar } , typeof ${ getCtxVar ( ) } .emit>${ endOfLine } ` ;
7888
79- yield `const ${ ctx . getInternalVariable ( ) } : ` ;
80- for ( let i = 0 ; i < definitions . length ; i ++ ) {
81- const { propName, emitName } = definitions [ i ] ! ;
82- if ( i > 0 ) {
83- yield ` & ` ;
84- }
85- yield `${ names . NormalizeComponentEvent } <typeof ${ getPropsVar ( ) } , typeof ${ emitsVar } , '${ propName } ', '${ emitName } ', '${
89+ for ( const { propPrefix, emitPrefix, propName, emitName, items } of Object . values ( definitions ) ) {
90+ yield `const ${ ctx . getInternalVariable ( ) } : ${ names . ResolveEvent } <typeof ${ getPropsVar ( ) } , typeof ${ emitsVar } , '${ propName } ', '${ emitName } ', '${
8691 camelize ( emitName )
87- } '>`;
88- }
89- yield ` = { ${ newLine } ` ;
90- for ( const { prop , source , offset , emitPrefix , propPrefix , propName } of definitions ) {
91- if ( prop . name === 'on' ) {
92- yield `...{ ` ;
93- yield * generateEventArg ( options , source , offset ! , emitPrefix . slice ( 0 , - 1 ) , codeFeatures . navigation ) ;
94- yield `: {} as any } as typeof ${ emitsVar } , ${ newLine } ` ;
95- }
96- if ( prop . name === 'on' ) {
97- yield * generateEventArg ( options , source , offset ! , propPrefix . slice ( 0 , - 1 ) ) ;
98- yield `: ` ;
99- yield * generateEventExpression ( options , ctx , prop ) ;
100- }
101- else {
102- yield `' ${ propName } ': ` ;
103- yield * generateModelEventExpression ( options , ctx , prop ) ;
92+ } '> = { ${ newLine } `;
93+ for ( const { prop , source , offset } of items ) {
94+ if ( prop . name === 'on' ) {
95+ yield `/** @type {typeof ${ emitsVar } .` ;
96+ yield * generateEventArg ( options , source , offset ! , emitPrefix . slice ( 0 , - 1 ) , codeFeatures . navigation ) ;
97+ yield `} */ ${ newLine } ` ;
98+ }
99+ if ( prop . name === 'on' ) {
100+ yield * generateEventArg ( options , source , offset ! , propPrefix . slice ( 0 , - 1 ) ) ;
101+ yield `: ` ;
102+ yield * generateEventExpression ( options , ctx , prop ) ;
103+ }
104+ else {
105+ yield `' ${ propName } ': ` ;
106+ yield * generateModelEventExpression ( options , ctx , prop ) ;
107+ }
108+ yield `, ${ newLine } ` ;
104109 }
105- yield `, ${ newLine } ` ;
110+ yield `} ${ endOfLine } ` ;
106111 }
107- yield `}${ endOfLine } ` ;
108112}
109113
110114export function * generateEventArg (
0 commit comments