Skip to content

Commit

Permalink
fix(compiler-sfc): fix defineProps/defineEmits usage in multi-variabl…
Browse files Browse the repository at this point in the history
…e declarations

fix #3739
  • Loading branch information
yyx990803 committed Jun 28, 2021
1 parent 2973b6c commit 62c1b2f
Show file tree
Hide file tree
Showing 3 changed files with 74 additions and 3 deletions.
Expand Up @@ -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`] = `
"import { bar } from './bar'
Expand Down
26 changes: 26 additions & 0 deletions packages/compiler-sfc/__tests__/compileScript.spec.ts
Expand Up @@ -97,6 +97,32 @@ const myEmit = defineEmits(['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()', () => {
const { content } = compile(`
<script setup>
Expand Down
19 changes: 16 additions & 3 deletions packages/compiler-sfc/src/compileScript.ts
Expand Up @@ -820,7 +820,10 @@ export function compileScript(
}

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) {
const isDefineProps =
processDefineProps(decl.init) || processWithDefaults(decl.init)
Expand All @@ -838,10 +841,20 @@ export function compileScript(
)
}
if (isDefineProps || isDefineEmits)
if (node.declarations.length === 1) {
if (left === 1) {
s.remove(node.start! + startOffset, node.end! + startOffset)
} 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--
}
}
}
Expand Down

0 comments on commit 62c1b2f

Please sign in to comment.