Huge News!Announcing our $40M Series B led by Abstract Ventures.Learn More
Socket
Socket
Sign inDemoInstall

karma-coverage

Package Overview
Dependencies
Maintainers
3
Versions
42
Alerts
File Explorer

Advanced tools

Socket logo

Install Socket

Detect and block malicious and high-risk dependencies

Install

karma-coverage - npm Package Compare versions

Comparing version 2.0.1 to 2.0.2

release.config.js

8

CHANGELOG.md

@@ -0,1 +1,9 @@

## [2.0.2](https://github.com/karma-runner/karma-coverage/compare/v2.0.1...v2.0.2) (2020-04-13)
### Bug Fixes
* **reporter:** update calls to match new API in istanbul-lib-report fix [#398](https://github.com/karma-runner/karma-coverage/issues/398) ([#403](https://github.com/karma-runner/karma-coverage/issues/403)) ([4962a70](https://github.com/karma-runner/karma-coverage/commit/4962a70026efbbd77e9fa7b6bfd6be29047c1082))
* remove information about old istanbul lib ([#404](https://github.com/karma-runner/karma-coverage/issues/404)) ([5cf931a](https://github.com/karma-runner/karma-coverage/commit/5cf931afe331cfcebf7cf934ec52de933344091d))
<a name="2.0.1"></a>

@@ -2,0 +10,0 @@ ## [2.0.1](https://github.com/karma-runner/karma-coverage/compare/v2.0.0...v2.0.1) (2019-08-20)

14

gruntfile.js

@@ -11,4 +11,4 @@ module.exports = function (grunt) {

src: [
'test/mocha-globals.coffee',
'test/*.spec.coffee'
'test/mocha-globals.js',
'test/*.spec.js'
]

@@ -62,9 +62,2 @@ }

}
},
eslint: {
target: [
'lib/*.js',
'gruntfile.js',
'karma.conf.js'
]
}

@@ -75,4 +68,3 @@ })

grunt.registerTask('test', ['simplemocha', 'karma'])
grunt.registerTask('default', ['eslint', 'test'])
grunt.registerTask('default', ['simplemocha', 'karma'])

