fix(core): update yarn-parser to handle yarn v4 syntax for root workspace package (#29452)

<!-- Please make sure you have read the submission guidelines before
posting an PR -->
<!--
https://github.com/nrwl/nx/blob/master/CONTRIBUTING.md#-submitting-a-pr
-->

<!-- Please make sure that your commit message follows our format -->
<!-- Example: `fix(nx): must begin with lowercase` -->

<!-- If this is a particularly complex change or feature addition, you
can request a dedicated Nx release for this pull request branch. Mention
someone from the Nx team or the `@nrwl/nx-pipelines-reviewers` and they
will confirm if the PR warrants its own release for testing purposes,
and generate it for you if appropriate. -->

## Current Behavior
The root workspace package is not generated correctly when using Yarn v4

## Expected Behavior
yarn.lock should be created correctly

## Related Issue(s)

Fixes #29451
This commit is contained in:
Zach Tindall 2025-01-21 17:12:18 -05:00 committed by GitHub
parent cf206c3928
commit 3c98a1ca56
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
3 changed files with 34 additions and 5 deletions

View File

@ -25,6 +25,7 @@ export type NormalizedPackageJson = Pick<
| 'peerDependencies' | 'peerDependencies'
| 'peerDependenciesMeta' | 'peerDependenciesMeta'
| 'optionalDependencies' | 'optionalDependencies'
| 'packageManager'
>; >;
/** /**
@ -42,6 +43,7 @@ export function normalizePackageJson(
peerDependencies, peerDependencies,
peerDependenciesMeta, peerDependenciesMeta,
optionalDependencies, optionalDependencies,
packageManager,
} = packageJson; } = packageJson;
return { return {
@ -53,5 +55,6 @@ export function normalizePackageJson(
peerDependencies, peerDependencies,
peerDependenciesMeta, peerDependenciesMeta,
optionalDependencies, optionalDependencies,
packageManager,
}; };
} }

View File

@ -2596,6 +2596,7 @@ __metadata:
dependencies: { dependencies: {
resolve: '^1.12.0', resolve: '^1.12.0',
}, },
packageManager: 'yarn@3.0.0',
}; };
const hash = uniq('mock-hash'); const hash = uniq('mock-hash');
@ -2721,6 +2722,7 @@ __metadata:
dependencies: { dependencies: {
resolve: '^1.12.0', resolve: '^1.12.0',
}, },
packageManager: 'yarn@4.0.0',
}; };
const hash = uniq('mock-hash'); const hash = uniq('mock-hash');
@ -2771,7 +2773,7 @@ __metadata:
version: 0.0.0-use.local version: 0.0.0-use.local
resolution: "@my-ns/example@workspace:." resolution: "@my-ns/example@workspace:."
dependencies: dependencies:
resolve: ^1.12.0 resolve: "npm:^1.12.0"
languageName: unknown languageName: unknown
linkType: soft linkType: soft

View File

@ -602,18 +602,42 @@ const BERRY_LOCK_FILE_DISCLAIMER = `# This file is generated by running "yarn in
function generateRootWorkspacePackage( function generateRootWorkspacePackage(
packageJson: NormalizedPackageJson packageJson: NormalizedPackageJson
): YarnDependency { ): YarnDependency {
let isVersion4 = false;
if (!!packageJson.packageManager) {
const [_, version] = packageJson.packageManager.split('@');
isVersion4 = !!version && satisfies(version, '>=4.0.0');
}
const reducer = (acc, [name, version]) => {
acc[name] = isVersion4 ? `npm:${version}` : version;
return acc;
};
return { return {
version: '0.0.0-use.local', version: '0.0.0-use.local',
resolution: `${packageJson.name}@workspace:.`, resolution: `${packageJson.name}@workspace:.`,
...(packageJson.dependencies && { dependencies: packageJson.dependencies }), ...(packageJson.dependencies && {
dependencies: Object.entries(packageJson.dependencies).reduce(
reducer,
{}
),
}),
...(packageJson.peerDependencies && { ...(packageJson.peerDependencies && {
peerDependencies: packageJson.peerDependencies, peerDependencies: Object.entries(packageJson.peerDependencies).reduce(
reducer,
{}
),
}), }),
...(packageJson.devDependencies && { ...(packageJson.devDependencies && {
devDependencies: packageJson.devDependencies, devDependencies: Object.entries(packageJson.devDependencies).reduce(
reducer,
{}
),
}), }),
...(packageJson.optionalDependencies && { ...(packageJson.optionalDependencies && {
optionalDependencies: packageJson.optionalDependencies, optionalDependencies: Object.entries(
packageJson.optionalDependencies
).reduce(reducer, {}),
}), }),
languageName: 'unknown', languageName: 'unknown',
linkType: 'soft', linkType: 'soft',