diff --git a/packages/nx/src/daemon/server/project-graph-incremental-recomputation.ts b/packages/nx/src/daemon/server/project-graph-incremental-recomputation.ts index cf93177187..3627baeb28 100644 --- a/packages/nx/src/daemon/server/project-graph-incremental-recomputation.ts +++ b/packages/nx/src/daemon/server/project-graph-incremental-recomputation.ts @@ -22,6 +22,7 @@ import { retrieveWorkspaceFiles, retrieveProjectConfigurations, } from '../../project-graph/utils/retrieve-workspace-files'; +import { ProjectConfiguration } from '../../config/workspace-json-project-json'; let cachedSerializedProjectGraphPromise: Promise<{ error: Error | null; @@ -115,8 +116,18 @@ export function addUpdatedAndDeletedFiles( } } -function computeWorkspaceConfigHash(projectsConfigurations: any) { - return hashArray([JSON.stringify(projectsConfigurations)]); +function computeWorkspaceConfigHash( + projectsConfigurations: Record +) { + const projectConfigurationStrings = Object.entries(projectsConfigurations) + .sort(([projectNameA], [projectNameB]) => + projectNameA.localeCompare(projectNameB) + ) + .map( + ([projectName, projectConfig]) => + `${projectName}:${JSON.stringify(projectConfig)}` + ); + return hashArray(projectConfigurationStrings); } /** diff --git a/packages/nx/src/project-graph/file-map-utils.spec.ts b/packages/nx/src/project-graph/file-map-utils.spec.ts index edcdf7d562..1a9eb230f3 100644 --- a/packages/nx/src/project-graph/file-map-utils.spec.ts +++ b/packages/nx/src/project-graph/file-map-utils.spec.ts @@ -1,24 +1,26 @@ +import { ProjectType } from '../config/workspace-json-project-json'; import { createProjectFileMap, updateProjectFileMap } from './file-map-utils'; describe('fileMapUtils', () => { describe('createFileMap', () => { it('should map files to projects', () => { const projectsConfigurations = { + version: 2, projects: { demo: { root: 'apps/demo', sourceRoot: 'apps/demo/src', - projectType: 'application', + projectType: 'application' as ProjectType, }, 'demo-e2e': { root: 'apps/demo-e2e', sourceRoot: 'apps/demo-e2e/src', - projectType: 'application', + projectType: 'application' as ProjectType, }, ui: { root: 'libs/ui', sourceRoot: 'libs/ui/src', - projectType: 'library', + projectType: 'library' as ProjectType, }, }, }; @@ -29,7 +31,7 @@ describe('fileMapUtils', () => { { file: 'tools/myfile.txt', hash: 'some-hash' }, ]; - const result = createProjectFileMap(projectsConfigurations as any, files); + const result = createProjectFileMap(projectsConfigurations, files); expect(result).toEqual({ projectFileMap: { @@ -52,22 +54,20 @@ describe('fileMapUtils', () => { describe('updateFileMap', () => { it('should map files to projects', () => { const projectsConfigurations = { - projects: { - demo: { - root: 'apps/demo', - sourceRoot: 'apps/demo/src', - projectType: 'application', - }, - 'demo-e2e': { - root: 'apps/demo-e2e', - sourceRoot: 'apps/demo-e2e/src', - projectType: 'application', - }, - ui: { - root: 'libs/ui', - sourceRoot: 'libs/ui/src', - projectType: 'library', - }, + demo: { + root: 'apps/demo', + sourceRoot: 'apps/demo/src', + projectType: 'application' as ProjectType, + }, + 'demo-e2e': { + root: 'apps/demo-e2e', + sourceRoot: 'apps/demo-e2e/src', + projectType: 'application' as ProjectType, + }, + ui: { + root: 'libs/ui', + sourceRoot: 'libs/ui/src', + projectType: 'library' as ProjectType, }, }; const files = [ @@ -87,7 +87,7 @@ describe('fileMapUtils', () => { ], }; const result = updateProjectFileMap( - projectsConfigurations as any, + projectsConfigurations, projectFileMap, files, new Map([ diff --git a/packages/nx/src/project-graph/file-map-utils.ts b/packages/nx/src/project-graph/file-map-utils.ts index 270ea7ac8c..35f568c113 100644 --- a/packages/nx/src/project-graph/file-map-utils.ts +++ b/packages/nx/src/project-graph/file-map-utils.ts @@ -7,7 +7,10 @@ import { createProjectRootMappingsFromProjectConfigurations, findProjectForPath, } from './utils/find-project-for-path'; -import { ProjectsConfigurations } from '../config/workspace-json-project-json'; +import { + ProjectConfiguration, + ProjectsConfigurations, +} from '../config/workspace-json-project-json'; import { daemonClient } from '../daemon/client/client'; import { readProjectsConfigurationFromProjectGraph } from './project-graph'; import { fileHasher } from '../hasher/file-hasher'; @@ -52,16 +55,14 @@ export function createProjectFileMap( } export function updateProjectFileMap( - projectsConfigurations: ProjectsConfigurations, + projectsConfigurations: Record, projectFileMap: ProjectFileMap, allWorkspaceFiles: FileData[], updatedFiles: Map, deletedFiles: string[] ): { projectFileMap: ProjectFileMap; allWorkspaceFiles: FileData[] } { const projectRootMappings = - createProjectRootMappingsFromProjectConfigurations( - projectsConfigurations.projects - ); + createProjectRootMappingsFromProjectConfigurations(projectsConfigurations); for (const f of updatedFiles.keys()) { const matchingProjectFiles = diff --git a/packages/nx/src/project-graph/utils/retrieve-workspace-files.ts b/packages/nx/src/project-graph/utils/retrieve-workspace-files.ts index b2df26cd1f..3e8a0d9175 100644 --- a/packages/nx/src/project-graph/utils/retrieve-workspace-files.ts +++ b/packages/nx/src/project-graph/utils/retrieve-workspace-files.ts @@ -84,7 +84,7 @@ export async function retrieveWorkspaceFiles( export async function retrieveProjectConfigurations( workspaceRoot: string, nxJson: NxJsonConfiguration -) { +): Promise> { const { getProjectConfigurations } = require('../../native'); const globs = await configurationGlobs(workspaceRoot, nxJson); return getProjectConfigurations(