2016-10-14 22:56:02 +00:00
|
|
|
import * as q from 'q'
|
2016-06-10 00:27:04 +00:00
|
|
|
|
2016-10-14 22:56:02 +00:00
|
|
|
import * as plugins from './smartcli.plugins'
|
|
|
|
import * as interaction from './smartcli.classes.interaction'
|
2016-08-26 09:52:09 +00:00
|
|
|
|
|
|
|
// import classes
|
2016-10-14 22:56:02 +00:00
|
|
|
import {Objectmap} from 'lik'
|
2016-08-26 09:52:09 +00:00
|
|
|
|
|
|
|
// interfaces
|
2016-10-14 22:56:02 +00:00
|
|
|
export interface ICommandPromiseObject {
|
|
|
|
commandName: string
|
|
|
|
promise: q.Promise<any>
|
|
|
|
}
|
2016-06-10 01:10:21 +00:00
|
|
|
|
2016-06-10 00:27:04 +00:00
|
|
|
export class Smartcli {
|
2016-10-14 22:56:02 +00:00
|
|
|
argv: any
|
|
|
|
questionsDone
|
|
|
|
parseStarted
|
|
|
|
commands
|
|
|
|
questions
|
|
|
|
version: string
|
2016-08-26 09:52:09 +00:00
|
|
|
|
|
|
|
// maps
|
2016-10-14 22:56:02 +00:00
|
|
|
allCommandPromises = new Objectmap<ICommandPromiseObject>()
|
|
|
|
constructor() {
|
|
|
|
this.argv = plugins.yargs
|
|
|
|
this.questionsDone = q.defer()
|
|
|
|
this.parseStarted = q.defer()
|
|
|
|
}
|
2016-08-26 07:21:42 +00:00
|
|
|
|
|
|
|
/**
|
|
|
|
* adds an alias, meaning one equals the other in terms of triggering associated commands
|
|
|
|
*/
|
2016-10-14 22:56:02 +00:00
|
|
|
addAlias(keyArg,aliasArg): void {
|
|
|
|
this.argv = this.argv.alias(keyArg,aliasArg)
|
|
|
|
return
|
|
|
|
}
|
2016-08-26 07:21:42 +00:00
|
|
|
|
|
|
|
/**
|
|
|
|
* adds a Command by returning a Promise that reacts to the specific commandString given.
|
|
|
|
* Note: in e.g. "npm install something" the "install" is considered the command.
|
|
|
|
*/
|
2016-10-14 22:56:02 +00:00
|
|
|
addCommand(definitionArg: {commandName: string}): q.Promise<any> {
|
|
|
|
let done = q.defer<any>()
|
2016-06-10 02:13:23 +00:00
|
|
|
this.parseStarted.promise
|
2016-06-10 01:48:01 +00:00
|
|
|
.then(() => {
|
2016-10-14 22:56:02 +00:00
|
|
|
if (this.argv._.indexOf(definitionArg.commandName) === 0) {
|
|
|
|
done.resolve(this.argv)
|
2016-06-10 01:48:01 +00:00
|
|
|
} else {
|
2016-10-14 22:56:02 +00:00
|
|
|
done.reject(this.argv)
|
2016-06-10 01:48:01 +00:00
|
|
|
}
|
2016-10-14 22:56:02 +00:00
|
|
|
})
|
|
|
|
return done.promise
|
|
|
|
}
|
2016-08-26 07:21:42 +00:00
|
|
|
|
|
|
|
/**
|
|
|
|
* gets a Promise for a command word
|
|
|
|
*/
|
2016-10-14 22:56:02 +00:00
|
|
|
getCommandPromiseByName(commandNameArg: string) {
|
2016-08-26 09:52:09 +00:00
|
|
|
return this.allCommandPromises.find(commandPromiseObjectArg => {
|
2016-10-14 22:56:02 +00:00
|
|
|
return commandPromiseObjectArg.commandName === commandNameArg
|
|
|
|
}).promise
|
|
|
|
}
|
2016-06-13 10:57:24 +00:00
|
|
|
|
2016-08-26 09:52:09 +00:00
|
|
|
/**
|
|
|
|
* allows to specify help text to be printed above the rest of the help text
|
|
|
|
*/
|
2016-10-14 22:56:02 +00:00
|
|
|
addHelp(optionsArg: {
|
|
|
|
helpText: string
|
|
|
|
}) {
|
2016-08-26 09:52:09 +00:00
|
|
|
this.addCommand({
|
2016-10-14 22:56:02 +00:00
|
|
|
commandName: 'help'
|
2016-08-26 09:52:09 +00:00
|
|
|
}).then(argvArg => {
|
2016-10-14 22:56:02 +00:00
|
|
|
plugins.beautylog.log(optionsArg.helpText)
|
2016-08-26 09:52:09 +00:00
|
|
|
})
|
2016-10-14 22:56:02 +00:00
|
|
|
}
|
2016-08-26 09:52:09 +00:00
|
|
|
|
|
|
|
/**
|
|
|
|
* specify version to be printed for -v --version
|
|
|
|
*/
|
2016-10-14 22:56:02 +00:00
|
|
|
addVersion(versionArg: string) {
|
|
|
|
this.version = versionArg
|
|
|
|
this.addAlias('v','version')
|
2016-06-10 02:13:23 +00:00
|
|
|
this.parseStarted.promise
|
2016-06-10 01:48:01 +00:00
|
|
|
.then(() => {
|
2016-10-14 22:56:02 +00:00
|
|
|
if (this.argv.v) {
|
|
|
|
console.log(this.version)
|
2016-06-10 02:13:23 +00:00
|
|
|
}
|
2016-06-10 01:48:01 +00:00
|
|
|
})
|
2016-10-14 22:56:02 +00:00
|
|
|
}
|
2016-08-26 09:52:09 +00:00
|
|
|
|
|
|
|
/**
|
|
|
|
* returns promise that is resolved when no commands are specified
|
|
|
|
*/
|
2016-10-14 22:56:02 +00:00
|
|
|
standardTask(): q.Promise<any> {
|
|
|
|
let done = q.defer<any>()
|
2016-06-10 02:13:23 +00:00
|
|
|
this.parseStarted.promise
|
2016-06-10 01:48:01 +00:00
|
|
|
.then(() => {
|
2016-10-14 22:56:02 +00:00
|
|
|
if (this.argv._.length === 0 && !this.argv.v) {
|
|
|
|
done.resolve(this.argv)
|
2016-06-10 01:48:01 +00:00
|
|
|
} else {
|
2016-10-14 22:56:02 +00:00
|
|
|
done.reject(this.argv)
|
|
|
|
}
|
|
|
|
})
|
|
|
|
return done.promise
|
2016-06-10 01:10:21 +00:00
|
|
|
}
|
2016-09-04 15:32:12 +00:00
|
|
|
|
|
|
|
/**
|
|
|
|
* start the process of evaluating commands
|
|
|
|
*/
|
2016-10-14 22:56:02 +00:00
|
|
|
startParse(): void {
|
|
|
|
this.argv = this.argv.argv
|
|
|
|
this.parseStarted.resolve()
|
|
|
|
return
|
2016-06-10 01:10:21 +00:00
|
|
|
}
|
|
|
|
|
2016-10-14 22:56:02 +00:00
|
|
|
}
|