{"version":3,"sources":["../../src/base/BaseAutocompleteCommand.ts"],"names":["BaseCommand","_Command","_completionRules","options","args","complete","rules","merge","hasCompletionRules","isEmptyRule","Object","keys","length","commands","every","command","autocomplete","argv","RESERVED_STARTING_KEYWORDS","firstArg","includes","emit","executableName","basename","self","completion","omelette","on","f","event","autocompleteHandleEvent","init","getAutocompleteSubCommand","elements","commandName","commandArgs","find","c","name","fragment","map","reply","concat","line","split","slice","currentCommand","recurse","shift","autocompleteCandidates","singleCommandArgs","typedArgs","completionRules","autocompleteNormalizeRules","activeOption","autocompleteActiveOption","Array","isArray","optionNames","filter","option","sibling","activeArg","autocompleteActiveArg","rawRules","registeredArguments","normalizedRules","o","global","forEach","short","long","arity","arg","push","parse","parseOptions","parseAsync","optionRules","lastArg","argRules","count","curr","currStr"],"mappings":"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","file":"BaseAutocompleteCommand.mjs","sourcesContent":["// @ts-ignore\nimport { Command as _Command, ParseOptions } from 'commander';\nimport { basename } from 'path';\n\nimport {EventEmitter} from 'node:events';\nimport { merge } from '@radicjs/utils';\nimport type { Option } from './Option.js';\n\n\n// lazy require\nimport omelette from 'omelette';\n\nexport type CompletionRuleValue = ((args?: string[]) => string[]) | string[];\n\nexport interface CompletionRules {\n    options?: Record<string, CompletionRuleValue>,\n    args?: Record<string, CompletionRuleValue>,\n}\n\nexport type NormalizedCompletionRule = {\n    arity?: number,\n    sibling?: string,\n    reply?: any[]\n}\n\nexport interface NormalizedCompletionRules {\n    options?: Record<string, NormalizedCompletionRule>,\n    args?: any[],\n\n}\n\n// export interface _Command extends EventEmitter{}\n\nexport class BaseCommand extends _Command {\n\n\n    public _completionRules: CompletionRules = {\n        options: {},\n        args   : {},\n    };\n\n    complete(rules: CompletionRules & { arguments?: CompletionRules['args'] }) {\n        merge(this._completionRules,rules);\n        // if ( rules.options ) {\n        //     this._completionRules.options = rules.options;\n        // }\n        //\n        // // support both arguments or args as key\n        // if ( rules.arguments ) {\n        //     this._completionRules.args = rules.arguments;\n        // } else if ( rules.args ) {\n        //     this._completionRules.args = rules.args;\n        // }\n\n        return this;\n    }\n\n    hasCompletionRules(): boolean {\n        function isEmptyRule(rules) {\n            return (\n                Object.keys(rules.options).length === 0 &&\n                Object.keys(rules.args).length === 0\n            );\n        }\n\n        return !(\n            isEmptyRule(this._completionRules) &&\n            this.commands.every(function (command: any) {\n                return isEmptyRule(command._completionRules);\n            })\n        );\n\n\n    }\n\n    autocomplete(argv) {\n        var RESERVED_STARTING_KEYWORDS = [\n            '--completion',\n            '--completion-fish',\n            '--compzsh',\n            '--compbash',\n            '--compfish',\n        ];\n        var firstArg                   = argv[ 2 ];\n\n\n        if ( RESERVED_STARTING_KEYWORDS.includes(firstArg) ) {\n            // @ts-ignore\n            this.emit('autocomplete',firstArg,this)\n            var executableName = basename(argv[ 1 ], '.js');\n            var self           = this;\n\n            var completion = omelette(executableName);\n\n            completion.on('complete', function (f, event) {\n                self.autocompleteHandleEvent(event);\n            });\n\n            // omelette will call process.exit(0)\n            completion.init();\n        }\n\n        return this;\n    }\n\n    getAutocompleteSubCommand(event: any, elements: string[], commandName: string, commandArgs: string[]) {\n        return this.commands.find(function (c) {\n            return c.name() === commandName;\n        }) as this;\n    }\n\n    autocompleteHandleEvent(event) {\n        if ( this.commands.length > 0 ) {\n            // sub command style\n            if ( event.fragment === 1 ) {\n                // for sub command first complete should return command\n                var commands = this.commands.map(function (c) { return c.name(); });\n\n                event.reply(commands.concat([ '--help' ]));\n            } else {\n                var elements             = event.line.split(' ');\n                var commandName          = elements[ 1 ];\n                var commandArgs          = elements.slice(2, event.fragment);\n                var currentCommand: this = this.getAutocompleteSubCommand(event, elements, commandName, commandArgs);\n\n                const recurse = (currentCommand: this) => {\n                    if ( currentCommand.commands && currentCommand.commands.find(c => c.name() === commandArgs[ 0 ]) ) {\n                        commandName    = commandArgs.shift();\n                        currentCommand = currentCommand.getAutocompleteSubCommand(event, elements, commandName, commandArgs);\n                        return recurse(currentCommand);\n                    }\n                    return currentCommand;\n                };\n\n                if ( currentCommand ) {\n                    currentCommand = recurse(currentCommand);\n                    event.reply(\n                        currentCommand.autocompleteCandidates(commandArgs),\n                    );\n                } else {\n                    event.reply([]);\n                }\n            }\n        } else {\n            // single command style\n            var singleCommandArgs = event.line.split(' ').slice(1, event.fragment);\n            // if(event.before === '-'){\n            //     singleCommandArgs.push('-')\n            // }\n\n            if ( event.fragment === 1 ) {\n                // offer --help for the first complete only\n                event.reply(\n                    this.autocompleteCandidates(singleCommandArgs).concat([ '--help' ]),\n                );\n            } else {\n                event.reply(\n                    this.autocompleteCandidates(singleCommandArgs),\n                );\n            }\n        }\n    }\n\n    autocompleteCandidates(typedArgs: any[]): any[] {\n        var completionRules = this.autocompleteNormalizeRules();\n        var activeOption    = autocompleteActiveOption(\n            completionRules.options, typedArgs,\n        );\n\n        if ( activeOption ) {\n            // if current typedArgs suggests it's filling an option\n            // next value would be the possible values for that option\n            var reply = activeOption.reply;\n\n            if ( typeof reply === 'function' ) {\n                return (reply(typedArgs) || []);\n            } else if ( Array.isArray(reply) ) {\n                return reply;\n            } else {\n                return [];\n            }\n        } else {\n            // otherwise\n            // next value would be one of the unused option names\n            var optionNames = Object\n            .keys(completionRules.options)\n            .filter(function (name) {\n                var option = completionRules.options[ name ];\n\n                if ( option.sibling ) {\n                    // remove both option and its sibling form\n                    return (\n                        !typedArgs.includes(name) &&\n                        !typedArgs.includes(option.sibling)\n                    );\n                } else {\n                    return !typedArgs.includes(name);\n                }\n            });\n\n            // or possible values for next arguments\n            var activeArg = autocompleteActiveArg(\n                completionRules.options,\n                completionRules.args,\n                typedArgs,\n            );\n\n            // if ( typeof activeArg === 'function' ) {\n            //     return (activeArg(typedArgs) || []);\n            // } else if ( Array.isArray(activeArg) ) {\n            //     return activeArg;\n            // } else {\n            //     return optionNames;\n            // }\n            if ( typeof activeArg === 'function' ) {\n                return (activeArg(typedArgs) || []).concat(optionNames);\n            } else if ( Array.isArray(activeArg) ) {\n                return activeArg.concat(optionNames);\n            } else {\n                return optionNames;\n            }\n        }\n    }\n\n    autocompleteNormalizeRules() {\n\n        // supplement with important information including\n        // option arity and sibling\n        var rawRules                                   = this._completionRules;\n        var options: Option[]                          = this.options as any;\n        var args                                       = this.registeredArguments;\n        var normalizedRules: NormalizedCompletionRules = { options: {}, args: [] };\n\n        options.filter(o => o.global() === false).forEach(function (option) {\n            if ( option.short ) {\n                var reply = (\n                    rawRules.options[ option.long ] ||\n                    rawRules.options[ option.short ] ||\n                    []\n                );\n\n                normalizedRules.options[ option.short ] = {\n                    arity  : option.arity(),\n                    sibling: option.long,\n                    reply  : reply,\n                } as any;\n\n                normalizedRules.options[ option.long ] = {\n                    arity  : option.arity(),\n                    sibling: option.short,\n                    reply  : reply,\n                } as any;\n            } else {\n                normalizedRules.options[ option.long ] = {\n                    arity  : option.arity(),\n                    sibling: null,\n                    reply  : rawRules.options[ option.long ] || [],\n                } as any;\n            }\n        });\n\n\n        args.forEach(function (arg) {\n            normalizedRules.args.push(rawRules.args[ arg.name() ] || []);\n        });\n\n        // subcommand doesnt have a argument registered so we add it now\n        if ( this.commands.length > 0 && normalizedRules.args.length === 0 && 'command' in rawRules.args ) {\n            normalizedRules.args.push(rawRules.args[ 'command' ]);\n        }\n\n        return normalizedRules;\n    }\n\n    public parse(argv?: readonly string[], parseOptions?: ParseOptions): this {\n        // trigger autocomplete first if some completion rules have been defined\n        if ( this.hasCompletionRules() ) {\n            this.autocomplete(argv);\n        }\n        super.parse(argv, parseOptions);\n        return this;\n    }\n\n    public parseAsync(argv?: readonly string[], parseOptions?: ParseOptions): Promise<this> {\n        if ( this.hasCompletionRules() ) {\n            this.autocomplete(argv);\n        }\n        return super.parseAsync(argv, parseOptions);\n    }\n}\n\nfunction autocompleteActiveOption(optionRules: any, typedArgs: any[]) {\n    if ( typedArgs.length === 0 ) {\n        return false;\n    }\n\n    var lastArg = typedArgs[ typedArgs.length - 1 ];\n\n    if ( !optionRules[ lastArg ] ) {\n        return false;\n    }\n\n    var option = optionRules[ lastArg ];\n\n    if ( option.arity === 0 ) {\n        return false;\n    }\n\n    return option;\n}\n\nfunction autocompleteActiveArg(optionRules: any, argRules: any[], typedArgs: any[]) {\n    if ( argRules.length === 0 ) {\n        return false;\n    }\n\n    // find out how many args have already been typed\n    var count = 0;\n    var curr  = 0;\n\n    while ( curr < typedArgs.length ) {\n        var currStr = typedArgs[ curr ];\n\n        if ( optionRules[ currStr ] ) {\n            curr += optionRules[ currStr ].arity + 1;\n        } else {\n            count += 1;\n            curr += 1;\n        }\n    }\n\n    if ( argRules.length > count ) {\n        return argRules[ count ];\n    } else {\n        return false;\n    }\n}\n"]}