fix(compiler-sfc): removeSpecifier issue when removing initial imports (script-setup) (#2729)
This commit is contained in:
parent
22b382a714
commit
6d762a84ca
@ -164,6 +164,25 @@ return { x }
|
||||
}"
|
||||
`;
|
||||
|
||||
exports[`SFC compile <script setup> imports should allow defineProps/Emit at the start of imports 1`] = `
|
||||
"import { ref } from 'vue'
|
||||
|
||||
export default {
|
||||
expose: [],
|
||||
props: ['foo'],
|
||||
emits: ['bar'],
|
||||
setup(__props) {
|
||||
|
||||
|
||||
|
||||
const r = ref(0)
|
||||
|
||||
return { r, ref }
|
||||
}
|
||||
|
||||
}"
|
||||
`;
|
||||
|
||||
exports[`SFC compile <script setup> imports should extract comment for import or type declarations 1`] = `
|
||||
"import a from 'a' // comment
|
||||
import b from 'b'
|
||||
|
@ -141,6 +141,18 @@ const myEmit = defineEmit(['foo', 'bar'])
|
||||
)
|
||||
})
|
||||
|
||||
// #2740
|
||||
test('should allow defineProps/Emit at the start of imports', () => {
|
||||
assertCode(
|
||||
compile(`<script setup>
|
||||
import { defineProps, defineEmit, ref } from 'vue'
|
||||
defineProps(['foo'])
|
||||
defineEmit(['bar'])
|
||||
const r = ref(0)
|
||||
</script>`).content
|
||||
)
|
||||
})
|
||||
|
||||
test('dedupe between user & helper', () => {
|
||||
const { content } = compile(`
|
||||
<script setup>
|
||||
|
@ -597,19 +597,23 @@ export function compileScript(
|
||||
|
||||
// dedupe imports
|
||||
let removed = 0
|
||||
let prev: Node | undefined, next: Node | undefined
|
||||
const removeSpecifier = (node: Node) => {
|
||||
const removeSpecifier = (i: number) => {
|
||||
const removeLeft = i > removed
|
||||
removed++
|
||||
const current = node.specifiers[i]
|
||||
const next = node.specifiers[i + 1]
|
||||
s.remove(
|
||||
prev ? prev.end! + startOffset : node.start! + startOffset,
|
||||
next && !prev ? next.start! + startOffset : node.end! + startOffset
|
||||
removeLeft
|
||||
? node.specifiers[i - 1].end! + startOffset
|
||||
: current.start! + startOffset,
|
||||
next && !removeLeft
|
||||
? next.start! + startOffset
|
||||
: current.end! + startOffset
|
||||
)
|
||||
}
|
||||
|
||||
for (let i = 0; i < node.specifiers.length; i++) {
|
||||
const specifier = node.specifiers[i]
|
||||
prev = node.specifiers[i - 1]
|
||||
next = node.specifiers[i + 1]
|
||||
const local = specifier.local.name
|
||||
const imported =
|
||||
specifier.type === 'ImportSpecifier' &&
|
||||
@ -621,11 +625,11 @@ export function compileScript(
|
||||
source === 'vue' &&
|
||||
(imported === DEFINE_PROPS || imported === DEFINE_EMIT)
|
||||
) {
|
||||
removeSpecifier(specifier)
|
||||
removeSpecifier(i)
|
||||
} else if (existing) {
|
||||
if (existing.source === source && existing.imported === imported) {
|
||||
// already imported in <script setup>, dedupe
|
||||
removeSpecifier(specifier)
|
||||
removeSpecifier(i)
|
||||
} else {
|
||||
error(`different imports aliased to same local name.`, specifier)
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user