mirror of
https://github.com/pnpm/pnpm.git
synced 2026-04-04 07:21:47 -04:00
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>
67 lines
2.4 KiB
TypeScript
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,
|
|
})
|
|
}))
|
|
}
|