@pnpm/installing.deps-resolver 1008.3.1 → 1100.0.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.
package/lib/hoistPeers.js CHANGED
@@ -18,7 +18,8 @@ export function hoistPeers(opts, missingRequiredPeers) {
18
18
  if (opts.allPreferredVersions[peerName]) {
19
19
  const versions = [];
20
20
  const nonVersions = [];
21
- for (const [spec, specType] of Object.entries(opts.allPreferredVersions[peerName])) {
21
+ for (const [spec, selector] of Object.entries(opts.allPreferredVersions[peerName])) {
22
+ const specType = typeof selector === 'string' ? selector : selector.selectorType;
22
23
  if (specType === 'version') {
23
24
  versions.push(spec);
24
25
  }
@@ -44,7 +45,9 @@ export function hoistPeers(opts, missingRequiredPeers) {
44
45
  dependencies[peerName] = range;
45
46
  }
46
47
  else {
47
- dependencies[peerName] = [semver.maxSatisfying(versions, '*', { includePrerelease: true }), ...nonVersions].join(' || ');
48
+ dependencies[peerName] = [semver.maxSatisfying(versions, '*', { includePrerelease: true }), ...nonVersions]
49
+ .filter(spec => spec != null)
50
+ .join(' || ');
48
51
  }
49
52
  }
50
53
  else if (opts.autoInstallPeers) {
package/lib/index.d.ts CHANGED
@@ -41,6 +41,7 @@ export interface ResolveDependenciesResult {
41
41
  export declare function resolveDependencies(importers: ImporterToResolve[], opts: ResolveDependenciesOptions & {
42
42
  defaultUpdateDepth: number;
43
43
  dedupePeerDependents?: boolean;
44
+ dedupePeers?: boolean;
44
45
  dedupeDirectDeps?: boolean;
45
46
  dedupeInjectedDeps?: boolean;
46
47
  excludeLinksFromLockfile?: boolean;
package/lib/index.js CHANGED
@@ -74,6 +74,7 @@ export async function resolveDependencies(importers, opts) {
74
74
  allPeerDepNames,
75
75
  dependenciesTree,
76
76
  dedupePeerDependents: opts.dedupePeerDependents,
77
+ dedupePeers: opts.dedupePeers,
77
78
  dedupeInjectedDeps: opts.dedupeInjectedDeps,
78
79
  lockfileDir: opts.lockfileDir,
79
80
  projects: projectsToLink,
@@ -2,7 +2,7 @@ import { resolveFromCatalog } from '@pnpm/catalogs.resolver';
2
2
  import { createPackageVersionPolicy } from '@pnpm/config.version-policy';
3
3
  import { PnpmError } from '@pnpm/error';
4
4
  import { globalWarn } from '@pnpm/logger';
5
- import { partition, zipObj } from 'ramda';
5
+ import { partition } from 'ramda';
6
6
  import { nextNodeId } from './nextNodeId.js';
7
7
  import { parentIdsContainSequence } from './parentIdsContainSequence.js';
8
8
  import { resolveRootDependencies, } from './resolveDependencies.js';
@@ -104,7 +104,7 @@ export async function resolveDependencyTree(importers, opts) {
104
104
  };
105
105
  });
106
106
  const { pkgAddressesByImporters, time } = await resolveRootDependencies(ctx, resolveArgs);
107
- const directDepsByImporterId = zipObj(importers.map(({ id }) => id), pkgAddressesByImporters);
107
+ const directDepsByImporterId = Object.fromEntries(importers.map(({ id }, i) => [id, pkgAddressesByImporters[i]]));
108
108
  for (const directDependencies of pkgAddressesByImporters) {
109
109
  for (const directDep of directDependencies) {
110
110
  const { alias, normalizedBareSpecifier, version, saveCatalogName } = directDep;
@@ -48,6 +48,7 @@ export declare function resolvePeers<T extends PartialResolvedPackage>(opts: {
48
48
  lockfileDir: string;
49
49
  resolvePeersFromWorkspaceRoot?: boolean;
50
50
  dedupePeerDependents?: boolean;
51
+ dedupePeers?: boolean;
51
52
  dedupeInjectedDeps?: boolean;
52
53
  resolvedImporters: ResolvedImporters;
53
54
  peersSuffixMaxLength: number;
@@ -45,6 +45,7 @@ export async function resolvePeers(opts) {
45
45
  peersCache,
46
46
  peerDependencyIssues,
47
47
  purePkgs,
48
+ dedupePeers: opts.dedupePeers,
48
49
  peersSuffixMaxLength: opts.peersSuffixMaxLength,
49
50
  rootDir,
50
51
  virtualStoreDir: opts.virtualStoreDir,
@@ -336,20 +337,13 @@ async function resolvePeersOfNode(currentAlias, nodeId, parentParentPkgs, ctx) {
336
337
  const peerIds = [];
337
338
  const pendingPeers = [];
338
339
  for (const [alias, peerNodeId] of allResolvedPeers.entries()) {
339
- if (typeof peerNodeId === 'string' && peerNodeId.startsWith('link:')) {
340
- const linkedDir = peerNodeId.slice(5);
341
- peerIds.push({
342
- name: alias,
343
- version: filenamify(linkedDir, { replacement: '+' }),
344
- });
345
- continue;
340
+ const peerId = peerNodeIdToPeerId(alias, peerNodeId, ctx);
341
+ if (peerId != null) {
342
+ peerIds.push(peerId);
346
343
  }
347
- const peerDepPath = ctx.pathsByNodeId.get(peerNodeId);
348
- if (peerDepPath) {
349
- peerIds.push(peerDepPath);
350
- continue;
344
+ else {
345
+ pendingPeers.push({ alias, nodeId: peerNodeId });
351
346
  }
352
- pendingPeers.push({ alias, nodeId: peerNodeId });
353
347
  }
354
348
  if (pendingPeers.length === 0) {
355
349
  const peerDepGraphHash = createPeerDepGraphHash(peerIds, ctx.peersSuffixMaxLength);
@@ -384,6 +378,12 @@ async function resolvePeersOfNode(currentAlias, nodeId, parentParentPkgs, ctx) {
384
378
  ctx.pathsByNodeIdPromises.get(pendingPeer.nodeId)?.resolve(id);
385
379
  return id;
386
380
  }
381
+ if (ctx.dedupePeers) {
382
+ const peerNode = ctx.dependenciesTree.get(pendingPeer.nodeId);
383
+ if (peerNode) {
384
+ return { name: peerNode.resolvedPackage.name, version: peerNode.resolvedPackage.version };
385
+ }
386
+ }
387
387
  return ctx.pathsByNodeIdPromises.get(pendingPeer.nodeId).promise;
388
388
  })),
389
389
  ], ctx.peersSuffixMaxLength);
@@ -668,6 +668,23 @@ function getLocationFromParentNodeIds({ dependenciesTree, parentNodeIds, }) {
668
668
  parents,
669
669
  };
670
670
  }
671
+ function peerNodeIdToPeerId(alias, peerNodeId, ctx) {
672
+ if (typeof peerNodeId === 'string' && peerNodeId.startsWith('link:')) {
673
+ return {
674
+ name: alias,
675
+ version: filenamify(peerNodeId.slice(5), { replacement: '+' }),
676
+ };
677
+ }
678
+ if (ctx.dedupePeers) {
679
+ // Use version-only peer identifiers instead of full dep paths.
680
+ // This eliminates nested peer suffixes like (foo@1.0.0(bar@2.0.0)).
681
+ const peerNode = ctx.dependenciesTree.get(peerNodeId);
682
+ if (peerNode) {
683
+ return { name: peerNode.resolvedPackage.name, version: peerNode.resolvedPackage.version };
684
+ }
685
+ }
686
+ return ctx.pathsByNodeId.get(peerNodeId);
687
+ }
671
688
  function toPkgByName(nodes) {
672
689
  const pkgsByName = {};
673
690
  const _updateParentRefs = updateParentRefs.bind(null, pkgsByName);
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@pnpm/installing.deps-resolver",
3
- "version": "1008.3.1",
3
+ "version": "1100.0.0",
4
4
  "description": "Resolves dependency graph of a package",
5
5
  "keywords": [
6
6
  "pnpm",
@@ -25,8 +25,8 @@
25
25
  ],
26
26
  "dependencies": {
27
27
  "@pnpm/util.lex-comparator": "^3.0.2",
28
- "@yarnpkg/core": "4.2.0",
29
- "filenamify": "^6.0.0",
28
+ "@yarnpkg/core": "4.5.0",
29
+ "filenamify": "^7.0.1",
30
30
  "graph-cycles": "3.0.0",
31
31
  "is-inner-link": "^5.0.0",
32
32
  "is-subdir": "^2.0.0",
@@ -35,45 +35,45 @@
35
35
  "path-exists": "^5.0.0",
36
36
  "promise-share": "^2.0.0",
37
37
  "ramda": "npm:@pnpm/ramda@0.28.1",
38
- "rename-overwrite": "^7.0.0",
38
+ "rename-overwrite": "^7.0.1",
39
39
  "safe-promise-defer": "^2.0.0",
40
40
  "semver": "^7.7.2",
41
41
  "semver-range-intersect": "^0.3.1",
42
42
  "version-selector-type": "^3.0.0",
43
- "@pnpm/catalogs.resolver": "1000.0.5",
44
- "@pnpm/catalogs.types": "1000.0.0",
45
- "@pnpm/config.version-policy": "1000.0.0",
46
- "@pnpm/constants": "1001.3.1",
47
- "@pnpm/core-loggers": "1001.0.4",
48
- "@pnpm/deps.peer-range": "1000.0.0",
49
- "@pnpm/deps.path": "1001.1.3",
50
- "@pnpm/fetching.pick-fetcher": "1001.0.0",
51
- "@pnpm/deps.graph-hasher": "1002.0.8",
52
- "@pnpm/error": "1000.0.5",
53
- "@pnpm/lockfile.preferred-versions": "1000.0.22",
54
- "@pnpm/lockfile.types": "1002.0.2",
55
- "@pnpm/hooks.types": "1001.0.12",
56
- "@pnpm/lockfile.pruner": "1001.0.17",
57
- "@pnpm/lockfile.utils": "1003.0.3",
58
- "@pnpm/patching.config": "1001.0.11",
59
- "@pnpm/patching.types": "1000.1.0",
60
- "@pnpm/pkg-manifest.utils": "1001.0.6",
61
- "@pnpm/resolving.npm-resolver": "1004.4.1",
62
- "@pnpm/pkg-manifest.reader": "1000.1.2",
63
- "@pnpm/store.controller-types": "1004.1.0",
64
- "@pnpm/types": "1000.9.0",
65
- "@pnpm/workspace.spec-parser": "1000.0.0",
66
- "@pnpm/resolving.resolver-base": "1005.1.0"
43
+ "@pnpm/catalogs.resolver": "1100.0.0",
44
+ "@pnpm/constants": "1100.0.0",
45
+ "@pnpm/catalogs.types": "1100.0.0",
46
+ "@pnpm/config.version-policy": "1100.0.0",
47
+ "@pnpm/core-loggers": "1100.0.0",
48
+ "@pnpm/deps.graph-hasher": "1100.0.0",
49
+ "@pnpm/deps.path": "1100.0.0",
50
+ "@pnpm/deps.peer-range": "1100.0.0",
51
+ "@pnpm/error": "1100.0.0",
52
+ "@pnpm/fetching.pick-fetcher": "1100.0.0",
53
+ "@pnpm/hooks.types": "1100.0.0",
54
+ "@pnpm/lockfile.preferred-versions": "1100.0.0",
55
+ "@pnpm/patching.config": "1100.0.0",
56
+ "@pnpm/lockfile.types": "1100.0.0",
57
+ "@pnpm/lockfile.utils": "1100.0.0",
58
+ "@pnpm/lockfile.pruner": "1100.0.0",
59
+ "@pnpm/patching.types": "1100.0.0",
60
+ "@pnpm/pkg-manifest.utils": "1100.0.0",
61
+ "@pnpm/pkg-manifest.reader": "1100.0.0",
62
+ "@pnpm/store.controller-types": "1100.0.0",
63
+ "@pnpm/resolving.npm-resolver": "1100.0.0",
64
+ "@pnpm/resolving.resolver-base": "1100.0.0",
65
+ "@pnpm/types": "1100.0.0",
66
+ "@pnpm/workspace.spec-parser": "1100.0.0"
67
67
  },
68
68
  "peerDependencies": {
69
69
  "@pnpm/logger": ">=1001.0.0 <1002.0.0"
70
70
  },
71
71
  "devDependencies": {
72
72
  "@types/normalize-path": "^3.0.2",
73
- "@types/ramda": "0.29.12",
73
+ "@types/ramda": "0.31.1",
74
74
  "@types/semver": "7.7.1",
75
- "@pnpm/installing.deps-resolver": "1008.3.1",
76
- "@pnpm/logger": "1001.0.1"
75
+ "@pnpm/logger": "1100.0.0",
76
+ "@pnpm/installing.deps-resolver": "1100.0.0"
77
77
  },
78
78
  "engines": {
79
79
  "node": ">=22.13"
@@ -83,9 +83,9 @@
83
83
  },
84
84
  "scripts": {
85
85
  "start": "tsgo --watch",
86
- "test": "pnpm run compile && pnpm run _test",
86
+ "test": "pn compile && pn .test",
87
87
  "lint": "eslint \"src/**/*.ts\" \"test/**/*.ts\"",
88
- "compile": "tsgo --build && pnpm run lint --fix",
89
- "_test": "cross-env NODE_OPTIONS=\"$NODE_OPTIONS --experimental-vm-modules --disable-warning=ExperimentalWarning --disable-warning=DEP0169\" jest"
88
+ "compile": "tsgo --build && pn lint --fix",
89
+ ".test": "cross-env NODE_OPTIONS=\"$NODE_OPTIONS --experimental-vm-modules --disable-warning=ExperimentalWarning --disable-warning=DEP0169\" jest"
90
90
  }
91
91
  }