@unts/patch-package
Version:
Fix broken node modules with no fuss
122 lines • 18.3 kB
JavaScript
;
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.getPackageResolution = void 0;
const lockfile_1 = require("@yarnpkg/lockfile");
const find_yarn_workspace_root_1 = __importDefault(require("find-yarn-workspace-root"));
const fs_extra_1 = require("fs-extra");
const yaml_1 = __importDefault(require("yaml"));
const PackageDetails_1 = require("./PackageDetails");
const coerceSemVer_1 = require("./coerceSemVer");
const detectPackageManager_1 = require("./detectPackageManager");
const getPackageVersion_1 = require("./getPackageVersion");
const path_1 = require("./path");
function getPackageResolution({ packageDetails, packageManager, appPath, }) {
if (packageManager === "yarn") {
let lockFilePath = "yarn.lock";
if (!(0, fs_extra_1.existsSync)(lockFilePath)) {
const workspaceRoot = (0, find_yarn_workspace_root_1.default)();
if (!workspaceRoot) {
throw new Error("Can't find yarn.lock file");
}
lockFilePath = (0, path_1.join)(workspaceRoot, "yarn.lock");
}
if (!(0, fs_extra_1.existsSync)(lockFilePath)) {
throw new Error("Can't find yarn.lock file");
}
const lockFileString = (0, fs_extra_1.readFileSync)(lockFilePath).toString();
let appLockFile;
if (lockFileString.includes("yarn lockfile v1")) {
const parsedYarnLockFile = (0, lockfile_1.parse)(lockFileString);
if (parsedYarnLockFile.type !== "success") {
throw new Error("Could not parse yarn v1 lock file");
}
else {
appLockFile = parsedYarnLockFile.object;
}
}
else {
try {
appLockFile = yaml_1.default.parse(lockFileString);
}
catch (e) {
console.log(e);
throw new Error("Could not parse yarn v2 lock file");
}
}
const installedVersion = (0, getPackageVersion_1.getPackageVersion)((0, path_1.join)((0, path_1.resolve)(appPath, packageDetails.path), "package.json"));
const entries = Object.entries(appLockFile).filter(([k, v]) => k.startsWith(packageDetails.name + "@") &&
// @ts-ignore
(0, coerceSemVer_1.coerceSemVer)(v.version) === (0, coerceSemVer_1.coerceSemVer)(installedVersion));
const resolutions = entries.map(([_, v]) => {
return v.resolved;
});
if (resolutions.length === 0) {
throw new Error(`\`${packageDetails.pathSpecifier}\`'s installed version is ${installedVersion} but a lockfile entry for it couldn't be found. Your lockfile is likely to be corrupt or you forgot to reinstall your packages.`);
}
if (new Set(resolutions).size !== 1) {
console.log(`Ambiguous lockfile entries for ${packageDetails.pathSpecifier}. Using version ${installedVersion}`);
return installedVersion;
}
if (resolutions[0]) {
return resolutions[0];
}
const packageName = packageDetails.name;
const resolutionVersion = entries[0][1].version;
// `@backstage/integration@npm:^1.5.0, @backstage/integration@npm:^1.7.0, @backstage/integration@npm:^1.7.2`
// ->
// `^1.5.0 ^1.7.0 ^1.7.2`
const resolution = entries[0][0]
.replace(new RegExp(packageName + "@", "g"), "")
.replace(/npm:/g, "")
.replace(/,/g, "");
// resolve relative file path
if (resolution.startsWith("file:.")) {
return `file:${(0, path_1.resolve)(appPath, resolution.slice("file:".length))}`;
}
// add `resolutionVersion` to ensure correct version, `^1.0.0` could resolve latest `v1.3.0`, but `^1.0.0 1.2.1` won't
return resolutionVersion ? resolution + " " + resolutionVersion : resolution;
}
else {
const lockfile = require((0, path_1.join)(appPath, packageManager === "npm-shrinkwrap"
? "npm-shrinkwrap.json"
: "package-lock.json"));
const lockFileStack = [lockfile];
for (const name of packageDetails.packageNames.slice(0, -1)) {
const child = lockFileStack[0].dependencies;
if (child && name in child) {
lockFileStack.push(child[name]);
}
}
lockFileStack.reverse();
const relevantStackEntry = lockFileStack.find((entry) => {
if (entry.dependencies) {
return entry.dependencies && packageDetails.name in entry.dependencies;
}
else if (entry.packages) {
return entry.packages && packageDetails.path in entry.packages;
}
throw new Error("Cannot find dependencies or packages in lockfile");
});
const pkg = relevantStackEntry.dependencies
? relevantStackEntry.dependencies[packageDetails.name]
: relevantStackEntry.packages[packageDetails.path];
return pkg.resolved || pkg.version || pkg.from;
}
}
exports.getPackageResolution = getPackageResolution;
if (require.main === module) {
const packageDetails = (0, PackageDetails_1.getPatchDetailsFromCliString)(process.argv[2]);
if (!packageDetails) {
console.log(`Can't find package ${process.argv[2]}`);
process.exit(1);
}
console.log(getPackageResolution({
appPath: process.cwd(),
packageDetails,
packageManager: (0, detectPackageManager_1.detectPackageManager)(process.cwd(), null),
}));
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ2V0UGFja2FnZVJlc29sdXRpb24uanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvZ2V0UGFja2FnZVJlc29sdXRpb24udHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7O0FBQUEsZ0RBQThEO0FBQzlELHdGQUF3RDtBQUN4RCx1Q0FBbUQ7QUFDbkQsZ0RBQXVCO0FBQ3ZCLHFEQUErRTtBQUMvRSxpREFBNkM7QUFDN0MsaUVBQTZFO0FBQzdFLDJEQUF1RDtBQUN2RCxpQ0FBc0M7QUFFdEMsU0FBZ0Isb0JBQW9CLENBQUMsRUFDbkMsY0FBYyxFQUNkLGNBQWMsRUFDZCxPQUFPLEdBS1I7SUFDQyxJQUFJLGNBQWMsS0FBSyxNQUFNLEVBQUU7UUFDN0IsSUFBSSxZQUFZLEdBQUcsV0FBVyxDQUFBO1FBQzlCLElBQUksQ0FBQyxJQUFBLHFCQUFVLEVBQUMsWUFBWSxDQUFDLEVBQUU7WUFDN0IsTUFBTSxhQUFhLEdBQUcsSUFBQSxrQ0FBaUIsR0FBRSxDQUFBO1lBQ3pDLElBQUksQ0FBQyxhQUFhLEVBQUU7Z0JBQ2xCLE1BQU0sSUFBSSxLQUFLLENBQUMsMkJBQTJCLENBQUMsQ0FBQTthQUM3QztZQUNELFlBQVksR0FBRyxJQUFBLFdBQUksRUFBQyxhQUFhLEVBQUUsV0FBVyxDQUFDLENBQUE7U0FDaEQ7UUFDRCxJQUFJLENBQUMsSUFBQSxxQkFBVSxFQUFDLFlBQVksQ0FBQyxFQUFFO1lBQzdCLE1BQU0sSUFBSSxLQUFLLENBQUMsMkJBQTJCLENBQUMsQ0FBQTtTQUM3QztRQUNELE1BQU0sY0FBYyxHQUFHLElBQUEsdUJBQVksRUFBQyxZQUFZLENBQUMsQ0FBQyxRQUFRLEVBQUUsQ0FBQTtRQUM1RCxJQUFJLFdBT0gsQ0FBQTtRQUNELElBQUksY0FBYyxDQUFDLFFBQVEsQ0FBQyxrQkFBa0IsQ0FBQyxFQUFFO1lBQy9DLE1BQU0sa0JBQWtCLEdBQUcsSUFBQSxnQkFBaUIsRUFBQyxjQUFjLENBQUMsQ0FBQTtZQUM1RCxJQUFJLGtCQUFr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QyxjQUFjLENBQUMsSUFBSSxDQUFDO1lBQ3RELENBQUMsQ0FBQyxrQkFBa0IsQ0FBQyxRQUFRLENBQUMsY0FBYyxDQUFDLElBQUksQ0FBQyxDQUFBO1FBQ3BELE9BQU8sR0FBRyxDQUFDLFFBQVEsSUFBSSxHQUFHLENBQUMsT0FBTyxJQUFJLEdBQUcsQ0FBQyxJQUFJLENBQUE7S0FDL0M7QUFDSCxDQUFDO0FBN0hELG9EQTZIQztBQUVELElBQUksT0FBTyxDQUFDLElBQUksS0FBSyxNQUFNLEVBQUU7SUFDM0IsTUFBTSxjQUFjLEdBQUcsSUFBQSw2Q0FBNEIsRUFBQyxPQUFPLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUE7SUFDcEUsSUFBSSxDQUFDLGNBQWMsRUFBRTtRQUNuQixPQUFPLENBQUMsR0FBRyxDQUFDLHNCQUFzQixPQUFPLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQTtRQUNwRCxPQUFPLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFBO0tBQ2hCO0lBQ0QsT0FBTyxDQUFDLEdBQUcsQ0FDVCxvQkFBb0IsQ0FBQztRQUNuQixPQUFPLEVBQUUsT0FBTyxDQUFDLEdBQUcsRUFBRTtRQUN0QixjQUFjO1FBQ2QsY0FBYyxFQUFFLElBQUEsMkNBQW9CLEVBQUMsT0FBTyxDQUFDLEdBQUcsRUFBRSxFQUFFLElBQUksQ0FBQztLQUMxRCxDQUFDLENBQ0gsQ0FBQTtDQUNGIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgcGFyc2UgYXMgcGFyc2VZYXJuTG9ja0ZpbGUgfSBmcm9tIFwiQHlhcm5wa2cvbG9ja2ZpbGVcIlxuaW1wb3J0IGZpbmRXb3Jrc3BhY2VSb290IGZyb20gXCJmaW5kLXlhcm4td29ya3NwYWNlLXJvb3RcIlxuaW1wb3J0IHsgZXhpc3RzU3luYywgcmVhZEZpbGVTeW5jIH0gZnJvbSBcImZzLWV4dHJhXCJcbmltcG9ydCB5YW1sIGZyb20gXCJ5YW1sXCJcbmltcG9ydCB7IFBhY2thZ2VEZXRhaWxzLCBnZXRQYXRjaERldGFpbHNGcm9tQ2xpU3RyaW5nIH0gZnJvbSBcIi4vUGFja2FnZURldGFpbHNcIlxuaW1wb3J0IHsgY29lcmNlU2VtVmVyIH0gZnJvbSBcIi4vY29lcmNlU2VtVmVyXCJcbmltcG9ydCB7IFBhY2thZ2VNYW5hZ2VyLCBkZXRlY3RQYWNrYWdlTWFuYWdlciB9IGZyb20gXCIuL2RldGVjdFBhY2thZ2VNYW5hZ2VyXCJcbmltcG9ydCB7IGdldFBhY2thZ2VWZXJzaW9uIH0gZnJvbSBcIi4vZ2V0UGFja2FnZVZlcnNpb25cIlxuaW1wb3J0IHsgam9pbiwgcmVzb2x2ZSB9IGZyb20gXCIuL3BhdGhcIlxuXG5leHBvcnQgZnVuY3Rpb24gZ2V0UGFja2FnZVJlc29sdXRpb24oe1xuICBwYWNrYWdlRGV0YWlscyxcbiAgcGFja2FnZU1hbmFnZXIsXG4gIGFwcFBhdGgsXG59OiB7XG4gIHBhY2thZ2VEZXRhaWxzOiBQYWNrYWdlRGV0YWlsc1xuICBwYWNrYWdlTWFuYWdlcjogUGFja2FnZU1hbmFnZXJcbiAgYXBwUGF0aDogc3RyaW5nXG59KSB7XG4gIGlmIChwYWNrYWdlTWFuYWdlciA9PT0gXCJ5YXJuXCIpIHtcbiAgICBsZXQgbG9ja0ZpbGVQYXRoID0gXCJ5YXJuLmxvY2tcIlxuICAgIGlmICghZXhpc3RzU3luYyhsb2NrRmlsZVBhdGgpKSB7XG4gICAgICBjb25zdCB3b3Jrc3BhY2VSb290ID0gZmluZFdvcmtzcGFjZVJvb3QoKVxuICAgICAgaWYgKCF3b3Jrc3BhY2VSb290KSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcIkNhbid0IGZpbmQgeWFybi5sb2NrIGZpbGVcIilcbiAgICAgIH1cbiAgICAgIGxvY2tGaWxlUGF0aCA9IGpvaW4od29ya3NwYWNlUm9vdCwgXCJ5YXJuLmxvY2tcIilcbiAgICB9XG4gICAgaWYgKCFleGlzdHNTeW5jKGxvY2tGaWxlUGF0aCkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcIkNhbid0IGZpbmQgeWFybi5sb2NrIGZpbGVcIilcbiAgICB9XG4gICAgY29uc3QgbG9ja0ZpbGVTdHJpbmcgPSByZWFkRmlsZVN5bmMobG9ja0ZpbGVQYXRoKS50b1N0cmluZygpXG4gICAgbGV0IGFwcExvY2tGaWxlOiBSZWNvcmQ8XG4gICAgICBzdHJpbmcsXG4gICAgICB7XG4gICAgICAgIHZlcnNpb246IHN0cmluZ1xuICAgICAgICByZXNvbHV0aW9uPzogc3RyaW5nXG4gICAgICAgIHJlc29sdmVkPzogc3RyaW5nXG4gICAgICB9XG4gICAgPlxuICAgIGlmIChsb2NrRmlsZVN0cmluZy5pbmNsdWRlcyhcInlhcm4gbG9ja2ZpbGUgdjFcIikpIHtcbiAgICAgIGNvbnN0IHBhcnNlZFlhcm5Mb2NrRmlsZSA9IHBhcnNlWWFybkxvY2tGaWxlKGxvY2tGaWxlU3RyaW5nKVxuICAgICAgaWYgKHBhcnNlZFlhcm5Mb2NrRmlsZS50eXBlICE9PSBcInN1Y2Nlc3NcIikge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJDb3VsZCBub3QgcGFyc2UgeWFybiB2MSBsb2NrIGZpbGVcIilcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGFwcExvY2tGaWxlID0gcGFyc2VkWWFybkxvY2tGaWxlLm9iamVjdFxuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICB0cnkge1xuICAgICAgICBhcHBMb2NrRmlsZSA9IHlhbWwucGFyc2UobG9ja0ZpbGVTdHJpbmcpXG4gICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIGNvbnNvbGUubG9nKGUpXG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcIkNvdWxkIG5vdCBwYXJzZSB5YXJuIHYyIGxvY2sgZmlsZVwiKVxuICAgICAgfVxuICAgIH1cblxuICAgIGNvbnN0IGluc3RhbGxlZFZlcnNpb24gPSBnZXRQYWNrYWdlVmVyc2lvbihcbiAgICAgIGpvaW4ocmVzb2x2ZShhcHBQYXRoLCBwYWNrYWdlRGV0YWlscy5wYXRoKSwgXCJwYWNrYWdlLmpzb25cIiksXG4gICAgKVxuXG4gICAgY29uc3QgZW50cmllcyA9IE9iamVjdC5lbnRyaWVzKGFwcExvY2tGaWxlKS5maWx0ZXIoXG4gICAgICAoW2ssIHZdKSA9PlxuICAgICAgICBrLnN0YXJ0c1dpdGgocGFja2FnZURldGFpbHMubmFtZSArIFwiQFwiKSAmJlxuICAgICAgICAvLyBAdHMtaWdub3JlXG4gICAgICAgIGNvZXJjZVNlbVZlcih2LnZlcnNpb24pID09PSBjb2VyY2VTZW1WZXIoaW5zdGFsbGVkVmVyc2lvbiksXG4gICAgKVxuXG4gICAgY29uc3QgcmVzb2x1dGlvbnMgPSBlbnRyaWVzLm1hcCgoW18sIHZdKSA9PiB7XG4gICAgICByZXR1cm4gdi5yZXNvbHZlZFxuICAgIH0pXG5cbiAgICBpZiAocmVzb2x1dGlvbnMubGVuZ3RoID09PSAwKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgIGBcXGAke3BhY2thZ2VEZXRhaWxzLnBhdGhTcGVjaWZpZXJ9XFxgJ3MgaW5zdGFsbGVkIHZlcnNpb24gaXMgJHtpbnN0YWxsZWRWZXJzaW9ufSBidXQgYSBsb2NrZmlsZSBlbnRyeSBmb3IgaXQgY291bGRuJ3QgYmUgZm91bmQuIFlvdXIgbG9ja2ZpbGUgaXMgbGlrZWx5IHRvIGJlIGNvcnJ1cHQgb3IgeW91IGZvcmdvdCB0byByZWluc3RhbGwgeW91ciBwYWNrYWdlcy5gLFxuICAgICAgKVxuICAgIH1cblxuICAgIGlmIChuZXcgU2V0KHJlc29sdXRpb25zKS5zaXplICE9PSAxKSB7XG4gICAgICBjb25zb2xlLmxvZyhcbiAgICAgICAgYEFtYmlndW91cyBsb2NrZmlsZSBlbnRyaWVzIGZvciAke3BhY2thZ2VEZXRhaWxzLnBhdGhTcGVjaWZpZXJ9LiBVc2luZyB2ZXJzaW9uICR7aW5zdGFsbGVkVmVyc2lvbn1gLFxuICAgICAgKVxuICAgICAgcmV0dXJuIGluc3RhbGxlZFZlcnNpb25cbiAgICB9XG5cbiAgICBpZiAocmVzb2x1dGlvbnNbMF0pIHtcbiAgICAgIHJldHVybiByZXNvbHV0aW9uc1swXVxuICAgIH1cblxuICAgIGNvbnN0IHBhY2thZ2VOYW1lID0gcGFja2FnZURldGFpbHMubmFtZVxuXG4gICAgY29uc3QgcmVzb2x1dGlvblZlcnNpb24gPSBlbnRyaWVzWzBdWzFdLnZlcnNpb25cblxuICAgIC8vIGBAYmFja3N0YWdlL2ludGVncmF0aW9uQG5wbTpeMS41LjAsIEBiYWNrc3RhZ2UvaW50ZWdyYXRpb25AbnBtOl4xLjcuMCwgQGJhY2tzdGFnZS9pbnRlZ3JhdGlvbkBucG06XjEuNy4yYFxuICAgIC8vIC0+XG4gICAgLy8gYF4xLjUuMCBeMS43LjAgXjEuNy4yYFxuICAgIGNvbnN0IHJlc29sdXRpb24gPSBlbnRyaWVzWzBdWzBdXG4gICAgICAucmVwbGFjZShuZXcgUmVnRXhwKHBhY2thZ2VOYW1lICsgXCJAXCIsIFwiZ1wiKSwgXCJcIilcbiAgICAgIC5yZXBsYWNlKC9ucG06L2csIFwiXCIpXG4gICAgICAucmVwbGFjZSgvLC9nLCBcIlwiKVxuXG4gICAgLy8gcmVzb2x2ZSByZWxhdGl2ZSBmaWxlIHBhdGhcbiAgICBpZiAocmVzb2x1dGlvbi5zdGFydHNXaXRoKFwiZmlsZTouXCIpKSB7XG4gICAgICByZXR1cm4gYGZpbGU6JHtyZXNvbHZlKGFwcFBhdGgsIHJlc29sdXRpb24uc2xpY2UoXCJmaWxlOlwiLmxlbmd0aCkpfWBcbiAgICB9XG5cbiAgICAvLyBhZGQgYHJlc29sdXRpb25WZXJzaW9uYCB0byBlbnN1cmUgY29ycmVjdCB2ZXJzaW9uLCBgXjEuMC4wYCBjb3VsZCByZXNvbHZlIGxhdGVzdCBgdjEuMy4wYCwgYnV0IGBeMS4wLjAgMS4yLjFgIHdvbid0XG4gICAgcmV0dXJuIHJlc29sdXRpb25WZXJzaW9uID8gcmVzb2x1dGlvbiArIFwiIFwiICsgcmVzb2x1dGlvblZlcnNpb24gOiByZXNvbHV0aW9uXG4gIH0gZWxzZSB7XG4gICAgY29uc3QgbG9ja2ZpbGUgPSByZXF1aXJlKGpvaW4oXG4gICAgICBhcHBQYXRoLFxuICAgICAgcGFja2FnZU1hbmFnZXIgPT09IFwibnBtLXNocmlua3dyYXBcIlxuICAgICAgICA/IFwibnBtLXNocmlua3dyYXAuanNvblwiXG4gICAgICAgIDogXCJwYWNrYWdlLWxvY2suanNvblwiLFxuICAgICkpXG4gICAgY29uc3QgbG9ja0ZpbGVTdGFjayA9IFtsb2NrZmlsZV1cbiAgICBmb3IgKGNvbnN0IG5hbWUgb2YgcGFja2FnZURldGFpbHMucGFja2FnZU5hbWVzLnNsaWNlKDAsIC0xKSkge1xuICAgICAgY29uc3QgY2hpbGQgPSBsb2NrRmlsZVN0YWNrWzBdLmRlcGVuZGVuY2llc1xuICAgICAgaWYgKGNoaWxkICYmIG5hbWUgaW4gY2hpbGQpIHtcbiAgICAgICAgbG9ja0ZpbGVTdGFjay5wdXNoKGNoaWxkW25hbWVdKVxuICAgICAgfVxuICAgIH1cbiAgICBsb2NrRmlsZVN0YWNrLnJldmVyc2UoKVxuICAgIGNvbnN0IHJlbGV2YW50U3RhY2tFbnRyeSA9IGxvY2tGaWxlU3RhY2suZmluZCgoZW50cnkpID0+IHtcbiAgICAgIGlmIChlbnRyeS5kZXBlbmRlbmNpZXMpIHtcbiAgICAgICAgcmV0dXJuIGVudHJ5LmRlcGVuZGVuY2llcyAmJiBwYWNrYWdlRGV0YWlscy5uYW1lIGluIGVudHJ5LmRlcGVuZGVuY2llc1xuICAgICAgfSBlbHNlIGlmIChlbnRyeS5wYWNrYWdlcykge1xuICAgICAgICByZXR1cm4gZW50cnkucGFja2FnZXMgJiYgcGFja2FnZURldGFpbHMucGF0aCBpbiBlbnRyeS5wYWNrYWdlc1xuICAgICAgfVxuICAgICAgdGhyb3cgbmV3IEVycm9yKFwiQ2Fubm90IGZpbmQgZGVwZW5kZW5jaWVzIG9yIHBhY2thZ2VzIGluIGxvY2tmaWxlXCIpXG4gICAgfSlcbiAgICBjb25zdCBwa2cgPSByZWxldmFudFN0YWNrRW50cnkuZGVwZW5kZW5jaWVzXG4gICAgICA/IHJlbGV2YW50U3RhY2tFbnRyeS5kZXBlbmRlbmNpZXNbcGFja2FnZURldGFpbHMubmFtZV1cbiAgICAgIDogcmVsZXZhbnRTdGFja0VudHJ5LnBhY2thZ2VzW3BhY2thZ2VEZXRhaWxzLnBhdGhdXG4gICAgcmV0dXJuIHBrZy5yZXNvbHZlZCB8fCBwa2cudmVyc2lvbiB8fCBwa2cuZnJvbVxuICB9XG59XG5cbmlmIChyZXF1aXJlLm1haW4gPT09IG1vZHVsZSkge1xuICBjb25zdCBwYWNrYWdlRGV0YWlscyA9IGdldFBhdGNoRGV0YWlsc0Zyb21DbGlTdHJpbmcocHJvY2Vzcy5hcmd2WzJdKVxuICBpZiAoIXBhY2thZ2VEZXRhaWxzKSB7XG4gICAgY29uc29sZS5sb2coYENhbid0IGZpbmQgcGFja2FnZSAke3Byb2Nlc3MuYXJndlsyXX1gKVxuICAgIHByb2Nlc3MuZXhpdCgxKVxuICB9XG4gIGNvbnNvbGUubG9nKFxuICAgIGdldFBhY2thZ2VSZXNvbHV0aW9uKHtcbiAgICAgIGFwcFBhdGg6IHByb2Nlc3MuY3dkKCksXG4gICAgICBwYWNrYWdlRGV0YWlscyxcbiAgICAgIHBhY2thZ2VNYW5hZ2VyOiBkZXRlY3RQYWNrYWdlTWFuYWdlcihwcm9jZXNzLmN3ZCgpLCBudWxsKSxcbiAgICB9KSxcbiAgKVxufVxuIl19