mirror of
https://github.com/pnpm/pnpm.git
synced 2026-04-28 02:53:15 -04:00
fix: pnpm i --prod --frozen-lockfile with peer deps
close #2711 PR #2717
This commit is contained in:
5
.changeset/slimy-sheep-prove.md
Normal file
5
.changeset/slimy-sheep-prove.md
Normal file
@@ -0,0 +1,5 @@
|
||||
---
|
||||
"@pnpm/prune-lockfile": patch
|
||||
---
|
||||
|
||||
Dev dependencies are not marked as prod dependencies if they are used as peer dependencies of prod dependencies.
|
||||
5
.changeset/strong-dogs-greet.md
Normal file
5
.changeset/strong-dogs-greet.md
Normal file
@@ -0,0 +1,5 @@
|
||||
---
|
||||
"@pnpm/headless": patch
|
||||
---
|
||||
|
||||
Don't fail on missing peer dependencies.
|
||||
@@ -563,7 +563,8 @@ async function lockfileToDepGraph (
|
||||
...(opts.include.optionalDependencies ? pkgSnapshot.optionalDependencies : {}),
|
||||
}
|
||||
|
||||
graph[dir].children = await getChildrenPaths(ctx, allDeps)
|
||||
const peerDeps = pkgSnapshot.peerDependencies ? new Set(Object.keys(pkgSnapshot.peerDependencies)) : null
|
||||
graph[dir].children = await getChildrenPaths(ctx, allDeps, peerDeps)
|
||||
}
|
||||
for (const importerId of opts.importerIds) {
|
||||
const projectSnapshot = lockfile.importers[importerId]
|
||||
@@ -572,7 +573,7 @@ async function lockfileToDepGraph (
|
||||
...(opts.include.dependencies ? projectSnapshot.dependencies : {}),
|
||||
...(opts.include.optionalDependencies ? projectSnapshot.optionalDependencies : {}),
|
||||
}
|
||||
directDependenciesByImporterId[importerId] = await getChildrenPaths(ctx, rootDeps)
|
||||
directDependenciesByImporterId[importerId] = await getChildrenPaths(ctx, rootDeps, null)
|
||||
}
|
||||
}
|
||||
return { graph, directDependenciesByImporterId }
|
||||
@@ -591,7 +592,8 @@ async function getChildrenPaths (
|
||||
sideEffectsCacheRead: boolean,
|
||||
storeController: StoreController,
|
||||
},
|
||||
allDeps: {[alias: string]: string}
|
||||
allDeps: {[alias: string]: string},
|
||||
peerDeps: Set<string> | null
|
||||
) {
|
||||
const children: {[alias: string]: string} = {}
|
||||
for (const alias of Object.keys(allDeps)) {
|
||||
@@ -609,7 +611,7 @@ async function getChildrenPaths (
|
||||
children[alias] = path.join(ctx.virtualStoreDir, pkgIdToFilename(childRelDepPath, ctx.lockfileDir), 'node_modules', pkgName)
|
||||
} else if (allDeps[alias].indexOf('file:') === 0) {
|
||||
children[alias] = path.resolve(ctx.lockfileDir, allDeps[alias].substr(5))
|
||||
} else if (!ctx.skipped.has(childRelDepPath)) {
|
||||
} else if (!ctx.skipped.has(childRelDepPath) && (!peerDeps || !peerDeps.has(alias))) {
|
||||
throw new Error(`${childRelDepPath} not found in ${WANTED_LOCKFILE}`)
|
||||
}
|
||||
}
|
||||
|
||||
@@ -192,7 +192,7 @@ function copyDependencySubGraph (
|
||||
} else if (depLockfile.dev === undefined && !ctx.notProdOnly.has(depPath)) {
|
||||
depLockfile.dev = false
|
||||
}
|
||||
const newDependencies = resolvedDepsToDepPaths(depLockfile.dependencies ?? {})
|
||||
const newDependencies = resolvedDepsToDepPaths(R.omit(Object.keys(depLockfile.peerDependencies ?? {}) ?? [], depLockfile.dependencies ?? {}))
|
||||
copyDependencySubGraph(ctx, newDependencies, opts)
|
||||
const newOptionalDependencies = resolvedDepsToDepPaths(depLockfile.optionalDependencies ?? {})
|
||||
copyDependencySubGraph(ctx, newOptionalDependencies, { dev: opts.dev, optional: true })
|
||||
|
||||
@@ -883,3 +883,46 @@ test('local tarball dependency with peer dependency', async (t: tape.Test) => {
|
||||
|
||||
t.deepEqual(await fs.readdir('node_modules/.pnpm/local'), localPkgDirs)
|
||||
})
|
||||
|
||||
test('peer dependency that is resolved by a dev dependency', async (t: tape.Test) => {
|
||||
const project = prepareEmpty(t)
|
||||
const manifest = {
|
||||
dependencies: {
|
||||
'@typegoose/typegoose': '7.3.0',
|
||||
},
|
||||
devDependencies: {
|
||||
'@types/mongoose': '5.7.32',
|
||||
},
|
||||
}
|
||||
|
||||
await mutateModules([
|
||||
{
|
||||
buildIndex: 0,
|
||||
manifest,
|
||||
mutation: 'install',
|
||||
rootDir: process.cwd(),
|
||||
},
|
||||
], await testDefaults({ fastUnpack: false, lockfileOnly: true }))
|
||||
|
||||
const lockfile = await project.readLockfile()
|
||||
t.ok(lockfile.packages['/@types/mongoose/5.7.32'].dev)
|
||||
|
||||
await mutateModules([
|
||||
{
|
||||
buildIndex: 0,
|
||||
manifest,
|
||||
mutation: 'install',
|
||||
rootDir: process.cwd(),
|
||||
},
|
||||
], await testDefaults({
|
||||
frozenLockfile: true,
|
||||
include: {
|
||||
dependencies: true,
|
||||
devDependencies: false,
|
||||
optionalDependencies: false,
|
||||
},
|
||||
}))
|
||||
|
||||
await project.has('@typegoose/typegoose')
|
||||
await project.hasNot('@types/mongoose')
|
||||
})
|
||||
|
||||
Reference in New Issue
Block a user