@@ -232,6 +232,7 @@ interface SnippetHandler {
232
232
key : ( node : Expression ) => string | null
233
233
prepare : ( node : Expression , id : number ) => string
234
234
parse : ( code : string , id : number ) => string | undefined
235
+ standalone : boolean
235
236
}
236
237
237
238
const defaultSnippetHandler : SnippetHandler = {
@@ -247,6 +248,7 @@ const defaultSnippetHandler: SnippetHandler = {
247
248
248
249
return res
249
250
} ,
251
+ standalone : false ,
250
252
}
251
253
252
254
const vSlotSnippetHandler : SnippetHandler = {
@@ -266,6 +268,7 @@ const vSlotSnippetHandler: SnippetHandler = {
266
268
}
267
269
return res . trim ( )
268
270
} ,
271
+ standalone : true ,
269
272
}
270
273
271
274
const snippetHandlers = [ vSlotSnippetHandler , defaultSnippetHandler ]
@@ -298,41 +301,55 @@ async function transformJsSnippets(expressions: Expression[], transform: (code:
298
301
}
299
302
300
303
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 ]
304
304
305
+ const orders = Array . from ( transformMap . values ( ) )
306
+ const batch = orders . filter ( ( { handler } ) => ! handler . standalone )
307
+ const standalone = orders . filter ( ( { handler } ) => handler . standalone )
308
+
309
+ try {
305
310
// transform all snippets in a single file
306
311
const batchInputSplitter = `\nsplitter(${ Math . random ( ) } );\n`
307
312
const batchInput = batch
308
313
. map ( ( { nodes, handler } ) => handler . prepare ( nodes [ 0 ] , id ) )
309
314
. join ( batchInputSplitter )
310
315
311
- try {
312
- const batchOutput = await transform ( batchInput )
313
- const lines = batchOutput . split ( batchInputSplitter ) . map ( l => l . trim ( ) ) . filter ( l => ! ! l )
316
+ const batchOutput = await transform ( batchInput )
317
+ const lines = batchOutput . split ( batchInputSplitter ) . map ( l => l . trim ( ) ) . filter ( l => ! ! l )
314
318
315
- if ( lines . length !== batch . length ) {
316
- throw new Error ( '[vue-sfc-transform] Syntax Error' )
317
- }
319
+ if ( lines . length !== batch . length ) {
320
+ throw new Error ( '[vue-sfc-transform] Syntax Error' )
321
+ }
318
322
319
- for ( let i = 0 ; i < batch . length ; i ++ ) {
320
- const line = lines [ i ] !
321
- const { id, handler, nodes } = batch [ i ] !
323
+ for ( let i = 0 ; i < batch . length ; i ++ ) {
324
+ const line = lines [ i ] !
325
+ const { id, handler, nodes } = batch [ i ] !
322
326
323
- const res = handler . parse ( line , id )
324
- if ( ! res ) {
325
- continue
326
- }
327
+ const res = handler . parse ( line , id )
328
+ if ( ! res ) {
329
+ continue
330
+ }
327
331
328
- for ( const node of nodes ) {
329
- resultMap . set ( node , res )
330
- }
332
+ for ( const node of nodes ) {
333
+ resultMap . set ( node , res )
331
334
}
332
335
}
333
- catch ( error ) {
334
- throw new Error ( '[vue-sfc-transform] Error parsing TypeScript expression in template' , { cause : error } )
335
- }
336
+
337
+ // transform standalone snippets
338
+ await Promise . all ( standalone . map ( async ( { id, handler, nodes } ) => {
339
+ const line = await transform ( handler . prepare ( nodes [ 0 ] , id ) )
340
+
341
+ const res = handler . parse ( line . trim ( ) , id )
342
+ if ( ! res ) {
343
+ return
344
+ }
345
+
346
+ for ( const node of nodes ) {
347
+ resultMap . set ( node , res )
348
+ }
349
+ } ) )
350
+ }
351
+ catch ( error ) {
352
+ throw new Error ( '[vue-sfc-transform] Error parsing TypeScript expression in template' , { cause : error } )
336
353
}
337
354
338
355
return resultMap
0 commit comments