angular-cn/tools/karma/reporter.js

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]
};