|
| 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