fix(compiler-sfc): fix <script>
and <script setup>
co-usage ordering edge case (#4419)
Fix: #4395 Fix: #4376
This commit is contained in:
parent
a46b0a9a96
commit
98263821f8
@ -33,6 +33,27 @@ return { x }
|
|||||||
export const n = 1"
|
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`] = `
|
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'
|
"import { x } from './x'
|
||||||
|
|
||||||
|
@ -202,6 +202,24 @@ defineExpose({ foo: 123 })
|
|||||||
`)
|
`)
|
||||||
assertCode(content)
|
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', () => {
|
describe('imports', () => {
|
||||||
|
@ -1150,15 +1150,27 @@ export function compileScript(
|
|||||||
// wrap setup code with function.
|
// wrap setup code with function.
|
||||||
// export the content of <script setup> as a named export, `setup`.
|
// export the content of <script setup> as a named export, `setup`.
|
||||||
// this allows `import { setup } from '*.vue'` for testing purposes.
|
// this allows `import { setup } from '*.vue'` for testing purposes.
|
||||||
s.prependLeft(
|
if (defaultExport) {
|
||||||
startOffset,
|
s.prependLeft(
|
||||||
`\nexport default ${helper(
|
startOffset,
|
||||||
`defineComponent`
|
`\n${hasAwait ? `async ` : ``}function setup(${args}) {\n`
|
||||||
)}({${def}${runtimeOptions}\n ${
|
)
|
||||||
hasAwait ? `async ` : ``
|
s.append(
|
||||||
}setup(${args}) {\n${exposeCall}`
|
`\nexport default ${helper(
|
||||||
)
|
`defineComponent`
|
||||||
s.appendRight(endOffset, `})`)
|
)}({${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 {
|
} else {
|
||||||
if (defaultExport) {
|
if (defaultExport) {
|
||||||
// can't rely on spread operator in non ts mode
|
// can't rely on spread operator in non ts mode
|
||||||
|
Loading…
Reference in New Issue
Block a user