Files
Moltbot/src/cli/command-options.ts
Gustavo Madeira Santana 985ec71c55 CLI: resolve parent/subcommand option collisions (#18725)
Merged via /review-pr -> /prepare-pr -> /merge-pr.

Prepared head SHA: b7e51cf90950cdd3049ac3c7a3a949717b8ba261
Co-authored-by: gumadeiras <5599352+gumadeiras@users.noreply.github.com>
Co-authored-by: gumadeiras <5599352+gumadeiras@users.noreply.github.com>
Reviewed-by: @gumadeiras
2026-02-17 20:57:09 -05:00

45 lines
1.3 KiB
TypeScript

import type { Command } from "commander";
export function hasExplicitOptions(command: Command, names: readonly string[]): boolean {
if (typeof command.getOptionValueSource !== "function") {
return false;
}
return names.some((name) => command.getOptionValueSource(name) === "cli");
}
function getOptionSource(command: Command, name: string): string | undefined {
if (typeof command.getOptionValueSource !== "function") {
return undefined;
}
return command.getOptionValueSource(name);
}
// Defensive guardrail: allow expected parent/grandparent inheritance without unbounded deep traversal.
const MAX_INHERIT_DEPTH = 2;
export function inheritOptionFromParent<T = unknown>(
command: Command | undefined,
name: string,
): T | undefined {
if (!command) {
return undefined;
}
const childSource = getOptionSource(command, name);
if (childSource && childSource !== "default") {
return undefined;
}
let depth = 0;
let ancestor = command.parent;
while (ancestor && depth < MAX_INHERIT_DEPTH) {
const source = getOptionSource(ancestor, name);
if (source && source !== "default") {
return ancestor.opts<Record<string, unknown>>()[name] as T | undefined;
}
depth += 1;
ancestor = ancestor.parent;
}
return undefined;
}