From 2331b2ed0dda16f7f4df85f43ec6bc863a4d53e4 Mon Sep 17 00:00:00 2001 From: Zoltan Kochan Date: Sun, 19 Jan 2020 04:59:50 +0200 Subject: [PATCH] feat: interactive update with many lockfiles Interactive update should work on a workspace that uses dedicated pnpm-lock.yaml file per each project. ref #2271 --- packages/outdated/package.json | 2 ++ .../outdated/src/outdatedDepsOfProjects.ts | 12 +++++-- .../plugin-commands-outdated/src/recursive.ts | 33 +++++-------------- pnpm-lock.yaml | 4 +++ 4 files changed, 25 insertions(+), 26 deletions(-) diff --git a/packages/outdated/package.json b/packages/outdated/package.json index d2f9db9da4..3752fc8201 100644 --- a/packages/outdated/package.json +++ b/packages/outdated/package.json @@ -52,12 +52,14 @@ "@pnpm/utils": "workspace:0.12.3", "dependency-path": "workspace:4.0.3", "lru-cache": "5.1.1", + "ramda": "0.26.1", "semver": "7.1.1" }, "devDependencies": { "@pnpm/logger": "3.1.0", "@pnpm/outdated": "link:", "@types/lru-cache": "^5.1.0", + "@types/ramda": "^0.26.39", "@types/semver": "^6.2.0", "npm-run-all": "4.1.5" } diff --git a/packages/outdated/src/outdatedDepsOfProjects.ts b/packages/outdated/src/outdatedDepsOfProjects.ts index c60923047c..6d56d4f8a5 100644 --- a/packages/outdated/src/outdatedDepsOfProjects.ts +++ b/packages/outdated/src/outdatedDepsOfProjects.ts @@ -13,8 +13,9 @@ import { ProjectManifest, } from '@pnpm/types' import path = require('path') +import R = require('ramda') import { createManifestGetter, ManifestGetterOptions } from './createManifestGetter' -import outdated from './outdated' +import outdated, { OutdatedPackage } from './outdated' export default async function outdatedDepsOfProjects ( pkgs: Array<{dir: string, manifest: ProjectManifest}>, @@ -23,7 +24,14 @@ export default async function outdatedDepsOfProjects ( compatible?: boolean, include: IncludedDependencies, } & Partial>, -) { +): Promise> { + if (!opts.lockfileDir) { + return R.unnest(await Promise.all( + pkgs.map((pkg) => + outdatedDepsOfProjects([pkg], args, { ...opts, lockfileDir: pkg.dir }), + ), + )) + } const lockfileDir = opts.lockfileDir ?? opts.dir const modules = await readModulesManifest(path.join(lockfileDir, 'node_modules')) const virtualStoreDir = modules?.virtualStoreDir ?? path.join(lockfileDir, 'node_modules/.pnpm') diff --git a/packages/plugin-commands-outdated/src/recursive.ts b/packages/plugin-commands-outdated/src/recursive.ts index 2ac2e0ffd0..2ebb96aca9 100644 --- a/packages/plugin-commands-outdated/src/recursive.ts +++ b/packages/plugin-commands-outdated/src/recursive.ts @@ -51,30 +51,15 @@ export default async ( opts: OutdatedCommandOptions & { include: IncludedDependencies }, ) => { const outdatedMap = {} as Record - if (opts.lockfileDir) { - const outdatedPackagesByProject = await outdatedDepsOfProjects(pkgs, args, opts) - for (let { prefix, outdatedPackages, manifest } of outdatedPackagesByProject) { - outdatedPackages.forEach((outdatedPkg) => { - const key = JSON.stringify([outdatedPkg.packageName, outdatedPkg.current, outdatedPkg.belongsTo]) - if (!outdatedMap[key]) { - outdatedMap[key] = { ...outdatedPkg, dependentPkgs: [] } - } - outdatedMap[key].dependentPkgs.push({ location: prefix, manifest }) - }) - } - } else { - await Promise.all(pkgs.map(async ({ dir, manifest }) => { - const { outdatedPackages } = ( - await outdatedDepsOfProjects([{ manifest, dir }], args, { ...opts, lockfileDir: dir }) - )[0] - outdatedPackages.forEach((outdatedPkg) => { - const key = JSON.stringify([outdatedPkg.packageName, outdatedPkg.current, outdatedPkg.belongsTo]) - if (!outdatedMap[key]) { - outdatedMap[key] = { ...outdatedPkg, dependentPkgs: [] } - } - outdatedMap[key].dependentPkgs.push({ location: getLockfileImporterId(opts.dir, dir), manifest }) - }) - })) + const outdatedPackagesByProject = await outdatedDepsOfProjects(pkgs, args, opts) + for (let { prefix, outdatedPackages, manifest } of outdatedPackagesByProject) { + outdatedPackages.forEach((outdatedPkg) => { + const key = JSON.stringify([outdatedPkg.packageName, outdatedPkg.current, outdatedPkg.belongsTo]) + if (!outdatedMap[key]) { + outdatedMap[key] = { ...outdatedPkg, dependentPkgs: [] } + } + outdatedMap[key].dependentPkgs.push({ location: prefix, manifest }) + }) } if (R.isEmpty(outdatedMap)) return '' diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 429ad5c0b0..ae04f35129 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -1104,11 +1104,13 @@ importers: '@pnpm/utils': 'link:../utils' dependency-path: 'link:../dependency-path' lru-cache: 5.1.1 + ramda: 0.26.1 semver: 7.1.1 devDependencies: '@pnpm/logger': 3.1.0 '@pnpm/outdated': 'link:' '@types/lru-cache': 5.1.0 + '@types/ramda': 0.26.39 '@types/semver': 6.2.0 npm-run-all: 4.1.5 specifiers: @@ -1126,10 +1128,12 @@ importers: '@pnpm/types': 'workspace:5.0.0' '@pnpm/utils': 'workspace:0.12.3' '@types/lru-cache': ^5.1.0 + '@types/ramda': ^0.26.39 '@types/semver': ^6.2.0 dependency-path: 'workspace:4.0.3' lru-cache: 5.1.1 npm-run-all: 4.1.5 + ramda: 0.26.1 semver: 7.1.1 packages/package-bins: dependencies: