{"version":3,"file":"threshold.js","sourceRoot":"","sources":["../../src/istanbul/threshold.ts"],"names":[],"mappings":"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","sourcesContent":["import * as istanbul from \"istanbul\";\nimport { merge } from \"lodash\";\nimport { Logger } from \"log4js\";\nimport * as minimatch from \"minimatch\";\nimport { Configuration } from \"../shared/configuration\";\nimport { FileUtils } from \"../shared/file-utils\";\n\nexport class Threshold {\n\n    constructor(private config: Configuration, private log: Logger) {\n    }\n\n    public check(browser: any, collector: any) {\n\n        const thresholdConfig = this.config.coverageOptions.threshold;\n        const finalCoverage = collector.getFinalCoverage();\n        const globalCoverage = this.excludeFiles(finalCoverage, thresholdConfig.global.excludes);\n        const globalResults = (istanbul.utils as any).summarizeCoverage(globalCoverage);\n        let passedThreshold = true;\n\n        const checkThresholds = (name: string, thresholds: any, results: any) => {\n\n            [\"branches\", \"functions\", \"lines\", \"statements\"].forEach((key) => {\n\n                const result = results[key];\n                const uncovered = result.total - result.covered;\n                const threshold = thresholds[key];\n\n                if (threshold < 0 && threshold * -1 < uncovered) {\n                    passedThreshold = false;\n                    this.log.error(\"%s: Expected max %s uncovered %s, got %s (%s)\",\n                        browser.name, (-1 * threshold), key, uncovered, name);\n                }\n                else if (result.pct < threshold) {\n                    passedThreshold = false;\n                    this.log.error(\"%s: Expected %s% coverage for %s, got %s% (%s)\",\n                        browser.name, threshold, key, result.pct, name);\n                }\n            });\n        };\n\n        checkThresholds(\"global\", thresholdConfig.global, globalResults);\n\n        Object.keys(finalCoverage).forEach((filename) => {\n\n            const relativeFilename = FileUtils.getRelativePath(filename, this.config.karma.basePath);\n            const excludes = this.config.coverageOptions.threshold.file.excludes;\n\n            if (!this.isExcluded(relativeFilename, excludes)) {\n                const fileResult = (istanbul.utils as any).summarizeFileCoverage(finalCoverage[filename]);\n                const thresholds = merge(thresholdConfig.file, this.getFileOverrides(relativeFilename));\n                checkThresholds(filename, thresholds, fileResult);\n            }\n        });\n\n        return passedThreshold;\n    }\n\n    private excludeFiles(coverage: any, excludes: string[]) {\n        const result: { [key: string]: any } = {};\n        Object.keys(coverage).forEach((filename) => {\n            if (!this.isExcluded(FileUtils.getRelativePath(filename, this.config.karma.basePath), excludes)) {\n                result[filename] = coverage[filename];\n            }\n        });\n        return result;\n    }\n\n    private isExcluded(relativeFilename: string, excludes: string[]) {\n        return excludes.some((pattern) => {\n            return minimatch(relativeFilename, pattern, { dot: true });\n        });\n    }\n\n    private getFileOverrides(relativeFilename: string) {\n        let thresholds = {};\n        const overrides = this.config.coverageOptions.threshold.file.overrides;\n        Object.keys(overrides).forEach((pattern) => {\n            if (minimatch(relativeFilename, pattern, { dot: true })) {\n                thresholds = overrides[pattern];\n            }\n        });\n        return thresholds;\n    }\n}\n"]}