From 0defcad1a21e22a0c5853bd4c960e3a7081021ed Mon Sep 17 00:00:00 2001 From: John White <750350+johnhwhite@users.noreply.github.com> Date: Sun, 7 May 2023 16:09:13 -0400 Subject: [PATCH] fix(core): migrate using yarn when nxJson has another package manager configured (#16844) (cherry picked from commit 065477610605d5799babc3ba78f26cdfe8737250) --- packages/nx/src/utils/package-manager.spec.ts | 43 +++++++++++++++++++ packages/nx/src/utils/package-manager.ts | 13 +++--- 2 files changed, 51 insertions(+), 5 deletions(-) create mode 100644 packages/nx/src/utils/package-manager.spec.ts diff --git a/packages/nx/src/utils/package-manager.spec.ts b/packages/nx/src/utils/package-manager.spec.ts new file mode 100644 index 0000000000000..4dce36fbcb132 --- /dev/null +++ b/packages/nx/src/utils/package-manager.spec.ts @@ -0,0 +1,43 @@ +jest.mock('fs'); +import * as fs from 'fs'; +import * as configModule from 'nx/src/config/configuration'; +import { detectPackageManager } from 'nx/src/utils/package-manager'; + +describe('package-manager', () => { + it('should detect package manager in nxJson', () => { + jest.spyOn(configModule, 'readNxJson').mockReturnValueOnce({ + cli: { + packageManager: 'pnpm', + }, + }); + const packageManager = detectPackageManager(); + expect(packageManager).toEqual('pnpm'); + expect(fs.existsSync).not.toHaveBeenCalled(); + }); + + it('should detect yarn package manager from yarn.lock', () => { + jest.spyOn(configModule, 'readNxJson').mockReturnValueOnce({}); + (fs.existsSync as jest.Mock).mockReturnValueOnce(true); + const packageManager = detectPackageManager(); + expect(packageManager).toEqual('yarn'); + expect(fs.existsSync).toHaveBeenNthCalledWith(1, 'yarn.lock'); + }); + + it('should detect pnpm package manager from pnpm-lock.yaml', () => { + jest.spyOn(configModule, 'readNxJson').mockReturnValueOnce({}); + (fs.existsSync as jest.Mock).mockImplementation((path) => { + return path === 'pnpm-lock.yaml'; + }); + const packageManager = detectPackageManager(); + expect(packageManager).toEqual('pnpm'); + expect(fs.existsSync).toHaveBeenCalledTimes(3); + }); + + it('should use npm package manager as default', () => { + jest.spyOn(configModule, 'readNxJson').mockReturnValueOnce({}); + (fs.existsSync as jest.Mock).mockReturnValue(false); + const packageManager = detectPackageManager(); + expect(packageManager).toEqual('npm'); + expect(fs.existsSync).toHaveBeenCalledTimes(5); + }); +}); diff --git a/packages/nx/src/utils/package-manager.ts b/packages/nx/src/utils/package-manager.ts index 8416d27d58fb1..ab23a024c99e4 100644 --- a/packages/nx/src/utils/package-manager.ts +++ b/packages/nx/src/utils/package-manager.ts @@ -30,11 +30,14 @@ export interface PackageManagerCommands { */ export function detectPackageManager(dir: string = ''): PackageManager { const nxJson = readNxJson(); - return nxJson.cli?.packageManager ?? existsSync(join(dir, 'yarn.lock')) - ? 'yarn' - : existsSync(join(dir, 'pnpm-lock.yaml')) - ? 'pnpm' - : 'npm'; + return ( + nxJson.cli?.packageManager ?? + (existsSync(join(dir, 'yarn.lock')) + ? 'yarn' + : existsSync(join(dir, 'pnpm-lock.yaml')) + ? 'pnpm' + : 'npm') + ); } /**