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,91 @@
1
+ import semver from "semver";
2
+ export const PackageDescriptorNameUtils = {
3
+ parse: (value) => {
4
+ if (value.startsWith("@")) {
5
+ const [scope, name] = value.slice(1).split("/", 2);
6
+ if (`@${scope}/${name}` !== value) {
7
+ throw new Error(`Invalid package name with scope: ${value} (expecting ${scope}/${name})`);
8
+ }
9
+ return { scope, name };
10
+ }
11
+ return { name: value };
12
+ },
13
+ stringify: (descriptor) => {
14
+ return descriptor.scope === undefined
15
+ ? descriptor.name
16
+ : `@${descriptor.scope}/${descriptor.name}`;
17
+ },
18
+ };
19
+ /**
20
+ * `git+ssh` and `https` keep their whole prefix rather than collapsing to `git`
21
+ * or being dropped: the round trip through `stringify` has to reproduce the
22
+ * declaration byte for byte, and nothing downstream branches on which flavour
23
+ * of git url it is.
24
+ */
25
+ const protocolPattern = /^([a-z][a-z0-9+.-]*):/u;
26
+ const extractProtocol = (dependencyValue) => {
27
+ const match = protocolPattern.exec(dependencyValue);
28
+ if (!match)
29
+ return { protocol: undefined, rest: dependencyValue };
30
+ return { protocol: match[1], rest: dependencyValue.slice(match[0].length) };
31
+ };
32
+ /**
33
+ * An `npm:` value is either a range (`npm:^1.0.0`, yarn's spelling) or an alias
34
+ * naming another package (`npm:semver@^6.0.0`, `npm:@types/bun`). Semver tells
35
+ * them apart: an alias target is never a valid range. A nameless alias keeps an
36
+ * empty selector, which `semver` already reads as `*`.
37
+ */
38
+ const parseAlias = (rest) => {
39
+ if (semver.validRange(rest) !== null)
40
+ return undefined;
41
+ const separatorIndex = rest.startsWith("@")
42
+ ? rest.indexOf("@", 1)
43
+ : rest.indexOf("@");
44
+ return separatorIndex === -1
45
+ ? { npmName: rest, selector: "" }
46
+ : {
47
+ npmName: rest.slice(0, separatorIndex),
48
+ selector: rest.slice(separatorIndex + 1),
49
+ };
50
+ };
51
+ export const PackageDependencyDescriptorUtils = {
52
+ make: (descriptor, selector) => ({ ...descriptor, selector }),
53
+ /**
54
+ * The `Protocol` union declares what a given lockfile can contain; `parse`
55
+ * does not enforce it. An unknown protocol has to parse, because
56
+ * `manifestKeyOf` reads every sibling declaration in a dependency block to
57
+ * find the one it edits — throwing on a neighbour would abort an unrelated
58
+ * rewrite. It still lands in `protocol` rather than being folded into the
59
+ * selector, so `isNpmProtocol` keeps it out of the npm comparisons.
60
+ */
61
+ parse: (dependencyKey, dependencyValue) => {
62
+ const { protocol, rest } = extractProtocol(dependencyValue);
63
+ const alias = protocol === "npm" ? parseAlias(rest) : undefined;
64
+ const npmName = alias?.npmName ?? dependencyKey;
65
+ return {
66
+ key: dependencyKey,
67
+ npmName,
68
+ nameDescriptor: PackageDescriptorNameUtils.parse(npmName),
69
+ protocol: protocol,
70
+ isAlias: alias !== undefined,
71
+ selector: alias?.selector ?? rest,
72
+ };
73
+ },
74
+ stringify: ({ key, npmName, protocol, isAlias, selector, }) => {
75
+ const target = (() => {
76
+ if (!isAlias)
77
+ return selector;
78
+ return selector === "" ? npmName : `${npmName}@${selector}`;
79
+ })();
80
+ return [key, protocol === undefined ? target : `${protocol}:${target}`];
81
+ },
82
+ };
83
+ export const isNpmProtocol = (protocol) => protocol === undefined || protocol === "npm";
84
+ /**
85
+ * The guard to use before handing a selector to semver. A protocol check alone
86
+ * is not enough: shorthand declarations carry no prefix at all (`user/repo`,
87
+ * `./local`, `git@host:o/r.git`) and would otherwise read as npm ranges.
88
+ */
89
+ export const isSemverComparable = (descriptor) => isNpmProtocol(descriptor.protocol) &&
90
+ semver.validRange(descriptor.selector) !== null;
91
+ //# sourceMappingURL=packageDependenciesUtils.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"packageDependenciesUtils.js","sourceRoot":"","sources":["../src/packageDependenciesUtils.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,539 @@
1
+ import { describe, expect, it } from "bun:test";
2
+ import { PackageDependencyDescriptorUtils, isNpmProtocol, isSemverComparable, } from "./packageDependenciesUtils.js";
3
+ const npmCases = [
4
+ [
5
+ ["name", "1.1.1"],
6
+ {
7
+ key: "name",
8
+ npmName: "name",
9
+ nameDescriptor: { name: "name" },
10
+ protocol: undefined,
11
+ isAlias: false,
12
+ selector: "1.1.1",
13
+ },
14
+ ],
15
+ [
16
+ ["name", "^1.0.0"],
17
+ {
18
+ key: "name",
19
+ npmName: "name",
20
+ nameDescriptor: { name: "name" },
21
+ protocol: undefined,
22
+ isAlias: false,
23
+ selector: "^1.0.0",
24
+ },
25
+ ],
26
+ [
27
+ ["name", "1.0.0 - 2.0.0"],
28
+ {
29
+ key: "name",
30
+ npmName: "name",
31
+ nameDescriptor: { name: "name" },
32
+ protocol: undefined,
33
+ isAlias: false,
34
+ selector: "1.0.0 - 2.0.0",
35
+ },
36
+ ],
37
+ [
38
+ ["name", ">=1"],
39
+ {
40
+ key: "name",
41
+ npmName: "name",
42
+ nameDescriptor: { name: "name" },
43
+ protocol: undefined,
44
+ isAlias: false,
45
+ selector: ">=1",
46
+ },
47
+ ],
48
+ [
49
+ ["name", "*"],
50
+ {
51
+ key: "name",
52
+ npmName: "name",
53
+ nameDescriptor: { name: "name" },
54
+ protocol: undefined,
55
+ isAlias: false,
56
+ selector: "*",
57
+ },
58
+ ],
59
+ [
60
+ ["name", ""],
61
+ {
62
+ key: "name",
63
+ npmName: "name",
64
+ nameDescriptor: { name: "name" },
65
+ protocol: undefined,
66
+ isAlias: false,
67
+ selector: "",
68
+ },
69
+ ],
70
+ [
71
+ ["@scope/name", "^1.0.0"],
72
+ {
73
+ key: "@scope/name",
74
+ npmName: "@scope/name",
75
+ nameDescriptor: { scope: "scope", name: "name" },
76
+ protocol: undefined,
77
+ isAlias: false,
78
+ selector: "^1.0.0",
79
+ },
80
+ ],
81
+ // yarn's spelling: `npm:` as a plain protocol on a range, not an alias
82
+ [
83
+ ["name", "npm:^1.0.0"],
84
+ {
85
+ key: "name",
86
+ npmName: "name",
87
+ nameDescriptor: { name: "name" },
88
+ protocol: "npm",
89
+ isAlias: false,
90
+ selector: "^1.0.0",
91
+ },
92
+ ],
93
+ [
94
+ ["name", "npm:*"],
95
+ {
96
+ key: "name",
97
+ npmName: "name",
98
+ nameDescriptor: { name: "name" },
99
+ protocol: "npm",
100
+ isAlias: false,
101
+ selector: "*",
102
+ },
103
+ ],
104
+ ];
105
+ const aliasCases = [
106
+ [
107
+ ["name3", "npm:name@1.1.1"],
108
+ {
109
+ key: "name3",
110
+ npmName: "name",
111
+ nameDescriptor: { name: "name" },
112
+ protocol: "npm",
113
+ isAlias: true,
114
+ selector: "1.1.1",
115
+ },
116
+ ],
117
+ [
118
+ ["name2", "npm:@scope/name@1.1.1"],
119
+ {
120
+ key: "name2",
121
+ npmName: "@scope/name",
122
+ nameDescriptor: { scope: "scope", name: "name" },
123
+ protocol: "npm",
124
+ isAlias: true,
125
+ selector: "1.1.1",
126
+ },
127
+ ],
128
+ [
129
+ ["psc", "npm:printable-shell-command@^5.0.0"],
130
+ {
131
+ key: "psc",
132
+ npmName: "printable-shell-command",
133
+ nameDescriptor: { name: "printable-shell-command" },
134
+ protocol: "npm",
135
+ isAlias: true,
136
+ selector: "^5.0.0",
137
+ },
138
+ ],
139
+ // a version-less alias: bun's own `non-npm` fixture declares this shape
140
+ [
141
+ ["bun-types", "npm:@types/bun"],
142
+ {
143
+ key: "bun-types",
144
+ npmName: "@types/bun",
145
+ nameDescriptor: { scope: "types", name: "bun" },
146
+ protocol: "npm",
147
+ isAlias: true,
148
+ selector: "",
149
+ },
150
+ ],
151
+ [
152
+ ["tag", "npm:latest"],
153
+ {
154
+ key: "tag",
155
+ npmName: "latest",
156
+ nameDescriptor: { name: "latest" },
157
+ protocol: "npm",
158
+ isAlias: true,
159
+ selector: "",
160
+ },
161
+ ],
162
+ // an alias whose key already matches the target: `isAlias` is what keeps the
163
+ // name in the value, since `npmName === key` cannot tell the two apart
164
+ [
165
+ ["semver", "npm:semver@^6.0.0"],
166
+ {
167
+ key: "semver",
168
+ npmName: "semver",
169
+ nameDescriptor: { name: "semver" },
170
+ protocol: "npm",
171
+ isAlias: true,
172
+ selector: "^6.0.0",
173
+ },
174
+ ],
175
+ ];
176
+ const otherProtocolCases = [
177
+ [
178
+ ["name", "workspace:*"],
179
+ {
180
+ key: "name",
181
+ npmName: "name",
182
+ nameDescriptor: { name: "name" },
183
+ protocol: "workspace",
184
+ isAlias: false,
185
+ selector: "*",
186
+ },
187
+ ],
188
+ [
189
+ ["name", "workspace:^1.0.0"],
190
+ {
191
+ key: "name",
192
+ npmName: "name",
193
+ nameDescriptor: { name: "name" },
194
+ protocol: "workspace",
195
+ isAlias: false,
196
+ selector: "^1.0.0",
197
+ },
198
+ ],
199
+ [
200
+ ["name", "file:../local"],
201
+ {
202
+ key: "name",
203
+ npmName: "name",
204
+ nameDescriptor: { name: "name" },
205
+ protocol: "file",
206
+ isAlias: false,
207
+ selector: "../local",
208
+ },
209
+ ],
210
+ [
211
+ ["name", "link:../local"],
212
+ {
213
+ key: "name",
214
+ npmName: "name",
215
+ nameDescriptor: { name: "name" },
216
+ protocol: "link",
217
+ isAlias: false,
218
+ selector: "../local",
219
+ },
220
+ ],
221
+ [
222
+ ["name", "github:user/repo"],
223
+ {
224
+ key: "name",
225
+ npmName: "name",
226
+ nameDescriptor: { name: "name" },
227
+ protocol: "github",
228
+ isAlias: false,
229
+ selector: "user/repo",
230
+ },
231
+ ],
232
+ [
233
+ ["name", "github:user/repo#semver:^1"],
234
+ {
235
+ key: "name",
236
+ npmName: "name",
237
+ nameDescriptor: { name: "name" },
238
+ protocol: "github",
239
+ isAlias: false,
240
+ selector: "user/repo#semver:^1",
241
+ },
242
+ ],
243
+ [
244
+ ["name", "jsr:^1.0.0"],
245
+ {
246
+ key: "name",
247
+ npmName: "name",
248
+ nameDescriptor: { name: "name" },
249
+ protocol: "jsr",
250
+ isAlias: false,
251
+ selector: "^1.0.0",
252
+ },
253
+ ],
254
+ [
255
+ ["name", "catalog:default"],
256
+ {
257
+ key: "name",
258
+ npmName: "name",
259
+ nameDescriptor: { name: "name" },
260
+ protocol: "catalog",
261
+ isAlias: false,
262
+ selector: "default",
263
+ },
264
+ ],
265
+ [
266
+ ["name", "patch:name@npm%3A1.0.0#~/p.patch"],
267
+ {
268
+ key: "name",
269
+ npmName: "name",
270
+ nameDescriptor: { name: "name" },
271
+ protocol: "patch",
272
+ isAlias: false,
273
+ selector: "name@npm%3A1.0.0#~/p.patch",
274
+ },
275
+ ],
276
+ [
277
+ ["name", "portal:../local"],
278
+ {
279
+ key: "name",
280
+ npmName: "name",
281
+ nameDescriptor: { name: "name" },
282
+ protocol: "portal",
283
+ isAlias: false,
284
+ selector: "../local",
285
+ },
286
+ ],
287
+ // a git url keeps its whole prefix so the round trip is byte-exact
288
+ [
289
+ ["name", "git+ssh://git@host/r.git#v1"],
290
+ {
291
+ key: "name",
292
+ npmName: "name",
293
+ nameDescriptor: { name: "name" },
294
+ protocol: "git+ssh",
295
+ isAlias: false,
296
+ selector: "//git@host/r.git#v1",
297
+ },
298
+ ],
299
+ [
300
+ ["name", "git+https://host/r.git"],
301
+ {
302
+ key: "name",
303
+ npmName: "name",
304
+ nameDescriptor: { name: "name" },
305
+ protocol: "git+https",
306
+ isAlias: false,
307
+ selector: "//host/r.git",
308
+ },
309
+ ],
310
+ [
311
+ ["name", "https://registry.npmjs.org/react/-/react-18.2.0.tgz"],
312
+ {
313
+ key: "name",
314
+ npmName: "name",
315
+ nameDescriptor: { name: "name" },
316
+ protocol: "https",
317
+ isAlias: false,
318
+ selector: "//registry.npmjs.org/react/-/react-18.2.0.tgz",
319
+ },
320
+ ],
321
+ // an unrecognised protocol parses rather than throwing, and stays out of npm
322
+ [
323
+ ["name", "someproto:whatever"],
324
+ {
325
+ key: "name",
326
+ npmName: "name",
327
+ nameDescriptor: { name: "name" },
328
+ protocol: "someproto",
329
+ isAlias: false,
330
+ selector: "whatever",
331
+ },
332
+ ],
333
+ ];
334
+ // no protocol-shaped prefix at position 0: `/`, `#`, `@` and `.` all stop the
335
+ // match, so these must not acquire a protocol
336
+ const shorthandCases = [
337
+ [
338
+ ["name", "user/repo"],
339
+ {
340
+ key: "name",
341
+ npmName: "name",
342
+ nameDescriptor: { name: "name" },
343
+ protocol: undefined,
344
+ isAlias: false,
345
+ selector: "user/repo",
346
+ },
347
+ ],
348
+ [
349
+ ["name", "user/repo#semver:^1"],
350
+ {
351
+ key: "name",
352
+ npmName: "name",
353
+ nameDescriptor: { name: "name" },
354
+ protocol: undefined,
355
+ isAlias: false,
356
+ selector: "user/repo#semver:^1",
357
+ },
358
+ ],
359
+ [
360
+ ["name", "./local/path"],
361
+ {
362
+ key: "name",
363
+ npmName: "name",
364
+ nameDescriptor: { name: "name" },
365
+ protocol: undefined,
366
+ isAlias: false,
367
+ selector: "./local/path",
368
+ },
369
+ ],
370
+ [
371
+ ["name", "git@github.com:moment/moment.git"],
372
+ {
373
+ key: "name",
374
+ npmName: "name",
375
+ nameDescriptor: { name: "name" },
376
+ protocol: undefined,
377
+ isAlias: false,
378
+ selector: "git@github.com:moment/moment.git",
379
+ },
380
+ ],
381
+ [
382
+ ["name", "latest"],
383
+ {
384
+ key: "name",
385
+ npmName: "name",
386
+ nameDescriptor: { name: "name" },
387
+ protocol: undefined,
388
+ isAlias: false,
389
+ selector: "latest",
390
+ },
391
+ ],
392
+ ];
393
+ const allCases = [
394
+ ...npmCases,
395
+ ...aliasCases,
396
+ ...otherProtocolCases,
397
+ ...shorthandCases,
398
+ ];
399
+ const expectParsed = (cases) => {
400
+ for (const [[key, value], expected] of cases) {
401
+ expect(PackageDependencyDescriptorUtils.parse(key, value)).toEqual(expected);
402
+ }
403
+ };
404
+ describe("PackageDependencyDescriptorUtils.parse", () => {
405
+ it("parses npm ranges", () => {
406
+ expectParsed(npmCases);
407
+ });
408
+ it("parses aliases", () => {
409
+ expectParsed(aliasCases);
410
+ });
411
+ it("parses the other protocols", () => {
412
+ expectParsed(otherProtocolCases);
413
+ });
414
+ it("parses declarations carrying no protocol", () => {
415
+ expectParsed(shorthandCases);
416
+ });
417
+ it("rejects a scoped name without a segment", () => {
418
+ expect(() => PackageDependencyDescriptorUtils.parse("name", "npm:@scope")).toThrow("Invalid package name with scope");
419
+ });
420
+ it("does not read an alias out of a non-npm protocol", () => {
421
+ expect(PackageDependencyDescriptorUtils.parse("name", "workspace:@scope/x@1")).toEqual({
422
+ key: "name",
423
+ npmName: "name",
424
+ nameDescriptor: { name: "name" },
425
+ protocol: "workspace",
426
+ isAlias: false,
427
+ selector: "@scope/x@1",
428
+ });
429
+ });
430
+ });
431
+ describe("PackageDependencyDescriptorUtils.stringify", () => {
432
+ it("round trips every declaration byte for byte", () => {
433
+ for (const [[key, value]] of allCases) {
434
+ expect(PackageDependencyDescriptorUtils.stringify(PackageDependencyDescriptorUtils.parse(key, value))).toEqual([key, value]);
435
+ }
436
+ });
437
+ });
438
+ describe("PackageDependencyDescriptorUtils.make", () => {
439
+ const swaps = [
440
+ [["name", "^1.0.0"], "2.0.0", "2.0.0"],
441
+ [["name", "npm:^1.0.0"], "^2.0.0", "npm:^2.0.0"],
442
+ [["name", "workspace:^1.0.0"], "^2.0.0", "workspace:^2.0.0"],
443
+ [
444
+ ["psc", "npm:printable-shell-command@^5.0.0"],
445
+ "^5.3.0",
446
+ "npm:printable-shell-command@^5.3.0",
447
+ ],
448
+ [["semver", "npm:semver@^6.0.0"], "^7.0.0", "npm:semver@^7.0.0"],
449
+ [["bun-types", "npm:@types/bun"], "^1.0.0", "npm:@types/bun@^1.0.0"],
450
+ ];
451
+ it("swaps the selector and keeps the protocol, the key and the alias target", () => {
452
+ for (const [[key, value], selector, expected] of swaps) {
453
+ expect(PackageDependencyDescriptorUtils.stringify(PackageDependencyDescriptorUtils.make(PackageDependencyDescriptorUtils.parse(key, value), selector))).toEqual([key, expected]);
454
+ }
455
+ });
456
+ });
457
+ describe("isNpmProtocol", () => {
458
+ it("accepts a bare declaration and the npm protocol", () => {
459
+ expect(isNpmProtocol(undefined)).toBe(true);
460
+ expect(isNpmProtocol("npm")).toBe(true);
461
+ });
462
+ it("rejects every other protocol", () => {
463
+ for (const protocol of [
464
+ "workspace",
465
+ "file",
466
+ "link",
467
+ "github",
468
+ "git",
469
+ "git+ssh",
470
+ "https",
471
+ "jsr",
472
+ "catalog",
473
+ "patch",
474
+ "portal",
475
+ "someproto",
476
+ // this parser strips the colon, unlike yarn's `structUtils.parseRange`
477
+ "npm:",
478
+ ]) {
479
+ expect(isNpmProtocol(protocol)).toBe(false);
480
+ }
481
+ });
482
+ });
483
+ describe("isSemverComparable", () => {
484
+ const comparableOf = (key, value) => isSemverComparable(PackageDependencyDescriptorUtils.parse(key, value));
485
+ it("accepts npm ranges, aliases included", () => {
486
+ for (const value of [
487
+ "^1.0.0",
488
+ "1.x",
489
+ "1.0.0 - 2.0.0",
490
+ ">=1",
491
+ "*",
492
+ "npm:^1.0.0",
493
+ "npm:pkg@^1.0.0",
494
+ ]) {
495
+ expect(comparableOf("name", value)).toBe(true);
496
+ }
497
+ });
498
+ // a version-less alias accepts any version, and `semver` reads an empty range
499
+ // as `*`, so it needs no special case
500
+ it("accepts a version-less alias", () => {
501
+ expect(comparableOf("bun-types", "npm:@types/bun")).toBe(true);
502
+ });
503
+ it("rejects every non-npm protocol", () => {
504
+ for (const value of [
505
+ "workspace:*",
506
+ "workspace:^1.0.0",
507
+ "file:../l",
508
+ "link:../l",
509
+ "jsr:^1.0.0",
510
+ "catalog:default",
511
+ "github:user/repo",
512
+ "git+ssh://git@host/r.git",
513
+ "portal:../l",
514
+ "someproto:x",
515
+ ]) {
516
+ expect(comparableOf("name", value)).toBe(false);
517
+ }
518
+ });
519
+ // the cases a protocol check alone would let through
520
+ it("rejects shorthand declarations that carry no protocol", () => {
521
+ for (const value of [
522
+ "user/repo",
523
+ "user/repo#semver:^1",
524
+ "./local/path",
525
+ "git@github.com:moment/moment.git",
526
+ "https://host/x.tgz",
527
+ ]) {
528
+ expect(comparableOf("name", value)).toBe(false);
529
+ }
530
+ });
531
+ // a dist-tag accepts any version, so dropping it from the dependents is the
532
+ // same answer as counting it satisfied by everything — and far better than
533
+ // `semver.satisfies` reading it as unsatisfiable
534
+ it("rejects dist-tags", () => {
535
+ expect(comparableOf("name", "latest")).toBe(false);
536
+ expect(comparableOf("name", "next")).toBe(false);
537
+ });
538
+ });
539
+ //# sourceMappingURL=packageDependenciesUtils.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"packageDependenciesUtils.test.js","sourceRoot":"","sources":["../src/packageDependenciesUtils.test.ts"],"names":[],"mappings":"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"}