diff --git a/packages/plugin-vue/src/template.ts b/packages/plugin-vue/src/template.ts
index 35ab085a..75c5f25b 100644
--- a/packages/plugin-vue/src/template.ts
+++ b/packages/plugin-vue/src/template.ts
@@ -7,6 +7,7 @@ import type {
SFCTemplateCompileResults,
} from 'vue/compiler-sfc'
import type { PluginContext, TransformPluginContext } from 'rollup'
+import { transformWithEsbuild } from 'vite'
import { getResolvedScript } from './script'
import { createRollupError } from './utils/error'
import type { ResolvedOptions } from '.'
@@ -19,9 +20,14 @@ export async function transformTemplateAsModule(
pluginContext: TransformPluginContext,
ssr: boolean,
) {
- const result = compile(code, descriptor, options, pluginContext, ssr)
+ let { code: returnCode, map: returnMap } = compile(
+ code,
+ descriptor,
+ options,
+ pluginContext,
+ ssr,
+ )
- let returnCode = result.code
if (
options.devServer &&
options.devServer.config.server.hmr !== false &&
@@ -33,9 +39,30 @@ export async function transformTemplateAsModule(
})`
}
+ const lang = descriptor.scriptSetup?.lang || descriptor.script?.lang
+
+ if (
+ lang &&
+ /tsx?$/.test(lang) &&
+ !descriptor.script?.src // only normal script can have src
+ ) {
+ const { code, map } = await transformWithEsbuild(
+ returnCode,
+ descriptor.filename,
+ {
+ loader: 'ts',
+ target: 'esnext',
+ sourcemap: options.sourceMap,
+ },
+ returnMap,
+ )
+ returnCode = code
+ returnMap = returnMap ? (map as any) : returnMap
+ }
+
return {
code: returnCode,
- map: result.map,
+ map: returnMap,
}
}
diff --git a/playground/vue/Main.vue b/playground/vue/Main.vue
index b91d50f9..dd6fc48a 100644
--- a/playground/vue/Main.vue
+++ b/playground/vue/Main.vue
@@ -26,6 +26,7 @@
+
diff --git a/playground/vue/__tests__/vue.spec.ts b/playground/vue/__tests__/vue.spec.ts
index f0d15c7b..c79ec112 100644
--- a/playground/vue/__tests__/vue.spec.ts
+++ b/playground/vue/__tests__/vue.spec.ts
@@ -279,3 +279,11 @@ describe('import with ?url', () => {
)
})
})
+
+describe('ts expression in the pug template', () => {
+ test('should work', async () => {
+ expect(await page.textContent('.ts-expression')).toMatch('0')
+ await page.click('.ts-expression')
+ expect(await page.textContent('.ts-expression')).toMatch('1')
+ })
+})