@@ -5,25 +5,28 @@ var hash = require('hash-sum')
55var assign = require ( 'object-assign' )
66var Emitter = require ( 'events' ) . EventEmitter
77var vueCompiler = require ( 'vue-template-compiler' )
8+ var sourceMap = require ( 'source-map' )
9+ var convert = require ( 'convert-source-map' )
810
911var genId = require ( './gen-id' )
1012var normalize = require ( './normalize' )
1113var compilers = require ( './compilers' )
1214var 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+
1420var hasBabel = true
1521try {
1622 require ( 'babel-core' )
1723} catch ( e ) {
1824 hasBabel = false
1925}
2026
27+ var splitRE = / \r ? \n / g
2128var 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
2831var compiler = module . exports = new Emitter ( )
2932compiler . 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
160205function 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) {
242292function toFunction ( code ) {
243293 return 'function(){' + code + '}'
244294}
295+
296+ function generateSourceMap ( script , output , content , parts ) {
297+
298+ }
0 commit comments