packages/flow-dev-tools/src/help/helpCommand.js (65 lines of code) (raw):
/**
* Copyright (c) Meta Platforms, Inc. and affiliates.
*
* This source code is licensed under the MIT license found in the
* LICENSE file in the root directory of this source tree.
*
* @flow
* @format
*/
const {format} = require('util');
const {default: Base} = require('../command/Base');
const commandFinder = require('../command/finder');
type Args = {
command: ?string,
};
class HelpCommand extends Base<Args> {
static processArgv(argv: Object): Args {
const command = argv._.length > 0 ? argv._[0] : null;
return {command};
}
static async run(args: Args): Promise<void> {
const commandName = args.command;
if (commandName != null) {
const commandMap = await commandFinder(__dirname);
const commandPath = commandMap.get(commandName);
if (commandPath === undefined) {
process.stderr.write(format('Unsupported command `%s`\n', commandName));
return this.showUsage(this.BAD_ARGS);
}
// $FlowFixMe
require(commandPath).default.showUsage(this.OK);
} else {
await this.showGeneralUsage(this.OK);
}
}
static description(): string {
return 'Shows usage message';
}
static async usage(): Promise<string> {
const validCommands = await this.validCommands();
return `usage: ${process.argv[1]} help [COMMAND]
${validCommands}
`;
}
static async showGeneralUsage(exitCode: number): Promise<void> {
const validCommands = await this.validCommands();
process.stderr.write(`usage: ${process.argv[1]} [COMMAND]
${validCommands}
`);
process.exit(exitCode);
}
static async validCommands(): Promise<string> {
const commandMap = await commandFinder(__dirname);
const maxLength = Math.max(
16,
...Array.from(commandMap.keys()).map(k => k.length),
);
const validCommands = [];
for (const commandName of commandMap.keys()) {
validCommands.push(
format(
'%s%s %s',
commandName,
Array(maxLength - commandName.length).join(' '),
// $FlowFixMe
require(commandMap.get(commandName)).default.description(),
),
);
}
return format(
'Valid values for COMMAND:\n%s',
validCommands.sort().join('\n'),
);
}
}
module.exports = {default: HelpCommand};