Skip to content

Instantly share code, notes, and snippets.

@AriPerkkio
Created August 6, 2025 17:12
Show Gist options
  • Save AriPerkkio/87d6270951c61fc1ced3c810afa7ccd3 to your computer and use it in GitHub Desktop.
Save AriPerkkio/87d6270951c61fc1ced3c810afa7ccd3 to your computer and use it in GitHub Desktop.
debug module runner sourcemapping
const __vite_ssr_import_0__ = await __vite_ssr_import__("node:crypto", {"importedNames":["randomUUID"]});
const __vite_ssr_import_1__ = await __vite_ssr_import__("node:fs", {"importedNames":["rmSync"]});
const __vite_ssr_import_2__ = await __vite_ssr_import__("node:fs/promises", {"importedNames":["writeFile"]});
const __vite_ssr_import_3__ = await __vite_ssr_import__("node:path", {"importedNames":["normalize","resolve"]});
const __vite_ssr_import_4__ = await __vite_ssr_import__("node:url", {"importedNames":["fileURLToPath","pathToFileURL"]});
const __vite_ssr_import_5__ = await __vite_ssr_import__("/node_modules/.pnpm/[email protected]/node_modules/istanbul-lib-coverage/index.js", {"importedNames":["createCoverageMap"]});
const __vite_ssr_import_6__ = await __vite_ssr_import__("/node_modules/.pnpm/[email protected]/node_modules/magic-string/dist/magic-string.es.mjs", {"importedNames":["default"]});
const __vite_ssr_import_7__ = await __vite_ssr_import__("/node_modules/.pnpm/[email protected]_@[email protected][email protected][email protected]/node_modules/vitest/dist/index.js", {"importedNames":["expect","onTestFinished","test"]});
const __vite_ssr_import_8__ = await __vite_ssr_import__("/src/index.ts", {"importedNames":["default"]});
const __vite_ssr_import_9__ = await __vite_ssr_import__("/src/location.ts", {"importedNames":["createEmptySourceMap"]});
const __vite_ssr_import_10__ = await __vite_ssr_import__("/test/utils/index.ts", {"importedNames":["parse"]});
__vite_ssr_import_7__.test.only("function not in source maps is excluded", async () => {
const filename = (0,__vite_ssr_import_3__.normalize)((0,__vite_ssr_import_3__.resolve)("/some/file.ts"));
const code = new __vite_ssr_import_6__.default(`export function covered() {
return "Hello world";
}
export function excluded() {
return "Hello world";
}
export function uncovered() {
return "Hello world";
}
`).toString();
const sourceMap = new __vite_ssr_import_6__.default(`export function covered() {
return "Hello world";
}
export function uncovered() {
return "Hello world";
}
`).generateMap({ hires: "boundary", file: filename });
const data = await (0,__vite_ssr_import_8__.default)({
code,
sourceMap,
coverage: {
url: (0,__vite_ssr_import_4__.pathToFileURL)(filename).href,
functions: [
{
functionName: "covered",
isBlockCoverage: true,
ranges: [{ startOffset: 0, endOffset: 55, count: 1 }]
},
{
functionName: "excluded",
isBlockCoverage: true,
ranges: [{ startOffset: 57, endOffset: 111, count: 1 }]
},
{
functionName: "uncovered",
isBlockCoverage: true,
ranges: [{ startOffset: 113, endOffset: 169, count: 0 }]
}
]
},
ast: (0,__vite_ssr_import_10__.parse)(code)
});
const coverage = (0,__vite_ssr_import_5__.createCoverageMap)(data);
const fileCoverage = coverage.fileCoverageFor(filename);
try {
console.log("Start");
(0,__vite_ssr_import_7__.expect)(fileCoverage).toMatchInlineSnapshot(`
{
"branches": "0/0 (100%)",
"functions": "1/2 (50%)",
"lines": "1/2 (50%)",
"statements": "1/2 (50%)",
}
`);
console.log("end");
} catch (error) {
console.log("Failed with", error);
};
const functions = Object.values(fileCoverage.fnMap).map((fn) => fn.name);
(0,__vite_ssr_import_7__.expect)(functions).toMatchInlineSnapshot(`
[
"covered",
"uncovered",
]
`);
(0,__vite_ssr_import_7__.expect)(fileCoverage.getLineCoverage()).toMatchInlineSnapshot(`
{
"10": 0,
"2": 1,
}
`);
});
(0,__vite_ssr_import_7__.test)("map.sources can be file urls", async () => {
const source = (0,__vite_ssr_import_4__.pathToFileURL)((0,__vite_ssr_import_3__.normalize)((0,__vite_ssr_import_3__.resolve)("/some/path/to/source.ts")));
const target = (0,__vite_ssr_import_4__.pathToFileURL)((0,__vite_ssr_import_3__.normalize)((0,__vite_ssr_import_3__.resolve)("/other/path/to/target.js")));
const s = new __vite_ssr_import_6__.default(`export function covered() {
return "Hello world";
}
`);
const code = s.toString();
const sourceMap = s.generateMap({
file: target.href,
hires: "boundary"
});
sourceMap.sources = [source.href];
const data = await (0,__vite_ssr_import_8__.default)({
code,
sourceMap,
coverage: {
url: target.href,
functions: [
{
functionName: "covered",
isBlockCoverage: true,
ranges: [{ startOffset: 0, endOffset: 55, count: 1 }]
}
]
},
ast: (0,__vite_ssr_import_10__.parse)(code)
});
const coverage = (0,__vite_ssr_import_5__.createCoverageMap)(data);
const fileCoverage = coverage.fileCoverageFor((0,__vite_ssr_import_4__.fileURLToPath)(source));
(0,__vite_ssr_import_7__.expect)(fileCoverage).toMatchInlineSnapshot(`
{
"branches": "0/0 (100%)",
"functions": "1/1 (100%)",
"lines": "1/1 (100%)",
"statements": "1/1 (100%)",
}
`);
});
(0,__vite_ssr_import_7__.test)("source map is optional", async () => {
const filename = (0,__vite_ssr_import_3__.normalize)((0,__vite_ssr_import_3__.resolve)("/some/file.ts"));
const s = new __vite_ssr_import_6__.default(`export function covered() {
return "Hello world";
}
`);
const code = s.toString();
const data = await (0,__vite_ssr_import_8__.default)({
code,
sourceMap: void 0,
ast: (0,__vite_ssr_import_10__.parse)(code),
coverage: {
url: (0,__vite_ssr_import_4__.pathToFileURL)(filename).href,
functions: [
{
functionName: "covered",
isBlockCoverage: true,
ranges: [{ startOffset: 0, endOffset: 53, count: 1 }]
}
]
}
});
const coverage = (0,__vite_ssr_import_5__.createCoverageMap)(data);
const fileCoverage = coverage.fileCoverageFor(filename);
(0,__vite_ssr_import_7__.expect)(fileCoverage).toMatchInlineSnapshot(`
{
"branches": "0/0 (100%)",
"functions": "1/1 (100%)",
"lines": "1/1 (100%)",
"statements": "1/1 (100%)",
}
`);
});
(0,__vite_ssr_import_7__.test)("empty source map mappings match magic-string", async () => {
const filename = "hello.js";
const code = `function hello(name) {
return "Hello " + name;
}`;
const expected = new __vite_ssr_import_6__.default(code, { filename }).generateDecodedMap({
file: filename,
hires: "boundary",
includeContent: true,
source: filename
});
const actual = (0,__vite_ssr_import_9__.createEmptySourceMap)(filename, code);
(0,__vite_ssr_import_7__.expect)(actual.mappings).toStrictEqual(expected.mappings);
});
(0,__vite_ssr_import_7__.test)("inline source map as base64", async () => {
const filename = (0,__vite_ssr_import_3__.normalize)((0,__vite_ssr_import_3__.resolve)("/some/file.ts"));
const s = new __vite_ssr_import_6__.default(` export function covered() {
return "Hello world";
}
`);
s.replace("export function", "\n\n\nexport function");
let code = s.toString();
const map = s.generateDecodedMap({ hires: "boundary", source: filename });
const encoded = Buffer.from(JSON.stringify(map)).toString("base64");
code += `
//# sourceMappingURL=data:application/json;base64,${encoded}
`;
const data = await (0,__vite_ssr_import_8__.default)({
code,
sourceMap: void 0,
ast: (0,__vite_ssr_import_10__.parse)(code),
coverage: {
url: (0,__vite_ssr_import_4__.pathToFileURL)(filename).href,
functions: [
{
functionName: "covered",
isBlockCoverage: true,
ranges: [{ startOffset: 0, endOffset: 53, count: 1 }]
}
]
}
});
const coverage = (0,__vite_ssr_import_5__.createCoverageMap)(data);
const fileCoverage = coverage.fileCoverageFor(filename);
(0,__vite_ssr_import_7__.expect)(fileCoverage).toMatchInlineSnapshot(`
{
"branches": "0/0 (100%)",
"functions": "1/1 (100%)",
"lines": "1/1 (100%)",
"statements": "1/1 (100%)",
}
`);
(0,__vite_ssr_import_7__.expect)(fileCoverage.getLineCoverage()).toMatchInlineSnapshot(`
{
"2": 1,
}
`);
});
(0,__vite_ssr_import_7__.test)("inline source map as filename", async () => {
const uuid = (0,__vite_ssr_import_0__.randomUUID)();
const filename = (0,__vite_ssr_import_3__.normalize)((0,__vite_ssr_import_3__.resolve)(__vite_ssr_import_meta__.dirname, `file-${uuid}.ts`));
const mapName = (0,__vite_ssr_import_3__.normalize)(
(0,__vite_ssr_import_3__.resolve)(__vite_ssr_import_meta__.dirname, `file-${uuid}.js.map`)
);
const s = new __vite_ssr_import_6__.default(` export function covered() {
return "Hello world";
}
`);
s.replace("export function", "\n\n\nexport function");
let code = s.toString();
const map = s.generateDecodedMap({ hires: "boundary", source: filename });
(0,__vite_ssr_import_7__.onTestFinished)(() => (0,__vite_ssr_import_1__.rmSync)(mapName, { force: true }));
await (0,__vite_ssr_import_2__.writeFile)(mapName, JSON.stringify(map, null, 2), "utf8");
code += `
//# sourceMappingURL=file-${uuid}.js.map
`;
const data = await (0,__vite_ssr_import_8__.default)({
code,
sourceMap: void 0,
ast: (0,__vite_ssr_import_10__.parse)(code),
coverage: {
url: (0,__vite_ssr_import_4__.pathToFileURL)(filename).href,
functions: [
{
functionName: "covered",
isBlockCoverage: true,
ranges: [{ startOffset: 0, endOffset: 53, count: 1 }]
}
]
}
});
const coverage = (0,__vite_ssr_import_5__.createCoverageMap)(data);
const fileCoverage = coverage.fileCoverageFor(filename);
(0,__vite_ssr_import_7__.expect)(fileCoverage).toMatchInlineSnapshot(`
{
"branches": "0/0 (100%)",
"functions": "1/1 (100%)",
"lines": "1/1 (100%)",
"statements": "1/1 (100%)",
}
`);
(0,__vite_ssr_import_7__.expect)(fileCoverage.getLineCoverage()).toMatchInlineSnapshot(`
{
"2": 1,
}
`);
});
//# sourceMappingSource=vite-generated
//# sourceMappingURL=data:application/json;base64,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Q3ZDLFFBQU0sZUFBZSxTQUFTLGdCQUFnQixRQUFRO0FBRXRELG1DQUFPLFlBQVksRUFBRSxzQkFBc0I7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxHQU8xQztBQUNELG1DQUFPLGFBQWEsZ0JBQWdCLENBQUMsRUFBRSxzQkFBc0I7QUFBQTtBQUFBO0FBQUE7QUFBQSxHQUk1RDtBQUNILENBQUMiLCJuYW1lcyI6W10sImlnbm9yZUxpc3QiOltdLCJzb3VyY2VzIjpbInNvdXJjZS1tYXBzLnRlc3QudHMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgcmFuZG9tVVVJRCB9IGZyb20gXCJub2RlOmNyeXB0b1wiO1xuaW1wb3J0IHsgcm1TeW5jIH0gZnJvbSBcIm5vZGU6ZnNcIjtcbmltcG9ydCB7IHdyaXRlRmlsZSB9IGZyb20gXCJub2RlOmZzL3Byb21pc2VzXCI7XG5pbXBvcnQgeyBub3JtYWxpemUsIHJlc29sdmUgfSBmcm9tIFwibm9kZTpwYXRoXCI7XG5pbXBvcnQgeyBmaWxlVVJMVG9QYXRoLCBwYXRoVG9GaWxlVVJMIH0gZnJvbSBcIm5vZGU6dXJsXCI7XG5cbmltcG9ydCB7IGNyZWF0ZUNvdmVyYWdlTWFwIH0gZnJvbSBcImlzdGFuYnVsLWxpYi1jb3ZlcmFnZVwiO1xuaW1wb3J0IE1hZ2ljU3RyaW5nIGZyb20gXCJtYWdpYy1zdHJpbmdcIjtcbmltcG9ydCB7IGV4cGVjdCwgb25UZXN0RmluaXNoZWQsIHRlc3QgfSBmcm9tIFwidml0ZXN0XCI7XG5cbmltcG9ydCBjb252ZXJ0IGZyb20gXCIuLi9zcmNcIjtcbmltcG9ydCB7IGNyZWF0ZUVtcHR5U291cmNlTWFwIH0gZnJvbSBcIi4uL3NyYy9sb2NhdGlvblwiO1xuaW1wb3J0IHsgcGFyc2UgfSBmcm9tIFwiLi91dGlsc1wiO1xuXG50ZXN0Lm9ubHkoXCJmdW5jdGlvbiBub3QgaW4gc291cmNlIG1hcHMgaXMgZXhjbHVkZWRcIiwgYXN5bmMgKCkgPT4ge1xuICBjb25zdCBmaWxlbmFtZSA9IG5vcm1hbGl6ZShyZXNvbHZlKFwiL3NvbWUvZmlsZS50c1wiKSk7XG5cbiAgY29uc3QgY29kZSA9IG5ldyBNYWdpY1N0cmluZyhgXFxcbmV4cG9ydCBmdW5jdGlvbiBjb3ZlcmVkKCkge1xuICByZXR1cm4gXCJIZWxsbyB3b3JsZFwiO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZXhjbHVkZWQoKSB7XG4gIHJldHVybiBcIkhlbGxvIHdvcmxkXCI7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiB1bmNvdmVyZWQoKSB7XG4gIHJldHVybiBcIkhlbGxvIHdvcmxkXCI7XG59XG5gKS50b1N0cmluZygpO1xuXG4gIGNvbnN0IHNvdXJjZU1hcCA9IG5ldyBNYWdpY1N0cmluZyhgXFxcbmV4cG9ydCBmdW5jdGlvbiBjb3ZlcmVkKCkge1xuICByZXR1cm4gXCJIZWxsbyB3b3JsZFwiO1xufVxuXG5cblxuXG5cbmV4cG9ydCBmdW5jdGlvbiB1bmNvdmVyZWQoKSB7XG4gIHJldHVybiBcIkhlbGxvIHdvcmxkXCI7XG59XG5gKS5nZW5lcmF0ZU1hcCh7IGhpcmVzOiBcImJvdW5kYXJ5XCIsIGZpbGU6IGZpbGVuYW1lIH0pO1xuXG4gIGNvbnN0IGRhdGEgPSBhd2FpdCBjb252ZXJ0KHtcbiAgICBjb2RlLFxuICAgIHNvdXJjZU1hcCxcbiAgICBjb3ZlcmFnZToge1xuICAgICAgdXJsOiBwYXRoVG9GaWxlVVJMKGZpbGVuYW1lKS5ocmVmLFxuICAgICAgZnVuY3Rpb25zOiBbXG4gICAgICAgIHtcbiAgICAgICAgICBmdW5jdGlvbk5hbWU6IFwiY292ZXJlZFwiLFxuICAgICAgICAgIGlzQmxvY2tDb3ZlcmFnZTogdHJ1ZSxcbiAgICAgICAgICByYW5nZXM6IFt7IHN0YXJ0T2Zmc2V0OiAwLCBlbmRPZmZzZXQ6IDU1LCBjb3VudDogMSB9XSxcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgIGZ1bmN0aW9uTmFtZTogXCJleGNsdWRlZFwiLFxuICAgICAgICAgIGlzQmxvY2tDb3ZlcmFnZTogdHJ1ZSxcbiAgICAgICAgICByYW5nZXM6IFt7IHN0YXJ0T2Zmc2V0OiA1NywgZW5kT2Zmc2V0OiAxMTEsIGNvdW50OiAxIH1dLFxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgZnVuY3Rpb25OYW1lOiBcInVuY292ZXJlZFwiLFxuICAgICAgICAgIGlzQmxvY2tDb3ZlcmFnZTogdHJ1ZSxcbiAgICAgICAgICByYW5nZXM6IFt7IHN0YXJ0T2Zmc2V0OiAxMTMsIGVuZE9mZnNldDogMTY5LCBjb3VudDogMCB9XSxcbiAgICAgICAgfSxcbiAgICAgIF0sXG4gICAgfSxcbiAgICBhc3Q6IHBhcnNlKGNvZGUpLFxuICB9KTtcblxuICBjb25zdCBjb3ZlcmFnZSA9IGNyZWF0ZUNvdmVyYWdlTWFwKGRhdGEpO1xuICBjb25zdCBmaWxlQ292ZXJhZ2UgPSBjb3ZlcmFnZS5maWxlQ292ZXJhZ2VGb3IoZmlsZW5hbWUpO1xuXG4gIHRyeSB7XG4gICAgY29uc29sZS5sb2coXCJTdGFydFwiKTtcblxuICAgIGV4cGVjdChmaWxlQ292ZXJhZ2UpLnRvTWF0Y2hJbmxpbmVTbmFwc2hvdChgXG4gICAge1xuICAgICAgXCJicmFuY2hlc1wiOiBcIjAvMCAoMTAwJSlcIixcbiAgICAgIFwiZnVuY3Rpb25zXCI6IFwiMS8yICg1MCUpXCIsXG4gICAgICBcImxpbmVzXCI6IFwiMS8yICg1MCUpXCIsXG4gICAgICBcInN0YXRlbWVudHNcIjogXCIxLzIgKDUwJSlcIixcbiAgICB9XG4gIGApO1xuXG4gICAgY29uc29sZS5sb2coXCJlbmRcIik7XG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgY29uc29sZS5sb2coXCJGYWlsZWQgd2l0aFwiLCBlcnJvcik7XG4gIH1cblxuICBjb25zdCBmdW5jdGlvbnMgPSBPYmplY3QudmFsdWVzKGZpbGVDb3ZlcmFnZS5mbk1hcCkubWFwKChmbikgPT4gZm4ubmFtZSk7XG5cbiAgZXhwZWN0KGZ1bmN0aW9ucykudG9NYXRjaElubGluZVNuYXBzaG90KGBcbiAgICBbXG4gICAgICBcImNvdmVyZWRcIixcbiAgICAgIFwidW5jb3ZlcmVkXCIsXG4gICAgXVxuICBgKTtcblxuICBleHBlY3QoZmlsZUNvdmVyYWdlLmdldExpbmVDb3ZlcmFnZSgpKS50b01hdGNoSW5saW5lU25hcHNob3QoYFxuICAgIHtcbiAgICAgIFwiMTBcIjogMCxcbiAgICAgIFwiMlwiOiAxLFxuICAgIH1cbiAgYCk7XG59KTtcblxudGVzdChcIm1hcC5zb3VyY2VzIGNhbiBiZSBmaWxlIHVybHNcIiwgYXN5bmMgKCkgPT4ge1xuICBjb25zdCBzb3VyY2UgPSBwYXRoVG9GaWxlVVJMKG5vcm1hbGl6ZShyZXNvbHZlKFwiL3NvbWUvcGF0aC90by9zb3VyY2UudHNcIikpKTtcbiAgY29uc3QgdGFyZ2V0ID0gcGF0aFRvRmlsZVVSTChub3JtYWxpemUocmVzb2x2ZShcIi9vdGhlci9wYXRoL3RvL3RhcmdldC5qc1wiKSkpO1xuXG4gIGNvbnN0IHMgPSBuZXcgTWFnaWNTdHJpbmcoYFxcXG5leHBvcnQgZnVuY3Rpb24gY292ZXJlZCgpIHtcbiAgcmV0dXJuIFwiSGVsbG8gd29ybGRcIjtcbn1cbmApO1xuXG4gIGNvbnN0IGNvZGUgPSBzLnRvU3RyaW5nKCk7XG4gIGNvbnN0IHNvdXJjZU1hcCA9IHMuZ2VuZXJhdGVNYXAoe1xuICAgIGZpbGU6IHRhcmdldC5ocmVmLFxuICAgIGhpcmVzOiBcImJvdW5kYXJ5XCIsXG4gIH0pO1xuXG4gIHNvdXJjZU1hcC5zb3VyY2VzID0gW3NvdXJjZS5ocmVmXTtcblxuICBjb25zdCBkYXRhID0gYXdhaXQgY29udmVydCh7XG4gICAgY29kZSxcbiAgICBzb3VyY2VNYXAsXG4gICAgY292ZXJhZ2U6IHtcbiAgICAgIHVybDogdGFyZ2V0LmhyZWYsXG4gICAgICBmdW5jdGlvbnM6IFtcbiAgICAgICAge1xuICAgICAgICAgIGZ1bmN0aW9uTmFtZTogXCJjb3ZlcmVkXCIsXG4gICAgICAgICAgaXNCbG9ja0NvdmVyYWdlOiB0cnVlLFxuICAgICAgICAgIHJhbmdlczogW3sgc3RhcnRPZmZzZXQ6IDAsIGVuZE9mZnNldDogNTUsIGNvdW50OiAxIH1dLFxuICAgICAgICB9LFxuICAgICAgXSxcbiAgICB9LFxuICAgIGFzdDogcGFyc2UoY29kZSksXG4gIH0pO1xuXG4gIGNvbnN0IGNvdmVyYWdlID0gY3JlYXRlQ292ZXJhZ2VNYXAoZGF0YSk7XG4gIGNvbnN0IGZpbGVDb3ZlcmFnZSA9IGNvdmVyYWdlLmZpbGVDb3ZlcmFnZUZvcihmaWxlVVJMVG9QYXRoKHNvdXJjZSkpO1xuXG4gIGV4cGVjdChmaWxlQ292ZXJhZ2UpLnRvTWF0Y2hJbmxpbmVTbmFwc2hvdChgXG4gICAge1xuICAgICAgXCJicmFuY2hlc1wiOiBcIjAvMCAoMTAwJSlcIixcbiAgICAgIFwiZnVuY3Rpb25zXCI6IFwiMS8xICgxMDAlKVwiLFxuICAgICAgXCJsaW5lc1wiOiBcIjEvMSAoMTAwJSlcIixcbiAgICAgIFwic3RhdGVtZW50c1wiOiBcIjEvMSAoMTAwJSlcIixcbiAgICB9XG4gIGApO1xufSk7XG5cbnRlc3QoXCJzb3VyY2UgbWFwIGlzIG9wdGlvbmFsXCIsIGFzeW5jICgpID0+IHtcbiAgY29uc3QgZmlsZW5hbWUgPSBub3JtYWxpemUocmVzb2x2ZShcIi9zb21lL2ZpbGUudHNcIikpO1xuXG4gIGNvbnN0IHMgPSBuZXcgTWFnaWNTdHJpbmcoYFxcXG5leHBvcnQgZnVuY3Rpb24gY292ZXJlZCgpIHtcbiAgcmV0dXJuIFwiSGVsbG8gd29ybGRcIjtcbn1cbmApO1xuXG4gIGNvbnN0IGNvZGUgPSBzLnRvU3RyaW5nKCk7XG5cbiAgY29uc3QgZGF0YSA9IGF3YWl0IGNvbnZlcnQoe1xuICAgIGNvZGUsXG4gICAgc291cmNlTWFwOiB1bmRlZmluZWQsXG4gICAgYXN0OiBwYXJzZShjb2RlKSxcbiAgICBjb3ZlcmFnZToge1xuICAgICAgdXJsOiBwYXRoVG9GaWxlVVJMKGZpbGVuYW1lKS5ocmVmLFxuICAgICAgZnVuY3Rpb25zOiBbXG4gICAgICAgIHtcbiAgICAgICAgICBmdW5jdGlvbk5hbWU6IFwiY292ZXJlZFwiLFxuICAgICAgICAgIGlzQmxvY2tDb3ZlcmFnZTogdHJ1ZSxcbiAgICAgICAgICByYW5nZXM6IFt7IHN0YXJ0T2Zmc2V0OiAwLCBlbmRPZmZzZXQ6IDUzLCBjb3VudDogMSB9XSxcbiAgICAgICAgfSxcbiAgICAgIF0sXG4gICAgfSxcbiAgfSk7XG5cbiAgY29uc3QgY292ZXJhZ2UgPSBjcmVhdGVDb3ZlcmFnZU1hcChkYXRhKTtcbiAgY29uc3QgZmlsZUNvdmVyYWdlID0gY292ZXJhZ2UuZmlsZUNvdmVyYWdlRm9yKGZpbGVuYW1lKTtcblxuICBleHBlY3QoZmlsZUNvdmVyYWdlKS50b01hdGNoSW5saW5lU25hcHNob3QoYFxuICAgIHtcbiAgICAgIFwiYnJhbmNoZXNcIjogXCIwLzAgKDEwMCUpXCIsXG4gICAgICBcImZ1bmN0aW9uc1wiOiBcIjEvMSAoMTAwJSlcIixcbiAgICAgIFwibGluZXNcIjogXCIxLzEgKDEwMCUpXCIsXG4gICAgICBcInN0YXRlbWVudHNcIjogXCIxLzEgKDEwMCUpXCIsXG4gICAgfVxuICBgKTtcbn0pO1xuXG50ZXN0KFwiZW1wdHkgc291cmNlIG1hcCBtYXBwaW5ncyBtYXRjaCBtYWdpYy1zdHJpbmdcIiwgYXN5bmMgKCkgPT4ge1xuICBjb25zdCBmaWxlbmFtZSA9IFwiaGVsbG8uanNcIjtcbiAgY29uc3QgY29kZSA9IGBcXFxuZnVuY3Rpb24gaGVsbG8obmFtZSkge1xuICByZXR1cm4gXCJIZWxsbyBcIiArIG5hbWU7XG59YDtcblxuICBjb25zdCBleHBlY3RlZCA9IG5ldyBNYWdpY1N0cmluZyhjb2RlLCB7IGZpbGVuYW1lIH0pLmdlbmVyYXRlRGVjb2RlZE1hcCh7XG4gICAgZmlsZTogZmlsZW5hbWUsXG4gICAgaGlyZXM6IFwiYm91bmRhcnlcIixcbiAgICBpbmNsdWRlQ29udGVudDogdHJ1ZSxcbiAgICBzb3VyY2U6IGZpbGVuYW1lLFxuICB9KTtcblxuICBjb25zdCBhY3R1YWwgPSBjcmVhdGVFbXB0eVNvdXJjZU1hcChmaWxlbmFtZSwgY29kZSk7XG5cbiAgZXhwZWN0KGFjdHVhbC5tYXBwaW5ncykudG9TdHJpY3RFcXVhbChleHBlY3RlZC5tYXBwaW5ncyk7XG59KTtcblxudGVzdChcImlubGluZSBzb3VyY2UgbWFwIGFzIGJhc2U2NFwiLCBhc3luYyAoKSA9PiB7XG4gIGNvbnN0IGZpbGVuYW1lID0gbm9ybWFsaXplKHJlc29sdmUoXCIvc29tZS9maWxlLnRzXCIpKTtcblxuICBjb25zdCBzID0gbmV3IE1hZ2ljU3RyaW5nKGBcXFxuICAgIGV4cG9ydCBmdW5jdGlvbiBjb3ZlcmVkKCkge1xuICAgICAgcmV0dXJuIFwiSGVsbG8gd29ybGRcIjtcbiAgICB9XG5gKTtcblxuICBzLnJlcGxhY2UoXCJleHBvcnQgZnVuY3Rpb25cIiwgXCJcXG5cXG5cXG5leHBvcnQgZnVuY3Rpb25cIik7XG5cbiAgbGV0IGNvZGUgPSBzLnRvU3RyaW5nKCk7XG4gIGNvbnN0IG1hcCA9IHMuZ2VuZXJhdGVEZWNvZGVkTWFwKHsgaGlyZXM6IFwiYm91bmRhcnlcIiwgc291cmNlOiBmaWxlbmFtZSB9KTtcbiAgY29uc3QgZW5jb2RlZCA9IEJ1ZmZlci5mcm9tKEpTT04uc3RyaW5naWZ5KG1hcCkpLnRvU3RyaW5nKFwiYmFzZTY0XCIpO1xuXG4gIGNvZGUgKz0gYFxcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWRhdGE6YXBwbGljYXRpb24vanNvbjtiYXNlNjQsJHtlbmNvZGVkfVxcbmA7XG5cbiAgY29uc3QgZGF0YSA9IGF3YWl0IGNvbnZlcnQoe1xuICAgIGNvZGUsXG4gICAgc291cmNlTWFwOiB1bmRlZmluZWQsXG4gICAgYXN0OiBwYXJzZShjb2RlKSxcbiAgICBjb3ZlcmFnZToge1xuICAgICAgdXJsOiBwYXRoVG9GaWxlVVJMKGZpbGVuYW1lKS5ocmVmLFxuICAgICAgZnVuY3Rpb25zOiBbXG4gICAgICAgIHtcbiAgICAgICAgICBmdW5jdGlvbk5hbWU6IFwiY292ZXJlZFwiLFxuICAgICAgICAgIGlzQmxvY2tDb3ZlcmFnZTogdHJ1ZSxcbiAgICAgICAgICByYW5nZXM6IFt7IHN0YXJ0T2Zmc2V0OiAwLCBlbmRPZmZzZXQ6IDUzLCBjb3VudDogMSB9XSxcbiAgICAgICAgfSxcbiAgICAgIF0sXG4gICAgfSxcbiAgfSk7XG5cbiAgY29uc3QgY292ZXJhZ2UgPSBjcmVhdGVDb3ZlcmFnZU1hcChkYXRhKTtcbiAgY29uc3QgZmlsZUNvdmVyYWdlID0gY292ZXJhZ2UuZmlsZUNvdmVyYWdlRm9yKGZpbGVuYW1lKTtcblxuICBleHBlY3QoZmlsZUNvdmVyYWdlKS50b01hdGNoSW5saW5lU25hcHNob3QoYFxuICAgIHtcbiAgICAgIFwiYnJhbmNoZXNcIjogXCIwLzAgKDEwMCUpXCIsXG4gICAgICBcImZ1bmN0aW9uc1wiOiBcIjEvMSAoMTAwJSlcIixcbiAgICAgIFwibGluZXNcIjogXCIxLzEgKDEwMCUpXCIsXG4gICAgICBcInN0YXRlbWVudHNcIjogXCIxLzEgKDEwMCUpXCIsXG4gICAgfVxuICBgKTtcbiAgZXhwZWN0KGZpbGVDb3ZlcmFnZS5nZXRMaW5lQ292ZXJhZ2UoKSkudG9NYXRjaElubGluZVNuYXBzaG90KGBcbiAgICB7XG4gICAgICBcIjJcIjogMSxcbiAgICB9XG4gIGApO1xufSk7XG5cbnRlc3QoXCJpbmxpbmUgc291cmNlIG1hcCBhcyBmaWxlbmFtZVwiLCBhc3luYyAoKSA9PiB7XG4gIGNvbnN0IHV1aWQgPSByYW5kb21VVUlEKCk7XG4gIGNvbnN0IGZpbGVuYW1lID0gbm9ybWFsaXplKHJlc29sdmUoaW1wb3J0Lm1ldGEuZGlybmFtZSwgYGZpbGUtJHt1dWlkfS50c2ApKTtcbiAgY29uc3QgbWFwTmFtZSA9IG5vcm1hbGl6ZShcbiAgICByZXNvbHZlKGltcG9ydC5tZXRhLmRpcm5hbWUsIGBmaWxlLSR7dXVpZH0uanMubWFwYCksXG4gICk7XG5cbiAgY29uc3QgcyA9IG5ldyBNYWdpY1N0cmluZyhgXFxcbiAgICBleHBvcnQgZnVuY3Rpb24gY292ZXJlZCgpIHtcbiAgICAgIHJldHVybiBcIkhlbGxvIHdvcmxkXCI7XG4gICAgfVxuYCk7XG5cbiAgcy5yZXBsYWNlKFwiZXhwb3J0IGZ1bmN0aW9uXCIsIFwiXFxuXFxuXFxuZXhwb3J0IGZ1bmN0aW9uXCIpO1xuXG4gIGxldCBjb2RlID0gcy50b1N0cmluZygpO1xuICBjb25zdCBtYXAgPSBzLmdlbmVyYXRlRGVjb2RlZE1hcCh7IGhpcmVzOiBcImJvdW5kYXJ5XCIsIHNvdXJjZTogZmlsZW5hbWUgfSk7XG5cbiAgb25UZXN0RmluaXNoZWQoKCkgPT4gcm1TeW5jKG1hcE5hbWUsIHsgZm9yY2U6IHRydWUgfSkpO1xuICBhd2FpdCB3cml0ZUZpbGUobWFwTmFtZSwgSlNPTi5zdHJpbmdpZnkobWFwLCBudWxsLCAyKSwgXCJ1dGY4XCIpO1xuXG4gIGNvZGUgKz0gYFxcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWZpbGUtJHt1dWlkfS5qcy5tYXBcXG5gO1xuXG4gIGNvbnN0IGRhdGEgPSBhd2FpdCBjb252ZXJ0KHtcbiAgICBjb2RlLFxuICAgIHNvdXJjZU1hcDogdW5kZWZpbmVkLFxuICAgIGFzdDogcGFyc2UoY29kZSksXG4gICAgY292ZXJhZ2U6IHtcbiAgICAgIHVybDogcGF0aFRvRmlsZVVSTChmaWxlbmFtZSkuaHJlZixcbiAgICAgIGZ1bmN0aW9uczogW1xuICAgICAgICB7XG4gICAgICAgICAgZnVuY3Rpb25OYW1lOiBcImNvdmVyZWRcIixcbiAgICAgICAgICBpc0Jsb2NrQ292ZXJhZ2U6IHRydWUsXG4gICAgICAgICAgcmFuZ2VzOiBbeyBzdGFydE9mZnNldDogMCwgZW5kT2Zmc2V0OiA1MywgY291bnQ6IDEgfV0sXG4gICAgICAgIH0sXG4gICAgICBdLFxuICAgIH0sXG4gIH0pO1xuXG4gIGNvbnN0IGNvdmVyYWdlID0gY3JlYXRlQ292ZXJhZ2VNYXAoZGF0YSk7XG4gIGNvbnN0IGZpbGVDb3ZlcmFnZSA9IGNvdmVyYWdlLmZpbGVDb3ZlcmFnZUZvcihmaWxlbmFtZSk7XG5cbiAgZXhwZWN0KGZpbGVDb3ZlcmFnZSkudG9NYXRjaElubGluZVNuYXBzaG90KGBcbiAgICB7XG4gICAgICBcImJyYW5jaGVzXCI6IFwiMC8wICgxMDAlKVwiLFxuICAgICAgXCJmdW5jdGlvbnNcIjogXCIxLzEgKDEwMCUpXCIsXG4gICAgICBcImxpbmVzXCI6IFwiMS8xICgxMDAlKVwiLFxuICAgICAgXCJzdGF0ZW1lbnRzXCI6IFwiMS8xICgxMDAlKVwiLFxuICAgIH1cbiAgYCk7XG4gIGV4cGVjdChmaWxlQ292ZXJhZ2UuZ2V0TGluZUNvdmVyYWdlKCkpLnRvTWF0Y2hJbmxpbmVTbmFwc2hvdChgXG4gICAge1xuICAgICAgXCIyXCI6IDEsXG4gICAgfVxuICBgKTtcbn0pO1xuIl0sImZpbGUiOiIvdGVzdC9zb3VyY2UtbWFwcy50ZXN0LnRzIn0=
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment