pm-dedup-core 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 (228) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +105 -0
  3. package/dist/buildIdentifiedFixesMap.js +6 -0
  4. package/dist/buildIdentifiedFixesMap.js.map +1 -0
  5. package/dist/buildLockstepClusters.js +119 -0
  6. package/dist/buildLockstepClusters.js.map +1 -0
  7. package/dist/buildLockstepClusters.test.js +71 -0
  8. package/dist/buildLockstepClusters.test.js.map +1 -0
  9. package/dist/clusterLabel.js +59 -0
  10. package/dist/clusterLabel.js.map +1 -0
  11. package/dist/clusterLabel.test.js +56 -0
  12. package/dist/clusterLabel.test.js.map +1 -0
  13. package/dist/compareCandidateVersions.js +18 -0
  14. package/dist/compareCandidateVersions.js.map +1 -0
  15. package/dist/compareCandidateVersions.test.js +32 -0
  16. package/dist/compareCandidateVersions.test.js.map +1 -0
  17. package/dist/createPackageFilter.js +81 -0
  18. package/dist/createPackageFilter.js.map +1 -0
  19. package/dist/createPackageFilter.test.js +115 -0
  20. package/dist/createPackageFilter.test.js.map +1 -0
  21. package/dist/definitions/buildIdentifiedFixesMap.d.ts +4 -0
  22. package/dist/definitions/buildIdentifiedFixesMap.d.ts.map +1 -0
  23. package/dist/definitions/buildLockstepClusters.d.ts +8 -0
  24. package/dist/definitions/buildLockstepClusters.d.ts.map +1 -0
  25. package/dist/definitions/buildLockstepClusters.test.d.ts +2 -0
  26. package/dist/definitions/buildLockstepClusters.test.d.ts.map +1 -0
  27. package/dist/definitions/clusterLabel.d.ts +8 -0
  28. package/dist/definitions/clusterLabel.d.ts.map +1 -0
  29. package/dist/definitions/clusterLabel.test.d.ts +2 -0
  30. package/dist/definitions/clusterLabel.test.d.ts.map +1 -0
  31. package/dist/definitions/compareCandidateVersions.d.ts +10 -0
  32. package/dist/definitions/compareCandidateVersions.d.ts.map +1 -0
  33. package/dist/definitions/compareCandidateVersions.test.d.ts +2 -0
  34. package/dist/definitions/compareCandidateVersions.test.d.ts.map +1 -0
  35. package/dist/definitions/createPackageFilter.d.ts +45 -0
  36. package/dist/definitions/createPackageFilter.d.ts.map +1 -0
  37. package/dist/definitions/createPackageFilter.test.d.ts +2 -0
  38. package/dist/definitions/createPackageFilter.test.d.ts.map +1 -0
  39. package/dist/definitions/duplicateSnapshot.d.ts +8 -0
  40. package/dist/definitions/duplicateSnapshot.d.ts.map +1 -0
  41. package/dist/definitions/fileSnapshot.d.ts +7 -0
  42. package/dist/definitions/fileSnapshot.d.ts.map +1 -0
  43. package/dist/definitions/findProjectRoot.d.ts +27 -0
  44. package/dist/definitions/findProjectRoot.d.ts.map +1 -0
  45. package/dist/definitions/findProjectRoot.test.d.ts +2 -0
  46. package/dist/definitions/findProjectRoot.test.d.ts.map +1 -0
  47. package/dist/definitions/identifyLockstepClusterFixes.d.ts +89 -0
  48. package/dist/definitions/identifyLockstepClusterFixes.d.ts.map +1 -0
  49. package/dist/definitions/identifyLockstepClusterFixes.test.d.ts +2 -0
  50. package/dist/definitions/identifyLockstepClusterFixes.test.d.ts.map +1 -0
  51. package/dist/definitions/identifyResolutionFixes.d.ts +28 -0
  52. package/dist/definitions/identifyResolutionFixes.d.ts.map +1 -0
  53. package/dist/definitions/identifyResolutionFixes.test.d.ts +2 -0
  54. package/dist/definitions/identifyResolutionFixes.test.d.ts.map +1 -0
  55. package/dist/definitions/index.d.ts +44 -0
  56. package/dist/definitions/index.d.ts.map +1 -0
  57. package/dist/definitions/packageDependenciesUtils.d.ts +47 -0
  58. package/dist/definitions/packageDependenciesUtils.d.ts.map +1 -0
  59. package/dist/definitions/packageDependenciesUtils.test.d.ts +2 -0
  60. package/dist/definitions/packageDependenciesUtils.test.d.ts.map +1 -0
  61. package/dist/definitions/packageFilterArgs.d.ts +74 -0
  62. package/dist/definitions/packageFilterArgs.d.ts.map +1 -0
  63. package/dist/definitions/packageFilterArgs.test.d.ts +2 -0
  64. package/dist/definitions/packageFilterArgs.test.d.ts.map +1 -0
  65. package/dist/definitions/packageStyles.d.ts +14 -0
  66. package/dist/definitions/packageStyles.d.ts.map +1 -0
  67. package/dist/definitions/packageStyles.test.d.ts +2 -0
  68. package/dist/definitions/packageStyles.test.d.ts.map +1 -0
  69. package/dist/definitions/parseBinArgs.d.ts +14 -0
  70. package/dist/definitions/parseBinArgs.d.ts.map +1 -0
  71. package/dist/definitions/parseBinArgs.test.d.ts +2 -0
  72. package/dist/definitions/parseBinArgs.test.d.ts.map +1 -0
  73. package/dist/definitions/planClusterApply.d.ts +39 -0
  74. package/dist/definitions/planClusterApply.d.ts.map +1 -0
  75. package/dist/definitions/planClusterApply.test.d.ts +2 -0
  76. package/dist/definitions/planClusterApply.test.d.ts.map +1 -0
  77. package/dist/definitions/renderApplyPlan.d.ts +22 -0
  78. package/dist/definitions/renderApplyPlan.d.ts.map +1 -0
  79. package/dist/definitions/renderApplyPlan.test.d.ts +2 -0
  80. package/dist/definitions/renderApplyPlan.test.d.ts.map +1 -0
  81. package/dist/definitions/renderDedupeSummary.d.ts +22 -0
  82. package/dist/definitions/renderDedupeSummary.d.ts.map +1 -0
  83. package/dist/definitions/renderDedupeSummary.test.d.ts +2 -0
  84. package/dist/definitions/renderDedupeSummary.test.d.ts.map +1 -0
  85. package/dist/definitions/renderDuplicatesReport.d.ts +39 -0
  86. package/dist/definitions/renderDuplicatesReport.d.ts.map +1 -0
  87. package/dist/definitions/renderDuplicatesReport.test.d.ts +2 -0
  88. package/dist/definitions/renderDuplicatesReport.test.d.ts.map +1 -0
  89. package/dist/definitions/reportColors.d.ts +25 -0
  90. package/dist/definitions/reportColors.d.ts.map +1 -0
  91. package/dist/definitions/reportColors.test.d.ts +2 -0
  92. package/dist/definitions/reportColors.test.d.ts.map +1 -0
  93. package/dist/definitions/reportText.d.ts +29 -0
  94. package/dist/definitions/reportText.d.ts.map +1 -0
  95. package/dist/definitions/selectExplainedPackages.d.ts +22 -0
  96. package/dist/definitions/selectExplainedPackages.d.ts.map +1 -0
  97. package/dist/definitions/selectExplainedPackages.test.d.ts +2 -0
  98. package/dist/definitions/selectExplainedPackages.test.d.ts.map +1 -0
  99. package/dist/definitions/unconditionalOverrides.d.ts +24 -0
  100. package/dist/definitions/unconditionalOverrides.d.ts.map +1 -0
  101. package/dist/definitions/unconditionalOverrides.test.d.ts +2 -0
  102. package/dist/definitions/unconditionalOverrides.test.d.ts.map +1 -0
  103. package/dist/definitions/versionsSnapshot.d.ts +40 -0
  104. package/dist/definitions/versionsSnapshot.d.ts.map +1 -0
  105. package/dist/definitions/versionsSnapshot.test.d.ts +2 -0
  106. package/dist/definitions/versionsSnapshot.test.d.ts.map +1 -0
  107. package/dist/definitions/workspaceManifest.d.ts +21 -0
  108. package/dist/definitions/workspaceManifest.d.ts.map +1 -0
  109. package/dist/definitions/workspaceManifest.test.d.ts +2 -0
  110. package/dist/definitions/workspaceManifest.test.d.ts.map +1 -0
  111. package/dist/duplicateSnapshot.js +10 -0
  112. package/dist/duplicateSnapshot.js.map +1 -0
  113. package/dist/fileSnapshot.js +21 -0
  114. package/dist/fileSnapshot.js.map +1 -0
  115. package/dist/findProjectRoot.js +48 -0
  116. package/dist/findProjectRoot.js.map +1 -0
  117. package/dist/findProjectRoot.test.js +53 -0
  118. package/dist/findProjectRoot.test.js.map +1 -0
  119. package/dist/identifyLockstepClusterFixes.js +352 -0
  120. package/dist/identifyLockstepClusterFixes.js.map +1 -0
  121. package/dist/identifyLockstepClusterFixes.test.js +372 -0
  122. package/dist/identifyLockstepClusterFixes.test.js.map +1 -0
  123. package/dist/identifyResolutionFixes.js +102 -0
  124. package/dist/identifyResolutionFixes.js.map +1 -0
  125. package/dist/identifyResolutionFixes.test.js +70 -0
  126. package/dist/identifyResolutionFixes.test.js.map +1 -0
  127. package/dist/index.js +24 -0
  128. package/dist/index.js.map +1 -0
  129. package/dist/packageDependenciesUtils.js +91 -0
  130. package/dist/packageDependenciesUtils.js.map +1 -0
  131. package/dist/packageDependenciesUtils.test.js +539 -0
  132. package/dist/packageDependenciesUtils.test.js.map +1 -0
  133. package/dist/packageFilterArgs.js +65 -0
  134. package/dist/packageFilterArgs.js.map +1 -0
  135. package/dist/packageFilterArgs.test.js +93 -0
  136. package/dist/packageFilterArgs.test.js.map +1 -0
  137. package/dist/packageStyles.js +33 -0
  138. package/dist/packageStyles.js.map +1 -0
  139. package/dist/packageStyles.test.js +58 -0
  140. package/dist/packageStyles.test.js.map +1 -0
  141. package/dist/parseBinArgs.js +28 -0
  142. package/dist/parseBinArgs.js.map +1 -0
  143. package/dist/parseBinArgs.test.js +62 -0
  144. package/dist/parseBinArgs.test.js.map +1 -0
  145. package/dist/planClusterApply.js +69 -0
  146. package/dist/planClusterApply.js.map +1 -0
  147. package/dist/planClusterApply.test.js +152 -0
  148. package/dist/planClusterApply.test.js.map +1 -0
  149. package/dist/renderApplyPlan.js +51 -0
  150. package/dist/renderApplyPlan.js.map +1 -0
  151. package/dist/renderApplyPlan.test.js +106 -0
  152. package/dist/renderApplyPlan.test.js.map +1 -0
  153. package/dist/renderDedupeSummary.js +38 -0
  154. package/dist/renderDedupeSummary.js.map +1 -0
  155. package/dist/renderDedupeSummary.test.js +91 -0
  156. package/dist/renderDedupeSummary.test.js.map +1 -0
  157. package/dist/renderDuplicatesReport.js +375 -0
  158. package/dist/renderDuplicatesReport.js.map +1 -0
  159. package/dist/renderDuplicatesReport.test.js +598 -0
  160. package/dist/renderDuplicatesReport.test.js.map +1 -0
  161. package/dist/reportColors.js +51 -0
  162. package/dist/reportColors.js.map +1 -0
  163. package/dist/reportColors.test.js +49 -0
  164. package/dist/reportColors.test.js.map +1 -0
  165. package/dist/reportText.js +29 -0
  166. package/dist/reportText.js.map +1 -0
  167. package/dist/selectExplainedPackages.js +42 -0
  168. package/dist/selectExplainedPackages.js.map +1 -0
  169. package/dist/selectExplainedPackages.test.js +55 -0
  170. package/dist/selectExplainedPackages.test.js.map +1 -0
  171. package/dist/unconditionalOverrides.js +36 -0
  172. package/dist/unconditionalOverrides.js.map +1 -0
  173. package/dist/unconditionalOverrides.test.js +71 -0
  174. package/dist/unconditionalOverrides.test.js.map +1 -0
  175. package/dist/versionsSnapshot.js +49 -0
  176. package/dist/versionsSnapshot.js.map +1 -0
  177. package/dist/versionsSnapshot.test.js +79 -0
  178. package/dist/versionsSnapshot.test.js.map +1 -0
  179. package/dist/workspaceManifest.js +63 -0
  180. package/dist/workspaceManifest.js.map +1 -0
  181. package/dist/workspaceManifest.test.js +159 -0
  182. package/dist/workspaceManifest.test.js.map +1 -0
  183. package/package.json +68 -0
  184. package/src/buildIdentifiedFixesMap.ts +22 -0
  185. package/src/buildLockstepClusters.test.ts +90 -0
  186. package/src/buildLockstepClusters.ts +155 -0
  187. package/src/clusterLabel.test.ts +79 -0
  188. package/src/clusterLabel.ts +75 -0
  189. package/src/compareCandidateVersions.test.ts +39 -0
  190. package/src/compareCandidateVersions.ts +23 -0
  191. package/src/createPackageFilter.test.ts +156 -0
  192. package/src/createPackageFilter.ts +142 -0
  193. package/src/duplicateSnapshot.ts +24 -0
  194. package/src/fileSnapshot.ts +28 -0
  195. package/src/findProjectRoot.test.ts +66 -0
  196. package/src/findProjectRoot.ts +61 -0
  197. package/src/identifyLockstepClusterFixes.test.ts +462 -0
  198. package/src/identifyLockstepClusterFixes.ts +602 -0
  199. package/src/identifyResolutionFixes.test.ts +133 -0
  200. package/src/identifyResolutionFixes.ts +183 -0
  201. package/src/index.ts +123 -0
  202. package/src/packageDependenciesUtils.test.ts +593 -0
  203. package/src/packageDependenciesUtils.ts +156 -0
  204. package/src/packageFilterArgs.test.ts +116 -0
  205. package/src/packageFilterArgs.ts +98 -0
  206. package/src/packageStyles.test.ts +77 -0
  207. package/src/packageStyles.ts +42 -0
  208. package/src/parseBinArgs.test.ts +73 -0
  209. package/src/parseBinArgs.ts +33 -0
  210. package/src/planClusterApply.test.ts +163 -0
  211. package/src/planClusterApply.ts +105 -0
  212. package/src/renderApplyPlan.test.ts +136 -0
  213. package/src/renderApplyPlan.ts +95 -0
  214. package/src/renderDedupeSummary.test.ts +121 -0
  215. package/src/renderDedupeSummary.ts +78 -0
  216. package/src/renderDuplicatesReport.test.ts +724 -0
  217. package/src/renderDuplicatesReport.ts +645 -0
  218. package/src/reportColors.test.ts +57 -0
  219. package/src/reportColors.ts +78 -0
  220. package/src/reportText.ts +58 -0
  221. package/src/selectExplainedPackages.test.ts +67 -0
  222. package/src/selectExplainedPackages.ts +79 -0
  223. package/src/unconditionalOverrides.test.ts +99 -0
  224. package/src/unconditionalOverrides.ts +60 -0
  225. package/src/versionsSnapshot.test.ts +146 -0
  226. package/src/versionsSnapshot.ts +93 -0
  227. package/src/workspaceManifest.test.ts +220 -0
  228. package/src/workspaceManifest.ts +100 -0
