@pnpm/lockfile.preferred-versions 1100.0.33 → 1100.0.35

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/CHANGELOG.md CHANGED
@@ -1,5 +1,28 @@
1
1
  # @pnpm/lockfile.preferred-versions
2
2
 
3
+ ## 1100.0.35
4
+
5
+ ### Patch Changes
6
+
7
+ - `pnpm dedupe` now moves transitive dependencies to the version a `catalog:` dependency pins, as it already did for versions written directly in `package.json`.
8
+
9
+ - Updated dependencies:
10
+ - @pnpm/lockfile.utils@1102.1.4
11
+ - @pnpm/pkg-manifest.utils@1100.4.6
12
+ - @pnpm/resolving.resolver-base@1101.3.1
13
+ - @pnpm/types@1102.1.1
14
+
15
+ ## 1100.0.34
16
+
17
+ ### Patch Changes
18
+
19
+ - Fixed `pnpm dedupe` requiring a second pass after bumping a direct dependency in `package.json` [pnpm/pnpm#14987](https://github.com/pnpm/pnpm/issues/14987).
20
+
21
+ - Updated dependencies:
22
+ - @pnpm/lockfile.utils@1102.1.3
23
+ - @pnpm/pkg-manifest.utils@1100.4.5
24
+ - @pnpm/resolving.resolver-base@1101.3.0
25
+
3
26
  ## 1100.0.33
4
27
 
5
28
  ### Patch Changes
package/lib/index.d.ts CHANGED
@@ -1,4 +1,8 @@
1
+ import type { Catalogs } from '@pnpm/catalogs.types';
1
2
  import { type PackageSnapshots } from '@pnpm/lockfile.utils';
2
3
  import { type PreferredVersions } from '@pnpm/resolving.resolver-base';
3
4
  import type { DependencyManifest, ProjectManifest } from '@pnpm/types';
4
- export declare function getPreferredVersionsFromLockfileAndManifests(snapshots: PackageSnapshots | undefined, manifests: Array<DependencyManifest | ProjectManifest>): PreferredVersions;
5
+ export declare function getPreferredVersionsFromLockfileAndManifests(snapshots: PackageSnapshots | undefined, manifests: Array<DependencyManifest | ProjectManifest>, opts?: {
6
+ catalogs?: Catalogs;
7
+ dedupe?: boolean;
8
+ }): PreferredVersions;
package/lib/index.js CHANGED
@@ -1,8 +1,9 @@
1
+ import { resolveFromCatalog } from '@pnpm/catalogs.resolver';
1
2
  import { nameVerFromPkgSnapshot } from '@pnpm/lockfile.utils';
2
3
  import { getAllDependenciesFromManifest } from '@pnpm/pkg-manifest.utils';
3
4
  import { DIRECT_DEP_SELECTOR_WEIGHT, EXISTING_VERSION_SELECTOR_WEIGHT, } from '@pnpm/resolving.resolver-base';
4
5
  import getVersionSelectorType from 'version-selector-type';
5
- export function getPreferredVersionsFromLockfileAndManifests(snapshots, manifests) {
6
+ export function getPreferredVersionsFromLockfileAndManifests(snapshots, manifests, opts = {}) {
6
7
  // All maps in here are keyed by package names and specifiers coming from
7
8
  // manifests and the lockfile — attacker-controlled inputs. Null-prototype
8
9
  // objects make a crafted key (e.g. `__proto__`) a plain own key instead of
@@ -10,7 +11,10 @@ export function getPreferredVersionsFromLockfileAndManifests(snapshots, manifest
10
11
  const preferredVersions = Object.create(null);
11
12
  for (const manifest of manifests) {
12
13
  const specs = getAllDependenciesFromManifest(manifest);
13
- for (const [name, spec] of Object.entries(specs)) {
14
+ for (const [name, bareSpecifier] of Object.entries(specs)) {
15
+ const spec = resolveCatalogSpec(opts.catalogs ?? {}, name, bareSpecifier);
16
+ if (spec == null)
17
+ continue;
14
18
  const selector = getVersionSelectorType(spec);
15
19
  if (!selector)
16
20
  continue;
@@ -23,10 +27,24 @@ export function getPreferredVersionsFromLockfileAndManifests(snapshots, manifest
23
27
  }
24
28
  if (!snapshots)
25
29
  return preferredVersions;
26
- addPreferredVersionsFromLockfile(snapshots, preferredVersions);
30
+ // Dedupe must let newly resolved dependencies compete with lockfile versions.
31
+ addPreferredVersionsFromLockfile(snapshots, preferredVersions, opts.dedupe ? 1 : EXISTING_VERSION_SELECTOR_WEIGHT);
27
32
  return preferredVersions;
28
33
  }
29
- function addPreferredVersionsFromLockfile(snapshots, preferredVersions) {
34
+ /**
35
+ * The specifier the resolver installs for a direct dependency: the catalog
36
+ * entry a `catalog:` specifier names, otherwise the specifier itself.
37
+ * `undefined` for a `catalog:` specifier without a usable entry.
38
+ */
39
+ function resolveCatalogSpec(catalogs, alias, bareSpecifier) {
40
+ const result = resolveFromCatalog(catalogs, { alias, bareSpecifier });
41
+ switch (result.type) {
42
+ case 'found': return result.resolution.specifier;
43
+ case 'misconfiguration': return undefined;
44
+ case 'unused': return bareSpecifier;
45
+ }
46
+ }
47
+ function addPreferredVersionsFromLockfile(snapshots, preferredVersions, weight) {
30
48
  // The snapshots object can contain multiple entries with the same package
31
49
  // name and version. This is because a dependency can appear multiple times
32
50
  // with the same version in the lockfile due to peer dependency resolution. To
@@ -43,7 +61,7 @@ function addPreferredVersionsFromLockfile(snapshots, preferredVersions) {
43
61
  preferredVersions[name] ??= Object.create(null);
44
62
  const existingSelector = preferredVersions[name][version];
45
63
  if (existingSelector == null) {
46
- preferredVersions[name][version] = { selectorType: 'version', weight: EXISTING_VERSION_SELECTOR_WEIGHT };
64
+ preferredVersions[name][version] = { selectorType: 'version', weight };
47
65
  continue;
48
66
  }
49
67
  // The lookup for this selector was for an exact version and not a range
@@ -60,7 +78,7 @@ function addPreferredVersionsFromLockfile(snapshots, preferredVersions) {
60
78
  // present in the lockfile that's also used by a direct dependency to be
61
79
  // considered at a higher priority than a package with only one of the two
62
80
  // criteria.
63
- preferredVersions[name][version] = addWeightToVersionSelector(existingSelector, EXISTING_VERSION_SELECTOR_WEIGHT);
81
+ preferredVersions[name][version] = addWeightToVersionSelector(existingSelector, weight);
64
82
  }
65
83
  }
66
84
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@pnpm/lockfile.preferred-versions",
3
- "version": "1100.0.33",
3
+ "version": "1100.0.35",
4
4
  "description": "Get preferred version from lockfile",
5
5
  "keywords": [
6
6
  "pnpm",
@@ -29,15 +29,17 @@
29
29
  "!*.map"
30
30
  ],
31
31
  "dependencies": {
32
- "@pnpm/lockfile.utils": "1102.1.2",
33
- "@pnpm/pkg-manifest.utils": "1100.4.4",
34
- "@pnpm/resolving.resolver-base": "1101.2.0",
35
- "@pnpm/types": "1102.1.0",
32
+ "@pnpm/catalogs.resolver": "1100.1.0",
33
+ "@pnpm/catalogs.types": "1100.0.1",
34
+ "@pnpm/lockfile.utils": "1102.1.4",
35
+ "@pnpm/pkg-manifest.utils": "1100.4.6",
36
+ "@pnpm/resolving.resolver-base": "1101.3.1",
37
+ "@pnpm/types": "1102.1.1",
36
38
  "version-selector-type": "^3.0.0"
37
39
  },
38
40
  "devDependencies": {
39
41
  "@jest/globals": "30.4.1",
40
- "@pnpm/lockfile.preferred-versions": "1100.0.33",
42
+ "@pnpm/lockfile.preferred-versions": "1100.0.35",
41
43
  "cross-env": "^10.1.0"
42
44
  },
43
45
  "engines": {