import * as chalk from 'chalk'; import { getPackageManagerCommand, readJsonFile } from '@nrwl/devkit'; import { appRootPath } from '../app-root'; import { output } from '../output'; import type { PluginCapabilities } from './models'; import { hasElements } from './shared'; function tryGetCollection( workspaceRoot: string, pluginName: string, jsonFile: string, propName: string ): T | null { if (!jsonFile) { return null; } try { const jsonFilePath = require.resolve(`${pluginName}/${jsonFile}`, { paths: [workspaceRoot], }); return readJsonFile(jsonFilePath)[propName]; } catch { return null; } } export function getPluginCapabilities( workspaceRoot: string, pluginName: string ): PluginCapabilities | null { try { const packageJsonPath = require.resolve(`${pluginName}/package.json`, { paths: [workspaceRoot], }); const packageJson = readJsonFile(packageJsonPath); return { name: pluginName, generators: tryGetCollection( workspaceRoot, pluginName, packageJson.generators, 'generators' ) || tryGetCollection( workspaceRoot, pluginName, packageJson.schematics, 'schematics' ), executors: tryGetCollection( workspaceRoot, pluginName, packageJson.executors, 'executors' ) || tryGetCollection( workspaceRoot, pluginName, packageJson.builders, 'builders' ), }; } catch { return null; } } export function listPluginCapabilities(pluginName: string) { const plugin = getPluginCapabilities(appRootPath, pluginName); if (!plugin) { const pmc = getPackageManagerCommand(); output.note({ title: `${pluginName} is not currently installed`, bodyLines: [ `Use "${pmc.addDev} ${pluginName}" to install the plugin.`, `After that, use "${pmc.exec} nx g ${pluginName}:init" to add the required peer deps and initialize the plugin.`, ], }); return; } const hasBuilders = hasElements(plugin.executors); const hasGenerators = hasElements(plugin.generators); if (!hasBuilders && !hasGenerators) { output.warn({ title: `No capabilities found in ${pluginName}` }); return; } const bodyLines = []; if (hasGenerators) { bodyLines.push(chalk.bold(chalk.green('GENERATORS'))); bodyLines.push(''); bodyLines.push( ...Object.keys(plugin.generators).map( (name) => `${chalk.bold(name)} : ${plugin.generators[name].description}` ) ); if (hasBuilders) { bodyLines.push(''); } } if (hasBuilders) { bodyLines.push(chalk.bold(chalk.green('EXECUTORS/BUILDERS'))); bodyLines.push(''); bodyLines.push( ...Object.keys(plugin.executors).map( (name) => `${chalk.bold(name)} : ${plugin.executors[name].description}` ) ); } output.log({ title: `Capabilities in ${plugin.name}:`, bodyLines, }); }