From a5d73312c1d2697fd13c7da7bfba494a0f8a151c Mon Sep 17 00:00:00 2001 From: Sushruth Shastry <2114206+sushruth@users.noreply.github.com> Date: Thu, 12 Jan 2023 20:11:13 +0000 Subject: [PATCH 1/3] fix(core): Adding a yarn berry version of isRootVersion utility --- packages/nx/src/lock-file/yarn.ts | 60 ++++++++++++++++++++++++++++++- 1 file changed, 59 insertions(+), 1 deletion(-) diff --git a/packages/nx/src/lock-file/yarn.ts b/packages/nx/src/lock-file/yarn.ts index fc3f801d094e6..d3d6ccbed7a1a 100644 --- a/packages/nx/src/lock-file/yarn.ts +++ b/packages/nx/src/lock-file/yarn.ts @@ -9,6 +9,8 @@ import { isRootVersion, TransitiveLookupFunctionInput } from './utils/mapping'; import { generatePrunnedHash, hashString } from './utils/hashing'; import { PackageJsonDeps } from './utils/pruning'; import { sortObjectByKeys } from '../utils/object-sort'; +import { getPackageManagerCommand } from '@nrwl/devkit'; +import { execSync } from 'child_process'; type LockFileDependencies = Record< string, @@ -118,7 +120,14 @@ function mapPackages( versions[versionKeys[0]].rootVersion = true; } else { const rootVersionKey = versionKeys.find((v) => - isRootVersion(packageName, versions[v].version) + isBerry + ? isRootVersionBerry( + v, + versions[v].version, + workspacePackages, + mappedPackages + ) + : isRootVersion(v, versions[v].version) ); // this should never happen, but just in case @@ -531,3 +540,52 @@ function ensureMetaVersion( return packageMeta; } + +/** + * A function equivalent to isRootVersion, but for yarn berry + * @param packageName name of the package + * @param version version of the package to check + */ +function isRootVersionBerry( + packageName: string, + version: string, + workspacePackages: LockFileDependencies, + mappedPackages: Record +): boolean { + const rootVersionString = getRootVersionStringBerry( + packageName, + workspacePackages + ); + + if (!rootVersionString) { + return false; + } + + const packageMeta = + mappedPackages[packageName]?.[`${packageName}@${version}`]?.packageMeta || + []; + + return packageMeta.some( + (v: string) => + v.startsWith(`${packageName}@`) && v.endsWith(rootVersionString) + ); +} + +function getRootVersionStringBerry( + packageName: string, + workspacePackages: LockFileDependencies +) { + for (const workspacePackageName in workspacePackages) { + if ( + workspacePackages[workspacePackageName].resolution.endsWith( + '@workspace:.' // this is the root package + ) + ) { + const { dependencies } = workspacePackages[packageName]; + + return dependencies[packageName]; + } + } + + return null; +} From 24d18abc361eba5954c4b3f7aec1f6914cc4a0de Mon Sep 17 00:00:00 2001 From: Sushruth Shastry <2114206+sushruth@users.noreply.github.com> Date: Thu, 12 Jan 2023 20:47:59 +0000 Subject: [PATCH 2/3] cleanup(core): Removing unused import - fixes the PR pipeline error --- packages/nx/src/lock-file/yarn.ts | 1 - 1 file changed, 1 deletion(-) diff --git a/packages/nx/src/lock-file/yarn.ts b/packages/nx/src/lock-file/yarn.ts index d3d6ccbed7a1a..12b1a3f67cab2 100644 --- a/packages/nx/src/lock-file/yarn.ts +++ b/packages/nx/src/lock-file/yarn.ts @@ -9,7 +9,6 @@ import { isRootVersion, TransitiveLookupFunctionInput } from './utils/mapping'; import { generatePrunnedHash, hashString } from './utils/hashing'; import { PackageJsonDeps } from './utils/pruning'; import { sortObjectByKeys } from '../utils/object-sort'; -import { getPackageManagerCommand } from '@nrwl/devkit'; import { execSync } from 'child_process'; type LockFileDependencies = Record< From 7a16543f0c66c735bf8c842027b9817977292012 Mon Sep 17 00:00:00 2001 From: Sushruth Shastry <2114206+sushruth@users.noreply.github.com> Date: Thu, 12 Jan 2023 20:57:55 +0000 Subject: [PATCH 3/3] cleanup(core): removing a missed unused import --- packages/nx/src/lock-file/yarn.ts | 1 - 1 file changed, 1 deletion(-) diff --git a/packages/nx/src/lock-file/yarn.ts b/packages/nx/src/lock-file/yarn.ts index 12b1a3f67cab2..897d7725276ce 100644 --- a/packages/nx/src/lock-file/yarn.ts +++ b/packages/nx/src/lock-file/yarn.ts @@ -9,7 +9,6 @@ import { isRootVersion, TransitiveLookupFunctionInput } from './utils/mapping'; import { generatePrunnedHash, hashString } from './utils/hashing'; import { PackageJsonDeps } from './utils/pruning'; import { sortObjectByKeys } from '../utils/object-sort'; -import { execSync } from 'child_process'; type LockFileDependencies = Record< string,