pnpm-dedup 2.1.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.
Files changed (198) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +218 -0
  3. package/dist/applyClusterFixes.js +252 -0
  4. package/dist/applyClusterFixes.js.map +1 -0
  5. package/dist/applyClusterFixes.test.js +474 -0
  6. package/dist/applyClusterFixes.test.js.map +1 -0
  7. package/dist/bin/pnpm-dedupe.js +35 -0
  8. package/dist/bin/pnpm-dedupe.js.map +1 -0
  9. package/dist/bin/pnpm-why-duplicate.js +23 -0
  10. package/dist/bin/pnpm-why-duplicate.js.map +1 -0
  11. package/dist/bin/pnpm-why-duplicate.test.js +57 -0
  12. package/dist/bin/pnpm-why-duplicate.test.js.map +1 -0
  13. package/dist/dedupe.js +86 -0
  14. package/dist/dedupe.js.map +1 -0
  15. package/dist/dedupeCheckConsistency.test.js +149 -0
  16. package/dist/dedupeCheckConsistency.test.js.map +1 -0
  17. package/dist/dedupeEndToEnd.test.js +121 -0
  18. package/dist/dedupeEndToEnd.test.js.map +1 -0
  19. package/dist/dedupePeers.test.js +105 -0
  20. package/dist/dedupePeers.test.js.map +1 -0
  21. package/dist/definitions/applyClusterFixes.d.ts +24 -0
  22. package/dist/definitions/applyClusterFixes.d.ts.map +1 -0
  23. package/dist/definitions/applyClusterFixes.test.d.ts +2 -0
  24. package/dist/definitions/applyClusterFixes.test.d.ts.map +1 -0
  25. package/dist/definitions/bin/pnpm-dedupe.d.ts +3 -0
  26. package/dist/definitions/bin/pnpm-dedupe.d.ts.map +1 -0
  27. package/dist/definitions/bin/pnpm-why-duplicate.d.ts +3 -0
  28. package/dist/definitions/bin/pnpm-why-duplicate.d.ts.map +1 -0
  29. package/dist/definitions/bin/pnpm-why-duplicate.test.d.ts +2 -0
  30. package/dist/definitions/bin/pnpm-why-duplicate.test.d.ts.map +1 -0
  31. package/dist/definitions/dedupe.d.ts +15 -0
  32. package/dist/definitions/dedupe.d.ts.map +1 -0
  33. package/dist/definitions/dedupeCheckConsistency.test.d.ts +2 -0
  34. package/dist/definitions/dedupeCheckConsistency.test.d.ts.map +1 -0
  35. package/dist/definitions/dedupeEndToEnd.test.d.ts +2 -0
  36. package/dist/definitions/dedupeEndToEnd.test.d.ts.map +1 -0
  37. package/dist/definitions/dedupePeers.test.d.ts +2 -0
  38. package/dist/definitions/dedupePeers.test.d.ts.map +1 -0
  39. package/dist/definitions/displayMany.d.ts +16 -0
  40. package/dist/definitions/displayMany.d.ts.map +1 -0
  41. package/dist/definitions/displayMany.test.d.ts +2 -0
  42. package/dist/definitions/displayMany.test.d.ts.map +1 -0
  43. package/dist/definitions/helpers/buildIdentifiedFixesMap.test.d.ts +2 -0
  44. package/dist/definitions/helpers/buildIdentifiedFixesMap.test.d.ts.map +1 -0
  45. package/dist/definitions/helpers/buildPnpmPackagesMap.d.ts +13 -0
  46. package/dist/definitions/helpers/buildPnpmPackagesMap.d.ts.map +1 -0
  47. package/dist/definitions/helpers/buildPnpmPackagesMap.test.d.ts +2 -0
  48. package/dist/definitions/helpers/buildPnpmPackagesMap.test.d.ts.map +1 -0
  49. package/dist/definitions/helpers/collectDependentRanges.d.ts +22 -0
  50. package/dist/definitions/helpers/collectDependentRanges.d.ts.map +1 -0
  51. package/dist/definitions/helpers/collectDependentRanges.test.d.ts +2 -0
  52. package/dist/definitions/helpers/collectDependentRanges.test.d.ts.map +1 -0
  53. package/dist/definitions/helpers/collectPnpmDependents.d.ts +8 -0
  54. package/dist/definitions/helpers/collectPnpmDependents.d.ts.map +1 -0
  55. package/dist/definitions/helpers/collectPnpmDependents.test.d.ts +2 -0
  56. package/dist/definitions/helpers/collectPnpmDependents.test.d.ts.map +1 -0
  57. package/dist/definitions/helpers/duplicateSnapshot.d.ts +3 -0
  58. package/dist/definitions/helpers/duplicateSnapshot.d.ts.map +1 -0
  59. package/dist/definitions/helpers/parsePnpmLockPackages.d.ts +44 -0
  60. package/dist/definitions/helpers/parsePnpmLockPackages.d.ts.map +1 -0
  61. package/dist/definitions/helpers/parsePnpmLockPackages.test.d.ts +2 -0
  62. package/dist/definitions/helpers/parsePnpmLockPackages.test.d.ts.map +1 -0
  63. package/dist/definitions/helpers/pnpmProtocol.d.ts +2 -0
  64. package/dist/definitions/helpers/pnpmProtocol.d.ts.map +1 -0
  65. package/dist/definitions/helpers/pnpmVersion.d.ts +11 -0
  66. package/dist/definitions/helpers/pnpmVersion.d.ts.map +1 -0
  67. package/dist/definitions/helpers/pnpmWorkspaceYaml.d.ts +23 -0
  68. package/dist/definitions/helpers/pnpmWorkspaceYaml.d.ts.map +1 -0
  69. package/dist/definitions/helpers/pnpmWorkspaceYaml.test.d.ts +2 -0
  70. package/dist/definitions/helpers/pnpmWorkspaceYaml.test.d.ts.map +1 -0
  71. package/dist/definitions/helpers/projectDir.d.ts +3 -0
  72. package/dist/definitions/helpers/projectDir.d.ts.map +1 -0
  73. package/dist/definitions/helpers/readInstalledManifest.d.ts +32 -0
  74. package/dist/definitions/helpers/readInstalledManifest.d.ts.map +1 -0
  75. package/dist/definitions/helpers/readInstalledManifest.test.d.ts +2 -0
  76. package/dist/definitions/helpers/readInstalledManifest.test.d.ts.map +1 -0
  77. package/dist/definitions/helpers/runPnpm.d.ts +11 -0
  78. package/dist/definitions/helpers/runPnpm.d.ts.map +1 -0
  79. package/dist/definitions/helpers/tempProjects.d.ts +8 -0
  80. package/dist/definitions/helpers/tempProjects.d.ts.map +1 -0
  81. package/dist/definitions/helpers/toLockstepGraph.d.ts +12 -0
  82. package/dist/definitions/helpers/toLockstepGraph.d.ts.map +1 -0
  83. package/dist/definitions/helpers/toLockstepGraph.test.d.ts +2 -0
  84. package/dist/definitions/helpers/toLockstepGraph.test.d.ts.map +1 -0
  85. package/dist/definitions/helpers/versionsSnapshot.d.ts +3 -0
  86. package/dist/definitions/helpers/versionsSnapshot.d.ts.map +1 -0
  87. package/dist/definitions/identifyClusterFixes.d.ts +7 -0
  88. package/dist/definitions/identifyClusterFixes.d.ts.map +1 -0
  89. package/dist/definitions/identifyClusterFixes.test.d.ts +2 -0
  90. package/dist/definitions/identifyClusterFixes.test.d.ts.map +1 -0
  91. package/dist/definitions/identifyResolutionFixes.test.d.ts +2 -0
  92. package/dist/definitions/identifyResolutionFixes.test.d.ts.map +1 -0
  93. package/dist/definitions/index.d.ts +25 -0
  94. package/dist/definitions/index.d.ts.map +1 -0
  95. package/dist/definitions/pnpmLockTypes.d.ts +42 -0
  96. package/dist/definitions/pnpmLockTypes.d.ts.map +1 -0
  97. package/dist/definitions/readPnpmLock.d.ts +3 -0
  98. package/dist/definitions/readPnpmLock.d.ts.map +1 -0
  99. package/dist/displayMany.js +56 -0
  100. package/dist/displayMany.js.map +1 -0
  101. package/dist/displayMany.test.js +146 -0
  102. package/dist/displayMany.test.js.map +1 -0
  103. package/dist/helpers/buildIdentifiedFixesMap.test.js +27 -0
  104. package/dist/helpers/buildIdentifiedFixesMap.test.js.map +1 -0
  105. package/dist/helpers/buildPnpmPackagesMap.js +23 -0
  106. package/dist/helpers/buildPnpmPackagesMap.js.map +1 -0
  107. package/dist/helpers/buildPnpmPackagesMap.test.js +68 -0
  108. package/dist/helpers/buildPnpmPackagesMap.test.js.map +1 -0
  109. package/dist/helpers/collectDependentRanges.js +118 -0
  110. package/dist/helpers/collectDependentRanges.js.map +1 -0
  111. package/dist/helpers/collectDependentRanges.test.js +211 -0
  112. package/dist/helpers/collectDependentRanges.test.js.map +1 -0
  113. package/dist/helpers/collectPnpmDependents.js +55 -0
  114. package/dist/helpers/collectPnpmDependents.js.map +1 -0
  115. package/dist/helpers/collectPnpmDependents.test.js +78 -0
  116. package/dist/helpers/collectPnpmDependents.test.js.map +1 -0
  117. package/dist/helpers/duplicateSnapshot.js +5 -0
  118. package/dist/helpers/duplicateSnapshot.js.map +1 -0
  119. package/dist/helpers/parsePnpmLockPackages.js +62 -0
  120. package/dist/helpers/parsePnpmLockPackages.js.map +1 -0
  121. package/dist/helpers/parsePnpmLockPackages.test.js +62 -0
  122. package/dist/helpers/parsePnpmLockPackages.test.js.map +1 -0
  123. package/dist/helpers/pnpmProtocol.js +2 -0
  124. package/dist/helpers/pnpmProtocol.js.map +1 -0
  125. package/dist/helpers/pnpmVersion.js +23 -0
  126. package/dist/helpers/pnpmVersion.js.map +1 -0
  127. package/dist/helpers/pnpmWorkspaceYaml.js +48 -0
  128. package/dist/helpers/pnpmWorkspaceYaml.js.map +1 -0
  129. package/dist/helpers/pnpmWorkspaceYaml.test.js +91 -0
  130. package/dist/helpers/pnpmWorkspaceYaml.test.js.map +1 -0
  131. package/dist/helpers/projectDir.js +10 -0
  132. package/dist/helpers/projectDir.js.map +1 -0
  133. package/dist/helpers/readInstalledManifest.js +139 -0
  134. package/dist/helpers/readInstalledManifest.js.map +1 -0
  135. package/dist/helpers/readInstalledManifest.test.js +83 -0
  136. package/dist/helpers/readInstalledManifest.test.js.map +1 -0
  137. package/dist/helpers/runPnpm.js +16 -0
  138. package/dist/helpers/runPnpm.js.map +1 -0
  139. package/dist/helpers/tempProjects.js +85 -0
  140. package/dist/helpers/tempProjects.js.map +1 -0
  141. package/dist/helpers/toLockstepGraph.js +34 -0
  142. package/dist/helpers/toLockstepGraph.js.map +1 -0
  143. package/dist/helpers/toLockstepGraph.test.js +81 -0
  144. package/dist/helpers/toLockstepGraph.test.js.map +1 -0
  145. package/dist/helpers/versionsSnapshot.js +5 -0
  146. package/dist/helpers/versionsSnapshot.js.map +1 -0
  147. package/dist/identifyClusterFixes.js +53 -0
  148. package/dist/identifyClusterFixes.js.map +1 -0
  149. package/dist/identifyClusterFixes.test.js +307 -0
  150. package/dist/identifyClusterFixes.test.js.map +1 -0
  151. package/dist/identifyResolutionFixes.test.js +49 -0
  152. package/dist/identifyResolutionFixes.test.js.map +1 -0
  153. package/dist/index.js +86 -0
  154. package/dist/index.js.map +1 -0
  155. package/dist/pnpmLockTypes.js +7 -0
  156. package/dist/pnpmLockTypes.js.map +1 -0
  157. package/dist/readPnpmLock.js +6 -0
  158. package/dist/readPnpmLock.js.map +1 -0
  159. package/package.json +71 -0
  160. package/src/applyClusterFixes.test.ts +560 -0
  161. package/src/applyClusterFixes.ts +466 -0
  162. package/src/bin/pnpm-dedupe.ts +44 -0
  163. package/src/bin/pnpm-why-duplicate.test.ts +79 -0
  164. package/src/bin/pnpm-why-duplicate.ts +34 -0
  165. package/src/dedupe.ts +124 -0
  166. package/src/dedupeCheckConsistency.test.ts +218 -0
  167. package/src/dedupeEndToEnd.test.ts +168 -0
  168. package/src/dedupePeers.test.ts +175 -0
  169. package/src/displayMany.test.ts +208 -0
  170. package/src/displayMany.ts +104 -0
  171. package/src/helpers/buildIdentifiedFixesMap.test.ts +33 -0
  172. package/src/helpers/buildPnpmPackagesMap.test.ts +119 -0
  173. package/src/helpers/buildPnpmPackagesMap.ts +53 -0
  174. package/src/helpers/collectDependentRanges.test.ts +311 -0
  175. package/src/helpers/collectDependentRanges.ts +185 -0
  176. package/src/helpers/collectPnpmDependents.test.ts +112 -0
  177. package/src/helpers/collectPnpmDependents.ts +79 -0
  178. package/src/helpers/duplicateSnapshot.ts +18 -0
  179. package/src/helpers/parsePnpmLockPackages.test.ts +93 -0
  180. package/src/helpers/parsePnpmLockPackages.ts +99 -0
  181. package/src/helpers/pnpmProtocol.ts +12 -0
  182. package/src/helpers/pnpmVersion.ts +28 -0
  183. package/src/helpers/pnpmWorkspaceYaml.test.ts +140 -0
  184. package/src/helpers/pnpmWorkspaceYaml.ts +77 -0
  185. package/src/helpers/projectDir.ts +14 -0
  186. package/src/helpers/readInstalledManifest.test.ts +124 -0
  187. package/src/helpers/readInstalledManifest.ts +202 -0
  188. package/src/helpers/runPnpm.ts +34 -0
  189. package/src/helpers/tempProjects.ts +94 -0
  190. package/src/helpers/toLockstepGraph.test.ts +98 -0
  191. package/src/helpers/toLockstepGraph.ts +52 -0
  192. package/src/helpers/versionsSnapshot.ts +9 -0
  193. package/src/identifyClusterFixes.test.ts +430 -0
  194. package/src/identifyClusterFixes.ts +114 -0
  195. package/src/identifyResolutionFixes.test.ts +82 -0
  196. package/src/index.ts +159 -0
  197. package/src/pnpmLockTypes.ts +44 -0
  198. package/src/readPnpmLock.ts +7 -0
