1
+ var util = require ( 'util' ) ;
1
2
var log = require ( './logger' ) . create ( 'reporter' ) ;
2
3
var MultiReporter = require ( './reporters/multi' ) ;
3
4
var baseReporterDecoratorFactory = require ( './reporters/base' ) . decoratorFactory ;
5
+ var SourceMapConsumer = require ( 'source-map' ) . SourceMapConsumer ;
4
6
5
- var createErrorFormatter = function ( basePath ) {
6
- var URL_REGEXP = new RegExp ( 'http:\\/\\/[^\\/]*' +
7
- '\\/(base|absolute)([^\\?\\s\\:]*)(\\?\\w*)?' , 'g' ) ;
7
+ var createErrorFormatter = function ( basePath , emitter , SourceMapConsumer ) {
8
+ var lastServedFiles = [ ] ;
9
+
10
+ emitter . on ( 'file_list_modified' , function ( filesPromise ) {
11
+ filesPromise . then ( function ( files ) {
12
+ lastServedFiles = files . served ;
13
+ } ) ;
14
+ } ) ;
15
+
16
+ var findFile = function ( path ) {
17
+ for ( var i = 0 ; i < lastServedFiles . length ; i ++ ) {
18
+ if ( lastServedFiles [ i ] . path === path ) {
19
+ return lastServedFiles [ i ] ;
20
+ }
21
+ }
22
+ return null ;
23
+ } ;
24
+
25
+ var URL_REGEXP = new RegExp ( 'http:\\/\\/[^\\/]*\\/' +
26
+ '(base|absolute)' + // prefix
27
+ '([^\\?\\s\\:]*)' + // path
28
+ '(\\?\\w*)?' + // sha
29
+ '(\\:(\\d+))?' + // line
30
+ '(\\:(\\d+))?' + // column
31
+ '' , 'g' ) ;
8
32
9
33
return function ( msg , indentation ) {
10
34
// remove domain and timestamp from source files
11
35
// and resolve base path / absolute path urls into absolute path
12
- msg = ( msg || '' ) . replace ( URL_REGEXP , function ( full , prefix , path ) {
36
+ msg = ( msg || '' ) . replace ( URL_REGEXP , function ( _ , prefix , path , __ , ___ , line , ____ , column ) {
37
+
13
38
if ( prefix === 'base' ) {
14
- return basePath + path ;
15
- } else if ( prefix === 'absolute' ) {
16
- return path ;
39
+ path = basePath + path ;
40
+ }
41
+
42
+ var file = findFile ( path ) ;
43
+
44
+ if ( file && file . sourceMap ) {
45
+ line = parseInt ( line || '0' , 10 ) ;
46
+ column = parseInt ( column || '0' , 10 ) ;
47
+
48
+ var smc = new SourceMapConsumer ( file . sourceMap ) ;
49
+ var original = smc . originalPositionFor ( { line : line , column : column } ) ;
50
+
51
+ return util . format ( '%s:%d:%d <- %s:%d:%d' , path , line , column , original . source ,
52
+ original . line , original . column ) ;
17
53
}
54
+
55
+ return path + ( line ? ':' + line : '' ) + ( column ? ':' + column : '' ) ;
18
56
} ) ;
19
57
20
58
// indent every line
@@ -26,11 +64,9 @@ var createErrorFormatter = function(basePath) {
26
64
} ;
27
65
} ;
28
66
29
- createErrorFormatter . $inject = [ 'config.basePath' ] ;
30
-
31
67
32
68
var createReporters = function ( names , config , emitter , injector ) {
33
- var errorFormatter = createErrorFormatter ( config . basePath , config . urlRoot ) ;
69
+ var errorFormatter = createErrorFormatter ( config . basePath , emitter , SourceMapConsumer ) ;
34
70
var reporters = [ ] ;
35
71
36
72
// TODO(vojta): instantiate all reporters through DI
@@ -42,7 +78,7 @@ var createReporters = function(names, config, emitter, injector) {
42
78
43
79
var locals = {
44
80
baseReporterDecorator : [ 'factory' , baseReporterDecoratorFactory ] ,
45
- formatError : [ 'factory ' , createErrorFormatter ]
81
+ formatError : [ 'value ' , errorFormatter ]
46
82
} ;
47
83
48
84
try {
0 commit comments