From a739d4c4c44508f369b921d3467d891491f12614 Mon Sep 17 00:00:00 2001 From: bestlyg Date: Thu, 25 Jan 2024 18:42:50 +0800 Subject: [PATCH 1/4] feat: add getCurrentPackageManager --- packages/core/package-manager/package.json | 1 + .../src/getCurrentPackageManager.js | 17 +++++++++ .../package-manager/src/installPackage.js | 10 +++++ .../test/getCurrentPackageManager.test.js | 38 +++++++++++++++++++ 4 files changed, 66 insertions(+) create mode 100644 packages/core/package-manager/src/getCurrentPackageManager.js create mode 100644 packages/core/package-manager/test/getCurrentPackageManager.test.js diff --git a/packages/core/package-manager/package.json b/packages/core/package-manager/package.json index a34d4931d3e..4b5053e7010 100644 --- a/packages/core/package-manager/package.json +++ b/packages/core/package-manager/package.json @@ -23,6 +23,7 @@ "scripts": { "build-ts": "mkdir -p lib && flow-to-ts src/types.js > lib/types.d.ts", "check-ts": "tsc --noEmit index.d.ts", + "log:agent": "node -e \"console.log(process.env.npm_config_user_agent)\"", "test": "mocha test" }, "targets": { diff --git a/packages/core/package-manager/src/getCurrentPackageManager.js b/packages/core/package-manager/src/getCurrentPackageManager.js new file mode 100644 index 00000000000..11ae89db701 --- /dev/null +++ b/packages/core/package-manager/src/getCurrentPackageManager.js @@ -0,0 +1,17 @@ +// @flow + +export default function getCurrentPackageManager( + userAgent = process.env.npm_config_user_agent, +) { + 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..b74e146605a 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(); } + const name = getCurrentPackageManager().name; + if (name === 'npm') { + return new Npm(); + } else if (name === 'yarn') { + return new Yarn(); + } else if (name === '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..50bb776c2fe --- /dev/null +++ b/packages/core/package-manager/test/getCurrentPackageManager.test.js @@ -0,0 +1,38 @@ +// @flow +import assert from 'assert'; +import {Npm} from '../src/Npm'; +import {Yarn} from '../src/Yarn'; +import {Pnpm} from '../src/Pnpm.js'; +import {execSync} from 'child_process'; +import getCurrentPackageManager from '../src/getCurrentPackageManager'; + +const pmlist = [ + { + pm: 'npm', + installer: Npm, + }, + { + pm: 'yarn', + installer: Yarn, + }, + { + pm: 'pnpm', + installer: Pnpm, + }, +]; + +describe('getCurrentPackageManager', () => { + for (const {pm, installer} of pmlist) { + it(pm, async () => { + const exists = installer.exists ? await installer.exists() : true; + if (exists) { + delete process.env.npm_config_user_agent; + const res = execSync(`${pm} -s run log:agent`, { + stdio: 'pipe', + }).toString(); + const data = getCurrentPackageManager(res); + assert(data.name, pm); + } + }); + } +}); From b9cb6163a9599052880ed45a9822c6be39d9cd1f Mon Sep 17 00:00:00 2001 From: bestlyg Date: Fri, 26 Jan 2024 19:23:18 +0800 Subject: [PATCH 2/4] feat: update type of getCurrentPackageManager --- packages/core/package-manager/package.json | 1 - .../src/getCurrentPackageManager.js | 4 +- .../package-manager/src/installPackage.js | 17 ++++--- .../test/getCurrentPackageManager.test.js | 44 +++++++++++-------- 4 files changed, 38 insertions(+), 28 deletions(-) diff --git a/packages/core/package-manager/package.json b/packages/core/package-manager/package.json index 4b5053e7010..a34d4931d3e 100644 --- a/packages/core/package-manager/package.json +++ b/packages/core/package-manager/package.json @@ -23,7 +23,6 @@ "scripts": { "build-ts": "mkdir -p lib && flow-to-ts src/types.js > lib/types.d.ts", "check-ts": "tsc --noEmit index.d.ts", - "log:agent": "node -e \"console.log(process.env.npm_config_user_agent)\"", "test": "mocha test" }, "targets": { diff --git a/packages/core/package-manager/src/getCurrentPackageManager.js b/packages/core/package-manager/src/getCurrentPackageManager.js index 11ae89db701..a61897f2365 100644 --- a/packages/core/package-manager/src/getCurrentPackageManager.js +++ b/packages/core/package-manager/src/getCurrentPackageManager.js @@ -1,8 +1,8 @@ // @flow export default function getCurrentPackageManager( - userAgent = process.env.npm_config_user_agent, -) { + userAgent: ?string = process.env.npm_config_user_agent, +): ?{|name: string, version: string|} { if (!userAgent) { return undefined; } diff --git a/packages/core/package-manager/src/installPackage.js b/packages/core/package-manager/src/installPackage.js index b74e146605a..933a769f9df 100644 --- a/packages/core/package-manager/src/installPackage.js +++ b/packages/core/package-manager/src/installPackage.js @@ -174,13 +174,16 @@ async function determinePackageInstaller( return new Yarn(); } - const name = getCurrentPackageManager().name; - if (name === 'npm') { - return new Npm(); - } else if (name === 'yarn') { - return new Yarn(); - } else if (name === 'pnpm') { - return new Pnpm(); + const currentPackageManager = getCurrentPackageManager(); + if (currentPackageManager) { + const name = currentPackageManager.name; + if (name === 'npm') { + return new Npm(); + } else if (name === 'yarn') { + return new Yarn(); + } else if (name === 'pnpm') { + return new Pnpm(); + } } if (await Yarn.exists()) { diff --git a/packages/core/package-manager/test/getCurrentPackageManager.test.js b/packages/core/package-manager/test/getCurrentPackageManager.test.js index 50bb776c2fe..57c89d0cd8b 100644 --- a/packages/core/package-manager/test/getCurrentPackageManager.test.js +++ b/packages/core/package-manager/test/getCurrentPackageManager.test.js @@ -1,38 +1,46 @@ // @flow import assert from 'assert'; -import {Npm} from '../src/Npm'; import {Yarn} from '../src/Yarn'; import {Pnpm} from '../src/Pnpm.js'; import {execSync} from 'child_process'; import getCurrentPackageManager from '../src/getCurrentPackageManager'; -const pmlist = [ +const pmlist: Array<{exists: () => Promise, pm: string, ...}> = [ { pm: 'npm', - installer: Npm, + exists: () => Promise.resolve(true), }, { pm: 'yarn', - installer: Yarn, + exists: () => Yarn.exists(), }, { pm: 'pnpm', - installer: Pnpm, + exists: () => Pnpm.exists(), }, ]; describe('getCurrentPackageManager', () => { - for (const {pm, installer} of pmlist) { - it(pm, async () => { - const exists = installer.exists ? await installer.exists() : true; - if (exists) { - delete process.env.npm_config_user_agent; - const res = execSync(`${pm} -s run log:agent`, { - stdio: 'pipe', - }).toString(); - const data = getCurrentPackageManager(res); - assert(data.name, pm); - } - }); - } + 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'); + }); }); From 9f14aa6c0d9a84dc557e376290323f61ccb746c4 Mon Sep 17 00:00:00 2001 From: bestlyg Date: Fri, 26 Jan 2024 21:12:56 +0800 Subject: [PATCH 3/4] feat: update the format of getCurrentPackageManager test code --- .../test/getCurrentPackageManager.test.js | 18 ------------------ 1 file changed, 18 deletions(-) diff --git a/packages/core/package-manager/test/getCurrentPackageManager.test.js b/packages/core/package-manager/test/getCurrentPackageManager.test.js index 57c89d0cd8b..d3f2331f60c 100644 --- a/packages/core/package-manager/test/getCurrentPackageManager.test.js +++ b/packages/core/package-manager/test/getCurrentPackageManager.test.js @@ -1,25 +1,7 @@ // @flow import assert from 'assert'; -import {Yarn} from '../src/Yarn'; -import {Pnpm} from '../src/Pnpm.js'; -import {execSync} from 'child_process'; import getCurrentPackageManager from '../src/getCurrentPackageManager'; -const pmlist: Array<{exists: () => Promise, pm: string, ...}> = [ - { - pm: 'npm', - exists: () => Promise.resolve(true), - }, - { - pm: 'yarn', - exists: () => Yarn.exists(), - }, - { - pm: 'pnpm', - exists: () => Pnpm.exists(), - }, -]; - describe('getCurrentPackageManager', () => { it('yarn', () => { const npm_config_user_agent = 'yarn/1.22.21 npm/? node/v21.1.0 darwin x64'; From 32005fcf077f7c06188619ca8bbe170782999094 Mon Sep 17 00:00:00 2001 From: Niklas Mischkulnig <4586894+mischnic@users.noreply.github.com> Date: Fri, 26 Jan 2024 17:44:40 +0100 Subject: [PATCH 4/4] Update packages/core/package-manager/src/installPackage.js --- .../core/package-manager/src/installPackage.js | 17 +++++++---------- 1 file changed, 7 insertions(+), 10 deletions(-) diff --git a/packages/core/package-manager/src/installPackage.js b/packages/core/package-manager/src/installPackage.js index 933a769f9df..1c1f28317dd 100644 --- a/packages/core/package-manager/src/installPackage.js +++ b/packages/core/package-manager/src/installPackage.js @@ -174,16 +174,13 @@ async function determinePackageInstaller( return new Yarn(); } - const currentPackageManager = getCurrentPackageManager(); - if (currentPackageManager) { - const name = currentPackageManager.name; - if (name === 'npm') { - return new Npm(); - } else if (name === 'yarn') { - return new Yarn(); - } else if (name === 'pnpm') { - return new Pnpm(); - } + 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()) {