UNPKG

heroku

Version:

CLI to interact with Heroku

214 lines (213 loc) 7.46 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); const fs = require("fs-extra"); const path = require("path"); const base_1 = require("../../lib/autocomplete/base"); const debug = require('debug')('autocomplete:create'); const AC_LIB_PATH = path.resolve(__dirname, '..', '..', '..', 'autocomplete-scripts'); class Create extends base_1.AutocompleteBase { async run() { this.errorIfWindows(); // 1. ensure needed dirs await this.ensureDirs(); // 2. save (generated) autocomplete files await this.createFiles(); } async ensureDirs() { // ensure autocomplete cache dir await fs.ensureDir(this.autocompleteCacheDir); // ensure autocomplete completions dir await fs.ensureDir(this.completionsCacheDir); } async createFiles() { await fs.writeFile(this.bashSetupScriptPath, this.bashSetupScript); await fs.writeFile(this.zshSetupScriptPath, this.zshSetupScript); await fs.writeFile(this.bashCommandsListPath, this.bashCommandsList); await fs.writeFile(this.zshCompletionSettersPath, this.zshCompletionSetters); } get bashSetupScriptPath() { // <cacheDir>/autocomplete/bash_setup return path.join(this.autocompleteCacheDir, 'bash_setup'); } get bashCommandsListPath() { // <cacheDir>/autocomplete/commands return path.join(this.autocompleteCacheDir, 'commands'); } get zshSetupScriptPath() { // <cacheDir>/autocomplete/zsh_setup return path.join(this.autocompleteCacheDir, 'zsh_setup'); } get zshCompletionSettersPath() { // <cacheDir>/autocomplete/commands_setters return path.join(this.autocompleteCacheDir, 'commands_setters'); } get skipEllipsis() { return process.env.HEROKU_AC_ZSH_SKIP_ELLIPSIS === '1'; } get commands() { if (this._commands) return this._commands; const plugins = this.config.plugins; const commands = []; plugins.forEach(p => { p.commands.forEach(c => { if (c.hidden) return; try { commands.push(c); } catch (error) { debug(`Error creating completions for command ${c.id}`); debug(error.message); this.writeLogFile(error.message); } }); }); this._commands = commands; return this._commands; } get bashCommandsList() { return this.commands.map(c => { try { const publicFlags = this.genCmdPublicFlags(c).trim(); return `${c.id} ${publicFlags}`; } catch (error) { debug(`Error creating bash completion for command ${c.id}, moving on...`); debug(error.message); this.writeLogFile(error.message); return ''; } }).join('\n'); } get zshCompletionSetters() { const cmdsSetter = this.zshCommandsSetter; const flagSetters = this.zshCommandsFlagsSetters; return `${cmdsSetter}\n${flagSetters}`; } get zshCommandsSetter() { const cmdsWithDescriptions = this.commands.map(c => { try { return this.genCmdWithDescription(c); } catch (error) { debug(`Error creating zsh autocomplete for command ${c.id}, moving on...`); debug(error.message); this.writeLogFile(error.message); return ''; } }); return this.genZshAllCmdsListSetter(cmdsWithDescriptions); } get zshCommandsFlagsSetters() { return this.commands.map(c => { try { return this.genZshCmdFlagsSetter(c); } catch (error) { debug(`Error creating zsh autocomplete for command ${c.id}, moving on...`); debug(error.message); this.writeLogFile(error.message); return ''; } }).join('\n'); } genCmdPublicFlags(command) { const Flags = command.flags || {}; return Object.keys(Flags) .filter(flag => !Flags[flag].hidden) .map(flag => `--${flag}`) .join(' '); } genCmdWithDescription(command) { let description = ''; if (command.description) { const text = command.description.split('\n')[0]; description = `:"${text}"`; } return `"${command.id.replace(/:/g, '\\:')}"${description}`; } genZshCmdFlagsSetter(command) { const id = command.id; const flagscompletions = Object.keys(command.flags || {}) .filter(flag => command.flags && !command.flags[flag].hidden) .map(flag => { const f = (command.flags && command.flags[flag]) || { description: '' }; const isBoolean = f.type === 'boolean'; const hasCompletion = 'completion' in f || this.findCompletion(id, flag, f.description); const name = isBoolean ? flag : `${flag}=-`; let cachecompl = ''; if (hasCompletion) { cachecompl = ': :_compadd_flag_options'; } if (this.wantsLocalFiles(flag)) { cachecompl = ': :_files'; } const help = isBoolean ? '(switch) ' : (hasCompletion ? '(autocomplete) ' : ''); const completion = `--${name}[${help}${f.description}]${cachecompl}`; return `"${completion}"`; }) .join('\n'); if (flagscompletions) { return `_set_${id.replace(/:/g, '_')}_flags () { _flags=( ${flagscompletions} ) } `; } return `# no flags for ${id}`; } genZshAllCmdsListSetter(cmdsWithDesc) { return ` _set_all_commands_list () { _all_commands_list=( ${cmdsWithDesc.join('\n')} ) } `; } get envAnalyticsDir() { return `HEROKU_AC_ANALYTICS_DIR=${path.join(this.autocompleteCacheDir, 'completion_analytics')};`; } get envCommandsPath() { return `HEROKU_AC_COMMANDS_PATH=${path.join(this.autocompleteCacheDir, 'commands')};`; } get bashSetupScript() { return `${this.envAnalyticsDir} ${this.envCommandsPath} HEROKU_AC_BASH_COMPFUNC_PATH=${path.join(AC_LIB_PATH, 'bash', 'heroku.bash')} && test -f $HEROKU_AC_BASH_COMPFUNC_PATH && source $HEROKU_AC_BASH_COMPFUNC_PATH; `; } get zshSetupScript() { return `${this.skipEllipsis ? '' : this.completionDotsFunc} ${this.envAnalyticsDir} ${this.envCommandsPath} HEROKU_AC_ZSH_SETTERS_PATH=\${HEROKU_AC_COMMANDS_PATH}_setters && test -f $HEROKU_AC_ZSH_SETTERS_PATH && source $HEROKU_AC_ZSH_SETTERS_PATH; fpath=( ${path.join(AC_LIB_PATH, 'zsh')} $fpath ); autoload -Uz compinit; compinit; `; } get completionDotsFunc() { return `expand-or-complete-with-dots() { echo -n "..." zle expand-or-complete zle redisplay } zle -N expand-or-complete-with-dots bindkey "^I" expand-or-complete-with-dots`; } wantsLocalFiles(flag) { return [ 'file', 'procfile', ].includes(flag); } } exports.default = Create; Create.hidden = true; Create.description = 'create autocomplete setup scripts and completion functions';