1- const vueCompiler = require ( 'vue-template-compiler' )
2- const compileTemplate = require ( './template-compiler' )
1+ const VueTemplateCompiler = require ( 'vue-template-compiler' )
32const generateSourceMap = require ( './generate-source-map' )
43const addTemplateMapping = require ( './add-template-mapping' )
54const compileTypescript = require ( './compilers/typescript-compiler' )
@@ -12,6 +11,10 @@ const join = path.join
1211const logger = require ( './logger' )
1312const splitRE = / \r ? \n / g
1413const babelJest = require ( 'babel-jest' )
14+ const compilerUtils = require ( '@vue/component-compiler-utils' )
15+ const throwError = require ( './throw-error' )
16+ const chalk = require ( 'chalk' )
17+ const convertSourceMap = require ( 'convert-source-map' )
1518
1619function processScript ( scriptPart , filePath , config ) {
1720 if ( ! scriptPart ) {
@@ -31,32 +34,44 @@ function processScript(scriptPart, filePath, config) {
3134
3235module . exports = function ( src , filePath , config ) {
3336 const vueJestConfig = getVueJestConfig ( config )
34- let parts = vueCompiler . parseComponent ( src , { pad : true } )
35- let scriptSrc = src
37+ const parts = compilerUtils . parse ( {
38+ source : src ,
39+ compiler : VueTemplateCompiler ,
40+ filename : filePath
41+ } )
42+ let scriptSrcContent = src
3643 let sourceMapPath = filePath
3744
3845 if ( parts . script && parts . script . src ) {
3946 const externalScrPath = join ( filePath , '..' , parts . script . src )
4047
4148 parts . script . content = fs . readFileSync ( externalScrPath , 'utf8' )
42- scriptSrc = parts . script . content
49+ scriptSrcContent = parts . script . content
4350 sourceMapPath = externalScrPath
4451 }
4552
4653 const result = processScript ( parts . script , filePath , config )
47- const script = result . code
54+ let compiledScriptContent = result . code
55+ compiledScriptContent = compiledScriptContent . slice (
56+ 0 ,
57+ compiledScriptContent . indexOf ( '//# sourceMappingURL' )
58+ )
4859 const inputMap = result . map
4960
50- const map = generateSourceMap ( script , '' , sourceMapPath , scriptSrc , inputMap )
51-
52- let output =
53- ';(function(){\n' +
54- script +
55- '\n})()\n' +
56- 'var defaultExport = (module.exports.__esModule) ? module.exports.default : module.exports;' +
57- 'var __vue__options__ = (typeof defaultExport === "function"' +
58- '? defaultExport.options' +
59- ': defaultExport)\n'
61+ const map = generateSourceMap (
62+ compiledScriptContent ,
63+ sourceMapPath ,
64+ scriptSrcContent ,
65+ inputMap
66+ )
67+
68+ let output = `var exports = {}
69+ ${ compiledScriptContent }
70+ if(!exports.default) {
71+ exports.default = {}
72+ }
73+ var __options__ = module.exports = exports.default
74+ Object.keys(exports).forEach(k => module.exports[k] = exports[k])`
6075
6176 if ( parts . template ) {
6277 parts . template . filename = filePath
@@ -65,24 +80,36 @@ module.exports = function(src, filePath, config) {
6580 parts . template . content = fs . readFileSync ( parts . template . filename , 'utf8' )
6681 }
6782
68- const renderFunctions = compileTemplate ( parts . template , vueJestConfig )
83+ const templateResult = compilerUtils . compileTemplate ( {
84+ source : parts . template . content ,
85+ compiler : VueTemplateCompiler ,
86+ filename : parts . template . filename ,
87+ isFunctional : parts . template . attrs . functional ,
88+ preprocessLang : parts . template . lang ,
89+ preprocessOptions : vueJestConfig [ parts . template . lang ]
90+ } )
91+
92+ if ( templateResult . errors . length ) {
93+ templateResult . errors . forEach ( function ( msg ) {
94+ console . error ( '\n' + chalk . red ( msg ) + '\n' )
95+ } )
96+ throwError ( 'Vue template compilation failed' )
97+ }
6998
70- output +=
71- '__vue__options__.render = ' +
72- renderFunctions . render +
73- '\n' +
74- '__vue__options__.staticRenderFns = ' +
75- renderFunctions . staticRenderFns +
76- '\n'
99+ output += `
100+ ${ templateResult . code }
101+ __options__.render = render
102+ __options__.staticRenderFns = staticRenderFns
103+ `
77104
78105 if ( parts . template . attrs . functional ) {
79- output += '__vue__options__ .functional = true\n'
80- output += '__vue__options__ ._compiled = true\n'
106+ output += '__options__ .functional = true\n'
107+ output += '__options__ ._compiled = true\n'
81108 }
82109
83110 if ( map ) {
84111 const beforeLines = output . split ( splitRE ) . length
85- addTemplateMapping ( script , parts , output , map , beforeLines )
112+ addTemplateMapping ( compiledScriptContent , parts , output , map , beforeLines )
86113 }
87114 }
88115
@@ -118,12 +145,12 @@ module.exports = function(src, filePath, config) {
118145 . join ( '' )
119146
120147 if ( styleStr . length !== 0 ) {
121- if ( parts . template . attrs . functional ) {
148+ if ( parts . template && parts . template . attrs . functional ) {
122149 output += `
123150 ;(function() {
124- var originalRender = __vue__options__ .render
151+ var originalRender = __options__ .render
125152 var styleFn = function () { ${ styleStr } }
126- __vue__options__ .render = function renderWithStyleInjection (h, context) {
153+ __options__ .render = function renderWithStyleInjection (h, context) {
127154 styleFn.call(context)
128155 return originalRender(h, context)
129156 }
@@ -132,17 +159,18 @@ module.exports = function(src, filePath, config) {
132159 } else {
133160 output += `
134161 ;(function() {
135- var beforeCreate = __vue__options__ .beforeCreate
162+ var beforeCreate = __options__ .beforeCreate
136163 var styleFn = function () { ${ styleStr } }
137- __vue__options__ .beforeCreate = beforeCreate ? [].concat(beforeCreate, styleFn) : [styleFn]
164+ __options__ .beforeCreate = beforeCreate ? [].concat(beforeCreate, styleFn) : [styleFn]
138165 })()
139166 `
140167 }
141168 }
142169 }
143170
144- const base64Map = Buffer . from ( JSON . stringify ( map ) ) . toString ( 'base64' )
145- output += `//# sourceMappingURL=data:application/json;charset=utf-8;base64,${ base64Map } `
171+ if ( map ) {
172+ output += '\n' + convertSourceMap . fromJSON ( map . toString ( ) ) . toComment ( )
173+ }
146174
147- return { code : output }
175+ return { code : output , map }
148176}
0 commit comments