diff --git a/packages/core/package-manager/src/getCurrentPackageManager.js b/packages/core/package-manager/src/getCurrentPackageManager.js new file mode 100644 index 00000000000..a61897f2365 --- /dev/null +++ b/packages/core/package-manager/src/getCurrentPackageManager.js @@ -0,0 +1,17 @@ +// @flow + +export default function getCurrentPackageManager( + userAgent: ?string = process.env.npm_config_user_agent, +): ?{|name: string, version: string|} { + if (!userAgent) { + return undefined; + } + + const pmSpec = userAgent.split(' ')[0]; + const separatorPos = pmSpec.lastIndexOf('/'); + const name = pmSpec.substring(0, separatorPos); + return { + name: name, + version: pmSpec.substring(separatorPos + 1), + }; +} diff --git a/packages/core/package-manager/src/installPackage.js b/packages/core/package-manager/src/installPackage.js index f23ba1c36f5..1c1f28317dd 100644 --- a/packages/core/package-manager/src/installPackage.js +++ b/packages/core/package-manager/src/installPackage.js @@ -26,6 +26,7 @@ import {Npm} from './Npm'; import {Yarn} from './Yarn'; import {Pnpm} from './Pnpm.js'; import {getConflictingLocalDependencies} from './utils'; +import getCurrentPackageManager from './getCurrentPackageManager'; import validateModuleSpecifier from './validateModuleSpecifier'; async function install( @@ -173,6 +174,15 @@ async function determinePackageInstaller( return new Yarn(); } + let currentPackageManager = getCurrentPackageManager()?.name; + if (currentPackageManager === 'npm') { + return new Npm(); + } else if (currentPackageManager === 'yarn') { + return new Yarn(); + } else if (currentPackageManager === 'pnpm') { + return new Pnpm(); + } + if (await Yarn.exists()) { return new Yarn(); } else if (await Pnpm.exists()) { diff --git a/packages/core/package-manager/test/getCurrentPackageManager.test.js b/packages/core/package-manager/test/getCurrentPackageManager.test.js new file mode 100644 index 00000000000..d3f2331f60c --- /dev/null +++ b/packages/core/package-manager/test/getCurrentPackageManager.test.js @@ -0,0 +1,28 @@ +// @flow +import assert from 'assert'; +import getCurrentPackageManager from '../src/getCurrentPackageManager'; + +describe('getCurrentPackageManager', () => { + it('yarn', () => { + const npm_config_user_agent = 'yarn/1.22.21 npm/? node/v21.1.0 darwin x64'; + const currentPackageManager = getCurrentPackageManager( + npm_config_user_agent, + ); + assert(currentPackageManager?.name, 'yarn'); + }); + it('npm', () => { + const npm_config_user_agent = + 'npm/10.2.0 node/v21.1.0 darwin x64 workspaces/true'; + const currentPackageManager = getCurrentPackageManager( + npm_config_user_agent, + ); + assert(currentPackageManager?.name, 'npm'); + }); + it('pnpm', () => { + const npm_config_user_agent = 'pnpm/8.14.2 npm/? node/v18.17.1 darwin x64'; + const currentPackageManager = getCurrentPackageManager( + npm_config_user_agent, + ); + assert(currentPackageManager?.name, 'pnpm'); + }); +});