@@ -268,61 +268,72 @@ const vSlotSnippetHandler: SnippetHandler = {
268268 } ,
269269}
270270
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+ }
282280
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 } > ( )
287283
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
291294 }
295+
296+ transformMap . set ( res . key , { id, nodes : [ expression ] , handler : res . handler } )
297+ id += 1
292298 }
293299
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 ]
295304
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 )
301310
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 )
305314
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+ }
309318
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 ] !
314322
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+ }
319327
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 } )
321335 }
322-
323- return resultMap
324- }
325- catch ( error ) {
326- throw new Error ( '[vue-sfc-transform] Error parsing TypeScript expression in template' , { cause : error } )
327336 }
337+
338+ return resultMap
328339}
0 commit comments