Skip to content

Commit 61a8fa6

Browse files
author
Damien Maillard
committed
improve coverage normalization, for now cannot properly merge v8 and istanbul coverage. See istanbuljs/v8-to-istanbul#144
1 parent b94be2a commit 61a8fa6

10 files changed

+93
-106
lines changed

Diff for: src/internal/browser-launcher/executeHtmlFile.js

+17-7
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,11 @@
11
import { extname } from "path"
22
import { resolveUrl, assertFilePresence } from "@jsenv/util"
3+
import { normalizeIstanbulCoverage } from "@jsenv/core/src/internal/executing/coverage/normalizeIstanbulCoverage.js"
4+
import { composeIstanbulCoverages } from "@jsenv/core/src/internal/executing/coverage/composeIstanbulCoverages.js"
5+
36
import { evalSource } from "../runtime/createNodeRuntime/evalSource.js"
47
import { escapeRegexpSpecialCharacters } from "../escapeRegexpSpecialCharacters.js"
5-
import { composeIstanbulCoverages } from "../executing/coverage/composeIstanbulCoverages.js"
8+
import { projectDirectoryUrl } from "@jsenv/core/jsenv.config.js"
69

710
export const executeHtmlFile = async (
811
fileRelativeUrl,
@@ -91,12 +94,19 @@ export const executeHtmlFile = async (
9194
}
9295

9396
const generateCoverageForPage = (fileExecutionResultMap) => {
94-
const coverageMap = composeIstanbulCoverages(
95-
...Object.keys(fileExecutionResultMap).map((fileRelativeUrl) => {
96-
return fileExecutionResultMap[fileRelativeUrl].coverageMap || {}
97-
}),
98-
)
99-
return coverageMap
97+
const istanbulCoverages = []
98+
Object.keys(fileExecutionResultMap).forEach((fileRelativeUrl) => {
99+
const istanbulCoverage = fileExecutionResultMap[fileRelativeUrl].coverageMap
100+
if (istanbulCoverage) {
101+
const istanbulCoverageNormalized = normalizeIstanbulCoverage(
102+
istanbulCoverage,
103+
projectDirectoryUrl,
104+
)
105+
istanbulCoverages.push(istanbulCoverageNormalized)
106+
}
107+
})
108+
const istanbulCoverage = composeIstanbulCoverages(...istanbulCoverages)
109+
return istanbulCoverage
100110
}
101111

102112
const evalException = (exceptionSource, { projectDirectoryUrl, compileServerOrigin }) => {
+9-15
Original file line numberDiff line numberDiff line change
@@ -1,24 +1,18 @@
11
import { require } from "../../require.js"
22

3-
const { createFileCoverage } = require("istanbul-lib-coverage")
3+
const { createCoverageMap } = require("istanbul-lib-coverage")
44

55
// https://github.com/istanbuljs/istanbuljs/blob/5405550c3868712b14fd8bfe0cbd6f2e7ac42279/packages/istanbul-lib-coverage/lib/coverage-map.js#L43
66
export const composeIstanbulCoverages = (...istanbulCoverages) => {
7-
const istanbulCoverageComposed = {}
7+
const istanbulCoverageMap = createCoverageMap()
88
istanbulCoverages.forEach((istanbulCoverage) => {
9-
Object.keys(istanbulCoverage).forEach((filename) => {
10-
const fileCoverage = istanbulCoverage[filename]
11-
istanbulCoverageComposed[filename] =
12-
filename in istanbulCoverageComposed
13-
? merge(istanbulCoverageComposed[filename], fileCoverage)
14-
: fileCoverage
15-
})
9+
istanbulCoverageMap.merge(istanbulCoverage)
1610
})
17-
return istanbulCoverageComposed
18-
}
1911

20-
const merge = (coverageA, coverageB) => {
21-
const fileCoverage = createFileCoverage(coverageA)
22-
fileCoverage.merge(coverageB)
23-
return fileCoverage.toJSON()
12+
const istanbulCoverageComposed = {}
13+
const coverageMap = istanbulCoverageMap.toJSON()
14+
Object.keys(coverageMap).forEach((key) => {
15+
istanbulCoverageComposed[key] = coverageMap[key].toJSON()
16+
})
17+
return istanbulCoverageComposed
2418
}

Diff for: src/internal/executing/coverage/ensureRelativePathsInCoverage.js

-13
This file was deleted.

Diff for: src/internal/executing/coverage/istanbulCoverageFromV8Coverage.js

+21-16
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@ import {
99
} from "@jsenv/util"
1010
import { require } from "@jsenv/core/src/internal/require.js"
1111
import { composeIstanbulCoverages } from "./composeIstanbulCoverages.js"
12-
import { makeIstanbulCoverageRelative } from "./makeIstanbulCoverageRelative.js"
12+
import { normalizeIstanbulCoverage } from "./normalizeIstanbulCoverage.js"
1313

1414
const { mergeProcessCovs } = require("@c88/v8-coverage")
1515

@@ -37,13 +37,11 @@ export const istanbulCoverageFromV8Coverage = async ({
3737
})
3838

3939
const coverageReport = mergeCoverageReports(coverageReportsFiltered)
40-
const instanbulCoverage = await convertV8CoverageToIstanbul(coverageReport, { sourceMapCache })
41-
const istanbulCoverageRelative = makeIstanbulCoverageRelative(
42-
instanbulCoverage,
40+
const istanbulCoverage = await convertV8CoverageToIstanbul(coverageReport, {
4341
projectDirectoryUrl,
44-
)
45-
46-
return istanbulCoverageRelative
42+
sourceMapCache,
43+
})
44+
return istanbulCoverage
4745
}
4846

4947
const readV8CoverageReportsFromDirectory = async (coverageDirectory) => {
@@ -93,11 +91,14 @@ const mergeCoverageReports = (coverageReports) => {
9391
return coverageReport
9492
}
9593

96-
const convertV8CoverageToIstanbul = async (coverageReport, { sourceMapCache }) => {
94+
const convertV8CoverageToIstanbul = async (
95+
coverageReport,
96+
{ projectDirectoryUrl, sourceMapCache },
97+
) => {
9798
const istanbulCoverages = await Promise.all(
98-
coverageReport.result.map(async (fileReport) => {
99-
const sources = sourcesFromSourceMapCache(fileReport.url, sourceMapCache)
100-
const path = urlToFileSystemPath(fileReport.url)
99+
coverageReport.result.map(async (fileV8Coverage) => {
100+
const sources = sourcesFromSourceMapCache(fileV8Coverage.url, sourceMapCache)
101+
const path = urlToFileSystemPath(fileV8Coverage.url)
101102
const converter = v8ToIstanbul(
102103
path,
103104
// wrapperLength is undefined we don't need it
@@ -107,14 +108,18 @@ const convertV8CoverageToIstanbul = async (coverageReport, { sourceMapCache }) =
107108
)
108109
await converter.load()
109110

110-
converter.applyCoverage(fileReport.functions)
111-
const istanbulFileCoverage = converter.toIstanbul()
112-
return istanbulFileCoverage
111+
converter.applyCoverage(fileV8Coverage.functions)
112+
const istanbulCoverage = converter.toIstanbul()
113+
const istanbulCoverageNormalized = normalizeIstanbulCoverage(
114+
istanbulCoverage,
115+
projectDirectoryUrl,
116+
)
117+
return istanbulCoverageNormalized
113118
}),
114119
)
115120

116-
const istanbulCoverage = composeIstanbulCoverages(...istanbulCoverages)
117-
return istanbulCoverage
121+
const istanbulCoverageComposed = composeIstanbulCoverages(...istanbulCoverages)
122+
return istanbulCoverageComposed
118123
}
119124

120125
const sourcesFromSourceMapCache = (url, sourceMapCache) => {

Diff for: src/internal/executing/coverage/makeIstanbulCoverageRelative.js

-19
This file was deleted.
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
import { urlToRelativeUrl, fileSystemPathToUrl, isFileSystemPath, resolveUrl } from "@jsenv/util"
2+
3+
export const normalizeIstanbulCoverage = (istanbulCoverage, projectDirectoryUrl) => {
4+
const istanbulCoverageNormalized = {}
5+
6+
Object.keys(istanbulCoverage).forEach((key) => {
7+
const fileCoverage = istanbulCoverage[key]
8+
const { path } = fileCoverage
9+
const url = isFileSystemPath(path)
10+
? fileSystemPathToUrl(path)
11+
: resolveUrl(path, projectDirectoryUrl)
12+
const relativeUrl = urlToRelativeUrl(url, projectDirectoryUrl)
13+
14+
istanbulCoverageNormalized[`./${relativeUrl}`] = {
15+
...fileCoverage,
16+
path: `./${relativeUrl}`,
17+
}
18+
})
19+
20+
return istanbulCoverageNormalized
21+
}

Diff for: src/internal/executing/coverage/reportToCoverageMap.js

+11-7
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
import { collectFiles } from "@jsenv/util"
22
import { relativeUrlToEmptyCoverage } from "./relativeUrlToEmptyCoverage.js"
33
import { composeIstanbulCoverages } from "./composeIstanbulCoverages.js"
4-
import { ensureRelativePathsInCoverage } from "./ensureRelativePathsInCoverage.js"
4+
import { normalizeIstanbulCoverage } from "./normalizeIstanbulCoverage.js"
55

66
export const reportToCoverageMap = async (
77
report,
@@ -16,7 +16,7 @@ export const reportToCoverageMap = async (
1616
const coverageMapForReport = executionReportToCoverageMap(report)
1717

1818
if (!coverageIncludeMissing) {
19-
return ensureRelativePathsInCoverage(coverageMapForReport)
19+
return coverageMapForReport
2020
}
2121

2222
const relativeFileUrlToCoverArray = await listRelativeFileUrlToCover({
@@ -26,7 +26,10 @@ export const reportToCoverageMap = async (
2626
})
2727

2828
const relativeFileUrlMissingCoverageArray = relativeFileUrlToCoverArray.filter(
29-
(relativeFileUrlToCover) => relativeFileUrlToCover in coverageMapForReport === false,
29+
(relativeFileUrlToCover) =>
30+
Object.keys(coverageMapForReport).every((key) => {
31+
return key !== `./${relativeFileUrlToCover}`
32+
}),
3033
)
3134

3235
const coverageMapForMissedFiles = {}
@@ -42,10 +45,10 @@ export const reportToCoverageMap = async (
4245
}),
4346
)
4447

45-
return ensureRelativePathsInCoverage({
46-
...coverageMapForReport,
47-
...coverageMapForMissedFiles,
48-
})
48+
return {
49+
...coverageMapForReport, // already normalized
50+
...normalizeIstanbulCoverage(coverageMapForMissedFiles, projectDirectoryUrl),
51+
}
4952
}
5053

5154
const listRelativeFileUrlToCover = async ({
@@ -101,6 +104,7 @@ const executionReportToCoverageMap = (report) => {
101104
})
102105
})
103106

107+
debugger
104108
const executionCoverageMap = composeIstanbulCoverages(...coverageMapArray)
105109

106110
return executionCoverageMap

Diff for: src/internal/executing/coverage/runtimeResultMapToCoverageMap.js

-18
This file was deleted.

Diff for: test/coverage/coverage-universal/coverage-universal.test.js

+13-10
Original file line numberDiff line numberDiff line change
@@ -22,20 +22,20 @@ const testPlan = {
2222
chromium: {
2323
launch: launchChromium,
2424
},
25-
firefox: {
26-
launch: launchFirefox,
27-
},
28-
webkit: {
29-
launch: launchWebkit,
30-
},
25+
// firefox: {
26+
// launch: launchFirefox,
27+
// },
28+
// webkit: {
29+
// launch: launchWebkit,
30+
// },
3131
},
3232
[fileRelativeUrl]: {
3333
node: {
3434
launch: launchNode,
3535
},
36-
node2: {
37-
launch: launchNode,
38-
},
36+
// node2: {
37+
// launch: launchNode,
38+
// },
3939
},
4040
}
4141

@@ -47,10 +47,13 @@ const { coverageMap } = await executeTestPlan({
4747
coverageConfig: {
4848
[`./${testDirectoryRelativeUrl}file.js`]: true,
4949
},
50+
// concurrencyLimit: 1,
51+
logLevel: "info",
52+
coverageHtmlDirectory: true,
5053
})
5154
const actual = coverageMap
5255
const expected = {
53-
[`${testDirectoryRelativeUrl}file.js`]: {
56+
[`./${testDirectoryRelativeUrl}file.js`]: {
5457
...coverageMap[`${testDirectoryRelativeUrl}file.js`],
5558
path: `./${testDirectoryRelativeUrl}file.js`,
5659
s: { 0: 5, 1: 3, 2: 2, 3: 2, 4: 0 },

Diff for: test/coverage/coverage-universal/file.js

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
/* eslint-env browser */
1+
/* eslint-env browser, node */
22
if (typeof window === "object") {
33
console.log("browser")
44
} else if (typeof process === "object") {

0 commit comments

Comments
 (0)