nx/packages/workspace/src/utilities/plugins/plugin-capabilities.ts

125 lines
3.0 KiB
TypeScript

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<T extends object>(
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<T>(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,
});
}