fix: pnpm i --prod --frozen-lockfile with peer deps

close #2711
PR #2717
This commit is contained in:
Zoltan Kochan
2020-07-27 19:09:43 +03:00
committed by GitHub
parent 7891d29172
commit 873f08b045
5 changed files with 60 additions and 5 deletions

View 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.

View File

@@ -0,0 +1,5 @@
---
"@pnpm/headless": patch
---
Don't fail on missing peer dependencies.

View File

@@ -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}`)
}
}

View File

@@ -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 })

View File

@@ -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')
})