UNPKG

@rnm/pm

Version:

Unified Package Manager for Node.js

142 lines 22.5 kB
import childProcess from "node:child_process"; import fs from "node:fs/promises"; import os from "node:os"; import path from "node:path"; import process from "node:process"; import { fileURLToPath } from "node:url"; import chalk from "chalk"; import corepackPkgJson from "corepack/package.json" with { type: "json" }; import registryUrl from "registry-url"; import { importMetaResolve } from "./import-meta-resolve.js"; export const executorMap = { npm: "npx", yarn: "yarnpkg", // Not very correct since yarn has no similar command like `npx` and `pnpx` officially. pnpm: "pnpx", }; const exists = async (p) => await fs .access(p) .then(() => true) .catch(() => false); const importPkgJson = async (p) => await fs .readFile(p, "utf8") .then(JSON.parse) .catch(() => undefined); async function findUp(name, { cwd = process.cwd() } = {}) { const result = path.join(cwd, name); const existing = await exists(result); if (existing) return result; const parent = path.dirname(cwd); if (parent === cwd) return undefined; return await findUp(name, { cwd: parent }); } async function detectByPackageJson(directory = process.cwd()) { const pkgJsonContent = await importPkgJson(path.join(directory, "package.json")); // 1. detect pm by `packageManager` field const [packageManager, rest] = pkgJsonContent?.packageManager?.split("@") ?? []; if (packageManager === "npm" || packageManager === "yarn" || packageManager === "pnpm") { const version = rest?.split("+")[0]; return { name: packageManager, ...(version && { version }) }; } // 2. detect pm by `devEngines` filed const { name, version: devEnginesVer } = pkgJsonContent?.devEngines?.packageManager ?? {}; if (name === "npm" || name === "yarn" || name === "pnpm") { const version = devEnginesVer?.split("+")[0]; return { name, ...(version && { version }) }; } // 3. detect pm by `engines` filed // Note: Corepack does not support `engines` field. So the result doesn't include the version. See https://github.com/nodejs/corepack/issues/694. if (pkgJsonContent?.engines?.["npm"]) return { name: "npm" }; if (pkgJsonContent?.engines?.["yarn"]) return { name: "yarn" }; if (pkgJsonContent?.engines?.["pnpm"]) return { name: "pnpm" }; const parent = path.dirname(directory); if (directory === parent) return undefined; return await detectByPackageJson(parent); } /** * Detects the package manager used in the specified directory. * @param directory - The absolute path to the directory to check. */ export async function detect(directory = process.cwd()) { const pkgJsonPath = await findUp("package.json", { cwd: directory }); if (!pkgJsonPath) { // throw new Error("No package.json found."); return undefined; } // 1. detect pm by package.json const pm = await detectByPackageJson(path.dirname(pkgJsonPath)); if (pm) return pm; // 2. detect pm by lock files const locks = (await Promise.all([ findUp("package-lock.json", { cwd: directory }), findUp("yarn.lock", { cwd: directory }), findUp("pnpm-lock.yaml", { cwd: directory }), ])).filter((p) => p !== undefined); if (locks.length > 1) { throw new Error("Multiple lock files found. Please remove one of them."); } if (locks[0]?.endsWith("package-lock.json")) return { name: "npm" }; if (locks[0]?.endsWith("yarn.lock")) return { name: "yarn" }; if (locks[0]?.endsWith("pnpm-lock.yaml")) return { name: "pnpm" }; return undefined; } /** * @returns Absolute path to corepack binary. */ function getCorepackPath() { const corepackPkgJsonPath = fileURLToPath(importMetaResolve("corepack/package.json")); return path.resolve(path.dirname(corepackPkgJsonPath), corepackPkgJson.bin.corepack); } function getCommand(detectResult, args, execute) { const { name = "npm", version } = detectResult ?? {}; const executor = execute ? executorMap[name] : name; return [`${executor}${version ? `@${version}` : ""}`, ...args]; } export async function run(detectResult, args, execute) { const command = getCommand(detectResult, args, execute); const cp = childProcess.spawn(getCorepackPath(), command, { stdio: "inherit", env: { COREPACK_ENV_FILE: "0", COREPACK_NPM_REGISTRY: registryUrl().replace(/\/$/, ""), // TODO: Remove this env when https://github.com/nodejs/corepack/issues/540 is resolved. ...Object.fromEntries(Object.entries(process.env).filter(([k]) => !k.startsWith("COREPACK_"))), }, }); const listener = (signal) => !cp.killed && cp.kill(signal); process.on("SIGINT", listener); process.on("SIGTERM", listener); return await new Promise((resolve, reject) => { cp.on("error", (err) => { reject(err); }); cp.on("close", (code, signal) => { resolve(code ?? (signal !== null ? 128 + os.constants.signals[signal] : 1)); }); }); } export function getMsg(detectResult, args, execute) { const name = detectResult?.name ?? "npm"; const version = detectResult?.version ?? "unknown"; const nameVer = `[${name}@${version}]`; const info = detectResult ? "(detected)" : "(fallback)"; const command = getCommand(detectResult, args, execute); command[0] &&= command[0].replace(/@.*$/, ""); return [ "📦", `${chalk.bold(nameVer)}${chalk.dim(info)}`, "➜", chalk.blue(command.join(" ")), ].join(" "); } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYmFzZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3NyYy9iYXNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sWUFBWSxNQUFNLG9CQUFvQixDQUFDO0FBQzlDLE9BQU8sRUFBRSxNQUFNLGtCQUFrQixDQUFDO0FBQ2xDLE9BQU8sRUFBRSxNQUFNLFNBQVMsQ0FBQztBQUN6QixPQUFPLElBQUksTUFBTSxXQUFXLENBQUM7QUFDN0IsT0FBTyxPQUFPLE1BQU0sY0FBYyxDQUFDO0FBQ25DLE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSxVQUFVLENBQUM7QUFDekMsT0FBTyxLQUFLLE1BQU0sT0FBTyxDQUFDO0FBQzFCLE9BQU8sZUFBZSxNQUFNLHVCQUF1QixDQUFDLE9BQU8sSUFBSSxFQUFFLE1BQU0sRUFBRSxDQUFDO0FBQzFFLE9BQU8sV0FBVyxNQUFNLGNBQWMsQ0FBQztBQUN2QyxPQUFPLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSwwQkFBMEIsQ0FBQztBQVM3RCxNQUFNLENBQUMsTUFBTSxXQUFXLEdBQUc7SUFDekIsR0FBRyxFQUFFLEtBQUs7SUFDVixJQUFJLEVBQUUsU0FBUyxFQUFFLHVGQUF1RjtJQUN4RyxJQUFJLEVBQUUsTUFBTTtDQUNrQyxDQUFDO0FBRWpELE1BQU0sTUFBTSxHQUFHLEtBQUssRUFBRSxDQUFTLEVBQUUsRUFBRSxDQUNqQyxNQUFNLEVBQUU7S0FDTCxNQUFNLENBQUMsQ0FBQyxDQUFDO0tBQ1QsSUFBSSxDQUFDLEdBQUcsRUFBRSxDQUFDLElBQUksQ0FBQztLQUNoQixLQUFLLENBQUMsR0FBRyxFQUFFLENBQUMsS0FBSyxDQUFDLENBQUM7QUFDeEIsTUFBTSxhQUFhLEdBQUcsS0FBSyxFQUFFLENBQVMsRUFBRSxFQUFFLENBQ3hDLE1BQU0sRUFBRTtLQUNMLFFBQVEsQ0FBQyxDQUFDLEVBQUUsTUFBTSxDQUFDO0tBQ25CLElBQUksQ0FJRixJQUFJLENBQUMsS0FBSyxDQUFDO0tBQ2IsS0FBSyxD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Q0FBQztJQUNMLENBQUMsQ0FBQyxDQUFDO0FBQ0wsQ0FBQztBQUVELE1BQU0sVUFBVSxNQUFNLENBQ3BCLFlBQXNDLEVBQ3RDLElBQWMsRUFDZCxPQUFpQjtJQUVqQixNQUFNLElBQUksR0FBRyxZQUFZLEVBQUUsSUFBSSxJQUFJLEtBQUssQ0FBQztJQUN6QyxNQUFNLE9BQU8sR0FBRyxZQUFZLEVBQUUsT0FBTyxJQUFJLFNBQVMsQ0FBQztJQUNuRCxNQUFNLE9BQU8sR0FBRyxJQUFJLElBQUksSUFBSSxPQUFPLEdBQUcsQ0FBQztJQUN2QyxNQUFNLElBQUksR0FBRyxZQUFZLENBQUMsQ0FBQyxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUMsWUFBWSxDQUFDO0lBRXhELE1BQU0sT0FBTyxHQUFHLFVBQVUsQ0FBQyxZQUFZLEVBQUUsSUFBSSxFQUFFLE9BQU8sQ0FBQyxDQUFDO0lBQ3hELE9BQU8sQ0FBQyxDQUFDLENBQUMsS0FBSyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLE1BQU0sRUFBRSxFQUFFLENBQUMsQ0FBQztJQUM5QyxPQUFPO1FBQ0wsSUFBSTtRQUNKLEdBQUcsS0FBSyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsR0FBRyxLQUFLLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxFQUFFO1FBQzFDLEdBQUc7UUFDSCxLQUFLLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUM7S0FDOUIsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDZCxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IGNoaWxkUHJvY2VzcyBmcm9tIFwibm9kZTpjaGlsZF9wcm9jZXNzXCI7XG5pbXBvcnQgZnMgZnJvbSBcIm5vZGU6ZnMvcHJvbWlzZXNcIjtcbmltcG9ydCBvcyBmcm9tIFwibm9kZTpvc1wiO1xuaW1wb3J0IHBhdGggZnJvbSBcIm5vZGU6cGF0aFwiO1xuaW1wb3J0IHByb2Nlc3MgZnJvbSBcIm5vZGU6cHJvY2Vzc1wiO1xuaW1wb3J0IHsgZmlsZVVSTFRvUGF0aCB9IGZyb20gXCJub2RlOnVybFwiO1xuaW1wb3J0IGNoYWxrIGZyb20gXCJjaGFsa1wiO1xuaW1wb3J0IGNvcmVwYWNrUGtnSnNvbiBmcm9tIFwiY29yZXBhY2svcGFja2FnZS5qc29uXCIgd2l0aCB7IHR5cGU6IFwianNvblwiIH07XG5pbXBvcnQgcmVnaXN0cnlVcmwgZnJvbSBcInJlZ2lzdHJ5LXVybFwiO1xuaW1wb3J0IHsgaW1wb3J0TWV0YVJlc29sdmUgfSBmcm9tIFwiLi9pbXBvcnQtbWV0YS1yZXNvbHZlLnRzXCI7XG5cbmV4cG9ydCB0eXBlIFN1cHBvcnRlZFBtID0gXCJucG1cIiB8IFwieWFyblwiIHwgXCJwbnBtXCI7XG5cbmV4cG9ydCBpbnRlcmZhY2UgRGV0ZWN0UmVzdWx0IHtcbiAgbmFtZTogU3VwcG9ydGVkUG07XG4gIHZlcnNpb24/OiBzdHJpbmc7XG59XG5cbmV4cG9ydCBjb25zdCBleGVjdXRvck1hcCA9IHtcbiAgbnBtOiBcIm5weFwiLFxuICB5YXJuOiBcInlhcm5wa2dcIiwgLy8gTm90IHZlcnkgY29ycmVjdCBzaW5jZSB5YXJuIGhhcyBubyBzaW1pbGFyIGNvbW1hbmQgbGlrZSBgbnB4YCBhbmQgYHBucHhgIG9mZmljaWFsbHkuXG4gIHBucG06IFwicG5weFwiLFxufSBhcyBjb25zdCBzYXRpc2ZpZXMgUmVjb3JkPFN1cHBvcnRlZFBtLCBzdHJpbmc+O1xuXG5jb25zdCBleGlzdHMgPSBhc3luYyAocDogc3RyaW5nKSA9PlxuICBhd2FpdCBmc1xuICAgIC5hY2Nlc3MocClcbiAgICAudGhlbigoKSA9PiB0cnVlKVxuICAgIC5jYXRjaCgoKSA9PiBmYWxzZSk7XG5jb25zdCBpbXBvcnRQa2dKc29uID0gYXN5bmMgKHA6IHN0cmluZykgPT5cbiAgYXdhaXQgZnNcbiAgICAucmVhZEZpbGUocCwgXCJ1dGY4XCIpXG4gICAgLnRoZW48e1xuICAgICAgcGFja2FnZU1hbmFnZXI/OiBzdHJpbmc7XG4gICAgICBlbmdpbmVzPzogUmVjb3JkPHN0cmluZywgc3RyaW5nPjtcbiAgICAgIGRldkVuZ2luZXM/OiB7IHBhY2thZ2VNYW5hZ2VyPzogeyBuYW1lPzogc3RyaW5nOyB2ZXJzaW9uPzogc3RyaW5nIH0gfTtcbiAgICB9PihKU09OLnBhcnNlKVxuICAgIC5jYXRjaCgoKSA9PiB1bmRlZmluZWQpO1xuXG5hc3luYyBmdW5jdGlvbiBmaW5kVXAobmFtZTogc3RyaW5nLCB7IGN3ZCA9IHByb2Nlc3MuY3dkKCkgfSA9IHt9KSB7XG4gIGNvbnN0IHJlc3VsdCA9IHBhdGguam9pbihjd2QsIG5hbWUpO1xuICBjb25zdCBleGlzdGluZyA9IGF3YWl0IGV4aXN0cyhyZXN1bHQpO1xuICBpZiAoZXhpc3RpbmcpIHJldHVybiByZXN1bHQ7XG4gIGNvbnN0IHBhcmVudCA9IHBhdGguZGlybmFtZShjd2QpO1xuICBpZiAocGFyZW50ID09PSBjd2QpIHJldHVybiB1bmRlZmluZWQ7XG4gIHJldHVybiBhd2FpdCBmaW5kVXAobmFtZSwgeyBjd2Q6IHBhcmVudCB9KTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gZGV0ZWN0QnlQYWNrYWdlSnNvbihcbiAgZGlyZWN0b3J5ID0gcHJvY2Vzcy5jd2QoKSxcbik6IFByb21pc2U8RGV0ZWN0UmVzdWx0IHwgdW5kZWZpbmVkPiB7XG4gIGNvbnN0IHBrZ0pzb25Db250ZW50ID0gYXdhaXQgaW1wb3J0UGtnSnNvbihcbiAgICBwYXRoLmpvaW4oZGlyZWN0b3J5LCBcInBhY2thZ2UuanNvblwiKSxcbiAgKTtcblxuICAvLyAxLiBkZXRlY3QgcG0gYnkgYHBhY2thZ2VNYW5hZ2VyYCBmaWVsZFxuICBjb25zdCBbcGFja2FnZU1hbmFnZXIsIHJlc3RdID1cbiAgICBwa2dKc29uQ29udGVudD8ucGFja2FnZU1hbmFnZXI/LnNwbGl0KFwiQFwiKSA/PyBbXTtcbiAgaWYgKFxuICAgIHBhY2thZ2VNYW5hZ2VyID09PSBcIm5wbVwiIHx8XG4gICAgcGFja2FnZU1hbmFnZXIgPT09IFwieWFyblwiIHx8XG4gICAgcGFja2FnZU1hbmFnZXIgPT09IFwicG5wbVwiXG4gICkge1xuICAgIGNvbnN0IHZlcnNpb24gPSByZXN0Py5zcGxpdChcIitcIilbMF07XG4gICAgcmV0dXJuIHsgbmFtZTogcGFja2FnZU1hbmFnZXIsIC4uLih2ZXJzaW9uICYmIHsgdmVyc2lvbiB9KSB9O1xuICB9XG5cbiAgLy8gMi4gZGV0ZWN0IHBtIGJ5IGBkZXZFbmdpbmVzYCBmaWxlZFxuICBjb25zdCB7IG5hbWUsIHZlcnNpb246IGRldkVuZ2luZXNWZXIgfSA9XG4gICAgcGtnSnNvbkNvbnRlbnQ/LmRldkVuZ2luZXM/LnBhY2thZ2VNYW5hZ2VyID8/IHt9O1xuICBpZiAobmFtZSA9PT0gXCJucG1cIiB8fCBuYW1lID09PSBcInlhcm5cIiB8fCBuYW1lID09PSBcInBucG1cIikge1xuICAgIGNvbnN0IHZlcnNpb24gPSBkZXZFbmdpbmVzVmVyPy5zcGxpdChcIitcIilbMF07XG4gICAgcmV0dXJuIHsgbmFtZSwgLi4uKHZlcnNpb24gJiYgeyB2ZXJzaW9uIH0pIH07XG4gIH1cblxuICAvLyAzLiBkZXRlY3QgcG0gYnkgYGVuZ2luZXNgIGZpbGVkXG4gIC8vIE5vdGU6IENvcmVwYWNrIGRvZXMgbm90IHN1cHBvcnQgYGVuZ2luZXNgIGZpZWxkLiBTbyB0aGUgcmVzdWx0IGRvZXNuJ3QgaW5jbHVkZSB0aGUgdmVyc2lvbi4gU2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9ub2RlanMvY29yZXBhY2svaXNzdWVzLzY5NC5cbiAgaWYgKHBrZ0pzb25Db250ZW50Py5lbmdpbmVzPy5bXCJucG1cIl0pIHJldHVybiB7IG5hbWU6IFwibnBtXCIgfTtcbiAgaWYgKHBrZ0pzb25Db250ZW50Py5lbmdpbmVzPy5bXCJ5YXJuXCJdKSByZXR1cm4geyBuYW1lOiBcInlhcm5cIiB9O1xuICBpZiAocGtnSnNvbkNvbnRlbnQ/LmVuZ2luZXM/LltcInBucG1cIl0pIHJldHVybiB7IG5hbWU6IFwicG5wbVwiIH07XG5cbiAgY29uc3QgcGFyZW50ID0gcGF0aC5kaXJuYW1lKGRpcmVjdG9yeSk7XG4gIGlmIChkaXJlY3RvcnkgPT09IHBhcmVudCkgcmV0dXJuIHVuZGVmaW5lZDtcbiAgcmV0dXJuIGF3YWl0IGRldGVjdEJ5UGFja2FnZUpzb24ocGFyZW50KTtcbn1cblxuLyoqXG4gKiBEZXRlY3RzIHRoZSBwYWNrYWdlIG1hbmFnZXIgdXNlZCBpbiB0aGUgc3BlY2lmaWVkIGRpcmVjdG9yeS5cbiAqIEBwYXJhbSBkaXJlY3RvcnkgLSBUaGUgYWJzb2x1dGUgcGF0aCB0byB0aGUgZGlyZWN0b3J5IHRvIGNoZWNrLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZGV0ZWN0KFxuICBkaXJlY3RvcnkgPSBwcm9jZXNzLmN3ZCgpLFxuKTogUHJvbWlzZTxEZXRlY3RSZXN1bHQgfCB1bmRlZmluZWQ+IHtcbiAgY29uc3QgcGtnSnNvblBhdGggPSBhd2FpdCBmaW5kVXAoXCJwYWNrYWdlLmpzb25cIiwgeyBjd2Q6IGRpcmVjdG9yeSB9KTtcbiAgaWYgKCFwa2dKc29uUGF0aCkge1xuICAgIC8vIHRocm93IG5ldyBFcnJvcihcIk5vIHBhY2thZ2UuanNvbiBmb3VuZC5cIik7XG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfVxuXG4gIC8vIDEuIGRldGVjdCBwbSBieSBwYWNrYWdlLmpzb25cbiAgY29uc3QgcG0gPSBhd2FpdCBkZXRlY3RCeVBhY2thZ2VKc29uKHBhdGguZGlybmFtZShwa2dKc29uUGF0aCkpO1xuICBpZiAocG0pIHJldHVybiBwbTtcblxuICAvLyAyLiBkZXRlY3QgcG0gYnkgbG9jayBmaWxlc1xuICBjb25zdCBsb2NrcyA9IChcbiAgICBhd2FpdCBQcm9taXNlLmFsbChbXG4gICAgICBmaW5kVXAoXCJwYWNrYWdlLWxvY2suanNvblwiLCB7IGN3ZDogZGlyZWN0b3J5IH0pLFxuICAgICAgZmluZFVwKFwieWFybi5sb2NrXCIsIHsgY3dkOiBkaXJlY3RvcnkgfSksXG4gICAgICBmaW5kVXAoXCJwbnBtLWxvY2sueWFtbFwiLCB7IGN3ZDogZGlyZWN0b3J5IH0pLFxuICAgIF0pXG4gICkuZmlsdGVyKChwKSA9PiBwICE9PSB1bmRlZmluZWQpO1xuICBpZiAobG9ja3MubGVuZ3RoID4gMSkge1xuICAgIHRocm93IG5ldyBFcnJvcihcIk11bHRpcGxlIGxvY2sgZmlsZXMgZm91bmQuIFBsZWFzZSByZW1vdmUgb25lIG9mIHRoZW0uXCIpO1xuICB9XG4gIGlmIChsb2Nrc1swXT8uZW5kc1dpdGgoXCJwYWNrYWdlLWxvY2suanNvblwiKSkgcmV0dXJuIHsgbmFtZTogXCJucG1cIiB9O1xuICBpZiAobG9ja3NbMF0/LmVuZHNXaXRoKFwieWFybi5sb2NrXCIpKSByZXR1cm4geyBuYW1lOiBcInlhcm5cIiB9O1xuICBpZiAobG9ja3NbMF0/LmVuZHNXaXRoKFwicG5wbS1sb2NrLnlhbWxcIikpIHJldHVybiB7IG5hbWU6IFwicG5wbVwiIH07XG4gIHJldHVybiB1bmRlZmluZWQ7XG59XG5cbi8qKlxuICogQHJldHVybnMgQWJzb2x1dGUgcGF0aCB0byBjb3JlcGFjayBiaW5hcnkuXG4gKi9cbmZ1bmN0aW9uIGdldENvcmVwYWNrUGF0aCgpOiBzdHJpbmcge1xuICBjb25zdCBjb3JlcGFja1BrZ0pzb25QYXRoID0gZmlsZVVSTFRvUGF0aChcbiAgICBpbXBvcnRNZXRhUmVzb2x2ZShcImNvcmVwYWNrL3BhY2thZ2UuanNvblwiKSxcbiAgKTtcbiAgcmV0dXJuIHBhdGgucmVzb2x2ZShcbiAgICBwYXRoLmRpcm5hbWUoY29yZXBhY2tQa2dKc29uUGF0aCksXG4gICAgY29yZXBhY2tQa2dKc29uLmJpbi5jb3JlcGFjayxcbiAgKTtcbn1cblxuZnVuY3Rpb24gZ2V0Q29tbWFuZChcbiAgZGV0ZWN0UmVzdWx0OiBEZXRlY3RSZXN1bHQgfCB1bmRlZmluZWQsXG4gIGFyZ3M6IHN0cmluZ1tdLFxuICBleGVjdXRlPzogYm9vbGVhbixcbikge1xuICBjb25zdCB7IG5hbWUgPSBcIm5wbVwiLCB2ZXJzaW9uIH0gPSBkZXRlY3RSZXN1bHQgPz8ge307XG4gIGNvbnN0IGV4ZWN1dG9yID0gZXhlY3V0ZSA/IGV4ZWN1dG9yTWFwW25hbWVdIDogbmFtZTtcbiAgcmV0dXJuIFtgJHtleGVjdXRvcn0ke3ZlcnNpb24gPyBgQCR7dmVyc2lvbn1gIDogXCJcIn1gLCAuLi5hcmdzXTtcbn1cblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHJ1bihcbiAgZGV0ZWN0UmVzdWx0OiBEZXRlY3RSZXN1bHQgfCB1bmRlZmluZWQsXG4gIGFyZ3M6IHN0cmluZ1tdLFxuICBleGVjdXRlPzogYm9vbGVhbixcbik6IFByb21pc2U8bnVtYmVyPiB7XG4gIGNvbnN0IGNvbW1hbmQgPSBnZXRDb21tYW5kKGRldGVjdFJlc3VsdCwgYXJncywgZXhlY3V0ZSk7XG4gIGNvbnN0IGNwID0gY2hpbGRQcm9jZXNzLnNwYXduKGdldENvcmVwYWNrUGF0aCgpLCBjb21tYW5kLCB7XG4gICAgc3RkaW86IFwiaW5oZXJpdFwiLFxuICAgIGVudjoge1xuICAgICAgQ09SRVBBQ0tfRU5WX0ZJTEU6IFwiMFwiLFxuICAgICAgQ09SRVBBQ0tfTlBNX1JFR0lTVFJZOiByZWdpc3RyeVVybCgpLnJlcGxhY2UoL1xcLyQvLCBcIlwiKSwgLy8gVE9ETzogUmVtb3ZlIHRoaXMgZW52IHdoZW4gaHR0cHM6Ly9naXRodWIuY29tL25vZGVqcy9jb3JlcGFjay9pc3N1ZXMvNTQwIGlzIHJlc29sdmVkLlxuICAgICAgLi4uT2JqZWN0LmZyb21FbnRyaWVzKFxuICAgICAgICBPYmplY3QuZW50cmllcyhwcm9jZXNzLmVudikuZmlsdGVyKChba10pID0+ICFrLnN0YXJ0c1dpdGgoXCJDT1JFUEFDS19cIikpLFxuICAgICAgKSxcbiAgICB9LFxuICB9KTtcblxuICBjb25zdCBsaXN0ZW5lciA9IChzaWduYWw6IE5vZGVKUy5TaWduYWxzKSA9PiAhY3Aua2lsbGVkICYmIGNwLmtpbGwoc2lnbmFsKTtcbiAgcHJvY2Vzcy5vbihcIlNJR0lOVFwiLCBsaXN0ZW5lcik7XG4gIHByb2Nlc3Mub24oXCJTSUdURVJNXCIsIGxpc3RlbmVyKTtcblxuICByZXR1cm4gYXdhaXQgbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgIGNwLm9uKFwiZXJyb3JcIiwgKGVycikgPT4ge1xuICAgICAgcmVqZWN0KGVycik7XG4gICAgfSk7XG4gICAgY3Aub24oXCJjbG9zZVwiLCAoY29kZSwgc2lnbmFsKSA9PiB7XG4gICAgICByZXNvbHZlKFxuICAgICAgICBjb2RlID8/IChzaWduYWwgIT09IG51bGwgPyAxMjggKyBvcy5jb25zdGFudHMuc2lnbmFsc1tzaWduYWxdIDogMSksXG4gICAgICApO1xuICAgIH0pO1xuICB9KTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldE1zZyhcbiAgZGV0ZWN0UmVzdWx0OiBEZXRlY3RSZXN1bHQgfCB1bmRlZmluZWQsXG4gIGFyZ3M6IHN0cmluZ1tdLFxuICBleGVjdXRlPzogYm9vbGVhbixcbikge1xuICBjb25zdCBuYW1lID0gZGV0ZWN0UmVzdWx0Py5uYW1lID8/IFwibnBtXCI7XG4gIGNvbnN0IHZlcnNpb24gPSBkZXRlY3RSZXN1bHQ/LnZlcnNpb24gPz8gXCJ1bmtub3duXCI7XG4gIGNvbnN0IG5hbWVWZXIgPSBgWyR7bmFtZX1AJHt2ZXJzaW9ufV1gO1xuICBjb25zdCBpbmZvID0gZGV0ZWN0UmVzdWx0ID8gXCIoZGV0ZWN0ZWQpXCIgOiBcIihmYWxsYmFjaylcIjtcblxuICBjb25zdCBjb21tYW5kID0gZ2V0Q29tbWFuZChkZXRlY3RSZXN1bHQsIGFyZ3MsIGV4ZWN1dGUpO1xuICBjb21tYW5kWzBdICYmPSBjb21tYW5kWzBdLnJlcGxhY2UoL0AuKiQvLCBcIlwiKTtcbiAgcmV0dXJuIFtcbiAgICBcIvCfk6ZcIixcbiAgICBgJHtjaGFsay5ib2xkKG5hbWVWZXIpfSR7Y2hhbGsuZGltKGluZm8pfWAsXG4gICAgXCLinpxcIixcbiAgICBjaGFsay5ibHVlKGNvbW1hbmQuam9pbihcIiBcIikpLFxuICBdLmpvaW4oXCIgXCIpO1xufVxuIl19