diff --git a/.gitignore b/.gitignore index 2e7b227e..a6f604dd 100644 --- a/.gitignore +++ b/.gitignore @@ -21,3 +21,5 @@ coverage # test temp test/temp +autocomplete-hints.json + diff --git a/bin/ask-autocomplete.js b/bin/ask-autocomplete.js new file mode 100644 index 00000000..686b1248 --- /dev/null +++ b/bin/ask-autocomplete.js @@ -0,0 +1,29 @@ +#!/usr/bin/env node + +require('module-alias/register'); +const commander = require('commander'); +const { makeAutoCompleteCommander } = require('@src/commands/autocomplete'); +const { makeSmapiCommander } = require('@src/commands/smapi/smapi-commander'); +const ConfigureCommander = require('@src/commands/configure'); +const DeployCommander = require('@src/commands/deploy'); +const DialogCommander = require('@src/commands/dialog'); +const InitCommander = require('@src/commands/init'); +const NewCommander = require('@src/commands/new'); +const UtilCommander = require('@src/commands/util/util-commander'); + +const smapiCommander = makeSmapiCommander(); +const utilCommander = UtilCommander.commander; +const configureCommander = ConfigureCommander.createCommand(commander); +const deployCommander = DeployCommander.createCommand(commander); +const newCommander = NewCommander.createCommand(commander); +const initCommander = InitCommander.createCommand(commander); +const dialogCommander = DialogCommander.createCommand(commander); +const commanders = [smapiCommander, utilCommander, configureCommander, deployCommander, newCommander, initCommander, dialogCommander]; + +const autoCompleteCommander = makeAutoCompleteCommander(commanders); + +if (!process.argv.slice(2).length) { + autoCompleteCommander.outputHelp(); +} else { + autoCompleteCommander.parse(process.argv); +} diff --git a/bin/ask.js b/bin/ask.js index 811641ca..b052d735 100755 --- a/bin/ask.js +++ b/bin/ask.js @@ -9,6 +9,8 @@ if (!require('semver').gte(process.version, '8.3.0')) { require('module-alias/register'); const commander = require('commander'); +const CONSTANTS = require('@src/utils/constants'); +const { initAutoComplete } = require('@src/commands/autocomplete'); require('@src/commands/configure').createCommand(commander); require('@src/commands/deploy').createCommand(commander); @@ -16,14 +18,16 @@ require('@src/commands/new').createCommand(commander); require('@src/commands/init').createCommand(commander); require('@src/commands/dialog').createCommand(commander); +initAutoComplete(); + commander .description('Command Line Interface for Alexa Skill Kit') .command('smapi', 'list of Alexa Skill Management API commands') + .command('autocomplete', 'sets up terminal auto completion') .command('util', 'tooling functions when using ask-cli to manage Alexa Skill') .version(require('../package.json').version) .parse(process.argv); -const ALLOWED_ASK_ARGV_2 = ['configure', 'deploy', 'new', 'init', 'dialog', 'smapi', 'util', 'help', '-v', '--version', '-h', '--help']; -if (process.argv[2] && ALLOWED_ASK_ARGV_2.indexOf(process.argv[2]) === -1) { +if (process.argv[2] && CONSTANTS.TOP_LEVEL_COMMANDS.indexOf(process.argv[2]) === -1) { console.log('Command not recognized. Please run "ask" to check the user instructions.'); } diff --git a/lib/commands/abstract-command.js b/lib/commands/abstract-command.js index a7df0a06..235cf500 100644 --- a/lib/commands/abstract-command.js +++ b/lib/commands/abstract-command.js @@ -59,6 +59,7 @@ class AbstractCommand { // register command action this._registerAction(commanderCopy); + return commanderCopy; } catch (err) { Messenger.getInstance().fatal(err); this.exit(1); diff --git a/lib/commands/autocomplete/helper.js b/lib/commands/autocomplete/helper.js new file mode 100644 index 00000000..b7732a76 --- /dev/null +++ b/lib/commands/autocomplete/helper.js @@ -0,0 +1,95 @@ +const fs = require('fs-extra'); + +const CONSTANTS = require('@src/utils/constants'); + +module.exports = class Helper { + constructor(omelette, commanders = []) { + this.commanders = commanders; + this.completion = omelette(`ask ${'