compileScriptParseOnlyMode.spec.ts 2.4 KB

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