@@ -79,0 +71,0 @@ grunt.registerTask('release', 'Bump the version and publish to NPM.', function (type) {

@@ -1,25 +0,29 @@

function InMemoryReport (opt) {
this.opt = opt
}
const { ReportBase } = require('istanbul-lib-report')
InMemoryReport.prototype.onStart = function (root, context) {
this.data = {}
}
class InMemoryReport extends ReportBase {
constructor (opt) {
super(opt)
this.opt = opt
}
InMemoryReport.prototype.onDetail = function (node) {
const fc = node.getFileCoverage()
const key = fc.path
this.data[key] = fc.toJSON()
}
onStart () {
this.data = {}
}
InMemoryReport.prototype.onEnd = function () {
if (!this.opt.emitter || !this.opt.emitter.emit) {
console.error('Could not raise "coverage_complete" event, missing emitter because it was not supplied during initialization of the reporter')
} else {
onDetail (node) {
const fc = node.getFileCoverage()
const key = fc.path
this.data[key] = fc.toJSON()
}
onEnd () {
if (!this.opt || !this.opt.emitter || !this.opt.emitter.emit) {
console.error('Could not raise "coverage_complete" event, missing emitter because it was not supplied during initialization of the reporter')
return
}
this.opt.emitter.emit('coverage_complete', this.opt.browser, this.data)
}
}
InMemoryReport.TYPE = 'in-memory'
module.exports = InMemoryReport

@@ -9,10 +9,7 @@ // Coverage Preprocessor

var { createInstrumenter } = require('istanbul-lib-instrument')
var minimatch = require('minimatch')
var path = require('path')
var _ = require('lodash')
var SourceMapConsumer = require('source-map').SourceMapConsumer
var SourceMapGenerator = require('source-map').SourceMapGenerator
var globalSourceMapStore = require('./source-map-store')
var globalCoverageMap = require('./coverage-map')
const { createInstrumenter } = require('istanbul-lib-instrument')
const minimatch = require('minimatch')
const path = require('path')
const globalSourceMapStore = require('./source-map-store')
const globalCoverageMap = require('./coverage-map')

@@ -22,7 +19,7 @@ // Regexes

var coverageObjRegex = /\{.*"path".*"fnMap".*"statementMap".*"branchMap".*\}/g
const coverageObjRegex = /\{.*"path".*"fnMap".*"statementMap".*"branchMap".*\}/g
// Preprocessor creator function
function createCoveragePreprocessor (logger, helper, basePath, reporters, coverageReporter) {
var log = logger.create('preprocessor.coverage')
function createCoveragePreprocessor (logger, basePath, reporters = [], coverageReporter = {}) {
const log = logger.create('preprocessor.coverage')

@@ -53,3 +50,3 @@ // Options

}
if (!_.isFunction(Obj)) {
if (typeof Obj !== 'function') {
// Object doesn't have old instrumenter variable and isn't a

@@ -67,26 +64,20 @@ // constructor, so we can't use it to create an instrumenter

var instrumenterOverrides = {}
var instrumenters = { istanbul: createInstrumenter }
var includeAllSources = false
var useJSExtensionForCoffeeScript = false
const instrumenters = { istanbul: createInstrumenter }
const instrumenterOverrides = coverageReporter.instrumenter || {}
const { includeAllSources = false, useJSExtensionForCoffeeScript = false } = coverageReporter
if (coverageReporter) {
instrumenterOverrides = coverageReporter.instrumenter
_.forEach(coverageReporter.instrumenters, function (instrumenter, literal) {
var creatorFunction = getCreatorFunction(instrumenter)
if (creatorFunction) {
instrumenters[literal] = creatorFunction
}
})
includeAllSources = coverageReporter.includeAllSources === true
useJSExtensionForCoffeeScript = coverageReporter.useJSExtensionForCoffeeScript === true
}
Object.entries(coverageReporter.instrumenters || {}).forEach(([literal, instrumenter]) => {
const creatorFunction = getCreatorFunction(instrumenter)
if (creatorFunction) {
instrumenters[literal] = creatorFunction
}
})
var sourceMapStore = globalSourceMapStore.get(basePath)
const sourceMapStore = globalSourceMapStore.get(basePath)
var instrumentersOptions = _.reduce(instrumenters, function getInstrumenterOptions (memo, instrument, name) {
memo[name] = {}
const instrumentersOptions = Object.keys(instrumenters).reduce((memo, key) => {
memo[key] = {}
if (coverageReporter && coverageReporter.instrumenterOptions) {
memo[name] = coverageReporter.instrumenterOptions[name]
if (coverageReporter.instrumenterOptions) {
memo[key] = coverageReporter.instrumenterOptions[key]
}

@@ -98,3 +89,4 @@

// if coverage reporter is not used, do not preprocess the files
if (!_.includes(reporters, 'coverage')) {
if (!reporters.includes('coverage')) {
log.info('coverage not included in reporters %s', reporters)
return function (content, _, done) {

@@ -104,15 +96,17 @@ done(content)

}
log.debug('coverage included in reporters %s', reporters)
// check instrumenter override requests
function checkInstrumenters () {
return _.reduce(instrumenterOverrides, function (acc, literal, pattern) {
if (!_.includes(_.keys(instrumenters), String(literal))) {
const keys = Object.keys(instrumenters)
return Object.values(instrumenterOverrides).some(literal => {
const notIncluded = !keys.includes(String(literal))
if (notIncluded) {
log.error('Unknown instrumenter: %s', literal)
return false
}
return acc
}, true)
return notIncluded
})
}
if (!checkInstrumenters()) {
if (checkInstrumenters()) {
return function (content, _, done) {

@@ -126,16 +120,15 @@ return done(1)

var jsPath = path.resolve(file.originalPath)
// default instrumenters
var instrumenterLiteral = 'istanbul'
_.forEach(instrumenterOverrides, function (literal, pattern) {
const jsPath = path.resolve(file.originalPath)
// 'istanbul' is default instrumenters
const instrumenterLiteral = Object.keys(instrumenterOverrides).reduce((res, pattern) => {
if (minimatch(file.originalPath, pattern, { dot: true })) {
instrumenterLiteral = String(literal)
return instrumenterOverrides[pattern]
}
})
return res
}, 'istanbul')
var instrumenterCreator = instrumenters[instrumenterLiteral]
var constructOptions = instrumentersOptions[instrumenterLiteral] || {}
var options = Object.assign({}, constructOptions)
var codeGenerationOptions = null
const instrumenterCreator = instrumenters[instrumenterLiteral]
const constructOptions = instrumentersOptions[instrumenterLiteral] || {}
let options = Object.assign({}, constructOptions)
let codeGenerationOptions = null
options.autoWrap = options.autoWrap || !options.noAutoWrap

@@ -158,3 +151,3 @@

var instrumenter = instrumenterCreator(options)
const instrumenter = instrumenterCreator(options)
instrumenter.instrument(content, jsPath, function (err, instrumentedCode) {

@@ -165,16 +158,18 @@ if (err) {

} else {
if (file.sourceMap && instrumenter.lastSourceMap()) {
// Register the incoming sourceMap for transformation during reporting (if it exists)
if (file.sourceMap) {
sourceMapStore.registerMap(jsPath, file.sourceMap)
}
// Add merged source map (if it merged correctly)
const lastSourceMap = instrumenter.lastSourceMap()
if (lastSourceMap) {
log.debug('Adding source map to instrumented file for "%s".', file.originalPath)
var generator = SourceMapGenerator.fromSourceMap(new SourceMapConsumer(instrumenter.lastSourceMap().toString()))
generator.applySourceMap(new SourceMapConsumer(file.sourceMap))
file.sourceMap = JSON.parse(generator.toString())
file.sourceMap = lastSourceMap
instrumentedCode += '\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,'
instrumentedCode += Buffer.from(JSON.stringify(file.sourceMap)).toString('base64') + '\n'
instrumentedCode += Buffer.from(JSON.stringify(lastSourceMap)).toString('base64') + '\n'
}
// Register the sourceMap for transformation during reporting
sourceMapStore.registerMap(jsPath, file.sourceMap)
if (includeAllSources) {
var coverageObj
let coverageObj
// Check if the file coverage object is exposed from the instrumenter directly

@@ -189,3 +184,3 @@ if (instrumenter.lastFileCoverage) {

coverageObjRegex.lastIndex = 0
var coverageObjMatch = coverageObjRegex.exec(instrumentedCode)
const coverageObjMatch = coverageObjRegex.exec(instrumentedCode)
if (coverageObjMatch !== null) {

@@ -205,3 +200,3 @@ coverageObj = JSON.parse(coverageObjMatch[0])

}
})
}, file.sourceMap)
}

@@ -212,3 +207,2 @@ }

'logger',
'helper',
'config.basePath',

@@ -215,0 +209,0 @@ 'config.reporters',

@@ -17,3 +17,2 @@ // Coverage Reporter

var minimatch = require('minimatch')
var _ = require('lodash')

@@ -23,11 +22,4 @@ var globalSourceMapStore = require('./source-map-store')

var reports = require('./report-creator')
const hasOwnProperty = Object.prototype.hasOwnProperty
function isAbsolute (file) {
if (path.isAbsolute) {
return path.isAbsolute(file)
}
return path.resolve(file) === path.normalize(file)
}
// TODO(vojta): inject only what required (config.basePath, config.coverageReporter)

@@ -63,3 +55,3 @@ var CoverageReporter = function (rootConfig, helper, logger, emitter) {

// Exclude keys will always be relative, but covObj keys can be absolute or relative
var excludeKey = isAbsolute(key) ? path.relative(basePath, key) : key
var excludeKey = path.isAbsolute(key) ? path.relative(basePath, key) : key
// Also normalize for files that start with `./`, etc.

@@ -180,13 +172,16 @@ excludeKey = path.normalize(excludeKey)

// Generate the output directory from the `coverageReporter.dir` and
// Generate the output path from the `coverageReporter.dir` and
// `coverageReporter.subdir` options.
function generateOutputDir (browserName, dir, subdir) {
dir = dir || 'coverage'
subdir = subdir || browserName
if (_.isFunction(subdir)) {
function generateOutputPath (basePath, browserName, dir = 'coverage', subdir) {
if (subdir && typeof subdir === 'function') {
subdir = subdir(browserName)
}
if (browserName) {
browserName = browserName.replace(':', '')
}
return path.join(dir, subdir)
let outPutPath = path.join(dir, subdir || browserName)
outPutPath = path.resolve(basePath, outPutPath)
return helper.normalizeWinPath(outPutPath)
}

@@ -230,9 +225,8 @@

this.onRunComplete = function (browsers, results) {
var checkedCoverage = {}
this.onRunComplete = async function (browsers, results) {
const checkedCoverage = {}
reporters.forEach(function (reporterConfig) {
browsers.forEach(function (browser) {
var coverageMap = coverageMaps[browser.id]
for (const reporterConfig of reporters) {
await Promise.all(browsers.map(async (browser) => {
const coverageMap = coverageMaps[browser.id]
if (!coverageMap) {

@@ -242,47 +236,41 @@ return

var mainDir = reporterConfig.dir || config.dir
var subDir = reporterConfig.subdir || config.subdir
var browserName = browser.name.replace(':', '')
var simpleOutputDir = generateOutputDir(browserName, mainDir, subDir)
var resolvedOutputDir = path.resolve(basePath, simpleOutputDir)
const mainDir = reporterConfig.dir || config.dir
const subDir = reporterConfig.subdir || config.subdir
const outputPath = generateOutputPath(basePath, browser.name, mainDir, subDir)
const remappedCoverageMap = await sourceMapStore.transformCoverage(coverageMap)
var outputDir = helper.normalizeWinPath(resolvedOutputDir)
var options = helper.merge(config, reporterConfig, {
dir: outputDir,
const options = helper.merge(config, reporterConfig, {
dir: outputPath,
subdir: '',
browser: browser,
emitter: emitter
emitter: emitter,
coverageMap: remappedCoverageMap
})
var remappedCoverageMap = sourceMapStore.transformCoverage(coverageMap).map
// If config.check is defined, check coverage levels for each browser
if (config.hasOwnProperty('check') && !checkedCoverage[browser.id]) {
if (hasOwnProperty.call(config, 'check') && !checkedCoverage[browser.id]) {
checkedCoverage[browser.id] = true
var coverageFailed = checkCoverage(browser, remappedCoverageMap)
if (coverageFailed) {
if (results) {
results.exitCode = 1
}
if (coverageFailed && results) {
results.exitCode = 1
}
}
var context = istanbulLibReport.createContext(options)
var tree = istanbulLibReport.summarizers.pkg(remappedCoverageMap)
var report = reports.create(reporterConfig.type || 'html', options)
const context = istanbulLibReport.createContext(options)
const report = reports.create(reporterConfig.type || 'html', options)
// // If reporting to console or in-memory skip directory creation
var toDisk = !reporterConfig.type || !reporterConfig.type.match(/^(text|text-summary|in-memory)$/)
var hasNoFile = _.isUndefined(reporterConfig.file)
const toDisk = !reporterConfig.type || !reporterConfig.type.match(/^(text|text-summary|in-memory)$/)
if (!toDisk && hasNoFile) {
tree.visit(report, context)
if (!toDisk && reporterConfig.file === undefined) {
report.execute(context)
return
}
helper.mkdirIfNotExists(outputDir, function () {
log.debug('Writing coverage to %s', outputDir)
tree.visit(report, context)
helper.mkdirIfNotExists(outputPath, function () {
log.debug('Writing coverage to %s', outputPath)
report.execute(context)
})
})
})
}))
}
}

@@ -289,0 +277,0 @@

{
"name": "karma-coverage",
"version": "2.0.1",
"version": "2.0.2",
"description": "A Karma plugin. Generate code coverage.",
"main": "lib/index.js",
"scripts": {
"test": "grunt test"
"lint": "eslint **/*.js",
"test": "grunt"
},

@@ -22,21 +23,24 @@ "repository": {

"dependencies": {
"dateformat": "^1.0.6",
"istanbul": "^0.4.0",
"istanbul-lib-coverage": "^2.0.5",
"istanbul-lib-instrument": "^3.3.0",
"istanbul-lib-report": "^2.0.8",
"istanbul-lib-source-maps": "^3.0.6",
"istanbul-reports": "^2.2.4",
"lodash": "^4.17.11",
"minimatch": "^3.0.0",
"source-map": "^0.5.1"
"istanbul-lib-coverage": "^3.0.0",
"istanbul-lib-instrument": "^4.0.1",
"istanbul-lib-report": "^3.0.0",
"istanbul-lib-source-maps": "^4.0.0",
"istanbul-reports": "^3.0.0",
"minimatch": "^3.0.4"
},
"license": "MIT",
"devDependencies": {
"@commitlint/cli": "^8.3.5",
"@commitlint/travis-cli": "^8.3.5",
"@commitlint/config-conventional": "^8.3.4",
"@semantic-release/changelog": "5.0.1",
"@semantic-release/git": "9.0.0",
"@semantic-release/npm": "7.0.5",
"chai": "^4.2.0",
"eslint": "^2.2.0",
"eslint-config-standard": "^5.1.0",
"eslint-plugin-promise": "^1.1.0",
"eslint-plugin-react": "^4.1.0",
"eslint-plugin-standard": "^1.1.0",
"eslint": "^6.5.1",
"eslint-config-standard": "^14.1.0",
"eslint-plugin-import": "^2.18.2",
"eslint-plugin-node": "^10.0.0",
"eslint-plugin-promise": "^4.2.1",
"eslint-plugin-standard": "^4.0.1",
"grunt": "^1.0.3",

@@ -47,6 +51,6 @@ "grunt-bump": "^0.8.0",

"grunt-conventional-github-releaser": "^1.0.0",
"grunt-eslint": "^21.0.0",
"grunt-karma": "^3.0.2",
"grunt-npm": "^0.0.2",
"grunt-simple-mocha": "^0.4.1",
"husky": "^4.2.3",
"ibrik": "^2.0.0",

@@ -58,6 +62,7 @@ "karma": "^4.2.0",

"karma-requirejs": "1.x || ^0.2.2",
"load-grunt-tasks": "^4.0.0",
"load-grunt-tasks": "^5.1.0",
"mocha": "^6.0.2",
"mocks": "0.0.15",
"requirejs": "^2.1.20",
"semantic-release": "17.0.4",
"sinon": "^7.2.7",

@@ -67,4 +72,14 @@ "sinon-chai": "^3.3.0"

"engines": {
"node": ">=8.0.0"
"node": ">=10.0.0"
},
"commitlint": {
"extends": [
"@commitlint/config-conventional"
]
},
"husky": {
"hooks": {
"commit-msg": "commitlint -E HUSKY_GIT_PARAMS"
}
},
"contributors": [

@@ -71,0 +86,0 @@ "dignifiedquire <dignifiedquire@gmail.com>",

@@ -122,2 +122,2 @@ # karma-coverage

[homepage]: http://karma-runner.github.com
[Istanbul]: https://github.com/gotwarlost/istanbul
[Istanbul]: https://istanbul.js.org
SocketSocket SOC 2 Logo

Product

  • Package Alerts
  • Integrations
  • Docs
  • Pricing
  • FAQ
  • Roadmap
  • Changelog

Packages

npm

Stay in touch

Get open source security insights delivered straight into your inbox.


  • Terms
  • Privacy
  • Security

Made with ⚡️ by Socket Inc