From 9a030292c1c25cc5fa9ddb430d2b3d06fa25b67c Mon Sep 17 00:00:00 2001 From: Hugo Alliaume Date: Thu, 22 Aug 2024 09:11:43 +0200 Subject: [PATCH] Add support for PNPM for installation commands --- .../pnpm-yarn-npm/package-lock.json | 5 +++++ .../pnpm-yarn-npm/pnpm-lock.yaml | 5 +++++ .../package-helper/pnpm-yarn-npm/yarn.lock | 2 ++ fixtures/package-helper/pnpm/pnpm-lock.yaml | 5 +++++ lib/package-helper.js | 12 +++++++---- test/package-helper.js | 20 ++++++++++++++++++- 6 files changed, 44 insertions(+), 5 deletions(-) create mode 100644 fixtures/package-helper/pnpm-yarn-npm/package-lock.json create mode 100644 fixtures/package-helper/pnpm-yarn-npm/pnpm-lock.yaml create mode 100644 fixtures/package-helper/pnpm-yarn-npm/yarn.lock create mode 100644 fixtures/package-helper/pnpm/pnpm-lock.yaml diff --git a/fixtures/package-helper/pnpm-yarn-npm/package-lock.json b/fixtures/package-helper/pnpm-yarn-npm/package-lock.json new file mode 100644 index 000000000..c47b63013 --- /dev/null +++ b/fixtures/package-helper/pnpm-yarn-npm/package-lock.json @@ -0,0 +1,5 @@ +{ + "name": "foo", + "version": "1.0.0", + "lockfileVersion": 1 +} \ No newline at end of file diff --git a/fixtures/package-helper/pnpm-yarn-npm/pnpm-lock.yaml b/fixtures/package-helper/pnpm-yarn-npm/pnpm-lock.yaml new file mode 100644 index 000000000..2e8008519 --- /dev/null +++ b/fixtures/package-helper/pnpm-yarn-npm/pnpm-lock.yaml @@ -0,0 +1,5 @@ +lockfileVersion: '6.0' + +settings: + autoInstallPeers: true + excludeLinksFromLockfile: false diff --git a/fixtures/package-helper/pnpm-yarn-npm/yarn.lock b/fixtures/package-helper/pnpm-yarn-npm/yarn.lock new file mode 100644 index 000000000..4a5801883 --- /dev/null +++ b/fixtures/package-helper/pnpm-yarn-npm/yarn.lock @@ -0,0 +1,2 @@ +# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. +# yarn lockfile v1 diff --git a/fixtures/package-helper/pnpm/pnpm-lock.yaml b/fixtures/package-helper/pnpm/pnpm-lock.yaml new file mode 100644 index 000000000..2e8008519 --- /dev/null +++ b/fixtures/package-helper/pnpm/pnpm-lock.yaml @@ -0,0 +1,5 @@ +lockfileVersion: '6.0' + +settings: + autoInstallPeers: true + excludeLinksFromLockfile: false diff --git a/lib/package-helper.js b/lib/package-helper.js index b531562aa..a0ac912c2 100644 --- a/lib/package-helper.js +++ b/lib/package-helper.js @@ -32,8 +32,8 @@ ${missingPackagesRecommendation.message} } function getInstallCommand(packageConfigs) { + const hasPnpmLockfile = fs.existsSync('pnpm-lock.yaml'); const hasYarnLockfile = fs.existsSync('yarn.lock'); - const hasNpmLockfile = fs.existsSync('package-lock.json'); const packageInstallStrings = packageConfigs.map((packageConfig) => { const firstPackage = packageConfig[0]; @@ -51,11 +51,15 @@ function getInstallCommand(packageConfigs) { return `${firstPackage.name}@${recommendedVersion}`; }); - if (hasNpmLockfile && !hasYarnLockfile) { - return chalk.yellow(`npm install ${packageInstallStrings.join(' ')} --save-dev`); + if (hasPnpmLockfile) { + return chalk.yellow(`pnpm add ${packageInstallStrings.join(' ')} --save-dev`); } - return chalk.yellow(`yarn add ${packageInstallStrings.join(' ')} --dev`); + if (hasYarnLockfile) { + return chalk.yellow(`yarn add ${packageInstallStrings.join(' ')} --dev`); + } + + return chalk.yellow(`npm install ${packageInstallStrings.join(' ')} --save-dev`); } function isPackageInstalled(packageConfig) { diff --git a/test/package-helper.js b/test/package-helper.js index 147feb0ef..97ca55348 100644 --- a/test/package-helper.js +++ b/test/package-helper.js @@ -29,7 +29,7 @@ describe('package-helper', () => { const packageRecommendations = packageHelper.getMissingPackageRecommendations([ { name: 'foo' }, { name: 'webpack' }, { name: 'bar' } ]); - expect(packageRecommendations.installCommand).to.contain('yarn add foo bar'); + expect(packageRecommendations.installCommand).to.contain('npm install foo bar'); expect(stripAnsi(packageRecommendations.message)).to.contain('foo & bar'); }); @@ -51,6 +51,15 @@ describe('package-helper', () => { expect(stripAnsi(packageRecommendations.message)).to.contain('foo & bar'); }); + it('missing packages with pnpm-lock.yaml only', () => { + process.chdir(path.join(__dirname, '../fixtures/package-helper/pnpm')); + const packageRecommendations = packageHelper.getMissingPackageRecommendations([ + { name: 'foo' }, { name: 'webpack' }, { name: 'bar' } + ]); + expect(packageRecommendations.installCommand).to.contain('pnpm add foo bar'); + expect(stripAnsi(packageRecommendations.message)).to.contain('foo & bar'); + }); + it('missing packages with both package-lock.json and yarn.lock', () => { process.chdir(path.join(__dirname, '../fixtures/package-helper/yarn-npm')); const packageRecommendations = packageHelper.getMissingPackageRecommendations([ @@ -60,6 +69,15 @@ describe('package-helper', () => { expect(stripAnsi(packageRecommendations.message)).to.contain('foo & bar'); }); + it('missing packages with package-lock.json, yarn.lock and pnpm-lock.yaml', () => { + process.chdir(path.join(__dirname, '../fixtures/package-helper/pnpm-yarn-npm')); + const packageRecommendations = packageHelper.getMissingPackageRecommendations([ + { name: 'foo' }, { name: 'webpack' }, { name: 'bar' } + ]); + expect(packageRecommendations.installCommand).to.contain('pnpm add foo bar'); + expect(stripAnsi(packageRecommendations.message)).to.contain('foo & bar'); + }); + it('missing packages with alternative packages', () => { process.chdir(path.join(__dirname, '../fixtures/package-helper/yarn')); const packageRecommendations = packageHelper.getMissingPackageRecommendations([