diff --git a/lib/modules/manager/npm/extract/index.spec.ts b/lib/modules/manager/npm/extract/index.spec.ts index bf5095ee46b317..7f90f02c3d3d8b 100644 --- a/lib/modules/manager/npm/extract/index.spec.ts +++ b/lib/modules/manager/npm/extract/index.spec.ts @@ -483,6 +483,50 @@ describe('modules/manager/npm/extract/index', () => { }); }); + it('extracts volta yarn higher than 1', async () => { + const pJson = { + main: 'index.js', + engines: { + node: '16.0.0', + }, + volta: { + node: '16.0.0', + yarn: '3.2.4', + }, + }; + const pJsonStr = JSON.stringify(pJson); + const res = await npmExtract.extractPackageFile( + pJsonStr, + 'package.json', + defaultConfig + ); + + expect(res).toMatchObject({ + deps: [ + {}, + { + commitMessageTopic: 'Node.js', + currentValue: '16.0.0', + datasource: 'github-tags', + depName: 'node', + depType: 'volta', + packageName: 'nodejs/node', + prettyDepType: 'volta', + versioning: 'node', + }, + { + commitMessageTopic: 'Yarn', + currentValue: '3.2.4', + datasource: 'npm', + depName: 'yarn', + depType: 'volta', + prettyDepType: 'volta', + packageName: '@yarnpkg/cli', + }, + ], + }); + }); + it('extracts non-npmjs', async () => { const pJson = { dependencies: { diff --git a/lib/modules/manager/npm/extract/index.ts b/lib/modules/manager/npm/extract/index.ts index f436af566d2616..89e3a71bc59db9 100644 --- a/lib/modules/manager/npm/extract/index.ts +++ b/lib/modules/manager/npm/extract/index.ts @@ -8,7 +8,7 @@ import { newlineRegex, regEx } from '../../../../util/regex'; import { GithubTagsDatasource } from '../../../datasource/github-tags'; import { NpmDatasource } from '../../../datasource/npm'; import * as nodeVersioning from '../../../versioning/node'; -import { isValid, isVersion } from '../../../versioning/npm'; +import { api, isValid, isVersion } from '../../../versioning/npm'; import type { ExtractConfig, NpmLockFiles, @@ -200,10 +200,9 @@ export async function extractPackageFile( dep.datasource = NpmDatasource.id; dep.commitMessageTopic = 'Yarn'; constraints.yarn = dep.currentValue; - if ( - dep.currentValue.startsWith('2') || - dep.currentValue.startsWith('3') - ) { + const major = + isVersion(dep.currentValue) && api.getMajor(dep.currentValue); + if (major && major > 1) { dep.packageName = '@yarnpkg/cli'; } } else if (depName === 'npm') { @@ -235,6 +234,11 @@ export async function extractPackageFile( } else if (depName === 'yarn') { dep.datasource = NpmDatasource.id; dep.commitMessageTopic = 'Yarn'; + const major = + isVersion(dep.currentValue) && api.getMajor(dep.currentValue); + if (major && major > 1) { + dep.packageName = '@yarnpkg/cli'; + } } else if (depName === 'npm') { dep.datasource = NpmDatasource.id; } else {