PackageDetails.js 14 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127
  1. "use strict";
  2. Object.defineProperty(exports, "__esModule", { value: true });
  3. exports.getPatchDetailsFromCliString = exports.getPackageDetailsFromPatchFilename = exports.parseNameAndVersion = void 0;
  4. const path_1 = require("./path");
  5. function parseNameAndVersion(str) {
  6. const parts = str
  7. .split("+")
  8. .map((s) => s.trim())
  9. .filter(Boolean);
  10. if (parts.length === 0) {
  11. return null;
  12. }
  13. if (parts.length === 1) {
  14. return { packageName: str };
  15. }
  16. const versionIndex = parts.findIndex((part) => part.match(/^\d+\.\d+\.\d+.*$/));
  17. if (versionIndex === -1) {
  18. const [scope, name] = parts;
  19. return { packageName: `${scope}/${name}` };
  20. }
  21. const nameParts = parts.slice(0, versionIndex);
  22. let packageName;
  23. switch (nameParts.length) {
  24. case 0:
  25. return null;
  26. case 1:
  27. packageName = nameParts[0];
  28. break;
  29. case 2:
  30. const [scope, name] = nameParts;
  31. packageName = `${scope}/${name}`;
  32. break;
  33. default:
  34. return null;
  35. }
  36. const version = parts[versionIndex];
  37. const sequenceParts = parts.slice(versionIndex + 1);
  38. if (sequenceParts.length === 0) {
  39. return { packageName, version };
  40. }
  41. // expect sequenceParts[0] to be a number, strip leading 0s
  42. const sequenceNumber = parseInt(sequenceParts[0].replace(/^0+/, ""), 10);
  43. if (isNaN(sequenceNumber)) {
  44. return null;
  45. }
  46. switch (sequenceParts.length) {
  47. case 1: {
  48. return { packageName, version, sequenceNumber };
  49. }
  50. case 2: {
  51. return {
  52. packageName,
  53. version,
  54. sequenceName: sequenceParts[1],
  55. sequenceNumber,
  56. };
  57. }
  58. default: {
  59. return null;
  60. }
  61. }
  62. return null;
  63. }
  64. exports.parseNameAndVersion = parseNameAndVersion;
  65. function getPackageDetailsFromPatchFilename(patchFilename) {
  66. const parts = patchFilename
  67. .replace(/(\.dev)?\.patch$/, "")
  68. .split("++")
  69. .map(parseNameAndVersion)
  70. .filter((x) => x !== null);
  71. if (parts.length === 0) {
  72. return null;
  73. }
  74. const lastPart = parts[parts.length - 1];
  75. if (!lastPart.version) {
  76. return null;
  77. }
  78. return {
  79. name: lastPart.packageName,
  80. version: lastPart.version,
  81. path: path_1.join("node_modules", parts.map(({ packageName: name }) => name).join("/node_modules/")),
  82. patchFilename,
  83. pathSpecifier: parts.map(({ packageName: name }) => name).join("/"),
  84. humanReadablePathSpecifier: parts
  85. .map(({ packageName: name }) => name)
  86. .join(" => "),
  87. isNested: parts.length > 1,
  88. packageNames: parts.map(({ packageName: name }) => name),
  89. isDevOnly: patchFilename.endsWith(".dev.patch"),
  90. sequenceName: lastPart.sequenceName,
  91. sequenceNumber: lastPart.sequenceNumber,
  92. };
  93. }
  94. exports.getPackageDetailsFromPatchFilename = getPackageDetailsFromPatchFilename;
  95. function getPatchDetailsFromCliString(specifier) {
  96. const parts = specifier.split("/");
  97. const packageNames = [];
  98. let scope = null;
  99. for (let i = 0; i < parts.length; i++) {
  100. if (parts[i].startsWith("@")) {
  101. if (scope) {
  102. return null;
  103. }
  104. scope = parts[i];
  105. }
  106. else {
  107. if (scope) {
  108. packageNames.push(`${scope}/${parts[i]}`);
  109. scope = null;
  110. }
  111. else {
  112. packageNames.push(parts[i]);
  113. }
  114. }
  115. }
  116. const path = path_1.join("node_modules", packageNames.join("/node_modules/"));
  117. return {
  118. packageNames,
  119. path,
  120. name: packageNames[packageNames.length - 1],
  121. humanReadablePathSpecifier: packageNames.join(" => "),
  122. isNested: packageNames.length > 1,
  123. pathSpecifier: specifier,
  124. };
  125. }
  126. exports.getPatchDetailsFromCliString = getPatchDetailsFromCliString;
  127. //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiUGFja2FnZURldGFpbHMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvUGFja2FnZURldGFpbHMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBQUEsaUNBQTZCO0FBbUI3QixTQUFnQixtQkFBbUIsQ0FDakMsR0FBVztJQU9YLE1BQU0sS0FBSyxHQUFHLEdBQUc7U0FDZCxLQUFLLENBQUMsR0FBRyxDQUFDO1NBQ1YsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxFQUFFLENBQUM7U0FDcEIsTUFBTSxDQUFDLE9BQU8sQ0FBQyxDQUFBO0lBQ2xCLElBQUksS0FBSyxDQUFDLE1BQU0sS0FBSyxDQUFDLEVBQUU7UUFDdEIsT0FBTyxJQUFJLENBQUE7S0FDWjtJQUNELElBQUksS0FBSyxDQUFDLE1BQU0sS0FBSyxDQUFDLEVBQUU7UUFDdEIsT0FBTyxFQUFFLFdBQVcsRUFBRSxHQUFHLEVBQUUsQ0FBQTtLQUM1QjtJQUNELE1BQU0sWUFBWSxHQUFHLEtBQUssQ0FBQyxTQUFTLENBQUMsQ0FBQyxJQUFJLEVBQUUsRUFBRSxDQUM1QyxJQUFJLENBQUMsS0FBSyxDQUFDLG1CQUFtQixDQUFDLENBQ2hDLENBQUE7SUFDRCxJQUFJLFlBQVksS0FBSyxDQUFDLENBQUMsRUFBRTtRQUN2QixNQUFNLENBQUMsS0FBSyxFQUFFLElBQUksQ0FBQyxHQUFHLEtBQUssQ0FBQTtRQUMzQixPQUFPLEVBQUUsV0FBVyxFQUFFLEdBQUcsS0FBSyxJQUFJLElBQUksRUFBRSxFQUFFLENBQUE7S0FDM0M7SUFDRCxNQUFNLFNBQVMsR0FBRyxLQUFLLENBQUMsS0FBSyxDQUFDLENBQUMsRUFBRSxZQUFZLENBQUMsQ0FBQTtJQUM5QyxJQUFJLFdBQVcsQ0FBQTtJQUNmLFFBQVEsU0FBUyxDQUFDLE1BQU0sRUFBRTtRQUN4QixLQUFLLENBQUM7WUFDSixPQUFPLElBQUksQ0FBQTtRQUNiLEtBQUssQ0FBQztZQUNKLFdB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Z0IsQ0FBQyxDQUFDLENBQUE7SUFFdEUsT0FBTztRQUNMLFlBQVk7UUFDWixJQUFJO1FBQ0osSUFBSSxFQUFFLFlBQVksQ0FBQyxZQUFZLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQztRQUMzQywwQkFBMEIsRUFBRSxZQUFZLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQztRQUNyRCxRQUFRLEVBQUUsWUFBWSxDQUFDLE1BQU0sR0FBRyxDQUFDO1FBQ2pDLGFBQWEsRUFBRSxTQUFTO0tBQ3pCLENBQUE7QUFDSCxDQUFDO0FBbkNELG9FQW1DQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IGpvaW4gfSBmcm9tIFwiLi9wYXRoXCJcblxuZXhwb3J0IGludGVyZmFjZSBQYWNrYWdlRGV0YWlscyB7XG4gIGh1bWFuUmVhZGFibGVQYXRoU3BlY2lmaWVyOiBzdHJpbmdcbiAgcGF0aFNwZWNpZmllcjogc3RyaW5nXG4gIHBhdGg6IHN0cmluZ1xuICBuYW1lOiBzdHJpbmdcbiAgaXNOZXN0ZWQ6IGJvb2xlYW5cbiAgcGFja2FnZU5hbWVzOiBzdHJpbmdbXVxufVxuXG5leHBvcnQgaW50ZXJmYWNlIFBhdGNoZWRQYWNrYWdlRGV0YWlscyBleHRlbmRzIFBhY2thZ2VEZXRhaWxzIHtcbiAgdmVyc2lvbjogc3RyaW5nXG4gIHBhdGNoRmlsZW5hbWU6IHN0cmluZ1xuICBpc0Rldk9ubHk6IGJvb2xlYW5cbiAgc2VxdWVuY2VOYW1lPzogc3RyaW5nXG4gIHNlcXVlbmNlTnVtYmVyPzogbnVtYmVyXG59XG5cbmV4cG9ydCBmdW5jdGlvbiBwYXJzZU5hbWVBbmRWZXJzaW9uKFxuICBzdHI6IHN0cmluZyxcbik6IHtcbiAgcGFja2FnZU5hbWU6IHN0cmluZ1xuICB2ZXJzaW9uPzogc3RyaW5nXG4gIHNlcXVlbmNlTmFtZT86IHN0cmluZ1xuICBzZXF1ZW5jZU51bWJlcj86IG51bWJlclxufSB8IG51bGwge1xuICBjb25zdCBwYXJ0cyA9IHN0clxuICAgIC5zcGxpdChcIitcIilcbiAgICAubWFwKChzKSA9PiBzLnRyaW0oKSlcbiAgICAuZmlsdGVyKEJvb2xlYW4pXG4gIGlmIChwYXJ0cy5sZW5ndGggPT09IDApIHtcbiAgICByZXR1cm4gbnVsbFxuICB9XG4gIGlmIChwYXJ0cy5sZW5ndGggPT09IDEpIHtcbiAgICByZXR1cm4geyBwYWNrYWdlTmFtZTogc3RyIH1cbiAgfVxuICBjb25zdCB2ZXJzaW9uSW5kZXggPSBwYXJ0cy5maW5kSW5kZXgoKHBhcnQpID0+XG4gICAgcGFydC5tYXRjaCgvXlxcZCtcXC5cXGQrXFwuXFxkKy4qJC8pLFxuICApXG4gIGlmICh2ZXJzaW9uSW5kZXggPT09IC0xKSB7XG4gICAgY29uc3QgW3Njb3BlLCBuYW1lXSA9IHBhcnRzXG4gICAgcmV0dXJuIHsgcGFja2FnZU5hbWU6IGAke3Njb3BlfS8ke25hbWV9YCB9XG4gIH1cbiAgY29uc3QgbmFtZVBhcnRzID0gcGFydHMuc2xpY2UoMCwgdmVyc2lvbkluZGV4KVxuICBsZXQgcGFja2FnZU5hbWVcbiAgc3dpdGNoIChuYW1lUGFydHMubGVuZ3RoKSB7XG4gICAgY2FzZSAwOlxuICAgICAgcmV0dXJuIG51bGxcbiAgICBjYXNlIDE6XG4gICAgICBwYWNrYWdlTmFtZSA9IG5hbWVQYXJ0c1swXVxuICAgICAgYnJlYWtcbiAgICBjYXNlIDI6XG4gICAgICBjb25zdCBbc2NvcGUsIG5hbWVdID0gbmFtZVBhcnRzXG4gICAgICBwYWNrYWdlTmFtZSA9IGAke3Njb3BlfS8ke25hbWV9YFxuICAgICAgYnJlYWtcbiAgICBkZWZhdWx0OlxuICAgICAgcmV0dXJuIG51bGxcbiAgfVxuXG4gIGNvbnN0IHZlcnNpb24gPSBwYXJ0c1t2ZXJzaW9uSW5kZXhdXG4gIGNvbnN0IHNlcXVlbmNlUGFydHMgPSBwYXJ0cy5zbGljZSh2ZXJzaW9uSW5kZXggKyAxKVxuICBpZiAoc2VxdWVuY2VQYXJ0cy5sZW5ndGggPT09IDApIHtcbiAgICByZXR1cm4geyBwYWNrYWdlTmFtZSwgdmVyc2lvbiB9XG4gIH1cblxuICAvLyBleHBlY3Qgc2VxdWVuY2VQYXJ0c1swXSB0byBiZSBhIG51bWJlciwgc3RyaXAgbGVhZGluZyAwc1xuICBjb25zdCBzZXF1ZW5jZU51bWJlciA9IHBhcnNlSW50KHNlcXVlbmNlUGFydHNbMF0ucmVwbGFjZSgvXjArLywgXCJcIiksIDEwKVxuICBpZiAoaXNOYU4oc2VxdWVuY2VOdW1iZXIpKSB7XG4gICAgcmV0dXJuIG51bGxcbiAgfVxuICBzd2l0Y2ggKHNlcXVlbmNlUGFydHMubGVuZ3RoKSB7XG4gICAgY2FzZSAxOiB7XG4gICAgICByZXR1cm4geyBwYWNrYWdlTmFtZSwgdmVyc2lvbiwgc2VxdWVuY2VOdW1iZXIgfVxuICAgIH1cbiAgICBjYXNlIDI6IHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIHBhY2thZ2VOYW1lLFxuICAgICAgICB2ZXJzaW9uLFxuICAgICAgICBzZXF1ZW5jZU5hbWU6IHNlcXVlbmNlUGFydHNbMV0sXG4gICAgICAgIHNlcXVlbmNlTnVtYmVyLFxuICAgICAgfVxuICAgIH1cbiAgICBkZWZhdWx0OiB7XG4gICAgICByZXR1cm4gbnVsbFxuICAgIH1cbiAgfVxuICByZXR1cm4gbnVsbFxufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2V0UGFja2FnZURldGFpbHNGcm9tUGF0Y2hGaWxlbmFtZShcbiAgcGF0Y2hGaWxlbmFtZTogc3RyaW5nLFxuKTogUGF0Y2hlZFBhY2thZ2VEZXRhaWxzIHwgbnVsbCB7XG4gIGNvbnN0IHBhcnRzID0gcGF0Y2hGaWxlbmFtZVxuICAgIC5yZXBsYWNlKC8oXFwuZGV2KT9cXC5wYXRjaCQvLCBcIlwiKVxuICAgIC5zcGxpdChcIisrXCIpXG4gICAgLm1hcChwYXJzZU5hbWVBbmRWZXJzaW9uKVxuICAgIC5maWx0ZXIoKHgpOiB4IGlzIE5vbk51bGxhYmxlPHR5cGVvZiB4PiA9PiB4ICE9PSBudWxsKVxuXG4gIGlmIChwYXJ0cy5sZW5ndGggPT09IDApIHtcbiAgICByZXR1cm4gbnVsbFxuICB9XG5cbiAgY29uc3QgbGFzdFBhcnQgPSBwYXJ0c1twYXJ0cy5sZW5ndGggLSAxXVxuXG4gIGlmICghbGFzdFBhcnQudmVyc2lvbikge1xuICAgIHJldHVybiBudWxsXG4gIH1cblxuICByZXR1cm4ge1xuICAgIG5hbWU6IGxhc3RQYXJ0LnBhY2thZ2VOYW1lLFxuICAgIHZlcnNpb246IGxhc3RQYXJ0LnZlcnNpb24sXG4gICAgcGF0aDogam9pbihcbiAgICAgIFwibm9kZV9tb2R1bGVzXCIsXG4gICAgICBwYXJ0cy5tYXAoKHsgcGFja2FnZU5hbWU6IG5hbWUgfSkgPT4gbmFtZSkuam9pbihcIi9ub2RlX21vZHVsZXMvXCIpLFxuICAgICksXG4gICAgcGF0Y2hGaWxlbmFtZSxcbiAgICBwYXRoU3BlY2lmaWVyOiBwYXJ0cy5tYXAoKHsgcGFja2FnZU5hbWU6IG5hbWUgfSkgPT4gbmFtZSkuam9pbihcIi9cIiksXG4gICAgaHVtYW5SZWFkYWJsZVBhdGhTcGVjaWZpZXI6IHBhcnRzXG4gICAgICAubWFwKCh7IHBhY2thZ2VOYW1lOiBuYW1lIH0pID0+IG5hbWUpXG4gICAgICAuam9pbihcIiA9PiBcIiksXG4gICAgaXNOZXN0ZWQ6IHBhcnRzLmxlbmd0aCA+IDEsXG4gICAgcGFja2FnZU5hbWVzOiBwYXJ0cy5tYXAoKHsgcGFja2FnZU5hbWU6IG5hbWUgfSkgPT4gbmFtZSksXG4gICAgaXNEZXZPbmx5OiBwYXRjaEZpbGVuYW1lLmVuZHNXaXRoKFwiLmRldi5wYXRjaFwiKSxcbiAgICBzZXF1ZW5jZU5hbWU6IGxhc3RQYXJ0LnNlcXVlbmNlTmFtZSxcbiAgICBzZXF1ZW5jZU51bWJlcjogbGFzdFBhcnQuc2VxdWVuY2VOdW1iZXIsXG4gIH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldFBhdGNoRGV0YWlsc0Zyb21DbGlTdHJpbmcoXG4gIHNwZWNpZmllcjogc3RyaW5nLFxuKTogUGFja2FnZURldGFpbHMgfCBudWxsIHtcbiAgY29uc3QgcGFydHMgPSBzcGVjaWZpZXIuc3BsaXQoXCIvXCIpXG5cbiAgY29uc3QgcGFja2FnZU5hbWVzID0gW11cblxuICBsZXQgc2NvcGU6IHN0cmluZyB8IG51bGwgPSBudWxsXG5cbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBwYXJ0cy5sZW5ndGg7IGkrKykge1xuICAgIGlmIChwYXJ0c1tpXS5zdGFydHNXaXRoKFwiQFwiKSkge1xuICAgICAgaWYgKHNjb3BlKSB7XG4gICAgICAgIHJldHVybiBudWxsXG4gICAgICB9XG4gICAgICBzY29wZSA9IHBhcnRzW2ldXG4gICAgfSBlbHNlIHtcbiAgICAgIGlmIChzY29wZSkge1xuICAgICAgICBwYWNrYWdlTmFtZXMucHVzaChgJHtzY29wZX0vJHtwYXJ0c1tpXX1gKVxuICAgICAgICBzY29wZSA9IG51bGxcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHBhY2thZ2VOYW1lcy5wdXNoKHBhcnRzW2ldKVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIGNvbnN0IHBhdGggPSBqb2luKFwibm9kZV9tb2R1bGVzXCIsIHBhY2thZ2VOYW1lcy5qb2luKFwiL25vZGVfbW9kdWxlcy9cIikpXG5cbiAgcmV0dXJuIHtcbiAgICBwYWNrYWdlTmFtZXMsXG4gICAgcGF0aCxcbiAgICBuYW1lOiBwYWNrYWdlTmFtZXNbcGFja2FnZU5hbWVzLmxlbmd0aCAtIDFdLFxuICAgIGh1bWFuUmVhZGFibGVQYXRoU3BlY2lmaWVyOiBwYWNrYWdlTmFtZXMuam9pbihcIiA9PiBcIiksXG4gICAgaXNOZXN0ZWQ6IHBhY2thZ2VOYW1lcy5sZW5ndGggPiAxLFxuICAgIHBhdGhTcGVjaWZpZXI6IHNwZWNpZmllcixcbiAgfVxufVxuIl19