2015-11-23 17:58:18 -05:00
|
|
|
var SourceMapConsumer = require('source-map').SourceMapConsumer;
|
|
|
|
var DotsReporter = require('karma/lib/reporters/dots_color');
|
|
|
|
|
|
|
|
var createErrorFormatter = function (basePath, emitter, SourceMapConsumer) {
|
|
|
|
var lastServedFiles = [];
|
|
|
|
emitter.on('file_list_modified', function (files) {
|
|
|
|
lastServedFiles = files.served
|
|
|
|
});
|
|
|
|
function findFile(path) {
|
|
|
|
return lastServedFiles.filter(_ => _.path === path)[0];
|
|
|
|
}
|
|
|
|
|
|
|
|
var URL_REGEXP = new RegExp('(?:https?:\\/\\/[^\\/]*)?\\/?' +
|
|
|
|
'(base|absolute)' + // prefix
|
|
|
|
'((?:[A-z]\\:)?[^\\?\\s\\:]*)' + // path
|
|
|
|
'(\\?\\w*)?' + // sha
|
|
|
|
'(\\:(\\d+))?' + // line
|
|
|
|
'(\\:(\\d+))?' + // column
|
|
|
|
'', 'g')
|
|
|
|
|
|
|
|
return function (msg, indentation) {
|
|
|
|
msg = (msg || '').replace(URL_REGEXP, function (_, prefix, path, __, ___, line, ____, column) {
|
|
|
|
if (prefix === 'base') {
|
|
|
|
path = basePath + path;
|
|
|
|
}
|
|
|
|
line = parseInt(line || '0', 10);
|
|
|
|
column = parseInt(column || '0', 10);
|
|
|
|
|
|
|
|
var file = findFile(path)
|
|
|
|
if (file && file.sourceMap) {
|
|
|
|
try {
|
|
|
|
var original = new SourceMapConsumer(file.sourceMap).originalPositionFor({
|
|
|
|
line: line,
|
|
|
|
column: column
|
|
|
|
});
|
|
|
|
return process.cwd() + "/modules/" + original.source + ":" + original.line + ":" + original.column;
|
|
|
|
} catch (e) {
|
2016-04-28 20:50:03 -04:00
|
|
|
console.warn('SourceMap position not found for trace: %s', msg);
|
2015-11-23 17:58:18 -05:00
|
|
|
}
|
|
|
|
}
|
|
|
|
return path + ':' + line + ':' + column;
|
|
|
|
});
|
|
|
|
|
|
|
|
// indent every line
|
|
|
|
if (indentation) {
|
|
|
|
msg = indentation + msg.replace(/\n/g, '\n' + indentation)
|
|
|
|
}
|
|
|
|
return msg + '\n';
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
var InternalAngularReporter = function (config, emitter) {
|
|
|
|
var formatter = createErrorFormatter(config.basePath, emitter, SourceMapConsumer);
|
|
|
|
DotsReporter.call(this, formatter, false)
|
|
|
|
}
|
|
|
|
InternalAngularReporter.$inject = ['config', 'emitter']
|
|
|
|
|
2016-04-28 20:50:03 -04:00
|
|
|
module.exports = {'reporter:internal-angular': ['type', InternalAngularReporter]};
|