From 06696f8b373b486200918a3ce83162492326e768 Mon Sep 17 00:00:00 2001 From: Zoltan Kochan Date: Sun, 29 May 2022 02:32:03 +0300 Subject: [PATCH] fix: `pnpm add @teambit/bit` should succeed (#4813) --- .changeset/wet-needles-remain.md | 6 +++++ packages/core/test/install/deepRecursive.ts | 27 +++++++++++++++++++ .../resolve-dependencies/src/nodeIdUtils.ts | 4 +-- .../test/nodeIdUtils.test.ts | 5 ++++ 4 files changed, 40 insertions(+), 2 deletions(-) create mode 100644 .changeset/wet-needles-remain.md create mode 100644 packages/core/test/install/deepRecursive.ts create mode 100644 packages/resolve-dependencies/test/nodeIdUtils.test.ts diff --git a/.changeset/wet-needles-remain.md b/.changeset/wet-needles-remain.md new file mode 100644 index 00000000000..c8dce1ca152 --- /dev/null +++ b/.changeset/wet-needles-remain.md @@ -0,0 +1,6 @@ +--- +"@pnpm/resolve-dependencies": patch +"pnpm": patch +--- + +Correctly detect repeated dependency sequence during resolution. diff --git a/packages/core/test/install/deepRecursive.ts b/packages/core/test/install/deepRecursive.ts new file mode 100644 index 00000000000..196c9ae5015 --- /dev/null +++ b/packages/core/test/install/deepRecursive.ts @@ -0,0 +1,27 @@ +import { prepareEmpty } from '@pnpm/prepare' +import { addDependenciesToPackage } from '@pnpm/core' +import isCI from 'is-ci' +import exists from 'path-exists' +import { testDefaults } from '../utils' + +const testSkipOnCI = isCI ? test.skip : test + +// Looks like GitHub Actions have reduced memory limit for Node.js, +// so it fails in CI at the moment. +testSkipOnCI('a package with a huge amount of circular dependencies and many peer dependencies should successfully be resolved', async () => { + prepareEmpty() + + await addDependenciesToPackage({}, + ['@teambit/bit@0.0.745'], + await testDefaults({ + fastUnpack: true, + lockfileOnly: true, + registries: { + '@teambit': 'https://node.bit.dev/', + }, + strictPeerDependencies: false, + }) + ) + + expect(await exists('pnpm-lock.yaml')).toBeTruthy() +}) diff --git a/packages/resolve-dependencies/src/nodeIdUtils.ts b/packages/resolve-dependencies/src/nodeIdUtils.ts index 7e451366caa..ee497dec30c 100644 --- a/packages/resolve-dependencies/src/nodeIdUtils.ts +++ b/packages/resolve-dependencies/src/nodeIdUtils.ts @@ -3,8 +3,8 @@ export function nodeIdContainsSequence (nodeId: string, pkgId1: string, pkgId2: pkgIds.pop() const pkg1Index = pkgIds.indexOf(pkgId1) if (pkg1Index === -1) return false - const pkg2Index = pkgIds.indexOf(pkgId2) - return pkg2Index > -1 && pkg1Index < pkg2Index + const pkg2Index = pkgIds.lastIndexOf(pkgId2) + return pkg1Index < pkg2Index } export function createNodeId (parentNodeId: string, pkgId: string) { diff --git a/packages/resolve-dependencies/test/nodeIdUtils.test.ts b/packages/resolve-dependencies/test/nodeIdUtils.test.ts new file mode 100644 index 00000000000..6cc4ec3a2e5 --- /dev/null +++ b/packages/resolve-dependencies/test/nodeIdUtils.test.ts @@ -0,0 +1,5 @@ +import { nodeIdContainsSequence } from '../lib/nodeIdUtils' + +test('nodeIdContainsSequence()', () => { + expect(nodeIdContainsSequence('>.>b>a>c>b>a>', 'a', 'b')).toBeTruthy() +})