Files
pnpm/reviewing/plugin-commands-listing/src/why.ts
T

117 lines
3.1 KiB
TypeScript

import { docsUrl } from '@pnpm/cli-utils'
import { FILTERING, OPTIONS, UNIVERSAL_OPTIONS } from '@pnpm/common-cli-options-help'
import { types as allTypes } from '@pnpm/config'
import { PnpmError } from '@pnpm/error'
import pick from 'ramda/src/pick'
import renderHelp from 'render-help'
import { handler as list, type ListCommandOptions, EXCLUDE_PEERS_HELP } from './list'
export function rcOptionsTypes (): Record<string, unknown> {
return pick([
'depth',
'dev',
'global-dir',
'global',
'json',
'long',
'only',
'optional',
'parseable',
'production',
], allTypes)
}
export const cliOptionsTypes = (): Record<string, unknown> => ({
...rcOptionsTypes(),
'exclude-peers': Boolean,
recursive: Boolean,
})
export const shorthands: Record<string, string> = {
D: '--dev',
P: '--production',
}
export const commandNames = ['why']
export function help (): string {
return renderHelp({
description: `Shows the packages that depend on <pkg>
For example: pnpm why babel-* eslint-*`,
descriptionLists: [
{
title: 'Options',
list: [
{
description: 'Perform command on every package in subdirectories \
or on every workspace package, when executed inside a workspace. \
For options that may be used with `-r`, see "pnpm help recursive"',
name: '--recursive',
shortAlias: '-r',
},
{
description: 'Show extended information',
name: '--long',
},
{
description: 'Show parseable output instead of tree view',
name: '--parseable',
},
{
description: 'Show information in JSON format',
name: '--json',
},
{
description: 'List packages in the global install prefix instead of in the current project',
name: '--global',
shortAlias: '-g',
},
{
description: 'Display only the dependency graph for packages in `dependencies` and `optionalDependencies`',
name: '--prod',
shortAlias: '-P',
},
{
description: 'Display only the dependency graph for packages in `devDependencies`',
name: '--dev',
shortAlias: '-D',
},
{
description: "Don't display packages from `optionalDependencies`",
name: '--no-optional',
},
{
name: '--depth <number>',
description: 'Max display depth of the dependency graph',
},
EXCLUDE_PEERS_HELP,
OPTIONS.globalDir,
...UNIVERSAL_OPTIONS,
],
},
FILTERING,
],
url: docsUrl('why'),
usages: [
'pnpm why <pkg> ...',
],
})
}
export async function handler (
opts: ListCommandOptions,
params: string[]
): Promise<string> {
if (params.length === 0) {
throw new PnpmError('MISSING_PACKAGE_NAME', '`pnpm why` requires the package name')
}
return list({
...opts,
cliOptions: {
...(opts.cliOptions ?? {}),
depth: opts.depth ?? Infinity,
},
}, params)
}