100 lines
2.8 KiB
JavaScript
Executable file
100 lines
2.8 KiB
JavaScript
Executable file
const path = require('path');
|
|
const minimatch = require('minimatch');
|
|
|
|
function fixWebpackFilePath(filePath) {
|
|
if (filePath.includes('!')) {
|
|
filePath = filePath.split('!').pop();
|
|
}
|
|
|
|
if (filePath.includes('?')) {
|
|
filePath = filePath.split('?')[0];
|
|
}
|
|
|
|
return filePath;
|
|
}
|
|
|
|
function fixPathSeparators(filePath) {
|
|
const isWin = process.platform.startsWith('win');
|
|
// Workaround for https://github.com/mattlewis92/karma-coverage-istanbul-reporter/issues/9
|
|
if (isWin && filePath) {
|
|
return filePath.replace(/\//g, '\\').replace(/\\\\/g, '\\');
|
|
}
|
|
|
|
return filePath;
|
|
}
|
|
|
|
function fixWebpackSourcePaths(sourceMap, webpackConfig) {
|
|
let { sourceRoot } = sourceMap;
|
|
// As per https://webpack.js.org/configuration/entry-context/#context, if no context is specified, the current
|
|
// directory that the process is running from should be assumed instead
|
|
const context = (webpackConfig && webpackConfig.context) || process.cwd();
|
|
// Fix for https://github.com/mattlewis92/karma-coverage-istanbul-reporter/issues/32
|
|
// The sourceRoot is relative to the project directory and not an absolute path, so add the webpack context to it if set
|
|
if (
|
|
context &&
|
|
sourceRoot &&
|
|
!sourceRoot.startsWith(context) &&
|
|
!path.isAbsolute(sourceRoot)
|
|
) {
|
|
sourceRoot = path.join(context, sourceRoot);
|
|
}
|
|
|
|
sourceRoot = fixPathSeparators(sourceRoot);
|
|
|
|
const result = Object.assign({}, sourceMap, {
|
|
file: fixPathSeparators(sourceMap.file),
|
|
sources: (sourceMap.sources || []).map((source) => {
|
|
source = fixWebpackFilePath(source);
|
|
if (sourceRoot && source.startsWith(sourceRoot)) {
|
|
source = source.replace(sourceRoot, '');
|
|
}
|
|
|
|
return source;
|
|
}),
|
|
});
|
|
|
|
if (sourceRoot) {
|
|
result.sourceRoot = sourceRoot;
|
|
}
|
|
|
|
return result;
|
|
}
|
|
|
|
function isAbsolute(file) {
|
|
if (path.isAbsolute) {
|
|
return path.isAbsolute(file);
|
|
}
|
|
|
|
return path.resolve(file) === path.normalize(file);
|
|
}
|
|
|
|
function normalize(key, basePath) {
|
|
// Exclude keys will always be relative, but covObj keys can be absolute or relative
|
|
let excludeKey = isAbsolute(key) ? path.relative(basePath, key) : key;
|
|
// Also normalize for files that start with `./`, etc.
|
|
excludeKey = path.normalize(excludeKey);
|
|
|
|
return excludeKey;
|
|
}
|
|
|
|
function overrideThresholds(key, overrides, basePath) {
|
|
let thresholds = {};
|
|
|
|
// First match wins
|
|
Object.keys(overrides).some((pattern) => {
|
|
if (minimatch(normalize(key, basePath), pattern, { dot: true })) {
|
|
thresholds = overrides[pattern];
|
|
return true;
|
|
}
|
|
|
|
return false;
|
|
});
|
|
|
|
return thresholds;
|
|
}
|
|
|
|
module.exports.fixPathSeparators = fixPathSeparators;
|
|
module.exports.fixWebpackSourcePaths = fixWebpackSourcePaths;
|
|
module.exports.fixWebpackFilePath = fixWebpackFilePath;
|
|
module.exports.overrideThresholds = overrideThresholds;
|