Skip to content

Commit

Permalink
fix(compiler-sfc): fix <script> and <script setup> co-usage order…
Browse files Browse the repository at this point in the history
…ing edge case (#4419)

Fix: #4395
Fix: #4376
  • Loading branch information
klwfwdk committed Aug 23, 2021
1 parent a46b0a9 commit 9826382
Show file tree
Hide file tree
Showing 3 changed files with 60 additions and 9 deletions.
Expand Up @@ -33,6 +33,27 @@ return { x }
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'
Expand Down
18 changes: 18 additions & 0 deletions packages/compiler-sfc/__tests__/compileScript.spec.ts
Expand Up @@ -202,6 +202,24 @@ defineExpose({ foo: 123 })
`)
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', () => {
Expand Down
30 changes: 21 additions & 9 deletions packages/compiler-sfc/src/compileScript.ts
Expand Up @@ -1150,15 +1150,27 @@ export function compileScript(
// 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
Expand Down

0 comments on commit 9826382

Please sign in to comment.