1
- const vueCompiler = require ( 'vue-template-compiler' )
2
- const compileTemplate = require ( './template-compiler' )
1
+ const VueTemplateCompiler = require ( 'vue-template-compiler' )
3
2
const generateSourceMap = require ( './generate-source-map' )
4
3
const addTemplateMapping = require ( './add-template-mapping' )
5
4
const compileTypescript = require ( './compilers/typescript-compiler' )
@@ -12,6 +11,10 @@ const join = path.join
12
11
const logger = require ( './logger' )
13
12
const splitRE = / \r ? \n / g
14
13
const 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' )
15
18
16
19
function processScript ( scriptPart , filePath , config ) {
17
20
if ( ! scriptPart ) {
@@ -31,32 +34,44 @@ function processScript(scriptPart, filePath, config) {
31
34
32
35
module . exports = function ( src , filePath , config ) {
33
36
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
36
43
let sourceMapPath = filePath
37
44
38
45
if ( parts . script && parts . script . src ) {
39
46
const externalScrPath = join ( filePath , '..' , parts . script . src )
40
47
41
48
parts . script . content = fs . readFileSync ( externalScrPath , 'utf8' )
42
- scriptSrc = parts . script . content
49
+ scriptSrcContent = parts . script . content
43
50
sourceMapPath = externalScrPath
44
51
}
45
52
46
53
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
+ )
48
59
const inputMap = result . map
49
60
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])`
60
75
61
76
if ( parts . template ) {
62
77
parts . template . filename = filePath
@@ -65,24 +80,36 @@ module.exports = function(src, filePath, config) {
65
80
parts . template . content = fs . readFileSync ( parts . template . filename , 'utf8' )
66
81
}
67
82
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
+ }
69
98
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
+ `
77
104
78
105
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'
81
108
}
82
109
83
110
if ( map ) {
84
111
const beforeLines = output . split ( splitRE ) . length
85
- addTemplateMapping ( script , parts , output , map , beforeLines )
112
+ addTemplateMapping ( compiledScriptContent , parts , output , map , beforeLines )
86
113
}
87
114
}
88
115
@@ -118,12 +145,12 @@ module.exports = function(src, filePath, config) {
118
145
. join ( '' )
119
146
120
147
if ( styleStr . length !== 0 ) {
121
- if ( parts . template . attrs . functional ) {
148
+ if ( parts . template && parts . template . attrs . functional ) {
122
149
output += `
123
150
;(function() {
124
- var originalRender = __vue__options__ .render
151
+ var originalRender = __options__ .render
125
152
var styleFn = function () { ${ styleStr } }
126
- __vue__options__ .render = function renderWithStyleInjection (h, context) {
153
+ __options__ .render = function renderWithStyleInjection (h, context) {
127
154
styleFn.call(context)
128
155
return originalRender(h, context)
129
156
}
@@ -132,17 +159,18 @@ module.exports = function(src, filePath, config) {
132
159
} else {
133
160
output += `
134
161
;(function() {
135
- var beforeCreate = __vue__options__ .beforeCreate
162
+ var beforeCreate = __options__ .beforeCreate
136
163
var styleFn = function () { ${ styleStr } }
137
- __vue__options__ .beforeCreate = beforeCreate ? [].concat(beforeCreate, styleFn) : [styleFn]
164
+ __options__ .beforeCreate = beforeCreate ? [].concat(beforeCreate, styleFn) : [styleFn]
138
165
})()
139
166
`
140
167
}
141
168
}
142
169
}
143
170
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
+ }
146
174
147
- return { code : output }
175
+ return { code : output , map }
148
176
}
0 commit comments