Skip to content
This repository was archived by the owner on Dec 26, 2018. It is now read-only.

Commit beedf57

Browse files
committed
add source map support
1 parent a916805 commit beedf57

File tree

6 files changed

+87
-13
lines changed

6 files changed

+87
-13
lines changed

index.js

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,9 @@ compiler.loadConfig({
88
module.exports = function vueify (file, options) {
99
if (!/.vue$/.test(file)) return through()
1010
compiler.applyConfig(options)
11+
compiler.applyConfig({
12+
sourceMap: options._flags.debug
13+
})
1114

1215
var data = ''
1316
var stream = through(write, end)

lib/compiler.js

Lines changed: 60 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -5,25 +5,28 @@ var hash = require('hash-sum')
55
var assign = require('object-assign')
66
var Emitter = require('events').EventEmitter
77
var vueCompiler = require('vue-template-compiler')
8+
var sourceMap = require('source-map')
9+
var convert = require('convert-source-map')
810

911
var genId = require('./gen-id')
1012
var normalize = require('./normalize')
1113
var compilers = require('./compilers')
1214
var rewriteStyle = require('./style-rewriter')
1315

16+
// determine dynamic script paths
17+
var hotReloadAPIPath = 'vue-hot-reload-api' //normalize.dep('vue-hot-reload-api')
18+
var insertCSSPath = normalize.lib('insert-css')
19+
1420
var hasBabel = true
1521
try {
1622
require('babel-core')
1723
} catch (e) {
1824
hasBabel = false
1925
}
2026

27+
var splitRE = /\r?\n/g
2128
var resolvedPartsCache = Object.create(null)
2229

23-
// determine dynamic script paths
24-
var hotReloadAPIPath = 'vue-hot-reload-api' //normalize.dep('vue-hot-reload-api')
25-
var insertCSSPath = normalize.lib('insert-css')
26-
2730
// expose compiler
2831
var compiler = module.exports = new Emitter()
2932
compiler.setMaxListeners(Infinity)
@@ -90,6 +93,7 @@ compiler.compile = function (content, filePath, cb) {
9093
var templateChanged = resolvedParts.template !== prevParts.template
9194

9295
var output = ''
96+
var map = null
9397
// styles
9498
var style = resolvedParts.styles.join('\n')
9599
if (style) {
@@ -107,8 +111,11 @@ compiler.compile = function (content, filePath, cb) {
107111
// script
108112
var script = resolvedParts.script
109113
if (script) {
114+
if (options.sourceMap) {
115+
map = generateSourceMap(script, output)
116+
}
110117
output +=
111-
';(function(){' + script + '})()\n' +
118+
';(function(){\n' + script + '\n})()\n' +
112119
// babel 6 compat
113120
'if (module.exports.__esModule) module.exports = module.exports.default\n'
114121
}
@@ -153,8 +160,46 @@ compiler.compile = function (content, filePath, cb) {
153160
' }\n' +
154161
'})()}'
155162
}
163+
if (map) {
164+
output += '\n' + convert.fromJSON(map.toString()).toComment()
165+
}
156166
cb(null, output)
157167
}
168+
169+
function generateSourceMap (script, output) {
170+
// hot-reload source map busting
171+
var hashedFilename = path.basename(filePath) + '?' + hash(filePath + content)
172+
var map = new sourceMap.SourceMapGenerator()
173+
map.setSourceContent(hashedFilename, content)
174+
// check input source map from babel/coffee etc
175+
var inMap = resolvedParts.map
176+
var inMapConsumer = inMap && new sourceMap.SourceMapConsumer(inMap)
177+
var generatedOffset = (output ? output.split(splitRE).length : 0) + 1
178+
var originalOffset = content.slice(0, parts.script.start).split(splitRE).length - 1
179+
script.split(splitRE).forEach(function (line, index) {
180+
var ln = index + 1
181+
var originalLine = inMapConsumer
182+
? inMapConsumer.originalPositionFor({
183+
line: ln,
184+
column: 0
185+
}).line
186+
: ln
187+
if (originalLine) {
188+
map.addMapping({
189+
source: hashedFilename,
190+
generated: {
191+
line: ln + generatedOffset,
192+
column: 0
193+
},
194+
original: {
195+
line: originalLine + originalOffset,
196+
column: 0
197+
}
198+
})
199+
}
200+
})
201+
return map
202+
}
158203
}
159204

160205
function processTemplate (part, filePath, parts) {
@@ -183,7 +228,12 @@ function processScript (part, filePath, parts) {
183228
var script = getContent(part, filePath)
184229
return compileAsPromise('script', script, lang, filePath)
185230
.then(function (res) {
186-
parts.script = res
231+
if (typeof res === 'string') {
232+
parts.script = res
233+
} else {
234+
parts.script = res.code
235+
parts.map = res.map
236+
}
187237
})
188238
}
189239

@@ -242,3 +292,7 @@ function compileAsPromise (type, source, lang, filePath) {
242292
function toFunction (code) {
243293
return 'function(){' + code + '}'
244294
}
295+
296+
function generateSourceMap (script, output, content, parts) {
297+
298+
}

lib/compilers/babel.js

Lines changed: 8 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
var fs = require('fs')
22
var path = require('path')
3+
var assign = require('object-assign')
34
var ensureRequire = require('../ensure-require')
45

56
var defaultBabelOptions = {
@@ -35,12 +36,16 @@ if (babelOptions === defaultBabelOptions) {
3536
}
3637
}
3738

38-
module.exports = function (raw, cb, compiler) {
39+
module.exports = function (raw, cb, compiler, filePath) {
3940
try {
4041
var babel = require('babel-core')
41-
var res = babel.transform(raw, compiler.options.babel || babelOptions)
42+
var options = assign({
43+
filename: filePath,
44+
sourceMaps: compiler.options.sourceMap
45+
}, compiler.options.babel || babelOptions)
46+
var res = babel.transform(raw, options)
4247
} catch (err) {
4348
return cb(err)
4449
}
45-
cb(null, res.code)
50+
cb(null, res)
4651
}

lib/compilers/coffee.js

Lines changed: 11 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -3,12 +3,20 @@ var ensureRequire = require('../ensure-require.js')
33
module.exports = function (raw, cb, compiler) {
44
ensureRequire('coffee', ['coffee-script'])
55
var coffee = require('coffee-script')
6+
var compiled
67
try {
7-
var js = coffee.compile(raw, compiler.options.coffee || {
8-
bare: true
8+
compiled = coffee.compile(raw, compiler.options.coffee || {
9+
bare: true,
10+
sourceMap: compiler.options.sourceMap
911
})
1012
} catch (err) {
1113
return cb(err)
1214
}
13-
cb(null, js)
15+
if (compiler.options.sourceMap) {
16+
compiled = {
17+
code: compiled.js,
18+
map: compiled.v3SourceMap
19+
}
20+
}
21+
cb(null, compiled)
1422
}

package.json

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,12 +22,14 @@
2222
"homepage": "https://github.com/vuejs/vueify",
2323
"dependencies": {
2424
"chalk": "^1.1.1",
25+
"convert-source-map": "^1.2.0",
2526
"cssnano": "^3.3.2",
2627
"hash-sum": "^1.0.2",
2728
"lru-cache": "^4.0.0",
2829
"object-assign": "^4.0.1",
2930
"postcss": "^5.0.10",
3031
"postcss-selector-parser": "^2.0.0",
32+
"source-map": "^0.5.6",
3133
"through": "^2.3.6",
3234
"vue-hot-reload-api": "^2.0.1",
3335
"vue-template-compiler": "^2.0.0-alpha.3"

plugins/extract-css.js

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,9 @@
11
var fs = require('fs')
22
var compiler = require('../lib/compiler')
33

4-
compiler.options.extractCSS = true
4+
compiler.applyConfig({
5+
extractCSS: true
6+
})
57

68
module.exports = function (b, opts) {
79
var outPath = opts.out || opts.o || 'bundle.css'

0 commit comments

Comments
 (0)