Skip to content

Commit

Permalink
fix: give priority to packages installed in the root, when deduping (#…
Browse files Browse the repository at this point in the history
  • Loading branch information
zkochan committed Feb 8, 2023
1 parent 05f8354 commit 029143c
Show file tree
Hide file tree
Showing 26 changed files with 281 additions and 259 deletions.
5 changes: 5 additions & 0 deletions .changeset/chilly-apples-hang.md
@@ -0,0 +1,5 @@
---
"@pnpm/resolver-base": minor
---

Version selectors may have weights optionally.
9 changes: 9 additions & 0 deletions .changeset/silly-cars-double.md
@@ -0,0 +1,9 @@
---
"@pnpm/resolve-dependencies": patch
"@pnpm/resolver-base": patch
"@pnpm/npm-resolver": patch
"@pnpm/core": patch
"pnpm": patch
---

When resolving dependencies, prefer versions that are already used in the root of the project. This is important to minimize the number of packages that will be nested during hoisting [#6054](https://github.com/pnpm/pnpm/pull/6054).
2 changes: 1 addition & 1 deletion __utils__/assert-project/package.json
Expand Up @@ -44,7 +44,7 @@
"@pnpm/constants": "workspace:*",
"@pnpm/lockfile-types": "workspace:*",
"@pnpm/modules-yaml": "workspace:*",
"@pnpm/registry-mock": "3.3.0",
"@pnpm/registry-mock": "3.4.0",
"@pnpm/types": "workspace:*",
"is-windows": "^1.0.2",
"isexe": "2.0.0",
Expand Down
2 changes: 1 addition & 1 deletion __utils__/assert-store/package.json
Expand Up @@ -41,7 +41,7 @@
},
"dependencies": {
"@pnpm/cafs": "workspace:*",
"@pnpm/registry-mock": "3.3.0",
"@pnpm/registry-mock": "3.4.0",
"path-exists": "^4.0.0"
},
"devDependencies": {
Expand Down
2 changes: 1 addition & 1 deletion exec/plugin-commands-rebuild/package.json
Expand Up @@ -38,7 +38,7 @@
"@pnpm/filter-workspace-packages": "workspace:*",
"@pnpm/plugin-commands-rebuild": "workspace:*",
"@pnpm/prepare": "workspace:*",
"@pnpm/registry-mock": "3.3.0",
"@pnpm/registry-mock": "3.4.0",
"@pnpm/test-fixtures": "workspace:*",
"@types/ramda": "0.28.20",
"@types/semver": "7.3.13",
Expand Down
2 changes: 1 addition & 1 deletion exec/plugin-commands-script-runners/package.json
Expand Up @@ -37,7 +37,7 @@
"@pnpm/filter-workspace-packages": "workspace:*",
"@pnpm/plugin-commands-script-runners": "workspace:*",
"@pnpm/prepare": "workspace:*",
"@pnpm/registry-mock": "3.3.0",
"@pnpm/registry-mock": "3.4.0",
"@types/is-windows": "^1.0.0",
"@types/ramda": "0.28.20",
"is-windows": "^1.0.2",
Expand Down
2 changes: 1 addition & 1 deletion package.json
Expand Up @@ -39,7 +39,7 @@
"@commitlint/prompt-cli": "^17.4.2",
"@pnpm/eslint-config": "workspace:*",
"@pnpm/meta-updater": "0.2.2",
"@pnpm/registry-mock": "3.3.0",
"@pnpm/registry-mock": "3.4.0",
"@pnpm/tsconfig": "workspace:*",
"@types/jest": "^29.4.0",
"@types/node": "^14.18.36",
Expand Down
2 changes: 1 addition & 1 deletion patching/plugin-commands-patching/package.json
Expand Up @@ -35,7 +35,7 @@
"devDependencies": {
"@pnpm/plugin-commands-patching": "workspace:*",
"@pnpm/prepare": "workspace:*",
"@pnpm/registry-mock": "3.3.0",
"@pnpm/registry-mock": "3.4.0",
"@types/ramda": "0.28.20"
},
"dependencies": {
Expand Down
2 changes: 1 addition & 1 deletion pkg-manager/core/package.json
Expand Up @@ -77,7 +77,7 @@
"@pnpm/git-utils": "workspace:*",
"@pnpm/package-store": "workspace:*",
"@pnpm/prepare": "workspace:*",
"@pnpm/registry-mock": "3.3.0",
"@pnpm/registry-mock": "3.4.0",
"@pnpm/store-path": "workspace:*",
"@pnpm/test-fixtures": "workspace:*",
"@types/fs-extra": "^9.0.13",
Expand Down
9 changes: 6 additions & 3 deletions pkg-manager/core/src/install/getPreferredVersions.ts
@@ -1,6 +1,6 @@
import { nameVerFromPkgSnapshot, PackageSnapshots } from '@pnpm/lockfile-utils'
import { getAllDependenciesFromManifest } from '@pnpm/manifest-utils'
import { PreferredVersions } from '@pnpm/resolver-base'
import { DIRECT_DEP_SELECTOR_WEIGHT, PreferredVersions } from '@pnpm/resolver-base'
import { DependencyManifest, ProjectManifest } from '@pnpm/types'
import getVersionSelectorType from 'version-selector-type'

Expand Down Expand Up @@ -33,7 +33,10 @@ export function getPreferredVersionsFromLockfileAndManifests (
const selector = getVersionSelectorType(spec)
if (!selector) continue
preferredVersions[name] = preferredVersions[name] ?? {}
preferredVersions[name][spec] = selector.type
preferredVersions[name][spec] = {
selectorType: selector.type,
weight: DIRECT_DEP_SELECTOR_WEIGHT,
}
}
}
if (!snapshots) return preferredVersions
Expand All @@ -46,7 +49,7 @@ function addPreferredVersionsFromLockfile (snapshots: PackageSnapshots, preferre
const { name, version } = nameVerFromPkgSnapshot(depPath, snapshot)
if (!preferredVersions[name]) {
preferredVersions[name] = { [version]: 'version' }
} else {
} else if (!preferredVersions[name][version]) {
preferredVersions[name][version] = 'version'
}
}
Expand Down
18 changes: 18 additions & 0 deletions pkg-manager/core/test/install/dedupe.ts
Expand Up @@ -191,3 +191,21 @@ test('dedupe subdependency when a newer version of the same package is installed
expect(lockfile.packages).toHaveProperty(['/@pnpm.e2e/dep-of-pkg-with-1-dep/100.1.0'])
expect(lockfile.packages).not.toHaveProperty(['/@pnpm.e2e/dep-of-pkg-with-1-dep/100.0.0'])
})

test('when resolving dependencies, prefer versions that are used by direct dependencies over versions used in subdeps', async () => {
await addDistTag({ package: '@pnpm.e2e/foo', version: '100.1.0', distTag: 'latest' })
const project = prepareEmpty()

const manifest = await install({
dependencies: {
'@pnpm.e2e/foo': '100.0.0',
'@pnpm.e2e/has-foo-100.1.0-dep-1': '1.0.0',
'@pnpm.e2e/has-foo-100.1.0-dep-2': '1.0.0',
},
}, await testDefaults())

await addDependenciesToPackage(manifest, ['@pnpm.e2e/has-foo-100.0.0-range-dep'], await testDefaults())

const lockfile = await project.readLockfile()
expect(lockfile.packages['/@pnpm.e2e/has-foo-100.0.0-range-dep/1.0.0']).toHaveProperty(['dependencies', '@pnpm.e2e/foo'], '100.0.0')
})
2 changes: 1 addition & 1 deletion pkg-manager/headless/package.json
Expand Up @@ -22,7 +22,7 @@
"@pnpm/package-store": "workspace:*",
"@pnpm/prepare": "workspace:*",
"@pnpm/read-projects-context": "workspace:*",
"@pnpm/registry-mock": "3.3.0",
"@pnpm/registry-mock": "3.4.0",
"@pnpm/store-path": "workspace:*",
"@pnpm/test-fixtures": "workspace:*",
"@types/fs-extra": "^9.0.13",
Expand Down
2 changes: 1 addition & 1 deletion pkg-manager/package-requester/package.json
Expand Up @@ -68,7 +68,7 @@
"@pnpm/client": "workspace:*",
"@pnpm/create-cafs-store": "workspace:*",
"@pnpm/package-requester": "workspace:*",
"@pnpm/registry-mock": "3.3.0",
"@pnpm/registry-mock": "3.4.0",
"@pnpm/test-fixtures": "workspace:*",
"@types/normalize-path": "^3.0.0",
"@types/ramda": "0.28.20",
Expand Down
2 changes: 1 addition & 1 deletion pkg-manager/plugin-commands-installation/package.json
Expand Up @@ -38,7 +38,7 @@
"@pnpm/modules-yaml": "workspace:*",
"@pnpm/plugin-commands-installation": "workspace:*",
"@pnpm/prepare": "workspace:*",
"@pnpm/registry-mock": "3.3.0",
"@pnpm/registry-mock": "3.4.0",
"@pnpm/test-fixtures": "workspace:*",
"@types/proxyquire": "^1.3.28",
"@types/ramda": "0.28.20",
Expand Down
12 changes: 10 additions & 2 deletions pkg-manager/resolve-dependencies/src/resolveDependencies.ts
Expand Up @@ -19,6 +19,7 @@ import { logger } from '@pnpm/logger'
import { pickRegistryForPackage } from '@pnpm/pick-registry-for-package'
import {
DirectoryResolution,
DIRECT_DEP_SELECTOR_WEIGHT,
PreferredVersions,
Resolution,
WorkspacePackages,
Expand Down Expand Up @@ -405,7 +406,12 @@ async function resolveDependenciesOfImporters (
if (!newPreferredVersions[resolvedPackage.name]) {
newPreferredVersions[resolvedPackage.name] = {}
}
newPreferredVersions[resolvedPackage.name][resolvedPackage.version] = 'version'
if (!newPreferredVersions[resolvedPackage.name][resolvedPackage.version]) {
newPreferredVersions[resolvedPackage.name][resolvedPackage.version] = {
selectorType: 'version',
weight: DIRECT_DEP_SELECTOR_WEIGHT,
}
}
}
const newParentPkgAliases = { ...importer.parentPkgAliases, ...currentParentPkgAliases }
const postponedResolutionOpts = {
Expand Down Expand Up @@ -527,7 +533,9 @@ export async function resolveDependencies (
if (!newPreferredVersions[resolvedPackage.name]) {
newPreferredVersions[resolvedPackage.name] = {}
}
newPreferredVersions[resolvedPackage.name][resolvedPackage.version] = 'version'
if (!newPreferredVersions[resolvedPackage.name][resolvedPackage.version]) {
newPreferredVersions[resolvedPackage.name][resolvedPackage.version] = 'version'
}
}
const newParentPkgAliases = {
...options.parentPkgAliases,
Expand Down

0 comments on commit 029143c

Please sign in to comment.