export const n = 1"
`;
+exports[`SFC compile <script setup> <script> and <script setup> co-usage script setup first, lang="ts", script block content export default 1`] = `
+"import { defineComponent as _defineComponent } from 'vue'
+import { x } from './x'
+
+function setup(__props, { expose }) {
+
+ x()
+
+return { x }
+}
+
+
+ const __default__ = {
+ name: \\"test\\"
+ }
+
+export default _defineComponent({
+ ...__default__,
+ setup})"
+`;
+
exports[`SFC compile <script setup> <script> and <script setup> co-usage spaces in ExportDefaultDeclaration node with many spaces and newline 1`] = `
"import { x } from './x'
`)
assertCode(content)
})
+
+ // #4395
+ test('script setup first, lang="ts", script block content export default', () => {
+ const { content } = compile(`
+ <script setup lang="ts">
+ import { x } from './x'
+ x()
+ </script>
+ <script lang="ts">
+ export default {
+ name: "test"
+ }
+ </script>
+ `)
+ // ensure __default__ is declared before used
+ expect(content).toMatch(/const __default__[\S\s]*\.\.\.__default__/m)
+ assertCode(content)
+ })
})
describe('imports', () => {
// wrap setup code with function.
// export the content of <script setup> as a named export, `setup`.
// this allows `import { setup } from '*.vue'` for testing purposes.
- s.prependLeft(
- startOffset,
- `\nexport default ${helper(
- `defineComponent`
- )}({${def}${runtimeOptions}\n ${
- hasAwait ? `async ` : ``
- }setup(${args}) {\n${exposeCall}`
- )
- s.appendRight(endOffset, `})`)
+ if (defaultExport) {
+ s.prependLeft(
+ startOffset,
+ `\n${hasAwait ? `async ` : ``}function setup(${args}) {\n`
+ )
+ s.append(
+ `\nexport default ${helper(
+ `defineComponent`
+ )}({${def}${runtimeOptions}\n setup})`
+ )
+ } else {
+ s.prependLeft(
+ startOffset,
+ `\nexport default ${helper(
+ `defineComponent`
+ )}({${def}${runtimeOptions}\n ${
+ hasAwait ? `async ` : ``
+ }setup(${args}) {\n${exposeCall}`
+ )
+ s.appendRight(endOffset, `})`)
+ }
} else {
if (defaultExport) {
// can't rely on spread operator in non ts mode