From 873f08b0455db7f28b7c093f6055892c4ed73cbb Mon Sep 17 00:00:00 2001 From: Zoltan Kochan Date: Mon, 27 Jul 2020 19:09:43 +0300 Subject: [PATCH] fix: pnpm i --prod --frozen-lockfile with peer deps close #2711 PR #2717 --- .changeset/slimy-sheep-prove.md | 5 +++ .changeset/strong-dogs-greet.md | 5 +++ packages/headless/src/index.ts | 10 +++-- packages/prune-lockfile/src/index.ts | 2 +- .../supi/test/install/peerDependencies.ts | 43 +++++++++++++++++++ 5 files changed, 60 insertions(+), 5 deletions(-) create mode 100644 .changeset/slimy-sheep-prove.md create mode 100644 .changeset/strong-dogs-greet.md diff --git a/.changeset/slimy-sheep-prove.md b/.changeset/slimy-sheep-prove.md new file mode 100644 index 0000000000..25c1041b16 --- /dev/null +++ b/.changeset/slimy-sheep-prove.md @@ -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. diff --git a/.changeset/strong-dogs-greet.md b/.changeset/strong-dogs-greet.md new file mode 100644 index 0000000000..3b0749fb02 --- /dev/null +++ b/.changeset/strong-dogs-greet.md @@ -0,0 +1,5 @@ +--- +"@pnpm/headless": patch +--- + +Don't fail on missing peer dependencies. diff --git a/packages/headless/src/index.ts b/packages/headless/src/index.ts index c7649effcd..e5cf3aadb1 100644 --- a/packages/headless/src/index.ts +++ b/packages/headless/src/index.ts @@ -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 | 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}`) } } diff --git a/packages/prune-lockfile/src/index.ts b/packages/prune-lockfile/src/index.ts index 0d83e6ad76..3aa922d2c7 100644 --- a/packages/prune-lockfile/src/index.ts +++ b/packages/prune-lockfile/src/index.ts @@ -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 }) diff --git a/packages/supi/test/install/peerDependencies.ts b/packages/supi/test/install/peerDependencies.ts index 299ab129e4..5e109304c9 100644 --- a/packages/supi/test/install/peerDependencies.ts +++ b/packages/supi/test/install/peerDependencies.ts @@ -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') +})