From 2ad91e5213ea4531d722a97862c97cb5ca0f3127 Mon Sep 17 00:00:00 2001 From: Miroslav Jonas Date: Thu, 17 Nov 2022 11:15:04 +0100 Subject: [PATCH] feat(core): prune pnpm time field --- .../utils/lock-file/__fixtures__/pnpm.lock.ts | 2 +- packages/nx/src/utils/lock-file/pnpm.spec.ts | 20 +++++++- packages/nx/src/utils/lock-file/pnpm.ts | 48 +++++++++++++++++-- packages/nx/src/utils/lock-file/utils.ts | 16 ------- 4 files changed, 64 insertions(+), 22 deletions(-) diff --git a/packages/nx/src/utils/lock-file/__fixtures__/pnpm.lock.ts b/packages/nx/src/utils/lock-file/__fixtures__/pnpm.lock.ts index 5bcfce3fb0a38..121d61d37609f 100644 --- a/packages/nx/src/utils/lock-file/__fixtures__/pnpm.lock.ts +++ b/packages/nx/src/utils/lock-file/__fixtures__/pnpm.lock.ts @@ -8660,7 +8660,7 @@ packages: * save-workspace-protocol=rolling */ -export const lockFileWithWorkspaces = `lockfileVersion: 5.4 +export const lockFileWithWorkspacesAndTime = `lockfileVersion: 5.4 importers: diff --git a/packages/nx/src/utils/lock-file/pnpm.spec.ts b/packages/nx/src/utils/lock-file/pnpm.spec.ts index bdfb2a59f709d..710f2bda6b18f 100644 --- a/packages/nx/src/utils/lock-file/pnpm.spec.ts +++ b/packages/nx/src/utils/lock-file/pnpm.spec.ts @@ -7,6 +7,8 @@ import { lockFile, lockFileJustTypescript, lockFileWithInlineSpecifiers, + lockFileWithInlineSpecifiersAndWorkspaces, + lockFileWithWorkspacesAndTime, lockFileYargsAndDevkit, } from './__fixtures__/pnpm.lock'; @@ -139,7 +141,14 @@ describe('pnpm LockFile utility', () => { }); }); - it('should parse lockfile with time-based resolution and workspaces', () => {}); + it('should parse lockfile with time-based resolution and workspaces', () => { + const parsedLockFile = parsePnpmLockFile(lockFileWithWorkspacesAndTime); + expect(parsedLockFile.lockFileMetadata.time).toBeDefined(); + + expect(stringifyPnpmLockFile(parsedLockFile)).toEqual( + lockFileWithWorkspacesAndTime + ); + }); describe('lock file with inline specifiers', () => { const parsedLockFile = parsePnpmLockFile(lockFileWithInlineSpecifiers); @@ -235,5 +244,12 @@ describe('pnpm LockFile utility', () => { }); }); - it('should parse lockfile with inline specifiers and workspaces', () => {}); + it('should parse lockfile with inline specifiers and workspaces', () => { + const parsedLockFile = parsePnpmLockFile( + lockFileWithInlineSpecifiersAndWorkspaces + ); + expect(stringifyPnpmLockFile(parsedLockFile)).toEqual( + lockFileWithInlineSpecifiersAndWorkspaces + ); + }); }); diff --git a/packages/nx/src/utils/lock-file/pnpm.ts b/packages/nx/src/utils/lock-file/pnpm.ts index d8f3209b53554..9fb232a3fd115 100644 --- a/packages/nx/src/utils/lock-file/pnpm.ts +++ b/packages/nx/src/utils/lock-file/pnpm.ts @@ -1,4 +1,8 @@ -import { LockFileData, PackageDependency } from './lock-file-type'; +import { + LockFileData, + PackageDependency, + PackageVersions, +} from './lock-file-type'; import { load, dump } from '@zkochan/js-yaml'; import { sortObject, @@ -8,6 +12,7 @@ import { generatePrunnedHash, } from './utils'; import { satisfies } from 'semver'; +import { dematerialize } from 'rxjs/operators'; type PackageMeta = { key: string; @@ -314,7 +319,7 @@ function unmapLockFile(lockFileData: LockFileData): PnpmLockFile { >; return { - ...(lockFileData.lockFileMetadata as { lockfileVersion: number }), + ...(lockFileMetatada as { lockfileVersion: number }), specifiers: sortObject(specifiers), dependencies: sortObject(dependencies), devDependencies: sortObject(devDependencies), @@ -358,7 +363,10 @@ export function prunePnpmLockFile( projectName ); const prunedLockFileData = { - lockFileMetadata: lockFileData.lockFileMetadata, + lockFileMetadata: pruneMetadata( + lockFileData.lockFileMetadata, + dependencies + ), dependencies, hash: generatePrunnedHash(lockFileData.hash, packages, projectName), }; @@ -409,6 +417,40 @@ function pruneDependencies( return result; } +function pruneMetadata( + lockFileMetadata: LockFileData['lockFileMetadata'], + prunedDependencies: Record +): LockFileData['lockFileMetadata'] { + // These should be removed from the lock file metadata since we don't have them in the package.json + // overrides, patchedDependencies, neverBuiltDependencies, onlyBuiltDependencies, packageExtensionsChecksum + return { + lockfileVersion: lockFileMetadata.lockfileVersion, + ...(lockFileMetadata.time && { + time: pruneTime(lockFileMetadata.time, prunedDependencies), + }), + }; +} + +function pruneTime( + time: Record, + prunedDependencies: Record +): Record { + const result: Record = {}; + + Object.entries(time).forEach(([key, value]) => { + const packageName = key.slice(1, key.lastIndexOf('/')); + const version = key.slice(key.lastIndexOf('/')); + if ( + prunedDependencies[packageName] && + prunedDependencies[packageName][`${packageName}@${version}`] + ) { + result[key] = value; + } + }); + + return result; +} + // find all transitive dependencies of already pruned packages // and adds them to the collection // recursively prune their dependencies diff --git a/packages/nx/src/utils/lock-file/utils.ts b/packages/nx/src/utils/lock-file/utils.ts index fa04cfe8ef2f1..d44a74e308f92 100644 --- a/packages/nx/src/utils/lock-file/utils.ts +++ b/packages/nx/src/utils/lock-file/utils.ts @@ -1,4 +1,3 @@ -import { satisfies } from 'semver'; import { defaultHashing } from '../../hasher/hashing-impl'; import { LockFileData, @@ -47,21 +46,6 @@ export function hashString(fileContent: string): string { return defaultHashing.hashArray([fileContent]); } -export function findMatchingVersion( - packageName: string, - packageVersions: PackageVersions, - version: string -): string { - // if it's fixed version, just return it - if (packageVersions[`${packageName}@${version}`]) { - return version; - } - // otherwise search for the matching version - return Object.values(packageVersions).find((v) => - satisfies(v.version, version) - )?.version; -} - export function isRootVersion(packageName: string, version: string): boolean { const fullPath = `${workspaceRoot}/node_modules/${packageName}/package.json`; if (existsSync(fullPath)) {