From 8e4a38e764e92615726b0e45e6e6688d4e3f08d0 Mon Sep 17 00:00:00 2001 From: Daniel Harvey Date: Thu, 5 May 2022 06:16:17 +0800 Subject: [PATCH] fix(core): skip dependencies already added (avoid circular dependencies) (#9744) * fix(core): Skip dependencies already added (avoid circular) The project utility method `collectDependentProjectNodesNames()` produces a stack overflow (e.g. producing project dependencies for `tailwind.config.js` when circular dependencies exist. Fix by adding loop detection for "already add" dependencies. * cleanup(core): Correct formating * chore(core): add test for circular dependencies in getSourceDirOfDependentProjects Co-authored-by: Jason Jean --- packages/nx/src/utils/project-graph-utils.spec.ts | 12 ++++++++++++ packages/nx/src/utils/project-graph-utils.ts | 5 +++++ 2 files changed, 17 insertions(+) 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