@psync/patch-package 1.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +9 -0
- package/LICENSE +19 -0
- package/README.md +422 -0
- package/dist/PackageDetails.js +126 -0
- package/dist/applyPatches.js +414 -0
- package/dist/assertNever.js +7 -0
- package/dist/coerceSemVer.js +11 -0
- package/dist/createIssue.js +115 -0
- package/dist/detectPackageManager.js +98 -0
- package/dist/filterFiles.js +16 -0
- package/dist/getAppRootPath.js +22 -0
- package/dist/getPackageResolution.js +121 -0
- package/dist/getPackageVersion.js +8 -0
- package/dist/hash.js +26 -0
- package/dist/index.js +208 -0
- package/dist/makePatch.js +450 -0
- package/dist/makeRegExp.js +28 -0
- package/dist/packageIsDevDependency.js +14 -0
- package/dist/parseBunLockfile.js +16 -0
- package/dist/patch/apply.js +251 -0
- package/dist/patch/parse.js +335 -0
- package/dist/patch/read.js +48 -0
- package/dist/patch/reverse.js +97 -0
- package/dist/patchFs.js +55 -0
- package/dist/path.js +17 -0
- package/dist/rebase.js +147 -0
- package/dist/resolveRelativeFileDependencies.js +20 -0
- package/dist/spawnSafe.js +28 -0
- package/dist/stateFile.js +71 -0
- package/index.js +3 -0
- package/package.json +102 -0
|
@@ -0,0 +1,98 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.detectPackageManager = void 0;
|
|
7
|
+
const fs_extra_1 = __importDefault(require("fs-extra"));
|
|
8
|
+
const path_1 = require("./path");
|
|
9
|
+
const chalk_1 = __importDefault(require("chalk"));
|
|
10
|
+
const process_1 = __importDefault(require("process"));
|
|
11
|
+
const find_yarn_workspace_root_1 = __importDefault(require("find-yarn-workspace-root"));
|
|
12
|
+
function printNoYarnLockfileError() {
|
|
13
|
+
console.log(`
|
|
14
|
+
${chalk_1.default.red.bold("**ERROR**")} ${chalk_1.default.red(`The --use-yarn option was specified but there is no yarn.lock file`)}
|
|
15
|
+
`);
|
|
16
|
+
}
|
|
17
|
+
function printNoBunLockfileError() {
|
|
18
|
+
console.log(`
|
|
19
|
+
${chalk_1.default.red.bold("**ERROR**")} ${chalk_1.default.red(`The --use-bun option was specified but there is no bun.lockb file`)}
|
|
20
|
+
`);
|
|
21
|
+
}
|
|
22
|
+
function printNoLockfilesError() {
|
|
23
|
+
console.log(`
|
|
24
|
+
${chalk_1.default.red.bold("**ERROR**")} ${chalk_1.default.red(`No package-lock.json, npm-shrinkwrap.json, yarn.lock, or bun.lockb file.
|
|
25
|
+
|
|
26
|
+
You must use either npm@>=5, yarn, npm-shrinkwrap, or bun to manage this project's
|
|
27
|
+
dependencies.`)}
|
|
28
|
+
`);
|
|
29
|
+
}
|
|
30
|
+
function printSelectingDefaultMessage() {
|
|
31
|
+
console.info(`${chalk_1.default.bold("patch-package")}: you have multiple lockfiles, e.g. yarn.lock and package-lock.json
|
|
32
|
+
Defaulting to using ${chalk_1.default.bold("npm")}
|
|
33
|
+
You can override this setting by passing --use-yarn, --use-bun, or
|
|
34
|
+
deleting the conflicting lockfile if you don't need it
|
|
35
|
+
`);
|
|
36
|
+
}
|
|
37
|
+
function printSelectingDefaultYarnMessage() {
|
|
38
|
+
console.info(`${chalk_1.default.bold("patch-package")}: you have both yarn.lock and bun.lockb lockfiles
|
|
39
|
+
Defaulting to using ${chalk_1.default.bold("yarn")}
|
|
40
|
+
You can override this setting by passing --use-bun, or
|
|
41
|
+
deleting yarn.lock if you don't need it
|
|
42
|
+
`);
|
|
43
|
+
}
|
|
44
|
+
function checkForYarnOverride(overridePackageManager) {
|
|
45
|
+
if (overridePackageManager === "yarn") {
|
|
46
|
+
printNoYarnLockfileError();
|
|
47
|
+
process_1.default.exit(1);
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
function checkForBunOverride(overridePackageManager) {
|
|
51
|
+
if (overridePackageManager === "bun") {
|
|
52
|
+
printNoBunLockfileError();
|
|
53
|
+
process_1.default.exit(1);
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
const detectPackageManager = (appRootPath, overridePackageManager) => {
|
|
57
|
+
const packageLockExists = fs_extra_1.default.existsSync((0, path_1.join)(appRootPath, "package-lock.json"));
|
|
58
|
+
const shrinkWrapExists = fs_extra_1.default.existsSync((0, path_1.join)(appRootPath, "npm-shrinkwrap.json"));
|
|
59
|
+
const yarnLockExists = fs_extra_1.default.existsSync((0, path_1.join)((0, find_yarn_workspace_root_1.default)() ?? appRootPath, "yarn.lock"));
|
|
60
|
+
// Bun workspaces seem to work the same as yarn workspaces - https://bun.sh/docs/install/workspaces
|
|
61
|
+
const bunLockbExists = fs_extra_1.default.existsSync((0, path_1.join)((0, find_yarn_workspace_root_1.default)() ?? appRootPath, "bun.lockb"));
|
|
62
|
+
if ([
|
|
63
|
+
packageLockExists || shrinkWrapExists,
|
|
64
|
+
yarnLockExists,
|
|
65
|
+
bunLockbExists,
|
|
66
|
+
].filter(Boolean).length > 1) {
|
|
67
|
+
if (overridePackageManager) {
|
|
68
|
+
return overridePackageManager;
|
|
69
|
+
}
|
|
70
|
+
if (!packageLockExists && !shrinkWrapExists) {
|
|
71
|
+
// The only case where we don't want to default to npm is when we have both yarn and bun lockfiles.
|
|
72
|
+
printSelectingDefaultYarnMessage();
|
|
73
|
+
return "yarn";
|
|
74
|
+
}
|
|
75
|
+
printSelectingDefaultMessage();
|
|
76
|
+
return shrinkWrapExists ? "npm-shrinkwrap" : "npm";
|
|
77
|
+
}
|
|
78
|
+
else if (packageLockExists || shrinkWrapExists) {
|
|
79
|
+
checkForYarnOverride(overridePackageManager);
|
|
80
|
+
checkForBunOverride(overridePackageManager);
|
|
81
|
+
return shrinkWrapExists ? "npm-shrinkwrap" : "npm";
|
|
82
|
+
}
|
|
83
|
+
else if (yarnLockExists) {
|
|
84
|
+
checkForBunOverride(overridePackageManager);
|
|
85
|
+
return "yarn";
|
|
86
|
+
}
|
|
87
|
+
else if (bunLockbExists) {
|
|
88
|
+
checkForYarnOverride(overridePackageManager);
|
|
89
|
+
return "bun";
|
|
90
|
+
}
|
|
91
|
+
else {
|
|
92
|
+
printNoLockfilesError();
|
|
93
|
+
process_1.default.exit(1);
|
|
94
|
+
}
|
|
95
|
+
throw Error();
|
|
96
|
+
};
|
|
97
|
+
exports.detectPackageManager = detectPackageManager;
|
|
98
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGV0ZWN0UGFja2FnZU1hbmFnZXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvZGV0ZWN0UGFja2FnZU1hbmFnZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7O0FBQUEsd0RBQXlCO0FBQ3pCLGlDQUE2QjtBQUM3QixrREFBeUI7QUFDekIsc0RBQTZCO0FBQzdCLHdGQUF3RDtBQUl4RCxTQUFTLHdCQUF3QjtJQUMvQixPQUFPLENBQUMsR0FBRyxDQUFDO0VBQ1osZUFBSyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLElBQUksZUFBSyxDQUFDLEdBQUcsQ0FDdEMsb0VBQW9FLENBQ3JFO0NBQ0YsQ0FBQyxDQUFBO0FBQ0YsQ0FBQztBQUVELFNBQVMsdUJBQXVCO0lBQzlCLE9BQU8sQ0FBQyxHQUFHLENBQUM7RUFDWixlQUFLLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsSUFBSSxlQUFLLENBQUMsR0FBRyxDQUN0QyxtRUFBbUUsQ0FDcEU7Q0FDRixDQUFDLENBQUE7QUFDRixDQUFDO0FBRUQsU0FBUyxxQkFBcUI7SUFDNUIsT0FBTyxDQUFDLEdBQUcsQ0FBQztFQUNaLGVBQUssQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxJQUFJLGVBQUssQ0FBQyxHQUFHLENBQ3RDOzs7Y0FHVSxDQUNYO0NBQ0YsQ0FBQyxDQUFBO0FBQ0YsQ0FBQztBQUVELFNBQVMsNEJBQTRCO0lBQ25DLE9BQU8sQ0FBQyxJQUFJLENBQ1YsR0FBRyxlQUFLLENBQUMsSUFBSSxDQUNYLGVBQWUsQ0FDaEI7c0JBQ2lCLGVBQUssQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDOzs7Q0FHdEMsQ0FDRSxDQUFBO0FBQ0gsQ0FBQztBQUVELFNBQVMsZ0NBQWdDO0lBQ3ZDLE9BQU8sQ0FBQyxJQUFJLENBQ1YsR0FBRyxlQUFLLENBQUMsSUFBSSxDQUNYLGVBQWUsQ0FDaEI7c0JBQ2lCLGVBQUssQ0FBQyxJQUFJ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fSBmcm9tIFwiLi9wYXRoXCJcclxuaW1wb3J0IGNoYWxrIGZyb20gXCJjaGFsa1wiXHJcbmltcG9ydCBwcm9jZXNzIGZyb20gXCJwcm9jZXNzXCJcclxuaW1wb3J0IGZpbmRXb3Jrc3BhY2VSb290IGZyb20gXCJmaW5kLXlhcm4td29ya3NwYWNlLXJvb3RcIlxyXG5cclxuZXhwb3J0IHR5cGUgUGFja2FnZU1hbmFnZXIgPSBcInlhcm5cIiB8IFwibnBtXCIgfCBcIm5wbS1zaHJpbmt3cmFwXCIgfCBcImJ1blwiXHJcblxyXG5mdW5jdGlvbiBwcmludE5vWWFybkxvY2tmaWxlRXJyb3IoKSB7XHJcbiAgY29uc29sZS5sb2coYFxyXG4ke2NoYWxrLnJlZC5ib2xkKFwiKipFUlJPUioqXCIpfSAke2NoYWxrLnJlZChcclxuICAgIGBUaGUgLS11c2UteWFybiBvcHRpb24gd2FzIHNwZWNpZmllZCBidXQgdGhlcmUgaXMgbm8geWFybi5sb2NrIGZpbGVgLFxyXG4gICl9XHJcbmApXHJcbn1cclxuXHJcbmZ1bmN0aW9uIHByaW50Tm9CdW5Mb2NrZmlsZUVycm9yKCkge1xyXG4gIGNvbnNvbGUubG9nKGBcclxuJHtjaGFsay5yZWQuYm9sZChcIioqRVJST1IqKlwiKX0gJHtjaGFsay5yZWQoXHJcbiAgICBgVGhlIC0tdXNlLWJ1biBvcHRpb24gd2FzIHNwZWNpZmllZCBidXQgdGhlcmUgaXMgbm8gYnVuLmxvY2tiIGZpbGVgLFxyXG4gICl9XHJcbmApXHJcbn1cclxuXHJcbmZ1bmN0aW9uIHByaW50Tm9Mb2NrZmlsZXNFcnJvcigpIHtcclxuICBjb25zb2xlLmxvZyhgXHJcbiR7Y2hhbGsucmVkLmJvbGQoXCIqKkVSUk9SKipcIil9ICR7Y2hhbGsucmVkKFxyXG4gICAgYE5vIHBhY2thZ2UtbG9jay5qc29uLCBucG0tc2hyaW5rd3JhcC5qc29uLCB5YXJuLmxvY2ssIG9yIGJ1bi5sb2NrYiBmaWxlLlxyXG5cclxuWW91IG11c3QgdXNlIGVpdGhlciBucG1APj01LCB5YXJuLCBucG0tc2hyaW5rd3JhcCwgb3IgYnVuIHRvIG1hbmFnZSB0aGlzIHByb2plY3Qnc1xyXG5kZXBlbmRlbmNpZXMuYCxcclxuICApfVxyXG5gKVxyXG59XHJcblxyXG5mdW5jdGlvbiBwcmludFNlbGVjdGluZ0RlZmF1bHRNZXNzYWdlKCkge1xyXG4gIGNvbnNvbGUuaW5mbyhcclxuICAgIGAke2NoYWxrLmJvbGQoXHJcbiAgICAgIFwicGF0Y2gtcGFja2FnZVwiLFxyXG4gICAgKX06IHlvdSBoYXZlIG11bHRpcGxlIGxvY2tmaWxlcywgZS5nLiB5YXJuLmxvY2sgYW5kIHBhY2thZ2UtbG9jay5qc29uXHJcbkRlZmF1bHRpbmcgdG8gdXNpbmcgJHtjaGFsay5ib2xkKFwibnBtXCIpfVxyXG5Zb3UgY2FuIG92ZXJyaWRlIHRoaXMgc2V0dGluZyBieSBwYXNzaW5nIC0tdXNlLXlhcm4sIC0tdXNlLWJ1biwgb3JcclxuZGVsZXRpbmcgdGhlIGNvbmZsaWN0aW5nIGxvY2tmaWxlIGlmIHlvdSBkb24ndCBuZWVkIGl0XHJcbmAsXHJcbiAgKVxyXG59XHJcblxyXG5mdW5jdGlvbiBwcmludFNlbGVjdGluZ0RlZmF1bHRZYXJuTWVzc2FnZSgpIHtcclxuICBjb25zb2xlLmluZm8oXHJcbiAgICBgJHtjaGFsay5ib2xkKFxyXG4gICAgICBcInBhdGNoLXBhY2thZ2VcIixcclxuICAgICl9OiB5b3UgaGF2ZSBib3RoIHlhcm4ubG9jayBhbmQgYnVuLmxvY2tiIGxvY2tmaWxlc1xyXG5EZWZhdWx0aW5nIHRvIHVzaW5nICR7Y2hhbGsuYm9sZChcInlhcm5cIil9XHJcbllvdSBjYW4gb3ZlcnJpZGUgdGhpcyBzZXR0aW5nIGJ5IHBhc3NpbmcgLS11c2UtYnVuLCBvclxyXG5kZWxldGluZyB5YXJuLmxvY2sgaWYgeW91IGRvbid0IG5lZWQgaXRcclxuYCxcclxuICApXHJcbn1cclxuXHJcbmZ1bmN0aW9uIGNoZWNrRm9yWWFybk92ZXJyaWRlKG92ZXJyaWRlUGFja2FnZU1hbmFnZXI6IFBhY2thZ2VNYW5hZ2VyIHwgbnVsbCkge1xyXG4gIGlmIChvdmVycmlkZVBhY2thZ2VNYW5hZ2VyID09PSBcInlhcm5cIikge1xyXG4gICAgcHJpbnROb1lhcm5Mb2NrZmlsZUVycm9yKClcclxuICAgIHByb2Nlc3MuZXhpdCgxKVxyXG4gIH1cclxufVxyXG5cclxuZnVuY3Rpb24gY2hlY2tGb3JCdW5PdmVycmlkZShvdmVycmlkZVBhY2thZ2VNYW5hZ2VyOiBQYWNrYWdlTWFuYWdlciB8IG51bGwpIHtcclxuICBpZiAob3ZlcnJpZGVQYWNrYWdlTWFuYWdlciA9PT0gXCJidW5cIikge1xyXG4gICAgcHJpbnROb0J1bkxvY2tmaWxlRXJyb3IoKVxyXG4gICAgcHJvY2Vzcy5leGl0KDEpXHJcbiAgfVxyXG59XHJcblxyXG5leHBvcnQgY29uc3QgZGV0ZWN0UGFja2FnZU1hbmFnZXIgPSAoXHJcbiAgYXBwUm9vdFBhdGg6IHN0cmluZyxcclxuICBvdmVycmlkZVBhY2thZ2VNYW5hZ2VyOiBQYWNrYWdlTWFuYWdlciB8IG51bGwsXHJcbik6IFBhY2thZ2VNYW5hZ2VyID0+IHtcclxuICBjb25zdCBwYWNrYWdlTG9ja0V4aXN0cyA9IGZzLmV4aXN0c1N5bmMoXHJcbiAgICBqb2luKGFwcFJvb3RQYXRoLCBcInBhY2thZ2UtbG9jay5qc29uXCIpLFxyXG4gIClcclxuICBjb25zdCBzaHJpbmtXcmFwRXhpc3RzID0gZnMuZXhpc3RzU3luYyhcclxuICAgIGpvaW4oYXBwUm9vdFBhdGgsIFwibnBtLXNocmlua3dyYXAuanNvblwiKSxcclxuICApXHJcbiAgY29uc3QgeWFybkxvY2tFeGlzdHMgPSBmcy5leGlzdHNTeW5jKFxyXG4gICAgam9pbihmaW5kV29ya3NwYWNlUm9vdCgpID8/IGFwcFJvb3RQYXRoLCBcInlhcm4ubG9ja1wiKSxcclxuICApXHJcbiAgLy8gQnVuIHdvcmtzcGFjZXMgc2VlbSB0byB3b3JrIHRoZSBzYW1lIGFzIHlhcm4gd29ya3NwYWNlcyAtIGh0dHBzOi8vYnVuLnNoL2RvY3MvaW5zdGFsbC93b3Jrc3BhY2VzXHJcbiAgY29uc3QgYnVuTG9ja2JFeGlzdHMgPSBmcy5leGlzdHNTeW5jKFxyXG4gICAgam9pbihmaW5kV29ya3NwYWNlUm9vdCgpID8/IGFwcFJvb3RQYXRoLCBcImJ1bi5sb2NrYlwiKSxcclxuICApXHJcbiAgaWYgKFxyXG4gICAgW1xyXG4gICAgICBwYWNrYWdlTG9ja0V4aXN0cyB8fCBzaHJpbmtXcmFwRXhpc3RzLFxyXG4gICAgICB5YXJuTG9ja0V4aXN0cyxcclxuICAgICAgYnVuTG9ja2JFeGlzdHMsXHJcbiAgICBdLmZpbHRlcihCb29sZWFuKS5sZW5ndGggPiAxXHJcbiAgKSB7XHJcbiAgICBpZiAob3ZlcnJpZGVQYWNrYWdlTWFuYWdlcikge1xyXG4gICAgICByZXR1cm4gb3ZlcnJpZGVQYWNrYWdlTWFuYWdlclxyXG4gICAgfVxyXG4gICAgaWYgKCFwYWNrYWdlTG9ja0V4aXN0cyAmJiAhc2hyaW5rV3JhcEV4aXN0cykge1xyXG4gICAgICAvLyBUaGUgb25seSBjYXNlIHdoZXJlIHdlIGRvbid0IHdhbnQgdG8gZGVmYXVsdCB0byBucG0gaXMgd2hlbiB3ZSBoYXZlIGJvdGggeWFybiBhbmQgYnVuIGxvY2tmaWxlcy5cclxuICAgICAgcHJpbnRTZWxlY3RpbmdEZWZhdWx0WWFybk1lc3NhZ2UoKVxyXG4gICAgICByZXR1cm4gXCJ5YXJuXCJcclxuICAgIH1cclxuICAgIHByaW50U2VsZWN0aW5nRGVmYXVsdE1lc3NhZ2UoKVxyXG4gICAgcmV0dXJuIHNocmlua1dyYXBFeGlzdHMgPyBcIm5wbS1zaHJpbmt3cmFwXCIgOiBcIm5wbVwiXHJcbiAgfSBlbHNlIGlmIChwYWNrYWdlTG9ja0V4aXN0cyB8fCBzaHJpbmtXcmFwRXhpc3RzKSB7XHJcbiAgICBjaGVja0Zvcllhcm5PdmVycmlkZShvdmVycmlkZVBhY2thZ2VNYW5hZ2VyKVxyXG4gICAgY2hlY2tGb3JCdW5PdmVycmlkZShvdmVycmlkZVBhY2thZ2VNYW5hZ2VyKVxyXG4gICAgcmV0dXJuIHNocmlua1dyYXBFeGlzdHMgPyBcIm5wbS1zaHJpbmt3cmFwXCIgOiBcIm5wbVwiXHJcbiAgfSBlbHNlIGlmICh5YXJuTG9ja0V4aXN0cykge1xyXG4gICAgY2hlY2tGb3JCdW5PdmVycmlkZShvdmVycmlkZVBhY2thZ2VNYW5hZ2VyKVxyXG4gICAgcmV0dXJuIFwieWFyblwiXHJcbiAgfSBlbHNlIGlmIChidW5Mb2NrYkV4aXN0cykge1xyXG4gICAgY2hlY2tGb3JZYXJuT3ZlcnJpZGUob3ZlcnJpZGVQYWNrYWdlTWFuYWdlcilcclxuICAgIHJldHVybiBcImJ1blwiXHJcbiAgfSBlbHNlIHtcclxuICAgIHByaW50Tm9Mb2NrZmlsZXNFcnJvcigpXHJcbiAgICBwcm9jZXNzLmV4aXQoMSlcclxuICB9XHJcbiAgdGhyb3cgRXJyb3IoKVxyXG59XHJcbiJdfQ==
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.removeIgnoredFiles = removeIgnoredFiles;
|
|
7
|
+
const path_1 = require("./path");
|
|
8
|
+
const fs_extra_1 = require("fs-extra");
|
|
9
|
+
const klaw_sync_1 = __importDefault(require("klaw-sync"));
|
|
10
|
+
function removeIgnoredFiles(dir, includePaths, excludePaths) {
|
|
11
|
+
(0, klaw_sync_1.default)(dir, { nodir: true })
|
|
12
|
+
.map((item) => item.path.slice(`${dir}/`.length))
|
|
13
|
+
.filter((relativePath) => !relativePath.match(includePaths) || relativePath.match(excludePaths))
|
|
14
|
+
.forEach((relativePath) => (0, fs_extra_1.removeSync)((0, path_1.join)(dir, relativePath)));
|
|
15
|
+
}
|
|
16
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZmlsdGVyRmlsZXMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvZmlsdGVyRmlsZXMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7QUFJQSxnREFZQztBQWhCRCxpQ0FBNkI7QUFDN0IsdUNBQXFDO0FBQ3JDLDBEQUFnQztBQUVoQyxTQUFnQixrQkFBa0IsQ0FDaEMsR0FBVyxFQUNYLFlBQW9CLEVBQ3BCLFlBQW9CO0lBRXBCLElBQUEsbUJBQVEsRUFBQyxHQUFHLEVBQUUsRUFBRSxLQUFLLEVBQUUsSUFBSSxFQUFFLENBQUM7U0FDM0IsR0FBRyxDQUFDLENBQUMsSUFBSSxFQUFFLEVBQUUsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxHQUFHLEdBQUcsR0FBRyxDQUFDLE1BQU0sQ0FBQyxDQUFDO1NBQ2hELE1BQU0sQ0FDTCxDQUFDLFlBQVksRUFBRSxFQUFFLENBQ2YsQ0FBQyxZQUFZLENBQUMsS0FBSyxDQUFDLFlBQVksQ0FBQyxJQUFJLFlBQVksQ0FBQyxLQUFLLENBQUMsWUFBWSxDQUFDLENBQ3hFO1NBQ0EsT0FBTyxDQUFDLENBQUMsWUFBWSxFQUFFLEVBQUUsQ0FBQyxJQUFBLHFCQUFVLEVBQUMsSUFBQSxXQUFJLEVBQUMsR0FBRyxFQUFFLFlBQVksQ0FBQyxDQUFDLENBQUMsQ0FBQTtBQUNuRSxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgam9pbiB9IGZyb20gXCIuL3BhdGhcIlxyXG5pbXBvcnQgeyByZW1vdmVTeW5jIH0gZnJvbSBcImZzLWV4dHJhXCJcclxuaW1wb3J0IGtsYXdTeW5jIGZyb20gXCJrbGF3LXN5bmNcIlxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIHJlbW92ZUlnbm9yZWRGaWxlcyhcclxuICBkaXI6IHN0cmluZyxcclxuICBpbmNsdWRlUGF0aHM6IFJlZ0V4cCxcclxuICBleGNsdWRlUGF0aHM6IFJlZ0V4cCxcclxuKSB7XHJcbiAga2xhd1N5bmMoZGlyLCB7IG5vZGlyOiB0cnVlIH0pXHJcbiAgICAubWFwKChpdGVtKSA9PiBpdGVtLnBhdGguc2xpY2UoYCR7ZGlyfS9gLmxlbmd0aCkpXHJcbiAgICAuZmlsdGVyKFxyXG4gICAgICAocmVsYXRpdmVQYXRoKSA9PlxyXG4gICAgICAgICFyZWxhdGl2ZVBhdGgubWF0Y2goaW5jbHVkZVBhdGhzKSB8fCByZWxhdGl2ZVBhdGgubWF0Y2goZXhjbHVkZVBhdGhzKSxcclxuICAgIClcclxuICAgIC5mb3JFYWNoKChyZWxhdGl2ZVBhdGgpID0+IHJlbW92ZVN5bmMoam9pbihkaXIsIHJlbGF0aXZlUGF0aCkpKVxyXG59XHJcbiJdfQ==
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.getAppRootPath = void 0;
|
|
7
|
+
const path_1 = require("./path");
|
|
8
|
+
const process_1 = __importDefault(require("process"));
|
|
9
|
+
const fs_extra_1 = require("fs-extra");
|
|
10
|
+
const getAppRootPath = () => {
|
|
11
|
+
let cwd = process_1.default.cwd();
|
|
12
|
+
while (!(0, fs_extra_1.existsSync)((0, path_1.join)(cwd, "package.json"))) {
|
|
13
|
+
const up = (0, path_1.resolve)(cwd, "../");
|
|
14
|
+
if (up === cwd) {
|
|
15
|
+
throw new Error("no package.json found for this project");
|
|
16
|
+
}
|
|
17
|
+
cwd = up;
|
|
18
|
+
}
|
|
19
|
+
return cwd;
|
|
20
|
+
};
|
|
21
|
+
exports.getAppRootPath = getAppRootPath;
|
|
22
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ2V0QXBwUm9vdFBhdGguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvZ2V0QXBwUm9vdFBhdGgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7O0FBQUEsaUNBQXNDO0FBQ3RDLHNEQUE2QjtBQUM3Qix1Q0FBcUM7QUFFOUIsTUFBTSxjQUFjLEdBQUcsR0FBVyxFQUFFO0lBQ3pDLElBQUksR0FBRyxHQUFHLGlCQUFPLENBQUMsR0FBRyxFQUFFLENBQUE7SUFDdkIsT0FBTyxDQUFDLElBQUEscUJBQVUsRUFBQyxJQUFBLFdBQUksRUFBQyxHQUFHLEVBQUUsY0FBYyxDQUFDLENBQUMsRUFBRSxDQUFDO1FBQzlDLE1BQU0sRUFBRSxHQUFHLElBQUEsY0FBTyxFQUFDLEdBQUcsRUFBRSxLQUFLLENBQUMsQ0FBQTtRQUM5QixJQUFJLEVBQUUsS0FBSyxHQUFHLEVBQUUsQ0FBQztZQUNmLE1BQU0sSUFBSSxLQUFLLENBQUMsd0NBQXdDLENBQUMsQ0FBQTtRQUMzRCxDQUFDO1FBQ0QsR0FBRyxHQUFHLEVBQUUsQ0FBQTtJQUNWLENBQUM7SUFDRCxPQUFPLEdBQUcsQ0FBQTtBQUNaLENBQUMsQ0FBQTtBQVZZLFFBQUEsY0FBYyxrQkFVMUIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBqb2luLCByZXNvbHZlIH0gZnJvbSBcIi4vcGF0aFwiXHJcbmltcG9ydCBwcm9jZXNzIGZyb20gXCJwcm9jZXNzXCJcclxuaW1wb3J0IHsgZXhpc3RzU3luYyB9IGZyb20gXCJmcy1leHRyYVwiXHJcblxyXG5leHBvcnQgY29uc3QgZ2V0QXBwUm9vdFBhdGggPSAoKTogc3RyaW5nID0+IHtcclxuICBsZXQgY3dkID0gcHJvY2Vzcy5jd2QoKVxyXG4gIHdoaWxlICghZXhpc3RzU3luYyhqb2luKGN3ZCwgXCJwYWNrYWdlLmpzb25cIikpKSB7XHJcbiAgICBjb25zdCB1cCA9IHJlc29sdmUoY3dkLCBcIi4uL1wiKVxyXG4gICAgaWYgKHVwID09PSBjd2QpIHtcclxuICAgICAgdGhyb3cgbmV3IEVycm9yKFwibm8gcGFja2FnZS5qc29uIGZvdW5kIGZvciB0aGlzIHByb2plY3RcIilcclxuICAgIH1cclxuICAgIGN3ZCA9IHVwXHJcbiAgfVxyXG4gIHJldHVybiBjd2RcclxufVxyXG4iXX0=
|
|
@@ -0,0 +1,121 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.getPackageResolution = getPackageResolution;
|
|
7
|
+
const path_1 = require("./path");
|
|
8
|
+
const PackageDetails_1 = require("./PackageDetails");
|
|
9
|
+
const detectPackageManager_1 = require("./detectPackageManager");
|
|
10
|
+
const fs_extra_1 = require("fs-extra");
|
|
11
|
+
const lockfile_1 = require("@yarnpkg/lockfile");
|
|
12
|
+
const yaml_1 = __importDefault(require("yaml"));
|
|
13
|
+
const find_yarn_workspace_root_1 = __importDefault(require("find-yarn-workspace-root"));
|
|
14
|
+
const getPackageVersion_1 = require("./getPackageVersion");
|
|
15
|
+
const coerceSemVer_1 = require("./coerceSemVer");
|
|
16
|
+
const parseBunLockfile_1 = require("./parseBunLockfile");
|
|
17
|
+
function getPackageResolution({ packageDetails, packageManager, appPath, }) {
|
|
18
|
+
if (packageManager === "yarn" || packageManager === "bun") {
|
|
19
|
+
const isBun = packageManager === "bun";
|
|
20
|
+
const lockFileName = isBun ? "bun.lockb" : "yarn.lock";
|
|
21
|
+
let lockFilePath = lockFileName;
|
|
22
|
+
if (!(0, fs_extra_1.existsSync)(lockFilePath)) {
|
|
23
|
+
const workspaceRoot = (0, find_yarn_workspace_root_1.default)();
|
|
24
|
+
if (!workspaceRoot) {
|
|
25
|
+
throw new Error(`Can't find ${lockFileName} file`);
|
|
26
|
+
}
|
|
27
|
+
lockFilePath = (0, path_1.join)(workspaceRoot, lockFilePath);
|
|
28
|
+
}
|
|
29
|
+
if (!(0, fs_extra_1.existsSync)(lockFilePath)) {
|
|
30
|
+
throw new Error(`Can't find ${lockFileName} file`);
|
|
31
|
+
}
|
|
32
|
+
const lockFileString = isBun
|
|
33
|
+
? (0, parseBunLockfile_1.parseBunLockfile)(lockFilePath)
|
|
34
|
+
: (0, fs_extra_1.readFileSync)(lockFilePath).toString();
|
|
35
|
+
let appLockFile;
|
|
36
|
+
if (lockFileString.includes("yarn lockfile v1")) {
|
|
37
|
+
const parsedYarnLockFile = (0, lockfile_1.parse)(lockFileString);
|
|
38
|
+
if (parsedYarnLockFile.type !== "success") {
|
|
39
|
+
throw new Error(`Could not parse yarn v1 lock file ${isBun ? "- was originally a bun.lockb file" : ""}`);
|
|
40
|
+
}
|
|
41
|
+
else {
|
|
42
|
+
appLockFile = parsedYarnLockFile.object;
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
else {
|
|
46
|
+
try {
|
|
47
|
+
appLockFile = yaml_1.default.parse(lockFileString);
|
|
48
|
+
}
|
|
49
|
+
catch (e) {
|
|
50
|
+
console.log(e);
|
|
51
|
+
throw new Error(`Could not parse yarn v2 lock file ${isBun ? "- was originally a bun.lockb file (should not happen)" : ""}`);
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
const installedVersion = (0, getPackageVersion_1.getPackageVersion)((0, path_1.join)((0, path_1.resolve)(appPath, packageDetails.path), "package.json"));
|
|
55
|
+
const entries = Object.entries(appLockFile).filter(([k, v]) => k.startsWith(packageDetails.name + "@") &&
|
|
56
|
+
// @ts-ignore
|
|
57
|
+
(0, coerceSemVer_1.coerceSemVer)(v.version) === (0, coerceSemVer_1.coerceSemVer)(installedVersion));
|
|
58
|
+
const resolutions = entries.map(([_, v]) => {
|
|
59
|
+
// @ts-ignore
|
|
60
|
+
return v.resolved;
|
|
61
|
+
});
|
|
62
|
+
if (resolutions.length === 0) {
|
|
63
|
+
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.`);
|
|
64
|
+
}
|
|
65
|
+
if (new Set(resolutions).size !== 1) {
|
|
66
|
+
console.log(`Ambigious lockfile entries for ${packageDetails.pathSpecifier}. Using version ${installedVersion}`);
|
|
67
|
+
return installedVersion;
|
|
68
|
+
}
|
|
69
|
+
if (resolutions[0]) {
|
|
70
|
+
return resolutions[0];
|
|
71
|
+
}
|
|
72
|
+
const resolution = entries[0][0].slice(packageDetails.name.length + 1);
|
|
73
|
+
// resolve relative file path
|
|
74
|
+
if (resolution.startsWith("file:.")) {
|
|
75
|
+
return `file:${(0, path_1.resolve)(appPath, resolution.slice("file:".length))}`;
|
|
76
|
+
}
|
|
77
|
+
if (resolution.startsWith("npm:")) {
|
|
78
|
+
return resolution.replace("npm:", "");
|
|
79
|
+
}
|
|
80
|
+
return resolution;
|
|
81
|
+
}
|
|
82
|
+
else {
|
|
83
|
+
const lockfile = require((0, path_1.join)(appPath, packageManager === "npm-shrinkwrap"
|
|
84
|
+
? "npm-shrinkwrap.json"
|
|
85
|
+
: "package-lock.json"));
|
|
86
|
+
const lockFileStack = [lockfile];
|
|
87
|
+
for (const name of packageDetails.packageNames.slice(0, -1)) {
|
|
88
|
+
const child = lockFileStack[0].dependencies;
|
|
89
|
+
if (child && name in child) {
|
|
90
|
+
lockFileStack.push(child[name]);
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
lockFileStack.reverse();
|
|
94
|
+
const relevantStackEntry = lockFileStack.find((entry) => {
|
|
95
|
+
if (entry.dependencies) {
|
|
96
|
+
return entry.dependencies && packageDetails.name in entry.dependencies;
|
|
97
|
+
}
|
|
98
|
+
else if (entry.packages) {
|
|
99
|
+
return entry.packages && packageDetails.path in entry.packages;
|
|
100
|
+
}
|
|
101
|
+
throw new Error("Cannot find dependencies or packages in lockfile");
|
|
102
|
+
});
|
|
103
|
+
const pkg = relevantStackEntry.dependencies
|
|
104
|
+
? relevantStackEntry.dependencies[packageDetails.name]
|
|
105
|
+
: relevantStackEntry.packages[packageDetails.path];
|
|
106
|
+
return pkg.resolved || pkg.version || pkg.from;
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
if (require.main === module) {
|
|
110
|
+
const packageDetails = (0, PackageDetails_1.getPatchDetailsFromCliString)(process.argv[2]);
|
|
111
|
+
if (!packageDetails) {
|
|
112
|
+
console.log(`Can't find package ${process.argv[2]}`);
|
|
113
|
+
process.exit(1);
|
|
114
|
+
}
|
|
115
|
+
console.log(getPackageResolution({
|
|
116
|
+
appPath: process.cwd(),
|
|
117
|
+
packageDetails,
|
|
118
|
+
packageManager: (0, detectPackageManager_1.detectPackageManager)(process.cwd(), null),
|
|
119
|
+
}));
|
|
120
|
+
}
|
|
121
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ2V0UGFja2FnZVJlc29sdXRpb24uanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvZ2V0UGFja2FnZVJlc29sdXRpb24udHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7QUFXQSxvREE4SEM7QUF6SUQsaUNBQXNDO0FBQ3RDLHFEQUErRTtBQUMvRSxpRUFBNkU7QUFDN0UsdUNBQW1EO0FBQ25ELGdEQUE4RDtBQUM5RCxnREFBdUI7QUFDdkIsd0ZBQXdEO0FBQ3hELDJEQUF1RDtBQUN2RCxpREFBNkM7QUFDN0MseURBQXFEO0FBRXJELFNBQWdCLG9CQUFvQixDQUFDLEVBQ25DLGNBQWMsRUFDZCxjQUFjLEVBQ2QsT0FBTyxHQUtSO0lBQ0MsSUFBSSxjQUFjLEtBQUssTUFBTSxJQUFJLGNBQWMsS0FBSyxLQUFLLEVBQUUsQ0FBQztRQUMxRCxNQUFNLEtBQUssR0FBRyxjQUFjLEtBQUssS0FBSyxDQUFBO1FBQ3RDLE1BQU0sWUFBWSxHQUFHLEtBQUssQ0FBQyxDQUFDLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQyxXQUFXLENBQUE7UUFDdEQsSUFBSSxZQUFZLEdBQUcsWUFBWSxDQUFBO1FBQy9CLElBQUksQ0FBQyxJQUFBLHFCQUFVLEVBQUMsWUFBWSxDQUFDLEVBQUUsQ0FBQztZQUM5QixNQUFNLGFBQWEsR0FBRyxJQUFBLGtDQUFpQixHQUFFLENBQUE7WUFDekMsSUFBSSxDQUFDLGFBQWEsRUFBRSxDQUFDO2dCQUNuQixNQUFNLElBQUksS0FBSyxDQUFDLGNBQWMsWUFBWSxPQUFPLENBQUMsQ0FBQTtZQUNwRCxDQUFDO1lBQ0QsWUFBWSxHQUFHLElBQUEsV0FBSSxFQUFDLGFBQWEsRUFBRSxZQUFZLENBQUMsQ0FBQTtRQUNsRCxDQUFDO1FBQ0QsSUFBSSxDQUFDLElBQUEscUJBQVUsRUFBQyxZQUFZLENBQUMsRUFBRSxDQUFDO1lBQzlCLE1BQU0sSUFBSSxLQUFLLENBQUMsY0FBYyxZQUFZLE9BQU8sQ0FBQyxDQUFBO1FBQ3BELENB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b0IsRUFBQyxPQUFPLENBQUMsR0FBRyxFQUFFLEVBQUUsSUFBSSxDQUFDO0tBQzFELENBQUMsQ0FDSCxDQUFBO0FBQ0gsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IGpvaW4sIHJlc29sdmUgfSBmcm9tIFwiLi9wYXRoXCJcclxuaW1wb3J0IHsgUGFja2FnZURldGFpbHMsIGdldFBhdGNoRGV0YWlsc0Zyb21DbGlTdHJpbmcgfSBmcm9tIFwiLi9QYWNrYWdlRGV0YWlsc1wiXHJcbmltcG9ydCB7IFBhY2thZ2VNYW5hZ2VyLCBkZXRlY3RQYWNrYWdlTWFuYWdlciB9IGZyb20gXCIuL2RldGVjdFBhY2thZ2VNYW5hZ2VyXCJcclxuaW1wb3J0IHsgcmVhZEZpbGVTeW5jLCBleGlzdHNTeW5jIH0gZnJvbSBcImZzLWV4dHJhXCJcclxuaW1wb3J0IHsgcGFyc2UgYXMgcGFyc2VZYXJuTG9ja0ZpbGUgfSBmcm9tIFwiQHlhcm5wa2cvbG9ja2ZpbGVcIlxyXG5pbXBvcnQgeWFtbCBmcm9tIFwieWFtbFwiXHJcbmltcG9ydCBmaW5kV29ya3NwYWNlUm9vdCBmcm9tIFwiZmluZC15YXJuLXdvcmtzcGFjZS1yb290XCJcclxuaW1wb3J0IHsgZ2V0UGFja2FnZVZlcnNpb24gfSBmcm9tIFwiLi9nZXRQYWNrYWdlVmVyc2lvblwiXHJcbmltcG9ydCB7IGNvZXJjZVNlbVZlciB9IGZyb20gXCIuL2NvZXJjZVNlbVZlclwiXHJcbmltcG9ydCB7IHBhcnNlQnVuTG9ja2ZpbGUgfSBmcm9tIFwiLi9wYXJzZUJ1bkxvY2tmaWxlXCJcclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBnZXRQYWNrYWdlUmVzb2x1dGlvbih7XHJcbiAgcGFja2FnZURldGFpbHMsXHJcbiAgcGFja2FnZU1hbmFnZXIsXHJcbiAgYXBwUGF0aCxcclxufToge1xyXG4gIHBhY2thZ2VEZXRhaWxzOiBQYWNrYWdlRGV0YWlsc1xyXG4gIHBhY2thZ2VNYW5hZ2VyOiBQYWNrYWdlTWFuYWdlclxyXG4gIGFwcFBhdGg6IHN0cmluZ1xyXG59KSB7XHJcbiAgaWYgKHBhY2thZ2VNYW5hZ2VyID09PSBcInlhcm5cIiB8fCBwYWNrYWdlTWFuYWdlciA9PT0gXCJidW5cIikge1xyXG4gICAgY29uc3QgaXNCdW4gPSBwYWNrYWdlTWFuYWdlciA9PT0gXCJidW5cIlxyXG4gICAgY29uc3QgbG9ja0ZpbGVOYW1lID0gaXNCdW4gPyBcImJ1bi5sb2NrYlwiIDogXCJ5YXJuLmxvY2tcIlxyXG4gICAgbGV0IGxvY2tGaWxlUGF0aCA9IGxvY2tGaWxlTmFtZVxyXG4gICAgaWYgKCFleGlzdHNTeW5jKGxvY2tGaWxlUGF0aCkpIHtcclxuICAgICAgY29uc3Qgd29ya3NwYWNlUm9vdCA9IGZpbmRXb3Jrc3BhY2VSb290KClcclxuICAgICAgaWYgKCF3b3Jrc3BhY2VSb290KSB7XHJcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBDYW4ndCBmaW5kICR7bG9ja0ZpbGVOYW1lfSBmaWxlYClcclxuICAgICAgfVxyXG4gICAgICBsb2NrRmlsZVBhdGggPSBqb2luKHdvcmtzcGFjZVJvb3QsIGxvY2tGaWxlUGF0aClcclxuICAgIH1cclxuICAgIGlmICghZXhpc3RzU3luYyhsb2NrRmlsZVBhdGgpKSB7XHJcbiAgICAgIHRocm93IG5ldyBFcnJvcihgQ2FuJ3QgZmluZCAke2xvY2tGaWxlTmFtZX0gZmlsZWApXHJcbiAgICB9XHJcbiAgICBjb25zdCBsb2NrRmlsZVN0cmluZyA9IGlzQnVuXHJcbiAgICAgID8gcGFyc2VCdW5Mb2NrZmlsZShsb2NrRmlsZVBhdGgpXHJcbiAgICAgIDogcmVhZEZpbGVTeW5jKGxvY2tGaWxlUGF0aCkudG9TdHJpbmcoKVxyXG4gICAgbGV0IGFwcExvY2tGaWxlXHJcbiAgICBpZiAobG9ja0ZpbGVTdHJpbmcuaW5jbHVkZXMoXCJ5YXJuIGxvY2tmaWxlIHYxXCIpKSB7XHJcbiAgICAgIGNvbnN0IHBhcnNlZFlhcm5Mb2NrRmlsZSA9IHBhcnNlWWFybkxvY2tGaWxlKGxvY2tGaWxlU3RyaW5nKVxyXG4gICAgICBpZiAocGFyc2VkWWFybkxvY2tGaWxlLnR5cGUgIT09IFwic3VjY2Vzc1wiKSB7XHJcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxyXG4gICAgICAgICAgYENvdWxkIG5vdCBwYXJzZSB5YXJuIHYxIGxvY2sgZmlsZSAke1xyXG4gICAgICAgICAgICBpc0J1biA/IFwiLSB3YXMgb3JpZ2luYWxseSBhIGJ1bi5sb2NrYiBmaWxlXCIgOiBcIlwiXHJcbiAgICAgICAgICB9YCxcclxuICAgICAgICApXHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgYXBwTG9ja0ZpbGUgPSBwYXJzZWRZYXJuTG9ja0ZpbGUub2JqZWN0XHJcbiAgICAgIH1cclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHRyeSB7XHJcbiAgICAgICAgYXBwTG9ja0ZpbGUgPSB5YW1sLnBhcnNlKGxvY2tGaWxlU3RyaW5nKVxyXG4gICAgICB9IGNhdGNoIChlKSB7XHJcbiAgICAgICAgY29uc29sZS5sb2coZSlcclxuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXHJcbiAgICAgICAgICBgQ291bGQgbm90IHBhcnNlIHlhcm4gdjIgbG9jayBmaWxlICR7XHJcbiAgICAgICAgICAgIGlzQnVuID8gXCItIHdhcyBvcmlnaW5hbGx5IGEgYnVuLmxvY2tiIGZpbGUgKHNob3VsZCBub3QgaGFwcGVuKVwiIDogXCJcIlxyXG4gICAgICAgICAgfWAsXHJcbiAgICAgICAgKVxyXG4gICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgY29uc3QgaW5zdGFsbGVkVmVyc2lvbiA9IGdldFBhY2thZ2VWZXJzaW9uKFxyXG4gICAgICBqb2luKHJlc29sdmUoYXBwUGF0aCwgcGFja2FnZURldGFpbHMucGF0aCksIFwicGFja2FnZS5qc29uXCIpLFxyXG4gICAgKVxyXG5cclxuICAgIGNvbnN0IGVudHJpZXMgPSBPYmplY3QuZW50cmllcyhhcHBMb2NrRmlsZSkuZmlsdGVyKFxyXG4gICAgICAoW2ssIHZdKSA9PlxyXG4gICAgICAgIGsuc3RhcnRzV2l0aChwYWNrYWdlRGV0YWlscy5uYW1lICsgXCJAXCIpICYmXHJcbiAgICAgICAgLy8gQHRzLWlnbm9yZVxyXG4gICAgICAgIGNvZXJjZVNlbVZlcih2LnZlcnNpb24pID09PSBjb2VyY2VTZW1WZXIoaW5zdGFsbGVkVmVyc2lvbiksXHJcbiAgICApXHJcblxyXG4gICAgY29uc3QgcmVzb2x1dGlvbnMgPSBlbnRyaWVzLm1hcCgoW18sIHZdKSA9PiB7XHJcbiAgICAgIC8vIEB0cy1pZ25vcmVcclxuICAgICAgcmV0dXJuIHYucmVzb2x2ZWRcclxuICAgIH0pXHJcblxyXG4gICAgaWYgKHJlc29sdXRpb25zLmxlbmd0aCA9PT0gMCkge1xyXG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXHJcbiAgICAgICAgYFxcYCR7cGFja2FnZURldGFpbHMucGF0aFNwZWNpZmllcn1cXGAncyBpbnN0YWxsZWQgdmVyc2lvbiBpcyAke2luc3RhbGxlZFZlcnNpb259IGJ1dCBhIGxvY2tmaWxlIGVudHJ5IGZvciBpdCBjb3VsZG4ndCBiZSBmb3VuZC4gWW91ciBsb2NrZmlsZSBpcyBsaWtlbHkgdG8gYmUgY29ycnVwdCBvciB5b3UgZm9yZ290IHRvIHJlaW5zdGFsbCB5b3VyIHBhY2thZ2VzLmAsXHJcbiAgICAgIClcclxuICAgIH1cclxuXHJcbiAgICBpZiAobmV3IFNldChyZXNvbHV0aW9ucykuc2l6ZSAhPT0gMSkge1xyXG4gICAgICBjb25zb2xlLmxvZyhcclxuICAgICAgICBgQW1iaWdpb3VzIGxvY2tmaWxlIGVudHJpZXMgZm9yICR7cGFja2FnZURldGFpbHMucGF0aFNwZWNpZmllcn0uIFVzaW5nIHZlcnNpb24gJHtpbnN0YWxsZWRWZXJzaW9ufWAsXHJcbiAgICAgIClcclxuICAgICAgcmV0dXJuIGluc3RhbGxlZFZlcnNpb25cclxuICAgIH1cclxuXHJcbiAgICBpZiAocmVzb2x1dGlvbnNbMF0pIHtcclxuICAgICAgcmV0dXJuIHJlc29sdXRpb25zWzBdXHJcbiAgICB9XHJcblxyXG4gICAgY29uc3QgcmVzb2x1dGlvbiA9IGVudHJpZXNbMF1bMF0uc2xpY2UocGFja2FnZURldGFpbHMubmFtZS5sZW5ndGggKyAxKVxyXG5cclxuICAgIC8vIHJlc29sdmUgcmVsYXRpdmUgZmlsZSBwYXRoXHJcbiAgICBpZiAocmVzb2x1dGlvbi5zdGFydHNXaXRoKFwiZmlsZTouXCIpKSB7XHJcbiAgICAgIHJldHVybiBgZmlsZToke3Jlc29sdmUoYXBwUGF0aCwgcmVzb2x1dGlvbi5zbGljZShcImZpbGU6XCIubGVuZ3RoKSl9YFxyXG4gICAgfVxyXG5cclxuICAgIGlmIChyZXNvbHV0aW9uLnN0YXJ0c1dpdGgoXCJucG06XCIpKSB7XHJcbiAgICAgIHJldHVybiByZXNvbHV0aW9uLnJlcGxhY2UoXCJucG06XCIsIFwiXCIpXHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIHJlc29sdXRpb25cclxuICB9IGVsc2Uge1xyXG4gICAgY29uc3QgbG9ja2ZpbGUgPSByZXF1aXJlKFxyXG4gICAgICBqb2luKFxyXG4gICAgICAgIGFwcFBhdGgsXHJcbiAgICAgICAgcGFja2FnZU1hbmFnZXIgPT09IFwibnBtLXNocmlua3dyYXBcIlxyXG4gICAgICAgICAgPyBcIm5wbS1zaHJpbmt3cmFwLmpzb25cIlxyXG4gICAgICAgICAgOiBcInBhY2thZ2UtbG9jay5qc29uXCIsXHJcbiAgICAgICksXHJcbiAgICApXHJcbiAgICBjb25zdCBsb2NrRmlsZVN0YWNrID0gW2xvY2tmaWxlXVxyXG4gICAgZm9yIChjb25zdCBuYW1lIG9mIHBhY2thZ2VEZXRhaWxzLnBhY2thZ2VOYW1lcy5zbGljZSgwLCAtMSkpIHtcclxuICAgICAgY29uc3QgY2hpbGQgPSBsb2NrRmlsZVN0YWNrWzBdLmRlcGVuZGVuY2llc1xyXG4gICAgICBpZiAoY2hpbGQgJiYgbmFtZSBpbiBjaGlsZCkge1xyXG4gICAgICAgIGxvY2tGaWxlU3RhY2sucHVzaChjaGlsZFtuYW1lXSlcclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgbG9ja0ZpbGVTdGFjay5yZXZlcnNlKClcclxuICAgIGNvbnN0IHJlbGV2YW50U3RhY2tFbnRyeSA9IGxvY2tGaWxlU3RhY2suZmluZCgoZW50cnkpID0+IHtcclxuICAgICAgaWYgKGVudHJ5LmRlcGVuZGVuY2llcykge1xyXG4gICAgICAgIHJldHVybiBlbnRyeS5kZXBlbmRlbmNpZXMgJiYgcGFja2FnZURldGFpbHMubmFtZSBpbiBlbnRyeS5kZXBlbmRlbmNpZXNcclxuICAgICAgfSBlbHNlIGlmIChlbnRyeS5wYWNrYWdlcykge1xyXG4gICAgICAgIHJldHVybiBlbnRyeS5wYWNrYWdlcyAmJiBwYWNrYWdlRGV0YWlscy5wYXRoIGluIGVudHJ5LnBhY2thZ2VzXHJcbiAgICAgIH1cclxuICAgICAgdGhyb3cgbmV3IEVycm9yKFwiQ2Fubm90IGZpbmQgZGVwZW5kZW5jaWVzIG9yIHBhY2thZ2VzIGluIGxvY2tmaWxlXCIpXHJcbiAgICB9KVxyXG4gICAgY29uc3QgcGtnID0gcmVsZXZhbnRTdGFja0VudHJ5LmRlcGVuZGVuY2llc1xyXG4gICAgICA/IHJlbGV2YW50U3RhY2tFbnRyeS5kZXBlbmRlbmNpZXNbcGFja2FnZURldGFpbHMubmFtZV1cclxuICAgICAgOiByZWxldmFudFN0YWNrRW50cnkucGFja2FnZXNbcGFja2FnZURldGFpbHMucGF0aF1cclxuICAgIHJldHVybiBwa2cucmVzb2x2ZWQgfHwgcGtnLnZlcnNpb24gfHwgcGtnLmZyb21cclxuICB9XHJcbn1cclxuXHJcbmlmIChyZXF1aXJlLm1haW4gPT09IG1vZHVsZSkge1xyXG4gIGNvbnN0IHBhY2thZ2VEZXRhaWxzID0gZ2V0UGF0Y2hEZXRhaWxzRnJvbUNsaVN0cmluZyhwcm9jZXNzLmFyZ3ZbMl0pXHJcbiAgaWYgKCFwYWNrYWdlRGV0YWlscykge1xyXG4gICAgY29uc29sZS5sb2coYENhbid0IGZpbmQgcGFja2FnZSAke3Byb2Nlc3MuYXJndlsyXX1gKVxyXG4gICAgcHJvY2Vzcy5leGl0KDEpXHJcbiAgfVxyXG4gIGNvbnNvbGUubG9nKFxyXG4gICAgZ2V0UGFja2FnZVJlc29sdXRpb24oe1xyXG4gICAgICBhcHBQYXRoOiBwcm9jZXNzLmN3ZCgpLFxyXG4gICAgICBwYWNrYWdlRGV0YWlscyxcclxuICAgICAgcGFja2FnZU1hbmFnZXI6IGRldGVjdFBhY2thZ2VNYW5hZ2VyKHByb2Nlc3MuY3dkKCksIG51bGwpLFxyXG4gICAgfSksXHJcbiAgKVxyXG59XHJcbiJdfQ==
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.getPackageVersion = getPackageVersion;
|
|
4
|
+
function getPackageVersion(packageJsonPath) {
|
|
5
|
+
// remove build metadata
|
|
6
|
+
return require(packageJsonPath).version.replace(/\+.*$/, "");
|
|
7
|
+
}
|
|
8
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ2V0UGFja2FnZVZlcnNpb24uanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvZ2V0UGFja2FnZVZlcnNpb24udHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7QUFBQSw4Q0FHQztBQUhELFNBQWdCLGlCQUFpQixDQUFDLGVBQXVCO0lBQ3ZELHdCQUF3QjtJQUN4QixPQUFPLE9BQU8sQ0FBQyxlQUFlLENBQUMsQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLE9BQU8sRUFBRSxFQUFFLENBQUMsQ0FBQTtBQUM5RCxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiZXhwb3J0IGZ1bmN0aW9uIGdldFBhY2thZ2VWZXJzaW9uKHBhY2thZ2VKc29uUGF0aDogc3RyaW5nKTogc3RyaW5nIHtcclxuICAvLyByZW1vdmUgYnVpbGQgbWV0YWRhdGFcclxuICByZXR1cm4gcmVxdWlyZShwYWNrYWdlSnNvblBhdGgpLnZlcnNpb24ucmVwbGFjZSgvXFwrLiokLywgXCJcIilcclxufVxyXG4iXX0=
|
package/dist/hash.js
ADDED
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.hashFile = hashFile;
|
|
4
|
+
const crypto_1 = require("crypto");
|
|
5
|
+
const fs_1 = require("fs");
|
|
6
|
+
const bufferSize = 1024;
|
|
7
|
+
const buffer = Buffer.alloc(bufferSize);
|
|
8
|
+
function hashFile(filePath) {
|
|
9
|
+
const sha = (0, crypto_1.createHash)("sha256");
|
|
10
|
+
const fileDescriptor = (0, fs_1.openSync)(filePath, "r");
|
|
11
|
+
const size = (0, fs_1.statSync)(filePath).size;
|
|
12
|
+
let totalBytesRead = 0;
|
|
13
|
+
while (totalBytesRead < size) {
|
|
14
|
+
const bytesRead = (0, fs_1.readSync)(fileDescriptor, buffer, 0, Math.min(size - totalBytesRead, bufferSize), totalBytesRead);
|
|
15
|
+
if (bytesRead < bufferSize) {
|
|
16
|
+
sha.update(buffer.slice(0, bytesRead));
|
|
17
|
+
}
|
|
18
|
+
else {
|
|
19
|
+
sha.update(buffer);
|
|
20
|
+
}
|
|
21
|
+
totalBytesRead += bytesRead;
|
|
22
|
+
}
|
|
23
|
+
(0, fs_1.closeSync)(fileDescriptor);
|
|
24
|
+
return sha.digest("hex");
|
|
25
|
+
}
|
|
26
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaGFzaC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3NyYy9oYXNoLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7O0FBT0EsNEJBc0JDO0FBN0JELG1DQUFtQztBQUNuQywyQkFBNEQ7QUFFNUQsTUFBTSxVQUFVLEdBQUcsSUFBSSxDQUFBO0FBRXZCLE1BQU0sTUFBTSxHQUFHLE1BQU0sQ0FBQyxLQUFLLENBQUMsVUFBVSxDQUFDLENBQUE7QUFFdkMsU0FBZ0IsUUFBUSxDQUFDLFFBQWdCO0lBQ3ZDLE1BQU0sR0FBRyxHQUFHLElBQUEsbUJBQVUsRUFBQyxRQUFRLENBQUMsQ0FBQTtJQUNoQyxNQUFNLGNBQWMsR0FBRyxJQUFBLGFBQVEsRUFBQyxRQUFRLEVBQUUsR0FBRyxDQUFDLENBQUE7SUFDOUMsTUFBTSxJQUFJLEdBQUcsSUFBQSxhQUFRLEVBQUMsUUFBUSxDQUFDLENBQUMsSUFBSSxDQUFBO0lBQ3BDLElBQUksY0FBYyxHQUFHLENBQUMsQ0FBQTtJQUN0QixPQUFPLGNBQWMsR0FBRyxJQUFJLEVBQUUsQ0FBQztRQUM3QixNQUFNLFNBQVMsR0FBRyxJQUFBLGFBQVEsRUFDeEIsY0FBYyxFQUNkLE1BQU0sRUFDTixDQUFDLEVBQ0QsSUFBSSxDQUFDLEdBQUcsQ0FBQyxJQUFJLEdBQUcsY0FBYyxFQUFFLFVBQVUsQ0FBQyxFQUMzQyxjQUFjLENBQ2YsQ0FBQTtRQUNELElBQUksU0FBUyxHQUFHLFVBQVUsRUFBRSxDQUFDO1lBQzNCLEdBQUcsQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDLEVBQUUsU0FBUyxDQUFDLENBQUMsQ0FBQTtRQUN4QyxDQUFDO2FBQU0sQ0FBQztZQUNOLEdBQUcsQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLENBQUE7UUFDcEIsQ0FBQztRQUNELGNBQWMsSUFBSSxTQUFTLENBQUE7SUFDN0IsQ0FBQztJQUNELElBQUEsY0FBUyxFQUFDLGNBQWMsQ0FBQyxDQUFBO0lBQ3pCLE9BQU8sR0FBRyxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQTtBQUMxQixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgY3JlYXRlSGFzaCB9IGZyb20gXCJjcnlwdG9cIlxyXG5pbXBvcnQgeyBvcGVuU3luYywgcmVhZFN5bmMsIGNsb3NlU3luYywgc3RhdFN5bmMgfSBmcm9tIFwiZnNcIlxyXG5cclxuY29uc3QgYnVmZmVyU2l6ZSA9IDEwMjRcclxuXHJcbmNvbnN0IGJ1ZmZlciA9IEJ1ZmZlci5hbGxvYyhidWZmZXJTaXplKVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIGhhc2hGaWxlKGZpbGVQYXRoOiBzdHJpbmcpIHtcclxuICBjb25zdCBzaGEgPSBjcmVhdGVIYXNoKFwic2hhMjU2XCIpXHJcbiAgY29uc3QgZmlsZURlc2NyaXB0b3IgPSBvcGVuU3luYyhmaWxlUGF0aCwgXCJyXCIpXHJcbiAgY29uc3Qgc2l6ZSA9IHN0YXRTeW5jKGZpbGVQYXRoKS5zaXplXHJcbiAgbGV0IHRvdGFsQnl0ZXNSZWFkID0gMFxyXG4gIHdoaWxlICh0b3RhbEJ5dGVzUmVhZCA8IHNpemUpIHtcclxuICAgIGNvbnN0IGJ5dGVzUmVhZCA9IHJlYWRTeW5jKFxyXG4gICAgICBmaWxlRGVzY3JpcHRvcixcclxuICAgICAgYnVmZmVyLFxyXG4gICAgICAwLFxyXG4gICAgICBNYXRoLm1pbihzaXplIC0gdG90YWxCeXRlc1JlYWQsIGJ1ZmZlclNpemUpLFxyXG4gICAgICB0b3RhbEJ5dGVzUmVhZCxcclxuICAgIClcclxuICAgIGlmIChieXRlc1JlYWQgPCBidWZmZXJTaXplKSB7XHJcbiAgICAgIHNoYS51cGRhdGUoYnVmZmVyLnNsaWNlKDAsIGJ5dGVzUmVhZCkpXHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICBzaGEudXBkYXRlKGJ1ZmZlcilcclxuICAgIH1cclxuICAgIHRvdGFsQnl0ZXNSZWFkICs9IGJ5dGVzUmVhZFxyXG4gIH1cclxuICBjbG9zZVN5bmMoZmlsZURlc2NyaXB0b3IpXHJcbiAgcmV0dXJuIHNoYS5kaWdlc3QoXCJoZXhcIilcclxufVxyXG4iXX0=
|
package/dist/index.js
ADDED
|
@@ -0,0 +1,208 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
const chalk_1 = __importDefault(require("chalk"));
|
|
7
|
+
const process_1 = __importDefault(require("process"));
|
|
8
|
+
const minimist_1 = __importDefault(require("minimist"));
|
|
9
|
+
const applyPatches_1 = require("./applyPatches");
|
|
10
|
+
const getAppRootPath_1 = require("./getAppRootPath");
|
|
11
|
+
const makePatch_1 = require("./makePatch");
|
|
12
|
+
const makeRegExp_1 = require("./makeRegExp");
|
|
13
|
+
const detectPackageManager_1 = require("./detectPackageManager");
|
|
14
|
+
const path_1 = require("./path");
|
|
15
|
+
const path_2 = require("path");
|
|
16
|
+
const slash = require("slash");
|
|
17
|
+
const ci_info_1 = require("ci-info");
|
|
18
|
+
const rebase_1 = require("./rebase");
|
|
19
|
+
const appPath = (0, getAppRootPath_1.getAppRootPath)();
|
|
20
|
+
const argv = (0, minimist_1.default)(process_1.default.argv.slice(2), {
|
|
21
|
+
boolean: [
|
|
22
|
+
"use-yarn",
|
|
23
|
+
"use-bun",
|
|
24
|
+
"case-sensitive-path-filtering",
|
|
25
|
+
"reverse",
|
|
26
|
+
"help",
|
|
27
|
+
"version",
|
|
28
|
+
"error-on-fail",
|
|
29
|
+
"error-on-warn",
|
|
30
|
+
"create-issue",
|
|
31
|
+
"partial",
|
|
32
|
+
"",
|
|
33
|
+
],
|
|
34
|
+
string: ["patch-dir", "append", "rebase"],
|
|
35
|
+
});
|
|
36
|
+
const packageNames = argv._;
|
|
37
|
+
console.log(chalk_1.default.bold("patch-package"),
|
|
38
|
+
// tslint:disable-next-line:no-var-requires
|
|
39
|
+
require((0, path_1.join)(__dirname, "../package.json")).version);
|
|
40
|
+
if (argv.version || argv.v) {
|
|
41
|
+
// noop
|
|
42
|
+
}
|
|
43
|
+
else if (argv.help || argv.h) {
|
|
44
|
+
printHelp();
|
|
45
|
+
}
|
|
46
|
+
else {
|
|
47
|
+
const patchDir = slash((0, path_2.normalize)((argv["patch-dir"] || "patches") + path_2.sep));
|
|
48
|
+
if (patchDir.startsWith("/")) {
|
|
49
|
+
throw new Error("--patch-dir must be a relative path");
|
|
50
|
+
}
|
|
51
|
+
if ("rebase" in argv) {
|
|
52
|
+
if (!argv.rebase) {
|
|
53
|
+
console.log(chalk_1.default.red("You must specify a patch file name or number when rebasing patches"));
|
|
54
|
+
process_1.default.exit(1);
|
|
55
|
+
}
|
|
56
|
+
if (packageNames.length !== 1) {
|
|
57
|
+
console.log(chalk_1.default.red("You must specify exactly one package name when rebasing patches"));
|
|
58
|
+
process_1.default.exit(1);
|
|
59
|
+
}
|
|
60
|
+
(0, rebase_1.rebase)({
|
|
61
|
+
appPath,
|
|
62
|
+
packagePathSpecifier: packageNames[0],
|
|
63
|
+
patchDir,
|
|
64
|
+
targetPatch: argv.rebase,
|
|
65
|
+
});
|
|
66
|
+
}
|
|
67
|
+
else if (packageNames.length) {
|
|
68
|
+
const includePaths = (0, makeRegExp_1.makeRegExp)(argv.include, "include", /.*/, argv["case-sensitive-path-filtering"]);
|
|
69
|
+
const excludePaths = (0, makeRegExp_1.makeRegExp)(argv.exclude, "exclude", /^package\.json$/, argv["case-sensitive-path-filtering"]);
|
|
70
|
+
const packageManager = (0, detectPackageManager_1.detectPackageManager)(appPath, argv["use-yarn"] ? "yarn" : argv["use-bun"] ? "bun" : null);
|
|
71
|
+
const createIssue = argv["create-issue"];
|
|
72
|
+
packageNames.forEach((packagePathSpecifier) => {
|
|
73
|
+
(0, makePatch_1.makePatch)({
|
|
74
|
+
packagePathSpecifier,
|
|
75
|
+
appPath,
|
|
76
|
+
packageManager,
|
|
77
|
+
includePaths,
|
|
78
|
+
excludePaths,
|
|
79
|
+
patchDir,
|
|
80
|
+
createIssue,
|
|
81
|
+
mode: "append" in argv
|
|
82
|
+
? { type: "append", name: argv.append || undefined }
|
|
83
|
+
: { type: "overwrite_last" },
|
|
84
|
+
});
|
|
85
|
+
});
|
|
86
|
+
}
|
|
87
|
+
else {
|
|
88
|
+
console.log("Applying patches...");
|
|
89
|
+
const reverse = !!argv["reverse"];
|
|
90
|
+
// don't want to exit(1) on postinstall locally.
|
|
91
|
+
// see https://github.com/ds300/patch-package/issues/86
|
|
92
|
+
const shouldExitWithError = !!argv["error-on-fail"] ||
|
|
93
|
+
(process_1.default.env.NODE_ENV === "production" && ci_info_1.isCI) ||
|
|
94
|
+
(ci_info_1.isCI && !process_1.default.env.PATCH_PACKAGE_INTEGRATION_TEST) ||
|
|
95
|
+
process_1.default.env.NODE_ENV === "test";
|
|
96
|
+
const shouldExitWithWarning = !!argv["error-on-warn"];
|
|
97
|
+
(0, applyPatches_1.applyPatchesForApp)({
|
|
98
|
+
appPath,
|
|
99
|
+
reverse,
|
|
100
|
+
patchDir,
|
|
101
|
+
shouldExitWithError,
|
|
102
|
+
shouldExitWithWarning,
|
|
103
|
+
bestEffort: argv.partial,
|
|
104
|
+
});
|
|
105
|
+
}
|
|
106
|
+
}
|
|
107
|
+
function printHelp() {
|
|
108
|
+
console.log(`
|
|
109
|
+
Usage:
|
|
110
|
+
|
|
111
|
+
1. Patching packages
|
|
112
|
+
====================
|
|
113
|
+
|
|
114
|
+
${chalk_1.default.bold("patch-package")}
|
|
115
|
+
|
|
116
|
+
Without arguments, the ${chalk_1.default.bold("patch-package")} command will attempt to find and apply
|
|
117
|
+
patch files to your project. It looks for files named like
|
|
118
|
+
|
|
119
|
+
./patches/<package-name>+<version>.patch
|
|
120
|
+
|
|
121
|
+
Options:
|
|
122
|
+
|
|
123
|
+
${chalk_1.default.bold("--patch-dir <dirname>")}
|
|
124
|
+
|
|
125
|
+
Specify the name for the directory in which the patch files are located.
|
|
126
|
+
|
|
127
|
+
${chalk_1.default.bold("--error-on-fail")}
|
|
128
|
+
|
|
129
|
+
Forces patch-package to exit with code 1 after failing.
|
|
130
|
+
|
|
131
|
+
When running locally patch-package always exits with 0 by default.
|
|
132
|
+
This happens even after failing to apply patches because otherwise
|
|
133
|
+
yarn.lock and package.json might get out of sync with node_modules,
|
|
134
|
+
which can be very confusing.
|
|
135
|
+
|
|
136
|
+
--error-on-fail is ${chalk_1.default.bold("switched on")} by default on CI.
|
|
137
|
+
|
|
138
|
+
See https://github.com/ds300/patch-package/issues/86 for background.
|
|
139
|
+
|
|
140
|
+
${chalk_1.default.bold("--error-on-warn")}
|
|
141
|
+
|
|
142
|
+
Forces patch-package to exit with code 1 after warning.
|
|
143
|
+
|
|
144
|
+
See https://github.com/ds300/patch-package/issues/314 for background.
|
|
145
|
+
|
|
146
|
+
${chalk_1.default.bold("--reverse")}
|
|
147
|
+
|
|
148
|
+
Un-applies all patches.
|
|
149
|
+
|
|
150
|
+
Note that this will fail if the patched files have changed since being
|
|
151
|
+
patched. In that case, you'll probably need to re-install 'node_modules'.
|
|
152
|
+
|
|
153
|
+
This option was added to help people using CircleCI avoid an issue around caching
|
|
154
|
+
and patch file updates (https://github.com/ds300/patch-package/issues/37),
|
|
155
|
+
but might be useful in other contexts too.
|
|
156
|
+
|
|
157
|
+
|
|
158
|
+
2. Creating patch files
|
|
159
|
+
=======================
|
|
160
|
+
|
|
161
|
+
${chalk_1.default.bold("patch-package")} <package-name>${chalk_1.default.italic("[ <package-name>]")}
|
|
162
|
+
|
|
163
|
+
When given package names as arguments, patch-package will create patch files
|
|
164
|
+
based on any changes you've made to the versions installed by yarn/npm.
|
|
165
|
+
|
|
166
|
+
Options:
|
|
167
|
+
|
|
168
|
+
${chalk_1.default.bold("--create-issue")}
|
|
169
|
+
|
|
170
|
+
For packages whose source is hosted on GitHub this option opens a web
|
|
171
|
+
browser with a draft issue based on your diff.
|
|
172
|
+
|
|
173
|
+
${chalk_1.default.bold("--use-yarn")}
|
|
174
|
+
|
|
175
|
+
By default, patch-package checks whether you use npm, yarn or bun based on
|
|
176
|
+
which lockfile you have. If you have multiple lockfiles, it uses npm by
|
|
177
|
+
default (in cases where npm is not available, it will resort to yarn). Set
|
|
178
|
+
this option to override that default and always use yarn.
|
|
179
|
+
|
|
180
|
+
${chalk_1.default.bold("--use-bun")}
|
|
181
|
+
|
|
182
|
+
Similar to --use-yarn, but for bun. If both --use-yarn and --use-bun are
|
|
183
|
+
specified, --use-yarn takes precedence.
|
|
184
|
+
|
|
185
|
+
${chalk_1.default.bold("--exclude <regexp>")}
|
|
186
|
+
|
|
187
|
+
Ignore paths matching the regexp when creating patch files.
|
|
188
|
+
Paths are relative to the root dir of the package to be patched.
|
|
189
|
+
|
|
190
|
+
Default: 'package\\.json$'
|
|
191
|
+
|
|
192
|
+
${chalk_1.default.bold("--include <regexp>")}
|
|
193
|
+
|
|
194
|
+
Only consider paths matching the regexp when creating patch files.
|
|
195
|
+
Paths are relative to the root dir of the package to be patched.
|
|
196
|
+
|
|
197
|
+
Default '.*'
|
|
198
|
+
|
|
199
|
+
${chalk_1.default.bold("--case-sensitive-path-filtering")}
|
|
200
|
+
|
|
201
|
+
Make regexps used in --include or --exclude filters case-sensitive.
|
|
202
|
+
|
|
203
|
+
${chalk_1.default.bold("--patch-dir")}
|
|
204
|
+
|
|
205
|
+
Specify the name for the directory in which to put the patch files.
|
|
206
|
+
`);
|
|
207
|
+
}
|
|
208
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7QUFBQSxrREFBeUI7QUFDekIsc0RBQTZCO0FBQzdCLHdEQUErQjtBQUUvQixpREFBbUQ7QUFDbkQscURBQWlEO0FBQ2pELDJDQUF1QztBQUN2Qyw2Q0FBeUM7QUFDekMsaUVBQTZEO0FBQzdELGlDQUE2QjtBQUM3QiwrQkFBcUM7QUFDckMsK0JBQStCO0FBQy9CLHFDQUE4QjtBQUM5QixxQ0FBaUM7QUFFakMsTUFBTSxPQUFPLEdBQUcsSUFBQSwrQkFBYyxHQUFFLENBQUE7QUFDaEMsTUFBTSxJQUFJLEdBQUcsSUFBQSxrQkFBUSxFQUFDLGlCQUFPLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsRUFBRTtJQUMzQyxPQUFPLEVBQUU7UUFDUCxVQUFVO1FBQ1YsU0FBUztRQUNULCtCQUErQjtRQUMvQixTQUFTO1FBQ1QsTUFBTTtRQUNOLFNBQVM7UUFDVCxlQUFlO1FBQ2YsZUFBZTtRQUNmLGNBQWM7UUFDZCxTQUFTO1FBQ1QsRUFBRTtLQUNIO0lBQ0QsTUFBTSxFQUFFLENBQUMsV0FBVyxFQUFFLFFBQVEsRUFBRSxRQUFRLENBQUM7Q0FDMUMsQ0FBQyxDQUFBO0FBQ0YsTUFBTSxZQUFZLEdBQUcsSUFBSSxDQUFDLENBQUMsQ0FBQTtBQUUzQixPQUFPLENBQUMsR0FBRyxDQUNULGVBQUssQ0FBQyxJQUFJLENBQUMsZUFBZSxDQUFDO0FBQzNCLDJDQUEyQztBQUMzQyxPQUFPLENBQUMsSUFBQSxXQUFJLEVBQUMsU0FBUyxFQUFFLGlCQUFpQixDQUFDLENBQUMsQ0FBQyxPQUFPLENBQ3BELENBQUE7QUFFRCxJQUFJLElBQUksQ0FBQyxPQUFPLElBQUksSUFBSSxDQUFDLENBQUMsRUFBRSxDQUFDO0lBQzNCLE9BQU87QUFDVCxDQUFDO0tBQU0sSUFBSSxJQUFJLENBQUMsSUFBSSxJQUFJLElBQUksQ0FB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VyxDQUFDOzs7OztNQUt2QixlQUFLLENBQUMsSUFBSSxDQUFDLG9CQUFvQixDQUFDOzs7Ozs7O01BT2hDLGVBQUssQ0FBQyxJQUFJLENBQUMsb0JBQW9CLENBQUM7Ozs7Ozs7TUFPaEMsZUFBSyxDQUFDLElBQUksQ0FBQyxpQ0FBaUMsQ0FBQzs7OztNQUk3QyxlQUFLLENBQUMsSUFBSSxDQUFDLGFBQWEsQ0FBQzs7O0NBRzlCLENBQUMsQ0FBQTtBQUNGLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgY2hhbGsgZnJvbSBcImNoYWxrXCJcclxuaW1wb3J0IHByb2Nlc3MgZnJvbSBcInByb2Nlc3NcIlxyXG5pbXBvcnQgbWluaW1pc3QgZnJvbSBcIm1pbmltaXN0XCJcclxuXHJcbmltcG9ydCB7IGFwcGx5UGF0Y2hlc0ZvckFwcCB9IGZyb20gXCIuL2FwcGx5UGF0Y2hlc1wiXHJcbmltcG9ydCB7IGdldEFwcFJvb3RQYXRoIH0gZnJvbSBcIi4vZ2V0QXBwUm9vdFBhdGhcIlxyXG5pbXBvcnQgeyBtYWtlUGF0Y2ggfSBmcm9tIFwiLi9tYWtlUGF0Y2hcIlxyXG5pbXBvcnQgeyBtYWtlUmVnRXhwIH0gZnJvbSBcIi4vbWFrZVJlZ0V4cFwiXHJcbmltcG9ydCB7IGRldGVjdFBhY2thZ2VNYW5hZ2VyIH0gZnJvbSBcIi4vZGV0ZWN0UGFja2FnZU1hbmFnZXJcIlxyXG5pbXBvcnQgeyBqb2luIH0gZnJvbSBcIi4vcGF0aFwiXHJcbmltcG9ydCB7IG5vcm1hbGl6ZSwgc2VwIH0gZnJvbSBcInBhdGhcIlxyXG5pbXBvcnQgc2xhc2ggPSByZXF1aXJlKFwic2xhc2hcIilcclxuaW1wb3J0IHsgaXNDSSB9IGZyb20gXCJjaS1pbmZvXCJcclxuaW1wb3J0IHsgcmViYXNlIH0gZnJvbSBcIi4vcmViYXNlXCJcclxuXHJcbmNvbnN0IGFwcFBhdGggPSBnZXRBcHBSb290UGF0aCgpXHJcbmNvbnN0IGFyZ3YgPSBtaW5pbWlzdChwcm9jZXNzLmFyZ3Yuc2xpY2UoMiksIHtcclxuICBib29sZWFuOiBbXHJcbiAgICBcInVzZS15YXJuXCIsXHJcbiAgICBcInVzZS1idW5cIixcclxuICAgIFwiY2FzZS1zZW5zaXRpdmUtcGF0aC1maWx0ZXJpbmdcIixcclxuICAgIFwicmV2ZXJzZVwiLFxyXG4gICAgXCJoZWxwXCIsXHJcbiAgICBcInZlcnNpb25cIixcclxuICAgIFwiZXJyb3Itb24tZmFpbFwiLFxyXG4gICAgXCJlcnJvci1vbi13YXJuXCIsXHJcbiAgICBcImNyZWF0ZS1pc3N1ZVwiLFxyXG4gICAgXCJwYXJ0aWFsXCIsXHJcbiAgICBcIlwiLFxyXG4gIF0sXHJcbiAgc3RyaW5nOiBbXCJwYXRjaC1kaXJcIiwgXCJhcHBlbmRcIiwgXCJyZWJhc2VcIl0sXHJcbn0pXHJcbmNvbnN0IHBhY2thZ2VOYW1lcyA9IGFyZ3YuX1xyXG5cclxuY29uc29sZS5sb2coXHJcbiAgY2hhbGsuYm9sZChcInBhdGNoLXBhY2thZ2VcIiksXHJcbiAgLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOm5vLXZhci1yZXF1aXJlc1xyXG4gIHJlcXVpcmUoam9pbihfX2Rpcm5hbWUsIFwiLi4vcGFja2FnZS5qc29uXCIpKS52ZXJzaW9uLFxyXG4pXHJcblxyXG5pZiAoYXJndi52ZXJzaW9uIHx8IGFyZ3Yudikge1xyXG4gIC8vIG5vb3BcclxufSBlbHNlIGlmIChhcmd2LmhlbHAgfHwgYXJndi5oKSB7XHJcbiAgcHJpbnRIZWxwKClcclxufSBlbHNlIHtcclxuICBjb25zdCBwYXRjaERpciA9IHNsYXNoKG5vcm1hbGl6ZSgoYXJndltcInBhdGNoLWRpclwiXSB8fCBcInBhdGNoZXNcIikgKyBzZXApKVxyXG4gIGlmIChwYXRjaERpci5zdGFydHNXaXRoKFwiL1wiKSkge1xyXG4gICAgdGhyb3cgbmV3IEVycm9yKFwiLS1wYXRjaC1kaXIgbXVzdCBiZSBhIHJlbGF0aXZlIHBhdGhcIilcclxuICB9XHJcbiAgaWYgKFwicmViYXNlXCIgaW4gYXJndikge1xyXG4gICAgaWYgKCFhcmd2LnJlYmFzZSkge1xyXG4gICAgICBjb25zb2xlLmxvZyhcclxuICAgICAgICBjaGFsay5yZWQoXHJcbiAgICAgICAgICBcIllvdSBtdXN0IHNwZWNpZnkgYSBwYXRjaCBmaWxlIG5hbWUgb3IgbnVtYmVyIHdoZW4gcmViYXNpbmcgcGF0Y2hlc1wiLFxyXG4gICAgICAgICksXHJcbiAgICAgIClcclxuICAgICAgcHJvY2Vzcy5leGl0KDEpXHJcbiAgICB9XHJcbiAgICBpZiAocGFja2FnZU5hbWVzLmxlbmd0aCAhPT0gMSkge1xyXG4gICAgICBjb25zb2xlLmxvZyhcclxuICAgICAgICBjaGFsay5yZWQoXHJcbiAgICAgICAgICBcIllvdSBtdXN0IHNwZWNpZnkgZXhhY3RseSBvbmUgcGFja2FnZSBuYW1lIHdoZW4gcmViYXNpbmcgcGF0Y2hlc1wiLFxyXG4gICAgICAgICksXHJcbiAgICAgIClcclxuICAgICAgcHJvY2Vzcy5leGl0KDEpXHJcbiAgICB9XHJcbiAgICByZWJhc2Uoe1xyXG4gICAgICBhcHBQYXRoLFxyXG4gICAgICBwYWNrYWdlUGF0aFNwZWNpZmllcjogcGFja2FnZU5hbWVzWzBdLFxyXG4gICAgICBwYXRjaERpcixcclxuICAgICAgdGFyZ2V0UGF0Y2g6IGFyZ3YucmViYXNlLFxyXG4gICAgfSlcclxuICB9IGVsc2UgaWYgKHBhY2thZ2VOYW1lcy5sZW5ndGgpIHtcclxuICAgIGNvbnN0IGluY2x1ZGVQYXRocyA9IG1ha2VSZWdFeHAoXHJcbiAgICAgIGFyZ3YuaW5jbHVkZSxcclxuICAgICAgXCJpbmNsdWRlXCIsXHJcbiAgICAgIC8uKi8sXHJcbiAgICAgIGFyZ3ZbXCJjYXNlLXNlbnNpdGl2ZS1wYXRoLWZpbHRlcmluZ1wiXSxcclxuICAgIClcclxuICAgIGNvbnN0IGV4Y2x1ZGVQYXRocyA9IG1ha2VSZWdFeHAoXHJcbiAgICAgIGFyZ3YuZXhjbHVkZSxcclxuICAgICAgXCJleGNsdWRlXCIsXHJcbiAgICAgIC9ecGFja2FnZVxcLmpzb24kLyxcclxuICAgICAgYXJndltcImNhc2Utc2Vuc2l0aXZlLXBhdGgtZmlsdGVyaW5nXCJdLFxyXG4gICAgKVxyXG4gICAgY29uc3QgcGFja2FnZU1hbmFnZXIgPSBkZXRlY3RQYWNrYWdlTWFuYWdlcihcclxuICAgICAgYXBwUGF0aCxcclxuICAgICAgYXJndltcInVzZS15YXJuXCJdID8gXCJ5YXJuXCIgOiBhcmd2W1widXNlLWJ1blwiXSA/IFwiYnVuXCIgOiBudWxsLFxyXG4gICAgKVxyXG4gICAgY29uc3QgY3JlYXRlSXNzdWUgPSBhcmd2W1wiY3JlYXRlLWlzc3VlXCJdXHJcbiAgICBwYWNrYWdlTmFtZXMuZm9yRWFjaCgocGFja2FnZVBhdGhTcGVjaWZpZXI6IHN0cmluZykgPT4ge1xyXG4gICAgICBtYWtlUGF0Y2goe1xyXG4gICAgICAgIHBhY2thZ2VQYXRoU3BlY2lmaWVyLFxyXG4gICAgICAgIGFwcFBhdGgsXHJcbiAgICAgICAgcGFja2FnZU1hbmFnZXIsXHJcbiAgICAgICAgaW5jbHVkZVBhdGhzLFxyXG4gICAgICAgIGV4Y2x1ZGVQYXRocyxcclxuICAgICAgICBwYXRjaERpcixcclxuICAgICAgICBjcmVhdGVJc3N1ZSxcclxuICAgICAgICBtb2RlOlxyXG4gICAgICAgICAgXCJhcHBlbmRcIiBpbiBhcmd2XHJcbiAgICAgICAgICAgID8geyB0eXBlOiBcImFwcGVuZFwiLCBuYW1lOiBhcmd2LmFwcGVuZCB8fCB1bmRlZmluZWQgfVxyXG4gICAgICAgICAgICA6IHsgdHlwZTogXCJvdmVyd3JpdGVfbGFzdFwiIH0sXHJcbiAgICAgIH0pXHJcbiAgICB9KVxyXG4gIH0gZWxzZSB7XHJcbiAgICBjb25zb2xlLmxvZyhcIkFwcGx5aW5nIHBhdGNoZXMuLi5cIilcclxuICAgIGNvbnN0IHJldmVyc2UgPSAhIWFyZ3ZbXCJyZXZlcnNlXCJdXHJcbiAgICAvLyBkb24ndCB3YW50IHRvIGV4aXQoMSkgb24gcG9zdGluc3RhbGwgbG9jYWxseS5cclxuICAgIC8vIHNlZSBodHRwczovL2dpdGh1Yi5jb20vZHMzMDAvcGF0Y2gtcGFja2FnZS9pc3N1ZXMvODZcclxuICAgIGNvbnN0IHNob3VsZEV4aXRXaXRoRXJyb3IgPVxyXG4gICAgICAhIWFyZ3ZbXCJlcnJvci1vbi1mYWlsXCJdIHx8XHJcbiAgICAgIChwcm9jZXNzLmVudi5OT0RFX0VOViA9PT0gXCJwcm9kdWN0aW9uXCIgJiYgaXNDSSkgfHxcclxuICAgICAgKGlzQ0kgJiYgIXByb2Nlc3MuZW52LlBBVENIX1BBQ0tBR0VfSU5URUdSQVRJT05fVEVTVCkgfHxcclxuICAgICAgcHJvY2Vzcy5lbnYuTk9ERV9FTlYgPT09IFwidGVzdFwiXHJcblxyXG4gICAgY29uc3Qgc2hvdWxkRXhpdFdpdGhXYXJuaW5nID0gISFhcmd2W1wiZXJyb3Itb24td2FyblwiXVxyXG5cclxuICAgIGFwcGx5UGF0Y2hlc0ZvckFwcCh7XHJcbiAgICAgIGFwcFBhdGgsXHJcbiAgICAgIHJldmVyc2UsXHJcbiAgICAgIHBhdGNoRGlyLFxyXG4gICAgICBzaG91bGRFeGl0V2l0aEVycm9yLFxyXG4gICAgICBzaG91bGRFeGl0V2l0aFdhcm5pbmcsXHJcbiAgICAgIGJlc3RFZmZvcnQ6IGFyZ3YucGFydGlhbCxcclxuICAgIH0pXHJcbiAgfVxyXG59XHJcblxyXG5mdW5jdGlvbiBwcmludEhlbHAoKSB7XHJcbiAgY29uc29sZS5sb2coYFxyXG5Vc2FnZTpcclxuXHJcbiAgMS4gUGF0Y2hpbmcgcGFja2FnZXNcclxuICA9PT09PT09PT09PT09PT09PT09PVxyXG5cclxuICAgICR7Y2hhbGsuYm9sZChcInBhdGNoLXBhY2thZ2VcIil9XHJcblxyXG4gIFdpdGhvdXQgYXJndW1lbnRzLCB0aGUgJHtjaGFsay5ib2xkKFxyXG4gICAgXCJwYXRjaC1wYWNrYWdlXCIsXHJcbiAgKX0gY29tbWFuZCB3aWxsIGF0dGVtcHQgdG8gZmluZCBhbmQgYXBwbHlcclxuICBwYXRjaCBmaWxlcyB0byB5b3VyIHByb2plY3QuIEl0IGxvb2tzIGZvciBmaWxlcyBuYW1lZCBsaWtlXHJcblxyXG4gICAgIC4vcGF0Y2hlcy88cGFja2FnZS1uYW1lPis8dmVyc2lvbj4ucGF0Y2hcclxuXHJcbiAgT3B0aW9uczpcclxuXHJcbiAgICAke2NoYWxrLmJvbGQoXCItLXBhdGNoLWRpciA8ZGlybmFtZT5cIil9XHJcblxyXG4gICAgICBTcGVjaWZ5IHRoZSBuYW1lIGZvciB0aGUgZGlyZWN0b3J5IGluIHdoaWNoIHRoZSBwYXRjaCBmaWxlcyBhcmUgbG9jYXRlZC5cclxuXHJcbiAgICAke2NoYWxrLmJvbGQoXCItLWVycm9yLW9uLWZhaWxcIil9XHJcblxyXG4gICAgICBGb3JjZXMgcGF0Y2gtcGFja2FnZSB0byBleGl0IHdpdGggY29kZSAxIGFmdGVyIGZhaWxpbmcuXHJcblxyXG4gICAgICBXaGVuIHJ1bm5pbmcgbG9jYWxseSBwYXRjaC1wYWNrYWdlIGFsd2F5cyBleGl0cyB3aXRoIDAgYnkgZGVmYXVsdC5cclxuICAgICAgVGhpcyBoYXBwZW5zIGV2ZW4gYWZ0ZXIgZmFpbGluZyB0byBhcHBseSBwYXRjaGVzIGJlY2F1c2Ugb3RoZXJ3aXNlXHJcbiAgICAgIHlhcm4ubG9jayBhbmQgcGFja2FnZS5qc29uIG1pZ2h0IGdldCBvdXQgb2Ygc3luYyB3aXRoIG5vZGVfbW9kdWxlcyxcclxuICAgICAgd2hpY2ggY2FuIGJlIHZlcnkgY29uZnVzaW5nLlxyXG5cclxuICAgICAgLS1lcnJvci1vbi1mYWlsIGlzICR7Y2hhbGsuYm9sZChcInN3aXRjaGVkIG9uXCIpfSBieSBkZWZhdWx0IG9uIENJLlxyXG5cclxuICAgICAgU2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9kczMwMC9wYXRjaC1wYWNrYWdlL2lzc3Vlcy84NiBmb3IgYmFja2dyb3VuZC5cclxuXHJcbiAgICAke2NoYWxrLmJvbGQoXCItLWVycm9yLW9uLXdhcm5cIil9XHJcblxyXG4gICAgICBGb3JjZXMgcGF0Y2gtcGFja2FnZSB0byBleGl0IHdpdGggY29kZSAxIGFmdGVyIHdhcm5pbmcuXHJcblxyXG4gICAgICBTZWUgaHR0cHM6Ly9naXRodWIuY29tL2RzMzAwL3BhdGNoLXBhY2thZ2UvaXNzdWVzLzMxNCBmb3IgYmFja2dyb3VuZC5cclxuXHJcbiAgICAke2NoYWxrLmJvbGQoXCItLXJldmVyc2VcIil9XHJcblxyXG4gICAgICBVbi1hcHBsaWVzIGFsbCBwYXRjaGVzLlxyXG5cclxuICAgICAgTm90ZSB0aGF0IHRoaXMgd2lsbCBmYWlsIGlmIHRoZSBwYXRjaGVkIGZpbGVzIGhhdmUgY2hhbmdlZCBzaW5jZSBiZWluZ1xyXG4gICAgICBwYXRjaGVkLiBJbiB0aGF0IGNhc2UsIHlvdSdsbCBwcm9iYWJseSBuZWVkIHRvIHJlLWluc3RhbGwgJ25vZGVfbW9kdWxlcycuXHJcblxyXG4gICAgICBUaGlzIG9wdGlvbiB3YXMgYWRkZWQgdG8gaGVscCBwZW9wbGUgdXNpbmcgQ2lyY2xlQ0kgYXZvaWQgYW4gaXNzdWUgYXJvdW5kIGNhY2hpbmdcclxuICAgICAgYW5kIHBhdGNoIGZpbGUgdXBkYXRlcyAoaHR0cHM6Ly9naXRodWIuY29tL2RzMzAwL3BhdGNoLXBhY2thZ2UvaXNzdWVzLzM3KSxcclxuICAgICAgYnV0IG1pZ2h0IGJlIHVzZWZ1bCBpbiBvdGhlciBjb250ZXh0cyB0b28uXHJcblxyXG5cclxuICAyLiBDcmVhdGluZyBwYXRjaCBmaWxlc1xyXG4gID09PT09PT09PT09PT09PT09PT09PT09XHJcblxyXG4gICAgJHtjaGFsay5ib2xkKFwicGF0Y2gtcGFja2FnZVwiKX0gPHBhY2thZ2UtbmFtZT4ke2NoYWxrLml0YWxpYyhcclxuICAgICAgXCJbIDxwYWNrYWdlLW5hbWU+XVwiLFxyXG4gICAgKX1cclxuXHJcbiAgV2hlbiBnaXZlbiBwYWNrYWdlIG5hbWVzIGFzIGFyZ3VtZW50cywgcGF0Y2gtcGFja2FnZSB3aWxsIGNyZWF0ZSBwYXRjaCBmaWxlc1xyXG4gIGJhc2VkIG9uIGFueSBjaGFuZ2VzIHlvdSd2ZSBtYWRlIHRvIHRoZSB2ZXJzaW9ucyBpbnN0YWxsZWQgYnkgeWFybi9ucG0uXHJcblxyXG4gIE9wdGlvbnM6XHJcblxyXG4gICAgJHtjaGFsay5ib2xkKFwiLS1jcmVhdGUtaXNzdWVcIil9XHJcblxyXG4gICAgICAgRm9yIHBhY2thZ2VzIHdob3NlIHNvdXJjZSBpcyBob3N0ZWQgb24gR2l0SHViIHRoaXMgb3B0aW9uIG9wZW5zIGEgd2ViXHJcbiAgICAgICBicm93c2VyIHdpdGggYSBkcmFmdCBpc3N1ZSBiYXNlZCBvbiB5b3VyIGRpZmYuXHJcblxyXG4gICAgJHtjaGFsay5ib2xkKFwiLS11c2UteWFyblwiKX1cclxuXHJcbiAgICAgICAgQnkgZGVmYXVsdCwgcGF0Y2gtcGFja2FnZSBjaGVja3Mgd2hldGhlciB5b3UgdXNlIG5wbSwgeWFybiBvciBidW4gYmFzZWQgb25cclxuICAgICAgICB3aGljaCBsb2NrZmlsZSB5b3UgaGF2ZS4gSWYgeW91IGhhdmUgbXVsdGlwbGUgbG9ja2ZpbGVzLCBpdCB1c2VzIG5wbSBieVxyXG4gICAgICAgIGRlZmF1bHQgKGluIGNhc2VzIHdoZXJlIG5wbSBpcyBub3QgYXZhaWxhYmxlLCBpdCB3aWxsIHJlc29ydCB0byB5YXJuKS4gU2V0XHJcbiAgICAgICAgdGhpcyBvcHRpb24gdG8gb3ZlcnJpZGUgdGhhdCBkZWZhdWx0IGFuZCBhbHdheXMgdXNlIHlhcm4uXHJcblxyXG4gICAgJHtjaGFsay5ib2xkKFwiLS11c2UtYnVuXCIpfVxyXG5cclxuICAgICAgICBTaW1pbGFyIHRvIC0tdXNlLXlhcm4sIGJ1dCBmb3IgYnVuLiBJZiBib3RoIC0tdXNlLXlhcm4gYW5kIC0tdXNlLWJ1biBhcmVcclxuICAgICAgICBzcGVjaWZpZWQsIC0tdXNlLXlhcm4gdGFrZXMgcHJlY2VkZW5jZS5cclxuXHJcbiAgICAke2NoYWxrLmJvbGQoXCItLWV4Y2x1ZGUgPHJlZ2V4cD5cIil9XHJcblxyXG4gICAgICAgIElnbm9yZSBwYXRocyBtYXRjaGluZyB0aGUgcmVnZXhwIHdoZW4gY3JlYXRpbmcgcGF0Y2ggZmlsZXMuXHJcbiAgICAgICAgUGF0aHMgYXJlIHJlbGF0aXZlIHRvIHRoZSByb290IGRpciBvZiB0aGUgcGFja2FnZSB0byBiZSBwYXRjaGVkLlxyXG5cclxuICAgICAgICBEZWZhdWx0OiAncGFja2FnZVxcXFwuanNvbiQnXHJcblxyXG4gICAgJHtjaGFsay5ib2xkKFwiLS1pbmNsdWRlIDxyZWdleHA+XCIpfVxyXG5cclxuICAgICAgICBPbmx5IGNvbnNpZGVyIHBhdGhzIG1hdGNoaW5nIHRoZSByZWdleHAgd2hlbiBjcmVhdGluZyBwYXRjaCBmaWxlcy5cclxuICAgICAgICBQYXRocyBhcmUgcmVsYXRpdmUgdG8gdGhlIHJvb3QgZGlyIG9mIHRoZSBwYWNrYWdlIHRvIGJlIHBhdGNoZWQuXHJcblxyXG4gICAgICAgIERlZmF1bHQgJy4qJ1xyXG5cclxuICAgICR7Y2hhbGsuYm9sZChcIi0tY2FzZS1zZW5zaXRpdmUtcGF0aC1maWx0ZXJpbmdcIil9XHJcblxyXG4gICAgICAgIE1ha2UgcmVnZXhwcyB1c2VkIGluIC0taW5jbHVkZSBvciAtLWV4Y2x1ZGUgZmlsdGVycyBjYXNlLXNlbnNpdGl2ZS5cclxuXHJcbiAgICAke2NoYWxrLmJvbGQoXCItLXBhdGNoLWRpclwiKX1cclxuXHJcbiAgICAgICAgU3BlY2lmeSB0aGUgbmFtZSBmb3IgdGhlIGRpcmVjdG9yeSBpbiB3aGljaCB0byBwdXQgdGhlIHBhdGNoIGZpbGVzLlxyXG5gKVxyXG59XHJcbiJdfQ==
|