@@ -0,0 +1 @@
1
+ {"version":3,"file":"collectDependentRanges.test.js","sourceRoot":"","sources":["../../src/helpers/collectDependentRanges.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,55 @@
1
+ import { PackageDependencyDescriptorUtils, isSemverComparable, } from "pm-dedup-core";
2
+ import { parsePackageId, resolveSnapshotDependency, } from "./parsePnpmLockPackages.js";
3
+ const importerDepTypes = [
4
+ "dependencies",
5
+ "devDependencies",
6
+ "optionalDependencies",
7
+ ];
8
+ const snapshotDepTypes = ["dependencies", "optionalDependencies"];
9
+ export function collectPnpmDependents(lock, onlyPackageNames) {
10
+ const dependentsMap = new Map();
11
+ const add = (name, dependent) => {
12
+ if (onlyPackageNames && !onlyPackageNames.includes(name)) {
13
+ return;
14
+ }
15
+ let dependents = dependentsMap.get(name);
16
+ if (!dependents) {
17
+ dependents = [];
18
+ dependentsMap.set(name, dependents);
19
+ }
20
+ dependents.push(dependent);
21
+ };
22
+ for (const [importerPath, project] of Object.entries(lock.importers ?? {})) {
23
+ importerDepTypes.forEach((depType) => {
24
+ const deps = project[depType];
25
+ if (!deps)
26
+ return;
27
+ for (const [depName, { specifier }] of Object.entries(deps)) {
28
+ const parsedDep = PackageDependencyDescriptorUtils.parse(depName, specifier);
29
+ // `workspace:` and `catalog:` name something other than the npm package
30
+ // sharing this key, so they constrain no npm version
31
+ if (!isSemverComparable(parsedDep))
32
+ continue;
33
+ add(parsedDep.npmName, {
34
+ key: `${importerPath === "." ? "package.json" : importerPath} in ${depType}`,
35
+ version: parsedDep.selector,
36
+ });
37
+ }
38
+ });
39
+ }
40
+ for (const [snapshotKey, snapshot] of Object.entries(lock.snapshots ?? {})) {
41
+ const { name, version } = parsePackageId(snapshotKey);
42
+ const key = `${name}@${version}`;
43
+ snapshotDepTypes.forEach((depType) => {
44
+ const deps = snapshot[depType];
45
+ if (!deps)
46
+ return;
47
+ for (const [depName, depValue] of Object.entries(deps)) {
48
+ const resolved = resolveSnapshotDependency(depName, depValue);
49
+ add(resolved.name, { key, version: resolved.version });
50
+ }
51
+ });
52
+ }
53
+ return dependentsMap;
54
+ }
55
+ //# sourceMappingURL=collectPnpmDependents.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"collectPnpmDependents.js","sourceRoot":"","sources":["../../src/helpers/collectPnpmDependents.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,78 @@
1
+ import { describe, it } from "bun:test";
2
+ import { deepStrictEqual, ok, strictEqual } from "node:assert/strict";
3
+ import { fileURLToPath } from "node:url";
4
+ import { readPnpmLock } from "../readPnpmLock.js";
5
+ import { collectPnpmDependents } from "./collectPnpmDependents.js";
6
+ const fixturesBase = (rel) => fileURLToPath(new URL(rel, import.meta.url));
7
+ const lockFor = (scenario) => readPnpmLock(fixturesBase(`../../test/fixtures/${scenario}/pnpm-lock.yaml`));
8
+ describe("collectPnpmDependents", () => {
9
+ it("collects the importer specifier (range) for a direct dependency", () => {
10
+ const dependents = collectPnpmDependents(lockFor("simple"));
11
+ deepStrictEqual(dependents.get("semver"), [
12
+ { key: "package.json in dependencies", version: "7.7.3" },
13
+ ]);
14
+ });
15
+ it("collects both importer range and transitive resolved versions", () => {
16
+ const dependents = collectPnpmDependents(lockFor("duplicated-babel-frame"), ["@babel/code-frame"]);
17
+ const codeFrame = dependents.get("@babel/code-frame");
18
+ ok(codeFrame);
19
+ // direct importer dependency carries the specifier range
20
+ ok(codeFrame.some((dependent) => dependent.key === "package.json in dependencies" &&
21
+ dependent.version === "7.26.2"));
22
+ // transitive dependents carry a resolved version
23
+ ok(codeFrame.some((dependent) => dependent.version === "7.29.7"));
24
+ ok(codeFrame.length >= 2);
25
+ });
26
+ // A `workspace:`, `catalog:`, `file:` or `link:` specifier names something
27
+ // other than the npm package sharing its key, and a dist-tag carries no
28
+ // comparable range. Recording them as ranges makes `semver.satisfies` answer
29
+ // "not satisfied" for every candidate, suppressing merges the real dependents
30
+ // allow.
31
+ it("leaves out importer specifiers that are not npm ranges", () => {
32
+ const dependents = collectPnpmDependents(lockFor("protocol-dependents"));
33
+ deepStrictEqual([...dependents.keys()].toSorted(), ["app", "semver"]);
34
+ // the importer declares `semver` as `latest`, so only the snapshot dependent
35
+ // of `app` remains
36
+ deepStrictEqual(dependents.get("semver"), [
37
+ { key: "app@1.0.0", version: "7.8.1" },
38
+ ]);
39
+ for (const packageName of [
40
+ "helper",
41
+ "picocolors",
42
+ "left-pad",
43
+ "kleur",
44
+ "chalk",
45
+ ]) {
46
+ strictEqual(dependents.has(packageName), false);
47
+ }
48
+ });
49
+ it("keeps the range an aliased importer specifier declares", () => {
50
+ const dependents = collectPnpmDependents(lockFor("mergeable-alias"), [
51
+ "printable-shell-command",
52
+ ]);
53
+ deepStrictEqual((dependents.get("printable-shell-command") ?? [])
54
+ .filter((dependent) => dependent.key.startsWith("package.json"))
55
+ .map((dependent) => dependent.version)
56
+ .toSorted(), ["5.0.7", "^5.0.0"]);
57
+ });
58
+ // `aliased-swapped-names`: the importer declares `"@typescript/native":
59
+ // "npm:typescript@7.0.2"` and `"typescript":
60
+ // "npm:@typescript/typescript6@6.0.2"`, so each key names the other's package.
61
+ // Filing either under its key would put an exact pin on the wrong package.
62
+ it("files a swapped alias under the package its specifier targets", () => {
63
+ const dependents = collectPnpmDependents(lockFor("aliased-swapped-names"));
64
+ deepStrictEqual(dependents.get("typescript"), [
65
+ { key: "package.json in devDependencies", version: "7.0.2" },
66
+ { key: "tool@1.0.0", version: "5.9.3" },
67
+ ]);
68
+ deepStrictEqual(dependents.get("@typescript/typescript6"), [
69
+ { key: "package.json in devDependencies", version: "6.0.2" },
70
+ ]);
71
+ });
72
+ it("restricts results to onlyPackageNames", () => {
73
+ const dependents = collectPnpmDependents(lockFor("duplicated-printable-shell-command"), ["printable-shell-command"]);
74
+ strictEqual([...dependents.keys()].every((name) => name === "printable-shell-command"), true);
75
+ ok(dependents.get("printable-shell-command"));
76
+ });
77
+ });
78
+ //# sourceMappingURL=collectPnpmDependents.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"collectPnpmDependents.test.js","sourceRoot":"","sources":["../../src/helpers/collectPnpmDependents.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,5 @@
1
+ import { readPnpmLock } from "../readPnpmLock.js";
2
+ import { buildPnpmPackagesMap, filterDuplicatesPnpmPackagesMap, } from "./buildPnpmPackagesMap.js";
3
+ import { parsePnpmLockPackages } from "./parsePnpmLockPackages.js";
4
+ export const readDuplicateSnapshot = (lockPath) => new Set(Object.values(filterDuplicatesPnpmPackagesMap(buildPnpmPackagesMap(parsePnpmLockPackages(readPnpmLock(lockPath))))).flatMap((resolutions) => resolutions.map((resolution) => resolution.resolution)));
5
+ //# sourceMappingURL=duplicateSnapshot.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"duplicateSnapshot.js","sourceRoot":"","sources":["../../src/helpers/duplicateSnapshot.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAClD,OAAO,EACL,oBAAoB,EACpB,+BAA+B,GAChC,MAAM,2BAA2B,CAAC;AACnC,OAAO,EAAE,qBAAqB,EAAE,MAAM,4BAA4B,CAAC;AAEnE,MAAM,CAAC,MAAM,qBAAqB,GAAG,CAAC,QAAgB,EAAqB,EAAE,CAC3E,IAAI,GAAG,CACL,MAAM,CAAC,MAAM,CACX,+BAA+B,CAC7B,oBAAoB,CAAC,qBAAqB,CAAC,YAAY,CAAC,QAAQ,CAAC,CAAC,CAAC,CACpE,CACF,CAAC,OAAO,CAAC,CAAC,WAAW,EAAE,EAAE,CACxB,WAAW,CAAC,GAAG,CAAC,CAAC,UAAU,EAAE,EAAE,CAAC,UAAU,CAAC,UAAU,CAAC,CACvD,CACF,CAAC"}
@@ -0,0 +1,62 @@
1
+ /**
2
+ * Strip a pnpm peer-dependency suffix (everything from the first `(`).
3
+ *
4
+ * eg `@scope/name@1.2.3(eslint@9)(typescript@5)` -> `@scope/name@1.2.3`
5
+ */
6
+ export const stripPeerSuffix = (id) => {
7
+ const parenPos = id.indexOf("(");
8
+ return parenPos === -1 ? id : id.slice(0, parenPos);
9
+ };
10
+ /**
11
+ * Parse a pnpm package id (`name@version`, optionally peer-suffixed) into its
12
+ * name and version. Handles scoped names (`@scope/name@1.2.3`).
13
+ */
14
+ export const parsePackageId = (id) => {
15
+ const base = stripPeerSuffix(id);
16
+ const atPos = base.lastIndexOf("@");
17
+ if (atPos <= 0) {
18
+ return { name: base, version: "" };
19
+ }
20
+ return { name: base.slice(0, atPos), version: base.slice(atPos + 1) };
21
+ };
22
+ const isNpmVersion = (version) => {
23
+ return /^\d/.test(version);
24
+ };
25
+ /**
26
+ * Resolve a snapshot dependency entry. The value is either a resolved version
27
+ * (`1.2.3`, possibly peer-suffixed) for which the key is the real npm name, or
28
+ * an aliased `realName@version` form when the key is a local alias.
29
+ */
30
+ export const resolveSnapshotDependency = (depName, depValue) => {
31
+ const stripped = stripPeerSuffix(depValue);
32
+ if (isNpmVersion(stripped)) {
33
+ return { name: depName, version: stripped };
34
+ }
35
+ const { name, version } = parsePackageId(stripped);
36
+ return { name: name || depName, version };
37
+ };
38
+ export const parsePnpmLockPackages = (lock) => {
39
+ const packages = new Map();
40
+ for (const resolution of Object.keys(lock.packages ?? {})) {
41
+ const { name, version } = parsePackageId(resolution);
42
+ packages.set(resolution, {
43
+ type: isNpmVersion(version) ? "npm" : "other",
44
+ name,
45
+ version,
46
+ resolution,
47
+ });
48
+ }
49
+ const installationsByResolution = new Map();
50
+ for (const snapshotKey of Object.keys(lock.snapshots ?? {})) {
51
+ const baseId = stripPeerSuffix(snapshotKey);
52
+ const installations = installationsByResolution.get(baseId);
53
+ if (installations) {
54
+ installations.push(snapshotKey);
55
+ }
56
+ else {
57
+ installationsByResolution.set(baseId, [snapshotKey]);
58
+ }
59
+ }
60
+ return { packages, installationsByResolution };
61
+ };
62
+ //# sourceMappingURL=parsePnpmLockPackages.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"parsePnpmLockPackages.js","sourceRoot":"","sources":["../../src/helpers/parsePnpmLockPackages.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,62 @@
1
+ import { describe, it } from "bun:test";
2
+ import { deepStrictEqual, ok, strictEqual } from "node:assert/strict";
3
+ import { fileURLToPath } from "node:url";
4
+ import { readPnpmLock } from "../readPnpmLock.js";
5
+ import { parsePackageId, parsePnpmLockPackages, } from "./parsePnpmLockPackages.js";
6
+ const fixturesBase = (rel) => fileURLToPath(new URL(rel, import.meta.url));
7
+ const readFixture = (scenario) => readPnpmLock(fixturesBase(`../../test/fixtures/${scenario}/pnpm-lock.yaml`));
8
+ describe("parsePackageId", () => {
9
+ it("parses an unscoped id", () => {
10
+ deepStrictEqual(parsePackageId("semver@7.7.3"), {
11
+ name: "semver",
12
+ version: "7.7.3",
13
+ });
14
+ });
15
+ it("parses a scoped id", () => {
16
+ deepStrictEqual(parsePackageId("@babel/code-frame@7.26.2"), {
17
+ name: "@babel/code-frame",
18
+ version: "7.26.2",
19
+ });
20
+ });
21
+ it("strips the peer-dependency suffix", () => {
22
+ deepStrictEqual(parsePackageId("@typescript-eslint/utils@8.61.0(eslint@10.5.0)(typescript@6.0.3)"), { name: "@typescript-eslint/utils", version: "8.61.0" });
23
+ });
24
+ it("keeps a non-registry url as the version", () => {
25
+ const parsed = parsePackageId("zod@https://codeload.github.com/colinhacks/zod/tar.gz/ca42965df46b2f7e2747db29c40a26bcb32a51d5");
26
+ strictEqual(parsed.name, "zod");
27
+ strictEqual(parsed.version.startsWith("https://"), true);
28
+ });
29
+ });
30
+ describe("parsePnpmLockPackages", () => {
31
+ it("parses the simple fixture (single npm package)", () => {
32
+ const { packages } = parsePnpmLockPackages(readFixture("simple"));
33
+ strictEqual(packages.size, 1);
34
+ const semver = packages.get("semver@7.7.3");
35
+ strictEqual(semver?.type, "npm");
36
+ strictEqual(semver.name, "semver");
37
+ strictEqual(semver.version, "7.7.3");
38
+ });
39
+ it("parses both duplicated @babel/code-frame versions as npm", () => {
40
+ const { packages } = parsePnpmLockPackages(readFixture("duplicated-babel-frame"));
41
+ const codeFrames = [...packages.values()].filter((pkg) => pkg.name === "@babel/code-frame");
42
+ strictEqual(codeFrames.length, 2);
43
+ ok(codeFrames.every((pkg) => pkg.type === "npm"));
44
+ const versions = new Set(codeFrames.map((pkg) => pkg.version));
45
+ ok(versions.has("7.26.2"));
46
+ ok(versions.size === 2);
47
+ });
48
+ it("classifies non-registry resolutions as other, registry tarballs as npm", () => {
49
+ const { packages } = parsePnpmLockPackages(readFixture("non-npm"));
50
+ const byName = new Map([...packages.values()].map((pkg) => [pkg.name, pkg]));
51
+ strictEqual(byName.get("react")?.type, "npm");
52
+ strictEqual(byName.get("zod")?.type, "other");
53
+ });
54
+ it("groups peer-context snapshots into installations", () => {
55
+ const { installationsByResolution } = parsePnpmLockPackages(readFixture("duplicated-typescript-eslint"));
56
+ const utils = installationsByResolution.get("@typescript-eslint/utils@8.61.0");
57
+ ok(utils);
58
+ ok(utils.length > 0);
59
+ ok(utils.every((key) => key.startsWith("@typescript-eslint/utils@8.61.0")));
60
+ });
61
+ });
62
+ //# sourceMappingURL=parsePnpmLockPackages.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"parsePnpmLockPackages.test.js","sourceRoot":"","sources":["../../src/helpers/parsePnpmLockPackages.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=pnpmProtocol.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pnpmProtocol.js","sourceRoot":"","sources":["../../src/helpers/pnpmProtocol.ts"],"names":[],"mappings":""}
@@ -0,0 +1,23 @@
1
+ import semver from "semver";
2
+ import { runPnpm } from "./runPnpm.js";
3
+ /**
4
+ * Convergence overrides (`overrides: { "pkg@": "1.2.3" }`, empty range selector)
5
+ * landed in pnpm 11.13.0. They rewrite a dependency edge only when the declared
6
+ * range accepts the exact version, which is what lets a cluster converge without
7
+ * forcing the members a third-party range legitimately pins elsewhere.
8
+ */
9
+ export const convergenceOverridesMinVersion = "11.13.0";
10
+ export const readPnpmVersion = (run = runPnpm) => {
11
+ const result = run(["--version"], { stdio: "pipe" });
12
+ if (result.status !== 0)
13
+ return null;
14
+ // pnpm prints its warnings (a `workspaces` field in package.json, an update
15
+ // notice) into the same captured output, so the version is the last line that
16
+ // is one, not the last line.
17
+ return (result.output
18
+ .split("\n")
19
+ .map((line) => line.trim())
20
+ .findLast((line) => semver.valid(line) !== null) ?? null);
21
+ };
22
+ export const supportsConvergenceOverrides = (version) => semver.gte(version, convergenceOverridesMinVersion);
23
+ //# sourceMappingURL=pnpmVersion.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pnpmVersion.js","sourceRoot":"","sources":["../../src/helpers/pnpmVersion.ts"],"names":[],"mappings":"AAAA,OAAO,MAAM,MAAM,QAAQ,CAAC;AAC5B,OAAO,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AAGvC;;;;;GAKG;AACH,MAAM,CAAC,MAAM,8BAA8B,GAAG,SAAS,CAAC;AAExD,MAAM,CAAC,MAAM,eAAe,GAAG,CAAC,GAAG,GAAe,OAAO,EAAiB,EAAE;IAC1E,MAAM,MAAM,GAAG,GAAG,CAAC,CAAC,WAAW,CAAC,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC,CAAC;IACrD,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,IAAI,CAAC;IACrC,4EAA4E;IAC5E,8EAA8E;IAC9E,6BAA6B;IAC7B,OAAO,CACL,MAAM,CAAC,MAAM;SACV,KAAK,CAAC,IAAI,CAAC;SACX,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC;SAC1B,QAAQ,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,IAAI,CAAC,IAAI,IAAI,CAC3D,CAAC;AACJ,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,4BAA4B,GAAG,CAAC,OAAe,EAAW,EAAE,CACvE,MAAM,CAAC,GAAG,CAAC,OAAO,EAAE,8BAA8B,CAAC,CAAC"}
@@ -0,0 +1,48 @@
1
+ import { Scalar, parseDocument } from "yaml";
2
+ /**
3
+ * A convergence override (pnpm >= 11.13.0) is an override key with an empty
4
+ * range selector. It repoints a dependency edge only when the edge's declared
5
+ * range accepts the exact version, so the members a third-party range
6
+ * legitimately pins elsewhere keep their own resolution instead of being forced.
7
+ * The plain key is the unconditional one: every requester gets the version.
8
+ */
9
+ export const overrideKey = (packageName, convergence) => (convergence ? `${packageName}@` : packageName);
10
+ // `yaml` writes `commentBefore` straight after the `#`, so the leading space
11
+ // that makes it read as prose has to be part of every line.
12
+ const spaced = (comment) => comment
13
+ .split("\n")
14
+ .map((line) => (line.startsWith(" ") ? line : ` ${line}`))
15
+ .join("\n");
16
+ const quoted = (value) => {
17
+ const scalar = new Scalar(value);
18
+ scalar.type = Scalar.QUOTE_DOUBLE;
19
+ return scalar;
20
+ };
21
+ /**
22
+ * Add overrides to a `pnpm-workspace.yaml`, editing the document rather than
23
+ * reserializing it: the user's comments, key order and formatting have to
24
+ * survive. Pass `undefined` for a file that does not exist yet.
25
+ *
26
+ * `comment` is attached above the first entry added, not above the `overrides`
27
+ * key, so an existing block and whatever the user wrote about it stay untouched.
28
+ */
29
+ export const addOverrides = (content, overrides, { convergence = true, comment } = {}) => {
30
+ const doc = parseDocument(content ?? "");
31
+ let isFirst = true;
32
+ for (const [packageName, version] of overrides) {
33
+ const key = quoted(overrideKey(packageName, convergence));
34
+ if (isFirst && comment !== undefined) {
35
+ key.commentBefore = spaced(comment);
36
+ }
37
+ doc.setIn(["overrides", key], quoted(version));
38
+ isFirst = false;
39
+ }
40
+ return doc.toString();
41
+ };
42
+ export const readConvergenceOverrides = (content) => {
43
+ const parsed = parseDocument(content).toJS();
44
+ return new Map(Object.entries(parsed?.overrides ?? {}).flatMap(([key, value]) => key.endsWith("@") && typeof value === "string"
45
+ ? [[key.slice(0, -1), value]]
46
+ : []));
47
+ };
48
+ //# sourceMappingURL=pnpmWorkspaceYaml.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pnpmWorkspaceYaml.js","sourceRoot":"","sources":["../../src/helpers/pnpmWorkspaceYaml.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,aAAa,EAAE,MAAM,MAAM,CAAC;AAE7C;;;;;;GAMG;AACH,MAAM,CAAC,MAAM,WAAW,GAAG,CACzB,WAAmB,EACnB,WAAoB,EACZ,EAAE,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,GAAG,WAAW,GAAG,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC;AAE7D,6EAA6E;AAC7E,4DAA4D;AAC5D,MAAM,MAAM,GAAG,CAAC,OAAe,EAAU,EAAE,CACzC,OAAO;KACJ,KAAK,CAAC,IAAI,CAAC;KACX,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,IAAI,EAAE,CAAC,CAAC;KACzD,IAAI,CAAC,IAAI,CAAC,CAAC;AAEhB,MAAM,MAAM,GAAG,CAAC,KAAa,EAAkB,EAAE;IAC/C,MAAM,MAAM,GAAG,IAAI,MAAM,CAAC,KAAK,CAAC,CAAC;IACjC,MAAM,CAAC,IAAI,GAAG,MAAM,CAAC,YAAY,CAAC;IAClC,OAAO,MAAM,CAAC;AAChB,CAAC,CAAC;AAQF;;;;;;;GAOG;AACH,MAAM,CAAC,MAAM,YAAY,GAAG,CAC1B,OAA2B,EAC3B,SAA8B,EAC9B,EAAE,WAAW,GAAG,IAAI,EAAE,OAAO,EAAE,GAAwB,EAAE,EACjD,EAAE;IACV,MAAM,GAAG,GAAG,aAAa,CAAC,OAAO,IAAI,EAAE,CAAC,CAAC;IACzC,IAAI,OAAO,GAAG,IAAI,CAAC;IAEnB,KAAK,MAAM,CAAC,WAAW,EAAE,OAAO,CAAC,IAAI,SAAS,EAAE,CAAC;QAC/C,MAAM,GAAG,GAAG,MAAM,CAAC,WAAW,CAAC,WAAW,EAAE,WAAW,CAAC,CAAC,CAAC;QAC1D,IAAI,OAAO,IAAI,OAAO,KAAK,SAAS,EAAE,CAAC;YACrC,GAAG,CAAC,aAAa,GAAG,MAAM,CAAC,OAAO,CAAC,CAAC;QACtC,CAAC;QACD,GAAG,CAAC,KAAK,CAAC,CAAC,WAAW,EAAE,GAAG,CAAC,EAAE,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC;QAC/C,OAAO,GAAG,KAAK,CAAC;IAClB,CAAC;IAED,OAAO,GAAG,CAAC,QAAQ,EAAE,CAAC;AACxB,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,wBAAwB,GAAG,CACtC,OAAe,EACM,EAAE;IACvB,MAAM,MAAM,GAAG,aAAa,CAAC,OAAO,CAAC,CAAC,IAAI,EAElC,CAAC;IAET,OAAO,IAAI,GAAG,CACZ,MAAM,CAAC,OAAO,CAAC,MAAM,EAAE,SAAS,IAAI,EAAE,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,EAAE,KAAK,CAAC,EAAE,EAAE,CAC/D,GAAG,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,OAAO,KAAK,KAAK,QAAQ;QAC5C,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,CAAqB,CAAC;QACjD,CAAC,CAAC,EAAE,CACP,CACF,CAAC;AACJ,CAAC,CAAC"}
@@ -0,0 +1,91 @@
1
+ import { describe, it } from "bun:test";
2
+ import { deepStrictEqual, strictEqual } from "node:assert/strict";
3
+ import { addOverrides, overrideKey, readConvergenceOverrides, } from "./pnpmWorkspaceYaml.js";
4
+ const overrides = (entries) => new Map(entries);
5
+ describe("pnpmWorkspaceYaml", () => {
6
+ it("uses the empty range selector pnpm reads as a convergence override", () => {
7
+ strictEqual(overrideKey("metro-config", true), "metro-config@");
8
+ strictEqual(overrideKey("@react-native/metro-config", true), "@react-native/metro-config@");
9
+ strictEqual(overrideKey("metro-config", false), "metro-config");
10
+ });
11
+ it("creates the file content when there is none", () => {
12
+ strictEqual(addOverrides(undefined, overrides([["metro-config", "0.87.0"]])), 'overrides:\n "metro-config@": "0.87.0"\n');
13
+ });
14
+ it("keeps comments, sibling keys and formatting", () => {
15
+ const content = [
16
+ "# why this repo pins its resolution mode",
17
+ "resolutionMode: time-based # inline",
18
+ "",
19
+ "packages:",
20
+ " - packages/*",
21
+ "",
22
+ "# trailing note",
23
+ "",
24
+ ].join("\n");
25
+ strictEqual(addOverrides(content, overrides([["metro", "0.84.5"]])), [
26
+ "# why this repo pins its resolution mode",
27
+ "resolutionMode: time-based # inline",
28
+ "",
29
+ "packages:",
30
+ " - packages/*",
31
+ "overrides:",
32
+ ' "metro@": "0.84.5"',
33
+ "",
34
+ "# trailing note",
35
+ "",
36
+ ].join("\n"));
37
+ });
38
+ it("adds to an existing overrides block without touching its entries", () => {
39
+ const content = [
40
+ "overrides:",
41
+ " # a decision taken elsewhere",
42
+ ' "foo@": "1.0.0"',
43
+ "resolutionMode: time-based",
44
+ "",
45
+ ].join("\n");
46
+ strictEqual(addOverrides(content, overrides([["bar", "2.0.0"]])), [
47
+ "overrides:",
48
+ " # a decision taken elsewhere",
49
+ ' "foo@": "1.0.0"',
50
+ ' "bar@": "2.0.0"',
51
+ "resolutionMode: time-based",
52
+ "",
53
+ ].join("\n"));
54
+ });
55
+ it("quotes the scoped keys and the versions yaml would read as numbers", () => {
56
+ strictEqual(addOverrides(undefined, overrides([
57
+ ["@react-native/metro-config", "0.87.0"],
58
+ ["single-digit", "4"],
59
+ ])), [
60
+ "overrides:",
61
+ ' "@react-native/metro-config@": "0.87.0"',
62
+ ' "single-digit@": "4"',
63
+ "",
64
+ ].join("\n"));
65
+ });
66
+ it("puts the comment above the first entry it adds, not above the block", () => {
67
+ strictEqual(addOverrides('overrides:\n # a decision taken elsewhere\n "foo@": "1.0.0"\n', overrides([
68
+ ["leaf", "2.0.0"],
69
+ ["other", "1.0.0"],
70
+ ]), { comment: "Added by pnpm-dedup.\nsee https://example.test/issues" }), [
71
+ "overrides:",
72
+ " # a decision taken elsewhere",
73
+ ' "foo@": "1.0.0"',
74
+ " # Added by pnpm-dedup.",
75
+ " # see https://example.test/issues",
76
+ ' "leaf@": "2.0.0"',
77
+ ' "other@": "1.0.0"',
78
+ "",
79
+ ].join("\n"));
80
+ });
81
+ it("writes plain keys when convergence is disabled", () => {
82
+ strictEqual(addOverrides(undefined, overrides([["metro", "0.84.5"]]), {
83
+ convergence: false,
84
+ }), 'overrides:\n "metro": "0.84.5"\n');
85
+ });
86
+ it("reads back only the convergence overrides", () => {
87
+ const content = addOverrides('overrides:\n "plain-override": "1.0.0"\n', overrides([["metro", "0.84.5"]]));
88
+ deepStrictEqual([...readConvergenceOverrides(content)], [["metro", "0.84.5"]]);
89
+ });
90
+ });
91
+ //# sourceMappingURL=pnpmWorkspaceYaml.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pnpmWorkspaceYaml.test.js","sourceRoot":"","sources":["../../src/helpers/pnpmWorkspaceYaml.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,10 @@
1
+ import { join } from "node:path";
2
+ import { resolveProjectDir } from "pm-dedup-core";
3
+ const lockfileName = "pnpm-lock.yaml";
4
+ export const lockPathOf = (projectDir) => join(projectDir, lockfileName);
5
+ // The project the run operates on, found by walking up from the working
6
+ // directory, so the bins work from any subdirectory of it. Null when no
7
+ // pnpm-lock.yaml was found: the reason is printed and the exit code set, as
8
+ // `parseBinArgs` does.
9
+ export const resolvePnpmProjectDir = () => resolveProjectDir({ lockfileName });
10
+ //# sourceMappingURL=projectDir.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"projectDir.js","sourceRoot":"","sources":["../../src/helpers/projectDir.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,iBAAiB,EAAE,MAAM,eAAe,CAAC;AAElD,MAAM,YAAY,GAAG,gBAAgB,CAAC;AAEtC,MAAM,CAAC,MAAM,UAAU,GAAG,CAAC,UAAkB,EAAU,EAAE,CACvD,IAAI,CAAC,UAAU,EAAE,YAAY,CAAC,CAAC;AAEjC,wEAAwE;AACxE,wEAAwE;AACxE,4EAA4E;AAC5E,uBAAuB;AACvB,MAAM,CAAC,MAAM,qBAAqB,GAAG,GAAkB,EAAE,CACvD,iBAAiB,CAAC,EAAE,YAAY,EAAE,CAAC,CAAC"}