@@ -0,0 +1,375 @@
1
+ import semver from "semver";
2
+ import { clusterLabel } from "./clusterLabel.js";
3
+ import { stylePackageName, stylePackageReference } from "./packageStyles.js";
4
+ import { createColorize, shouldColorize } from "./reportColors.js";
5
+ import { columnWidth, listText, padTo, plural } from "./reportText.js";
6
+ const clusterExplanation = [
7
+ "A lockstep cluster is a family of packages published together: each member",
8
+ "pins its siblings at its own version, so a duplicate inside the family only",
9
+ "disappears when the whole family moves to a single version.",
10
+ ];
11
+ const unattributedLabel = "(resolved version unknown)";
12
+ const directionLabel = (direction) => {
13
+ if (direction === "down")
14
+ return " (downgrade)";
15
+ if (direction === "up")
16
+ return " (upgrade)";
17
+ return "";
18
+ };
19
+ const compareVersionsDescending = (versionA, versionB) => semver.valid(versionA) !== null && semver.valid(versionB) !== null
20
+ ? semver.rcompare(versionA, versionB)
21
+ : versionA.localeCompare(versionB);
22
+ const toGroups = (view) => {
23
+ const byLabel = new Map();
24
+ for (const { resolution, version, installations } of view.resolutions) {
25
+ const label = version ?? resolution;
26
+ const group = byLabel.get(label);
27
+ // several resolutions of one version — a peer context, an extra install
28
+ // path — are one version to the reader, and their locations are the detail
29
+ if (group) {
30
+ group.installations.push(...installations);
31
+ continue;
32
+ }
33
+ byLabel.set(label, {
34
+ label,
35
+ version,
36
+ installations: [...installations],
37
+ dependents: [],
38
+ mergesInto: undefined,
39
+ direction: undefined,
40
+ });
41
+ }
42
+ return [...byLabel.values()].toSorted((groupA, groupB) => {
43
+ if (groupA.version === undefined || groupB.version === undefined) {
44
+ return groupA.version === groupB.version
45
+ ? 0
46
+ : Number(groupA.version === undefined) -
47
+ Number(groupB.version === undefined);
48
+ }
49
+ return compareVersionsDescending(groupA.version, groupB.version);
50
+ });
51
+ };
52
+ // A resolution with no npm version — a `patch:` install, a tarball, a git url —
53
+ // is its own group, labelled by the resolution string. A requester that declared
54
+ // it is filed there by that same string, there being no version to file it under.
55
+ const byResolutionOf = (view, groups) => {
56
+ const byLabel = new Map(groups.map((group) => [group.label, group]));
57
+ return new Map(view.resolutions.flatMap(({ resolution, version }) => {
58
+ const group = byLabel.get(version ?? resolution);
59
+ return group ? [[resolution, group]] : [];
60
+ }));
61
+ };
62
+ const byVersionOf = (groups) => new Map(groups
63
+ .filter((group) => group.version !== undefined)
64
+ .map((group) => [group.version, group]));
65
+ const applyMerges = (byVersion, view, cluster) => {
66
+ for (const { from, to, direction } of view.dedupe) {
67
+ for (const version of from) {
68
+ const group = byVersion.get(version);
69
+ if (!group)
70
+ continue;
71
+ group.mergesInto = to;
72
+ group.direction = direction;
73
+ }
74
+ }
75
+ // A family only converges as a whole, so a member the cluster pass covers
76
+ // collapses onto the family's target even though nothing about the package
77
+ // alone says so.
78
+ if (view.dedupe.length > 0 || cluster === undefined)
79
+ return;
80
+ if (!byVersion.has(cluster.target))
81
+ return;
82
+ for (const group of byVersion.values()) {
83
+ if (group.version === cluster.target)
84
+ continue;
85
+ group.mergesInto = cluster.target;
86
+ group.direction = cluster.direction;
87
+ }
88
+ };
89
+ const analysePackage = (view, cluster) => {
90
+ const groups = toGroups(view);
91
+ const byVersion = byVersionOf(groups);
92
+ const byResolution = byResolutionOf(view, groups);
93
+ // A package the lockfile resolves once leaves nothing to attribute: whatever
94
+ // got a copy got that one. Peer ranges arrive with no resolved version of
95
+ // their own — the version a peer requester was handed is its parent's
96
+ // business — and filing twenty of them under "(resolved version unknown)"
97
+ // next to a single resolution reads as missing data instead of the one thing
98
+ // that is certain. A range the sole version does not satisfy still belongs
99
+ // there: an unmet peer is a warning the package manager already gave, not a
100
+ // second copy. Only a lone versioned group qualifies — a second resolution,
101
+ // even an unversioned git url or tarball, makes it a guess again.
102
+ const soleGroup = groups.length === 1 && groups[0].version !== undefined
103
+ ? groups[0]
104
+ : undefined;
105
+ const groupOf = (dependent) => {
106
+ if (dependent.resolvedResolution !== undefined) {
107
+ return byResolution.get(dependent.resolvedResolution);
108
+ }
109
+ if (dependent.resolvedVersion !== undefined) {
110
+ return byVersion.get(dependent.resolvedVersion) ?? soleGroup;
111
+ }
112
+ return soleGroup;
113
+ };
114
+ const unattributed = [];
115
+ for (const dependent of view.dependents) {
116
+ const group = groupOf(dependent);
117
+ if (group)
118
+ group.dependents.push(dependent);
119
+ else
120
+ unattributed.push(dependent);
121
+ }
122
+ applyMerges(byVersion, view, cluster);
123
+ const after = [
124
+ ...new Set(groups.map((group) => group.mergesInto ?? group.label)),
125
+ ].toSorted(compareVersionsDescending);
126
+ return { groups, unattributed, after };
127
+ };
128
+ const merges = ({ groups }) => groups.some((group) => group.mergesInto !== undefined);
129
+ /**
130
+ * What the package is left with once the merges are applied. `deduped to 3
131
+ * versions` always means three remain — never three merged away, which is the
132
+ * one reading a dedupe report cannot afford to be ambiguous about.
133
+ */
134
+ const verdictText = (color, analysis) => {
135
+ if (!merges(analysis))
136
+ return "";
137
+ const { groups, after } = analysis;
138
+ const direction = groups.find((group) => group.mergesInto !== undefined)?.direction;
139
+ if (after.length === 1) {
140
+ return `, can be deduped to ${color("green", after[0])}${directionLabel(direction)}`;
141
+ }
142
+ return `, can be deduped to ${color("green", plural(after.length, "version", "versions"))}`;
143
+ };
144
+ const renderSummaryLine = (view, analysis, nameWidth, color, log) => {
145
+ const { groups } = analysis;
146
+ const census = listText({
147
+ items: groups.map((group) => group.label),
148
+ render: (label) => color("yellow", label),
149
+ more: (rest) => color("dim", `, +${rest} more`),
150
+ });
151
+ const installations = groups.reduce((total, group) => total + group.installations.length, 0);
152
+ // with a single version the census says nothing about why the package is
153
+ // listed; the install paths are what make it a duplicate
154
+ const paths = groups.length === 1 && installations > 1
155
+ ? color("dim", ` installed at ${plural(installations, "path", "paths")}`)
156
+ : "";
157
+ log(`- ${stylePackageName(color, view.packageName)}${padTo(nameWidth, view.packageName)} resolved to ${plural(groups.length, "version", "versions")} (${census})${paths}${verdictText(color, analysis)}`);
158
+ };
159
+ const dependentLine = (dependent, requesterWidth, color) => ` - ${stylePackageReference(color, dependent.requester)}${padTo(requesterWidth, dependent.requester)} requires ${color("yellow", `"${dependent.range}"`)}${dependent.peer ? color("dim", " (peer)") : ""}`;
160
+ const renderGroup = (group, requesterWidth, color, log) => {
161
+ const merge = group.mergesInto === undefined
162
+ ? ""
163
+ : ` ${color("dim", "can be deduped to")} ${color("green", group.mergesInto)}${directionLabel(group.direction)}`;
164
+ log(` ${stylePackageReference(color, group.label)}${merge}`);
165
+ for (const dependent of group.dependents) {
166
+ log(dependentLine(dependent, requesterWidth, color));
167
+ }
168
+ if (group.dependents.length === 0) {
169
+ log(` ${color("dim", "(no semver range recorded for it)")}`);
170
+ }
171
+ // install paths are long, and the reader is here for the ranges: a handful
172
+ // locates the copy, the rest is counted
173
+ if (group.installations.length > 1) {
174
+ log(` ${color("dim", "installed at:")} ${listText({
175
+ items: group.installations,
176
+ render: (location) => stylePackageReference(color, location),
177
+ limit: 3,
178
+ more: (rest) => color("dim", `, +${rest} more`),
179
+ })}`);
180
+ }
181
+ };
182
+ const renderPackageDetails = (view, analysis, clusterIndex, color, log) => {
183
+ const { groups, unattributed } = analysis;
184
+ const cluster = clusterIndex === undefined
185
+ ? ""
186
+ : color("dim", ` (cluster ${clusterIndex})`);
187
+ log();
188
+ log(`${stylePackageName(color, view.packageName, ["bold", "packageName"])} — ${plural(groups.length, "version", "versions")}${verdictText(color, analysis)}${cluster}`);
189
+ const requesterWidth = columnWidth(view.dependents.map((dependent) => dependent.requester));
190
+ for (const group of groups) {
191
+ renderGroup(group, requesterWidth, color, log);
192
+ }
193
+ if (unattributed.length > 0) {
194
+ log(` ${color("dim", unattributedLabel)}`);
195
+ for (const dependent of unattributed) {
196
+ log(dependentLine(dependent, requesterWidth, color));
197
+ }
198
+ }
199
+ };
200
+ // a workspace importer has no npm name; it is the one requester named by role
201
+ const constraintName = (requesterName) => requesterName ?? "workspace";
202
+ const constraintText = (color, requesterName) => requesterName === undefined
203
+ ? color("dim", "workspace")
204
+ : stylePackageName(color, requesterName);
205
+ const nameList = (color, names) => names.map((name) => stylePackageName(color, name)).join(", ");
206
+ // highest version first, whatever could not be attributed to one last
207
+ const compareGroupLabels = (labelA, labelB) => {
208
+ if (labelA === labelB)
209
+ return 0;
210
+ if (labelA === unattributedLabel)
211
+ return 1;
212
+ if (labelB === unattributedLabel)
213
+ return -1;
214
+ return compareVersionsDescending(labelA, labelB);
215
+ };
216
+ /**
217
+ * The third-party ranges bearing on the family, filed under the version each of
218
+ * them resolved to — the same shape a package's own resolutions take, because it
219
+ * answers the same question: which requester keeps which copy alive.
220
+ */
221
+ const renderExternalResolutions = (constraints, color, log) => {
222
+ const byVersion = new Map();
223
+ for (const constraint of constraints) {
224
+ const label = constraint.resolvedVersion ?? unattributedLabel;
225
+ const group = byVersion.get(label);
226
+ if (group)
227
+ group.push(constraint);
228
+ else
229
+ byVersion.set(label, [constraint]);
230
+ }
231
+ const labels = [...byVersion.keys()].toSorted(compareGroupLabels);
232
+ const width = columnWidth(constraints.map((constraint) => constraintName(constraint.requesterName)));
233
+ log(` ${color("dim", "Resolutions (external):")}`);
234
+ for (const label of labels) {
235
+ log(` ${label === unattributedLabel ? color("dim", label) : stylePackageReference(color, label)}`);
236
+ for (const constraint of byVersion.get(label)) {
237
+ log(` - ${constraintText(color, constraint.requesterName)}${padTo(width, constraintName(constraint.requesterName))} requires ${stylePackageName(color, constraint.packageName)} ${color("yellow", `"${constraint.range}"`)}`);
238
+ }
239
+ }
240
+ };
241
+ const renderCluster = (fix, index, color, log) => {
242
+ const fixable = fix.applicable ? fix.convergentMembers.length : 0;
243
+ const counts = [
244
+ plural(fix.members.length, "package", "packages"),
245
+ `${fix.duplicatedMembers.length} duplicated`,
246
+ `${fixable} fixable`,
247
+ ].join(", ");
248
+ log();
249
+ log(`cluster ${index} — ${color(["bold", "cyan"], clusterLabel(fix.members))} [${counts}]:`);
250
+ log(` ${color("dim", "Members:")}`);
251
+ const width = columnWidth(fix.members);
252
+ for (const member of fix.members) {
253
+ const installed = fix.memberVersions[member];
254
+ const versions = color("yellow", installed?.versions.join(", ") ?? "");
255
+ const nonNpm = installed && installed.nonNpmCount > 0
256
+ ? color("dim", ` (+${installed.nonNpmCount} non-npm)`)
257
+ : "";
258
+ log(` - ${stylePackageName(color, member)}${padTo(width, member)} ${versions}${nonNpm}`);
259
+ }
260
+ if (fix.applicable && fix.target !== null) {
261
+ log(` ${color("dim", "Dedupe:")} ${color("green", fix.target)}${directionLabel(fix.direction)}`);
262
+ if (fix.driverMembers.length > 0) {
263
+ const followers = fix.convergentMembers.length - fix.driverMembers.length;
264
+ const follow = followers > 0
265
+ ? color("dim", ` (${plural(followers, "member follows", "members follow")})`)
266
+ : "";
267
+ log(` ${color("dim", "Driven by:")} ${nameList(color, fix.driverMembers)}${follow}`);
268
+ }
269
+ // nothing pins these, so the package manager picks their version: the
270
+ // fixable count above is not a guarantee for them
271
+ if (fix.floatingMembers.length > 0) {
272
+ log(` ${color("dim", "Resolver picks:")} ${nameList(color, fix.floatingMembers)}`);
273
+ }
274
+ }
275
+ if (fix.excludedMembers.length > 0) {
276
+ log(` ${color("dim", "Remaining duplicates:")}`);
277
+ for (const excluded of fix.excludedMembers) {
278
+ const blockers = excluded.blockedBy
279
+ .map((constraint) => `${constraintText(color, constraint.requesterName)} requires ${color("yellow", `"${constraint.range}"`)}`)
280
+ .join(", ");
281
+ log(` - ${stylePackageName(color, excluded.packageName, ["red"])}: ${blockers}`);
282
+ }
283
+ }
284
+ if (fix.reuseFixes.length > 0) {
285
+ log(` ${color("dim", `Open ranges not reusing the pinned ${fix.anchor ?? ""}:`)}`);
286
+ for (const reuse of fix.reuseFixes) {
287
+ log(` - ${constraintText(color, reuse.requesterName)} requires ${stylePackageName(color, reuse.packageName)} ${color("yellow", `"${reuse.range}"`)}, resolved ${color("yellow", reuse.from)} -> would pin ${color("green", reuse.to)}`);
288
+ }
289
+ }
290
+ if (fix.externalConstraints.length > 0) {
291
+ renderExternalResolutions(fix.externalConstraints, color, log);
292
+ }
293
+ };
294
+ // What a family converges its members onto, for the packages whose own
295
+ // resolutions say nothing about it.
296
+ const clusterConvergences = (clusterFixes) => {
297
+ const convergences = new Map();
298
+ for (const fix of clusterFixes) {
299
+ if (!fix.applicable || fix.target === null)
300
+ continue;
301
+ for (const member of fix.convergentMembers) {
302
+ if (convergences.has(member))
303
+ continue;
304
+ convergences.set(member, {
305
+ target: fix.target,
306
+ direction: fix.direction,
307
+ });
308
+ }
309
+ }
310
+ return convergences;
311
+ };
312
+ export const renderDuplicatesReport = ({ title, packages, notice, totalDependencies, clusterFixes = [], dedupeCommand, whyCommand, details = false, color: colorEnabled = shouldColorize(), log = console.log, }) => {
313
+ const color = createColorize(colorEnabled);
314
+ const titleSingular = title === "duplicates" ? "duplicate" : "match";
315
+ if (notice !== undefined) {
316
+ log(notice);
317
+ }
318
+ else if (packages.length === 0) {
319
+ log("No duplicates found");
320
+ }
321
+ else {
322
+ log(`Found ${plural(packages.length, titleSingular, title)}:`);
323
+ }
324
+ // a cluster of one carries no family to explain: it is rendered as the
325
+ // package's own fix, in its own block
326
+ const clusters = clusterFixes.filter((fix) => fix.duplicatedMembers.length > 0 && fix.members.length > 1);
327
+ const clusterIndexes = new Map();
328
+ clusters.forEach((fix, index) => {
329
+ for (const member of fix.members) {
330
+ if (!clusterIndexes.has(member))
331
+ clusterIndexes.set(member, index + 1);
332
+ }
333
+ });
334
+ const convergences = clusterConvergences(clusterFixes);
335
+ const analyses = packages.map((view) => ({
336
+ view,
337
+ analysis: analysePackage(view, convergences.get(view.packageName)),
338
+ }));
339
+ if (details) {
340
+ for (const { view, analysis } of analyses) {
341
+ renderPackageDetails(view, analysis, clusterIndexes.get(view.packageName), color, log);
342
+ }
343
+ if (clusters.length > 0) {
344
+ log();
345
+ log(color("dim", "Lockstep clusters:"));
346
+ for (const line of clusterExplanation) {
347
+ log(` ${color("dim", line)}`);
348
+ }
349
+ clusters.forEach((fix, index) => {
350
+ renderCluster(fix, index + 1, color, log);
351
+ });
352
+ }
353
+ }
354
+ else if (analyses.length > 0) {
355
+ const nameWidth = columnWidth(packages.map((view) => view.packageName));
356
+ log();
357
+ for (const { view, analysis } of analyses) {
358
+ renderSummaryLine(view, analysis, nameWidth, color, log);
359
+ }
360
+ }
361
+ const dedupable = analyses.filter(({ analysis }) => merges(analysis)).length;
362
+ log();
363
+ if (dedupable === 0) {
364
+ log(`Found ${plural(totalDependencies, "dependency", "dependencies")}, ${plural(packages.length, titleSingular, title)}, 0 dedupable.`);
365
+ }
366
+ else {
367
+ // Merging a package collapses its own dependency edges too, so a run can
368
+ // remove copies no per-package fix predicted: the count is a floor.
369
+ log(`Found ${plural(totalDependencies, "dependency", "dependencies")}, ${plural(packages.length, titleSingular, title)}, at least ${dedupable} dedupable (deduping may remove more). Run ${color("cyan", `\`${dedupeCommand}\``)} to apply.`);
370
+ }
371
+ if (!details && whyCommand !== undefined && packages.length > 0) {
372
+ log(`Run ${color("cyan", `\`${whyCommand} --details\``)} to see every dependent.`);
373
+ }
374
+ };
375
+ //# sourceMappingURL=renderDuplicatesReport.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"renderDuplicatesReport.js","sourceRoot":"","sources":["../src/renderDuplicatesReport.ts"],"names":[],"mappings":"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"}