From e334e56709852390260febbd8557d2e6796e620c Mon Sep 17 00:00:00 2001 From: Bogdan Savluk Date: Mon, 3 Jul 2023 15:34:14 +0200 Subject: [PATCH] fix(dependencies-hierarchy): move wanted lockfile loading outside dependenciesHierarchyForPackage (#6757) Move loading wantedLockfile outside dependenciesHierarchyForPackage, preventing OOM crash when loading the same lock file too many times --- .changeset/ninety-rats-breathe.md | 5 +++++ .../src/buildDependenciesHierarchy.ts | 9 +++++---- 2 files changed, 10 insertions(+), 4 deletions(-) create mode 100644 .changeset/ninety-rats-breathe.md diff --git a/.changeset/ninety-rats-breathe.md b/.changeset/ninety-rats-breathe.md new file mode 100644 index 0000000000..87060d1be5 --- /dev/null +++ b/.changeset/ninety-rats-breathe.md @@ -0,0 +1,5 @@ +--- +"@pnpm/reviewing.dependencies-hierarchy": patch +--- + +Move loading `wantedLockfile` outside `dependenciesHierarchyForPackage`, preventing OOM crash when loading the same lock file too many times diff --git a/reviewing/dependencies-hierarchy/src/buildDependenciesHierarchy.ts b/reviewing/dependencies-hierarchy/src/buildDependenciesHierarchy.ts index b7eb78fad6..e7ba1187a8 100644 --- a/reviewing/dependencies-hierarchy/src/buildDependenciesHierarchy.ts +++ b/reviewing/dependencies-hierarchy/src/buildDependenciesHierarchy.ts @@ -50,6 +50,7 @@ export async function buildDependenciesHierarchy ( ...modules?.registries, }) const currentLockfile = (modules?.virtualStoreDir && await readCurrentLockfile(modules.virtualStoreDir, { ignoreIncompatible: false })) ?? null + const wantedLockfile = await readWantedLockfile(maybeOpts.lockfileDir, { ignoreIncompatible: false }) const result = {} as { [projectDir: string]: DependenciesHierarchy } @@ -79,7 +80,7 @@ export async function buildDependenciesHierarchy ( await Promise.all(projectPaths.map(async (projectPath) => { return [ projectPath, - await dependenciesHierarchyForPackage(projectPath, currentLockfile, opts), + await dependenciesHierarchyForPackage(projectPath, currentLockfile, wantedLockfile, opts), ] as [string, DependenciesHierarchy] })) ).forEach(([projectPath, dependenciesHierarchy]) => { @@ -91,6 +92,7 @@ export async function buildDependenciesHierarchy ( async function dependenciesHierarchyForPackage ( projectPath: string, currentLockfile: Lockfile, + wantedLockfile: Lockfile | null, opts: { depth: number include: { [dependenciesField in DependenciesField]: boolean } @@ -112,7 +114,6 @@ async function dependenciesHierarchyForPackage ( const savedDeps = getAllDirectDependencies(currentLockfile.importers[importerId]) const allDirectDeps = await readModulesDir(modulesDir) ?? [] const unsavedDeps = allDirectDeps.filter((directDep) => !savedDeps[directDep]) - const wantedLockfile = await readWantedLockfile(opts.lockfileDir, { ignoreIncompatible: false }) ?? { packages: {} } const getChildrenTree = getTree.bind(null, { currentPackages: currentLockfile.packages ?? {}, @@ -126,7 +127,7 @@ async function dependenciesHierarchyForPackage ( registries: opts.registries, search: opts.search, skipped: opts.skipped, - wantedPackages: wantedLockfile.packages ?? {}, + wantedPackages: wantedLockfile?.packages ?? {}, virtualStoreDir: opts.virtualStoreDir, }) const parentId: TreeNodeId = { type: 'importer', importerId } @@ -143,7 +144,7 @@ async function dependenciesHierarchyForPackage ( ref, registries: opts.registries, skipped: opts.skipped, - wantedPackages: wantedLockfile.packages ?? {}, + wantedPackages: wantedLockfile?.packages ?? {}, virtualStoreDir: opts.virtualStoreDir, }) let newEntry: PackageNode | null = null