fix: optional peer dependencies should resolve to optional dependencies (#7918)

This commit is contained in:
Zoltan Kochan
2024-04-13 18:26:47 +02:00
committed by GitHub
parent 0995ae3e88
commit 253d50c550
22 changed files with 77 additions and 61 deletions

View File

@@ -0,0 +1,5 @@
---
"@pnpm/resolve-dependencies": patch
---
Optional peer dependencies should be resolved as optional dependencies [#7918](https://github.com/pnpm/pnpm/pull/7918).

View File

@@ -44,7 +44,7 @@
"@pnpm/constants": "workspace:*",
"@pnpm/lockfile-types": "workspace:*",
"@pnpm/modules-yaml": "workspace:*",
"@pnpm/registry-mock": "3.29.0",
"@pnpm/registry-mock": "3.30.0",
"@pnpm/types": "workspace:*",
"is-windows": "^1.0.2",
"isexe": "2.0.0",

View File

@@ -40,7 +40,7 @@
"test": "pnpm pretest && pnpm run compile && jest"
},
"dependencies": {
"@pnpm/registry-mock": "3.29.0",
"@pnpm/registry-mock": "3.30.0",
"@pnpm/store.cafs": "workspace:*",
"path-exists": "^4.0.0"
},

View File

@@ -35,7 +35,7 @@
"@pnpm/filter-workspace-packages": "workspace:*",
"@pnpm/plugin-commands-rebuild": "workspace:*",
"@pnpm/prepare": "workspace:*",
"@pnpm/registry-mock": "3.29.0",
"@pnpm/registry-mock": "3.30.0",
"@pnpm/test-fixtures": "workspace:*",
"@pnpm/test-ipc-server": "workspace:*",
"@types/ramda": "0.29.12",

View File

@@ -34,7 +34,7 @@
"@pnpm/filter-workspace-packages": "workspace:*",
"@pnpm/plugin-commands-script-runners": "workspace:*",
"@pnpm/prepare": "workspace:*",
"@pnpm/registry-mock": "3.29.0",
"@pnpm/registry-mock": "3.30.0",
"@pnpm/test-ipc-server": "workspace:*",
"@types/is-windows": "^1.0.2",
"@types/ramda": "0.29.12",

View File

@@ -39,7 +39,7 @@
"@commitlint/prompt-cli": "^17.8.1",
"@pnpm/eslint-config": "workspace:*",
"@pnpm/meta-updater": "1.0.0",
"@pnpm/registry-mock": "3.29.0",
"@pnpm/registry-mock": "3.30.0",
"@pnpm/tsconfig": "workspace:*",
"@pnpm/worker": "workspace:*",
"@types/jest": "^29.5.12",

View File

@@ -34,7 +34,7 @@
"@pnpm/filter-workspace-packages": "workspace:*",
"@pnpm/plugin-commands-patching": "workspace:*",
"@pnpm/prepare": "workspace:*",
"@pnpm/registry-mock": "3.29.0",
"@pnpm/registry-mock": "3.30.0",
"@pnpm/test-fixtures": "workspace:*",
"@types/normalize-path": "^3.0.2",
"@types/ramda": "0.29.12",

View File

@@ -83,7 +83,7 @@
"@pnpm/lockfile-types": "workspace:*",
"@pnpm/package-store": "workspace:*",
"@pnpm/prepare": "workspace:*",
"@pnpm/registry-mock": "3.29.0",
"@pnpm/registry-mock": "3.30.0",
"@pnpm/store-path": "workspace:*",
"@pnpm/store.cafs": "workspace:*",
"@pnpm/test-fixtures": "workspace:*",

View File

@@ -23,10 +23,20 @@ test('successfully install optional dependency with subdependencies', async () =
test('skip failing optional dependencies', async () => {
const project = prepareEmpty()
await addDependenciesToPackage({}, ['pkg-with-failing-optional-dependency@1.0.1'], testDefaults({ fastUnpack: false }))
await addDependenciesToPackage({}, ['@pnpm.e2e/pkg-with-failing-optional-dependency@1.0.0'], testDefaults({ fastUnpack: false }))
const m = project.requireModule('pkg-with-failing-optional-dependency')
expect(m(-1)).toBeTruthy()
project.has('@pnpm.e2e/pkg-with-failing-optional-dependency/package.json')
})
test('skip failing optional peer dependencies', async () => {
const project = prepareEmpty()
await addDependenciesToPackage({}, ['@pnpm.e2e/pkg-with-failing-optional-dependency@1.0.0', '@pnpm.e2e/pkg-with-failing-optional-peer@1.0.0'], testDefaults({ fastUnpack: false }))
const lockfile = project.readLockfile()
expect(lockfile.snapshots['@pnpm.e2e/pkg-with-failing-optional-peer@1.0.0(@pnpm.e2e/pkg-with-failing-postinstall@1.0.0)'].optionalDependencies).toStrictEqual({
'@pnpm.e2e/pkg-with-failing-postinstall': '1.0.0',
})
expect(lockfile.snapshots['@pnpm.e2e/pkg-with-failing-postinstall@1.0.0'].optional).toBe(true)
})
test('skip non-existing optional dependency', async () => {

View File

@@ -23,7 +23,7 @@
"@pnpm/package-store": "workspace:*",
"@pnpm/prepare": "workspace:*",
"@pnpm/read-projects-context": "workspace:*",
"@pnpm/registry-mock": "3.29.0",
"@pnpm/registry-mock": "3.30.0",
"@pnpm/store-path": "workspace:*",
"@pnpm/store.cafs": "workspace:*",
"@pnpm/test-fixtures": "workspace:*",

View File

@@ -61,7 +61,7 @@
"@pnpm/client": "workspace:*",
"@pnpm/create-cafs-store": "workspace:*",
"@pnpm/package-requester": "workspace:*",
"@pnpm/registry-mock": "3.29.0",
"@pnpm/registry-mock": "3.30.0",
"@pnpm/test-fixtures": "workspace:*",
"@types/normalize-path": "^3.0.2",
"@types/ramda": "0.29.12",

View File

@@ -34,7 +34,7 @@
"@pnpm/modules-yaml": "workspace:*",
"@pnpm/plugin-commands-installation": "workspace:*",
"@pnpm/prepare": "workspace:*",
"@pnpm/registry-mock": "3.29.0",
"@pnpm/registry-mock": "3.30.0",
"@pnpm/test-fixtures": "workspace:*",
"@pnpm/test-ipc-server": "workspace:*",
"@types/proxyquire": "^1.3.31",

View File

@@ -346,16 +346,17 @@ export async function resolveRootDependencies (
}
}
const nextMissingOptionalPeers: string[] = []
const optionalDependencies: Record<string, string> = {}
for (const missingOptionalPeerName of missingOptionalPeerNames) {
if (ctx.allPreferredVersions![missingOptionalPeerName]) {
dependencies[missingOptionalPeerName] = Object.keys(ctx.allPreferredVersions![missingOptionalPeerName]).join(' || ')
optionalDependencies[missingOptionalPeerName] = Object.keys(ctx.allPreferredVersions![missingOptionalPeerName]).join(' || ')
} else {
nextMissingOptionalPeers.push(missingOptionalPeerName)
}
}
prevMissingOptionalPeers = nextMissingOptionalPeers
if (!Object.keys(dependencies).length) break
const wantedDependencies = getNonDevWantedDependencies({ dependencies })
if (!Object.keys(dependencies).length && !Object.keys(optionalDependencies).length) break
const wantedDependencies = getNonDevWantedDependencies({ dependencies, optionalDependencies })
// eslint-disable-next-line no-await-in-loop
const resolveDependenciesResult = await resolveDependencies(ctx, preferredVersions, wantedDependencies, {

View File

@@ -27,7 +27,7 @@ export function updateLockfile (
lockfile.packages = lockfile.packages ?? {}
for (const [depPath, depNode] of Object.entries(dependenciesGraph)) {
const [updatedOptionalDeps, updatedDeps] = partition(
(child) => depNode.optionalDependencies.has(child.alias),
(child) => depNode.optionalDependencies.has(child.alias) || depNode.peerDependencies[child.alias]?.optional === true,
Object.entries(depNode.children).map(([alias, depPath]) => ({ alias, depPath }))
)
lockfile.packages[depPath] = toLockfileDependency(depNode, {

74
pnpm-lock.yaml generated
View File

@@ -72,8 +72,8 @@ importers:
specifier: 1.0.0
version: 1.0.0
'@pnpm/registry-mock':
specifier: 3.29.0
version: 3.29.0(encoding@0.1.13)(typanion@3.14.0)
specifier: 3.30.0
version: 3.30.0(encoding@0.1.13)(typanion@3.14.0)
'@pnpm/tsconfig':
specifier: workspace:*
version: link:__utils__/tsconfig
@@ -190,8 +190,8 @@ importers:
specifier: workspace:*
version: link:../../pkg-manager/modules-yaml
'@pnpm/registry-mock':
specifier: 3.29.0
version: 3.29.0(encoding@0.1.13)(typanion@3.14.0)
specifier: 3.30.0
version: 3.30.0(encoding@0.1.13)(typanion@3.14.0)
'@pnpm/types':
specifier: workspace:*
version: link:../../packages/types
@@ -224,8 +224,8 @@ importers:
__utils__/assert-store:
dependencies:
'@pnpm/registry-mock':
specifier: 3.29.0
version: 3.29.0(encoding@0.1.13)(typanion@3.14.0)
specifier: 3.30.0
version: 3.30.0(encoding@0.1.13)(typanion@3.14.0)
'@pnpm/store.cafs':
specifier: workspace:*
version: link:../../store/cafs
@@ -1334,8 +1334,8 @@ importers:
specifier: workspace:*
version: link:../../__utils__/prepare
'@pnpm/registry-mock':
specifier: 3.29.0
version: 3.29.0(encoding@0.1.13)(typanion@3.14.0)
specifier: 3.30.0
version: 3.30.0(encoding@0.1.13)(typanion@3.14.0)
'@pnpm/test-fixtures':
specifier: workspace:*
version: link:../../__utils__/test-fixtures
@@ -1461,8 +1461,8 @@ importers:
specifier: workspace:*
version: link:../../__utils__/prepare
'@pnpm/registry-mock':
specifier: 3.29.0
version: 3.29.0(encoding@0.1.13)(typanion@3.14.0)
specifier: 3.30.0
version: 3.30.0(encoding@0.1.13)(typanion@3.14.0)
'@pnpm/test-ipc-server':
specifier: workspace:*
version: link:../../__utils__/test-ipc-server
@@ -2982,8 +2982,8 @@ importers:
specifier: workspace:*
version: link:../../__utils__/prepare
'@pnpm/registry-mock':
specifier: 3.29.0
version: 3.29.0(encoding@0.1.13)(typanion@3.14.0)
specifier: 3.30.0
version: 3.30.0(encoding@0.1.13)(typanion@3.14.0)
'@pnpm/test-fixtures':
specifier: workspace:*
version: link:../../__utils__/test-fixtures
@@ -3248,8 +3248,8 @@ importers:
specifier: workspace:*
version: link:../../__utils__/prepare
'@pnpm/registry-mock':
specifier: 3.29.0
version: 3.29.0(encoding@0.1.13)(typanion@3.14.0)
specifier: 3.30.0
version: 3.30.0(encoding@0.1.13)(typanion@3.14.0)
'@pnpm/store-path':
specifier: workspace:*
version: link:../../store/store-path
@@ -3530,8 +3530,8 @@ importers:
specifier: workspace:*
version: link:../read-projects-context
'@pnpm/registry-mock':
specifier: 3.29.0
version: 3.29.0(encoding@0.1.13)(typanion@3.14.0)
specifier: 3.30.0
version: 3.30.0(encoding@0.1.13)(typanion@3.14.0)
'@pnpm/store-path':
specifier: workspace:*
version: link:../../store/store-path
@@ -3887,8 +3887,8 @@ importers:
specifier: workspace:*
version: 'link:'
'@pnpm/registry-mock':
specifier: 3.29.0
version: 3.29.0(encoding@0.1.13)(typanion@3.14.0)
specifier: 3.30.0
version: 3.30.0(encoding@0.1.13)(typanion@3.14.0)
'@pnpm/test-fixtures':
specifier: workspace:*
version: link:../../__utils__/test-fixtures
@@ -4080,8 +4080,8 @@ importers:
specifier: workspace:*
version: link:../../__utils__/prepare
'@pnpm/registry-mock':
specifier: 3.29.0
version: 3.29.0(encoding@0.1.13)(typanion@3.14.0)
specifier: 3.30.0
version: 3.30.0(encoding@0.1.13)(typanion@3.14.0)
'@pnpm/test-fixtures':
specifier: workspace:*
version: link:../../__utils__/test-fixtures
@@ -4646,8 +4646,8 @@ importers:
specifier: workspace:*
version: link:../pkg-manifest/read-project-manifest
'@pnpm/registry-mock':
specifier: 3.29.0
version: 3.29.0(encoding@0.1.13)(typanion@3.14.0)
specifier: 3.30.0
version: 3.30.0(encoding@0.1.13)(typanion@3.14.0)
'@pnpm/run-npm':
specifier: workspace:*
version: link:../exec/run-npm
@@ -4906,8 +4906,8 @@ importers:
specifier: workspace:*
version: link:../../__utils__/prepare
'@pnpm/registry-mock':
specifier: 3.29.0
version: 3.29.0(encoding@0.1.13)(typanion@3.14.0)
specifier: 3.30.0
version: 3.30.0(encoding@0.1.13)(typanion@3.14.0)
releasing/plugin-commands-publishing:
dependencies:
@@ -5006,8 +5006,8 @@ importers:
specifier: workspace:*
version: link:../../__utils__/prepare
'@pnpm/registry-mock':
specifier: 3.29.0
version: 3.29.0(encoding@0.1.13)(typanion@3.14.0)
specifier: 3.30.0
version: 3.30.0(encoding@0.1.13)(typanion@3.14.0)
'@pnpm/test-ipc-server':
specifier: workspace:*
version: link:../../__utils__/test-ipc-server
@@ -5575,8 +5575,8 @@ importers:
specifier: workspace:*
version: link:../../pkg-manifest/read-package-json
'@pnpm/registry-mock':
specifier: 3.29.0
version: 3.29.0(encoding@0.1.13)(typanion@3.14.0)
specifier: 3.30.0
version: 3.30.0(encoding@0.1.13)(typanion@3.14.0)
'@pnpm/test-fixtures':
specifier: workspace:*
version: link:../../__utils__/test-fixtures
@@ -5642,8 +5642,8 @@ importers:
specifier: workspace:*
version: link:../../__utils__/prepare
'@pnpm/registry-mock':
specifier: 3.29.0
version: 3.29.0(encoding@0.1.13)(typanion@3.14.0)
specifier: 3.30.0
version: 3.30.0(encoding@0.1.13)(typanion@3.14.0)
'@types/ramda':
specifier: 0.29.12
version: 0.29.12
@@ -5736,8 +5736,8 @@ importers:
specifier: workspace:*
version: link:../../__utils__/prepare
'@pnpm/registry-mock':
specifier: 3.29.0
version: 3.29.0(encoding@0.1.13)(typanion@3.14.0)
specifier: 3.30.0
version: 3.30.0(encoding@0.1.13)(typanion@3.14.0)
'@pnpm/test-fixtures':
specifier: workspace:*
version: link:../../__utils__/test-fixtures
@@ -6074,8 +6074,8 @@ importers:
specifier: workspace:*
version: link:../../__utils__/prepare
'@pnpm/registry-mock':
specifier: 3.29.0
version: 3.29.0(encoding@0.1.13)(typanion@3.14.0)
specifier: 3.30.0
version: 3.30.0(encoding@0.1.13)(typanion@3.14.0)
'@types/archy':
specifier: 0.0.33
version: 0.0.33
@@ -7636,8 +7636,8 @@ packages:
resolution: {integrity: sha512-MDXuQpYFbabSXzAnqP7VIQqBx5Z1fzOhzB/3YmIXJ+tE7Wue//IR3itMSYlWeaFLo1G5PCJklM2zBdvggRw1nw==}
engines: {node: '>=16.14'}
'@pnpm/registry-mock@3.29.0':
resolution: {integrity: sha512-MAgpX6PmfD9OurBk32IsIzyNK965qMLk1T+9dYww8laK48sg67+2JETucutk9fjZsFcYWuOhrxonk4tUa8M9QQ==}
'@pnpm/registry-mock@3.30.0':
resolution: {integrity: sha512-uUyFwjY7SsnuJLp/LRGDV5A2ZZ4Sj4IyOifkY8XHqSqaJ1rrt3klDPmVVSt8fj4HNJmsaEFaUtxd0fpYr+cpTg==}
engines: {node: '>=10.13'}
hasBin: true
@@ -14405,7 +14405,7 @@ snapshots:
sort-keys: 4.2.0
strip-bom: 4.0.0
'@pnpm/registry-mock@3.29.0(encoding@0.1.13)(typanion@3.14.0)':
'@pnpm/registry-mock@3.30.0(encoding@0.1.13)(typanion@3.14.0)':
dependencies:
anonymous-npm-registry-client: 0.2.0
execa: 5.1.1

View File

@@ -65,7 +65,7 @@
"@pnpm/prepare": "workspace:*",
"@pnpm/read-package-json": "workspace:*",
"@pnpm/read-project-manifest": "workspace:*",
"@pnpm/registry-mock": "3.29.0",
"@pnpm/registry-mock": "3.30.0",
"@pnpm/run-npm": "workspace:*",
"@pnpm/tabtab": "^0.5.2",
"@pnpm/test-fixtures": "workspace:*",

View File

@@ -39,7 +39,7 @@
"@pnpm/lockfile-types": "workspace:*",
"@pnpm/plugin-commands-deploy": "workspace:*",
"@pnpm/prepare": "workspace:*",
"@pnpm/registry-mock": "3.29.0"
"@pnpm/registry-mock": "3.30.0"
},
"dependencies": {
"@pnpm/cli-utils": "workspace:*",

View File

@@ -35,7 +35,7 @@
"@pnpm/filter-workspace-packages": "workspace:*",
"@pnpm/plugin-commands-publishing": "workspace:*",
"@pnpm/prepare": "workspace:*",
"@pnpm/registry-mock": "3.29.0",
"@pnpm/registry-mock": "3.30.0",
"@pnpm/test-ipc-server": "workspace:*",
"@types/cross-spawn": "^6.0.6",
"@types/is-windows": "^1.0.2",

View File

@@ -36,7 +36,7 @@
"@pnpm/plugin-commands-licenses": "workspace:*",
"@pnpm/prepare": "workspace:*",
"@pnpm/read-package-json": "workspace:*",
"@pnpm/registry-mock": "3.29.0",
"@pnpm/registry-mock": "3.30.0",
"@pnpm/test-fixtures": "workspace:*",
"@types/ramda": "0.29.12",
"@types/semver": "7.5.3",

View File

@@ -34,7 +34,7 @@
"@pnpm/plugin-commands-installation": "workspace:*",
"@pnpm/plugin-commands-listing": "workspace:*",
"@pnpm/prepare": "workspace:*",
"@pnpm/registry-mock": "3.29.0",
"@pnpm/registry-mock": "3.30.0",
"@types/ramda": "0.29.12",
"execa": "npm:safe-execa@0.1.2",
"strip-ansi": "^6.0.1",

View File

@@ -35,7 +35,7 @@
"@pnpm/plugin-commands-installation": "workspace:*",
"@pnpm/plugin-commands-outdated": "workspace:*",
"@pnpm/prepare": "workspace:*",
"@pnpm/registry-mock": "3.29.0",
"@pnpm/registry-mock": "3.30.0",
"@pnpm/test-fixtures": "workspace:*",
"@types/ramda": "0.29.12",
"@types/wrap-ansi": "8.0.2",

View File

@@ -35,7 +35,7 @@
"@pnpm/lockfile-file": "workspace:*",
"@pnpm/plugin-commands-store": "workspace:*",
"@pnpm/prepare": "workspace:*",
"@pnpm/registry-mock": "3.29.0",
"@pnpm/registry-mock": "3.30.0",
"@types/archy": "0.0.33",
"@types/ramda": "0.29.12",
"@types/ssri": "^7.1.5",