UNPKG

13.3 kBJavaScriptView Raw
1import libCoverage from "istanbul-lib-coverage";
2import { istanbulize } from "istanbulize";
3import { parseSys as parseNodeScriptUrl } from "node-script-url";
4import urlMod from "url";
5import { Incident } from "incident";
6import { getText as defaultGetText } from "./get-text";
7import { mergeCovMaps } from "./istanbul-merge";
8import { mergeRichProcessCovs } from "./merge";
9import { addFromGeneratedFileCov } from "./source-map";
10import { CoverageMapBuilder } from "./source-map/builder";
11import { MemorySourceStore } from "./source-map/source-store";
12export 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 */
22async 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 */
64export 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,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIl9zcmMvdG8taXN0YW5idWwudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxXQUFXLE1BQU0sdUJBQXVCLENBQUM7QUFDaEQsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLGFBQWEsQ0FBQztBQUMxQyxPQUFPLEVBQUUsUUFBUSxJQUFJLGtCQUFrQixFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFFakUsT0FBTyxNQUFNLE1BQU0sS0FBSyxDQUFDO0FBQ3pCLE9BQU8sRUFBRSxRQUFRLEVBQUUsTUFBTSxVQUFVLENBQUM7QUFDcEMsT0FBTyxFQUFXLE9BQU8sSUFBSSxjQUFjLEVBQUUsTUFBTSxZQUFZLENBQUM7QUFDaEUsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLGtCQUFrQixDQUFDO0FBQ2hELE9BQU8sRUFBRSxvQkFBb0IsRUFBRSxNQUFNLFNBQVMsQ0FBQztBQUMvQyxPQUFPLEVBQUUsdUJBQXVCLEVBQUUsTUFBTSxjQUFjLENBQUM7QUFDdkQsT0FBTyxFQUFFLGtCQUFrQixFQUFFLE1BQU0sc0JBQXNCLENBQUM7QUFDMUQsT0FBTyxFQUFFLGlCQUFpQixFQUFzQixNQUFNLDJCQUEyQixDQUFDO0FBUWxGLE1BQU0sQ0FBQyxLQUFLLFVBQVUscUJBQXFCLENBQ3pDLFdBQTBDLEVBQzFDLFVBQW1CLGNBQWM7SUFFakMsTUFBTSxNQUFNLEdBQW1CLG9CQUFvQixDQUFDLFdBQVcsQ0FBQyxDQUFDO0lBQ2pFLE9BQU8sVUFBVSxDQUFDLE1BQU0sRUFBRSxPQUFPLENBQUMsQ0FBQztBQUNyQyxDQUFDO0FBRUQ7Ozs7O0dBS0c7QUFDSCxLQUFLLFVBQVUsVUFBVSxDQUN2QixVQUEwQixFQUMxQixVQUFtQixjQUFjO0lBRWpDLE1BQU0sY0FBYyxHQUFnQyxhQUFhLENBQUMsVUFBVSxDQUFDLENBQUM7SUFFOUUsTUFBTSxlQUFlLEdBQWdDLE1BQU0sQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLENBQUM7SUFDekUsTUFBTSxlQUFlLEdBQXVCLElBQUksa0JBQWtCLEVBQUUsQ0FBQztJQUNyRSxNQUFNLFdBQVcsR0FBc0IsSUFBSSxpQkFBaUIsRUFBRSxDQUFDO0lBRS9ELEtBQUssTUFBTSxTQUFTLElBQUksVUFBVSxDQUFDLE1BQU0sRUFBRTtRQUN6QyxNQUFNLFVBQVUsR0FBNkIsY0FBYyxDQUFDLFNBQVMsQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUMzRSxJQUFJLFdBQVcsR0FBWSxLQUFLLENBQUM7UUFDakMsSUFBSSxTQUFTLENBQUMsWUFBWSxLQUFLLFNBQVMsSUFBSSxrQkFBa0IsQ0FBQyxTQUFTLENBQUMsR0FBRyxDQUFDLENBQUMsU0FBUyxFQUFFO1lBQ3ZGLElBQUksWUFBd0IsQ0FBQztZQUM3QixJQUFJO2dCQUNGLFlBQVksR0FBRyxJQUFJLE1BQU0sQ0FBQyxHQUFHLENBQUMsU0FBUyxDQUFDLFlBQVksRUFBRSxTQUFTLENBQUMsR0FBRyxDQUFDLENBQUM7YUFDdEU7WUFBQyxPQUFPLEdBQUcsRUFBRTtnQkFDWixNQUFNLElBQUksUUFBUSxDQUNoQixHQUFHLEVBQ0gsNkJBQTZCLEVBQzdCLEVBQUMsR0FBRyxFQUFFLFNBQVMsQ0FBQyxHQUFHLEVBQUUsWUFBWSxFQUFFLFNBQVMsQ0FBQyxZQUFZLEVBQUMsQ0FDM0QsQ0FBQzthQUNIO1lBQ0QsSUFBSSxlQUF1QixDQUFDO1lBQzVCLElBQUk7Z0JBQ0YsZUFBZSxHQUFHLE1BQU0sT0FBTyxDQUFDLFlBQVksQ0FBQyxDQUFDO2FBQy9DO1lBQUMsT0FBTyxHQUFHLEVBQUU7Z0JBQ1osTUFBTSxJQUFJLFFBQVEsQ0FDaEIsR0FBRyxFQUNILG9CQUFvQixFQUNwQixFQUFDLFNBQVMsRUFBRSxTQUFTLENBQUMsR0FBRyxFQUFFLFlBQVksRUFBRSxZQUFZLENBQUMsSUFBSSxFQUFDLENBQzVELENBQUM7YUFDSDtZQUNELE1BQU0sWUFBWSxHQUEyQixJQUFJLENBQUMsS0FBSyxDQUFDLGVBQWUsQ0FBQyxDQUFDO1lBQ3pFLFdBQVcsR0FBRyxNQUFNLHVCQUF1QixDQUN6QyxlQUFlLEVBQ2YsV0FBVyxFQUNYLFVBQVUsRUFDVixZQUFZLEVBQ1osU0FBUyxDQUFDLFlBQVksQ0FDdkIsQ0FBQztTQUNIO1FBRUQsSUFBSSxDQUFDLFdBQVcsRUFBRTtZQUNoQixXQUFXLENBQUMsR0FBRyxDQUFDLFNBQVMsQ0FBQyxHQUFHLEVBQUUsU0FBUyxDQUFDLFVBQVUsQ0FBQyxDQUFDO1lBQ3JELGVBQWUsQ0FBQyxTQUFTLENBQUMsR0FBRyxDQUFDLEdBQUcsVUFBVSxDQUFDO1NBQzdDO0tBQ0Y7SUFFRCxNQUFNLFdBQVcsR0FBZ0MsWUFBWSxDQUFDLENBQUMsZUFBZSxFQUFFLGVBQWUsQ0FBQyxLQUFLLEVBQUUsQ0FBQyxDQUFDLENBQUM7SUFFMUcsT0FBTztRQUNMLFdBQVcsRUFBRSxXQUFXLENBQUMsaUJBQWlCLENBQUMsV0FBVyxDQUFDO1FBQ3ZELE9BQU8sRUFBRSxJQUFJLEdBQUcsQ0FBQyxXQUFXLENBQUM7S0FDOUIsQ0FBQztBQUNKLENBQUM7QUFFRDs7OztHQUlHO0FBQ0gsTUFBTSxVQUFVLGFBQWEsQ0FBQyxVQUEwQjtJQUN0RCxNQUFNLFdBQVcsR0FBZ0MsTUFBTSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUVyRSxLQUFLLE1BQU0sU0FBUyxJQUFJLFVBQVUsQ0FBQyxNQUFNLEVBQUU7UUFDekMsSUFBSTtZQUNGLE1BQU0sZ0JBQWdCLEdBQWlDLFdBQVcsQ0FBQztnQkFDakUsVUFBVSxFQUFFLFNBQVMsQ0FBQyxVQUFVO2dCQUNoQyxVQUFVLEVBQUUsU0FBUyxDQUFDLFVBQVU7Z0JBQ2hDLFNBQVM7YUFDVixDQUFDLENBQUM7WUFDSCxXQUFXLENBQUMsU0FBUyxDQUFDLEdBQUcsQ0FBQyxHQUFHLFdBQVcsQ0FBQyxrQkFBa0IsQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDO1NBQy9FO1FBQUMsT0FBTyxHQUFHLEVBQUU7WUFDWixNQUFNLEtBQUssR0FBVSxHQUFHLENBQUM7WUFDekIsTUFBTSxPQUFPLEdBQVcscUNBQXFDLElBQUksQ0FBQyxTQUFTLENBQUMsU0FBUyxDQUFDLEdBQUcsQ0FBQyxLQUFLLEdBQUcsQ0FBQyxPQUFPLEVBQUUsQ0FBQztZQUM3RyxNQUFNLE1BQU0sR0FBVSxNQUFNLENBQUMsTUFBTSxDQUFDLElBQUksS0FBSyxDQUFDLE9BQU8sQ0FBQyxFQUFFLEVBQUMsS0FBSyxFQUFFLFNBQVMsRUFBQyxDQUFDLENBQUM7WUFDNUUsTUFBTSxNQUFNLENBQUM7U0FDZDtLQUNGO0lBRUQsT0FBTyxXQUFXLENBQUM7QUFDckIsQ0FBQyIsImZpbGUiOiJ0by1pc3RhbmJ1bC5qcyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBsaWJDb3ZlcmFnZSBmcm9tIFwiaXN0YW5idWwtbGliLWNvdmVyYWdlXCI7XG5pbXBvcnQgeyBpc3RhbmJ1bGl6ZSB9IGZyb20gXCJpc3RhbmJ1bGl6ZVwiO1xuaW1wb3J0IHsgcGFyc2VTeXMgYXMgcGFyc2VOb2RlU2NyaXB0VXJsIH0gZnJvbSBcIm5vZGUtc2NyaXB0LXVybFwiO1xuaW1wb3J0IHNvdXJjZU1hcCBmcm9tIFwic291cmNlLW1hcFwiO1xuaW1wb3J0IHVybE1vZCBmcm9tIFwidXJsXCI7XG5pbXBvcnQgeyBJbmNpZGVudCB9IGZyb20gXCJpbmNpZGVudFwiO1xuaW1wb3J0IHsgR2V0VGV4dCwgZ2V0VGV4dCBhcyBkZWZhdWx0R2V0VGV4dCB9IGZyb20gXCIuL2dldC10ZXh0XCI7XG5pbXBvcnQgeyBtZXJnZUNvdk1hcHMgfSBmcm9tIFwiLi9pc3RhbmJ1bC1tZXJnZVwiO1xuaW1wb3J0IHsgbWVyZ2VSaWNoUHJvY2Vzc0NvdnMgfSBmcm9tIFwiLi9tZXJnZVwiO1xuaW1wb3J0IHsgYWRkRnJvbUdlbmVyYXRlZEZpbGVDb3YgfSBmcm9tIFwiLi9zb3VyY2UtbWFwXCI7XG5pbXBvcnQgeyBDb3ZlcmFnZU1hcEJ1aWxkZXIgfSBmcm9tIFwiLi9zb3VyY2UtbWFwL2J1aWxkZXJcIjtcbmltcG9ydCB7IE1lbW9yeVNvdXJjZVN0b3JlLCBOdWxsYWJsZVNvdXJjZVRleHQgfSBmcm9tIFwiLi9zb3VyY2UtbWFwL3NvdXJjZS1zdG9yZVwiO1xuaW1wb3J0IHsgUmljaFByb2Nlc3NDb3YgfSBmcm9tIFwiLi9zcGF3bi1pbnNwZWN0ZWRcIjtcblxuZXhwb3J0IGludGVyZmFjZSBSaWNoSXN0YW5idWxDb3ZlcmFnZU1hcCB7XG4gIGNvdmVyYWdlTWFwOiBsaWJDb3ZlcmFnZS5Db3ZlcmFnZU1hcDtcbiAgc291cmNlczogTWFwPHN0cmluZywgTnVsbGFibGVTb3VyY2VUZXh0Pjtcbn1cblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHByb2Nlc3NDb3ZzVG9Jc3RhbmJ1bChcbiAgcHJvY2Vzc0NvdnM6IFJlYWRvbmx5QXJyYXk8UmljaFByb2Nlc3NDb3Y+LFxuICBnZXRUZXh0OiBHZXRUZXh0ID0gZGVmYXVsdEdldFRleHQsXG4pOiBQcm9taXNlPFJpY2hJc3RhbmJ1bENvdmVyYWdlTWFwPiB7XG4gIGNvbnN0IG1lcmdlZDogUmljaFByb2Nlc3NDb3YgPSBtZXJnZVJpY2hQcm9jZXNzQ292cyhwcm9jZXNzQ292cyk7XG4gIHJldHVybiB0b0lzdGFuYnVsKG1lcmdlZCwgZ2V0VGV4dCk7XG59XG5cbi8qKlxuICogQ29udmVydCB0byBhbiBpc3RhbmJ1bCBjb3ZlcmFnZSBtYXAgKGFwcGx5aW5nIHNvdXJjZSBtYXBzKS5cbiAqXG4gKiBAcGFyYW0gcHJvY2Vzc0NvdiBQcm9jZXNzIGNvdmVyYWdlIHRvIGNvbnZlcnQuXG4gKiBAcGFyYW0gZ2V0VGV4dCBGdW5jdGlvbiB1c2VkIHRvIGxvYWQgdGV4dCBmcm9tIFVSTHMgKHVzZWQgdG8gbG9hZCBzb3VyY2UgbWFwcykuXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIHRvSXN0YW5idWwoXG4gIHByb2Nlc3NDb3Y6IFJpY2hQcm9jZXNzQ292LFxuICBnZXRUZXh0OiBHZXRUZXh0ID0gZGVmYXVsdEdldFRleHQsXG4pOiBQcm9taXNlPFJpY2hJc3RhbmJ1bENvdmVyYWdlTWFwPiB7XG4gIGNvbnN0IHJhd0NvdmVyYWdlTWFwOiBsaWJDb3ZlcmFnZS5Db3ZlcmFnZU1hcERhdGEgPSB0b1Jhd0lzdGFuYnVsKHByb2Nlc3NDb3YpO1xuXG4gIGNvbnN0IGdlbmVyYXRlZENvdk1hcDogbGliQ292ZXJhZ2UuQ292ZXJhZ2VNYXBEYXRhID0gT2JqZWN0LmNyZWF0ZShudWxsKTtcbiAgY29uc3Qgb3JpZ2luYWxCdWlsZGVyOiBDb3ZlcmFnZU1hcEJ1aWxkZXIgPSBuZXcgQ292ZXJhZ2VNYXBCdWlsZGVyKCk7XG4gIGNvbnN0IHNvdXJjZVN0b3JlOiBNZW1vcnlTb3VyY2VTdG9yZSA9IG5ldyBNZW1vcnlTb3VyY2VTdG9yZSgpO1xuXG4gIGZvciAoY29uc3Qgc2NyaXB0Q292IG9mIHByb2Nlc3NDb3YucmVzdWx0KSB7XG4gICAgY29uc3QgcmF3RmlsZUNvdjogbGliQ292ZXJhZ2UuRmlsZUNvdmVyYWdlID0gcmF3Q292ZXJhZ2VNYXBbc2NyaXB0Q292LnVybF07XG4gICAgbGV0IHVzZU9yaWdpbmFsOiBib29sZWFuID0gZmFsc2U7XG4gICAgaWYgKHNjcmlwdENvdi5zb3VyY2VNYXBVcmwgIT09IHVuZGVmaW5lZCAmJiBwYXJzZU5vZGVTY3JpcHRVcmwoc2NyaXB0Q292LnVybCkuaXNGaWxlVXJsKSB7XG4gICAgICBsZXQgc291cmNlTWFwVXJsOiB1cmxNb2QuVVJMO1xuICAgICAgdHJ5IHtcbiAgICAgICAgc291cmNlTWFwVXJsID0gbmV3IHVybE1vZC5VUkwoc2NyaXB0Q292LnNvdXJjZU1hcFVybCwgc2NyaXB0Q292LnVybCk7XG4gICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgdGhyb3cgbmV3IEluY2lkZW50KFxuICAgICAgICAgIGVycixcbiAgICAgICAgICBcIlNvdXJjZU1hcFVybFJlc29sdXRpb25FcnJvclwiLFxuICAgICAgICAgIHt1cmw6IHNjcmlwdENvdi51cmwsIHNvdXJjZU1hcFVybDogc2NyaXB0Q292LnNvdXJjZU1hcFVybH0sXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgICBsZXQgc291cmNlTWFwU3RyaW5nOiBzdHJpbmc7XG4gICAgICB0cnkge1xuICAgICAgICBzb3VyY2VNYXBTdHJpbmcgPSBhd2FpdCBnZXRUZXh0KHNvdXJjZU1hcFVybCk7XG4gICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgdGhyb3cgbmV3IEluY2lkZW50KFxuICAgICAgICAgIGVycixcbiAgICAgICAgICBcIlNvdXJjZU1hcFJlYWRFcnJvclwiLFxuICAgICAgICAgIHtzY3JpcHRVcmw6IHNjcmlwdENvdi51cmwsIHNvdXJjZU1hcFVybDogc291cmNlTWFwVXJsLmhyZWZ9LFxuICAgICAgICApO1xuICAgICAgfVxuICAgICAgY29uc3QgcmF3U291cmNlTWFwOiBzb3VyY2VNYXAuUmF3U291cmNlTWFwID0gSlNPTi5wYXJzZShzb3VyY2VNYXBTdHJpbmcpO1xuICAgICAgdXNlT3JpZ2luYWwgPSBhd2FpdCBhZGRGcm9tR2VuZXJhdGVkRmlsZUNvdihcbiAgICAgICAgb3JpZ2luYWxCdWlsZGVyLFxuICAgICAgICBzb3VyY2VTdG9yZSxcbiAgICAgICAgcmF3RmlsZUNvdixcbiAgICAgICAgcmF3U291cmNlTWFwLFxuICAgICAgICBzY3JpcHRDb3Yuc291cmNlTWFwVXJsLFxuICAgICAgKTtcbiAgICB9XG5cbiAgICBpZiAoIXVzZU9yaWdpbmFsKSB7XG4gICAgICBzb3VyY2VTdG9yZS5zZXQoc2NyaXB0Q292LnVybCwgc2NyaXB0Q292LnNvdXJjZVRleHQpO1xuICAgICAgZ2VuZXJhdGVkQ292TWFwW3NjcmlwdENvdi51cmxdID0gcmF3RmlsZUNvdjtcbiAgICB9XG4gIH1cblxuICBjb25zdCBjb3ZlcmFnZU1hcDogbGliQ292ZXJhZ2UuQ292ZXJhZ2VNYXBEYXRhID0gbWVyZ2VDb3ZNYXBzKFtnZW5lcmF0ZWRDb3ZNYXAsIG9yaWdpbmFsQnVpbGRlci5idWlsZCgpXSk7XG5cbiAgcmV0dXJuIHtcbiAgICBjb3ZlcmFnZU1hcDogbGliQ292ZXJhZ2UuY3JlYXRlQ292ZXJhZ2VNYXAoY292ZXJhZ2VNYXApLFxuICAgIHNvdXJjZXM6IG5ldyBNYXAoc291cmNlU3RvcmUpLFxuICB9O1xufVxuXG4vKipcbiAqIENvbnZlcnQgdG8gYW4gaXN0YW5idWwgY292ZXJhZ2UgbWFwLCB3aXRob3V0IGFwcGx5aW5nIHNvdXJjZSBtYXBzLlxuICpcbiAqIEBwYXJhbSBwcm9jZXNzQ292IFByb2Nlc3MgY292ZXJhZ2UgdG8gY29udmVydC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHRvUmF3SXN0YW5idWwocHJvY2Vzc0NvdjogUmljaFByb2Nlc3NDb3YpOiBsaWJDb3ZlcmFnZS5Db3ZlcmFnZU1hcERhdGEge1xuICBjb25zdCBjb3ZlcmFnZU1hcDogbGliQ292ZXJhZ2UuQ292ZXJhZ2VNYXBEYXRhID0gT2JqZWN0LmNyZWF0ZShudWxsKTtcblxuICBmb3IgKGNvbnN0IHNjcmlwdENvdiBvZiBwcm9jZXNzQ292LnJlc3VsdCkge1xuICAgIHRyeSB7XG4gICAgICBjb25zdCBnZW5lcmF0ZWRGaWxlQ292OiBsaWJDb3ZlcmFnZS5GaWxlQ292ZXJhZ2VEYXRhID0gaXN0YW5idWxpemUoe1xuICAgICAgICBzb3VyY2VUeXBlOiBzY3JpcHRDb3Yuc291cmNlVHlwZSxcbiAgICAgICAgc291cmNlVGV4dDogc2NyaXB0Q292LnNvdXJjZVRleHQsXG4gICAgICAgIHNjcmlwdENvdixcbiAgICAgIH0pO1xuICAgICAgY292ZXJhZ2VNYXBbc2NyaXB0Q292LnVybF0gPSBsaWJDb3ZlcmFnZS5jcmVhdGVGaWxlQ292ZXJhZ2UoZ2VuZXJhdGVkRmlsZUNvdik7XG4gICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICBjb25zdCBjYXVzZTogRXJyb3IgPSBlcnI7XG4gICAgICBjb25zdCBtZXNzYWdlOiBzdHJpbmcgPSBgSXN0YW5idWxpemVGYWlsdXJlIGZvciB0aGUgc2NyaXB0ICR7SlNPTi5zdHJpbmdpZnkoc2NyaXB0Q292LnVybCl9XFxuJHtlcnIubWVzc2FnZX1gO1xuICAgICAgY29uc3QgbmV3RXJyOiBFcnJvciA9IE9iamVjdC5hc3NpZ24obmV3IEVycm9yKG1lc3NhZ2UpLCB7Y2F1c2UsIHNjcmlwdENvdn0pO1xuICAgICAgdGhyb3cgbmV3RXJyO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBjb3ZlcmFnZU1hcDtcbn1cbiJdLCJzb3VyY2VSb290IjoiIn0=