@@ -24,11 +24,31 @@ export type CodegenOptions = Omit<BaseCodegenOptions, 'optimizeImports'>
24
24
export class CodegenContext {
25
25
options : Required < CodegenOptions >
26
26
27
- helpers : Set < string > = new Set < string > ( [ ] )
27
+ bindingNames : Set < string > = new Set < string > ( )
28
28
29
- helper = ( name : CoreHelper | VaporHelper ) => {
30
- this . helpers . add ( name )
31
- return `_${ name } `
29
+ helpers : Map < string , string > = new Map ( )
30
+
31
+ helper = ( name : CoreHelper | VaporHelper ) : string => {
32
+ if ( this . helpers . has ( name ) ) {
33
+ return this . helpers . get ( name ) !
34
+ }
35
+
36
+ const base = `_${ name } `
37
+ if ( this . bindingNames . size === 0 ) {
38
+ this . helpers . set ( name , base )
39
+ return base
40
+ }
41
+
42
+ // check whether an alias is already used bindings
43
+ let alias = base
44
+ let i = 0
45
+ while ( this . bindingNames . has ( alias ) ) {
46
+ i ++
47
+ alias = `${ base } ${ i } `
48
+ }
49
+
50
+ this . helpers . set ( name , alias )
51
+ return alias
32
52
}
33
53
34
54
delegates : Set < string > = new Set < string > ( )
@@ -90,6 +110,11 @@ export class CodegenContext {
90
110
}
91
111
this . options = extend ( defaultOptions , options )
92
112
this . block = ir . block
113
+ this . bindingNames = new Set < string > (
114
+ this . options . bindingMetadata
115
+ ? Object . keys ( this . options . bindingMetadata )
116
+ : [ ] ,
117
+ )
93
118
}
94
119
}
95
120
@@ -105,7 +130,6 @@ export function generate(
105
130
) : VaporCodegenResult {
106
131
const [ frag , push ] = buildCodeFragment ( )
107
132
const context = new CodegenContext ( ir , options )
108
- const { helpers } = context
109
133
const { inline, bindingMetadata } = options
110
134
const functionName = 'render'
111
135
@@ -156,7 +180,7 @@ export function generate(
156
180
ast : ir ,
157
181
preamble,
158
182
map : map && map . toJSON ( ) ,
159
- helpers,
183
+ helpers : new Set < string > ( Array . from ( context . helpers . keys ( ) ) ) ,
160
184
}
161
185
}
162
186
@@ -169,11 +193,11 @@ function genDelegates({ delegates, helper }: CodegenContext) {
169
193
: ''
170
194
}
171
195
172
- function genHelperImports ( { helpers, helper , options } : CodegenContext ) {
196
+ function genHelperImports ( { helpers, options } : CodegenContext ) {
173
197
let imports = ''
174
198
if ( helpers . size ) {
175
- imports += `import { ${ [ ... helpers ]
176
- . map ( h => `${ h } as _ ${ h } ` )
199
+ imports += `import { ${ Array . from ( helpers )
200
+ . map ( ( [ h , alias ] ) => `${ h } as ${ alias } ` )
177
201
. join ( ', ' ) } } from '${ options . runtimeModuleName } ';\n`
178
202
}
179
203
return imports
0 commit comments