compileTemplate.spec.ts 3.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129
  1. import { compileTemplate } from '../src/compileTemplate'
  2. import { parse, SFCTemplateBlock } from '../src/parse'
  3. test('should work', () => {
  4. const source = `<div><p>{{ render }}</p></div>`
  5. const result = compileTemplate({ filename: 'example.vue', source })
  6. expect(result.errors.length).toBe(0)
  7. expect(result.source).toBe(source)
  8. // should expose render fn
  9. expect(result.code).toMatch(`export function render(`)
  10. })
  11. test('preprocess pug', () => {
  12. const template = parse(
  13. `
  14. <template lang="pug">
  15. body
  16. h1 Pug Examples
  17. div.container
  18. p Cool Pug example!
  19. </template>
  20. `,
  21. { filename: 'example.vue', sourceMap: true }
  22. ).descriptor.template as SFCTemplateBlock
  23. const result = compileTemplate({
  24. filename: 'example.vue',
  25. source: template.content,
  26. preprocessLang: template.lang
  27. })
  28. expect(result.errors.length).toBe(0)
  29. })
  30. test('warn missing preprocessor', () => {
  31. const template = parse(`<template lang="unknownLang">hi</template>\n`, {
  32. filename: 'example.vue',
  33. sourceMap: true
  34. }).descriptor.template as SFCTemplateBlock
  35. const result = compileTemplate({
  36. filename: 'example.vue',
  37. source: template.content,
  38. preprocessLang: template.lang
  39. })
  40. expect(result.errors.length).toBe(1)
  41. })
  42. test('transform asset url options', () => {
  43. const input = { source: `<foo bar="~baz"/>`, filename: 'example.vue' }
  44. // Object option
  45. const { code: code1 } = compileTemplate({
  46. ...input,
  47. transformAssetUrls: {
  48. tags: { foo: ['bar'] }
  49. }
  50. })
  51. expect(code1).toMatch(`import _imports_0 from 'baz'\n`)
  52. // legacy object option (direct tags config)
  53. const { code: code2 } = compileTemplate({
  54. ...input,
  55. transformAssetUrls: {
  56. foo: ['bar']
  57. }
  58. })
  59. expect(code2).toMatch(`import _imports_0 from 'baz'\n`)
  60. // false option
  61. const { code: code3 } = compileTemplate({
  62. ...input,
  63. transformAssetUrls: false
  64. })
  65. expect(code3).not.toMatch(`import _imports_0 from 'baz'\n`)
  66. })
  67. test('source map', () => {
  68. const template = parse(
  69. `
  70. <template>
  71. <div><p>{{ render }}</p></div>
  72. </template>
  73. `,
  74. { filename: 'example.vue', sourceMap: true }
  75. ).descriptor.template as SFCTemplateBlock
  76. const result = compileTemplate({
  77. filename: 'example.vue',
  78. source: template.content
  79. })
  80. expect(result.map).toMatchSnapshot()
  81. })
  82. test('template errors', () => {
  83. const result = compileTemplate({
  84. filename: 'example.vue',
  85. source: `<div :foo
  86. :bar="a[" v-model="baz"/>`
  87. })
  88. expect(result.errors).toMatchSnapshot()
  89. })
  90. test('preprocessor errors', () => {
  91. const template = parse(
  92. `
  93. <template lang="pug">
  94. div(class='class)
  95. </template>
  96. `,
  97. { filename: 'example.vue', sourceMap: true }
  98. ).descriptor.template as SFCTemplateBlock
  99. const result = compileTemplate({
  100. filename: 'example.vue',
  101. source: template.content,
  102. preprocessLang: template.lang
  103. })
  104. expect(result.errors.length).toBe(1)
  105. const message = result.errors[0].toString()
  106. expect(message).toMatch(`Error: example.vue:3:1`)
  107. expect(message).toMatch(
  108. `The end of the string reached with no closing bracket ) found.`
  109. )
  110. })