diff --git a/packages/nx/src/utils/project-graph-utils.spec.ts b/packages/nx/src/utils/project-graph-utils.spec.ts index e6c34c52a4..cb006e2e6f 100644 --- a/packages/nx/src/utils/project-graph-utils.spec.ts +++ b/packages/nx/src/utils/project-graph-utils.spec.ts @@ -77,6 +77,18 @@ describe('project graph utils', () => { expect(paths).toContain(projGraph.nodes['core'].data.sourceRoot); }); + it('should handle circular dependencies', () => { + projGraph.dependencies['core'] = [ + { + type: 'static', + source: 'core', + target: 'demo-app', + }, + ]; + const paths = getSourceDirOfDependentProjects('demo-app', projGraph); + expect(paths).toContain(projGraph.nodes['ui'].data.sourceRoot); + }); + it('should throw an error if the project does not exist', () => { expect(() => getSourceDirOfDependentProjects('non-existent-app', projGraph) diff --git a/packages/nx/src/utils/project-graph-utils.ts b/packages/nx/src/utils/project-graph-utils.ts index ab83ec404e..3e4eeea82e 100644 --- a/packages/nx/src/utils/project-graph-utils.ts +++ b/packages/nx/src/utils/project-graph-utils.ts @@ -139,6 +139,11 @@ function collectDependentProjectNodesNames( continue; } + // skip dependencies already added (avoid circular dependencies) + if (dependencyNodeNames.has(dependencyName)) { + continue; + } + dependencyNodeNames.add(dependencyName); // Get the dependencies of the dependencies