Skip to content

Commit 2db91ce

Browse files
committed
feat: propagate multiRoot for template-only vapor components
1 parent 31a7939 commit 2db91ce

4 files changed

Lines changed: 40 additions & 5 deletions

File tree

eslint.config.js

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,7 @@
11
import { sxzz } from '@sxzz/eslint-config'
22

3-
export default sxzz().removeRules('unicorn/filename-case')
3+
export default sxzz({
4+
baseline: {
5+
ignoreFeatures: ['top-level-await'],
6+
},
7+
}).removeRules('unicorn/filename-case')

src/core/main.ts

Lines changed: 32 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -69,6 +69,8 @@ export async function transformMain(
6969
// feature information
7070
const attachedProps: [string, string][] = []
7171
const hasScoped = descriptor.styles.some((s) => s.scoped)
72+
const isTemplateOnlyVapor =
73+
!descriptor.script && !descriptor.scriptSetup && descriptor.vapor
7274

7375
// script
7476
const { code: scriptCode, map: scriptMap } = await genScriptCode(
@@ -81,11 +83,20 @@ export async function transformMain(
8183
// template
8284
const hasTemplateImport =
8385
descriptor.template && !isUseInlineTemplate(descriptor, options)
86+
const isTemplateInlined =
87+
!!descriptor.template &&
88+
(!descriptor.template.lang || descriptor.template.lang === 'html') &&
89+
!descriptor.template.src
8490

8591
let templateCode = ''
8692
let templateMap: RawSourceMap | undefined
93+
let templateMultiRoot: boolean | undefined
8794
if (hasTemplateImport) {
88-
;({ code: templateCode, map: templateMap } = await genTemplateCode(
95+
;({
96+
code: templateCode,
97+
map: templateMap,
98+
multiRoot: templateMultiRoot,
99+
} = await genTemplateCode(
89100
descriptor,
90101
options,
91102
pluginContext,
@@ -120,6 +131,11 @@ export async function transformMain(
120131
const output: string[] = [
121132
scriptCode,
122133
templateCode,
134+
isTemplateOnlyVapor
135+
? `${scriptIdentifier}.__multiRoot = ${
136+
isTemplateInlined ? templateMultiRoot : '_sfc_multiRoot'
137+
}`
138+
: '',
123139
stylesCode,
124140
customBlocksCode,
125141
]
@@ -295,21 +311,31 @@ async function genTemplateCode(
295311
options: ResolvedOptions,
296312
pluginContext: Context,
297313
customElement: boolean,
298-
) {
314+
): Promise<{
315+
code: string
316+
map?: RawSourceMap
317+
multiRoot?: boolean
318+
}> {
299319
const template = descriptor.template!
300320
const hasScoped = descriptor.styles.some((style) => style.scoped)
321+
const needsMultiRoot =
322+
!descriptor.script && !descriptor.scriptSetup && descriptor.vapor
301323

302324
// If the template is not using pre-processor AND is not using external src,
303325
// compile and inline it directly in the main module. When served in vite this
304326
// saves an extra request per SFC which can improve load performance.
305327
if ((!template.lang || template.lang === 'html') && !template.src) {
306-
return transformTemplateInMain(
328+
const result = transformTemplateInMain(
307329
template.content,
308330
descriptor,
309331
options,
310332
pluginContext,
311333
customElement,
312334
)
335+
return {
336+
...result,
337+
multiRoot: needsMultiRoot ? result.multiRoot : undefined,
338+
}
313339
} else {
314340
if (template.src) {
315341
await linkSrcToDescriptor(
@@ -331,7 +357,9 @@ async function genTemplateCode(
331357
const request = JSON.stringify(src + query)
332358
const renderFnName = options.ssr ? 'ssrRender' : 'render'
333359
return {
334-
code: `import { ${renderFnName} as _sfc_${renderFnName} } from ${request}`,
360+
code: `import { ${renderFnName} as _sfc_${renderFnName}${
361+
needsMultiRoot ? ', multiRoot as _sfc_multiRoot' : ''
362+
} } from ${request}`,
335363
map: undefined,
336364
}
337365
}

src/core/template.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,7 @@ export async function transformTemplateAsModule(
3535
)
3636

3737
let returnCode = result.code
38+
returnCode += `\nexport const multiRoot = ${JSON.stringify(result.multiRoot)}`
3839
if (
3940
options.devServer &&
4041
options.devServer.config.server.hmr !== false &&

tests/__snapshots__/rollup.test.ts.snap

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -318,6 +318,7 @@ function render(_ctx, _cache, $props, $setup, $data, $options) {
318318
/* TEXT */
319319
)]);
320320
}
321+
const multiRoot = undefined;
321322
322323
var _export_sfc = (sfc, props) => {
323324
const target = sfc.__vccOpts || sfc;
@@ -356,6 +357,7 @@ function render(_ctx, _cache, $props, $setup, $data, $options) {
356357
/* TEXT */
357358
)]);
358359
}
360+
const multiRoot = undefined;
359361
360362
var _export_sfc = (sfc, props) => {
361363
const target = sfc.__vccOpts || sfc;

0 commit comments

Comments
 (0)