Skip to content

Commit ce47cc1

Browse files
fix(vue3): <script setup> use bindingMetadata instead of inlineTemplate
1 parent 16e737b commit ce47cc1

File tree

2 files changed

+28
-2
lines changed

2 files changed

+28
-2
lines changed

src/createVue3SFCModule.ts

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -143,10 +143,14 @@ export async function createSFCModule(source : string, filename : string, option
143143
babelParserPlugins,
144144
// doc: https://github.com/vuejs/rfcs/blob/script-setup-2/active-rfcs/0000-script-setup.md#inline-template-mode
145145
// vue-loader next : https://github.com/vuejs/vue-loader/blob/12aaf2ea77add8654c50c8751bad135f1881e53f/src/resolveScript.ts#L59
146-
inlineTemplate: true,
146+
inlineTemplate: false,
147147
templateOptions: compileTemplateOptions,
148148
});
149149

150+
// see https://github.com/vuejs/vue-loader/blob/12aaf2ea77add8654c50c8751bad135f1881e53f/src/templateLoader.ts#L54
151+
if ( compileTemplateOptions !== null )
152+
compileTemplateOptions.compilerOptions.bindingMetadata = scriptBlock.bindings;
153+
150154
let ast;
151155
if ( true /*!scriptBlock.scriptAst*/ ) {
152156

@@ -183,7 +187,6 @@ export async function createSFCModule(source : string, filename : string, option
183187
ast = t.file(t.program(scriptBlock.scriptAst, [], 'module'));
184188
}
185189

186-
187190
renameDynamicImport(ast);
188191
const depsList = parseDeps(ast);
189192

tests/basic.test.js

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -875,8 +875,31 @@ const { defaultFilesFactory, createPage } = require('./testsTools.js');
875875
await expect(versions[0]).toBe(versions[1]);
876876
});
877877

878+
if ( vueTarget === 3 ) { // Vue 3 does not have <script setup>
879+
880+
test('should properly handle components in <script setup>', async () => {
878881

882+
const { page, output } = await createPage({
883+
files: {
884+
...files,
885+
'/component.vue': `
886+
<template>a<comp/>e</template>
887+
<script setup>
888+
import comp from "./comp.vue";
889+
</script>
890+
`,
891+
'/comp.vue': `
892+
<template>b{{ foo }}d</template>
893+
<script setup>
894+
const foo = 'c'
895+
</script>
896+
`,
897+
}
898+
});
879899

900+
await expect(page.$eval('#app', el => el.textContent.trim())).resolves.toBe('abcde');
901+
});
902+
}
880903

881904
});
882905

0 commit comments

Comments
 (0)