From d39dcbaea96f46cf466a11c69177fe8da0134ff3 Mon Sep 17 00:00:00 2001 From: Miroslav Jonas Date: Tue, 15 Nov 2022 13:22:44 +0100 Subject: [PATCH 1/2] feat(core): handle yarn workspace packages when pruning --- packages/nx/src/utils/lock-file/yarn.spec.ts | 23 +++++++++++++++ packages/nx/src/utils/lock-file/yarn.ts | 30 ++++++++++++++++++-- 2 files changed, 51 insertions(+), 2 deletions(-) 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..971999372d412 100644 --- a/packages/nx/src/utils/lock-file/yarn.ts +++ b/packages/nx/src/utils/lock-file/yarn.ts @@ -304,6 +304,32 @@ function pruneWorkspacePackages( ): LockFileDependencies { const result: LockFileDependencies = {}; + if (projectName) { + let workspaceProjKey = Object.keys(workspacePackages).find((key) => + key.startsWith(`${projectName}@workspace:`) + ); + let dependencies = {}; + if (!workspaceProjKey) { + workspaceProjKey = `${projectName}@workspace:^`; + } else { + dependencies = workspacePackages[workspaceProjKey].dependencies; + } + const prunedWorkspaceDependencies = pruneWorkspacePackageDependencies( + dependencies, + packages, + prunedDependencies, + true + ); + result[workspaceProjKey] = { + version: '0.0.0-use.local', + resolution: workspaceProjKey, + languageName: 'unknown', + linkType: 'soft', + dependencies: sortObject(prunedWorkspaceDependencies), + }; + return result; + } + Object.entries(workspacePackages).forEach( ([packageKey, { dependencies, ...value }]) => { const isRootPackage = packageKey.indexOf('@workspace:.') !== -1; @@ -327,7 +353,7 @@ function pruneWorkspacePackageDependencies( dependencies: Record, packages: string[], prunedDependencies: LockFileData['dependencies'], - isRoot: boolean + isMainPackage?: boolean ): Record { const result: Record = {}; @@ -345,7 +371,7 @@ function pruneWorkspacePackageDependencies( } ); // add all missing deps to root workspace package - if (isRoot) { + if (isMainPackage) { packages.forEach((p) => { if (!result[p]) { // extract first version expression from package's structure From 09568d14089d610bbfccbc70a07666dcc246cf1c Mon Sep 17 00:00:00 2001 From: Miroslav Jonas Date: Wed, 16 Nov 2022 11:37:02 +0100 Subject: [PATCH 2/2] fix(core): keep just root workspace project on prunning --- packages/nx/src/utils/lock-file/yarn.ts | 63 +++++++++---------------- 1 file changed, 23 insertions(+), 40 deletions(-) diff --git a/packages/nx/src/utils/lock-file/yarn.ts b/packages/nx/src/utils/lock-file/yarn.ts index 971999372d412..5b3ead0cfbb58 100644 --- a/packages/nx/src/utils/lock-file/yarn.ts +++ b/packages/nx/src/utils/lock-file/yarn.ts @@ -304,21 +304,24 @@ function pruneWorkspacePackages( ): LockFileDependencies { const result: LockFileDependencies = {}; + let workspaceProjKey = ''; + if (projectName) { - let workspaceProjKey = Object.keys(workspacePackages).find((key) => - key.startsWith(`${projectName}@workspace:`) + workspaceProjKey = + Object.keys(workspacePackages).find((key) => + key.startsWith(`${projectName}@workspace:`) + ) || `${projectName}@workspace:^`; + } else { + workspaceProjKey = Object.keys(workspacePackages).find( + (key) => key.indexOf('@workspace:.') !== -1 ); - let dependencies = {}; - if (!workspaceProjKey) { - workspaceProjKey = `${projectName}@workspace:^`; - } else { - dependencies = workspacePackages[workspaceProjKey].dependencies; - } + } + + if (workspaceProjKey) { const prunedWorkspaceDependencies = pruneWorkspacePackageDependencies( - dependencies, + workspacePackages[workspaceProjKey]?.dependencies || {}, packages, - prunedDependencies, - true + prunedDependencies ); result[workspaceProjKey] = { version: '0.0.0-use.local', @@ -327,33 +330,15 @@ function pruneWorkspacePackages( linkType: 'soft', dependencies: sortObject(prunedWorkspaceDependencies), }; - return result; } - 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), - }; - } - ); - return result; } function pruneWorkspacePackageDependencies( dependencies: Record, packages: string[], - prunedDependencies: LockFileData['dependencies'], - isMainPackage?: boolean + prunedDependencies: LockFileData['dependencies'] ): Record { const result: Record = {}; @@ -371,16 +356,14 @@ function pruneWorkspacePackageDependencies( } ); // add all missing deps to root workspace package - if (isMainPackage) { - 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; }