{"version":3,"sources":["../../src/commandDecorators.ts"],"names":["init_cjs_shims","__toESM","require_Reflect","commandDecorators","dirname","run","command","name","args","description","callback","forEach","arg","target","app","program","_metaArguments","Reflect","getMetadata","prototype","map","a","kebabCase","createArgument","default","variadic","required","addArgument","_metaOptions","Object","entries","o","_flags","short","push","long","join","argWraps","type","flags","opt","createOption","implies","choices","conflicts","mandatory","hidden","envVar","negate","addOption","action","instance","injections","propertyKey","bindingName","_args","pop","i","val","isFunction","apply","argument","config","parameterIndex","defaults","toString","key","paramTypes","getMetadataKeys","String","_arguments","regex","RegExp","declaration","match","split","trim","startsWith","slice","includes","defaultValue","part","defineMetadata","option","Boolean","descriptor","getOwnPropertyDescriptor","value","toLowerCase","length","options","merge","__name","keys","console","dir","inject","global"],"mappings":"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","file":"chunk-7EYXCRP5.cjs","sourcesContent":["import 'reflect-metadata';\nimport { defaults, isFunction, kebabCase, merge } from '@radicjs/utils';\n\nimport { App } from './Application';\nimport type { Command } from './base/Command.js';\nimport type { RunFn } from './run.js';\n\n\nexport interface ArgumentOptions {\n    name?: string;\n    type?: any;\n    usage?: string;\n    description?: string;\n    choices?: string[];\n    optional?: boolean;\n    required?: boolean;\n    default?: any;\n    variadic?: boolean;\n\n}\n\nexport interface OptionOptions {\n    type?: any;\n    flags?: string;\n    description?: string;\n    choices?: string[];\n    implies?: any;\n    conflicts?: string[];\n\n    required?: boolean; // A value must be supplied when the option is specified.\n    optional?: boolean; // A value is optional when the option is specified.\n    variadic?: boolean;\n    mandatory?: boolean; // The option must have a value after parsing, which usually means it must be specified on command line.\n    short?: string;\n    long?: string;\n    negate?: boolean;\n    default?: any;\n    presetArg?: unknown;\n    envVar?: string;\n    parseArg?: <T>(value: string, previous: T) => T;\n    hidden?: boolean;\n    argChoices?: string[];\n}\n\nexport function commandDecorators(dirname: string, run: RunFn) {\n\n    function command (name: string): ClassDecorator\n    function command (name: string, description: string, callback?: (command: Command, app: App) => any): ClassDecorator\n    function command (name: string, callback?: (command: Command, app: App) => any): ClassDecorator\n    function command (name: string, ...args:any[]): any\n    {\n        let description:string,\n            callback: (command: Command, app: App) => any;\n\n        args.forEach(arg => {\n            if(typeof arg === 'string'){\n                description=arg\n            }else if(typeof arg === 'function'){\n                callback = arg;\n            }\n        })\n        return (target): any => {\n            run(dirname, app => {\n                const command = app.program;\n                command.name(name);\n                if ( description ) {\n                    command.description(description);\n                }\n\n                const _metaArguments: ArgumentOptions[] = Reflect.getMetadata('arguments', target.prototype) || [];\n                const args                              = _metaArguments.map(a => {\n                    const name = kebabCase(a.name);\n\n                    const arg = command.createArgument(name, a.description);\n                    arg.default(a.default);\n                    arg.variadic = a.variadic;\n                    arg.required = a.required;\n\n                    command.addArgument(arg);\n                    return arg;\n                });\n\n\n                const _metaOptions = Reflect.getMetadata('options', target.prototype) || {};\n                const opts         = Object.entries(_metaOptions).map(([ name, o ]: [ string, OptionOptions ]) => {\n                    let _flags = [];\n                    if ( o.short ) {\n                        _flags.push('-' + o.short);\n                    }\n                    if ( o.long ) {\n                        _flags.push('--' + o.long);\n                    }\n                    _flags = [ _flags.join(', ') ];\n\n                    let argWraps = o.required ? [ '<', '>' ] : [ '[', ']' ];\n                    if ( o.type === 'array' ) {\n                        _flags.push(`${argWraps[ 0 ]}${name}...${argWraps[ 1 ]}`);\n                    } else if ( o.type !== 'boolean' ) {\n                        _flags.push(`${argWraps[ 0 ]}${name}${argWraps[ 1 ]}`);\n                    }\n                    let flags = _flags.join(' ');\n\n                    let opt = command.createOption(flags, o.description);\n                    if ( o.default ) {\n                        opt.default(o.default);\n                    }\n                    if ( o.implies ) {\n                        opt.implies(o.implies);\n                    }\n                    if ( o.choices ) {\n                        opt.choices(o.choices);\n                    }\n                    if ( o.conflicts ) {\n                        opt.conflicts(o.conflicts);\n                    }\n                    opt.mandatory = o.mandatory;\n                    opt.hidden    = o.hidden;\n                    opt.envVar    = o.envVar;\n                    opt.negate    = o.negate;\n\n                    command.addOption(opt);\n\n                    return opt;\n                });\n\n\n                if ( callback ) {\n                    callback(command, app);\n                }\n\n                const action = Reflect.getMetadata('action', target.prototype);\n\n\n                const instance = new (target as any)(app);\n                instance.app   = app;\n\n\n                const injections = Reflect.getMetadata('injections', target.prototype) || {};\n                Object.entries(injections).forEach(([ propertyKey, bindingName ]) => {\n                    instance[ propertyKey ] = instance.app[ bindingName as any ];\n                });\n\n                command.action(async function (this: Command, ..._args) {\n                    let cmd  = _args.pop();\n                    let opts = _args.pop();\n\n                    let args = [];\n\n                    _metaArguments.forEach((a, i) => {\n                        let val = _args[ i ];\n                        if ( isFunction(a.type) ) {\n                            val = a.type(val);\n                        }\n                        if ( a.variadic ) {\n                            args.push(...val);\n                        } else {\n                            args.push(val);\n                        }\n\n                    });\n\n                    return instance[ action ].apply(instance, args);\n                });\n            });\n            return target;\n        };\n    }\n\n    const argument = (description: string, config: ArgumentOptions = {}): ParameterDecorator =>\n        (target, propertyKey, parameterIndex) => {\n            config    = defaults(config, { description, name: propertyKey.toString() });\n            const key = propertyKey.toString();\n\n            // running with tsx does not produce these metadata\n            const type       = Reflect.getMetadata('design:type', target, key);\n            const paramTypes = Reflect.getMetadata('design:paramtypes', target, key);\n            const returnType = Reflect.getMetadata('design:returntype', target, key);\n            const keys       = Reflect.getMetadataKeys(target, propertyKey);\n            // so this will error\n            try {\n                config.type = paramTypes[ parameterIndex ];\n            } catch {\n                config.type = String;\n            }\n            const _arguments = Reflect.getMetadata('arguments', target) || [];\n\n\n            const regex       = new RegExp('^' + key + '\\\\((.*?)\\\\)');\n            const declaration = target[ propertyKey ].toString();\n            const match       = declaration.match(regex);\n\n            if ( match && match[ 1 ] ) {\n                // Split the captured arguments by comma and trim spaces\n                const args = match[ 1 ].split(',').map(arg => arg.trim());\n                const arg  = args[ parameterIndex ];\n\n                if ( arg.startsWith('...') ) {\n                    config.name     = arg.slice(3).trim();\n                    config.variadic = true;\n                } else if ( arg.includes('=') ) {\n                    const [ name, defaultValue ] = args[ parameterIndex ].split('=').map(part => part.trim());\n                    config.name                  = name;\n                    config.default               = defaultValue;\n                } else {\n                    config.name = arg.trim();\n                }\n            }\n            _arguments[ parameterIndex ] = config;\n\n\n            Reflect.defineMetadata('arguments', _arguments, target);\n            //\n            // console.log('argument', propertyKey, parameterIndex, {\n            //     type,\n            //     paramTypes,\n            //     returnType,\n            //     keys,\n            // }, 'config:', config);\n        };\n\n    let option = (description: string, config: OptionOptions = {}): PropertyDecorator =>\n        (target, propertyKey) => {\n            config     = defaults(config, {\n                description,\n                mandatory: false,\n                negate: false,\n                hidden: false,\n                type: Boolean,\n            });\n            const key  = propertyKey.toString();\n            const name = propertyKey.toString();\n            const type = Reflect.getMetadata('design:type', target, propertyKey);\n\n            const instance   = new (target as any)[ 'constructor' ] as any;\n            const descriptor = Reflect.getOwnPropertyDescriptor(instance, propertyKey);\n            const keys       = Reflect.getMetadataKeys(instance, propertyKey);\n\n            config.default = descriptor.value || config.default;\n            config.type    = type || config.type;\n\n            if ( config.type && config.type.name ) {\n                config.type     = config.type.name.toLowerCase();\n                config.variadic = true;\n            }\n\n            if ( key.length === 1 ) {\n                config.short = key;\n            } else {\n                config.long = key;\n            }\n\n\n            const options  = Reflect.getMetadata('options', target) || {};\n            options[ key ] = merge({}, options[ key ] || {}, config);\n            Reflect.defineMetadata('options', options, target);\n\n            // console.dir({ type, descriptor, keys });\n        };\n\n    const action = (): MethodDecorator =>\n        (target, propertyKey, descriptor) => {\n            // const descriptor = Reflect.getOwnPropertyDescriptor(instance, propertyKey);\n            const args = Reflect.getMetadata('arguments', target);\n            const keys = Reflect.getMetadataKeys(target, propertyKey);\n            Reflect.defineMetadata('action', propertyKey, target);\n            console.dir({ args, descriptor, keys });\n        };\n\n    const inject = (name: keyof App): PropertyDecorator => {\n        return (target, propertyKey) => {\n            const injections          = Reflect.getMetadata('injections', target) || {};\n            injections[ propertyKey ] = name;\n            Reflect.defineMetadata('injections', injections, target);\n        };\n    };\n\n\n    return { command, argument, option, global, action, inject };\n}\n"]}