import { ParseOptions, OptionContent, CommandLineOption, OptionalProperty, PropertyOptions, Content, OptionList, } from '../contracts'; export function getOptionSections(options: ParseOptions): OptionContent[] { return ( options.optionSections || [ { header: options.optionsHeaderText || 'Options', headerLevel: options.optionsHeaderLevel || 2 }, ] ); } export function getOptionFooterSection(optionList: CommandLineOption[], options: ParseOptions): Content[] { const optionsFooter = generateTableFooter(optionList, options); if (optionsFooter != null) { console.log(`Adding footer: ${optionsFooter}`); return [{ content: optionsFooter }]; } return []; } export function generateTableFooter( optionList: CommandLineOption[], options: ParseOptions, ): string | undefined { if (options.addOptionalDefaultExplanatoryFooter != true || options.displayOptionalAndDefault != true) { return undefined; } const optionalProps = optionList.some((option) => (option as unknown as OptionalProperty).optional === true); const defaultProps = optionList.some((option) => option.defaultOption === true); if (optionalProps || defaultProps) { const footerValues = [ optionalProps != null ? '(O) = optional' : undefined, defaultProps != null ? '(D) = default option' : null, ]; return footerValues.filter((v) => v != null).join(', '); } return undefined; } export function addOptions( content: OptionContent, optionList: CommandLineOption[], options: ParseOptions, ): OptionList { optionList = optionList.map((option) => mapDefinitionDetails(option, options)); return { ...content, optionList }; } /** * adds default or optional modifiers to type label or description * @param option */ export function mapDefinitionDetails( definition: CommandLineOption, options: ParseOptions, ): CommandLineOption { definition = mapOptionTypeLabel(definition, options); definition = mapOptionDescription(definition, options); return definition; } function mapOptionDescription(definition: CommandLineOption, options: ParseOptions): CommandLineOption { if (options.prependParamOptionsToDescription !== true || isBoolean(definition)) { return definition; } definition.description = definition.description || ''; if (definition.defaultOption) { definition.description = `Default Option. ${definition.description}`; } if ((definition as unknown as OptionalProperty).optional === true) { definition.description = `Optional. ${definition.description}`; } if (definition.defaultValue != null) { definition.description = `Defaults to ${JSON.stringify(definition.defaultValue)}. ${definition.description}`; } return definition; } function mapOptionTypeLabel(definition: CommandLineOption, options: ParseOptions): CommandLineOption { if (options.displayOptionalAndDefault !== true || isBoolean(definition)) { return definition; } definition.typeLabel = definition.typeLabel || getTypeLabel(definition); if (definition.defaultOption) { definition.typeLabel = `${definition.typeLabel} (D)`; } if ((definition as unknown as OptionalProperty).optional === true) { definition.typeLabel = `${definition.typeLabel} (O)`; } return definition; } function getTypeLabel(definition: CommandLineOption) { let typeLabel = definition.type ? definition.type.name.toLowerCase() : 'string'; const multiple = definition.multiple || definition.lazyMultiple ? '[]' : ''; if (typeLabel) { typeLabel = typeLabel === 'boolean' ? '' : `{underline ${typeLabel}${multiple}}`; } return typeLabel; } export function isBoolean(option: PropertyOptions): boolean { return option.type.name === 'Boolean'; }