From e49243d74de079377b7d67aef298fedac6f36b1b Mon Sep 17 00:00:00 2001 From: AgentEnder Date: Fri, 11 Nov 2022 16:46:57 -0500 Subject: [PATCH] feat(core): add implicitDependencies: '*' --- .../build-nodes/workspace-projects.spec.ts | 32 +++++++++++++++++++ .../build-nodes/workspace-projects.ts | 32 ++++++++++++++++--- .../src/project-graph/build-project-graph.ts | 18 +++++------ 3 files changed, 68 insertions(+), 14 deletions(-) create mode 100644 packages/nx/src/project-graph/build-nodes/workspace-projects.spec.ts diff --git a/packages/nx/src/project-graph/build-nodes/workspace-projects.spec.ts b/packages/nx/src/project-graph/build-nodes/workspace-projects.spec.ts new file mode 100644 index 00000000000000..d31d2e4a33dca5 --- /dev/null +++ b/packages/nx/src/project-graph/build-nodes/workspace-projects.spec.ts @@ -0,0 +1,32 @@ +import { ProjectConfiguration } from 'nx/src/config/workspace-json-project-json'; +import { normalizeImplicitDependencies } from './workspace-projects'; + +describe('workspace-projects', () => { + describe('normalizeImplicitDependencies', () => { + it('should expand "*" implicit dependencies', () => { + expect( + normalizeImplicitDependencies('test-project', ['*'], { + fileMap: {}, + filesToProcess: {}, + workspace: { + version: 2, + projects: { + ...makeProject('test-project'), + ...makeProject('a'), + ...makeProject('b'), + ...makeProject('c'), + }, + }, + }) + ).toEqual(['a', 'b', 'c']); + }); + }); +}); + +function makeProject(name: string): Record { + return { + [name]: { + root: `packages/${name}`, + }, + }; +} diff --git a/packages/nx/src/project-graph/build-nodes/workspace-projects.ts b/packages/nx/src/project-graph/build-nodes/workspace-projects.ts index 479505d308869e..cace8c879f043c 100644 --- a/packages/nx/src/project-graph/build-nodes/workspace-projects.ts +++ b/packages/nx/src/project-graph/build-nodes/workspace-projects.ts @@ -11,7 +11,10 @@ import { ProjectGraphBuilder } from '../project-graph-builder'; import { PackageJson } from 'nx/src/utils/package-json'; import { readJsonFile } from 'nx/src/utils/fileutils'; import { NxJsonConfiguration } from 'nx/src/config/nx-json'; -import { TargetConfiguration } from 'nx/src/config/workspace-json-project-json'; +import { + ProjectConfiguration, + TargetConfiguration, +} from 'nx/src/config/workspace-json-project-json'; export function buildWorkspaceProjectNodes( ctx: ProjectGraphProcessorContext, @@ -22,6 +25,7 @@ export function buildWorkspaceProjectNodes( Object.keys(ctx.workspace.projects).forEach((key) => { const p = ctx.workspace.projects[key]; const projectRoot = join(workspaceRoot, p.root); + if (existsSync(join(projectRoot, 'package.json'))) { p.targets = mergeNpmScriptsWithTargets(projectRoot, p.targets); @@ -42,6 +46,12 @@ export function buildWorkspaceProjectNodes( } } + p.implicitDependencies = normalizeImplicitDependencies( + key, + p.implicitDependencies, + ctx + ); + p.targets = mergeNxDefaultTargetsWithNxTargets( p.targets, nxJson.targetDefaults @@ -59,10 +69,7 @@ export function buildWorkspaceProjectNodes( ? 'e2e' : 'app' : 'lib'; - const tags = - ctx.workspace.projects && ctx.workspace.projects[key] - ? ctx.workspace.projects[key].tags || [] - : []; + const tags = ctx.workspace.projects?.[key]?.tags || []; toAdd.push({ name: key, @@ -112,3 +119,18 @@ function mergeNxDefaultTargetsWithNxTargets( } return targets; } + +export function normalizeImplicitDependencies( + source: string, + implicitDependencies: ProjectConfiguration['implicitDependencies'], + context: ProjectGraphProcessorContext +) { + return implicitDependencies?.flatMap((target) => { + if (target === '*') { + return Object.keys(context.workspace.projects).filter( + (projectName) => projectName !== source + ); + } + return target; + }); +} diff --git a/packages/nx/src/project-graph/build-project-graph.ts b/packages/nx/src/project-graph/build-project-graph.ts index a877027215e051..2dc153c5d98b24 100644 --- a/packages/nx/src/project-graph/build-project-graph.ts +++ b/packages/nx/src/project-graph/build-project-graph.ts @@ -25,7 +25,6 @@ import { getRootTsConfigPath } from '../utils/typescript'; import { ProjectFileMap, ProjectGraph, - ProjectGraphExternalNode, ProjectGraphProcessorContext, } from '../config/project-graph'; import { readJsonFile } from '../utils/fileutils'; @@ -415,14 +414,15 @@ function createContext( fileMap: ProjectFileMap, filesToProcess: ProjectFileMap ): ProjectGraphProcessorContext { - const projects: Record = Object.keys( - projectsConfigurations.projects - ).reduce((map, projectName) => { - map[projectName] = { - ...projectsConfigurations.projects[projectName], - }; - return map; - }, {}); + const projects = Object.keys(projectsConfigurations.projects).reduce( + (map, projectName) => { + map[projectName] = { + ...projectsConfigurations.projects[projectName], + }; + return map; + }, + {} as Record + ); return { workspace: { ...projectsConfigurations,