import path from 'path' import { type Catalogs } from '@pnpm/catalogs.types' import { readCurrentLockfile, readWantedLockfile, } from '@pnpm/lockfile.fs' import { createMatcher } from '@pnpm/matcher' import { type IncludedDependencies, type ProjectManifest, type ProjectRootDir, } from '@pnpm/types' import unnest from 'ramda/src/unnest' import { createManifestGetter, type ManifestGetterOptions } from './createManifestGetter.js' import { outdated, type OutdatedPackage } from './outdated.js' export async function outdatedDepsOfProjects ( pkgs: Array<{ rootDir: ProjectRootDir, manifest: ProjectManifest }>, args: string[], opts: Omit & { catalogs?: Catalogs compatible?: boolean ignoreDependencies?: string[] include: IncludedDependencies minimumReleaseAge?: number minimumReleaseAgeExclude?: string[] } & Partial> ): Promise { if (!opts.lockfileDir) { return unnest(await Promise.all( pkgs.map(async (pkg) => outdatedDepsOfProjects([pkg], args, { ...opts, lockfileDir: pkg.rootDir }) ) )) } const lockfileDir = opts.lockfileDir ?? opts.dir const internalPnpmDir = path.join(path.join(lockfileDir, 'node_modules/.pnpm')) const currentLockfile = await readCurrentLockfile(internalPnpmDir, { ignoreIncompatible: false }) const wantedLockfile = await readWantedLockfile(lockfileDir, { ignoreIncompatible: false }) ?? currentLockfile const getLatestManifest = createManifestGetter({ ...opts, fullMetadata: opts.fullMetadata === true || Boolean(opts.minimumReleaseAge), lockfileDir, minimumReleaseAge: opts.minimumReleaseAge, minimumReleaseAgeExclude: opts.minimumReleaseAgeExclude, }) return Promise.all(pkgs.map(async ({ rootDir, manifest }): Promise => { const match = (args.length > 0) && createMatcher(args) || undefined return outdated({ catalogs: opts.catalogs, compatible: opts.compatible, currentLockfile, getLatestManifest, ignoreDependencies: opts.ignoreDependencies, include: opts.include, lockfileDir, manifest, match, minimumReleaseAge: opts.minimumReleaseAge, minimumReleaseAgeExclude: opts.minimumReleaseAgeExclude, prefix: rootDir, registries: opts.registries, wantedLockfile, }) })) }