start smarter CLI logic
This commit is contained in:
parent
d6cbefce2c
commit
5611ad03aa
14
README.md
14
README.md
@ -10,6 +10,20 @@ nodejs wrapper for CLI related tasks
|
||||
npm install smartcli
|
||||
|
||||
### Usage
|
||||
|
||||
this plugin tries to establish some logic in which CLI tools work.
|
||||
|
||||
take the following commandline input:
|
||||
|
||||
```
|
||||
mytool function argument1 argument2 --option1 option1Value --option2 option2Value
|
||||
```
|
||||
|
||||
* 'mytool' obviously is the tool (like git)
|
||||
* function is the main thing the tool shall do (like commit)
|
||||
* option is an option you can add (like -m for message)
|
||||
* optionValue is the referenced option value (like a commit message)
|
||||
|
||||
```js
|
||||
var smartcli = require("smartcli");
|
||||
|
||||
|
@ -26,10 +26,11 @@
|
||||
},
|
||||
"homepage": "https://github.com/pushrocks/smartcli",
|
||||
"dependencies": {
|
||||
"beautylog": "0.0.15",
|
||||
"beautylog": "1.0.2",
|
||||
"cliff": "^0.1.10",
|
||||
"inquirer": "^0.10.1",
|
||||
"yargs": "^3.26.0"
|
||||
"inquirer": "^0.11.0",
|
||||
"smartparam": "0.0.5",
|
||||
"yargs": "^3.29.0"
|
||||
},
|
||||
"devDependencies": {
|
||||
"gulp": "3.9.0",
|
||||
|
73
ts/index.ts
73
ts/index.ts
@ -1,76 +1,29 @@
|
||||
/// <reference path="typings/tsd.d.ts" />
|
||||
/// <reference path="./interfaces.ts" />
|
||||
/// <reference path="./smartcli.plugins.ts" />
|
||||
/// <reference path="./smartcli.interfaces.ts" />
|
||||
/// <reference path="./smartcli.checks.ts" />
|
||||
/// <reference path="./smartcli.getters.ts" />
|
||||
|
||||
var path = require("path");
|
||||
var beautylog = require("beautylog");
|
||||
var cliff = require("cliff");
|
||||
var inquirer = require("inquirer");
|
||||
var argv = require('yargs').argv;
|
||||
var plugins = smartcliPlugins.init(); //get all the required npm modules under plugins
|
||||
|
||||
//define the smartcli object
|
||||
var smartcli:any = {};
|
||||
|
||||
//add plugins from above for direct use
|
||||
smartcli.inquirer = inquirer;
|
||||
smartcli.cliff = cliff;
|
||||
smartcli.argv = argv;
|
||||
smartcli.inquirer = plugins.inquirer; //inquirer is for asking questions
|
||||
smartcli.cliff = plugins.cliff; // formats cli output
|
||||
smartcli.argv = plugins.argv; //argv gets initial cli commands and options.
|
||||
|
||||
/* ------------------------------------------------------------------------------
|
||||
*----------------------- initial call CLI args -----------------------------
|
||||
*----------------------------------------------------------------------------- */
|
||||
//init checks. Checks return boolean. That means they can be used as question with an answer of yes or no.
|
||||
|
||||
// commands
|
||||
smartcliChecks.init(); // is defined in smartcli.checks.ts
|
||||
|
||||
|
||||
smartcli.checkCommand = function(commandString:string):boolean {
|
||||
if (argv._.indexOf(commandString) != -1) {
|
||||
return true
|
||||
}
|
||||
return false;
|
||||
};
|
||||
|
||||
smartcli.getCommands = function ():string[] {
|
||||
return argv._;
|
||||
};
|
||||
|
||||
|
||||
// options
|
||||
smartcli.getOption = function(optionName:string):CliOption {
|
||||
if (argv.hasOwnProperty(optionName)) {
|
||||
return {
|
||||
name:optionName,
|
||||
specified: true,
|
||||
value: argv[optionName] //we already know from the "if" above that the value is available.
|
||||
};
|
||||
|
||||
}
|
||||
return {
|
||||
name:optionName,
|
||||
specified: false,
|
||||
value: false
|
||||
}
|
||||
};
|
||||
|
||||
|
||||
smartcli.getOptions = function() {
|
||||
var options = {};
|
||||
for (var key in argv) {
|
||||
if (key != "_") {
|
||||
options['key'] = argv['key'];
|
||||
}
|
||||
}
|
||||
return options;
|
||||
};
|
||||
|
||||
/**
|
||||
* returns Directory of cwd
|
||||
* @returns {{path: string}}
|
||||
*/
|
||||
smartcli.getCwd = function():Directory {
|
||||
return {
|
||||
path: process.cwd()
|
||||
}
|
||||
};
|
||||
|
||||
|
||||
|
||||
@ -88,7 +41,7 @@ smartcli.getCwd = function():Directory {
|
||||
*/
|
||||
smartcli.getAnswer = function(questionString:string, cb) {
|
||||
if (typeof questionString != 'string') {
|
||||
beautylog.error('no question specified');
|
||||
plugins.beautylog.error('no question specified');
|
||||
return null;
|
||||
}
|
||||
//make inquirer compatible question object
|
||||
@ -101,7 +54,7 @@ smartcli.getAnswer = function(questionString:string, cb) {
|
||||
}
|
||||
};
|
||||
|
||||
inquirer.prompt([question],function(answers){
|
||||
plugins.inquirer.prompt([question],function(answers){
|
||||
var answer = answers.userFeedback;
|
||||
cb(answer);
|
||||
});
|
||||
@ -128,7 +81,7 @@ smartcli.getChoice = function(questionString:string, choiceOptions:string[], cb)
|
||||
filter: function( val ) { return val.toLowerCase(); }
|
||||
};
|
||||
|
||||
inquirer.prompt(question,function(answers){
|
||||
plugins.inquirer.prompt(question,function(answers){
|
||||
var answer = answers.userFeedback;
|
||||
cb(answer);
|
||||
});
|
||||
|
@ -1,11 +0,0 @@
|
||||
/// <reference path="index.ts" />
|
||||
interface CliOption {
|
||||
name: string;
|
||||
specified:boolean;
|
||||
value: any;
|
||||
}
|
||||
|
||||
interface Directory {
|
||||
path: string;
|
||||
}
|
||||
|
52
ts/smartcli.checks.ts
Normal file
52
ts/smartcli.checks.ts
Normal file
@ -0,0 +1,52 @@
|
||||
/// <reference path="./index.ts" />
|
||||
module smartcliChecks {
|
||||
export function init() {
|
||||
/**
|
||||
* checks for a special command string and returns true if found.
|
||||
* @param commandString
|
||||
* @returns {boolean}
|
||||
*/
|
||||
smartcli.checkCommand = function(commandString:string):boolean {
|
||||
if (plugins.argv._.indexOf(commandString) == 0) {
|
||||
return true
|
||||
}
|
||||
return false;
|
||||
};
|
||||
|
||||
smartcli.checkCommandArgument = function(level:number):boolean {
|
||||
if(plugins.argv._.length == (level + 1)) {
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
};
|
||||
|
||||
/**
|
||||
* checks if a command is present, returns true if yes, false if no.
|
||||
* @returns {boolean}
|
||||
*/
|
||||
smartcli.checkCommandPresence = function():boolean {
|
||||
if(plugins.argv._.length < 0){
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
/**
|
||||
* checks for a specific option string, returns true if yes, returns false if no
|
||||
* @returns {boolean}
|
||||
*/
|
||||
smartcli.checkOption = function(optionString):boolean {
|
||||
if(plugins.smartparam.exists(plugins.argv, optionString)) {
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
};
|
||||
|
||||
smartcli.checkOptionsPresence = function():boolean {
|
||||
if (plugins.argv.indexOf() != -1) {
|
||||
return true
|
||||
}
|
||||
return false;
|
||||
};
|
||||
}
|
||||
}
|
67
ts/smartcli.getters.ts
Normal file
67
ts/smartcli.getters.ts
Normal file
@ -0,0 +1,67 @@
|
||||
/// <reference path="./index.ts" />
|
||||
module smartcliGetters {
|
||||
export function init() {
|
||||
smartcli.getCommand = function(commandString):CliCommand {
|
||||
var cliCommand = {
|
||||
specified: smartcli.checkCommand(commandString),
|
||||
name: commandString,
|
||||
arguments: smartcli.getCommandArgument(1)
|
||||
}
|
||||
return cliCommand;
|
||||
};
|
||||
|
||||
smartcli.getCommandArgument = function(argumentLevel):CommandArgument {
|
||||
var commandArgument = {
|
||||
specified
|
||||
};
|
||||
return commandArgument;
|
||||
};
|
||||
|
||||
/**
|
||||
* returns complete command object
|
||||
* @returns {any}
|
||||
*/
|
||||
smartcli.getCommands = function ():string[] {
|
||||
return plugins.argv._;
|
||||
};
|
||||
|
||||
|
||||
// options
|
||||
smartcli.getOption = function(optionName:string):CliOption {
|
||||
if (plugins.argv.hasOwnProperty(optionName)) {
|
||||
return {
|
||||
name:optionName,
|
||||
specified: true,
|
||||
value: plugins.argv[optionName] //we already know from the "if" above that the value is available.
|
||||
};
|
||||
|
||||
}
|
||||
return {
|
||||
name:optionName,
|
||||
specified: false,
|
||||
value: false
|
||||
}
|
||||
};
|
||||
|
||||
|
||||
smartcli.getOptions = function() {
|
||||
var options = {};
|
||||
for (var key in plugins.argv) {
|
||||
if (key != "_") {
|
||||
options['key'] = plugins.argv['key'];
|
||||
}
|
||||
}
|
||||
return options;
|
||||
};
|
||||
|
||||
/**
|
||||
* returns Directory of cwd
|
||||
* @returns {{path: string}}
|
||||
*/
|
||||
smartcli.getCwd = function():Directory {
|
||||
return {
|
||||
path: process.cwd()
|
||||
}
|
||||
};
|
||||
}
|
||||
}
|
24
ts/smartcli.interfaces.ts
Normal file
24
ts/smartcli.interfaces.ts
Normal file
@ -0,0 +1,24 @@
|
||||
/// <reference path="index.ts" />
|
||||
interface CliOption {
|
||||
name: string;
|
||||
specified:boolean;
|
||||
value: any;
|
||||
}
|
||||
|
||||
interface Directory {
|
||||
path: string;
|
||||
}
|
||||
|
||||
interface CliCommand {
|
||||
specified: boolean;
|
||||
name: string;
|
||||
second: string;
|
||||
third: string;
|
||||
fourth: string;
|
||||
}
|
||||
|
||||
interface CliCommandArgument {
|
||||
specified:boolean;
|
||||
name:string;
|
||||
}
|
||||
|
14
ts/smartcli.plugins.ts
Normal file
14
ts/smartcli.plugins.ts
Normal file
@ -0,0 +1,14 @@
|
||||
/// <reference path="./index.ts" />
|
||||
|
||||
module smartcliPlugins {
|
||||
var plugins:any = {};
|
||||
export function init() {
|
||||
plugins.path = require("path");
|
||||
plugins.beautylog = require("beautylog")("os");
|
||||
plugins.cliff = require("cliff");
|
||||
plugins.inquirer = require("inquirer");
|
||||
plugins.smartparam = require("smartparam");
|
||||
plugins.argv = require('yargs').argv;
|
||||
return plugins;
|
||||
}
|
||||
}
|
Loading…
Reference in New Issue
Block a user