Files
pnpm/reviewing/outdated/src/outdatedDepsOfProjects.ts
Ryo Matsukawa 2e07c4f6ff feat: respect minimumReleaseAge in outdated command (#10030)
close #10009

* feat: respect minimumReleaseAge in outdated command

* chore: add changeset

* fix: remove unnecessary 'latest' to '*' conversion in outdated command

* refactor: move publishedBy and matcher creation outside getManifest

* refactor: outdated

* docs: update changeset

---------

Co-authored-by: Zoltan Kochan <z@kochan.io>
2025-09-30 18:30:41 +02:00

67 lines
2.4 KiB
TypeScript

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<ManifestGetterOptions, 'fullMetadata' | 'lockfileDir'> & {
catalogs?: Catalogs
compatible?: boolean
ignoreDependencies?: string[]
include: IncludedDependencies
minimumReleaseAge?: number
minimumReleaseAgeExclude?: string[]
} & Partial<Pick<ManifestGetterOptions, 'fullMetadata' | 'lockfileDir'>>
): Promise<OutdatedPackage[][]> {
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<OutdatedPackage[]> => {
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,
})
}))
}