parse.spec.ts 3.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126
  1. import { parse } from '../src'
  2. import { mockWarn } from '@vue/shared'
  3. import { baseParse, baseCompile } from '@vue/compiler-core'
  4. describe('compiler:sfc', () => {
  5. mockWarn()
  6. describe('source map', () => {
  7. test('style block', () => {
  8. const style = parse(`<style>\n.color {\n color: red;\n }\n</style>\n`)
  9. .descriptor.styles[0]
  10. // TODO need to actually test this with SourceMapConsumer
  11. expect(style.map).not.toBeUndefined()
  12. })
  13. test('script block', () => {
  14. const script = parse(`<script>\nconsole.log(1)\n }\n</script>\n`)
  15. .descriptor.script
  16. // TODO need to actually test this with SourceMapConsumer
  17. expect(script!.map).not.toBeUndefined()
  18. })
  19. })
  20. test('pad content', () => {
  21. const content = `
  22. <template>
  23. <div></div>
  24. </template>
  25. <script>
  26. export default {}
  27. </script>
  28. <style>
  29. h1 { color: red }
  30. </style>`
  31. const padFalse = parse(content.trim(), { pad: false }).descriptor
  32. expect(padFalse.template!.content).toBe('\n<div></div>\n')
  33. expect(padFalse.script!.content).toBe('\nexport default {}\n')
  34. expect(padFalse.styles[0].content).toBe('\nh1 { color: red }\n')
  35. const padTrue = parse(content.trim(), { pad: true }).descriptor
  36. expect(padTrue.script!.content).toBe(
  37. Array(3 + 1).join('//\n') + '\nexport default {}\n'
  38. )
  39. expect(padTrue.styles[0].content).toBe(
  40. Array(6 + 1).join('\n') + '\nh1 { color: red }\n'
  41. )
  42. const padLine = parse(content.trim(), { pad: 'line' }).descriptor
  43. expect(padLine.script!.content).toBe(
  44. Array(3 + 1).join('//\n') + '\nexport default {}\n'
  45. )
  46. expect(padLine.styles[0].content).toBe(
  47. Array(6 + 1).join('\n') + '\nh1 { color: red }\n'
  48. )
  49. const padSpace = parse(content.trim(), { pad: 'space' }).descriptor
  50. expect(padSpace.script!.content).toBe(
  51. `<template>\n<div></div>\n</template>\n<script>`.replace(/./g, ' ') +
  52. '\nexport default {}\n'
  53. )
  54. expect(padSpace.styles[0].content).toBe(
  55. `<template>\n<div></div>\n</template>\n<script>\nexport default {}\n</script>\n<style>`.replace(
  56. /./g,
  57. ' '
  58. ) + '\nh1 { color: red }\n'
  59. )
  60. })
  61. test('should ignore nodes with no content', () => {
  62. expect(parse(`<template/>`).descriptor.template).toBe(null)
  63. expect(parse(`<script/>`).descriptor.script).toBe(null)
  64. expect(parse(`<style/>`).descriptor.styles.length).toBe(0)
  65. expect(parse(`<custom/>`).descriptor.customBlocks.length).toBe(0)
  66. })
  67. test('nested templates', () => {
  68. const content = `
  69. <template v-if="ok">ok</template>
  70. <div><div></div></div>
  71. `
  72. const { descriptor } = parse(`<template>${content}</template>`)
  73. expect(descriptor.template!.content).toBe(content)
  74. })
  75. test('error tolerance', () => {
  76. const { errors } = parse(`<template>`)
  77. expect(errors.length).toBe(1)
  78. })
  79. test('should parse as DOM by default', () => {
  80. const { errors } = parse(`<template><input></template>`)
  81. expect(errors.length).toBe(0)
  82. })
  83. test('custom compiler', () => {
  84. const { errors } = parse(`<template><input></template>`, {
  85. compiler: {
  86. parse: baseParse,
  87. compile: baseCompile
  88. }
  89. })
  90. expect(errors.length).toBe(1)
  91. })
  92. test('treat custom blocks as raw text', () => {
  93. const { errors, descriptor } = parse(`<foo> <-& </foo>`)
  94. expect(errors.length).toBe(0)
  95. expect(descriptor.customBlocks[0].content).toBe(` <-& `)
  96. })
  97. describe('warnings', () => {
  98. test('should only allow single template element', () => {
  99. parse(`<template><div/></template><template><div/></template>`)
  100. expect(
  101. `Single file component can contain only one template element`
  102. ).toHaveBeenWarned()
  103. })
  104. test('should only allow single script element', () => {
  105. parse(`<script>console.log(1)</script><script>console.log(1)</script>`)
  106. expect(
  107. `Single file component can contain only one script element`
  108. ).toHaveBeenWarned()
  109. })
  110. })
  111. })