fix(compiler-sfc): fix props codegen w/ leading import

fix #4764
This commit is contained in:
Evan You 2021-10-08 12:52:48 -04:00
parent 9e3d7731c7
commit d4c04e9799
4 changed files with 51 additions and 14 deletions

View File

@ -58,7 +58,7 @@ exports[`SFC compile <script setup> <script> and <script setup> co-usage spaces
"import { x } from './x' "import { x } from './x'
export const n = 1 export const n = 1
const __default__ = { const __default__ = {
some:'option' some:'option'
} }
@ -79,7 +79,7 @@ exports[`SFC compile <script setup> <script> and <script setup> co-usage spaces
"import { x } from './x' "import { x } from './x'
export const n = 1 export const n = 1
const __default__ = { const __default__ = {
some:'option' some:'option'
} }
@ -392,6 +392,7 @@ export default {
expose() expose()
const props = __props const props = __props
return { props, propsModel } return { props, propsModel }
@ -400,6 +401,23 @@ return { props, propsModel }
}" }"
`; `;
exports[`SFC compile <script setup> defineProps w/ leading code 1`] = `
"import { x } from './x'
export default {
props: {},
setup(__props, { expose }) {
expose()
const props = __props
return { props, x }
}
}"
`;
exports[`SFC compile <script setup> defineProps() 1`] = ` exports[`SFC compile <script setup> defineProps() 1`] = `
"export default { "export default {
props: { props: {
@ -410,6 +428,7 @@ exports[`SFC compile <script setup> defineProps() 1`] = `
const props = __props const props = __props
const bar = 1 const bar = 1
return { props, bar } return { props, bar }
@ -426,6 +445,7 @@ exports[`SFC compile <script setup> defineProps/defineEmits in multi-variable de
expose() expose()
const props = __props const props = __props
return { props, emit } return { props, emit }
@ -442,6 +462,7 @@ exports[`SFC compile <script setup> defineProps/defineEmits in multi-variable de
expose() expose()
const props = __props const props = __props
const a = 1; const a = 1;
return { props, a, emit } return { props, a, emit }
@ -814,7 +835,7 @@ return (_ctx, _cache) => {
}), }),
_createElementVNode(\\"div\\", { _createElementVNode(\\"div\\", {
onClick: _cache[5] || (_cache[5] = () => { onClick: _cache[5] || (_cache[5] = () => {
let a = '' + _unref(lett) let a = '' + _unref(lett)
_isRef(v) ? v.value = a : v = a _isRef(v) ? v.value = a : v = a
}) })
}), }),
@ -828,7 +849,7 @@ return (_ctx, _cache) => {
let z2 = z let z2 = z
}) })
let lz = _ctx.z let lz = _ctx.z
}) })
_isRef(v) ? v.value = _ctx.a : v = _ctx.a _isRef(v) ? v.value = _ctx.a : v = _ctx.a
}) })
}) })
@ -1286,6 +1307,7 @@ const props = __props
return { props, emit } return { props, emit }
} }
@ -1360,6 +1382,7 @@ const props = __props as {
bar?: number bar?: number
baz: boolean baz: boolean
} }
return { props, defaults } return { props, defaults }
@ -1382,6 +1405,7 @@ export default /*#__PURE__*/_defineComponent({
expose() expose()
const props = __props as { foo: string, bar?: number, baz: boolean, qux(): number } const props = __props as { foo: string, bar?: number, baz: boolean, qux(): number }
return { props } return { props }

View File

@ -119,6 +119,7 @@ export default {
setup(__props) { setup(__props) {
const rest = _createPropsRestProxy(__props, [\\"foo\\",\\"bar\\"]) const rest = _createPropsRestProxy(__props, [\\"foo\\",\\"bar\\"])
return () => {} return () => {}

View File

@ -96,6 +96,18 @@ const bar = 1
props: propsModel,`) props: propsModel,`)
}) })
// #4764
test('defineProps w/ leading code', () => {
const { content } = compile(`
<script setup>import { x } from './x'
const props = defineProps({})
</script>
`)
// props declaration should be inside setup, not moved along with the import
expect(content).not.toMatch(`const props = __props\nimport`)
assertCode(content)
})
test('defineEmits()', () => { test('defineEmits()', () => {
const { content, bindings } = compile(` const { content, bindings } = compile(`
<script setup> <script setup>
@ -164,8 +176,8 @@ defineExpose({ foo: 123 })
const { content } = compile(` const { content } = compile(`
<script> <script>
export const n = 1 export const n = 1
export default export default
{ {
some:'option' some:'option'
} }
</script> </script>
@ -181,7 +193,7 @@ defineExpose({ foo: 123 })
const { content } = compile(` const { content } = compile(`
<script> <script>
export const n = 1 export const n = 1
export default{ export default{
some:'option' some:'option'
} }
</script> </script>
@ -549,7 +561,7 @@ defineExpose({ foo: 123 })
<div @click="v += 1"/> <div @click="v += 1"/>
<div @click="v -= 1"/> <div @click="v -= 1"/>
<div @click="() => { <div @click="() => {
let a = '' + lett let a = '' + lett
v = a v = a
}"/> }"/>
<div @click="() => { <div @click="() => {
@ -561,7 +573,7 @@ defineExpose({ foo: 123 })
let z2 = z let z2 = z
}) })
let lz = z let lz = z
}) })
v = a v = a
}"/> }"/>
</template> </template>

View File

@ -1205,25 +1205,25 @@ export function compileScript(
// we use a default __props so that template expressions referencing props // we use a default __props so that template expressions referencing props
// can use it directly // can use it directly
if (propsIdentifier) { if (propsIdentifier) {
s.prependRight( s.prependLeft(
startOffset, startOffset,
`\nconst ${propsIdentifier} = __props${ `\nconst ${propsIdentifier} = __props${
propsTypeDecl ? ` as ${genSetupPropsType(propsTypeDecl)}` : `` propsTypeDecl ? ` as ${genSetupPropsType(propsTypeDecl)}` : ``
}` }\n`
) )
} }
if (propsDestructureRestId) { if (propsDestructureRestId) {
s.prependRight( s.prependLeft(
startOffset, startOffset,
`\nconst ${propsDestructureRestId} = ${helper( `\nconst ${propsDestructureRestId} = ${helper(
`createPropsRestProxy` `createPropsRestProxy`
)}(__props, ${JSON.stringify(Object.keys(propsDestructuredBindings))})` )}(__props, ${JSON.stringify(Object.keys(propsDestructuredBindings))})\n`
) )
} }
// inject temp variables for async context preservation // inject temp variables for async context preservation
if (hasAwait) { if (hasAwait) {
const any = isTS ? `: any` : `` const any = isTS ? `: any` : ``
s.prependRight(startOffset, `\nlet __temp${any}, __restore${any}\n`) s.prependLeft(startOffset, `\nlet __temp${any}, __restore${any}\n`)
} }
const destructureElements = const destructureElements =