| // Generated by CoffeeScript 1.12.7 | 
|   | 
| /* | 
|  * Omelette Simple Auto Completion for Node | 
|  */ | 
|   | 
| (function() { | 
|   var EventEmitter, Omelette, depthOf, fs, os, path, | 
|     hasProp = {}.hasOwnProperty, | 
|     extend = function(child, parent) { for (var key in parent) { if (hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; }, | 
|     slice = [].slice; | 
|   | 
|   EventEmitter = require("events").EventEmitter; | 
|   | 
|   path = require("path"); | 
|   | 
|   fs = require("fs"); | 
|   | 
|   os = require("os"); | 
|   | 
|   depthOf = function(object) { | 
|     var depth, key, level; | 
|     level = 1; | 
|     for (key in object) { | 
|       if (!hasProp.call(object, key)) continue; | 
|       if (typeof object[key] === 'object') { | 
|         depth = depthOf(object[key]) + 1; | 
|         level = Math.max(depth, level); | 
|       } | 
|     } | 
|     return level; | 
|   }; | 
|   | 
|   Omelette = (function(superClass) { | 
|     var log; | 
|   | 
|     extend(Omelette, superClass); | 
|   | 
|     log = console.log; | 
|   | 
|     function Omelette() { | 
|       var isFish, isZsh, ref, ref1; | 
|       this.compgen = process.argv.indexOf("--compgen"); | 
|       this.install = process.argv.indexOf("--completion") > -1; | 
|       this.installFish = process.argv.indexOf("--completion-fish") > -1; | 
|       isZsh = process.argv.indexOf("--compzsh") > -1; | 
|       isFish = process.argv.indexOf("--compfish") > -1; | 
|       this.isDebug = process.argv.indexOf("--debug") > -1; | 
|       this.fragment = parseInt(process.argv[this.compgen + 1]) - (isZsh ? 1 : 0); | 
|       this.line = process.argv[this.compgen + 3]; | 
|       this.word = (ref = this.line) != null ? ref.trim().split(/\s+/).pop() : void 0; | 
|       ref1 = process.env, this.HOME = ref1.HOME, this.SHELL = ref1.SHELL; | 
|     } | 
|   | 
|     Omelette.prototype.setProgram = function(programs) { | 
|       programs = programs.split('|'); | 
|       this.program = programs[0]; | 
|       return this.programs = programs.map(function(program) { | 
|         return program.replace(/[^A-Za-z0-9\.\_\-]/g, ''); | 
|       }); | 
|     }; | 
|   | 
|     Omelette.prototype.setFragments = function() { | 
|       var fragments1; | 
|       fragments1 = 1 <= arguments.length ? slice.call(arguments, 0) : []; | 
|       this.fragments = fragments1; | 
|     }; | 
|   | 
|     Omelette.prototype.generate = function() { | 
|       var data; | 
|       data = { | 
|         before: this.word, | 
|         fragment: this.fragment, | 
|         line: this.line, | 
|         reply: this.reply | 
|       }; | 
|       this.emit("complete", this.fragments[this.fragment - 1], data); | 
|       this.emit(this.fragments[this.fragment - 1], data); | 
|       this.emit("$" + this.fragment, data); | 
|       return process.exit(); | 
|     }; | 
|   | 
|     Omelette.prototype.reply = function(words) { | 
|       if (words == null) { | 
|         words = []; | 
|       } | 
|       console.log(typeof words.join === "function" ? words.join(os.EOL) : void 0); | 
|       return process.exit(); | 
|     }; | 
|   | 
|     Omelette.prototype.tree = function(objectTree) { | 
|       var depth, i, level, ref; | 
|       if (objectTree == null) { | 
|         objectTree = {}; | 
|       } | 
|       depth = depthOf(objectTree); | 
|       for (level = i = 1, ref = depth; 1 <= ref ? i <= ref : i >= ref; level = 1 <= ref ? ++i : --i) { | 
|         this.on("$" + level, function(arg) { | 
|           var accessor, fragment, line, replies, reply; | 
|           fragment = arg.fragment, reply = arg.reply, line = arg.line; | 
|           accessor = new Function('_', "return _['" + (line.split(/\s+/).slice(1).filter(Boolean).join("']['")) + "']"); | 
|           replies = fragment === 1 ? Object.keys(objectTree) : accessor(objectTree); | 
|           return reply((function(replies) { | 
|             if (replies instanceof Function) { | 
|               return replies(); | 
|             } | 
|             if (replies instanceof Array) { | 
|               return replies; | 
|             } | 
|             if (replies instanceof Object) { | 
|               return Object.keys(replies); | 
|             } | 
|           })(replies)); | 
|         }); | 
|       } | 
|       return this; | 
|     }; | 
|   | 
|     Omelette.prototype.generateCompletionCode = function() { | 
|       var completions; | 
|       completions = this.programs.map((function(_this) { | 
|         return function(program) { | 
|           var completion; | 
|           completion = "_" + program + "_completion"; | 
|           return "### " + program + " completion - begin. generated by omelette.js ###\nif type compdef &>/dev/null; then\n  " + completion + "() {\n    compadd -- `" + _this.program + " --compzsh --compgen \"${CURRENT}\" \"${words[CURRENT-1]}\" \"${BUFFER}\"`\n  }\n  compdef " + completion + " " + program + "\nelif type complete &>/dev/null; then\n  " + completion + "() {\n    local cur prev nb_colon\n    _get_comp_words_by_ref -n : cur prev\n    nb_colon=$(grep -o \":\" <<< \"$COMP_LINE\" | wc -l)\n\n    COMPREPLY=( $(compgen -W '$(" + _this.program + " --compbash --compgen \"$((COMP_CWORD - (nb_colon * 2)))\" \"$prev\" \"${COMP_LINE}\")' -- \"$cur\") )\n\n    __ltrim_colon_completions \"$cur\"\n  }\n  complete -F " + completion + " " + program + "\nfi\n### " + program + " completion - end ###"; | 
|         }; | 
|       })(this)); | 
|       if (this.isDebug) { | 
|         completions.push(this.generateTestAliases()); | 
|       } | 
|       return completions.join(os.EOL); | 
|     }; | 
|   | 
|     Omelette.prototype.generateCompletionCodeFish = function() { | 
|       var completions; | 
|       completions = this.programs.map((function(_this) { | 
|         return function(program) { | 
|           var completion; | 
|           completion = "_" + program + "_completion"; | 
|           return "### " + program + " completion - begin. generated by omelette.js ###\nfunction " + completion + "\n  " + _this.program + " --compfish --compgen (count (commandline -poc)) (commandline -pt) (commandline -pb)\nend\ncomplete -f -c " + program + " -a '(" + completion + ")'\n### " + program + " completion - end ###"; | 
|         }; | 
|       })(this)); | 
|       if (this.isDebug) { | 
|         completions.push(this.generateTestAliases()); | 
|       } | 
|       return completions.join(os.EOL); | 
|     }; | 
|   | 
|     Omelette.prototype.generateTestAliases = function() { | 
|       var debugAliases, debugUnaliases, fullPath; | 
|       fullPath = path.join(process.cwd(), this.program); | 
|       debugAliases = this.programs.map(function(program) { | 
|         return "  alias " + program + "=" + fullPath; | 
|       }).join(os.EOL); | 
|       debugUnaliases = this.programs.map(function(program) { | 
|         return "  unalias " + program; | 
|       }).join(os.EOL); | 
|       return "### test method ###\nomelette-debug-" + this.program + "() {\n" + debugAliases + "\n}\nomelette-nodebug-" + this.program + "() {\n" + debugUnaliases + "\n}\n### tests ###"; | 
|     }; | 
|   | 
|     Omelette.prototype.checkInstall = function() { | 
|       if (this.install) { | 
|         log(this.generateCompletionCode()); | 
|         process.exit(); | 
|       } | 
|       if (this.installFish) { | 
|         log(this.generateCompletionCodeFish()); | 
|         return process.exit(); | 
|       } | 
|     }; | 
|   | 
|     Omelette.prototype.getActiveShell = function() { | 
|       var SHELL; | 
|       SHELL = process.env.SHELL; | 
|       if (SHELL.match(/bash/)) { | 
|         return 'bash'; | 
|       } else if (SHELL.match(/zsh/)) { | 
|         return 'zsh'; | 
|       } else if (SHELL.match(/fish/)) { | 
|         return 'fish'; | 
|       } | 
|     }; | 
|   | 
|     Omelette.prototype.getDefaultShellInitFile = function() { | 
|       var fileAt, fileAtHome; | 
|       fileAt = function(root) { | 
|         return function(file) { | 
|           return path.join(root, file); | 
|         }; | 
|       }; | 
|       fileAtHome = fileAt(this.HOME); | 
|       switch (this.shell = this.getActiveShell()) { | 
|         case 'bash': | 
|           return fileAtHome('.bash_profile'); | 
|         case 'zsh': | 
|           return fileAtHome('.zshrc'); | 
|         case 'fish': | 
|           return fileAtHome('.config/fish/config.fish'); | 
|       } | 
|     }; | 
|   | 
|     Omelette.prototype.setupShellInitFile = function(initFile) { | 
|       var completionPath, programFolder, template; | 
|       if (initFile == null) { | 
|         initFile = this.getDefaultShellInitFile(); | 
|       } | 
|       template = (function(_this) { | 
|         return function(command) { | 
|           return "\n# begin " + _this.program + " completion\n" + command + "\n# end " + _this.program + " completion\n"; | 
|         }; | 
|       })(this); | 
|       switch (this.shell) { | 
|         case 'bash': | 
|           programFolder = path.join(this.HOME, "." + this.program); | 
|           completionPath = path.join(programFolder, 'completion.sh'); | 
|           if (!fs.existsSync(programFolder)) { | 
|             fs.mkdirSync(programFolder); | 
|           } | 
|           fs.writeFileSync(completionPath, this.generateCompletionCode()); | 
|           fs.appendFileSync(initFile, template("source " + completionPath)); | 
|           break; | 
|         case 'zsh': | 
|           fs.appendFileSync(initFile, template(". <(" + this.program + " --completion)")); | 
|           break; | 
|         case 'fish': | 
|           fs.appendFileSync(initFile, template(this.program + " --completion-fish | source")); | 
|       } | 
|       return process.exit(); | 
|     }; | 
|   | 
|     Omelette.prototype.init = function() { | 
|       if (this.compgen > -1) { | 
|         return this.generate(); | 
|       } | 
|     }; | 
|   | 
|     return Omelette; | 
|   | 
|   })(EventEmitter); | 
|   | 
|   module.exports = function() { | 
|     var _omelette, args, callback, callbacks, fn, fragment, fragments, i, index, len, program, ref, ref1, template; | 
|     template = arguments[0], args = 2 <= arguments.length ? slice.call(arguments, 1) : []; | 
|     if (template instanceof Array && args.length > 0) { | 
|       ref = [template[0].trim(), args], program = ref[0], callbacks = ref[1]; | 
|       fragments = callbacks.map(function(callback, index) { | 
|         return "arg" + index; | 
|       }); | 
|     } else { | 
|       ref1 = template.split(/\s+/), program = ref1[0], fragments = 2 <= ref1.length ? slice.call(ref1, 1) : []; | 
|       callbacks = []; | 
|     } | 
|     fragments = fragments.map(function(fragment) { | 
|       return fragment.replace(/^\<+|\>+$/g, ''); | 
|     }); | 
|     _omelette = new Omelette; | 
|     _omelette.setProgram(program); | 
|     _omelette.setFragments.apply(_omelette, fragments); | 
|     _omelette.checkInstall(); | 
|     fn = function(callback) { | 
|       return _omelette.on(fragment, function() { | 
|         var args; | 
|         args = 1 <= arguments.length ? slice.call(arguments, 0) : []; | 
|         return this.reply(callback instanceof Array ? callback : callback.apply(null, args)); | 
|       }); | 
|     }; | 
|     for (index = i = 0, len = callbacks.length; i < len; index = ++i) { | 
|       callback = callbacks[index]; | 
|       fragment = "arg" + index; | 
|       fn(callback); | 
|     } | 
|     return _omelette; | 
|   }; | 
|   | 
| }).call(this); |