Skip to content

Commit 0672a80

Browse files
committed
Rewrite code generation using SourceMaps
1 parent 75aee31 commit 0672a80

File tree

5 files changed

+99
-135
lines changed

5 files changed

+99
-135
lines changed

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

Lines changed: 2 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,6 @@ var _default = {
3131
}
3232
};
3333
exports[\\"default\\"] = _default;
34-
;
3534
\\"use strict\\";
3635
Object.defineProperty(exports, \\"__esModule\\", { value: true });
3736
var vue_1 = require(\\"vue\\");
@@ -42,9 +41,7 @@ function render(_ctx, _cache) {
4241
]));
4342
}
4443
exports.render = render;
45-
;
46-
;exports.default = {...exports.default, render};
47-
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIkJhc2ljLnZ1ZSJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFIQTtBQUtBO0FBUEE7QUFTQTtBQUNBO0FBQ0E7QUFDQTtBQUZBO0FBSUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUhBO0FBakJBIiwic291cmNlc0NvbnRlbnQiOlsiPHRlbXBsYXRlPlxuICA8ZGl2IGNsYXNzPVwiaGVsbG9cIj5cbiAgICA8aDEgOmNsYXNzPVwiaGVhZGluZ0NsYXNzZXNcIj57eyBtc2cgfX08L2gxPlxuICA8L2Rpdj5cbjwvdGVtcGxhdGU+XG5cbjxzdHlsZSBtb2R1bGU9XCJjc3NcIj5cbi50ZXN0QSB7XG4gIGJhY2tncm91bmQtY29sb3I6IHJlZDtcbn1cbjwvc3R5bGU+XG48c3R5bGUgbW9kdWxlPlxuLnRlc3RCIHtcbiAgYmFja2dyb3VuZC1jb2xvcjogYmx1ZTtcbn1cbjwvc3R5bGU+XG48c3R5bGU+XG4udGVzdEMge1xuICBiYWNrZ3JvdW5kLWNvbG9yOiBibHVlO1xufVxuPC9zdHlsZT5cblxuPHNjcmlwdD5cbmV4cG9ydCBkZWZhdWx0IHtcbiAgbmFtZTogJ2Jhc2ljJyxcbiAgY29tcHV0ZWQ6IHtcbiAgICBoZWFkaW5nQ2xhc3NlczogZnVuY3Rpb24gaGVhZGluZ0NsYXNzZXMoKSB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICByZWQ6IHRoaXMuaXNDcmF6eSxcbiAgICAgICAgYmx1ZTogIXRoaXMuaXNDcmF6eSxcbiAgICAgICAgc2hhZG93OiB0aGlzLmlzQ3JhenlcbiAgICAgIH1cbiAgICB9XG4gIH0sXG4gIGRhdGE6IGZ1bmN0aW9uIGRhdGEoKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIG1zZzogJ1dlbGNvbWUgdG8gWW91ciBWdWUuanMgQXBwJyxcbiAgICAgIGlzQ3Jhenk6IGZhbHNlXG4gICAgfVxuICB9LFxuICBtZXRob2RzOiB7XG4gICAgdG9nZ2xlQ2xhc3M6IGZ1bmN0aW9uIHRvZ2dsZUNsYXNzKCkge1xuICAgICAgdGhpcy5pc0NyYXp5ID0gIXRoaXMuaXNDcmF6eVxuICAgIH1cbiAgfVxufVxuPC9zY3JpcHQ+XG4iXX0="
44+
;exports.default = {...exports.default, render};"
4845
`;
4946
5047
exports[`generates source maps using src attributes 1`] = `
@@ -78,7 +75,6 @@ var _default = {
7875
}
7976
};
8077
exports[\\"default\\"] = _default;
81-
;
8278
\\"use strict\\";
8379
Object.defineProperty(exports, \\"__esModule\\", { value: true });
8480
var vue_1 = require(\\"vue\\");
@@ -89,7 +85,5 @@ function render(_ctx, _cache) {
8985
]));
9086
}
9187
exports.render = render;
92-
;
93-
;exports.default = {...exports.default, render};
94-
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIlNvdXJjZU1hcHNTcmMudnVlIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUhBO0FBS0E7QUFQQTtBQVNBO0FBQ0E7QUFDQTtBQUNBO0FBRkE7QUFJQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBSEE7QUFqQkEiLCJzb3VyY2VzQ29udGVudCI6WyJleHBvcnQgZGVmYXVsdCB7XG4gIG5hbWU6ICdiYXNpYycsXG4gIGNvbXB1dGVkOiB7XG4gICAgaGVhZGluZ0NsYXNzZXM6IGZ1bmN0aW9uIGhlYWRpbmdDbGFzc2VzKCkge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgcmVkOiB0aGlzLmlzQ3JhenksXG4gICAgICAgIGJsdWU6ICF0aGlzLmlzQ3JhenksXG4gICAgICAgIHNoYWRvdzogdGhpcy5pc0NyYXp5XG4gICAgICB9XG4gICAgfVxuICB9LFxuICBkYXRhOiBmdW5jdGlvbiBkYXRhKCkge1xuICAgIHJldHVybiB7XG4gICAgICBtc2c6ICdXZWxjb21lIHRvIFlvdXIgVnVlLmpzIEFwcCcsXG4gICAgICBpc0NyYXp5OiBmYWxzZVxuICAgIH1cbiAgfSxcbiAgbWV0aG9kczoge1xuICAgIHRvZ2dsZUNsYXNzOiBmdW5jdGlvbiB0b2dnbGVDbGFzcygpIHtcbiAgICAgIHRoaXMuaXNDcmF6eSA9ICF0aGlzLmlzQ3JhenlcbiAgICB9XG4gIH1cbn1cbiJdfQ=="
88+
;exports.default = {...exports.default, render};"
9589
`;

lib/generate-code.js

Lines changed: 29 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -1,31 +1,37 @@
1-
module.exports = function generateCode(
2-
{ scriptResult, scriptSetupResult },
3-
templateResult,
4-
stylesResult,
5-
customBlocksResult,
6-
isFunctional
7-
) {
8-
let output = ''
1+
const { SourceNode, SourceMapConsumer } = require('source-map')
92

10-
if (scriptResult) {
11-
output += `${scriptResult.code};\n`
3+
function addToSourceMap(node, result) {
4+
if (result && result.code) {
5+
if (result.map) {
6+
node.add(
7+
SourceNode.fromStringWithSourceMap(
8+
result.code,
9+
new SourceMapConsumer(result.map)
10+
)
11+
)
12+
} else {
13+
node.add(result.code)
14+
}
1215
}
16+
}
1317

14-
if (scriptSetupResult) {
15-
output += `${scriptSetupResult.code};\n`
16-
}
18+
module.exports = function generateCode(
19+
scriptResult,
20+
scriptSetupResult,
21+
templateResult,
22+
filename
23+
) {
24+
var node = new SourceNode(null, null, null)
25+
addToSourceMap(node, scriptResult)
26+
addToSourceMap(node, scriptSetupResult)
27+
addToSourceMap(node, templateResult)
1728

18-
if (templateResult) {
19-
output += `${templateResult.code};\n`
20-
}
29+
var tempOutput = node.toString()
2130

22-
if (output.includes('exports.render = render;')) {
23-
output += ';exports.default = {...exports.default, render};'
31+
if (tempOutput.includes('exports.render = render;')) {
32+
node.add(';exports.default = {...exports.default, render};')
2433
} else {
25-
output += ';exports.default = {...exports.default};'
26-
}
27-
28-
return {
29-
code: output
34+
node.add(';exports.default = {...exports.default};')
3035
}
36+
return node.toStringWithSourceMap({ file: filename })
3137
}

lib/generate-source-map.js

Lines changed: 0 additions & 69 deletions
This file was deleted.

lib/map-lines.js

Lines changed: 55 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,55 @@
1+
const { SourceMapGenerator, SourceMapConsumer } = require('source-map')
2+
3+
// based on @vue/compiler-sfc mapLines
4+
module.exports = function mapLines(oldMap, newMap) {
5+
if (!oldMap) return newMap
6+
if (!newMap) return oldMap
7+
8+
const oldMapConsumer = new SourceMapConsumer(oldMap)
9+
const newMapConsumer = new SourceMapConsumer(newMap)
10+
const mergedMapGenerator = new SourceMapGenerator()
11+
12+
newMapConsumer.eachMapping(m => {
13+
if (m.originalLine == null) {
14+
return
15+
}
16+
17+
const origPosInOldMap = oldMapConsumer.originalPositionFor({
18+
line: m.originalLine,
19+
column: m.originalColumn
20+
})
21+
22+
if (origPosInOldMap.source == null) {
23+
return
24+
}
25+
26+
mergedMapGenerator.addMapping({
27+
generated: {
28+
line: m.generatedLine,
29+
column: m.generatedColumn
30+
},
31+
original: {
32+
line: origPosInOldMap.line, // map line
33+
// use current column, since the oldMap produced by @vue/compiler-sfc
34+
// does not
35+
column: m.originalColumn
36+
},
37+
source: origPosInOldMap.source,
38+
name: origPosInOldMap.name
39+
})
40+
})
41+
42+
// source-map's type definition is incomplete
43+
const generator = mergedMapGenerator
44+
oldMapConsumer.sources.forEach(sourceFile => {
45+
generator._sources.add(sourceFile)
46+
const sourceContent = oldMapConsumer.sourceContentFor(sourceFile)
47+
if (sourceContent != null) {
48+
mergedMapGenerator.setSourceContent(sourceFile, sourceContent)
49+
}
50+
})
51+
52+
generator._sourceRoot = oldMap.sourceRoot
53+
generator._file = oldMap.file
54+
return generator.toJSON()
55+
}

lib/process.js

Lines changed: 13 additions & 35 deletions
Original file line numberDiff line numberDiff line change
@@ -1,22 +1,19 @@
11
const { parse, compileTemplate, compileScript } = require('@vue/compiler-sfc')
22
const { transform } = require('@babel/core')
3-
const convertSourceMap = require('convert-source-map')
43
const babelTransformer = require('babel-jest')
54

6-
const generateSourceMap = require('./generate-source-map')
75
const typescriptTransformer = require('./transformers/typescript')
86
const coffeescriptTransformer = require('./transformers/coffee')
9-
const _processStyle = require('./process-style')
10-
const processCustomBlocks = require('./process-custom-blocks')
7+
// const _processStyle = require('./process-style')
8+
// const processCustomBlocks = require('./process-custom-blocks')
119
const getVueJestConfig = require('./utils').getVueJestConfig
1210
const getTsJestConfig = require('./utils').getTsJestConfig
1311
const logResultErrors = require('./utils').logResultErrors
1412
const stripInlineSourceMap = require('./utils').stripInlineSourceMap
1513
const getCustomTransformer = require('./utils').getCustomTransformer
1614
const loadSrc = require('./utils').loadSrc
1715
const generateCode = require('./generate-code')
18-
19-
const splitRE = /\r?\n/g
16+
const mapLines = require('./map-lines')
2017

2118
function resolveTransformer(lang = 'js', vueJestConfig) {
2219
const transformer = getCustomTransformer(vueJestConfig['transform'], lang)
@@ -45,6 +42,7 @@ function processScript(scriptPart, filePath, config) {
4542

4643
const result = transformer.process(scriptPart.content, filePath, config)
4744
result.code = stripInlineSourceMap(result.code)
45+
result.map = mapLines(scriptPart.map, result.map)
4846
result.externalSrc = externalSrc
4947
return result
5048
}
@@ -61,7 +59,6 @@ function processScriptSetup(descriptor, filePath, config) {
6159
)
6260

6361
const result = transformer.process(content.content, filePath, config)
64-
result.code = stripInlineSourceMap(result.code)
6562
return result
6663
}
6764

@@ -114,6 +111,7 @@ function processTemplate(descriptor, filename, config) {
114111
}
115112
}
116113

114+
/*
117115
function processStyle(styles, filename, config) {
118116
if (!styles) {
119117
return null
@@ -128,51 +126,31 @@ function processStyle(styles, filename, config) {
128126
129127
return filteredStyles.length ? filteredStyles : null
130128
}
129+
*/
131130

132131
module.exports = function(src, filename, config) {
133-
const { descriptor } = parse(src)
132+
const { descriptor } = parse(src, { filename })
134133

135134
const templateResult = processTemplate(descriptor, filename, config)
136135
const scriptResult = processScript(descriptor.script, filename, config)
137136
const scriptSetupResult = processScriptSetup(descriptor, filename, config)
137+
/*
138138
const stylesResult = processStyle(descriptor.styles, filename, config)
139139
const customBlocksResult = processCustomBlocks(
140140
descriptor.customBlocks,
141141
filename,
142142
config
143143
)
144-
145-
const isFunctional =
146-
descriptor.template &&
147-
descriptor.template.attrs &&
148-
descriptor.template.attrs.functional
149-
150-
const templateStart = descriptor.template && descriptor.template.start
151-
const templateLine = src.slice(0, templateStart).split(splitRE).length
152-
144+
*/
153145
const output = generateCode(
154-
{ scriptResult, scriptSetupResult },
155-
templateResult,
156-
stylesResult,
157-
customBlocksResult,
158-
isFunctional
159-
)
160-
161-
const map = generateSourceMap(
162146
scriptResult,
163-
src,
164-
filename,
165-
output.renderFnStartLine,
166-
output.renderFnEndLine,
167-
templateLine
147+
scriptSetupResult,
148+
templateResult,
149+
filename
168150
)
169151

170-
if (map) {
171-
output.code += '\n' + convertSourceMap.fromJSON(map.toString()).toComment()
172-
}
173-
174152
return {
175153
code: output.code,
176-
map: map && map.toJSON()
154+
map: output.map.toString()
177155
}
178156
}

0 commit comments

Comments
 (0)