linear-cmd
Version:
A GitHub CLI-like tool for Linear - manage issues, accounts, and more
75 lines (73 loc) • 2.79 kB
JavaScript
import { colors } from '../../lib/colors.js';
import { CLI_NAME } from '../constants.js';
import { COMMANDS_SCHEMA } from '../schema.js';
const subcommandIdentation = 30;
const subcommandFlagIdentation = 32;
function formatFlag(flag) {
const flagName = flag.alias ? `${flag.name}, ${flag.alias}` : flag.name;
if (flag.name.startsWith('--') || flag.name.startsWith('-')) {
return ` ${flagName.padEnd(subcommandIdentation)} ${flag.description || ''}`;
}
return ` ${flagName.padEnd(subcommandFlagIdentation)} ${flag.description || ''}`;
}
function formatSubCommand(sub, indent = 4) {
const spaces = ' '.repeat(indent);
let commandName = sub.name;
if (sub.arguments && sub.arguments.length > 0) {
const argStrings = sub.arguments.map((arg) => (arg.required ? `<${arg.name}>` : `[${arg.name}]`));
commandName = `${sub.name} ${argStrings.join(' ')}`;
}
let output = `${spaces}${commandName.padEnd(subcommandFlagIdentation - indent)} ${sub.description}`;
if (sub.arguments && sub.arguments.length > 1) {
for (const arg of sub.arguments) {
output += `\n${formatFlag({ name: arg.name, description: arg.description, type: arg.type })}`;
}
}
if (sub.flags && sub.flags.length > 0) {
for (const flag of sub.flags) {
output += `\n${formatFlag(flag)}`;
}
}
return output;
}
function formatCommand(cmd) {
if (cmd.subcommands && cmd.subcommands.length > 0) {
let output = ` ${colors.yellow(cmd.name)}\n`;
for (const sub of cmd.subcommands) {
output += `${formatSubCommand(sub)}\n`;
}
return output;
}
else {
return ` ${colors.yellow(cmd.name.padEnd(subcommandIdentation))} ${cmd.description}\n`;
}
}
function generateExamplesSection() {
const examples = [];
for (const cmd of COMMANDS_SCHEMA) {
if (cmd.examples && cmd.examples.length > 0) {
examples.push(...cmd.examples);
}
if (cmd.subcommands) {
for (const sub of cmd.subcommands) {
if (sub.examples && sub.examples.length > 0) {
examples.push(...sub.examples);
}
}
}
}
const limitedExamples = examples.slice(0, 15);
return limitedExamples.map((ex) => ` ${colors.cyan(`$ ${ex}`)}`).join('\n');
}
export function generateHelp() {
const commandsSection = COMMANDS_SCHEMA.map((cmd) => formatCommand(cmd)).join('\n');
const examplesSection = generateExamplesSection();
return `
${colors.bold('USAGE')}
${colors.cyan(`$ ${CLI_NAME}`)} ${colors.yellow('<command>')} ${colors.gray('[options]')}
${colors.bold('COMMANDS')}
${commandsSection}
${colors.bold('EXAMPLES')}
${examplesSection}
`;
}