import { NodeType, ProgramNode, ProgramOptions, ProgramOptionsWithCallback, ProgramOrCommandChildren, } from './types'; import { ValidOptions } from './types-internal'; import { getNodeChildren, serializeOptions, validateName, withDefault, } from './utils'; const validOptions = { description: { type: 'string', default: '', }, usage: { type: 'string', default: '', }, callback: { type: 'function', }, examples: { type: 'array', default: [], }, } satisfies ValidOptions; export function Program( name: N, options: ProgramOptionsWithCallback, ...children: C ): ProgramNode; export function Program( name: N, options?: ProgramOptions | ProgramOptionsWithCallback | null, ...children: C ): ProgramNode; export function Program( name: N, options?: ProgramOptions | ProgramOptionsWithCallback | null, ...children: C ): ProgramNode { validateName(name); const finalOptions = serializeOptions(withDefault(options, {}), validOptions); return { _type: NodeType.PROGRAM, _globals: {}, name, options: finalOptions, ...getNodeChildren(children), }; }