68 lines
2.2 KiB
JavaScript
68 lines
2.2 KiB
JavaScript
/**
|
|
* @license
|
|
* Copyright Google Inc. All Rights Reserved.
|
|
*
|
|
* Use of this source code is governed by an MIT-style license that can be
|
|
* found in the LICENSE file at https://angular.io/license
|
|
*/
|
|
|
|
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) {
|
|
console.warn('SourceMap position not found for trace: %s', msg);
|
|
}
|
|
}
|
|
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, config.colors)
|
|
};
|
|
|
|
InternalAngularReporter.$inject = ['config', 'emitter'];
|
|
|
|
module.exports = {
|
|
'reporter:internal-angular': ['type', InternalAngularReporter]
|
|
};
|