@unts/patch-package
Version:
Fix broken node modules with no fuss
116 lines (109 loc) • 14.3 kB
JavaScript
;
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.openIssueCreationLink = exports.maybePrintIssueCreationPrompt = exports.shouldRecommendIssue = exports.getPackageVCSDetails = void 0;
const open_1 = __importDefault(require("open"));
const picocolors_1 = __importDefault(require("picocolors"));
const querystring_1 = require("querystring");
const path_1 = require("./path");
const repoSpecifier = /^([\w.-]+)\/([\w.-]+)$/;
const githubURL = /github.com(:|\/)([\w.-]+\/[\w.-]+?)(.git|\/.*)?$/;
function parseRepoString(repository) {
if (repository.startsWith("github:")) {
repository = repository.replace(/^github:/, "");
}
const urlMatch = repository.match(githubURL);
if (urlMatch) {
repository = urlMatch[2];
}
const specMatch = repository.match(repoSpecifier);
if (!specMatch) {
return null;
}
const [, org, repo] = specMatch;
return { org, repo, provider: "GitHub" };
}
function getPackageVCSDetails(packageDetails) {
const repository = require((0, path_1.resolve)((0, path_1.join)(packageDetails.path, "package.json")))
.repository;
if (!repository) {
return null;
}
if (typeof repository === "string") {
return parseRepoString(repository);
}
else if (typeof repository === "object" &&
typeof repository.url === "string") {
return parseRepoString(repository.url);
}
}
exports.getPackageVCSDetails = getPackageVCSDetails;
function createIssueUrl({ vcs, packageDetails, packageVersion, diff, }) {
return `https://github.com/${vcs === null || vcs === void 0 ? void 0 : vcs.org}/${vcs === null || vcs === void 0 ? void 0 : vcs.repo}/issues/new?${(0, querystring_1.stringify)({
title: "",
body: `Hi! 👋
Firstly, thanks for your work on this project! 🙂
Today I used [patch-package](https://github.com/ds300/patch-package) to patch \`${packageDetails.name}@${packageVersion}\` for the project I'm working on.
<!-- 🔺️🔺️🔺️ PLEASE REPLACE THIS BLOCK with a description of your problem, and any other relevant context 🔺️🔺️🔺️ -->
Here is the diff that solved my problem:
\`\`\`diff
${diff}
\`\`\`
<em>This issue body was [partially generated by patch-package](https://github.com/ds300/patch-package/issues/296).</em>
`,
})}`;
}
function shouldRecommendIssue(vcsDetails) {
if (!vcsDetails) {
return true;
}
const { repo, org } = vcsDetails;
if (repo === "DefinitelyTyped" && org === "DefinitelyTyped") {
return false;
}
return true;
}
exports.shouldRecommendIssue = shouldRecommendIssue;
function maybePrintIssueCreationPrompt(vcs, packageDetails, packageManager) {
if (vcs) {
console.log(`💡 ${picocolors_1.default.bold(packageDetails.name)} is on ${vcs.provider}! To draft an issue based on your patch run
${packageManager === "yarn" ? "yarn" : "npx"} patch-package ${packageDetails.pathSpecifier} --create-issue
`);
}
}
exports.maybePrintIssueCreationPrompt = maybePrintIssueCreationPrompt;
function openIssueCreationLink({ packageDetails, patchFileContents, packageVersion, patchPath, }) {
const vcs = getPackageVCSDetails(packageDetails);
if (!vcs) {
console.log(`Error: Couldn't find VCS details for ${packageDetails.pathSpecifier}`);
process.exit(1);
}
// trim off trailing newline since we add an extra one in the markdown block
if (patchFileContents.endsWith("\n")) {
patchFileContents = patchFileContents.slice(0, -1);
}
let issueUrl = createIssueUrl({
vcs,
packageDetails,
packageVersion,
diff: patchFileContents,
});
const urlExceedsLimit = patchFileContents.length > 1950;
if (urlExceedsLimit) {
const diffMessage = `<!-- 🔺️🔺️🔺️ PLEASE REPLACE THIS BLOCK with the diff contents of ${patchPath
.split("/")
.pop()}. 🔺️🔺️🔺️ -->`;
console.log(`📋 Copy the contents in [ ${patchPath} ] and paste it in the new issue's diff section.`);
issueUrl = createIssueUrl({
vcs,
packageDetails,
packageVersion,
diff: diffMessage,
});
}
(0, open_1.default)(issueUrl);
}
exports.openIssueCreationLink = openIssueCreationLink;
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY3JlYXRlSXNzdWUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvY3JlYXRlSXNzdWUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7O0FBQUEsZ0RBQXVCO0FBQ3ZCLDREQUErQjtBQUMvQiw2Q0FBdUM7QUFHdkMsaUNBQXNDO0FBRXRDLE1BQU0sYUFBYSxHQUFHLHdCQUF3QixDQUFBO0FBQzlDLE1BQU0sU0FBUyxHQUFHLGtEQUFrRCxDQUFBO0FBV3BFLFNBQVMsZUFBZSxDQUFDLFVBQWtCO0lBQ3pDLElBQUksVUFBVSxDQUFDLFVBQVUsQ0FBQyxTQUFTLENBQUMsRUFBRTtRQUNwQyxVQUFVLEdBQUcsVUFBVSxDQUFDLE9BQU8sQ0FBQyxVQUFVLEVBQUUsRUFBRSxDQUFDLENBQUE7S0FDaEQ7SUFDRCxNQUFNLFFBQVEsR0FBRyxVQUFVLENBQUMsS0FBSyxDQUFDLFNBQVMsQ0FBQyxDQUFBO0lBQzVDLElBQUksUUFBUSxFQUFFO1FBQ1osVUFBVSxHQUFHLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQTtLQUN6QjtJQUVELE1BQU0sU0FBUyxHQUFHLFVBQVUsQ0FBQyxLQUFLLENBQUMsYUFBYSxDQUFDLENBQUE7SUFFakQsSUFBSSxDQUFDLFNBQVMsRUFBRTtRQUNkLE9BQU8sSUFBSSxDQUFBO0tBQ1o7SUFDRCxNQUFNLENBQUMsRUFBRSxHQUFHLEVBQUUsSUFBSSxDQUFDLEdBQUcsU0FBUyxDQUFBO0lBRS9CLE9BQU8sRUFBRSxHQUFHLEVBQUUsSUFBSSxFQUFFLFFBQVEsRUFBRSxRQUFRLEVBQUUsQ0FBQTtBQUMxQyxDQUFDO0FBRUQsU0FBZ0Isb0JBQW9CLENBQUMsY0FBOEI7SUFDakUsTUFBTSxVQUFVLEdBQUcsT0FBTyxDQUFDLElBQUEsY0FBTyxFQUFDLElBQUEsV0FBSSxFQUFDLGNBQWMsQ0FBQyxJQUFJLEVBQUUsY0FBYyxDQUFDLENBQUMsQ0FBQztTQUMzRSxVQUFrRCxDQUFBO0lBRXJELElBQUksQ0FBQyxVQUFVLEVB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Q0FBQTtRQUNELFFBQVEsR0FBRyxjQUFjLENBQUM7WUFDeEIsR0FBRztZQUNILGNBQWM7WUFDZCxjQUFjO1lBQ2QsSUFBSSxFQUFFLFdBQVc7U0FDbEIsQ0FBQyxDQUFBO0tBQ0g7SUFDRCxJQUFBLGNBQUksRUFBQyxRQUFRLENBQUMsQ0FBQTtBQUNoQixDQUFDO0FBakRELHNEQWlEQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBvcGVuIGZyb20gXCJvcGVuXCJcbmltcG9ydCBjb2xvcnMgZnJvbSBcInBpY29jb2xvcnNcIlxuaW1wb3J0IHsgc3RyaW5naWZ5IH0gZnJvbSBcInF1ZXJ5c3RyaW5nXCJcbmltcG9ydCB7IFBhY2thZ2VNYW5hZ2VyIH0gZnJvbSBcIi4vZGV0ZWN0UGFja2FnZU1hbmFnZXJcIlxuaW1wb3J0IHsgUGFja2FnZURldGFpbHMgfSBmcm9tIFwiLi9QYWNrYWdlRGV0YWlsc1wiXG5pbXBvcnQgeyBqb2luLCByZXNvbHZlIH0gZnJvbSBcIi4vcGF0aFwiXG5cbmNvbnN0IHJlcG9TcGVjaWZpZXIgPSAvXihbXFx3Li1dKylcXC8oW1xcdy4tXSspJC9cbmNvbnN0IGdpdGh1YlVSTCA9IC9naXRodWIuY29tKDp8XFwvKShbXFx3Li1dK1xcL1tcXHcuLV0rPykoLmdpdHxcXC8uKik/JC9cblxudHlwZSBWQ1MgPVxuICB8IHtcbiAgICAgIHJlcG86IHN0cmluZ1xuICAgICAgb3JnOiBzdHJpbmdcbiAgICAgIHByb3ZpZGVyOiBcIkdpdEh1YlwiXG4gICAgfVxuICB8IG51bGxcbiAgfCB1bmRlZmluZWRcblxuZnVuY3Rpb24gcGFyc2VSZXBvU3RyaW5nKHJlcG9zaXRvcnk6IHN0cmluZyk6IFZDUyB7XG4gIGlmIChyZXBvc2l0b3J5LnN0YXJ0c1dpdGgoXCJnaXRodWI6XCIpKSB7XG4gICAgcmVwb3NpdG9yeSA9IHJlcG9zaXRvcnkucmVwbGFjZSgvXmdpdGh1YjovLCBcIlwiKVxuICB9XG4gIGNvbnN0IHVybE1hdGNoID0gcmVwb3NpdG9yeS5tYXRjaChnaXRodWJVUkwpXG4gIGlmICh1cmxNYXRjaCkge1xuICAgIHJlcG9zaXRvcnkgPSB1cmxNYXRjaFsyXVxuICB9XG5cbiAgY29uc3Qgc3BlY01hdGNoID0gcmVwb3NpdG9yeS5tYXRjaChyZXBvU3BlY2lmaWVyKVxuXG4gIGlmICghc3BlY01hdGNoKSB7XG4gICAgcmV0dXJuIG51bGxcbiAgfVxuICBjb25zdCBbLCBvcmcsIHJlcG9dID0gc3BlY01hdGNoXG5cbiAgcmV0dXJuIHsgb3JnLCByZXBvLCBwcm92aWRlcjogXCJHaXRIdWJcIiB9XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRQYWNrYWdlVkNTRGV0YWlscyhwYWNrYWdlRGV0YWlsczogUGFja2FnZURldGFpbHMpOiBWQ1Mge1xuICBjb25zdCByZXBvc2l0b3J5ID0gcmVxdWlyZShyZXNvbHZlKGpvaW4ocGFja2FnZURldGFpbHMucGF0aCwgXCJwYWNrYWdlLmpzb25cIikpKVxuICAgIC5yZXBvc2l0b3J5IGFzIHVuZGVmaW5lZCB8IHN0cmluZyB8IHsgdXJsOiBzdHJpbmcgfVxuXG4gIGlmICghcmVwb3NpdG9yeSkge1xuICAgIHJldHVybiBudWxsXG4gIH1cbiAgaWYgKHR5cGVvZiByZXBvc2l0b3J5ID09PSBcInN0cmluZ1wiKSB7XG4gICAgcmV0dXJuIHBhcnNlUmVwb1N0cmluZyhyZXBvc2l0b3J5KVxuICB9IGVsc2UgaWYgKFxuICAgIHR5cGVvZiByZXBvc2l0b3J5ID09PSBcIm9iamVjdFwiICYmXG4gICAgdHlwZW9mIHJlcG9zaXRvcnkudXJsID09PSBcInN0cmluZ1wiXG4gICkge1xuICAgIHJldHVybiBwYXJzZVJlcG9TdHJpbmcocmVwb3NpdG9yeS51cmwpXG4gIH1cbn1cblxuZnVuY3Rpb24gY3JlYXRlSXNzdWVVcmwoe1xuICB2Y3MsXG4gIHBhY2thZ2VEZXRhaWxzLFxuICBwYWNrYWdlVmVyc2lvbixcbiAgZGlmZixcbn06IHtcbiAgdmNzOiBWQ1NcbiAgcGFja2FnZURldGFpbHM6IFBhY2thZ2VEZXRhaWxzXG4gIHBhY2thZ2VWZXJzaW9uOiBzdHJpbmdcbiAgZGlmZjogc3RyaW5nXG59KTogc3RyaW5nIHtcbiAgcmV0dXJuIGBodHRwczovL2dpdGh1Yi5jb20vJHt2Y3M/Lm9yZ30vJHt2Y3M/LnJlcG99L2lzc3Vlcy9uZXc/JHtzdHJpbmdpZnkoe1xuICAgIHRpdGxlOiBcIlwiLFxuICAgIGJvZHk6IGBIaSEg8J+RiyBcbiAgICAgIFxuRmlyc3RseSwgdGhhbmtzIGZvciB5b3VyIHdvcmsgb24gdGhpcyBwcm9qZWN0ISDwn5mCXG5cblRvZGF5IEkgdXNlZCBbcGF0Y2gtcGFja2FnZV0oaHR0cHM6Ly9naXRodWIuY29tL2RzMzAwL3BhdGNoLXBhY2thZ2UpIHRvIHBhdGNoIFxcYCR7cGFja2FnZURldGFpbHMubmFtZX1AJHtwYWNrYWdlVmVyc2lvbn1cXGAgZm9yIHRoZSBwcm9qZWN0IEknbSB3b3JraW5nIG9uLlxuXG48IS0tIPCflLrvuI/wn5S677iP8J+Uuu+4jyBQTEVBU0UgUkVQTEFDRSBUSElTIEJMT0NLIHdpdGggYSBkZXNjcmlwdGlvbiBvZiB5b3VyIHByb2JsZW0sIGFuZCBhbnkgb3RoZXIgcmVsZXZhbnQgY29udGV4dCDwn5S677iP8J+Uuu+4j/CflLrvuI8gLS0+XG5cbkhlcmUgaXMgdGhlIGRpZmYgdGhhdCBzb2x2ZWQgbXkgcHJvYmxlbTpcblxuXFxgXFxgXFxgZGlmZlxuJHtkaWZmfVxuXFxgXFxgXFxgXG5cbjxlbT5UaGlzIGlzc3VlIGJvZHkgd2FzIFtwYXJ0aWFsbHkgZ2VuZXJhdGVkIGJ5IHBhdGNoLXBhY2thZ2VdKGh0dHBzOi8vZ2l0aHViLmNvbS9kczMwMC9wYXRjaC1wYWNrYWdlL2lzc3Vlcy8yOTYpLjwvZW0+XG5gLFxuICB9KX1gXG59XG5cbmV4cG9ydCBmdW5jdGlvbiBzaG91bGRSZWNvbW1lbmRJc3N1ZShcbiAgdmNzRGV0YWlsczogUmV0dXJuVHlwZTx0eXBlb2YgZ2V0UGFja2FnZVZDU0RldGFpbHM+LFxuKSB7XG4gIGlmICghdmNzRGV0YWlscykge1xuICAgIHJldHVybiB0cnVlXG4gIH1cblxuICBjb25zdCB7IHJlcG8sIG9yZyB9ID0gdmNzRGV0YWlsc1xuICBpZiAocmVwbyA9PT0gXCJEZWZpbml0ZWx5VHlwZWRcIiAmJiBvcmcgPT09IFwiRGVmaW5pdGVseVR5cGVkXCIpIHtcbiAgICByZXR1cm4gZmFsc2VcbiAgfVxuICByZXR1cm4gdHJ1ZVxufVxuXG5leHBvcnQgZnVuY3Rpb24gbWF5YmVQcmludElzc3VlQ3JlYXRpb25Qcm9tcHQoXG4gIHZjczogUmV0dXJuVHlwZTx0eXBlb2YgZ2V0UGFja2FnZVZDU0RldGFpbHM+LFxuICBwYWNrYWdlRGV0YWlsczogUGFja2FnZURldGFpbHMsXG4gIHBhY2thZ2VNYW5hZ2VyOiBQYWNrYWdlTWFuYWdlcixcbikge1xuICBpZiAodmNzKSB7XG4gICAgY29uc29sZS5sb2coYPCfkqEgJHtjb2xvcnMuYm9sZChwYWNrYWdlRGV0YWlscy5uYW1lKX0gaXMgb24gJHtcbiAgICAgIHZjcy5wcm92aWRlclxuICAgIH0hIFRvIGRyYWZ0IGFuIGlzc3VlIGJhc2VkIG9uIHlvdXIgcGF0Y2ggcnVuXG5cbiAgICAke3BhY2thZ2VNYW5hZ2VyID09PSBcInlhcm5cIiA/IFwieWFyblwiIDogXCJucHhcIn0gcGF0Y2gtcGFja2FnZSAke1xuICAgICAgcGFja2FnZURldGFpbHMucGF0aFNwZWNpZmllclxuICAgIH0gLS1jcmVhdGUtaXNzdWVcbmApXG4gIH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIG9wZW5Jc3N1ZUNyZWF0aW9uTGluayh7XG4gIHBhY2thZ2VEZXRhaWxzLFxuICBwYXRjaEZpbGVDb250ZW50cyxcbiAgcGFja2FnZVZlcnNpb24sXG4gIHBhdGNoUGF0aCxcbn06IHtcbiAgcGFja2FnZURldGFpbHM6IFBhY2thZ2VEZXRhaWxzXG4gIHBhdGNoRmlsZUNvbnRlbnRzOiBzdHJpbmdcbiAgcGFja2FnZVZlcnNpb246IHN0cmluZ1xuICBwYXRjaFBhdGg6IHN0cmluZ1xufSkge1xuICBjb25zdCB2Y3MgPSBnZXRQYWNrYWdlVkNTRGV0YWlscyhwYWNrYWdlRGV0YWlscylcblxuICBpZiAoIXZjcykge1xuICAgIGNvbnNvbGUubG9nKFxuICAgICAgYEVycm9yOiBDb3VsZG4ndCBmaW5kIFZDUyBkZXRhaWxzIGZvciAke3BhY2thZ2VEZXRhaWxzLnBhdGhTcGVjaWZpZXJ9YCxcbiAgICApXG4gICAgcHJvY2Vzcy5leGl0KDEpXG4gIH1cblxuICAvLyB0cmltIG9mZiB0cmFpbGluZyBuZXdsaW5lIHNpbmNlIHdlIGFkZCBhbiBleHRyYSBvbmUgaW4gdGhlIG1hcmtkb3duIGJsb2NrXG4gIGlmIChwYXRjaEZpbGVDb250ZW50cy5lbmRzV2l0aChcIlxcblwiKSkge1xuICAgIHBhdGNoRmlsZUNvbnRlbnRzID0gcGF0Y2hGaWxlQ29udGVudHMuc2xpY2UoMCwgLTEpXG4gIH1cblxuICBsZXQgaXNzdWVVcmwgPSBjcmVhdGVJc3N1ZVVybCh7XG4gICAgdmNzLFxuICAgIHBhY2thZ2VEZXRhaWxzLFxuICAgIHBhY2thZ2VWZXJzaW9uLFxuICAgIGRpZmY6IHBhdGNoRmlsZUNvbnRlbnRzLFxuICB9KVxuXG4gIGNvbnN0IHVybEV4Y2VlZHNMaW1pdCA9IHBhdGNoRmlsZUNvbnRlbnRzLmxlbmd0aCA+IDE5NTBcblxuICBpZiAodXJsRXhjZWVkc0xpbWl0KSB7XG4gICAgY29uc3QgZGlmZk1lc3NhZ2UgPSBgPCEtLSDwn5S677iP8J+Uuu+4j/CflLrvuI8gUExFQVNFIFJFUExBQ0UgVEhJUyBCTE9DSyB3aXRoIHRoZSBkaWZmIGNvbnRlbnRzIG9mICR7cGF0Y2hQYXRoXG4gICAgICAuc3BsaXQoXCIvXCIpXG4gICAgICAucG9wKCl9LiDwn5S677iP8J+Uuu+4j/CflLrvuI8gLS0+YFxuICAgIGNvbnNvbGUubG9nKFxuICAgICAgYPCfk4sgQ29weSB0aGUgY29udGVudHMgaW4gWyAke3BhdGNoUGF0aH0gXSBhbmQgcGFzdGUgaXQgaW4gdGhlIG5ldyBpc3N1ZSdzIGRpZmYgc2VjdGlvbi5gLFxuICAgIClcbiAgICBpc3N1ZVVybCA9IGNyZWF0ZUlzc3VlVXJsKHtcbiAgICAgIHZjcyxcbiAgICAgIHBhY2thZ2VEZXRhaWxzLFxuICAgICAgcGFja2FnZVZlcnNpb24sXG4gICAgICBkaWZmOiBkaWZmTWVzc2FnZSxcbiAgICB9KVxuICB9XG4gIG9wZW4oaXNzdWVVcmwpXG59XG4iXX0=