UNPKG

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