fix(compiler-sfc): fix defineProps/defineEmits usage in multi-variable declarations
fix #3739
This commit is contained in:
parent
2973b6c30a
commit
62c1b2f7dc
@ -108,6 +108,38 @@ return { props, bar }
|
|||||||
}"
|
}"
|
||||||
`;
|
`;
|
||||||
|
|
||||||
|
exports[`SFC compile <script setup> defineProps/defineEmits in multi-variable decalration (full removal) 1`] = `
|
||||||
|
"export default {
|
||||||
|
props: ['item'],
|
||||||
|
emits: ['a'],
|
||||||
|
setup(__props, { expose, emit }) {
|
||||||
|
expose()
|
||||||
|
|
||||||
|
const props = __props
|
||||||
|
|
||||||
|
|
||||||
|
return { props, emit }
|
||||||
|
}
|
||||||
|
|
||||||
|
}"
|
||||||
|
`;
|
||||||
|
|
||||||
|
exports[`SFC compile <script setup> defineProps/defineEmits in multi-variable decalration 1`] = `
|
||||||
|
"export default {
|
||||||
|
props: ['item'],
|
||||||
|
emits: ['a'],
|
||||||
|
setup(__props, { expose, emit }) {
|
||||||
|
expose()
|
||||||
|
|
||||||
|
const props = __props
|
||||||
|
const a = 1;
|
||||||
|
|
||||||
|
return { props, a, emit }
|
||||||
|
}
|
||||||
|
|
||||||
|
}"
|
||||||
|
`;
|
||||||
|
|
||||||
exports[`SFC compile <script setup> errors should allow defineProps/Emit() referencing imported binding 1`] = `
|
exports[`SFC compile <script setup> errors should allow defineProps/Emit() referencing imported binding 1`] = `
|
||||||
"import { bar } from './bar'
|
"import { bar } from './bar'
|
||||||
|
|
||||||
|
@ -97,6 +97,32 @@ const myEmit = defineEmits(['foo', 'bar'])
|
|||||||
emits: ['foo', 'bar'],`)
|
emits: ['foo', 'bar'],`)
|
||||||
})
|
})
|
||||||
|
|
||||||
|
test('defineProps/defineEmits in multi-variable decalration', () => {
|
||||||
|
const { content } = compile(`
|
||||||
|
<script setup>
|
||||||
|
const props = defineProps(['item']),
|
||||||
|
a = 1,
|
||||||
|
emit = defineEmits(['a']);
|
||||||
|
</script>
|
||||||
|
`)
|
||||||
|
assertCode(content)
|
||||||
|
expect(content).toMatch(`const a = 1;`) // test correct removal
|
||||||
|
expect(content).toMatch(`props: ['item'],`)
|
||||||
|
expect(content).toMatch(`emits: ['a'],`)
|
||||||
|
})
|
||||||
|
|
||||||
|
test('defineProps/defineEmits in multi-variable decalration (full removal)', () => {
|
||||||
|
const { content } = compile(`
|
||||||
|
<script setup>
|
||||||
|
const props = defineProps(['item']),
|
||||||
|
emit = defineEmits(['a']);
|
||||||
|
</script>
|
||||||
|
`)
|
||||||
|
assertCode(content)
|
||||||
|
expect(content).toMatch(`props: ['item'],`)
|
||||||
|
expect(content).toMatch(`emits: ['a'],`)
|
||||||
|
})
|
||||||
|
|
||||||
test('defineExpose()', () => {
|
test('defineExpose()', () => {
|
||||||
const { content } = compile(`
|
const { content } = compile(`
|
||||||
<script setup>
|
<script setup>
|
||||||
|
@ -820,7 +820,10 @@ export function compileScript(
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (node.type === 'VariableDeclaration' && !node.declare) {
|
if (node.type === 'VariableDeclaration' && !node.declare) {
|
||||||
for (const decl of node.declarations) {
|
const total = node.declarations.length
|
||||||
|
let left = total
|
||||||
|
for (let i = 0; i < total; i++) {
|
||||||
|
const decl = node.declarations[i]
|
||||||
if (decl.init) {
|
if (decl.init) {
|
||||||
const isDefineProps =
|
const isDefineProps =
|
||||||
processDefineProps(decl.init) || processWithDefaults(decl.init)
|
processDefineProps(decl.init) || processWithDefaults(decl.init)
|
||||||
@ -838,10 +841,20 @@ export function compileScript(
|
|||||||
)
|
)
|
||||||
}
|
}
|
||||||
if (isDefineProps || isDefineEmits)
|
if (isDefineProps || isDefineEmits)
|
||||||
if (node.declarations.length === 1) {
|
if (left === 1) {
|
||||||
s.remove(node.start! + startOffset, node.end! + startOffset)
|
s.remove(node.start! + startOffset, node.end! + startOffset)
|
||||||
} else {
|
} else {
|
||||||
s.remove(decl.start! + startOffset, decl.end! + startOffset)
|
let start = decl.start! + startOffset
|
||||||
|
let end = decl.end! + startOffset
|
||||||
|
if (i < total - 1) {
|
||||||
|
// not the last one, locate the start of the next
|
||||||
|
end = node.declarations[i + 1].start! + startOffset
|
||||||
|
} else {
|
||||||
|
// last one, locate the end of the prev
|
||||||
|
start = node.declarations[i - 1].end! + startOffset
|
||||||
|
}
|
||||||
|
s.remove(start, end)
|
||||||
|
left--
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user