diff --git a/packages/nx/src/utils/lock-file/yarn.spec.ts b/packages/nx/src/utils/lock-file/yarn.spec.ts index 64cf00d8807a2..be821d5558264 100644 --- a/packages/nx/src/utils/lock-file/yarn.spec.ts +++ b/packages/nx/src/utils/lock-file/yarn.spec.ts @@ -182,6 +182,29 @@ describe('yarn LockFile utility', () => { removeComment(berryLockFileDevkitAndYargs) ); }); + + it('shold correctly prune lockfile with multiple packages and custom name', () => { + const result = pruneYarnLockFile( + parsedLockFile, + ['yargs', '@nrwl/devkit', 'typescript'], + 'custom-name' + ); + expect(result.lockFileMetadata.workspacePackages).toMatchInlineSnapshot(` + Object { + "custom-name@workspace:^": Object { + "dependencies": Object { + "@nrwl/devkit": "14.7.5", + "typescript": "~4.8.2", + "yargs": "^17.4.0", + }, + "languageName": "unknown", + "linkType": "soft", + "resolution": "custom-name@workspace:^", + "version": "0.0.0-use.local", + }, + } + `); + }); }); }); diff --git a/packages/nx/src/utils/lock-file/yarn.ts b/packages/nx/src/utils/lock-file/yarn.ts index a4f465d659e5c..5b3ead0cfbb58 100644 --- a/packages/nx/src/utils/lock-file/yarn.ts +++ b/packages/nx/src/utils/lock-file/yarn.ts @@ -304,21 +304,33 @@ function pruneWorkspacePackages( ): LockFileDependencies { const result: LockFileDependencies = {}; - Object.entries(workspacePackages).forEach( - ([packageKey, { dependencies, ...value }]) => { - const isRootPackage = packageKey.indexOf('@workspace:.') !== -1; - const prunedWorkspaceDependencies = pruneWorkspacePackageDependencies( - dependencies, - packages, - prunedDependencies, - isRootPackage - ); - result[packageKey] = { - ...value, - dependencies: sortObject(prunedWorkspaceDependencies), - }; - } - ); + let workspaceProjKey = ''; + + if (projectName) { + workspaceProjKey = + Object.keys(workspacePackages).find((key) => + key.startsWith(`${projectName}@workspace:`) + ) || `${projectName}@workspace:^`; + } else { + workspaceProjKey = Object.keys(workspacePackages).find( + (key) => key.indexOf('@workspace:.') !== -1 + ); + } + + if (workspaceProjKey) { + const prunedWorkspaceDependencies = pruneWorkspacePackageDependencies( + workspacePackages[workspaceProjKey]?.dependencies || {}, + packages, + prunedDependencies + ); + result[workspaceProjKey] = { + version: '0.0.0-use.local', + resolution: workspaceProjKey, + languageName: 'unknown', + linkType: 'soft', + dependencies: sortObject(prunedWorkspaceDependencies), + }; + } return result; } @@ -326,8 +338,7 @@ function pruneWorkspacePackages( function pruneWorkspacePackageDependencies( dependencies: Record, packages: string[], - prunedDependencies: LockFileData['dependencies'], - isRoot: boolean + prunedDependencies: LockFileData['dependencies'] ): Record { const result: Record = {}; @@ -345,16 +356,14 @@ function pruneWorkspacePackageDependencies( } ); // add all missing deps to root workspace package - if (isRoot) { - packages.forEach((p) => { - if (!result[p]) { - // extract first version expression from package's structure - const metaVersion = Object.values(prunedDependencies[p])[0] - .packageMeta[0] as string; - result[p] = metaVersion.split('@npm:')[1]; - } - }); - } + packages.forEach((p) => { + if (!result[p]) { + // extract first version expression from package's structure + const metaVersion = Object.values(prunedDependencies[p])[0] + .packageMeta[0] as string; + result[p] = metaVersion.split('@npm:')[1]; + } + }); return result; }