diff --git a/src/command.ts b/src/command.ts index 1abfe44..73f990e 100644 --- a/src/command.ts +++ b/src/command.ts @@ -1,3 +1,4 @@ +import { consola } from "consola"; import type { CommandContext, CommandDef, ArgsDef } from "./types"; import { CLIError, resolveValue } from "./_utils"; import { parseArgs } from "./args"; @@ -50,7 +51,15 @@ export async function runCommand( ); } const subCommand = await resolveValue(subCommands[subCommandName]); - if (subCommand) { + // Same behavior as for runMain (see src/main.ts) + if (opts.rawArgs.includes("--version")) { + const meta = + typeof cmd.meta === "function" ? await cmd.meta() : await cmd.meta; + if (!meta?.version) { + throw new CLIError("No version specified", "E_NO_VERSION"); + } + consola.log(meta.version); + } else if (subCommand) { await runCommand(subCommand, { rawArgs: opts.rawArgs.slice(subCommandArgIndex + 1), }); diff --git a/src/usage.ts b/src/usage.ts index 2fb0274..d6800db 100644 --- a/src/usage.ts +++ b/src/usage.ts @@ -9,7 +9,7 @@ export async function showUsage( parent?: CommandDef, ) { try { - consola.log((await renderUsage(cmd, parent)) + "\n"); + consola.log(await renderUsage(cmd, parent)); } catch (error) { consola.error(error); } @@ -91,27 +91,35 @@ export async function renderUsage( "", ); - const hasOptions = argLines.length > 0 || posLines.length > 0; + const hasOptions = version || argLines.length > 0 || posLines.length > 0; + usageLines.push( `${colors.underline(colors.bold("USAGE"))} \`${commandName}${ hasOptions ? " [OPTIONS]" : "" } ${usageLine.join(" ")}\``, - "", ); if (posLines.length > 0) { + usageLines.push(""); usageLines.push(colors.underline(colors.bold("ARGUMENTS")), ""); usageLines.push(formatLineColumns(posLines, " ")); - usageLines.push(""); } if (argLines.length > 0) { - usageLines.push(colors.underline(colors.bold("OPTIONS")), ""); - usageLines.push(formatLineColumns(argLines, " ")); usageLines.push(""); + usageLines.push(colors.underline(colors.bold("OPTIONS")), ""); + + if (version) { + usageLines.push( + formatLineColumns([["`--version`", "Show version"], ...argLines], " "), + ); + } else { + usageLines.push(formatLineColumns(argLines, " ")); + } } if (commandsLines.length > 0) { + usageLines.push(""); usageLines.push(colors.underline(colors.bold("COMMANDS")), ""); usageLines.push(formatLineColumns(commandsLines, " ")); usageLines.push(