Files
openclaw/src/cli/program/helpers.ts
2026-04-30 00:48:46 +01:00

101 lines
2.4 KiB
TypeScript

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;
}