From 6fb5da19db48131ed31ec87978ad4fdc32734c80 Mon Sep 17 00:00:00 2001 From: Bogdan Savluk Date: Mon, 3 Jul 2023 22:16:08 +0200 Subject: [PATCH] perf(modules-cleaner): replace ramda difference with better alternative (#6760) --- .changeset/young-scissors-grow.md | 5 +++++ pkg-manager/modules-cleaner/src/prune.ts | 27 ++++++++++++------------ 2 files changed, 18 insertions(+), 14 deletions(-) create mode 100644 .changeset/young-scissors-grow.md diff --git a/.changeset/young-scissors-grow.md b/.changeset/young-scissors-grow.md new file mode 100644 index 0000000000..92a9d65e78 --- /dev/null +++ b/.changeset/young-scissors-grow.md @@ -0,0 +1,5 @@ +--- +"@pnpm/modules-cleaner": patch +--- + +Replace ineffective use of ramda `difference` with better alternative diff --git a/pkg-manager/modules-cleaner/src/prune.ts b/pkg-manager/modules-cleaner/src/prune.ts index bd5d535dff..bb2a551f52 100644 --- a/pkg-manager/modules-cleaner/src/prune.ts +++ b/pkg-manager/modules-cleaner/src/prune.ts @@ -26,7 +26,6 @@ import difference from 'ramda/src/difference' import equals from 'ramda/src/equals' import mergeAll from 'ramda/src/mergeAll' import pickAll from 'ramda/src/pickAll' -import props from 'ramda/src/props' import { removeDirectDependency } from './removeDirectDependency' export async function prune ( @@ -62,23 +61,26 @@ export async function prune ( await Promise.all(importers.map(async ({ binsDir, id, modulesDir, pruneDirectDependencies, removePackages, rootDir }) => { const currentImporter = opts.currentLockfile.importers[id] || {} as ProjectSnapshot const currentPkgs = Object.entries(mergeDependencies(currentImporter)) - const wantedPkgs = Object.entries(mergeDependencies(wantedLockfile.importers[id])) + const wantedPkgs = mergeDependencies(wantedLockfile.importers[id]) const allCurrentPackages = new Set( (pruneDirectDependencies === true || removePackages?.length) ? (await readModulesDir(modulesDir) ?? []) : [] ) - const depsToRemove = new Set([ - ...(removePackages ?? []).filter((removePackage) => allCurrentPackages.has(removePackage)), - ...difference(currentPkgs, wantedPkgs).map(([depName]) => depName), - ]) + const depsToRemove = new Set( + (removePackages ?? []).filter((removePackage) => allCurrentPackages.has(removePackage)) + ) + currentPkgs.forEach(([depName, depVersion]) => { + if (!wantedPkgs[depName] || wantedPkgs[depName] !== depVersion) { + depsToRemove.add(depName) + } + }) if (pruneDirectDependencies) { const publiclyHoistedDeps = getPubliclyHoistedDependencies(opts.hoistedDependencies) if (allCurrentPackages.size > 0) { - const newPkgsSet = new Set(wantedPkgs.map(([depName]) => depName)) - for (const currentPackage of Array.from(allCurrentPackages)) { - if (!newPkgsSet.has(currentPackage) && !publiclyHoistedDeps.has(currentPackage)) { + for (const currentPackage of allCurrentPackages) { + if (!wantedPkgs[currentPackage] && !publiclyHoistedDeps.has(currentPackage)) { depsToRemove.add(currentPackage) } } @@ -110,11 +112,8 @@ export async function prune ( : getPkgsDepPathsOwnedOnlyByImporters(selectedImporterIds, opts.registries, opts.currentLockfile, opts.include, opts.skipped) const wantedPkgIdsByDepPaths = getPkgsDepPaths(opts.registries, wantedLockfile.packages ?? {}, opts.skipped) - const oldDepPaths = Object.keys(currentPkgIdsByDepPaths) - const newDepPaths = Object.keys(wantedPkgIdsByDepPaths) - - const orphanDepPaths = difference(oldDepPaths, newDepPaths) - const orphanPkgIds = new Set(props(orphanDepPaths, currentPkgIdsByDepPaths)) + const orphanDepPaths = Object.keys(currentPkgIdsByDepPaths).filter(path => !wantedPkgIdsByDepPaths[path]) + const orphanPkgIds = new Set(orphanDepPaths.map(path => currentPkgIdsByDepPaths[path])) statsLogger.debug({ prefix: opts.lockfileDir,