diff --git a/src/command.ts b/src/command.ts index 1abfe44..b986fc9 100644 --- a/src/command.ts +++ b/src/command.ts @@ -17,8 +17,12 @@ export interface RunCommandOptions { export async function runCommand( cmd: CommandDef, opts: RunCommandOptions, + sharedArgs?: T, ): Promise<{ result: unknown }> { - const cmdArgs = await resolveValue(cmd.args || {}); + const cmdArgs = await resolveValue({ + ...(cmd.args || ({} as T)), + ...sharedArgs, + }); const parsedArgs = parseArgs(opts.rawArgs, cmdArgs); const context: CommandContext = { @@ -51,9 +55,13 @@ export async function runCommand( } const subCommand = await resolveValue(subCommands[subCommandName]); if (subCommand) { - await runCommand(subCommand, { - rawArgs: opts.rawArgs.slice(subCommandArgIndex + 1), - }); + await runCommand( + subCommand, + { + rawArgs: opts.rawArgs.slice(subCommandArgIndex + 1), + }, + cmd.sharedArgs, + ); } } else if (!cmd.run) { throw new CLIError(`No command specified.`, "E_NO_COMMAND"); diff --git a/src/types.ts b/src/types.ts index a622922..a0475c3 100644 --- a/src/types.ts +++ b/src/types.ts @@ -90,6 +90,7 @@ export type SubCommandsDef = Record>>; export type CommandDef = { meta?: Resolvable; args?: Resolvable; + sharedArgs?: Resolvable; subCommands?: Resolvable; setup?: (context: CommandContext) => any | Promise; cleanup?: (context: CommandContext) => any | Promise; diff --git a/src/usage.ts b/src/usage.ts index cb4a794..ef6d409 100644 --- a/src/usage.ts +++ b/src/usage.ts @@ -20,7 +20,10 @@ export async function renderUsage( parent?: CommandDef, ) { const cmdMeta = await resolveValue(cmd.meta || {}); - const cmdArgs = resolveArgs(await resolveValue(cmd.args || {})); + const cmdArgs = [ + ...resolveArgs(await resolveValue(cmd.args || {})), + ...resolveArgs(await resolveValue(cmd.sharedArgs || {})), + ]; const parentMeta = await resolveValue(parent?.meta || {}); const commandName =