Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Appearance settings

Commit 77ed857

Browse filesBrowse files
authored
fix: map render function to template (vuejs#152)
1 parent 379490f commit 77ed857
Copy full SHA for 77ed857

File tree

Expand file treeCollapse file tree

9 files changed

+330
-339
lines changed
Filter options
Expand file treeCollapse file tree

9 files changed

+330
-339
lines changed

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

Copy file name to clipboardExpand all lines: e2e/__projects__/basic/__snapshots__/test.js.snap
+8-10Lines changed: 8 additions & 10 deletions
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

Copy file name to clipboardExpand all lines: lib/add-template-mapping.js
-26Lines changed: 0 additions & 26 deletions
This file was deleted.

‎lib/coffee-transformer.js

Copy file name to clipboard
+26Lines changed: 26 additions & 0 deletions
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

Copy file name to clipboardExpand all lines: lib/compilers/coffee-compiler.js
-24Lines changed: 0 additions & 24 deletions
This file was deleted.

‎lib/compilers/typescript-compiler.js

Copy file name to clipboardExpand all lines: lib/compilers/typescript-compiler.js
-44Lines changed: 0 additions & 44 deletions
This file was deleted.

‎lib/generate-code.js

Copy file name to clipboard
+83Lines changed: 83 additions & 0 deletions
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

Copy file name to clipboardExpand all lines: lib/generate-source-map.js
+59-29Lines changed: 59 additions & 29 deletions
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 (0)
Morty Proxy This is a proxified and sanitized view of the page, visit original site.