sfc-parser.spec.js 4.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144
  1. import { parseComponent } from 'sfc/parser'
  2. describe('Single File Component parser', () => {
  3. it('should parse', () => {
  4. const res = parseComponent(`
  5. <template>
  6. <div>hi</div>
  7. </template>
  8. <style src="./test.css"></style>
  9. <style lang="stylus" scoped>
  10. h1
  11. color red
  12. h2
  13. color green
  14. </style>
  15. <style module>
  16. h1 { font-weight: bold }
  17. </style>
  18. <script>
  19. export default {}
  20. </script>
  21. <div>
  22. <style>nested should be ignored</style>
  23. </div>
  24. `)
  25. expect(res.template.content.trim()).toBe('<div>hi</div>')
  26. expect(res.styles.length).toBe(3)
  27. expect(res.styles[0].src).toBe('./test.css')
  28. expect(res.styles[1].lang).toBe('stylus')
  29. expect(res.styles[1].scoped).toBe(true)
  30. expect(res.styles[1].content.trim()).toBe('h1\n color red\nh2\n color green')
  31. expect(res.styles[2].module).toBe(true)
  32. expect(res.script.content.trim()).toBe('export default {}')
  33. })
  34. it('should parse template with closed input', () => {
  35. const res = parseComponent(`
  36. <template>
  37. <input type="text"/>
  38. </template>
  39. `)
  40. expect(res.template.content.trim()).toBe('<input type="text"/>')
  41. })
  42. it('should handle nested template', () => {
  43. const res = parseComponent(`
  44. <template>
  45. <div><template v-if="ok">hi</template></div>
  46. </template>
  47. `)
  48. expect(res.template.content.trim()).toBe('<div><template v-if="ok">hi</template></div>')
  49. })
  50. it('pad content', () => {
  51. const res = parseComponent(`
  52. <template>
  53. <div></div>
  54. </template>
  55. <script>
  56. export default {}
  57. </script>
  58. <style>
  59. h1 { color: red }
  60. </style>
  61. `.trim(), { pad: true })
  62. expect(res.script.content).toBe(Array(3 + 1).join('//\n') + '\nexport default {}\n')
  63. expect(res.styles[0].content).toBe(Array(6 + 1).join('\n') + '\nh1 { color: red }\n')
  64. })
  65. it('should handle template blocks with lang as special text', () => {
  66. const res = parseComponent(`
  67. <template lang="pug">
  68. div
  69. h1(v-if='1 < 2') hello
  70. </template>
  71. `)
  72. expect(res.template.content.trim()).toBe(`div\n h1(v-if='1 < 2') hello`)
  73. })
  74. it('should handle custom blocks without parsing them', () => {
  75. const res = parseComponent(`
  76. <template>
  77. <div></div>
  78. </template>
  79. <example name="simple">
  80. <my-button ref="button">Hello</my-button>
  81. </example>
  82. <example name="with props">
  83. <my-button color="red">Hello</my-button>
  84. </example>
  85. <test name="simple" foo="bar">
  86. export default function simple (vm) {
  87. describe('Hello', () => {
  88. it('should display Hello', () => {
  89. this.vm.$refs.button.$el.innerText.should.equal('Hello')
  90. }))
  91. }))
  92. }
  93. </test>
  94. `)
  95. expect(res.customBlocks.length).toBe(3)
  96. const simpleExample = res.customBlocks[0]
  97. expect(simpleExample.type).toBe('example')
  98. expect(simpleExample.content.trim()).toBe('<my-button ref="button">Hello</my-button>')
  99. expect(simpleExample.attrs.name).toBe('simple')
  100. const withProps = res.customBlocks[1]
  101. expect(withProps.type).toBe('example')
  102. expect(withProps.content.trim()).toBe('<my-button color="red">Hello</my-button>')
  103. expect(withProps.attrs.name).toBe('with props')
  104. const simpleTest = res.customBlocks[2]
  105. expect(simpleTest.type).toBe('test')
  106. expect(simpleTest.content.trim()).toBe(`export default function simple (vm) {
  107. describe('Hello', () => {
  108. it('should display Hello', () => {
  109. this.vm.$refs.button.$el.innerText.should.equal('Hello')
  110. }))
  111. }))
  112. }`)
  113. expect(simpleTest.attrs.name).toBe('simple')
  114. expect(simpleTest.attrs.foo).toBe('bar')
  115. })
  116. // Regression #4289
  117. it('accepts nested template tag', () => {
  118. const raw = `<div>
  119. <template v-if="true === true">
  120. <section class="section">
  121. <div class="container">
  122. Should be shown
  123. </div>
  124. </section>
  125. </template>
  126. <template v-else>
  127. <p>Shoud not be shown</p>
  128. </template>
  129. </div>`
  130. const res = parseComponent(`<template>${raw}</template>`)
  131. expect(res.template.content.trim()).toBe(raw)
  132. })
  133. })