| const path = require('path'); |
| const minimatch = require('minimatch'); |
| |
| function fixWebpackFilePath(filePath) { |
| if (filePath.indexOf('!') !== -1) { |
| filePath = filePath.split('!').pop(); |
| } |
| |
| if (filePath.indexOf('?') !== -1) { |
| 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, '\\'); |
| } |
| |
| 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; |