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 00000000..c47b6301 --- /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 00000000..2e800851 --- /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 00000000..4a580188 --- /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 00000000..2e800851 --- /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 b531562a..a0ac912c 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 147feb0e..97ca5534 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([