azure-cli
Version:
Microsoft Azure Cross Platform Command Line tool
125 lines (108 loc) • 4.15 kB
JavaScript
//
// Copyright (c) Microsoft and contributors. All rights reserved.
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
//
// See the License for the specific language governing permissions and
// limitations under the License.
//
var _ = require('underscore');
var fs = require('fs');
var path = require('path');
var CmdLoader = require('./cmdLoader');
var utilsCore = require('./util/utilsCore');
function AutoComplete() {
this.mode = utilsCore.getMode();
this.cmdMetadataFile = path.join(__dirname, 'plugins.' + this.mode + '.json');
this.cmdBasePath = __dirname;
var loader = new CmdLoader(this, this.mode);
if (loader.cmdMetadataExists()) {
this.initFromCmdMetadata();
}
this.enableAutoComplete();
}
_.extend(AutoComplete.prototype, {
initFromCmdMetadata: function () {
var data = fs.readFileSync(this.cmdMetadataFile);
var cachedPlugins = JSON.parse(data);
this.commands = cachedPlugins.commands;
this.categories = cachedPlugins.categories;
},
enableAutoComplete: function () {
var root = this;
var omelette = require('omelette');
root.autoComplete = omelette('azure');
function handleAutocomplete(fragment, word, line) {
var args = line.trim().split(' ')
.filter(function (a) {
return a !== '';
}).map(function (c) {
return c.trim();
});
var currentCommand;
var arg;
var index;
var parentCategory;
var currentCategory;
// start from 1, so to discard "azure" word
for (index = 1, currentCategory = root; index < args.length; index++) {
arg = args[index];
parentCategory = currentCategory;
currentCategory = currentCategory.categories[arg];
if (!currentCategory) {
break;
}
}
var tempCategory = currentCategory ? currentCategory : parentCategory;
var allSubCategoriesAndCommands = Object.keys(tempCategory.categories)
.concat(tempCategory.commands.map(function (c) { return c.name; }));
currentCommand = tempCategory.commands
.filter(function (c) {return c.name === arg;})[0];
//run out argument while have a valid category?
if (currentCategory) {
//return sub categories and command combind
return this.reply(allSubCategoriesAndCommands);
}
var allCommandOptions;
if (currentCommand) {
allCommandOptions = currentCommand.options.map(function (o) { return o.long; })
.concat(currentCommand.options.map(function (o) { return o.short; }));
}
//we are at the last arg, try match both categories and commands
if (index === args.length - 1) {
if (currentCommand) {
return this.reply(allCommandOptions);
} else {
return this.reply(allSubCategoriesAndCommands.filter(function (c) {
return utilsCore.stringStartsWith(c, arg);
}));
}
}
// try to match a command's options
var lastArg = args[args.length - 1];
if (currentCommand && utilsCore.stringStartsWith(lastArg, '-')) {
var option = currentCommand.options
.filter(function (c) {
return c.fileRelatedOption && (c.short === lastArg || c.long === lastArg);
})[0];
if (option) {
return this.reply(fs.readdirSync(process.cwd()));
} else {
return this.reply(
allCommandOptions.filter(function (c) { return c && utilsCore.stringStartsWith(c, lastArg);}));
}
}
return this.reply([]);
}
root.autoComplete.on('complete', handleAutocomplete);
root.autoComplete.init();
}
});
module.exports = AutoComplete;