import type { Command } from "commander"; export function collectOption(value: string, previous: string[] = []): string[] { return [...previous, value]; } export function parsePositiveIntOrUndefined(value: unknown): number | undefined { if (value === undefined || value === null || value === "") { return undefined; } if (typeof value === "number") { if (!Number.isFinite(value)) { return undefined; } const parsed = Math.trunc(value); return parsed > 0 ? parsed : undefined; } if (typeof value === "string") { const parsed = Number.parseInt(value, 10); if (Number.isNaN(parsed) || parsed <= 0) { return undefined; } return parsed; } return undefined; } export function resolveActionArgs(actionCommand?: Command): string[] { if (!actionCommand) { return []; } const args = (actionCommand as Command & { args?: string[] }).args; return Array.isArray(args) ? args : []; } function isDefaultOptionValue(command: Command, name: string): boolean { if (typeof command.getOptionValueSource !== "function") { return false; } return command.getOptionValueSource(name) === "default"; } function appendOptionValue(out: string[], flag: string, value: unknown): void { if (value === undefined) { return; } if (value === false) { if (flag.startsWith("--no-")) { out.push(flag); } return; } if (value === true) { out.push(flag); return; } const arg = stringifyOptionValue(value); if (arg !== undefined) { out.push(flag, arg); } } function stringifyOptionValue(value: unknown): string | undefined { if (typeof value === "string") { return value; } if (typeof value === "number" && Number.isFinite(value)) { return String(value); } if (typeof value === "bigint") { return value.toString(); } return undefined; } export function resolveCommandOptionArgs(command?: Command): string[] { if (!command) { return []; } const out: string[] = []; for (const option of command.options) { const name = option.attributeName(); if (isDefaultOptionValue(command, name)) { continue; } const flag = option.long ?? option.short; if (!flag) { continue; } const value = command.getOptionValue(name); if (Array.isArray(value)) { for (const item of value) { appendOptionValue(out, flag, item); } continue; } appendOptionValue(out, flag, value); } return out; }