compileTemplate.spec.ts 2.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117
  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: { foo: ['bar'] }
  48. })
  49. expect(code1).toMatch(`import _imports_0 from 'baz'\n`)
  50. // false option
  51. const { code: code2 } = compileTemplate({
  52. ...input,
  53. transformAssetUrls: false
  54. })
  55. expect(code2).not.toMatch(`import _imports_0 from 'baz'\n`)
  56. })
  57. test('source map', () => {
  58. const template = parse(
  59. `
  60. <template>
  61. <div><p>{{ render }}</p></div>
  62. </template>
  63. `,
  64. { filename: 'example.vue', sourceMap: true }
  65. ).descriptor.template as SFCTemplateBlock
  66. const result = compileTemplate({
  67. filename: 'example.vue',
  68. source: template.content
  69. })
  70. expect(result.map).toMatchSnapshot()
  71. })
  72. test('template errors', () => {
  73. const result = compileTemplate({
  74. filename: 'example.vue',
  75. source: `<div :foo
  76. :bar="a[" v-model="baz"/>`
  77. })
  78. expect(result.errors).toMatchSnapshot()
  79. })
  80. test('preprocessor errors', () => {
  81. const template = parse(
  82. `
  83. <template lang="pug">
  84. div(class='class)
  85. </template>
  86. `,
  87. { filename: 'example.vue', sourceMap: true }
  88. ).descriptor.template as SFCTemplateBlock
  89. const result = compileTemplate({
  90. filename: 'example.vue',
  91. source: template.content,
  92. preprocessLang: template.lang
  93. })
  94. expect(result.errors.length).toBe(1)
  95. const message = result.errors[0].toString()
  96. expect(message).toMatch(`Error: example.vue:3:1`)
  97. expect(message).toMatch(
  98. `The end of the string reached with no closing bracket ) found.`
  99. )
  100. })