@@ -42,7 +42,11 @@ export async function transformMain(
42
42
const hasScoped = descriptor . styles . some ( ( s ) => s . scoped )
43
43
44
44
// script
45
- const { code : scriptCode , map } = await genScriptCode ( descriptor , options )
45
+ const { code : scriptCode , map } = await genScriptCode (
46
+ descriptor ,
47
+ options ,
48
+ pluginContext
49
+ )
46
50
47
51
// template
48
52
// Check if we can use compile template as inlined render function
@@ -57,7 +61,7 @@ export async function transformMain(
57
61
let templateCode = ''
58
62
let templateMap
59
63
if ( hasTemplateImport ) {
60
- ; ( { code : templateCode , map : templateMap } = genTemplateCode (
64
+ ; ( { code : templateCode , map : templateMap } = await genTemplateCode (
61
65
descriptor ,
62
66
options ,
63
67
pluginContext
@@ -71,10 +75,10 @@ export async function transformMain(
71
75
: ''
72
76
73
77
// styles
74
- const stylesCode = genStyleCode ( descriptor )
78
+ const stylesCode = await genStyleCode ( descriptor , pluginContext )
75
79
76
80
// custom blocks
77
- const customBlocksCode = genCustomBlockCode ( descriptor )
81
+ const customBlocksCode = await genCustomBlockCode ( descriptor , pluginContext )
78
82
79
83
const output : string [ ] = [
80
84
scriptCode ,
@@ -148,7 +152,7 @@ export async function transformMain(
148
152
}
149
153
}
150
154
151
- function genTemplateCode (
155
+ async function genTemplateCode (
152
156
descriptor : SFCDescriptor ,
153
157
options : ResolvedOptions ,
154
158
pluginContext : PluginContext
@@ -167,7 +171,7 @@ function genTemplateCode(
167
171
)
168
172
} else {
169
173
if ( template . src ) {
170
- linkSrcToDescriptor ( template . src , descriptor )
174
+ await linkSrcToDescriptor ( template . src , descriptor , pluginContext )
171
175
}
172
176
const src = template . src || descriptor . filename
173
177
const srcQuery = template . src ? `&src` : ``
@@ -184,7 +188,8 @@ function genTemplateCode(
184
188
185
189
async function genScriptCode (
186
190
descriptor : SFCDescriptor ,
187
- options : ResolvedOptions
191
+ options : ResolvedOptions ,
192
+ pluginContext : PluginContext
188
193
) : Promise < {
189
194
code : string
190
195
map : RawSourceMap
@@ -213,7 +218,7 @@ async function genScriptCode(
213
218
}
214
219
} else {
215
220
if ( script . src ) {
216
- linkSrcToDescriptor ( script . src , descriptor )
221
+ await linkSrcToDescriptor ( script . src , descriptor , pluginContext )
217
222
}
218
223
const src = script . src || descriptor . filename
219
224
const langFallback = ( script . src && path . extname ( src ) . slice ( 1 ) ) || 'js'
@@ -231,13 +236,17 @@ async function genScriptCode(
231
236
}
232
237
}
233
238
234
- function genStyleCode ( descriptor : SFCDescriptor ) {
239
+ async function genStyleCode (
240
+ descriptor : SFCDescriptor ,
241
+ pluginContext : PluginContext
242
+ ) {
235
243
let stylesCode = ``
236
244
let hasCSSModules = false
237
245
if ( descriptor . styles . length ) {
238
- descriptor . styles . forEach ( ( style , i ) => {
246
+ for ( let i = 0 ; i < descriptor . styles . length ; i ++ ) {
247
+ const style = descriptor . styles [ i ]
239
248
if ( style . src ) {
240
- linkSrcToDescriptor ( style . src , descriptor )
249
+ await linkSrcToDescriptor ( style . src , descriptor , pluginContext )
241
250
}
242
251
const src = style . src || descriptor . filename
243
252
// do not include module in default query, since we use it to indicate
@@ -256,16 +265,20 @@ function genStyleCode(descriptor: SFCDescriptor) {
256
265
stylesCode += `\nimport ${ JSON . stringify ( styleRequest ) } `
257
266
}
258
267
// TODO SSR critical CSS collection
259
- } )
268
+ }
260
269
}
261
270
return stylesCode
262
271
}
263
272
264
- function genCustomBlockCode ( descriptor : SFCDescriptor ) {
273
+ async function genCustomBlockCode (
274
+ descriptor : SFCDescriptor ,
275
+ pluginContext : PluginContext
276
+ ) {
265
277
let code = ''
266
- descriptor . customBlocks . forEach ( ( block , index ) => {
278
+ for ( let index = 0 ; index < descriptor . customBlocks . length ; index ++ ) {
279
+ const block = descriptor . customBlocks [ index ]
267
280
if ( block . src ) {
268
- linkSrcToDescriptor ( block . src , descriptor )
281
+ await linkSrcToDescriptor ( block . src , descriptor , pluginContext )
269
282
}
270
283
const src = block . src || descriptor . filename
271
284
const attrsQuery = attrsToQuery ( block . attrs , block . type )
@@ -274,7 +287,7 @@ function genCustomBlockCode(descriptor: SFCDescriptor) {
274
287
const request = JSON . stringify ( src + query )
275
288
code += `import block${ index } from ${ request } \n`
276
289
code += `if (typeof block${ index } === 'function') block${ index } (_sfc_main)\n`
277
- } )
290
+ }
278
291
return code
279
292
}
280
293
@@ -298,11 +311,13 @@ function genCSSModulesCode(
298
311
* with its owner SFC descriptor so that we can get the information about
299
312
* the owner SFC when compiling that file in the transform phase.
300
313
*/
301
- function linkSrcToDescriptor ( src : string , descriptor : SFCDescriptor ) {
302
- const srcFile = path . posix . resolve (
303
- path . posix . dirname ( descriptor . filename ) ,
304
- src
305
- )
314
+ async function linkSrcToDescriptor (
315
+ src : string ,
316
+ descriptor : SFCDescriptor ,
317
+ pluginContext : PluginContext
318
+ ) {
319
+ const srcFile =
320
+ ( await pluginContext . resolve ( src , descriptor . filename ) ) ?. id || src
306
321
setDescriptor ( srcFile , descriptor )
307
322
}
308
323
0 commit comments