diff --git a/.changeset/calm-windows-study.md b/.changeset/calm-windows-study.md new file mode 100644 index 00000000000..6c55568e134 --- /dev/null +++ b/.changeset/calm-windows-study.md @@ -0,0 +1,7 @@ +--- +"@pnpm/filter-lockfile": patch +"@pnpm/headless": patch +"pnpm": patch +--- + +Auto install peer dependencies when auto-install-peers is set to true and the lockfile is up to date [#5213](https://github.com/pnpm/pnpm/issues/5213). diff --git a/packages/filter-lockfile/src/filterLockfileByImportersAndEngine.ts b/packages/filter-lockfile/src/filterLockfileByImportersAndEngine.ts index 6a7313710d9..ea2b563aa09 100644 --- a/packages/filter-lockfile/src/filterLockfileByImportersAndEngine.ts +++ b/packages/filter-lockfile/src/filterLockfileByImportersAndEngine.ts @@ -161,10 +161,7 @@ function pkgAllDeps ( ...pkgSnapshot.dependencies, ...(opts.include.optionalDependencies ? pkgSnapshot.optionalDependencies : {}), }) - .map(([pkgName, ref]) => { - if (pkgSnapshot.peerDependencies?.[pkgName]) return null - return dp.refToRelative(ref, pkgName) - }) + .map(([pkgName, ref]) => dp.refToRelative(ref, pkgName)) .filter((nodeId) => nodeId !== null) as string[] pkgAllDeps(ctx, nextRelDepPaths, installable, opts) diff --git a/packages/headless/test/fixtures/reinstall-peer-deps/.npmrc b/packages/headless/test/fixtures/reinstall-peer-deps/.npmrc new file mode 100644 index 00000000000..3e775efb0f4 --- /dev/null +++ b/packages/headless/test/fixtures/reinstall-peer-deps/.npmrc @@ -0,0 +1 @@ +auto-install-peers=true diff --git a/packages/headless/test/fixtures/reinstall-peer-deps/package.json b/packages/headless/test/fixtures/reinstall-peer-deps/package.json new file mode 100644 index 00000000000..98bc0383993 --- /dev/null +++ b/packages/headless/test/fixtures/reinstall-peer-deps/package.json @@ -0,0 +1,7 @@ +{ + "name": "reinstall-peer-deps", + "version": "1.0.0", + "devDependencies": { + "@pnpm.e2e/abc": "1.0.0" + } +} diff --git a/packages/headless/test/fixtures/reinstall-peer-deps/pnpm-lock.yaml b/packages/headless/test/fixtures/reinstall-peer-deps/pnpm-lock.yaml new file mode 100644 index 00000000000..662599cd849 --- /dev/null +++ b/packages/headless/test/fixtures/reinstall-peer-deps/pnpm-lock.yaml @@ -0,0 +1,37 @@ +lockfileVersion: 5.4 + +specifiers: + '@pnpm.e2e/abc': 1.0.0 +devDependencies: + '@pnpm.e2e/abc': 1.0.0_glqo5zmflraj4jc2fza4v4hjou + +packages: + + /@pnpm.e2e/abc/1.0.0_glqo5zmflraj4jc2fza4v4hjou: + resolution: {integrity: sha512-/BCMmCRQ58DLWtF5iU97Lbf0s+llpWHvvZvQfFnCYFBpa1pfYnlJW1k6+Z4UzcUdYrUvyDmYPwxGVvPStAUw1w==} + peerDependencies: + '@pnpm.e2e/peer-a': ^1.0.0 + '@pnpm.e2e/peer-b': ^1.0.0 + '@pnpm.e2e/peer-c': ^1.0.0 + dependencies: + '@pnpm.e2e/dep-of-pkg-with-1-dep': 100.0.0 + '@pnpm.e2e/peer-a': 1.0.1 + '@pnpm.e2e/peer-b': 1.0.0 + '@pnpm.e2e/peer-c': 1.0.1 + dev: true + + /@pnpm.e2e/dep-of-pkg-with-1-dep/100.0.0: + resolution: {integrity: sha512-KUmwlEiE3pzpmPCfrLkoOO7fmL4Tft+dcm6YQlUfOUJvHO73xlcKVoA/xOHP/ayUO8GiPlIqWRbKHrsxvXGE8g==} + dev: true + + /@pnpm.e2e/peer-a/1.0.1: + resolution: {integrity: sha512-eKxesosmflSp5xnW1gyRhMZ75RLI7SupTZNe1SK6EPDDgNmswNxbwdpyUDFUDWa3yHd5WSQbRDH2IysqMWIs2g==} + dev: true + + /@pnpm.e2e/peer-b/1.0.0: + resolution: {integrity: sha512-jvRKPPRU2qx/AxfcpyO/aSX8TQclpXUXOnUbSLxgBi+P4+InCRkK2u+jFQbcc+b8rIFzR0jr7YCIYLIjRDPPcw==} + dev: true + + /@pnpm.e2e/peer-c/1.0.1: + resolution: {integrity: sha512-6ag+AQOLJgsioiG8aInnOJGautKz7lNf3zKQ8FJHOb4b3yIclmUofTaDwth9ydp9W56qzwbHWXjkdrqfW5JViQ==} + dev: true diff --git a/packages/headless/test/index.ts b/packages/headless/test/index.ts index 75885bd6a7d..a7498c11af8 100644 --- a/packages/headless/test/index.ts +++ b/packages/headless/test/index.ts @@ -528,6 +528,16 @@ test('installation of a dependency that has a resolved peer in subdeps', async ( expect(project.requireModule('pnpm-default-reporter')).toBeTruthy() }) +test('install peer dependencies that are in prod dependencies', async () => { + const prefix = f.prepare('reinstall-peer-deps') + + await headless(await testDefaults({ lockfileDir: prefix })) + + const project = assertProject(prefix) + + await project.has('.pnpm/@pnpm.e2e+peer-a@1.0.1/node_modules/@pnpm.e2e/peer-a') +}) + test('installing with hoistPattern=*', async () => { const prefix = f.prepare('simple-shamefully-flatten') const reporter = jest.fn()