feat(manager/npm): support pnpmDedupe (#20392)

Co-authored-by: Rhys Arkins <rhys@arkins.net>
This commit is contained in:
ocavue 2023-02-14 17:10:50 +08:00 committed by GitHub
parent 634eb8f8e3
commit 2235659b18
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
4 changed files with 33 additions and 1 deletions

View file

@ -2168,6 +2168,7 @@ Table with options:
| `gomodTidyE` | Run `go mod tidy -e` after Go module updates. |
| `gomodUpdateImportPaths` | Update source import paths on major module updates, using [mod](https://github.com/marwan-at-work/mod). |
| `npmDedupe` | Run `npm dedupe` after `package-lock.json` updates. |
| `pnpmDedupe` | Run `pnpm dedupe` after `pnpm-lock.yaml` updates. |
| `yarnDedupeFewer` | Run `yarn-deduplicate --strategy fewer` after `yarn.lock` updates. |
| `yarnDedupeHighest` | Run `yarn-deduplicate --strategy highest` (`yarn dedupe --strategy highest` for Yarn >=2.2.0) after `yarn.lock` updates. |

View file

@ -1996,6 +1996,7 @@ const options: RenovateOptions[] = [
'gomodTidy1.17',
'gomodTidyE',
'npmDedupe',
'pnpmDedupe',
'yarnDedupeFewer',
'yarnDedupeHighest',
],

View file

@ -69,6 +69,27 @@ describe('modules/manager/npm/post-update/pnpm', () => {
expect(execSnapshots).toMatchSnapshot();
});
it('performs dedupe', async () => {
const execSnapshots = mockExecAll();
fs.readLocalFile.mockResolvedValue('package-lock-contents');
const postUpdateOptions = ['pnpmDedupe'];
const res = await pnpmHelper.generateLockFile(
'some-dir',
{},
{ ...config, postUpdateOptions }
);
expect(fs.readLocalFile).toHaveBeenCalledTimes(1);
expect(res.lockFile).toBe('package-lock-contents');
expect(execSnapshots).toMatchObject([
{
cmd: 'pnpm install --recursive --lockfile-only --ignore-scripts --ignore-pnpmfile',
},
{
cmd: 'pnpm dedupe',
},
]);
});
it('uses the new version if packageManager is updated', async () => {
const execSnapshots = mockExecAll();
fs.readLocalFile.mockResolvedValue('package-lock-contents');

View file

@ -53,6 +53,8 @@ export async function generateLockFile(
extraEnv.NPM_AUTH = env.NPM_AUTH;
extraEnv.NPM_EMAIL = env.NPM_EMAIL;
}
const commands: string[] = [];
cmd = 'pnpm';
let args = 'install --recursive --lockfile-only';
if (!GlobalConfig.get('allowScripts') || config.ignoreScripts) {
@ -60,6 +62,13 @@ export async function generateLockFile(
args += ' --ignore-pnpmfile';
}
logger.trace({ cmd, args }, 'pnpm command');
commands.push(`${cmd} ${args}`);
// postUpdateOptions
if (config.postUpdateOptions?.includes('pnpmDedupe')) {
logger.debug('Performing pnpm dedupe');
commands.push('pnpm dedupe');
}
if (upgrades.find((upgrade) => upgrade.isLockFileMaintenance)) {
logger.debug(
@ -75,7 +84,7 @@ export async function generateLockFile(
}
}
await exec(`${cmd} ${args}`, execOptions);
await exec(commands, execOptions);
lockFile = await readLocalFile(lockFileName, 'utf8');
} catch (err) /* istanbul ignore next */ {
if (err.message === TEMPORARY_ERROR) {