From b81181179697ecb8d5a9039844b2bbac72804cfc Mon Sep 17 00:00:00 2001 From: Merlin Beutlberger Date: Wed, 9 Nov 2022 15:37:06 +0100 Subject: [PATCH] [INTERNAL] ui5Framework: Resolve dependencies of projects resolved via workspaces --- lib/graph/helpers/ui5Framework.js | 27 ++++++++++++++++++++++++++- 1 file changed, 26 insertions(+), 1 deletion(-) diff --git a/lib/graph/helpers/ui5Framework.js b/lib/graph/helpers/ui5Framework.js index 4acbd17cd..38a0847c6 100644 --- a/lib/graph/helpers/ui5Framework.js +++ b/lib/graph/helpers/ui5Framework.js @@ -47,11 +47,13 @@ class ProjectProcessor { dependencies.push(...resolvedOptionals.filter(($)=>$)); } + let projectIsFromWorkspace = false; if (this._workspace) { const workspaceNode = await this._workspace.getNode(depMetadata.id); if (workspaceNode) { - log.verbose(`Resolved module ${workspaceNode.id} via workspace ${this._workspace.getName()}`); + log.verbose(`Resolved module ${workspaceNode.id} via ${this._workspace.getName()} workspace`); depMetadata = workspaceNode; + projectIsFromWorkspace = true; } } @@ -65,6 +67,29 @@ class ProjectProcessor { dependencies.forEach((dependency) => { projectGraph.declareDependency(libName, dependency); }); + if (projectIsFromWorkspace) { + // Add any dependencies that are only declared in the workspace resolved project + // Do not remove superfluous dependencies (might be added later though) + await Promise.all(project.getFrameworkDependencies().map(async ({name, optional, development}) => { + // Only proceed with dependencies which are not "optional" or "development", + // and not already listed in the dependencies of the original node + if (optional || development || dependencies.includes(name)) { + return; + } + + if (!this._libraryMetadata[name]) { + throw new Error( + `Unable to find dependency ${name}, required by project ${project.getName()} ` + + `(resolved via ${this._workspace.getName()} workspace) in current set of libraries. ` + + `Try adding it temporarily to the root project's dependencies.`); + } + + // TODO: If a cyclic dependency is declared, this will empty the event loop. + // I guess this is a general issue and not limited to projects resolved via workspaces + await this.addProjectToGraph(name, projectGraph); + projectGraph.declareDependency(libName, name); + })); + } } }