Skip to content

Commit 77ed857

Browse files
authored
fix: map render function to template (#152)
1 parent 379490f commit 77ed857

9 files changed

+330
-339
lines changed

e2e/__projects__/basic/__snapshots__/test.js.snap

+8-10
Original file line numberDiff line numberDiff line change
@@ -54,13 +54,12 @@ var _default = {
5454
};
5555
exports.default = _default;
5656
;
57-
var __options__ = typeof exports.default === 'function'
58-
? exports.default.options
59-
: exports.default
57+
var __options__ = typeof exports.default === 'function' ? exports.default.options : exports.default
6058
var render = function() {
6159
var _vm = this
6260
var _h = _vm.$createElement
63-
var _c = _vm._self._c || _h
61+
/* istanbul ignore next */
62+
var _c = _vm._self._c || _h
6463
return _c(\\"div\\", { staticClass: \\"hello\\" }, [
6564
_c(\\"h1\\", { class: _vm.headingClasses }, [_vm._v(_vm._s(_vm.msg))])
6665
])
@@ -86,7 +85,7 @@ this['$style'], {\\"testB\\":\\"testB\\"});
8685
__options__.beforeCreate = beforeCreate ? [].concat(beforeCreate, styleFn) : [styleFn]
8786
})()
8887
89-
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIkJhc2ljLnZ1ZSJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUhBO0FBS0E7QUFQQTtBQVNBO0FBQ0E7QUFDQTtBQUNBO0FBRkE7QUFJQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBSEE7QUFqQkEiLCJzb3VyY2VzQ29udGVudCI6WyI8dGVtcGxhdGU+XG4gIDxkaXYgY2xhc3M9XCJoZWxsb1wiPlxuICAgIDxoMSA6Y2xhc3M9XCJoZWFkaW5nQ2xhc3Nlc1wiPnt7IG1zZyB9fTwvaDE+XG4gIDwvZGl2PlxuPC90ZW1wbGF0ZT5cblxuPHN0eWxlIG1vZHVsZT1cImNzc1wiPlxuLnRlc3RBIHtcbiAgYmFja2dyb3VuZC1jb2xvcjogcmVkO1xufVxuPC9zdHlsZT5cbjxzdHlsZSBtb2R1bGU+XG4udGVzdEIge1xuICBiYWNrZ3JvdW5kLWNvbG9yOiBibHVlO1xufVxuPC9zdHlsZT5cbjxzdHlsZT5cbi50ZXN0QyB7XG4gIGJhY2tncm91bmQtY29sb3I6IGJsdWU7XG59XG48L3N0eWxlPlxuXG48c2NyaXB0PlxuZXhwb3J0IGRlZmF1bHQge1xuICBuYW1lOiAnYmFzaWMnLFxuICBjb21wdXRlZDoge1xuICAgIGhlYWRpbmdDbGFzc2VzOiBmdW5jdGlvbiBoZWFkaW5nQ2xhc3NlcygpIHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIHJlZDogdGhpcy5pc0NyYXp5LFxuICAgICAgICBibHVlOiAhdGhpcy5pc0NyYXp5LFxuICAgICAgICBzaGFkb3c6IHRoaXMuaXNDcmF6eVxuICAgICAgfVxuICAgIH1cbiAgfSxcbiAgZGF0YTogZnVuY3Rpb24gZGF0YSgpIHtcbiAgICByZXR1cm4ge1xuICAgICAgbXNnOiAnV2VsY29tZSB0byBZb3VyIFZ1ZS5qcyBBcHAnLFxuICAgICAgaXNDcmF6eTogZmFsc2VcbiAgICB9XG4gIH0sXG4gIG1ldGhvZHM6IHtcbiAgICB0b2dnbGVDbGFzczogZnVuY3Rpb24gdG9nZ2xlQ2xhc3MoKSB7XG4gICAgICB0aGlzLmlzQ3JhenkgPSAhdGhpcy5pc0NyYXp5XG4gICAgfVxuICB9XG59XG48L3NjcmlwdD5cbiJdfQ=="
88+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIkJhc2ljLnZ1ZSJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUhBO0FBS0E7QUFQQTtBQVNBO0FBQ0E7QUFDQTtBQUNBO0FBRkE7QUFJQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBSEE7QUFqQkE7Ozs7QUF2QkE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBIiwic291cmNlc0NvbnRlbnQiOlsiPHRlbXBsYXRlPlxuICA8ZGl2IGNsYXNzPVwiaGVsbG9cIj5cbiAgICA8aDEgOmNsYXNzPVwiaGVhZGluZ0NsYXNzZXNcIj57eyBtc2cgfX08L2gxPlxuICA8L2Rpdj5cbjwvdGVtcGxhdGU+XG5cbjxzdHlsZSBtb2R1bGU9XCJjc3NcIj5cbi50ZXN0QSB7XG4gIGJhY2tncm91bmQtY29sb3I6IHJlZDtcbn1cbjwvc3R5bGU+XG48c3R5bGUgbW9kdWxlPlxuLnRlc3RCIHtcbiAgYmFja2dyb3VuZC1jb2xvcjogYmx1ZTtcbn1cbjwvc3R5bGU+XG48c3R5bGU+XG4udGVzdEMge1xuICBiYWNrZ3JvdW5kLWNvbG9yOiBibHVlO1xufVxuPC9zdHlsZT5cblxuPHNjcmlwdD5cbmV4cG9ydCBkZWZhdWx0IHtcbiAgbmFtZTogJ2Jhc2ljJyxcbiAgY29tcHV0ZWQ6IHtcbiAgICBoZWFkaW5nQ2xhc3NlczogZnVuY3Rpb24gaGVhZGluZ0NsYXNzZXMoKSB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICByZWQ6IHRoaXMuaXNDcmF6eSxcbiAgICAgICAgYmx1ZTogIXRoaXMuaXNDcmF6eSxcbiAgICAgICAgc2hhZG93OiB0aGlzLmlzQ3JhenlcbiAgICAgIH1cbiAgICB9XG4gIH0sXG4gIGRhdGE6IGZ1bmN0aW9uIGRhdGEoKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIG1zZzogJ1dlbGNvbWUgdG8gWW91ciBWdWUuanMgQXBwJyxcbiAgICAgIGlzQ3Jhenk6IGZhbHNlXG4gICAgfVxuICB9LFxuICBtZXRob2RzOiB7XG4gICAgdG9nZ2xlQ2xhc3M6IGZ1bmN0aW9uIHRvZ2dsZUNsYXNzKCkge1xuICAgICAgdGhpcy5pc0NyYXp5ID0gIXRoaXMuaXNDcmF6eVxuICAgIH1cbiAgfVxufVxuPC9zY3JpcHQ+XG4iXX0="
9089
`;
9190

9291
exports[`generates source maps using src attributes 1`] = `
@@ -121,13 +120,12 @@ var _default = {
121120
};
122121
exports.default = _default;
123122
;
124-
var __options__ = typeof exports.default === 'function'
125-
? exports.default.options
126-
: exports.default
123+
var __options__ = typeof exports.default === 'function' ? exports.default.options : exports.default
127124
var render = function() {
128125
var _vm = this
129126
var _h = _vm.$createElement
130-
var _c = _vm._self._c || _h
127+
/* istanbul ignore next */
128+
var _c = _vm._self._c || _h
131129
return _c(\\"div\\", { staticClass: \\"hello\\" }, [
132130
_c(\\"h1\\", { class: _vm.headingClasses }, [_vm._v(_vm._s(_vm.msg))])
133131
])
@@ -138,5 +136,5 @@ render._withStripped = true
138136
__options__.render = render
139137
__options__.staticRenderFns = staticRenderFns
140138
141-
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIkJhc2ljU3JjLmpzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUhBO0FBS0E7QUFQQTtBQVNBO0FBQ0E7QUFDQTtBQUNBO0FBRkE7QUFJQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBSEE7QUFqQkEiLCJzb3VyY2VzQ29udGVudCI6WyJleHBvcnQgZGVmYXVsdCB7XG4gIG5hbWU6ICdiYXNpYycsXG4gIGNvbXB1dGVkOiB7XG4gICAgaGVhZGluZ0NsYXNzZXM6IGZ1bmN0aW9uIGhlYWRpbmdDbGFzc2VzKCkge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgcmVkOiB0aGlzLmlzQ3JhenksXG4gICAgICAgIGJsdWU6ICF0aGlzLmlzQ3JhenksXG4gICAgICAgIHNoYWRvdzogdGhpcy5pc0NyYXp5XG4gICAgICB9XG4gICAgfVxuICB9LFxuICBkYXRhOiBmdW5jdGlvbiBkYXRhKCkge1xuICAgIHJldHVybiB7XG4gICAgICBtc2c6ICdXZWxjb21lIHRvIFlvdXIgVnVlLmpzIEFwcCcsXG4gICAgICBpc0NyYXp5OiBmYWxzZVxuICAgIH1cbiAgfSxcbiAgbWV0aG9kczoge1xuICAgIHRvZ2dsZUNsYXNzOiBmdW5jdGlvbiB0b2dnbGVDbGFzcygpIHtcbiAgICAgIHRoaXMuaXNDcmF6eSA9ICF0aGlzLmlzQ3JhenlcbiAgICB9XG4gIH1cbn1cbiJdfQ=="
139+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIlNvdXJjZU1hcHNTcmMudnVlIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUhBO0FBS0E7QUFQQTtBQVNBO0FBQ0E7QUFDQTtBQUNBO0FBRkE7QUFJQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBSEE7QUFqQkEiLCJzb3VyY2VzQ29udGVudCI6WyJleHBvcnQgZGVmYXVsdCB7XG4gIG5hbWU6ICdiYXNpYycsXG4gIGNvbXB1dGVkOiB7XG4gICAgaGVhZGluZ0NsYXNzZXM6IGZ1bmN0aW9uIGhlYWRpbmdDbGFzc2VzKCkge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgcmVkOiB0aGlzLmlzQ3JhenksXG4gICAgICAgIGJsdWU6ICF0aGlzLmlzQ3JhenksXG4gICAgICAgIHNoYWRvdzogdGhpcy5pc0NyYXp5XG4gICAgICB9XG4gICAgfVxuICB9LFxuICBkYXRhOiBmdW5jdGlvbiBkYXRhKCkge1xuICAgIHJldHVybiB7XG4gICAgICBtc2c6ICdXZWxjb21lIHRvIFlvdXIgVnVlLmpzIEFwcCcsXG4gICAgICBpc0NyYXp5OiBmYWxzZVxuICAgIH1cbiAgfSxcbiAgbWV0aG9kczoge1xuICAgIHRvZ2dsZUNsYXNzOiBmdW5jdGlvbiB0b2dnbGVDbGFzcygpIHtcbiAgICAgIHRoaXMuaXNDcmF6eSA9ICF0aGlzLmlzQ3JhenlcbiAgICB9XG4gIH1cbn1cbiJdfQ=="
142140
`;

lib/add-template-mapping.js

-26
This file was deleted.

lib/coffee-transformer.js

+26
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
const ensureRequire = require('./ensure-require.js')
2+
const throwError = require('./utils').throwError
3+
const getBabelOptions = require('./utils').getBabelOptions
4+
5+
module.exports = {
6+
process(src, filename, config) {
7+
ensureRequire('coffee', ['coffeescript'])
8+
const coffee = require('coffeescript')
9+
const babelOptions = getBabelOptions(filename)
10+
let compiled
11+
try {
12+
compiled = coffee.compile(src, {
13+
filename,
14+
bare: true,
15+
sourceMap: true,
16+
transpile: babelOptions
17+
})
18+
} catch (err) {
19+
throwError(err)
20+
}
21+
return {
22+
code: compiled.js,
23+
map: compiled.v3SourceMap
24+
}
25+
}
26+
}

lib/compilers/coffee-compiler.js

-24
This file was deleted.

lib/compilers/typescript-compiler.js

-44
This file was deleted.

lib/generate-code.js

+83
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,83 @@
1+
const splitRE = /\r?\n/g
2+
3+
module.exports = function generateCode(
4+
scriptResult,
5+
templateResult,
6+
stylesResult,
7+
isFunctional
8+
) {
9+
let output = ''
10+
let renderFnStartLine
11+
let renderFnEndLine
12+
13+
if (scriptResult) {
14+
output += `${scriptResult.code};\n`
15+
} else {
16+
output +=
17+
`Object.defineProperty(exports, "__esModule", {\n` +
18+
` value: true\n` +
19+
`});\n` +
20+
'module.exports.default = {};\n'
21+
}
22+
23+
output +=
24+
`var __options__ = typeof exports.default === 'function' ` +
25+
`? exports.default.options ` +
26+
`: exports.default\n`
27+
28+
if (templateResult) {
29+
renderFnStartLine = output.split(splitRE).length
30+
templateResult.code = templateResult.code.replace(
31+
'var _c = _vm._self._c || _h',
32+
'/* istanbul ignore next */\nvar _c = _vm._self._c || _h'
33+
)
34+
output += `${templateResult.code}\n`
35+
36+
renderFnEndLine = output.split(splitRE).length
37+
38+
output +=
39+
`__options__.render = render\n` +
40+
`__options__.staticRenderFns = staticRenderFns\n`
41+
42+
if (isFunctional) {
43+
output += '__options__.functional = true\n'
44+
output += '__options__._compiled = true\n'
45+
}
46+
}
47+
48+
if (stylesResult) {
49+
const styleStr = stylesResult
50+
.map(
51+
({ code, moduleName }) =>
52+
`if(!this['${moduleName}']) {\n` +
53+
` this['${moduleName}'] = {};\n` +
54+
`}\n` +
55+
`this['${moduleName}'] = Object.assign(\n` +
56+
`this['${moduleName}'], ${code});\n`
57+
)
58+
.join('')
59+
if (isFunctional) {
60+
output +=
61+
`;(function() {\n` +
62+
` var originalRender = __options__.render\n` +
63+
` var styleFn = function () { ${styleStr} }\n` +
64+
` __options__.render = function renderWithStyleInjection (h, context) {\n` +
65+
` styleFn.call(context)\n` +
66+
` return originalRender(h, context)\n` +
67+
` }\n` +
68+
`})()\n`
69+
} else {
70+
output +=
71+
`;(function() {\n` +
72+
` var beforeCreate = __options__.beforeCreate\n` +
73+
` var styleFn = function () { ${styleStr} }\n` +
74+
` __options__.beforeCreate = beforeCreate ? [].concat(beforeCreate, styleFn) : [styleFn]\n` +
75+
`})()\n`
76+
}
77+
}
78+
return {
79+
code: output,
80+
renderFnStartLine,
81+
renderFnEndLine
82+
}
83+
}

lib/generate-source-map.js

+59-29
Original file line numberDiff line numberDiff line change
@@ -3,37 +3,67 @@ const sourceMap = require('source-map')
33
const splitRE = /\r?\n/g
44

55
module.exports = function generateSourceMap(
6-
script,
7-
filePath,
8-
content,
9-
inputMap
6+
scriptResult,
7+
src,
8+
filename,
9+
renderFnStartLine,
10+
renderFnEndLine,
11+
templateLine
1012
) {
11-
const filename = path.basename(filePath)
12-
13+
const file = path.basename(filename)
1314
const map = new sourceMap.SourceMapGenerator()
1415

15-
map.setSourceContent(filename, content)
16-
// check input source map from babel/coffee etc
17-
let inputMapConsumer = inputMap && new sourceMap.SourceMapConsumer(inputMap)
18-
script.split(splitRE).forEach(function(line, index) {
19-
let ln = index + 1
20-
let originalLine = inputMapConsumer
21-
? inputMapConsumer.originalPositionFor({ line: ln, column: 0 }).line
22-
: ln
23-
if (originalLine) {
24-
map.addMapping({
25-
source: filename,
26-
generated: {
27-
line: ln,
28-
column: 0
29-
},
30-
original: {
31-
line: originalLine,
32-
column: 0
33-
}
34-
})
35-
}
36-
})
37-
map._filename = filename
16+
const scriptFromExternalSrc = scriptResult && scriptResult.externalSrc
17+
18+
// If script uses external file for content (using the src attribute) then
19+
// map result to this file, instead of original.
20+
const srcContent = scriptFromExternalSrc ? scriptResult.externalSrc : src
21+
22+
map.setSourceContent(file, srcContent)
23+
if (scriptResult) {
24+
let inputMapConsumer =
25+
scriptResult.map && new sourceMap.SourceMapConsumer(scriptResult.map)
26+
scriptResult.code.split(splitRE).forEach(function(line, index) {
27+
let ln = index + 1
28+
let originalLine = inputMapConsumer
29+
? inputMapConsumer.originalPositionFor({ line: ln, column: 0 }).line
30+
: ln
31+
if (originalLine) {
32+
map.addMapping({
33+
source: file,
34+
generated: {
35+
line: ln,
36+
column: 0
37+
},
38+
original: {
39+
line: originalLine,
40+
column: 0
41+
}
42+
})
43+
}
44+
})
45+
}
46+
47+
// If script is from external src then the source map will only show the
48+
// script section. We won't map the generated render function to this file,
49+
// because the coverage report would be confusing
50+
if (scriptFromExternalSrc) {
51+
return map
52+
}
53+
54+
for (; renderFnStartLine < renderFnEndLine; renderFnStartLine++) {
55+
map.addMapping({
56+
source: file,
57+
generated: {
58+
line: renderFnStartLine,
59+
column: 0
60+
},
61+
original: {
62+
line: templateLine,
63+
column: 0
64+
}
65+
})
66+
}
67+
3868
return map
3969
}

0 commit comments

Comments
 (0)