1 | import libCoverage from "istanbul-lib-coverage";
|
2 | import { istanbulize } from "istanbulize";
|
3 | import { parseSys as parseNodeScriptUrl } from "node-script-url";
|
4 | import urlMod from "url";
|
5 | import { Incident } from "incident";
|
6 | import { getText as defaultGetText } from "./get-text";
|
7 | import { mergeCovMaps } from "./istanbul-merge";
|
8 | import { mergeRichProcessCovs } from "./merge";
|
9 | import { addFromGeneratedFileCov } from "./source-map";
|
10 | import { CoverageMapBuilder } from "./source-map/builder";
|
11 | import { MemorySourceStore } from "./source-map/source-store";
|
12 | export async function processCovsToIstanbul(processCovs, getText = defaultGetText) {
|
13 | const merged = mergeRichProcessCovs(processCovs);
|
14 | return toIstanbul(merged, getText);
|
15 | }
|
16 | /**
|
17 | * Convert to an istanbul coverage map (applying source maps).
|
18 | *
|
19 | * @param processCov Process coverage to convert.
|
20 | * @param getText Function used to load text from URLs (used to load source maps).
|
21 | */
|
22 | async function toIstanbul(processCov, getText = defaultGetText) {
|
23 | const rawCoverageMap = toRawIstanbul(processCov);
|
24 | const generatedCovMap = Object.create(null);
|
25 | const originalBuilder = new CoverageMapBuilder();
|
26 | const sourceStore = new MemorySourceStore();
|
27 | for (const scriptCov of processCov.result) {
|
28 | const rawFileCov = rawCoverageMap[scriptCov.url];
|
29 | let useOriginal = false;
|
30 | if (scriptCov.sourceMapUrl !== undefined && parseNodeScriptUrl(scriptCov.url).isFileUrl) {
|
31 | let sourceMapUrl;
|
32 | try {
|
33 | sourceMapUrl = new urlMod.URL(scriptCov.sourceMapUrl, scriptCov.url);
|
34 | }
|
35 | catch (err) {
|
36 | throw new Incident(err, "SourceMapUrlResolutionError", { url: scriptCov.url, sourceMapUrl: scriptCov.sourceMapUrl });
|
37 | }
|
38 | let sourceMapString;
|
39 | try {
|
40 | sourceMapString = await getText(sourceMapUrl);
|
41 | }
|
42 | catch (err) {
|
43 | throw new Incident(err, "SourceMapReadError", { scriptUrl: scriptCov.url, sourceMapUrl: sourceMapUrl.href });
|
44 | }
|
45 | const rawSourceMap = JSON.parse(sourceMapString);
|
46 | useOriginal = await addFromGeneratedFileCov(originalBuilder, sourceStore, rawFileCov, rawSourceMap, scriptCov.sourceMapUrl);
|
47 | }
|
48 | if (!useOriginal) {
|
49 | sourceStore.set(scriptCov.url, scriptCov.sourceText);
|
50 | generatedCovMap[scriptCov.url] = rawFileCov;
|
51 | }
|
52 | }
|
53 | const coverageMap = mergeCovMaps([generatedCovMap, originalBuilder.build()]);
|
54 | return {
|
55 | coverageMap: libCoverage.createCoverageMap(coverageMap),
|
56 | sources: new Map(sourceStore),
|
57 | };
|
58 | }
|
59 | /**
|
60 | * Convert to an istanbul coverage map, without applying source maps.
|
61 | *
|
62 | * @param processCov Process coverage to convert.
|
63 | */
|
64 | export function toRawIstanbul(processCov) {
|
65 | const coverageMap = Object.create(null);
|
66 | for (const scriptCov of processCov.result) {
|
67 | try {
|
68 | const generatedFileCov = istanbulize({
|
69 | sourceType: scriptCov.sourceType,
|
70 | sourceText: scriptCov.sourceText,
|
71 | scriptCov,
|
72 | });
|
73 | coverageMap[scriptCov.url] = libCoverage.createFileCoverage(generatedFileCov);
|
74 | }
|
75 | catch (err) {
|
76 | const cause = err;
|
77 | const message = `IstanbulizeFailure for the script ${JSON.stringify(scriptCov.url)}\n${err.message}`;
|
78 | const newErr = Object.assign(new Error(message), { cause, scriptCov });
|
79 | throw newErr;
|
80 | }
|
81 | }
|
82 | return coverageMap;
|
83 | }
|
84 |
|
85 | //# sourceMappingURL=data:application/json;charset=utf8;base64,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QyxLQUFLLEdBQUcsQ0FBQyxPQUFPLEVBQUUsQ0FBQztZQUM3RyxNQUFNLE1BQU0sR0FBVSxNQUFNLENBQUMsTUFBTSxDQUFDLElBQUksS0FBSyxDQUFDLE9BQU8sQ0FBQyxFQUFFLEVBQUMsS0FBSyxFQUFFLFNBQVMsRUFBQyxDQUFDLENBQUM7WUFDNUUsTUFBTSxNQUFNLENBQUM7U0FDZDtLQUNGO0lBRUQsT0FBTyxXQUFXLENBQUM7QUFDckIsQ0FBQyIsImZpbGUiOiJ0by1pc3RhbmJ1bC5qcyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBsaWJDb3ZlcmFnZSBmcm9tIFwiaXN0YW5idWwtbGliLWNvdmVyYWdlXCI7XG5pbXBvcnQgeyBpc3RhbmJ1bGl6ZSB9IGZyb20gXCJpc3RhbmJ1bGl6ZVwiO1xuaW1wb3J0IHsgcGFyc2VTeXMgYXMgcGFyc2VOb2RlU2NyaXB0VXJsIH0gZnJvbSBcIm5vZGUtc2NyaXB0LXVybFwiO1xuaW1wb3J0IHNvdXJjZU1hcCBmcm9tIFwic291cmNlLW1hcFwiO1xuaW1wb3J0IHVybE1vZCBmcm9tIFwidXJsXCI7XG5pbXBvcnQgeyBJbmNpZGVudCB9IGZyb20gXCJpbmNpZGVudFwiO1xuaW1wb3J0IHsgR2V0VGV4dCwgZ2V0VGV4dCBhcyBkZWZhdWx0R2V0VGV4dCB9IGZyb20gXCIuL2dldC10ZXh0XCI7XG5pbXBvcnQgeyBtZXJnZUNvdk1hcHMgfSBmcm9tIFwiLi9pc3RhbmJ1bC1tZXJnZVwiO1xuaW1wb3J0IHsgbWVyZ2VSaWNoUHJvY2Vzc0NvdnMgfSBmcm9tIFwiLi9tZXJnZVwiO1xuaW1wb3J0IHsgYWRkRnJvbUdlbmVyYXRlZEZpbGVDb3YgfSBmcm9tIFwiLi9zb3VyY2UtbWFwXCI7XG5pbXBvcnQgeyBDb3ZlcmFnZU1hcEJ1aWxkZXIgfSBmcm9tIFwiLi9zb3VyY2UtbWFwL2J1aWxkZXJcIjtcbmltcG9ydCB7IE1lbW9yeVNvdXJjZVN0b3JlLCBOdWxsYWJsZVNvdXJjZVRleHQgfSBmcm9tIFwiLi9zb3VyY2UtbWFwL3NvdXJjZS1zdG9yZVwiO1xuaW1wb3J0IHsgUmljaFByb2Nlc3NDb3YgfSBmcm9tIFwiLi9zcGF3bi1pbnNwZWN0ZWRcIjtcblxuZXhwb3J0IGludGVyZmFjZSBSaWNoSXN0YW5idWxDb3ZlcmFnZU1hcCB7XG4gIGNvdmVyYWdlTWFwOiBsaWJDb3ZlcmFnZS5Db3ZlcmFnZU1hcDtcbiAgc291cmNlczogTWFwPHN0cmluZywgTnVsbGFibGVTb3VyY2VUZXh0Pjtcbn1cblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHByb2Nlc3NDb3ZzVG9Jc3RhbmJ1bChcbiAgcHJvY2Vzc0NvdnM6IFJlYWRvbmx5QXJyYXk8UmljaFByb2Nlc3NDb3Y+LFxuICBnZXRUZXh0OiBHZXRUZXh0ID0gZGVmYXVsdEdldFRleHQsXG4pOiBQcm9taXNlPFJpY2hJc3RhbmJ1bENvdmVyYWdlTWFwPiB7XG4gIGNvbnN0IG1lcmdlZDogUmljaFByb2Nlc3NDb3YgPSBtZXJnZVJpY2hQcm9jZXNzQ292cyhwcm9jZXNzQ292cyk7XG4gIHJldHVybiB0b0lzdGFuYnVsKG1lcmdlZCwgZ2V0VGV4dCk7XG59XG5cbi8qKlxuICogQ29udmVydCB0byBhbiBpc3RhbmJ1bCBjb3ZlcmFnZSBtYXAgKGFwcGx5aW5nIHNvdXJjZSBtYXBzKS5cbiAqXG4gKiBAcGFyYW0gcHJvY2Vzc0NvdiBQcm9jZXNzIGNvdmVyYWdlIHRvIGNvbnZlcnQuXG4gKiBAcGFyYW0gZ2V0VGV4dCBGdW5jdGlvbiB1c2VkIHRvIGxvYWQgdGV4dCBmcm9tIFVSTHMgKHVzZWQgdG8gbG9hZCBzb3VyY2UgbWFwcykuXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIHRvSXN0YW5idWwoXG4gIHByb2Nlc3NDb3Y6IFJpY2hQcm9jZXNzQ292LFxuICBnZXRUZXh0OiBHZXRUZXh0ID0gZGVmYXVsdEdldFRleHQsXG4pOiBQcm9taXNlPFJpY2hJc3RhbmJ1bENvdmVyYWdlTWFwPiB7XG4gIGNvbnN0IHJhd0NvdmVyYWdlTWFwOiBsaWJDb3ZlcmFnZS5Db3ZlcmFnZU1hcERhdGEgPSB0b1Jhd0lzdGFuYnVsKHByb2Nlc3NDb3YpO1xuXG4gIGNvbnN0IGdlbmVyYXRlZENvdk1hcDogbGliQ292ZXJhZ2UuQ292ZXJhZ2VNYXBEYXRhID0gT2JqZWN0LmNyZWF0ZShudWxsKTtcbiAgY29uc3Qgb3JpZ2luYWxCdWlsZGVyOiBDb3ZlcmFnZU1hcEJ1aWxkZXIgPSBuZXcgQ292ZXJhZ2VNYXBCdWlsZGVyKCk7XG4gIGNvbnN0IHNvdXJjZVN0b3JlOiBNZW1vcnlTb3VyY2VTdG9yZSA9IG5ldyBNZW1vcnlTb3VyY2VTdG9yZSgpO1xuXG4gIGZvciAoY29uc3Qgc2NyaXB0Q292IG9mIHByb2Nlc3NDb3YucmVzdWx0KSB7XG4gICAgY29uc3QgcmF3RmlsZUNvdjogbGliQ292ZXJhZ2UuRmlsZUNvdmVyYWdlID0gcmF3Q292ZXJhZ2VNYXBbc2NyaXB0Q292LnVybF07XG4gICAgbGV0IHVzZU9yaWdpbmFsOiBib29sZWFuID0gZmFsc2U7XG4gICAgaWYgKHNjcmlwdENvdi5zb3VyY2VNYXBVcmwgIT09IHVuZGVmaW5lZCAmJiBwYXJzZU5vZGVTY3JpcHRVcmwoc2NyaXB0Q292LnVybCkuaXNGaWxlVXJsKSB7XG4gICAgICBsZXQgc291cmNlTWFwVXJsOiB1cmxNb2QuVVJMO1xuICAgICAgdHJ5IHtcbiAgICAgICAgc291cmNlTWFwVXJsID0gbmV3IHVybE1vZC5VUkwoc2NyaXB0Q292LnNvdXJjZU1hcFVybCwgc2NyaXB0Q292LnVybCk7XG4gICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgdGhyb3cgbmV3IEluY2lkZW50KFxuICAgICAgICAgIGVycixcbiAgICAgICAgICBcIlNvdXJjZU1hcFVybFJlc29sdXRpb25FcnJvclwiLFxuICAgICAgICAgIHt1cmw6IHNjcmlwdENvdi51cmwsIHNvdXJjZU1hcFVybDogc2NyaXB0Q292LnNvdXJjZU1hcFVybH0sXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgICBsZXQgc291cmNlTWFwU3RyaW5nOiBzdHJpbmc7XG4gICAgICB0cnkge1xuICAgICAgICBzb3VyY2VNYXBTdHJpbmcgPSBhd2FpdCBnZXRUZXh0KHNvdXJjZU1hcFVybCk7XG4gICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgdGhyb3cgbmV3IEluY2lkZW50KFxuICAgICAgICAgIGVycixcbiAgICAgICAgICBcIlNvdXJjZU1hcFJlYWRFcnJvclwiLFxuICAgICAgICAgIHtzY3JpcHRVcmw6IHNjcmlwdENvdi51cmwsIHNvdXJjZU1hcFVybDogc291cmNlTWFwVXJsLmhyZWZ9LFxuICAgICAgICApO1xuICAgICAgfVxuICAgICAgY29uc3QgcmF3U291cmNlTWFwOiBzb3VyY2VNYXAuUmF3U291cmNlTWFwID0gSlNPTi5wYXJzZShzb3VyY2VNYXBTdHJpbmcpO1xuICAgICAgdXNlT3JpZ2luYWwgPSBhd2FpdCBhZGRGcm9tR2VuZXJhdGVkRmlsZUNvdihcbiAgICAgICAgb3JpZ2luYWxCdWlsZGVyLFxuICAgICAgICBzb3VyY2VTdG9yZSxcbiAgICAgICAgcmF3RmlsZUNvdixcbiAgICAgICAgcmF3U291cmNlTWFwLFxuICAgICAgICBzY3JpcHRDb3Yuc291cmNlTWFwVXJsLFxuICAgICAgKTtcbiAgICB9XG5cbiAgICBpZiAoIXVzZU9yaWdpbmFsKSB7XG4gICAgICBzb3VyY2VTdG9yZS5zZXQoc2NyaXB0Q292LnVybCwgc2NyaXB0Q292LnNvdXJjZVRleHQpO1xuICAgICAgZ2VuZXJhdGVkQ292TWFwW3NjcmlwdENvdi51cmxdID0gcmF3RmlsZUNvdjtcbiAgICB9XG4gIH1cblxuICBjb25zdCBjb3ZlcmFnZU1hcDogbGliQ292ZXJhZ2UuQ292ZXJhZ2VNYXBEYXRhID0gbWVyZ2VDb3ZNYXBzKFtnZW5lcmF0ZWRDb3ZNYXAsIG9yaWdpbmFsQnVpbGRlci5idWlsZCgpXSk7XG5cbiAgcmV0dXJuIHtcbiAgICBjb3ZlcmFnZU1hcDogbGliQ292ZXJhZ2UuY3JlYXRlQ292ZXJhZ2VNYXAoY292ZXJhZ2VNYXApLFxuICAgIHNvdXJjZXM6IG5ldyBNYXAoc291cmNlU3RvcmUpLFxuICB9O1xufVxuXG4vKipcbiAqIENvbnZlcnQgdG8gYW4gaXN0YW5idWwgY292ZXJhZ2UgbWFwLCB3aXRob3V0IGFwcGx5aW5nIHNvdXJjZSBtYXBzLlxuICpcbiAqIEBwYXJhbSBwcm9jZXNzQ292IFByb2Nlc3MgY292ZXJhZ2UgdG8gY29udmVydC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHRvUmF3SXN0YW5idWwocHJvY2Vzc0NvdjogUmljaFByb2Nlc3NDb3YpOiBsaWJDb3ZlcmFnZS5Db3ZlcmFnZU1hcERhdGEge1xuICBjb25zdCBjb3ZlcmFnZU1hcDogbGliQ292ZXJhZ2UuQ292ZXJhZ2VNYXBEYXRhID0gT2JqZWN0LmNyZWF0ZShudWxsKTtcblxuICBmb3IgKGNvbnN0IHNjcmlwdENvdiBvZiBwcm9jZXNzQ292LnJlc3VsdCkge1xuICAgIHRyeSB7XG4gICAgICBjb25zdCBnZW5lcmF0ZWRGaWxlQ292OiBsaWJDb3ZlcmFnZS5GaWxlQ292ZXJhZ2VEYXRhID0gaXN0YW5idWxpemUoe1xuICAgICAgICBzb3VyY2VUeXBlOiBzY3JpcHRDb3Yuc291cmNlVHlwZSxcbiAgICAgICAgc291cmNlVGV4dDogc2NyaXB0Q292LnNvdXJjZVRleHQsXG4gICAgICAgIHNjcmlwdENvdixcbiAgICAgIH0pO1xuICAgICAgY292ZXJhZ2VNYXBbc2NyaXB0Q292LnVybF0gPSBsaWJDb3ZlcmFnZS5jcmVhdGVGaWxlQ292ZXJhZ2UoZ2VuZXJhdGVkRmlsZUNvdik7XG4gICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICBjb25zdCBjYXVzZTogRXJyb3IgPSBlcnI7XG4gICAgICBjb25zdCBtZXNzYWdlOiBzdHJpbmcgPSBgSXN0YW5idWxpemVGYWlsdXJlIGZvciB0aGUgc2NyaXB0ICR7SlNPTi5zdHJpbmdpZnkoc2NyaXB0Q292LnVybCl9XFxuJHtlcnIubWVzc2FnZX1gO1xuICAgICAgY29uc3QgbmV3RXJyOiBFcnJvciA9IE9iamVjdC5hc3NpZ24obmV3IEVycm9yKG1lc3NhZ2UpLCB7Y2F1c2UsIHNjcmlwdENvdn0pO1xuICAgICAgdGhyb3cgbmV3RXJyO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBjb3ZlcmFnZU1hcDtcbn1cbiJdLCJzb3VyY2VSb290IjoiIn0=
|