diff --git a/packages/nx/src/project-graph/affected/affected-project-graph.spec.ts b/packages/nx/src/project-graph/affected/affected-project-graph.spec.ts index 79c032e2924fb..ff39895df0c0b 100644 --- a/packages/nx/src/project-graph/affected/affected-project-graph.spec.ts +++ b/packages/nx/src/project-graph/affected/affected-project-graph.spec.ts @@ -15,6 +15,7 @@ jest.mock('nx/src/utils/workspace-root', () => ({ describe('project graph', () => { let packageJson: any; + let packageLockJson: any; let workspaceJson: WorkspaceJsonConfiguration; let tsConfigJson: any; let nxJson: NxJsonConfiguration; @@ -24,6 +25,7 @@ describe('project graph', () => { process.env.NX_CACHE_PROJECT_GRAPH = 'false'; packageJson = { name: '@nrwl/workspace-src', + version: '0.0.0', scripts: { deploy: 'echo deploy', }, @@ -34,6 +36,43 @@ describe('project graph', () => { '@nrwl/workspace': '8.0.0', }, }; + packageLockJson = { + name: '@nrwl/workspace-src', + version: '0.0.0', + lockfileVersion: 2, + requires: true, + packages: { + '': packageJson, + 'node_modules/@nrwl/workspace': { + version: '15.0.0', + resolved: + 'https://registry.npmjs.org/@nrwl/workspace/-/@nrwl/workspace-15.0.0.tgz', + integrity: 'sha512-12345678==', + dev: true, + }, + 'node_modules/happy-nrwl': { + version: '4.0.0', + resolved: + 'https://registry.npmjs.org/happy-nrwl/-/happy-nrwl-1.0.0.tgz', + integrity: 'sha512-12345678==', + }, + }, + dependencies: { + '@nrwl/workspace': { + version: '15.0.0', + resolved: + 'https://registry.npmjs.org/@nrwl/workspace/-/@nrwl/workspace-15.0.0.tgz', + integrity: 'sha512-12345678==', + dev: true, + }, + 'happy-nrwl': { + version: '1.0.0', + resolved: + 'https://registry.npmjs.org/happy-nrwl/-/happy-nrwl-1.0.0.tgz', + integrity: 'sha512-12345678==', + }, + }, + }; workspaceJson = { version: 2, projects: { @@ -110,6 +149,7 @@ describe('project graph', () => { import * as happyNrwl from 'happy-nrwl'; `, './package.json': JSON.stringify(packageJson), + './package-lock.json': JSON.stringify(packageLockJson), './nx.json': JSON.stringify(nxJson), './workspace.json': JSON.stringify(workspaceJson), './tsconfig.base.json': JSON.stringify(tsConfigJson), diff --git a/packages/nx/src/project-graph/build-project-graph.spec.ts b/packages/nx/src/project-graph/build-project-graph.spec.ts index 8fbd65306bc85..634fa87369735 100644 --- a/packages/nx/src/project-graph/build-project-graph.spec.ts +++ b/packages/nx/src/project-graph/build-project-graph.spec.ts @@ -13,6 +13,7 @@ import { DependencyType } from '../config/project-graph'; describe('project graph', () => { let packageJson: any; + let packageLockJson: any; let workspaceJson: WorkspaceJsonConfiguration; let nxJson: NxJsonConfiguration; let tsConfigJson: any; @@ -22,6 +23,7 @@ describe('project graph', () => { defaultFileHasher.ensureInitialized(); packageJson = { name: '@nrwl/workspace-src', + version: '0.0.0', dependencies: { express: '4.0.0', 'happy-nrwl': '1.0.0', @@ -30,6 +32,56 @@ describe('project graph', () => { '@nrwl/workspace': '*', }, }; + packageLockJson = { + name: '@nrwl/workspace-src', + version: '0.0.0', + lockfileVersion: 2, + requires: true, + packages: { + '': packageJson, + 'node_modules/@nrwl/workspace': { + version: '15.0.0', + resolved: + 'https://registry.npmjs.org/@nrwl/workspace/-/@nrwl/workspace-15.0.0.tgz', + integrity: 'sha512-12345678==', + dev: true, + }, + 'node_modules/express': { + version: '4.0.0', + resolved: 'https://registry.npmjs.org/express/-/express-4.0.0.tgz', + integrity: 'sha512-12345678==', + engines: { + node: '>=4.2.0', + }, + }, + 'node_modules/happy-nrwl': { + version: '4.0.0', + resolved: + 'https://registry.npmjs.org/happy-nrwl/-/happy-nrwl-1.0.0.tgz', + integrity: 'sha512-12345678==', + }, + }, + dependencies: { + '@nrwl/workspace': { + version: '15.0.0', + resolved: + 'https://registry.npmjs.org/@nrwl/workspace/-/@nrwl/workspace-15.0.0.tgz', + integrity: 'sha512-12345678==', + dev: true, + }, + express: { + version: '4.0.0', + resolved: 'https://registry.npmjs.org/express/-/express-4.0.0.tgz', + integrity: 'sha512-12345678==', + }, + 'happy-nrwl': { + version: '1.0.0', + resolved: + 'https://registry.npmjs.org/happy-nrwl/-/happy-nrwl-1.0.0.tgz', + integrity: 'sha512-12345678==', + }, + }, + }; workspaceJson = { version: 2, projects: { @@ -125,6 +177,7 @@ describe('project graph', () => { export const LAZY = 'lazy lib'; `, './package.json': JSON.stringify(packageJson), + './package-lock.json': JSON.stringify(packageLockJson), './nx.json': JSON.stringify(nxJson), './workspace.json': JSON.stringify(workspaceJson), './tsconfig.base.json': JSON.stringify(tsConfigJson), diff --git a/packages/nx/src/project-graph/build-project-graph.ts b/packages/nx/src/project-graph/build-project-graph.ts index 9c3743ce21206..f85818ba54130 100644 --- a/packages/nx/src/project-graph/build-project-graph.ts +++ b/packages/nx/src/project-graph/build-project-graph.ts @@ -39,6 +39,7 @@ import { readAllWorkspaceConfiguration, readNxJson, } from '../config/configuration'; +import { lockFileHash, parseLockFile } from '../utils/lock-file/lock-file'; export async function buildProjectGraph() { const projectConfigurations = readAllWorkspaceConfiguration(); @@ -95,6 +96,12 @@ export async function buildProjectGraphUsingProjectFileMap( filesToProcess = projectFileMap; cachedFileData = {}; } + let lockFileData; + if (cache && cache.lockFile && cache.lockFile.hash === lockFileHash()) { + lockFileData = cache.lockFile; + } else { + lockFileData = parseLockFile(); + } const context = createContext( projectsConfigurations, nxJson, @@ -112,7 +119,8 @@ export async function buildProjectGraphUsingProjectFileMap( nxJson, packageJsonDeps, projectGraph, - rootTsConfig + rootTsConfig, + lockFileData ); if (shouldWriteCache) { writeCache(projectGraphCache); diff --git a/packages/nx/src/project-graph/nx-deps-cache.spec.ts b/packages/nx/src/project-graph/nx-deps-cache.spec.ts index 2266e6edc6b8b..27ff1415d7f8e 100644 --- a/packages/nx/src/project-graph/nx-deps-cache.spec.ts +++ b/packages/nx/src/project-graph/nx-deps-cache.spec.ts @@ -4,7 +4,6 @@ import { ProjectGraphCache, shouldRecomputeWholeGraph, } from './nx-deps-cache'; -import { createCache } from './nx-deps-cache'; import { ProjectGraph } from '../config/project-graph'; import { WorkspaceJsonConfiguration } from '../config/workspace-json-project-json'; import { NxJsonConfiguration } from '../config/nx-json'; @@ -299,7 +298,8 @@ describe('nx deps utils', () => { createNxJson({}), createPackageJsonDeps({}), createCache({}) as ProjectGraph, - {} + {}, + { dependencies: {}, hash: '' } ); }); @@ -308,7 +308,8 @@ describe('nx deps utils', () => { createNxJson({}), createPackageJsonDeps({}), createCache({}) as ProjectGraph, - undefined + undefined, + { dependencies: {}, hash: '' } ); expect(result).toBeDefined(); @@ -322,6 +323,10 @@ describe('nx deps utils', () => { '@nrwl/workspace': '12.0.0', plugin: '1.0.0', }, + lockFile: { + dependencies: {}, + hash: '', + }, pathMappings: { mylib: ['libs/mylib/index.ts'], }, diff --git a/packages/nx/src/project-graph/nx-deps-cache.ts b/packages/nx/src/project-graph/nx-deps-cache.ts index 63c145c39cb8f..da14a361355f8 100644 --- a/packages/nx/src/project-graph/nx-deps-cache.ts +++ b/packages/nx/src/project-graph/nx-deps-cache.ts @@ -15,10 +15,12 @@ import { import { readJsonFile, writeJsonFile } from '../utils/fileutils'; import { NxJsonConfiguration } from '../config/nx-json'; import { ProjectsConfigurations } from '../config/workspace-json-project-json'; +import { LockFileData } from '../utils/lock-file/lock-file-type'; export interface ProjectGraphCache { version: string; deps: Record; + lockFile: LockFileData; pathMappings: Record; nxJsonPlugins: { name: string; version: string }[]; pluginsConfig?: any; @@ -81,7 +83,8 @@ export function createCache( nxJson: NxJsonConfiguration<'*' | string[]>, packageJsonDeps: Record, projectGraph: ProjectGraph, - tsConfig: { compilerOptions?: { paths?: { [p: string]: any } } } + tsConfig: { compilerOptions?: { paths?: { [p: string]: any } } }, + lockFileData: LockFileData ) { const nxJsonPlugins = (nxJson.plugins || []).map((p) => ({ name: p, @@ -90,6 +93,7 @@ export function createCache( const newValue: ProjectGraphCache = { version: projectGraph.version || '5.0', deps: packageJsonDeps, + lockFile: lockFileData, // compilerOptions may not exist, especially for repos converted through add-nx-to-monorepo pathMappings: tsConfig?.compilerOptions?.paths || {}, nxJsonPlugins, diff --git a/packages/nx/src/project-graph/project-graph.ts b/packages/nx/src/project-graph/project-graph.ts index baba451f025fc..5b328c3d3dd54 100644 --- a/packages/nx/src/project-graph/project-graph.ts +++ b/packages/nx/src/project-graph/project-graph.ts @@ -182,7 +182,7 @@ export function projectGraphAdapter( if (sourceVersion === targetVersion) { return projectGraph; } - if (sourceVersion === '5.0' && targetVersion === '4.0') { + if (+sourceVersion >= 5 && targetVersion === '4.0') { return projectGraphCompat5to4(projectGraph as ProjectGraph); } throw new Error( diff --git a/packages/nx/src/utils/lock-file/lock-file.ts b/packages/nx/src/utils/lock-file/lock-file.ts index 60fe53473e2a2..a49f3ea595ad2 100644 --- a/packages/nx/src/utils/lock-file/lock-file.ts +++ b/packages/nx/src/utils/lock-file/lock-file.ts @@ -1,4 +1,4 @@ -import { readFileSync, writeFileSync } from 'fs-extra'; +import { readFileSync, writeFileSync } from 'fs'; import { detectPackageManager, PackageManager } from '../package-manager'; import { parseYarnLockFile, @@ -17,19 +17,21 @@ import { } from './pnpm'; import { LockFileData } from './lock-file-type'; import { hashLockFile } from './utils'; +import { workspaceRoot } from '../workspace-root'; +import { join } from 'path'; export function lockFileHash( packageManager: PackageManager = detectPackageManager() ): string { let file: string; if (packageManager === 'yarn') { - file = readFileSync('yarn.lock', 'utf8'); + file = readFileSync(join(workspaceRoot, 'yarn.lock'), 'utf8'); } if (packageManager === 'pnpm') { - file = readFileSync('pnpm-lock.yaml', 'utf8'); + file = readFileSync(join(workspaceRoot, 'pnpm-lock.yaml'), 'utf8'); } if (packageManager === 'npm') { - file = readFileSync('package-lock.json', 'utf8'); + file = readFileSync(join(workspaceRoot, 'package-lock.json'), 'utf8'); } if (file) { return hashLockFile(file); @@ -47,15 +49,15 @@ export function parseLockFile( packageManager: PackageManager = detectPackageManager() ): LockFileData { if (packageManager === 'yarn') { - const file = readFileSync('yarn.lock', 'utf8'); + const file = readFileSync(join(workspaceRoot, 'yarn.lock'), 'utf8'); return parseYarnLockFile(file); } if (packageManager === 'pnpm') { - const file = readFileSync('pnpm-lock.yaml', 'utf8'); + const file = readFileSync(join(workspaceRoot, 'pnpm-lock.yaml'), 'utf8'); return parsePnpmLockFile(file); } if (packageManager === 'npm') { - const file = readFileSync('package-lock.json', 'utf8'); + const file = readFileSync(join(workspaceRoot, 'package-lock.json'), 'utf8'); return parseNpmLockFile(file); } throw Error(`Unknown package manager: ${packageManager}`); diff --git a/packages/nx/src/utils/lock-file/npm.ts b/packages/nx/src/utils/lock-file/npm.ts index 4def805f890a6..1d4c35e5d37c0 100644 --- a/packages/nx/src/utils/lock-file/npm.ts +++ b/packages/nx/src/utils/lock-file/npm.ts @@ -1,4 +1,3 @@ -import { defaultHashing } from '../../hasher/hashing-impl'; import { LockFileData, PackageDependency } from './lock-file-type'; import { hashLockFile, sortObject } from './utils'; diff --git a/packages/nx/src/utils/lock-file/pnpm.ts b/packages/nx/src/utils/lock-file/pnpm.ts index 7685411254c66..7933fed37abd3 100644 --- a/packages/nx/src/utils/lock-file/pnpm.ts +++ b/packages/nx/src/utils/lock-file/pnpm.ts @@ -1,7 +1,6 @@ import { LockFileData, PackageDependency } from './lock-file-type'; import { load, dump } from '@zkochan/js-yaml'; import { hashLockFile, sortObject } from './utils'; -import { defaultHashing } from '../../hasher/hashing-impl'; type PackageMeta = { key: string;