]> git.ipfire.org Git - thirdparty/vuejs/core.git/commitdiff
test(compiler-sfc): more tests (#536)
author宋铄运 <fnlctrl@gmail.com>
Wed, 11 Dec 2019 14:26:14 +0000 (22:26 +0800)
committerEvan You <yyx990803@gmail.com>
Wed, 11 Dec 2019 14:26:14 +0000 (09:26 -0500)
packages/compiler-sfc/__tests__/__snapshots__/compileTemplate.spec.ts.snap [new file with mode: 0644]
packages/compiler-sfc/__tests__/compileTemplate.spec.ts
packages/compiler-sfc/src/compileTemplate.ts

diff --git a/packages/compiler-sfc/__tests__/__snapshots__/compileTemplate.spec.ts.snap b/packages/compiler-sfc/__tests__/__snapshots__/compileTemplate.spec.ts.snap
new file mode 100644 (file)
index 0000000..8cb28f2
--- /dev/null
@@ -0,0 +1,27 @@
+// Jest Snapshot v1, https://goo.gl/fbAQLP
+
+exports[`source map 1`] = `
+Object {
+  "mappings": ";;;;UAAA,aACE;IAAK,gCAAMA,WAAM",
+  "names": Array [
+    "render",
+  ],
+  "sources": Array [
+    "example.vue",
+  ],
+  "sourcesContent": Array [
+    "
+  <div><p>{{ render }}</p></div>
+",
+  ],
+  "version": 3,
+}
+`;
+
+exports[`template errors 1`] = `
+Array [
+  [SyntaxError: Invalid JavaScript expression. (2:13)],
+  [SyntaxError: v-bind is missing expression. (1:6)],
+  [SyntaxError: v-model can only be used on <input>, <textarea> and <select> elements. (2:17)],
+]
+`;
index 0ece633413b78a86c51e5ddc2e44a27dfb12de2a..c6e0df029a9a4c28bb9dc111f1bcd4e15bb1a677 100644 (file)
@@ -1,5 +1,3 @@
-// TODO need more thorough tests here
-
 import { compileTemplate } from '../src/compileTemplate'
 import { parse, SFCTemplateBlock } from '../src/parse'
 
@@ -50,3 +48,70 @@ test('warn missing preprocessor', () => {
 
   expect(result.errors.length).toBe(1)
 })
+
+test('transform asset url options', () => {
+  const input = { source: `<foo bar="baz"/>`, filename: 'example.vue' }
+  // Object option
+  const { code: code1 } = compileTemplate({
+    ...input,
+    transformAssetUrls: { foo: ['bar'] }
+  })
+  expect(code1).toMatch(`import _imports_0 from 'baz'\n`)
+  // false option
+  const { code: code2 } = compileTemplate({
+    ...input,
+    transformAssetUrls: false
+  })
+  expect(code2).not.toMatch(`import _imports_0 from 'baz'\n`)
+})
+
+test('source map', () => {
+  const template = parse(
+    `
+<template>
+  <div><p>{{ render }}</p></div>
+</template>  
+`,
+    { filename: 'example.vue', sourceMap: true }
+  ).template as SFCTemplateBlock
+
+  const result = compileTemplate({
+    filename: 'example.vue',
+    source: template.content
+  })
+
+  expect(result.map).toMatchSnapshot()
+})
+
+test('template errors', () => {
+  const result = compileTemplate({
+    filename: 'example.vue',
+    source: `<div :foo 
+      :bar="a[" v-model="baz"/>`
+  })
+  expect(result.errors).toMatchSnapshot()
+})
+
+test('preprocessor errors', () => {
+  const template = parse(
+    `
+<template lang="pug">
+  div(class='class)
+</template>
+`,
+    { filename: 'example.vue', sourceMap: true }
+  ).template as SFCTemplateBlock
+
+  const result = compileTemplate({
+    filename: 'example.vue',
+    source: template.content,
+    preprocessLang: template.lang
+  })
+
+  expect(result.errors.length).toBe(1)
+  const message = result.errors[0].toString()
+  expect(message).toMatch(`Error: example.vue:3:1`)
+  expect(message).toMatch(
+    `The end of the string reached with no closing bracket ) found.`
+  )
+})
index 473695765925abc96f6a971a3ce2ddd7186c64a8..9c6f7db5f5f5066b71d6797f5e69678504fb8de1 100644 (file)
@@ -65,10 +65,19 @@ export function compileTemplate(
   const preprocessor =
     preprocessLang && consolidate[preprocessLang as keyof typeof consolidate]
   if (preprocessor) {
-    return doCompileTemplate({
-      ...options,
-      source: preprocess(options, preprocessor)
-    })
+    try {
+      return doCompileTemplate({
+        ...options,
+        source: preprocess(options, preprocessor)
+      })
+    } catch (e) {
+      return {
+        code: `export default function render() {}`,
+        source: options.source,
+        tips: [],
+        errors: [e]
+      }
+    }
   } else if (preprocessLang) {
     return {
       code: `export default function render() {}`,