Skip to content

Commit 601a290

Browse files
committed
feat(compiler-sfc): compileScript parseOnly mode
This is an internal feature meant for IDE support
1 parent 96cc335 commit 601a290

File tree

3 files changed

+277
-58
lines changed

3 files changed

+277
-58
lines changed
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,77 @@
1+
import { TextRange } from '../src/parse'
2+
import { compileSFCScript } from './utils'
3+
4+
describe('compileScript parseOnly mode', () => {
5+
function compile(src: string) {
6+
return compileSFCScript(src, { parseOnly: true })
7+
}
8+
9+
function getRange(src: string, range: TextRange) {
10+
return src.slice(range.start, range.end)
11+
}
12+
13+
test('bindings', () => {
14+
const scriptSrc = `
15+
import { foo } from './x'
16+
`
17+
const scriptSetupSrc = `
18+
import { bar } from './x'
19+
20+
const a = 123
21+
function b() {}
22+
class c {}
23+
`
24+
const src = `
25+
<script>${scriptSrc}</script>
26+
<script setup>${scriptSetupSrc}</script>
27+
`
28+
const { ranges } = compile(src)
29+
30+
expect(getRange(scriptSrc, ranges!.scriptBindings[0])).toBe('foo')
31+
expect(
32+
ranges!.scriptSetupBindings.map(r => getRange(scriptSetupSrc, r))
33+
).toMatchObject(['bar', 'a', 'b', 'c'])
34+
})
35+
36+
test('defineProps', () => {
37+
const src = `
38+
defineProps({ foo: String })
39+
`
40+
const { ranges } = compile(`<script setup>${src}</script>`)
41+
expect(getRange(src, ranges!.propsRuntimeArg!)).toBe(`{ foo: String }`)
42+
})
43+
44+
test('defineProps (type)', () => {
45+
const src = `
46+
interface Props { x?: number }
47+
defineProps<Props>()
48+
`
49+
const { ranges } = compile(`<script setup lang="ts">${src}</script>`)
50+
expect(getRange(src, ranges!.propsTypeArg!)).toBe(`Props`)
51+
})
52+
53+
test('withDefaults', () => {
54+
const src = `
55+
interface Props { x?: number }
56+
withDefaults(defineProps<Props>(), { x: 1 })
57+
`
58+
const { ranges } = compile(`<script setup lang="ts">${src}</script>`)
59+
expect(getRange(src, ranges!.withDefaultsArg!)).toBe(`{ x: 1 }`)
60+
})
61+
62+
test('defineEmits', () => {
63+
const src = `
64+
defineEmits(['foo'])
65+
`
66+
const { ranges } = compile(`<script setup>${src}</script>`)
67+
expect(getRange(src, ranges!.emitsRuntimeArg!)).toBe(`['foo']`)
68+
})
69+
70+
test('defineEmits (type)', () => {
71+
const src = `
72+
defineEmits<{ (e: 'x'): void }>()
73+
`
74+
const { ranges } = compile(`<script setup lang="ts">${src}</script>`)
75+
expect(getRange(src, ranges!.emitsTypeArg!)).toBe(`{ (e: 'x'): void }`)
76+
})
77+
})

0 commit comments

Comments
 (0)