{"version":3,"file":"coverage.js","sourceRoot":"","sources":["../../src/istanbul/coverage.ts"],"names":[],"mappings":";;AAOA;IAMI,kBAAoB,MAAqB;QAArB,WAAM,GAAN,MAAM,CAAe;QAJjC,aAAQ,GAAG,OAAO,CAAC,iCAAiC,CAAC,CAAC;IAK9D,CAAC;IAEM,6BAAU,GAAjB,UAAkB,MAAW,EAAE,MAAW;QAA1C,iBAeC;QAbG,IAAI,CAAC,GAAG,GAAG,MAAM,CAAC,MAAM,CAAC,2BAA2B,CAAC,CAAC;QACtD,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,cAAc,CAAC,CAAC;QAE/B,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC;YAClB,KAAI,CAAC,GAAG,CAAC,KAAK,CAAC,mCAAmC,CAAC,CAAC;YACpD,KAAI,CAAC,oBAAoB,GAAG,KAAI,CAAC,QAAQ,CACrC,MAAM,EACN,MAAM,EACN,KAAI,CAAC,MAAM,CAAC,KAAK,CAAC,QAAQ,EAC1B,KAAI,CAAC,MAAM,CAAC,SAAS,EACrB,KAAI,CAAC,MAAM,CAAC,gBAAgB,CAC/B,CAAC;QACN,CAAC,CAAC,CAAC;IACP,CAAC;IAEM,6BAAU,GAAjB,UAAkB,IAAU,EAAE,OAAe,EAAE,UAAsB,EAAE,QAA0B;QAE7F,IAAI,IAAI,CAAC,MAAM,CAAC,eAAe,CAAC,UAAU,CAAC,EAAE;YACzC,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,mCAAmC,CAAC,CAAC;YACpD,QAAQ,CAAC,OAAO,CAAC,CAAC;YAClB,OAAO;SACV;QAED,IAAI,IAAI,CAAC,MAAM,CAAC,eAAe,CAAC,UAAU,CAAC,EAAE;YACzC,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,mCAAmC,CAAC,CAAC;YACpD,QAAQ,CAAC,OAAO,CAAC,CAAC;YAClB,OAAO;SACV;QAED,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,eAAe,CAAC,eAAe;YAC5C,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,MAAM,CAAC,eAAe,CAAC,OAAO,EAAE,IAAI,CAAC,YAAY,CAAC;YACvE,IAAI,CAAC,WAAW,CAAC,UAAU,CAAC,EAAE;YAE9B,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,wCAAwC,EAAE,IAAI,CAAC,YAAY,CAAC,CAAC;YAC5E,QAAQ,CAAC,OAAO,CAAC,CAAC;YAClB,OAAO;SACV;QAED,IAAI,CAAC,oBAAoB,CAAC,OAAO,EAAE,IAAI,EAAE,QAAQ,CAAC,CAAC;IACvD,CAAC;IAEO,8BAAW,GAAnB,UAAoB,UAAsB;QACtC,OAAO,UAAU,CAAC,UAAU,CAAC,UAAU,CAAC,uBAAuB,CAAC,CAAC;IACrE,CAAC;IAEO,6BAAU,GAAlB,UAAmB,KAAwB,EAAE,IAAY;QACrD,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE;YACtB,KAAgB,UAAK,EAAL,eAAK,EAAL,mBAAK,EAAL,IAAK,EAAE;gBAAlB,IAAM,CAAC,cAAA;gBACR,IAAI,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE;oBACd,OAAO,IAAI,CAAC;iBACf;aACJ;YACD,OAAO,KAAK,CAAC;SAChB;QACD,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAC5B,CAAC;IACL,eAAC;AAAD,CAAC,AAnED,IAmEC;AAnEY,4BAAQ","sourcesContent":["import { Logger } from \"log4js\";\n\nimport { EmitOutput } from \"../compiler/emit-output\";\nimport { Configuration } from \"../shared/configuration\";\nimport { File } from \"../shared/file\";\nimport { CoverageCallback } from \"./coverage-callback\";\n\nexport class Coverage {\n\n    private coverage = require(\"karma-coverage/lib/preprocessor\");\n    private coveragePreprocessor: any;\n    private log: Logger;\n\n    constructor(private config: Configuration) {\n    }\n\n    public initialize(helper: any, logger: any): void {\n\n        this.log = logger.create(\"coverage.karma-typescript\");\n        this.log.debug(\"Initializing\");\n\n        this.config.whenReady(() => {\n            this.log.debug(\"Configuring coverage preprocessor\");\n            this.coveragePreprocessor = this.coverage(\n                logger,\n                helper,\n                this.config.karma.basePath,\n                this.config.reporters,\n                this.config.coverageReporter\n            );\n        });\n    }\n\n    public instrument(file: File, bundled: string, emitOutput: EmitOutput, callback: CoverageCallback): void {\n\n        if (this.config.hasPreprocessor(\"commonjs\")) {\n            this.log.debug(\"karma-commonjs already configured\");\n            callback(bundled);\n            return;\n        }\n\n        if (this.config.hasPreprocessor(\"coverage\")) {\n            this.log.debug(\"karma-coverage already configured\");\n            callback(bundled);\n            return;\n        }\n\n        if (!this.config.coverageOptions.instrumentation ||\n            this.isExcluded(this.config.coverageOptions.exclude, file.relativePath) ||\n            this.hasNoOutput(emitOutput)) {\n\n            this.log.debug(\"Excluding file %s from instrumentation\", file.originalPath);\n            callback(bundled);\n            return;\n        }\n\n        this.coveragePreprocessor(bundled, file, callback);\n    }\n\n    private hasNoOutput(emitOutput: EmitOutput): boolean {\n        return emitOutput.outputText.startsWith(\"//# sourceMappingURL=\");\n    }\n\n    private isExcluded(regex: RegExp | RegExp[], path: string): boolean {\n        if (Array.isArray(regex)) {\n            for (const r of regex) {\n                if (r.test(path)) {\n                    return true;\n                }\n            }\n            return false;\n        }\n        return regex.test(path);\n    }\n}\n"]}