@jsenv/test 1.1.1 → 1.1.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/jsenv_test.js +4 -2
- package/package.json +2 -2
- package/src/coverage/babel_plugin_instrument.js +15 -15
- package/src/coverage/coverage_reporter_html_directory.js +10 -10
- package/src/coverage/coverage_reporter_json_file.js +7 -7
- package/src/coverage/coverage_reporter_text_log.js +8 -8
- package/src/coverage/empty_coverage_factory.js +24 -24
- package/src/coverage/file_by_file_coverage.js +10 -10
- package/src/coverage/istanbul_coverage_composition.js +16 -16
- package/src/coverage/istanbul_coverage_map_from_coverage.js +8 -8
- package/src/coverage/list_files_not_covered.js +4 -4
- package/src/coverage/missing_coverage.js +17 -17
- package/src/coverage/report_to_coverage.js +52 -52
- package/src/coverage/v8_and_istanbul.js +17 -16
- package/src/coverage/v8_coverage.js +8 -8
- package/src/coverage/v8_coverage_composition.js +12 -12
- package/src/coverage/v8_coverage_node_directory.js +42 -42
- package/src/coverage/v8_coverage_to_istanbul.js +45 -45
- package/src/execution/execute.js +21 -21
- package/src/execution/execute_steps.js +129 -129
- package/src/execution/execute_test_plan.js +72 -68
- package/src/execution/execution_colors.js +2 -2
- package/src/execution/execution_steps.js +20 -20
- package/src/execution/gc.js +5 -5
- package/src/execution/logs_file_execution.js +126 -126
- package/src/execution/logs_file_execution.test.mjs +11 -11
- package/src/execution/run.js +51 -51
- package/src/execution/web_server_param.js +24 -24
- package/src/main.js +7 -7
- package/src/runtime_browsers/chromium.js +7 -7
- package/src/runtime_browsers/firefox.js +10 -10
- package/src/runtime_browsers/middleware_istanbul.js +23 -23
- package/src/runtime_browsers/middleware_js_supervisor.js +32 -32
- package/src/runtime_browsers/using_playwright.js +186 -186
- package/src/runtime_browsers/webkit.js +11 -11
- package/src/runtime_node/child_exec_options.js +43 -43
- package/src/runtime_node/controllable_child_process.mjs +47 -47
- package/src/runtime_node/controllable_worker_thread.mjs +37 -37
- package/src/runtime_node/exec_options.js +26 -26
- package/src/runtime_node/execute_using_dynamic_import.js +26 -26
- package/src/runtime_node/exit_codes.js +4 -4
- package/src/runtime_node/importmap_node_loader.mjs +24 -24
- package/src/runtime_node/importmap_node_loader_file_url.js +1 -1
- package/src/runtime_node/kill_process_tree.js +30 -30
- package/src/runtime_node/no_experimental_warnings.cjs +4 -4
- package/src/runtime_node/no_experimental_warnings_file_url.js +1 -1
- package/src/runtime_node/node_child_process.js +128 -128
- package/src/runtime_node/node_execution_performance.js +28 -28
- package/src/runtime_node/node_worker_thread.js +108 -108
- package/src/runtime_node/profiler_v8_coverage.js +21 -21
package/dist/jsenv_test.js
CHANGED
|
@@ -2734,8 +2734,9 @@ const composeV8AndIstanbul = (v8FileByFileCoverage, istanbulFileByFileCoverage,
|
|
|
2734
2734
|
if (v8Coverage) {
|
|
2735
2735
|
if (coverageV8ConflictWarning) {
|
|
2736
2736
|
console.warn(createDetailedMessage(`Coverage conflict on "${key}", found two coverage that cannot be merged together: v8 and istanbul. The istanbul coverage will be ignored.`, {
|
|
2737
|
-
details: `This happens when a file is executed on a runtime using v8 coverage (node or chromium) and on runtime using istanbul coverage (firefox or webkit)`,
|
|
2738
|
-
suggestion: "
|
|
2737
|
+
"details": `This happens when a file is executed on a runtime using v8 coverage (node or chromium) and on runtime using istanbul coverage (firefox or webkit)`,
|
|
2738
|
+
"suggestion": "disable this warning with coverageV8ConflictWarning: false",
|
|
2739
|
+
"suggestion 2": `force coverage using istanbul with coverageMethodForBrowsers: "istanbul"`
|
|
2739
2740
|
}));
|
|
2740
2741
|
}
|
|
2741
2742
|
fileByFileCoverage[key] = v8Coverage;
|
|
@@ -4025,6 +4026,7 @@ const executeTestPlan = async ({
|
|
|
4025
4026
|
"./**/src/**/*.tsx": true,
|
|
4026
4027
|
"./**/tests/": false,
|
|
4027
4028
|
"./**/*.test.html": false,
|
|
4029
|
+
"./**/*.test.html@*.js": false,
|
|
4028
4030
|
"./**/*.test.js": false,
|
|
4029
4031
|
"./**/*.test.mjs": false
|
|
4030
4032
|
},
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@jsenv/test",
|
|
3
|
-
"version": "1.1.
|
|
3
|
+
"version": "1.1.3",
|
|
4
4
|
"license": "MIT",
|
|
5
5
|
"repository": {
|
|
6
6
|
"type": "git",
|
|
@@ -33,7 +33,7 @@
|
|
|
33
33
|
"playwright": "1.x"
|
|
34
34
|
},
|
|
35
35
|
"dependencies": {
|
|
36
|
-
"@jsenv/core": "35.0.
|
|
36
|
+
"@jsenv/core": "35.0.4",
|
|
37
37
|
"@jsenv/abort": "4.2.4",
|
|
38
38
|
"@jsenv/ast": "3.0.7",
|
|
39
39
|
"@jsenv/filesystem": "4.2.3",
|
|
@@ -1,27 +1,27 @@
|
|
|
1
|
-
import { requireFromJsenv } from "@jsenv/core/src/helpers/require_from_jsenv.js"
|
|
1
|
+
import { requireFromJsenv } from "@jsenv/core/src/helpers/require_from_jsenv.js";
|
|
2
2
|
|
|
3
3
|
// https://github.com/istanbuljs/babel-plugin-istanbul/blob/321740f7b25d803f881466ea819d870f7ed6a254/src/index.js
|
|
4
4
|
|
|
5
5
|
export const babelPluginInstrument = (api, { useInlineSourceMaps = false }) => {
|
|
6
|
-
const { programVisitor } = requireFromJsenv("istanbul-lib-instrument")
|
|
7
|
-
const { types } = api
|
|
6
|
+
const { programVisitor } = requireFromJsenv("istanbul-lib-instrument");
|
|
7
|
+
const { types } = api;
|
|
8
8
|
|
|
9
9
|
return {
|
|
10
10
|
name: "transform-instrument",
|
|
11
11
|
visitor: {
|
|
12
12
|
Program: {
|
|
13
13
|
enter(path) {
|
|
14
|
-
const { file } = this
|
|
15
|
-
const { opts } = file
|
|
16
|
-
let inputSourceMap
|
|
14
|
+
const { file } = this;
|
|
15
|
+
const { opts } = file;
|
|
16
|
+
let inputSourceMap;
|
|
17
17
|
if (useInlineSourceMaps) {
|
|
18
18
|
// https://github.com/istanbuljs/babel-plugin-istanbul/commit/a9e15643d249a2985e4387e4308022053b2cd0ad#diff-1fdf421c05c1140f6d71444ea2b27638R65
|
|
19
19
|
inputSourceMap =
|
|
20
20
|
opts.inputSourceMap || file.inputMap
|
|
21
21
|
? file.inputMap.sourcemap
|
|
22
|
-
: null
|
|
22
|
+
: null;
|
|
23
23
|
} else {
|
|
24
|
-
inputSourceMap = opts.inputSourceMap
|
|
24
|
+
inputSourceMap = opts.inputSourceMap;
|
|
25
25
|
}
|
|
26
26
|
this.__dv__ = programVisitor(
|
|
27
27
|
types,
|
|
@@ -30,19 +30,19 @@ export const babelPluginInstrument = (api, { useInlineSourceMaps = false }) => {
|
|
|
30
30
|
coverageVariable: "__coverage__",
|
|
31
31
|
inputSourceMap,
|
|
32
32
|
},
|
|
33
|
-
)
|
|
34
|
-
this.__dv__.enter(path)
|
|
33
|
+
);
|
|
34
|
+
this.__dv__.enter(path);
|
|
35
35
|
},
|
|
36
36
|
|
|
37
37
|
exit(path) {
|
|
38
38
|
if (!this.__dv__) {
|
|
39
|
-
return
|
|
39
|
+
return;
|
|
40
40
|
}
|
|
41
|
-
const object = this.__dv__.exit(path)
|
|
41
|
+
const object = this.__dv__.exit(path);
|
|
42
42
|
// object got two properties: fileCoverage and sourceMappingURL
|
|
43
|
-
this.file.metadata.coverage = object.fileCoverage
|
|
43
|
+
this.file.metadata.coverage = object.fileCoverage;
|
|
44
44
|
},
|
|
45
45
|
},
|
|
46
46
|
},
|
|
47
|
-
}
|
|
48
|
-
}
|
|
47
|
+
};
|
|
48
|
+
};
|
|
@@ -1,8 +1,8 @@
|
|
|
1
|
-
import { fileURLToPath } from "node:url"
|
|
2
|
-
import { readFileSync } from "node:fs"
|
|
1
|
+
import { fileURLToPath } from "node:url";
|
|
2
|
+
import { readFileSync } from "node:fs";
|
|
3
3
|
|
|
4
|
-
import { requireFromJsenv } from "@jsenv/core/src/helpers/require_from_jsenv.js"
|
|
5
|
-
import { istanbulCoverageMapFromCoverage } from "./istanbul_coverage_map_from_coverage.js"
|
|
4
|
+
import { requireFromJsenv } from "@jsenv/core/src/helpers/require_from_jsenv.js";
|
|
5
|
+
import { istanbulCoverageMapFromCoverage } from "./istanbul_coverage_map_from_coverage.js";
|
|
6
6
|
|
|
7
7
|
export const generateCoverageHtmlDirectory = async (
|
|
8
8
|
coverage,
|
|
@@ -13,20 +13,20 @@ export const generateCoverageHtmlDirectory = async (
|
|
|
13
13
|
coverageReportSkipFull,
|
|
14
14
|
},
|
|
15
15
|
) => {
|
|
16
|
-
const libReport = requireFromJsenv("istanbul-lib-report")
|
|
17
|
-
const reports = requireFromJsenv("istanbul-reports")
|
|
16
|
+
const libReport = requireFromJsenv("istanbul-lib-report");
|
|
17
|
+
const reports = requireFromJsenv("istanbul-reports");
|
|
18
18
|
|
|
19
19
|
const context = libReport.createContext({
|
|
20
20
|
dir: fileURLToPath(rootDirectoryUrl),
|
|
21
21
|
coverageMap: istanbulCoverageMapFromCoverage(coverage),
|
|
22
22
|
sourceFinder: (path) =>
|
|
23
23
|
readFileSync(new URL(path, rootDirectoryUrl), "utf8"),
|
|
24
|
-
})
|
|
24
|
+
});
|
|
25
25
|
|
|
26
26
|
const report = reports.create("html", {
|
|
27
27
|
skipEmpty: coverageReportSkipEmpty,
|
|
28
28
|
skipFull: coverageReportSkipFull,
|
|
29
29
|
subdir: coverageHtmlDirectoryRelativeUrl,
|
|
30
|
-
})
|
|
31
|
-
report.execute(context)
|
|
32
|
-
}
|
|
30
|
+
});
|
|
31
|
+
report.execute(context);
|
|
32
|
+
};
|
|
@@ -1,17 +1,17 @@
|
|
|
1
|
-
import { writeFile } from "@jsenv/filesystem"
|
|
2
|
-
import { urlToFileSystemPath } from "@jsenv/urls"
|
|
3
|
-
import { byteAsFileSize } from "@jsenv/log"
|
|
1
|
+
import { writeFile } from "@jsenv/filesystem";
|
|
2
|
+
import { urlToFileSystemPath } from "@jsenv/urls";
|
|
3
|
+
import { byteAsFileSize } from "@jsenv/log";
|
|
4
4
|
|
|
5
5
|
export const generateCoverageJsonFile = async ({
|
|
6
6
|
coverage,
|
|
7
7
|
coverageJsonFileUrl,
|
|
8
8
|
logger,
|
|
9
9
|
}) => {
|
|
10
|
-
const coverageAsText = JSON.stringify(coverage, null, " ")
|
|
10
|
+
const coverageAsText = JSON.stringify(coverage, null, " ");
|
|
11
11
|
logger.info(
|
|
12
12
|
`-> ${urlToFileSystemPath(coverageJsonFileUrl)} (${byteAsFileSize(
|
|
13
13
|
Buffer.byteLength(coverageAsText),
|
|
14
14
|
)})`,
|
|
15
|
-
)
|
|
16
|
-
await writeFile(coverageJsonFileUrl, coverageAsText)
|
|
17
|
-
}
|
|
15
|
+
);
|
|
16
|
+
await writeFile(coverageJsonFileUrl, coverageAsText);
|
|
17
|
+
};
|
|
@@ -1,19 +1,19 @@
|
|
|
1
|
-
import { requireFromJsenv } from "@jsenv/core/src/helpers/require_from_jsenv.js"
|
|
2
|
-
import { istanbulCoverageMapFromCoverage } from "./istanbul_coverage_map_from_coverage.js"
|
|
1
|
+
import { requireFromJsenv } from "@jsenv/core/src/helpers/require_from_jsenv.js";
|
|
2
|
+
import { istanbulCoverageMapFromCoverage } from "./istanbul_coverage_map_from_coverage.js";
|
|
3
3
|
|
|
4
4
|
export const generateCoverageTextLog = (
|
|
5
5
|
coverage,
|
|
6
6
|
{ coverageReportSkipEmpty, coverageReportSkipFull },
|
|
7
7
|
) => {
|
|
8
|
-
const libReport = requireFromJsenv("istanbul-lib-report")
|
|
9
|
-
const reports = requireFromJsenv("istanbul-reports")
|
|
8
|
+
const libReport = requireFromJsenv("istanbul-lib-report");
|
|
9
|
+
const reports = requireFromJsenv("istanbul-reports");
|
|
10
10
|
|
|
11
11
|
const context = libReport.createContext({
|
|
12
12
|
coverageMap: istanbulCoverageMapFromCoverage(coverage),
|
|
13
|
-
})
|
|
13
|
+
});
|
|
14
14
|
const report = reports.create("text", {
|
|
15
15
|
skipEmpty: coverageReportSkipEmpty,
|
|
16
16
|
skipFull: coverageReportSkipFull,
|
|
17
|
-
})
|
|
18
|
-
report.execute(context)
|
|
19
|
-
}
|
|
17
|
+
});
|
|
18
|
+
report.execute(context);
|
|
19
|
+
};
|
|
@@ -1,52 +1,52 @@
|
|
|
1
|
-
import { readFile } from "@jsenv/filesystem"
|
|
2
|
-
import { resolveUrl } from "@jsenv/urls"
|
|
3
|
-
import { Abort } from "@jsenv/abort"
|
|
4
|
-
import { applyBabelPlugins } from "@jsenv/ast"
|
|
5
|
-
import { requireFromJsenv } from "@jsenv/core/src/helpers/require_from_jsenv.js"
|
|
1
|
+
import { readFile } from "@jsenv/filesystem";
|
|
2
|
+
import { resolveUrl } from "@jsenv/urls";
|
|
3
|
+
import { Abort } from "@jsenv/abort";
|
|
4
|
+
import { applyBabelPlugins } from "@jsenv/ast";
|
|
5
|
+
import { requireFromJsenv } from "@jsenv/core/src/helpers/require_from_jsenv.js";
|
|
6
6
|
|
|
7
|
-
import { babelPluginInstrument } from "./babel_plugin_instrument.js"
|
|
7
|
+
import { babelPluginInstrument } from "./babel_plugin_instrument.js";
|
|
8
8
|
|
|
9
9
|
export const relativeUrlToEmptyCoverage = async (
|
|
10
10
|
relativeUrl,
|
|
11
11
|
{ signal, rootDirectoryUrl },
|
|
12
12
|
) => {
|
|
13
|
-
const operation = Abort.startOperation()
|
|
14
|
-
operation.addAbortSignal(signal)
|
|
13
|
+
const operation = Abort.startOperation();
|
|
14
|
+
operation.addAbortSignal(signal);
|
|
15
15
|
|
|
16
16
|
try {
|
|
17
|
-
const fileUrl = resolveUrl(relativeUrl, rootDirectoryUrl)
|
|
18
|
-
const content = await readFile(fileUrl, { as: "string" })
|
|
17
|
+
const fileUrl = resolveUrl(relativeUrl, rootDirectoryUrl);
|
|
18
|
+
const content = await readFile(fileUrl, { as: "string" });
|
|
19
19
|
|
|
20
|
-
operation.throwIfAborted()
|
|
20
|
+
operation.throwIfAborted();
|
|
21
21
|
const { metadata } = await applyBabelPlugins({
|
|
22
22
|
babelPlugins: [babelPluginInstrument],
|
|
23
23
|
urlInfo: {
|
|
24
24
|
originalUrl: fileUrl,
|
|
25
25
|
content,
|
|
26
26
|
},
|
|
27
|
-
})
|
|
28
|
-
const { coverage } = metadata
|
|
27
|
+
});
|
|
28
|
+
const { coverage } = metadata;
|
|
29
29
|
if (!coverage) {
|
|
30
|
-
throw new Error(`missing coverage for file`)
|
|
30
|
+
throw new Error(`missing coverage for file`);
|
|
31
31
|
}
|
|
32
32
|
// https://github.com/gotwarlost/istanbul/blob/bc84c315271a5dd4d39bcefc5925cfb61a3d174a/lib/command/common/run-with-cover.js#L229
|
|
33
33
|
Object.keys(coverage.s).forEach(function (key) {
|
|
34
|
-
coverage.s[key] = 0
|
|
35
|
-
})
|
|
36
|
-
return coverage
|
|
34
|
+
coverage.s[key] = 0;
|
|
35
|
+
});
|
|
36
|
+
return coverage;
|
|
37
37
|
} catch (e) {
|
|
38
38
|
if (e && e.code === "PARSE_ERROR") {
|
|
39
39
|
// return an empty coverage for that file when
|
|
40
40
|
// it contains a syntax error
|
|
41
|
-
return createEmptyCoverage(relativeUrl)
|
|
41
|
+
return createEmptyCoverage(relativeUrl);
|
|
42
42
|
}
|
|
43
|
-
throw e
|
|
43
|
+
throw e;
|
|
44
44
|
} finally {
|
|
45
|
-
await operation.end()
|
|
45
|
+
await operation.end();
|
|
46
46
|
}
|
|
47
|
-
}
|
|
47
|
+
};
|
|
48
48
|
|
|
49
49
|
const createEmptyCoverage = (relativeUrl) => {
|
|
50
|
-
const { createFileCoverage } = requireFromJsenv("istanbul-lib-coverage")
|
|
51
|
-
return createFileCoverage(relativeUrl).toJSON()
|
|
52
|
-
}
|
|
50
|
+
const { createFileCoverage } = requireFromJsenv("istanbul-lib-coverage");
|
|
51
|
+
return createFileCoverage(relativeUrl).toJSON();
|
|
52
|
+
};
|
|
@@ -2,24 +2,24 @@ import {
|
|
|
2
2
|
urlToRelativeUrl,
|
|
3
3
|
fileSystemPathToUrl,
|
|
4
4
|
isFileSystemPath,
|
|
5
|
-
} from "@jsenv/urls"
|
|
5
|
+
} from "@jsenv/urls";
|
|
6
6
|
|
|
7
7
|
export const normalizeFileByFileCoveragePaths = (
|
|
8
8
|
fileByFileCoverage,
|
|
9
9
|
rootDirectoryUrl,
|
|
10
10
|
) => {
|
|
11
|
-
const fileByFileNormalized = {}
|
|
11
|
+
const fileByFileNormalized = {};
|
|
12
12
|
Object.keys(fileByFileCoverage).forEach((key) => {
|
|
13
|
-
const fileCoverage = fileByFileCoverage[key]
|
|
14
|
-
const { path } = fileCoverage
|
|
13
|
+
const fileCoverage = fileByFileCoverage[key];
|
|
14
|
+
const { path } = fileCoverage;
|
|
15
15
|
const url = isFileSystemPath(path)
|
|
16
16
|
? fileSystemPathToUrl(path)
|
|
17
|
-
: new URL(path, rootDirectoryUrl).href
|
|
18
|
-
const relativeUrl = urlToRelativeUrl(url, rootDirectoryUrl)
|
|
17
|
+
: new URL(path, rootDirectoryUrl).href;
|
|
18
|
+
const relativeUrl = urlToRelativeUrl(url, rootDirectoryUrl);
|
|
19
19
|
fileByFileNormalized[`./${relativeUrl}`] = {
|
|
20
20
|
...fileCoverage,
|
|
21
21
|
path: `./${relativeUrl}`,
|
|
22
|
-
}
|
|
23
|
-
})
|
|
24
|
-
return fileByFileNormalized
|
|
25
|
-
}
|
|
22
|
+
};
|
|
23
|
+
});
|
|
24
|
+
return fileByFileNormalized;
|
|
25
|
+
};
|
|
@@ -1,28 +1,28 @@
|
|
|
1
|
-
import { requireFromJsenv } from "@jsenv/core/src/helpers/require_from_jsenv.js"
|
|
1
|
+
import { requireFromJsenv } from "@jsenv/core/src/helpers/require_from_jsenv.js";
|
|
2
2
|
|
|
3
3
|
export const composeTwoFileByFileIstanbulCoverages = (
|
|
4
4
|
firstFileByFileIstanbulCoverage,
|
|
5
5
|
secondFileByFileIstanbulCoverage,
|
|
6
6
|
) => {
|
|
7
|
-
const fileByFileIstanbulCoverage = {}
|
|
7
|
+
const fileByFileIstanbulCoverage = {};
|
|
8
8
|
Object.keys(firstFileByFileIstanbulCoverage).forEach((key) => {
|
|
9
|
-
fileByFileIstanbulCoverage[key] = firstFileByFileIstanbulCoverage[key]
|
|
10
|
-
})
|
|
9
|
+
fileByFileIstanbulCoverage[key] = firstFileByFileIstanbulCoverage[key];
|
|
10
|
+
});
|
|
11
11
|
Object.keys(secondFileByFileIstanbulCoverage).forEach((key) => {
|
|
12
|
-
const firstCoverage = firstFileByFileIstanbulCoverage[key]
|
|
13
|
-
const secondCoverage = secondFileByFileIstanbulCoverage[key]
|
|
12
|
+
const firstCoverage = firstFileByFileIstanbulCoverage[key];
|
|
13
|
+
const secondCoverage = secondFileByFileIstanbulCoverage[key];
|
|
14
14
|
fileByFileIstanbulCoverage[key] = firstCoverage
|
|
15
15
|
? merge(firstCoverage, secondCoverage)
|
|
16
|
-
: secondCoverage
|
|
17
|
-
})
|
|
16
|
+
: secondCoverage;
|
|
17
|
+
});
|
|
18
18
|
|
|
19
|
-
return fileByFileIstanbulCoverage
|
|
20
|
-
}
|
|
19
|
+
return fileByFileIstanbulCoverage;
|
|
20
|
+
};
|
|
21
21
|
|
|
22
22
|
const merge = (firstIstanbulCoverage, secondIstanbulCoverage) => {
|
|
23
|
-
const { createFileCoverage } = requireFromJsenv("istanbul-lib-coverage")
|
|
24
|
-
const istanbulFileCoverageObject = createFileCoverage(firstIstanbulCoverage)
|
|
25
|
-
istanbulFileCoverageObject.merge(secondIstanbulCoverage)
|
|
26
|
-
const istanbulCoverage = istanbulFileCoverageObject.toJSON()
|
|
27
|
-
return istanbulCoverage
|
|
28
|
-
}
|
|
23
|
+
const { createFileCoverage } = requireFromJsenv("istanbul-lib-coverage");
|
|
24
|
+
const istanbulFileCoverageObject = createFileCoverage(firstIstanbulCoverage);
|
|
25
|
+
istanbulFileCoverageObject.merge(secondIstanbulCoverage);
|
|
26
|
+
const istanbulCoverage = istanbulFileCoverageObject.toJSON();
|
|
27
|
+
return istanbulCoverage;
|
|
28
|
+
};
|
|
@@ -1,16 +1,16 @@
|
|
|
1
|
-
import { requireFromJsenv } from "@jsenv/core/src/helpers/require_from_jsenv.js"
|
|
1
|
+
import { requireFromJsenv } from "@jsenv/core/src/helpers/require_from_jsenv.js";
|
|
2
2
|
|
|
3
3
|
export const istanbulCoverageMapFromCoverage = (coverage) => {
|
|
4
|
-
const { createCoverageMap } = requireFromJsenv("istanbul-lib-coverage")
|
|
4
|
+
const { createCoverageMap } = requireFromJsenv("istanbul-lib-coverage");
|
|
5
5
|
|
|
6
|
-
const coverageAdjusted = {}
|
|
6
|
+
const coverageAdjusted = {};
|
|
7
7
|
Object.keys(coverage).forEach((key) => {
|
|
8
8
|
coverageAdjusted[key.slice(2)] = {
|
|
9
9
|
...coverage[key],
|
|
10
10
|
path: key.slice(2),
|
|
11
|
-
}
|
|
12
|
-
})
|
|
11
|
+
};
|
|
12
|
+
});
|
|
13
13
|
|
|
14
|
-
const coverageMap = createCoverageMap(coverageAdjusted)
|
|
15
|
-
return coverageMap
|
|
16
|
-
}
|
|
14
|
+
const coverageMap = createCoverageMap(coverageAdjusted);
|
|
15
|
+
return coverageMap;
|
|
16
|
+
};
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { collectFiles } from "@jsenv/filesystem"
|
|
1
|
+
import { collectFiles } from "@jsenv/filesystem";
|
|
2
2
|
|
|
3
3
|
export const listRelativeFileUrlToCover = async ({
|
|
4
4
|
signal,
|
|
@@ -10,6 +10,6 @@ export const listRelativeFileUrlToCover = async ({
|
|
|
10
10
|
directoryUrl: rootDirectoryUrl,
|
|
11
11
|
associations: { cover: coverageConfig },
|
|
12
12
|
predicate: ({ cover }) => cover,
|
|
13
|
-
})
|
|
14
|
-
return matchingFileResultArray.map(({ relativeUrl }) => relativeUrl)
|
|
15
|
-
}
|
|
13
|
+
});
|
|
14
|
+
return matchingFileResultArray.map(({ relativeUrl }) => relativeUrl);
|
|
15
|
+
};
|
|
@@ -1,7 +1,7 @@
|
|
|
1
|
-
import { Abort } from "@jsenv/abort"
|
|
1
|
+
import { Abort } from "@jsenv/abort";
|
|
2
2
|
|
|
3
|
-
import { listRelativeFileUrlToCover } from "./list_files_not_covered.js"
|
|
4
|
-
import { relativeUrlToEmptyCoverage } from "./empty_coverage_factory.js"
|
|
3
|
+
import { listRelativeFileUrlToCover } from "./list_files_not_covered.js";
|
|
4
|
+
import { relativeUrlToEmptyCoverage } from "./empty_coverage_factory.js";
|
|
5
5
|
|
|
6
6
|
export const getMissingFileByFileCoverage = async ({
|
|
7
7
|
signal,
|
|
@@ -13,19 +13,19 @@ export const getMissingFileByFileCoverage = async ({
|
|
|
13
13
|
signal,
|
|
14
14
|
rootDirectoryUrl,
|
|
15
15
|
coverageConfig,
|
|
16
|
-
})
|
|
16
|
+
});
|
|
17
17
|
const relativeUrlsMissing = relativeUrlsToCover.filter((relativeUrlToCover) =>
|
|
18
18
|
Object.keys(fileByFileCoverage).every((key) => {
|
|
19
|
-
return key !== `./${relativeUrlToCover}
|
|
19
|
+
return key !== `./${relativeUrlToCover}`;
|
|
20
20
|
}),
|
|
21
|
-
)
|
|
21
|
+
);
|
|
22
22
|
|
|
23
|
-
const operation = Abort.startOperation()
|
|
24
|
-
operation.addAbortSignal(signal)
|
|
25
|
-
const missingFileByFileCoverage = {}
|
|
23
|
+
const operation = Abort.startOperation();
|
|
24
|
+
operation.addAbortSignal(signal);
|
|
25
|
+
const missingFileByFileCoverage = {};
|
|
26
26
|
await relativeUrlsMissing.reduce(async (previous, relativeUrlMissing) => {
|
|
27
|
-
operation.throwIfAborted()
|
|
28
|
-
await previous
|
|
27
|
+
operation.throwIfAborted();
|
|
28
|
+
await previous;
|
|
29
29
|
await operation.withSignal(async (signal) => {
|
|
30
30
|
const emptyCoverage = await relativeUrlToEmptyCoverage(
|
|
31
31
|
relativeUrlMissing,
|
|
@@ -33,9 +33,9 @@ export const getMissingFileByFileCoverage = async ({
|
|
|
33
33
|
signal,
|
|
34
34
|
rootDirectoryUrl,
|
|
35
35
|
},
|
|
36
|
-
)
|
|
37
|
-
missingFileByFileCoverage[`./${relativeUrlMissing}`] = emptyCoverage
|
|
38
|
-
})
|
|
39
|
-
}, Promise.resolve())
|
|
40
|
-
return missingFileByFileCoverage
|
|
41
|
-
}
|
|
36
|
+
);
|
|
37
|
+
missingFileByFileCoverage[`./${relativeUrlMissing}`] = emptyCoverage;
|
|
38
|
+
});
|
|
39
|
+
}, Promise.resolve());
|
|
40
|
+
return missingFileByFileCoverage;
|
|
41
|
+
};
|
|
@@ -1,14 +1,14 @@
|
|
|
1
|
-
import { readFileSync } from "node:fs"
|
|
2
|
-
import { Abort } from "@jsenv/abort"
|
|
3
|
-
|
|
4
|
-
import { filterV8Coverage } from "./v8_coverage.js"
|
|
5
|
-
import { readNodeV8CoverageDirectory } from "./v8_coverage_node_directory.js"
|
|
6
|
-
import { composeTwoV8Coverages } from "./v8_coverage_composition.js"
|
|
7
|
-
import { composeTwoFileByFileIstanbulCoverages } from "./istanbul_coverage_composition.js"
|
|
8
|
-
import { v8CoverageToIstanbul } from "./v8_coverage_to_istanbul.js"
|
|
9
|
-
import { composeV8AndIstanbul } from "./v8_and_istanbul.js"
|
|
10
|
-
import { normalizeFileByFileCoveragePaths } from "./file_by_file_coverage.js"
|
|
11
|
-
import { getMissingFileByFileCoverage } from "./missing_coverage.js"
|
|
1
|
+
import { readFileSync } from "node:fs";
|
|
2
|
+
import { Abort } from "@jsenv/abort";
|
|
3
|
+
|
|
4
|
+
import { filterV8Coverage } from "./v8_coverage.js";
|
|
5
|
+
import { readNodeV8CoverageDirectory } from "./v8_coverage_node_directory.js";
|
|
6
|
+
import { composeTwoV8Coverages } from "./v8_coverage_composition.js";
|
|
7
|
+
import { composeTwoFileByFileIstanbulCoverages } from "./istanbul_coverage_composition.js";
|
|
8
|
+
import { v8CoverageToIstanbul } from "./v8_coverage_to_istanbul.js";
|
|
9
|
+
import { composeV8AndIstanbul } from "./v8_and_istanbul.js";
|
|
10
|
+
import { normalizeFileByFileCoveragePaths } from "./file_by_file_coverage.js";
|
|
11
|
+
import { getMissingFileByFileCoverage } from "./missing_coverage.js";
|
|
12
12
|
|
|
13
13
|
export const reportToCoverage = async (
|
|
14
14
|
report,
|
|
@@ -51,10 +51,10 @@ export const reportToCoverage = async (
|
|
|
51
51
|
) {
|
|
52
52
|
logger.warn(
|
|
53
53
|
`"${executionName}" execution of ${file} did not properly write coverage into ${executionResult.coverageFileUrl}`,
|
|
54
|
-
)
|
|
54
|
+
);
|
|
55
55
|
}
|
|
56
56
|
},
|
|
57
|
-
})
|
|
57
|
+
});
|
|
58
58
|
|
|
59
59
|
if (coverageMethodForNodeJs === "NODE_V8_COVERAGE") {
|
|
60
60
|
await readNodeV8CoverageDirectory({
|
|
@@ -64,38 +64,38 @@ export const reportToCoverage = async (
|
|
|
64
64
|
const nodeV8CoverageLight = await filterV8Coverage(nodeV8Coverage, {
|
|
65
65
|
rootDirectoryUrl,
|
|
66
66
|
coverageConfig,
|
|
67
|
-
})
|
|
67
|
+
});
|
|
68
68
|
v8Coverage = v8Coverage
|
|
69
69
|
? composeTwoV8Coverages(v8Coverage, nodeV8CoverageLight)
|
|
70
|
-
: nodeV8CoverageLight
|
|
70
|
+
: nodeV8CoverageLight;
|
|
71
71
|
},
|
|
72
|
-
})
|
|
72
|
+
});
|
|
73
73
|
}
|
|
74
74
|
|
|
75
75
|
// try to merge v8 with istanbul, if any
|
|
76
|
-
let fileByFileCoverage
|
|
76
|
+
let fileByFileCoverage;
|
|
77
77
|
if (v8Coverage) {
|
|
78
78
|
let v8FileByFileCoverage = await v8CoverageToIstanbul(v8Coverage, {
|
|
79
79
|
signal,
|
|
80
|
-
})
|
|
80
|
+
});
|
|
81
81
|
|
|
82
82
|
v8FileByFileCoverage = normalizeFileByFileCoveragePaths(
|
|
83
83
|
v8FileByFileCoverage,
|
|
84
84
|
rootDirectoryUrl,
|
|
85
|
-
)
|
|
85
|
+
);
|
|
86
86
|
|
|
87
87
|
if (fileByFileIstanbulCoverage) {
|
|
88
88
|
fileByFileIstanbulCoverage = normalizeFileByFileCoveragePaths(
|
|
89
89
|
fileByFileIstanbulCoverage,
|
|
90
90
|
rootDirectoryUrl,
|
|
91
|
-
)
|
|
91
|
+
);
|
|
92
92
|
fileByFileCoverage = composeV8AndIstanbul(
|
|
93
93
|
v8FileByFileCoverage,
|
|
94
94
|
fileByFileIstanbulCoverage,
|
|
95
95
|
{ coverageV8ConflictWarning },
|
|
96
|
-
)
|
|
96
|
+
);
|
|
97
97
|
} else {
|
|
98
|
-
fileByFileCoverage = v8FileByFileCoverage
|
|
98
|
+
fileByFileCoverage = v8FileByFileCoverage;
|
|
99
99
|
}
|
|
100
100
|
}
|
|
101
101
|
// get istanbul only
|
|
@@ -103,11 +103,11 @@ export const reportToCoverage = async (
|
|
|
103
103
|
fileByFileCoverage = normalizeFileByFileCoveragePaths(
|
|
104
104
|
fileByFileIstanbulCoverage,
|
|
105
105
|
rootDirectoryUrl,
|
|
106
|
-
)
|
|
106
|
+
);
|
|
107
107
|
}
|
|
108
108
|
// no coverage found in execution (or zero file where executed)
|
|
109
109
|
else {
|
|
110
|
-
fileByFileCoverage = {}
|
|
110
|
+
fileByFileCoverage = {};
|
|
111
111
|
}
|
|
112
112
|
|
|
113
113
|
// now add coverage for file not covered
|
|
@@ -117,82 +117,82 @@ export const reportToCoverage = async (
|
|
|
117
117
|
rootDirectoryUrl,
|
|
118
118
|
coverageConfig,
|
|
119
119
|
fileByFileCoverage,
|
|
120
|
-
})
|
|
120
|
+
});
|
|
121
121
|
Object.assign(
|
|
122
122
|
fileByFileCoverage,
|
|
123
123
|
normalizeFileByFileCoveragePaths(
|
|
124
124
|
missingFileByFileCoverage,
|
|
125
125
|
rootDirectoryUrl,
|
|
126
126
|
),
|
|
127
|
-
)
|
|
127
|
+
);
|
|
128
128
|
}
|
|
129
129
|
|
|
130
|
-
return fileByFileCoverage
|
|
131
|
-
}
|
|
130
|
+
return fileByFileCoverage;
|
|
131
|
+
};
|
|
132
132
|
|
|
133
133
|
const getCoverageFromReport = async ({ signal, report, onMissing }) => {
|
|
134
|
-
const operation = Abort.startOperation()
|
|
135
|
-
operation.addAbortSignal(signal)
|
|
134
|
+
const operation = Abort.startOperation();
|
|
135
|
+
operation.addAbortSignal(signal);
|
|
136
136
|
|
|
137
137
|
try {
|
|
138
|
-
let v8Coverage
|
|
139
|
-
let fileByFileIstanbulCoverage
|
|
138
|
+
let v8Coverage;
|
|
139
|
+
let fileByFileIstanbulCoverage;
|
|
140
140
|
|
|
141
141
|
// collect v8 and istanbul coverage from executions
|
|
142
142
|
await Object.keys(report).reduce(async (previous, file) => {
|
|
143
|
-
operation.throwIfAborted()
|
|
144
|
-
await previous
|
|
143
|
+
operation.throwIfAborted();
|
|
144
|
+
await previous;
|
|
145
145
|
|
|
146
|
-
const executionResultForFile = report[file]
|
|
146
|
+
const executionResultForFile = report[file];
|
|
147
147
|
await Object.keys(executionResultForFile).reduce(
|
|
148
148
|
async (previous, executionName) => {
|
|
149
|
-
operation.throwIfAborted()
|
|
150
|
-
await previous
|
|
149
|
+
operation.throwIfAborted();
|
|
150
|
+
await previous;
|
|
151
151
|
|
|
152
152
|
const executionResultForFileOnRuntime =
|
|
153
|
-
executionResultForFile[executionName]
|
|
154
|
-
const { coverageFileUrl } = executionResultForFileOnRuntime
|
|
155
|
-
let executionCoverage
|
|
153
|
+
executionResultForFile[executionName];
|
|
154
|
+
const { coverageFileUrl } = executionResultForFileOnRuntime;
|
|
155
|
+
let executionCoverage;
|
|
156
156
|
try {
|
|
157
157
|
executionCoverage = JSON.parse(
|
|
158
158
|
String(readFileSync(new URL(coverageFileUrl))),
|
|
159
|
-
)
|
|
159
|
+
);
|
|
160
160
|
} catch (e) {
|
|
161
161
|
if (e.code === "ENOENT" || e.name === "SyntaxError") {
|
|
162
162
|
onMissing({
|
|
163
163
|
executionName,
|
|
164
164
|
file,
|
|
165
165
|
executionResult: executionResultForFileOnRuntime,
|
|
166
|
-
})
|
|
167
|
-
return
|
|
166
|
+
});
|
|
167
|
+
return;
|
|
168
168
|
}
|
|
169
|
-
throw e
|
|
169
|
+
throw e;
|
|
170
170
|
}
|
|
171
171
|
|
|
172
172
|
if (isV8Coverage(executionCoverage)) {
|
|
173
173
|
v8Coverage = v8Coverage
|
|
174
174
|
? composeTwoV8Coverages(v8Coverage, executionCoverage)
|
|
175
|
-
: executionCoverage
|
|
175
|
+
: executionCoverage;
|
|
176
176
|
} else {
|
|
177
177
|
fileByFileIstanbulCoverage = fileByFileIstanbulCoverage
|
|
178
178
|
? composeTwoFileByFileIstanbulCoverages(
|
|
179
179
|
fileByFileIstanbulCoverage,
|
|
180
180
|
executionCoverage,
|
|
181
181
|
)
|
|
182
|
-
: executionCoverage
|
|
182
|
+
: executionCoverage;
|
|
183
183
|
}
|
|
184
184
|
},
|
|
185
185
|
Promise.resolve(),
|
|
186
|
-
)
|
|
187
|
-
}, Promise.resolve())
|
|
186
|
+
);
|
|
187
|
+
}, Promise.resolve());
|
|
188
188
|
|
|
189
189
|
return {
|
|
190
190
|
v8Coverage,
|
|
191
191
|
fileByFileIstanbulCoverage,
|
|
192
|
-
}
|
|
192
|
+
};
|
|
193
193
|
} finally {
|
|
194
|
-
await operation.end()
|
|
194
|
+
await operation.end();
|
|
195
195
|
}
|
|
196
|
-
}
|
|
196
|
+
};
|
|
197
197
|
|
|
198
|
-
const isV8Coverage = (coverage) => Boolean(coverage.result)
|
|
198
|
+
const isV8Coverage = (coverage) => Boolean(coverage.result);
|