@@ -268,61 +268,72 @@ const vSlotSnippetHandler: SnippetHandler = {
268
268
} ,
269
269
}
270
270
271
- async function transformJsSnippets ( codes : Expression [ ] , transform : ( code : string ) => Promise < string > ) : Promise < WeakMap < Expression , string > > {
272
- const keyMap = new WeakMap < Expression , string > ( )
273
- const transformMap = new Map < string , { id : number , node : Expression , handler : SnippetHandler } > ( )
274
- const snippetHandlers = [ vSlotSnippetHandler , defaultSnippetHandler ]
275
- let id = 0
276
- for ( const code of codes ) {
277
- for ( const handler of snippetHandlers ) {
278
- const key = handler . key ( code )
279
- if ( ! key ) {
280
- continue
281
- }
271
+ const snippetHandlers = [ vSlotSnippetHandler , defaultSnippetHandler ]
272
+ function getKey ( expression : Expression ) {
273
+ for ( const handler of snippetHandlers ) {
274
+ const key = handler . key ( expression )
275
+ if ( key ) {
276
+ return { key, handler }
277
+ }
278
+ }
279
+ }
282
280
283
- keyMap . set ( code , key )
284
- if ( transformMap . has ( key ) ) {
285
- break
286
- }
281
+ async function transformJsSnippets ( expressions : Expression [ ] , transform : ( code : string ) => Promise < string > ) : Promise < WeakMap < Expression , string > > {
282
+ const transformMap = new Map < string , { id : number , nodes : [ Expression , ...Expression [ ] ] , handler : SnippetHandler } > ( )
287
283
288
- transformMap . set ( key , { id, node : code , handler } )
289
- id += 1
290
- break
284
+ let id = 0
285
+ for ( const expression of expressions ) {
286
+ const res = getKey ( expression )
287
+ if ( ! res ) {
288
+ continue
289
+ }
290
+ if ( transformMap . has ( res . key ) ) {
291
+ const item = transformMap . get ( res . key ) !
292
+ item . nodes . push ( expression )
293
+ continue
291
294
}
295
+
296
+ transformMap . set ( res . key , { id, nodes : [ expression ] , handler : res . handler } )
297
+ id += 1
292
298
}
293
299
294
- const batchOrder = Array . from ( transformMap . entries ( ) )
300
+ const resultMap = new Map < Expression , string > ( )
301
+ for ( const item of transformMap . values ( ) ) {
302
+ // TODO: reenable batch processing after fixing issue with esbuild renaming variables
303
+ const batch = [ item ]
295
304
296
- // transform all snippets in a single file
297
- const batchInputSplitter = `\nsplitter(${ Math . random ( ) } );\n`
298
- const batchInput = batchOrder
299
- . map ( ( [ _ , { node , handler } ] ) => handler . prepare ( node , id ) )
300
- . join ( batchInputSplitter )
305
+ // transform all snippets in a single file
306
+ const batchInputSplitter = `\nsplitter(${ Math . random ( ) } );\n`
307
+ const batchInput = batch
308
+ . map ( ( { nodes , handler } ) => handler . prepare ( nodes [ 0 ] , id ) )
309
+ . join ( batchInputSplitter )
301
310
302
- try {
303
- const batchOutput = await transform ( batchInput )
304
- const lines = batchOutput . split ( batchInputSplitter ) . map ( l => l . trim ( ) ) . filter ( l => ! ! l )
311
+ try {
312
+ const batchOutput = await transform ( batchInput )
313
+ const lines = batchOutput . split ( batchInputSplitter ) . map ( l => l . trim ( ) ) . filter ( l => ! ! l )
305
314
306
- if ( lines . length !== batchOrder . length ) {
307
- throw new Error ( '[vue-sfc-transform] Syntax Error' )
308
- }
315
+ if ( lines . length !== batch . length ) {
316
+ throw new Error ( '[vue-sfc-transform] Syntax Error' )
317
+ }
309
318
310
- const resultMap = new Map < Expression , string > ( )
311
- for ( let i = 0 ; i < batchOrder . length ; i ++ ) {
312
- const line = lines [ i ] !
313
- const [ _ , { id, handler, node } ] = batchOrder [ i ] !
319
+ for ( let i = 0 ; i < batch . length ; i ++ ) {
320
+ const line = lines [ i ] !
321
+ const { id, handler, nodes } = batch [ i ] !
314
322
315
- const res = handler . parse ( line , id )
316
- if ( ! res ) {
317
- continue
318
- }
323
+ const res = handler . parse ( line , id )
324
+ if ( ! res ) {
325
+ continue
326
+ }
319
327
320
- resultMap . set ( node , res )
328
+ for ( const node of nodes ) {
329
+ resultMap . set ( node , res )
330
+ }
331
+ }
332
+ }
333
+ catch ( error ) {
334
+ throw new Error ( '[vue-sfc-transform] Error parsing TypeScript expression in template' , { cause : error } )
321
335
}
322
-
323
- return resultMap
324
- }
325
- catch ( error ) {
326
- throw new Error ( '[vue-sfc-transform] Error parsing TypeScript expression in template' , { cause : error } )
327
336
}
337
+
338
+ return resultMap
328
339
}
0 commit comments