Compare commits
31 Commits
Author | SHA1 | Date | |
---|---|---|---|
adfda70522 | |||
c701e3e04c | |||
7b1de5b31d | |||
7908fd8cfd | |||
21bd0c9279 | |||
9d1108e40d | |||
390e0cb491 | |||
032fd0c2fd | |||
440881c3d8 | |||
f208121e2c | |||
7c4ae84871 | |||
668f6c3e16 | |||
b1e08aad1f | |||
f1ab614cdf | |||
995c808512 | |||
28acb867a0 | |||
3148a50d43 | |||
41c99de4d8 | |||
a91f56dacf | |||
f60f17f91e | |||
d154cf0d0f | |||
a6e0fa65e0 | |||
c7e940f597 | |||
45d3ce8ffc | |||
ce121b8b7f | |||
ce65b8d7c9 | |||
9acdfca460 | |||
59bcd8dadf | |||
b6375fd8fa | |||
8183417c90 | |||
5e66d35125 |
1
.gitignore
vendored
1
.gitignore
vendored
@ -1,3 +1,4 @@
|
||||
node_modules/
|
||||
coverage/
|
||||
public/
|
||||
.yarn/
|
||||
|
106
.gitlab-ci.yml
106
.gitlab-ci.yml
@ -3,69 +3,139 @@ image: hosttoday/ht-docker-node:npmci
|
||||
|
||||
cache:
|
||||
paths:
|
||||
- .yarn/
|
||||
- .npmci_cache/
|
||||
key: "$CI_BUILD_STAGE"
|
||||
|
||||
stages:
|
||||
- security
|
||||
- test
|
||||
- release
|
||||
- trigger
|
||||
- pages
|
||||
- metadata
|
||||
|
||||
# ====================
|
||||
# security stage
|
||||
# ====================
|
||||
mirror:
|
||||
stage: security
|
||||
script:
|
||||
- npmci git mirror
|
||||
tags:
|
||||
- docker
|
||||
- notpriv
|
||||
|
||||
snyk:
|
||||
stage: security
|
||||
script:
|
||||
- npmci command npm install -g snyk
|
||||
- npmci command npm install --ignore-scripts
|
||||
- npmci command snyk test
|
||||
tags:
|
||||
- docker
|
||||
- notpriv
|
||||
|
||||
# ====================
|
||||
# test stage
|
||||
# ====================
|
||||
testLEGACY:
|
||||
stage: test
|
||||
script:
|
||||
- npmci test legacy
|
||||
- npmci node install legacy
|
||||
- npmci npm install
|
||||
- npmci npm test
|
||||
coverage: /\d+.?\d+?\%\s*coverage/
|
||||
tags:
|
||||
- docker
|
||||
- docker
|
||||
- notpriv
|
||||
allow_failure: true
|
||||
|
||||
testLTS:
|
||||
stage: test
|
||||
script:
|
||||
- npmci test lts
|
||||
- npmci node install lts
|
||||
- npmci npm install
|
||||
- npmci npm test
|
||||
coverage: /\d+.?\d+?\%\s*coverage/
|
||||
tags:
|
||||
- docker
|
||||
- docker
|
||||
- notpriv
|
||||
|
||||
testSTABLE:
|
||||
stage: test
|
||||
script:
|
||||
- npmci test stable
|
||||
- npmci node install stable
|
||||
- npmci npm install
|
||||
- npmci npm test
|
||||
coverage: /\d+.?\d+?\%\s*coverage/
|
||||
tags:
|
||||
- docker
|
||||
- docker
|
||||
- notpriv
|
||||
|
||||
release:
|
||||
stage: release
|
||||
script:
|
||||
- npmci publish
|
||||
- npmci node install stable
|
||||
- npmci npm publish
|
||||
only:
|
||||
- tags
|
||||
- tags
|
||||
tags:
|
||||
- docker
|
||||
- docker
|
||||
- notpriv
|
||||
|
||||
# ====================
|
||||
# metadata stage
|
||||
# ====================
|
||||
codequality:
|
||||
stage: metadata
|
||||
image: docker:stable
|
||||
allow_failure: true
|
||||
services:
|
||||
- docker:stable-dind
|
||||
script:
|
||||
- export SP_VERSION=$(echo "$CI_SERVER_VERSION" | sed 's/^\([0-9]*\)\.\([0-9]*\).*/\1-\2-stable/')
|
||||
- docker run
|
||||
--env SOURCE_CODE="$PWD"
|
||||
--volume "$PWD":/code
|
||||
--volume /var/run/docker.sock:/var/run/docker.sock
|
||||
"registry.gitlab.com/gitlab-org/security-products/codequality:$SP_VERSION" /code
|
||||
artifacts:
|
||||
paths: [codeclimate.json]
|
||||
tags:
|
||||
- docker
|
||||
- priv
|
||||
|
||||
trigger:
|
||||
stage: trigger
|
||||
stage: metadata
|
||||
script:
|
||||
- npmci trigger
|
||||
- npmci trigger
|
||||
only:
|
||||
- tags
|
||||
- tags
|
||||
tags:
|
||||
- docker
|
||||
- docker
|
||||
- notpriv
|
||||
|
||||
pages:
|
||||
image: hosttoday/ht-docker-node:npmci
|
||||
stage: pages
|
||||
stage: metadata
|
||||
script:
|
||||
- npmci command yarn global add npmpage
|
||||
- npmci command npm install -g npmpage
|
||||
- npmci command npmpage
|
||||
tags:
|
||||
- docker
|
||||
- notpriv
|
||||
only:
|
||||
- tags
|
||||
artifacts:
|
||||
expire_in: 1 week
|
||||
paths:
|
||||
- public
|
||||
allow_failure: true
|
||||
|
||||
windowsCompatibility:
|
||||
image: stefanscherer/node-windows:10-build-tools
|
||||
stage: metadata
|
||||
script:
|
||||
- npm install & npm test
|
||||
coverage: /\d+.?\d+?\%\s*coverage/
|
||||
tags:
|
||||
- windows
|
||||
allow_failure: true
|
||||
|
@ -1,13 +1,16 @@
|
||||
# smartcli
|
||||
|
||||
nodejs wrapper for CLI related tasks
|
||||
|
||||
## Availabililty
|
||||
|
||||
[](https://www.npmjs.com/package/smartcli)
|
||||
[](https://GitLab.com/pushrocks/smartcli)
|
||||
[](https://github.com/pushrocks/smartcli)
|
||||
[](https://pushrocks.gitlab.io/smartcli/)
|
||||
|
||||
## Status for master
|
||||
|
||||
[](https://GitLab.com/pushrocks/smartcli/commits/master)
|
||||
[](https://GitLab.com/pushrocks/smartcli/commits/master)
|
||||
[](https://www.npmjs.com/package/smartcli)
|
||||
@ -21,6 +24,6 @@ nodejs wrapper for CLI related tasks
|
||||
For further information read the linked docs at the top of this README.
|
||||
|
||||
> MIT licensed | **©** [Lossless GmbH](https://lossless.gmbh)
|
||||
| By using this npm module you agree to our [privacy policy](https://lossless.gmbH/privacy.html)
|
||||
> | By using this npm module you agree to our [privacy policy](https://lossless.gmbH/privacy.html)
|
||||
|
||||
[](https://)
|
||||
|
2
dist/index.js
vendored
2
dist/index.js
vendored
@ -2,4 +2,4 @@
|
||||
Object.defineProperty(exports, "__esModule", { value: true });
|
||||
var smartcli_classes_smartcli_1 = require("./smartcli.classes.smartcli");
|
||||
exports.Smartcli = smartcli_classes_smartcli_1.Smartcli;
|
||||
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi90cy9pbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOztBQUFBLHlFQUFzRDtBQUE3QywrQ0FBQSxRQUFRLENBQUEifQ==
|
||||
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi90cy9pbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOztBQUFBLHlFQUF1RDtBQUE5QywrQ0FBQSxRQUFRLENBQUEifQ==
|
33
dist/smartcli.classes.smartcli.d.ts
vendored
33
dist/smartcli.classes.smartcli.d.ts
vendored
@ -1,5 +1,6 @@
|
||||
import * as smartq from 'smartq';
|
||||
import { Subject } from 'rxjs';
|
||||
import { Objectmap } from 'lik';
|
||||
import * as plugins from './smartcli.plugins';
|
||||
export interface ICommandPromiseObject {
|
||||
commandName: string;
|
||||
promise: Promise<void>;
|
||||
@ -8,22 +9,29 @@ export interface ITriggerObservableObject {
|
||||
triggerName: string;
|
||||
subject: Subject<any>;
|
||||
}
|
||||
/**
|
||||
* class to create a new instance of Smartcli. Handles parsing of command line arguments.
|
||||
*/
|
||||
export declare class Smartcli {
|
||||
argv: any;
|
||||
questionsDone: any;
|
||||
parseStarted: any;
|
||||
parseStarted: smartq.Deferred<any>;
|
||||
commands: any;
|
||||
questions: any;
|
||||
version: string;
|
||||
/**
|
||||
* map of all Command/Promise objects to keep track
|
||||
*/
|
||||
allCommandPromisesMap: Objectmap<ICommandPromiseObject>;
|
||||
private onlyOnProcessEnvCliCall;
|
||||
/**
|
||||
* map of all Trigger/Observable objects to keep track
|
||||
*/
|
||||
allTriggerObservablesMap: Objectmap<ITriggerObservableObject>;
|
||||
allTriggerObservablesMap: plugins.lik.Objectmap<ITriggerObservableObject>;
|
||||
/**
|
||||
* The constructor of Smartcli
|
||||
*/
|
||||
constructor();
|
||||
/**
|
||||
* halts any execution of commands if (process.env.CLI_CALL === false)
|
||||
*/
|
||||
onlyTriggerOnProcessEnvCliCall(): void;
|
||||
/**
|
||||
* adds an alias, meaning one equals the other in terms of command execution.
|
||||
*/
|
||||
@ -32,11 +40,7 @@ export declare class Smartcli {
|
||||
* 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.
|
||||
*/
|
||||
addCommand(commandNameArg: string): Promise<any>;
|
||||
/**
|
||||
* gets a Promise for a command word
|
||||
*/
|
||||
getCommandPromiseByName(commandNameArg: string): Promise<void>;
|
||||
addCommand(commandNameArg: string): Subject<any>;
|
||||
/**
|
||||
* adds a Trigger. Like addCommand(), but returns an subscribable observable
|
||||
*/
|
||||
@ -46,6 +50,7 @@ export declare class Smartcli {
|
||||
* @param commandNameArg - the name of the command to trigger
|
||||
*/
|
||||
trigger(triggerName: string): Subject<any>;
|
||||
getTriggerSubject(triggerName: string): Subject<any>;
|
||||
/**
|
||||
* allows to specify help text to be printed above the rest of the help text
|
||||
*/
|
||||
@ -57,9 +62,9 @@ export declare class Smartcli {
|
||||
*/
|
||||
addVersion(versionArg: string): void;
|
||||
/**
|
||||
* returns promise that is resolved when no commands are specified
|
||||
* adds a trigger that is called when no command is specified
|
||||
*/
|
||||
standardTask(): Promise<any>;
|
||||
standardTask(): Subject<any>;
|
||||
/**
|
||||
* start the process of evaluating commands
|
||||
*/
|
||||
|
107
dist/smartcli.classes.smartcli.js
vendored
107
dist/smartcli.classes.smartcli.js
vendored
@ -5,12 +5,15 @@ const rxjs_1 = require("rxjs");
|
||||
const plugins = require("./smartcli.plugins");
|
||||
// import classes
|
||||
const lik_1 = require("lik");
|
||||
/**
|
||||
* class to create a new instance of Smartcli. Handles parsing of command line arguments.
|
||||
*/
|
||||
class Smartcli {
|
||||
/**
|
||||
* The constructor of Smartcli
|
||||
*/
|
||||
constructor() {
|
||||
/**
|
||||
* map of all Command/Promise objects to keep track
|
||||
*/
|
||||
this.allCommandPromisesMap = new lik_1.Objectmap();
|
||||
this.onlyOnProcessEnvCliCall = false;
|
||||
/**
|
||||
* map of all Trigger/Observable objects to keep track
|
||||
*/
|
||||
@ -19,6 +22,12 @@ class Smartcli {
|
||||
this.questionsDone = smartq.defer();
|
||||
this.parseStarted = smartq.defer();
|
||||
}
|
||||
/**
|
||||
* halts any execution of commands if (process.env.CLI_CALL === false)
|
||||
*/
|
||||
onlyTriggerOnProcessEnvCliCall() {
|
||||
this.onlyOnProcessEnvCliCall = true;
|
||||
}
|
||||
/**
|
||||
* adds an alias, meaning one equals the other in terms of command execution.
|
||||
*/
|
||||
@ -31,42 +40,28 @@ class Smartcli {
|
||||
* Note: in e.g. "npm install something" the "install" is considered the command.
|
||||
*/
|
||||
addCommand(commandNameArg) {
|
||||
let done = smartq.defer();
|
||||
this.allCommandPromisesMap.add({
|
||||
commandName: commandNameArg,
|
||||
promise: done.promise
|
||||
});
|
||||
this.parseStarted.promise
|
||||
.then(() => {
|
||||
let triggerSubject = this.addTrigger(commandNameArg);
|
||||
this.parseStarted.promise.then(() => {
|
||||
if (this.argv._.indexOf(commandNameArg) === 0) {
|
||||
done.resolve(this.argv);
|
||||
}
|
||||
else {
|
||||
done.reject(this.argv);
|
||||
this.trigger(commandNameArg);
|
||||
}
|
||||
});
|
||||
return done.promise;
|
||||
}
|
||||
/**
|
||||
* gets a Promise for a command word
|
||||
*/
|
||||
getCommandPromiseByName(commandNameArg) {
|
||||
return this.allCommandPromisesMap.find(commandDeferredObjectArg => {
|
||||
return commandDeferredObjectArg.commandName === commandNameArg;
|
||||
}).promise;
|
||||
return triggerSubject;
|
||||
}
|
||||
/**
|
||||
* adds a Trigger. Like addCommand(), but returns an subscribable observable
|
||||
*/
|
||||
addTrigger(triggerNameArg) {
|
||||
let triggerSubject = new rxjs_1.Subject();
|
||||
this.allTriggerObservablesMap.add({
|
||||
triggerName: triggerNameArg,
|
||||
subject: triggerSubject
|
||||
});
|
||||
this.addCommand(triggerNameArg).then(() => {
|
||||
triggerSubject.next(this.argv);
|
||||
});
|
||||
if (!this.getTriggerSubject(triggerNameArg)) {
|
||||
this.allTriggerObservablesMap.add({
|
||||
triggerName: triggerNameArg,
|
||||
subject: triggerSubject
|
||||
});
|
||||
}
|
||||
else {
|
||||
throw new Error(`you can't add a trigger twice`);
|
||||
}
|
||||
return triggerSubject;
|
||||
}
|
||||
/**
|
||||
@ -74,17 +69,26 @@ class Smartcli {
|
||||
* @param commandNameArg - the name of the command to trigger
|
||||
*/
|
||||
trigger(triggerName) {
|
||||
let triggerSubject = this.allTriggerObservablesMap.find(triggerObservableObjectArg => {
|
||||
return triggerObservableObjectArg.triggerName === triggerName;
|
||||
}).subject;
|
||||
let triggerSubject = this.getTriggerSubject(triggerName);
|
||||
triggerSubject.next(this.argv);
|
||||
return triggerSubject;
|
||||
}
|
||||
getTriggerSubject(triggerName) {
|
||||
const triggerObservableObject = this.allTriggerObservablesMap.find(triggerObservableObjectArg => {
|
||||
return triggerObservableObjectArg.triggerName === triggerName;
|
||||
});
|
||||
if (triggerObservableObject) {
|
||||
return triggerObservableObject.subject;
|
||||
}
|
||||
else {
|
||||
return null;
|
||||
}
|
||||
}
|
||||
/**
|
||||
* allows to specify help text to be printed above the rest of the help text
|
||||
*/
|
||||
addHelp(optionsArg) {
|
||||
this.addCommand('help').then(argvArg => {
|
||||
this.addCommand('help').subscribe(argvArg => {
|
||||
plugins.beautylog.log(optionsArg.helpText);
|
||||
});
|
||||
}
|
||||
@ -94,32 +98,33 @@ class Smartcli {
|
||||
addVersion(versionArg) {
|
||||
this.version = versionArg;
|
||||
this.addCommandAlias('v', 'version');
|
||||
this.parseStarted.promise
|
||||
.then(() => {
|
||||
this.parseStarted.promise.then(() => {
|
||||
if (this.argv.v) {
|
||||
console.log(this.version);
|
||||
}
|
||||
});
|
||||
}
|
||||
/**
|
||||
* returns promise that is resolved when no commands are specified
|
||||
* adds a trigger that is called when no command is specified
|
||||
*/
|
||||
standardTask() {
|
||||
let done = smartq.defer();
|
||||
this.allCommandPromisesMap.add({
|
||||
commandName: 'standard',
|
||||
promise: done.promise
|
||||
});
|
||||
this.parseStarted.promise
|
||||
.then(() => {
|
||||
let standardSubject = this.addTrigger('standardTask');
|
||||
this.parseStarted.promise.then(() => {
|
||||
if (this.argv._.length === 0 && !this.argv.v) {
|
||||
done.resolve(this.argv);
|
||||
}
|
||||
else {
|
||||
done.reject(this.argv);
|
||||
if (this.onlyOnProcessEnvCliCall) {
|
||||
if (process.env.CLI_CALL === 'true') {
|
||||
this.trigger('standardTask');
|
||||
}
|
||||
else {
|
||||
return;
|
||||
}
|
||||
}
|
||||
else {
|
||||
this.trigger('standardTask');
|
||||
}
|
||||
}
|
||||
});
|
||||
return done.promise;
|
||||
return standardSubject;
|
||||
}
|
||||
/**
|
||||
* start the process of evaluating commands
|
||||
@ -131,4 +136,4 @@ class Smartcli {
|
||||
}
|
||||
}
|
||||
exports.Smartcli = Smartcli;
|
||||
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic21hcnRjbGkuY2xhc3Nlcy5zbWFydGNsaS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3RzL3NtYXJ0Y2xpLmNsYXNzZXMuc21hcnRjbGkudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7QUFBQSxpQ0FBZ0M7QUFDaEMsK0JBQThCO0FBRTlCLDhDQUE2QztBQUU3QyxpQkFBaUI7QUFDakIsNkJBQStCO0FBYS9CO0lBa0JFO1FBVkE7O1dBRUc7UUFDSCwwQkFBcUIsR0FBRyxJQUFJLGVBQVMsRUFBeUIsQ0FBQTtRQUU5RDs7V0FFRztRQUNILDZCQUF3QixHQUFHLElBQUksZUFBUyxFQUE0QixDQUFBO1FBR2xFLElBQUksQ0FBQyxJQUFJLEdBQUcsT0FBTyxDQUFDLEtBQUssQ0FBQTtRQUN6QixJQUFJLENBQUMsYUFBYSxHQUFHLE1BQU0sQ0FBQyxLQUFLLEVBQUUsQ0FBQTtRQUNuQyxJQUFJLENBQUMsWUFBWSxHQUFHLE1BQU0sQ0FBQyxLQUFLLEVBQUUsQ0FBQTtJQUNwQyxDQUFDO0lBRUQ7O09BRUc7SUFDSCxlQUFlLENBQUMsTUFBTSxFQUFFLFFBQVE7UUFDOUIsSUFBSSxDQUFDLElBQUksR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxNQUFNLEVBQUUsUUFBUSxDQUFDLENBQUE7UUFDN0MsTUFBTSxDQUFBO0lBQ1IsQ0FBQztJQUVEOzs7T0FHRztJQUNILFVBQVUsQ0FBQyxjQUFzQjtRQUMvQixJQUFJLElBQUksR0FBRyxNQUFNLENBQUMsS0FBSyxFQUFPLENBQUE7UUFDOUIsSUFBSSxDQUFDLHFCQUFxQixDQUFDLEdBQUcsQ0FBQztZQUM3QixXQUFXLEVBQUUsY0FBYztZQUMzQixPQUFPLEVBQUUsSUFBSSxDQUFDLE9BQU87U0FDdEIsQ0FBQyxDQUFBO1FBQ0YsSUFBSSxDQUFDLFlBQVksQ0FBQyxPQUFPO2FBQ3RCLElBQUksQ0FBQztZQUNKLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxjQUFjLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDO2dCQUM5QyxJQUFJLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQTtZQUN6QixDQUFDO1lBQUMsSUFBSSxDQUFDLENBQUM7Z0JBQ04sSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUE7WUFDeEIsQ0FBQztRQUNILENBQUMsQ0FBQyxDQUFBO1FBQ0osTUFBTSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUE7SUFDckIsQ0FBQztJQUVEOztPQUVHO0lBQ0gsdUJBQXVCLENBQUMsY0FBc0I7UUFDNUMsTUFBTSxDQUFDLElBQUksQ0FBQyxxQkFBcUIsQ0FBQyxJQUFJLENBQUMsd0JBQXdCO1lBQzdELE1BQU0sQ0FBQyx3QkFBd0IsQ0FBQyxXQUFXLEtBQUssY0FBYyxDQUFBO1FBQ2hFLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQTtJQUNaLENBQUM7SUFFRDs7T0FFRztJQUNILFVBQVUsQ0FBQyxjQUFzQjtRQUMvQixJQUFJLGNBQWMsR0FBRyxJQUFJLGNBQU8sRUFBTyxDQUFBO1FBQ3ZDLElBQUksQ0FBQyx3QkFBd0IsQ0FBQyxHQUFHLENBQUM7WUFDaEMsV0FBVyxFQUFFLGNBQWM7WUFDM0IsT0FBTyxFQUFFLGNBQWM7U0FDeEIsQ0FBQyxDQUFBO1FBQ0YsSUFBSSxDQUFDLFVBQVUsQ0FBQyxjQUFjLENBQUMsQ0FBQyxJQUFJLENBQUM7WUFDbkMsY0FBYyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUE7UUFDaEMsQ0FBQyxDQUFDLENBQUE7UUFDRixNQUFNLENBQUMsY0FBYyxDQUFBO0lBQ3ZCLENBQUM7SUFFRDs7O09BR0c7SUFDSCxPQUFPLENBQUMsV0FBbUI7UUFDekIsSUFBSSxjQUFjLEdBQUcsSUFBSSxDQUFDLHdCQUF3QixDQUFDLElBQUksQ0FBQywwQkFBMEI7WUFDaEYsTUFBTSxDQUFDLDBCQUEwQixDQUFDLFdBQVcsS0FBSyxXQUFXLENBQUE7UUFDL0QsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFBO1FBQ1YsY0FBYyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUE7UUFDOUIsTUFBTSxDQUFDLGNBQWMsQ0FBQTtJQUN2QixDQUFDO0lBRUQ7O09BRUc7SUFDSCxPQUFPLENBQUMsVUFFUDtRQUNDLElBQUksQ0FBQyxVQUFVLENBQUMsTUFBTSxDQUFDLENBQUMsSUFBSSxDQUFDLE9BQU87WUFDbEMsT0FBTyxDQUFDLFNBQVMsQ0FBQyxHQUFHLENBQUMsVUFBVSxDQUFDLFFBQVEsQ0FBQyxDQUFBO1FBQzVDLENBQUMsQ0FBQyxDQUFBO0lBQ0osQ0FBQztJQUVEOztPQUVHO0lBQ0gsVUFBVSxDQUFDLFVBQWtCO1FBQzNCLElBQUksQ0FBQyxPQUFPLEdBQUcsVUFBVSxDQUFBO1FBQ3pCLElBQUksQ0FBQyxlQUFlLENBQUMsR0FBRyxFQUFFLFNBQVMsQ0FBQyxDQUFBO1FBQ3BDLElBQUksQ0FBQyxZQUFZLENBQUMsT0FBTzthQUN0QixJQUFJLENBQUM7WUFDSixFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7Z0JBQ2hCLE9BQU8sQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFBO1lBQzNCLENBQUM7UUFDSCxDQUFDLENBQUMsQ0FBQTtJQUNOLENBQUM7SUFFRDs7T0FFRztJQUNILFlBQVk7UUFDVixJQUFJLElBQUksR0FBRyxNQUFNLENBQUMsS0FBSyxFQUFPLENBQUE7UUFDOUIsSUFBSSxDQUFDLHFCQUFxQixDQUFDLEdBQUcsQ0FBQztZQUM3QixXQUFXLEVBQUUsVUFBVTtZQUN2QixPQUFPLEVBQUUsSUFBSSxDQUFDLE9BQU87U0FDdEIsQ0FBQyxDQUFBO1FBQ0YsSUFBSSxDQUFDLFlBQVksQ0FBQyxPQUFPO2FBQ3RCLElBQUksQ0FBQztZQUNKLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLE1BQU0sS0FBSyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7Z0JBQzdDLElBQUksQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFBO1lBQ3pCLENBQUM7WUFBQyxJQUFJLENBQUMsQ0FBQztnQkFDTixJQUFJLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQTtZQUN4QixDQUFDO1FBQ0gsQ0FBQyxDQUFDLENBQUE7UUFDSixNQUFNLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQTtJQUNyQixDQUFDO0lBRUQ7O09BRUc7SUFDSCxVQUFVO1FBQ1IsSUFBSSxDQUFDLElBQUksR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQTtRQUMxQixJQUFJLENBQUMsWUFBWSxDQUFDLE9BQU8sRUFBRSxDQUFBO1FBQzNCLE1BQU0sQ0FBQTtJQUNSLENBQUM7Q0FFRjtBQS9JRCw0QkErSUMifQ==
|
||||
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic21hcnRjbGkuY2xhc3Nlcy5zbWFydGNsaS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3RzL3NtYXJ0Y2xpLmNsYXNzZXMuc21hcnRjbGkudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7QUFBQSxpQ0FBaUM7QUFDakMsK0JBQStCO0FBRS9CLDhDQUE4QztBQUU5QyxpQkFBaUI7QUFDakIsNkJBQWdDO0FBYWhDOztHQUVHO0FBQ0g7SUFjRTs7T0FFRztJQUNIO1FBVlEsNEJBQXVCLEdBQUcsS0FBSyxDQUFDO1FBRXhDOztXQUVHO1FBQ0gsNkJBQXdCLEdBQUcsSUFBSSxlQUFTLEVBQTRCLENBQUM7UUFNbkUsSUFBSSxDQUFDLElBQUksR0FBRyxPQUFPLENBQUMsS0FBSyxDQUFDO1FBQzFCLElBQUksQ0FBQyxhQUFhLEdBQUcsTUFBTSxDQUFDLEtBQUssRUFBRSxDQUFDO1FBQ3BDLElBQUksQ0FBQyxZQUFZLEdBQUcsTUFBTSxDQUFDLEtBQUssRUFBRSxDQUFDO0lBQ3JDLENBQUM7SUFFRDs7T0FFRztJQUNILDhCQUE4QjtRQUM1QixJQUFJLENBQUMsdUJBQXVCLEdBQUcsSUFBSSxDQUFDO0lBQ3RDLENBQUM7SUFFRDs7T0FFRztJQUNILGVBQWUsQ0FBQyxNQUFNLEVBQUUsUUFBUTtRQUM5QixJQUFJLENBQUMsSUFBSSxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLE1BQU0sRUFBRSxRQUFRLENBQUMsQ0FBQztRQUM5QyxPQUFPO0lBQ1QsQ0FBQztJQUVEOzs7T0FHRztJQUNILFVBQVUsQ0FBQyxjQUFzQjtRQUMvQixJQUFJLGNBQWMsR0FBRyxJQUFJLENBQUMsVUFBVSxDQUFDLGNBQWMsQ0FBQyxDQUFDO1FBQ3JELElBQUksQ0FBQyxZQUFZLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxHQUFHLEVBQUU7WUFDbEMsSUFBSSxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsY0FBYyxDQUFDLEtBQUss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
|
1
dist/smartcli.plugins.d.ts
vendored
1
dist/smartcli.plugins.d.ts
vendored
@ -1,4 +1,3 @@
|
||||
import 'typings-global';
|
||||
import * as yargs from 'yargs';
|
||||
import * as beautylog from 'beautylog';
|
||||
import * as lik from 'lik';
|
||||
|
3
dist/smartcli.plugins.js
vendored
3
dist/smartcli.plugins.js
vendored
@ -1,6 +1,5 @@
|
||||
"use strict";
|
||||
Object.defineProperty(exports, "__esModule", { value: true });
|
||||
require("typings-global");
|
||||
const yargs = require("yargs");
|
||||
exports.yargs = yargs;
|
||||
const beautylog = require("beautylog");
|
||||
@ -11,4 +10,4 @@ const path = require("path");
|
||||
exports.path = path;
|
||||
const smartparam = require("smartparam");
|
||||
exports.smartparam = smartparam;
|
||||
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic21hcnRjbGkucGx1Z2lucy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3RzL3NtYXJ0Y2xpLnBsdWdpbnMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7QUFBQSwwQkFBdUI7QUFFdkIsK0JBQThCO0FBTzVCLHNCQUFLO0FBTlAsdUNBQXNDO0FBT3BDLDhCQUFTO0FBTlgsMkJBQTBCO0FBT3hCLGtCQUFHO0FBTkwsNkJBQTRCO0FBTzFCLG9CQUFJO0FBTk4seUNBQXdDO0FBT3RDLGdDQUFVIn0=
|
||||
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic21hcnRjbGkucGx1Z2lucy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3RzL3NtYXJ0Y2xpLnBsdWdpbnMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7QUFBQSwrQkFBK0I7QUFNdEIsc0JBQUs7QUFMZCx1Q0FBdUM7QUFLdkIsOEJBQVM7QUFKekIsMkJBQTJCO0FBSUEsa0JBQUc7QUFIOUIsNkJBQTZCO0FBR0csb0JBQUk7QUFGcEMseUNBQXlDO0FBRUgsZ0NBQVUifQ==
|
@ -1,13 +1,16 @@
|
||||
# smartcli
|
||||
|
||||
nodejs wrapper for CLI related tasks
|
||||
|
||||
## Availabililty
|
||||
|
||||
[](https://www.npmjs.com/package/smartcli)
|
||||
[](https://GitLab.com/pushrocks/smartcli)
|
||||
[](https://github.com/pushrocks/smartcli)
|
||||
[](https://pushrocks.gitlab.io/smartcli/)
|
||||
|
||||
## Status for master
|
||||
|
||||
[](https://GitLab.com/pushrocks/smartcli/commits/master)
|
||||
[](https://GitLab.com/pushrocks/smartcli/commits/master)
|
||||
[](https://www.npmjs.com/package/smartcli)
|
||||
@ -28,41 +31,40 @@ take the following commandline input:
|
||||
mytool command argument1 argument2 --option1 -o2 option2Value
|
||||
```
|
||||
|
||||
* `mytool` obviously is the tool (like git)
|
||||
* `command` is the main thing the tool shall do (like commit)
|
||||
* `argument1` and `argument2` are arguments
|
||||
* `option1` is a longform option you can add (like --message for message)
|
||||
* `optionValue` is the referenced option value (like a commit message)
|
||||
- `mytool` obviously is the tool (like git)
|
||||
- `command` is the main thing the tool shall do (like commit)
|
||||
- `argument1` and `argument2` are arguments
|
||||
- `option1` is a longform option you can add (like --message for message)
|
||||
- `optionValue` is the referenced option value (like a commit message)
|
||||
|
||||
When there is no command and no option specified the standardTask applied.
|
||||
When there is a option specified but no command, standardTask applies,
|
||||
except when of the options is -v, --version or --help.
|
||||
|
||||
```javascript
|
||||
import {Smartcli} from "smartcli"
|
||||
import { Smartcli } from 'smartcli';
|
||||
mySmartcli = new Smartcli();
|
||||
mySmartcli.standardTask()
|
||||
.then(argvArg => {
|
||||
// do something if program is called without an command
|
||||
});
|
||||
mySmartcli.standardTask().then(argvArg => {
|
||||
// do something if program is called without an command
|
||||
});
|
||||
|
||||
mySmartcli.addCommand({commandname: 'install'})
|
||||
.then(argvArg => {
|
||||
// do something if program is called with command "install"
|
||||
})
|
||||
mySmartcli.addCommand({ commandname: 'install' }).then(argvArg => {
|
||||
// do something if program is called with command "install"
|
||||
});
|
||||
|
||||
mySmartcli.addVersion('1.0.0') // -v and --version options will display the specified version in the terminal
|
||||
mySmartcli.addVersion('1.0.0'); // -v and --version options will display the specified version in the terminal
|
||||
|
||||
mySmartCli.addHelp({ // is triggered by help command and --help option
|
||||
mySmartCli.addHelp({
|
||||
// is triggered by help command and --help option
|
||||
helpText: 'some help text to print' // the helpText to display
|
||||
})
|
||||
});
|
||||
|
||||
mySmartcli.startParse() // starts the evaluation and fullfills or rejects promises.
|
||||
mySmartcli.startParse(); // starts the evaluation and fullfills or rejects promises.
|
||||
```
|
||||
|
||||
For further information read the linked docs at the top of this README.
|
||||
|
||||
> MIT licensed | **©** [Lossless GmbH](https://lossless.gmbh)
|
||||
| By using this npm module you agree to our [privacy policy](https://lossless.gmbH/privacy.html)
|
||||
> | By using this npm module you agree to our [privacy policy](https://lossless.gmbH/privacy.html)
|
||||
|
||||
[](https://push.rocks)
|
||||
[](https://push.rocks)
|
||||
|
@ -1,7 +1,9 @@
|
||||
{
|
||||
"npmci": {
|
||||
"globalNpmTools": [
|
||||
"npmts"
|
||||
]
|
||||
"npmGlobalTools": [
|
||||
"@gitzone/npmts",
|
||||
"ts-node"
|
||||
],
|
||||
"npmAccesslevel": "public"
|
||||
}
|
||||
}
|
@ -1,3 +0,0 @@
|
||||
{
|
||||
"mode":"default"
|
||||
}
|
1038
package-lock.json
generated
Normal file
1038
package-lock.json
generated
Normal file
File diff suppressed because it is too large
Load Diff
36
package.json
36
package.json
@ -1,16 +1,13 @@
|
||||
{
|
||||
"name": "smartcli",
|
||||
"version": "2.0.4",
|
||||
"name": "@pushrocks/smartcli",
|
||||
"private": false,
|
||||
"version": "3.0.2",
|
||||
"description": "nodejs wrapper for CLI related tasks",
|
||||
"main": "dist/index.js",
|
||||
"typings": "dist/index.d.ts",
|
||||
"scripts": {
|
||||
"test": "(npmts)",
|
||||
"testm": "(cd ts/compile && gulp) && (node test.js jazz jam --awesome)",
|
||||
"devTest": "(npm test) && (node test.js --test true)",
|
||||
"reinstall": "(rm -r node_modules && npm install)",
|
||||
"release": "(git pull origin master && npm version patch && git push origin master && git checkout release && git merge master && git push origin release && git checkout master)",
|
||||
"startdev": "(git checkout master && git pull origin master)"
|
||||
"test": "(tsrun test/test.ts)",
|
||||
"build": "(npmts)"
|
||||
},
|
||||
"repository": {
|
||||
"type": "git",
|
||||
@ -29,16 +26,23 @@
|
||||
},
|
||||
"homepage": "https://gitlab.com/pushrocks/smartcli",
|
||||
"dependencies": {
|
||||
"@types/yargs": "6.x.x",
|
||||
"@types/yargs": "^11.0.0",
|
||||
"beautylog": "^6.1.10",
|
||||
"lik": "^1.0.30",
|
||||
"rxjs": "^5.3.0",
|
||||
"smartparam": "0.1.1",
|
||||
"smartq": "^1.1.1",
|
||||
"typings-global": "^1.0.14",
|
||||
"yargs": "^7.1.0"
|
||||
"lik": "^2.0.5",
|
||||
"rxjs": "^6.2.1",
|
||||
"smartparam": "1.0.2",
|
||||
"smartq": "^1.1.8",
|
||||
"yargs": "^11.0.0"
|
||||
},
|
||||
"devDependencies": {
|
||||
"tapbundle": "^1.0.5"
|
||||
"@gitzone/tsrun": "^1.0.7",
|
||||
"@types/node": "^10.5.0",
|
||||
"cz-conventional-changelog": "^2.1.0",
|
||||
"tapbundle": "^2.0.2"
|
||||
},
|
||||
"config": {
|
||||
"commitizen": {
|
||||
"path": "./node_modules/cz-conventional-changelog"
|
||||
}
|
||||
}
|
||||
}
|
||||
|
59
test/test.ts
59
test/test.ts
@ -1,44 +1,43 @@
|
||||
import { tap, expect } from 'tapbundle'
|
||||
import { tap, expect } from 'tapbundle';
|
||||
import { Subject } from 'rxjs';
|
||||
|
||||
import smartcli = require('../dist/index')
|
||||
import smartcli = require('../ts/index');
|
||||
|
||||
let smartCliTestObject: smartcli.Smartcli
|
||||
let smartCliTestObject: smartcli.Smartcli;
|
||||
|
||||
tap.test('should create a new Smartcli', async () => {
|
||||
smartCliTestObject = new smartcli.Smartcli()
|
||||
return expect(smartCliTestObject).be.instanceof(smartcli.Smartcli)
|
||||
})
|
||||
|
||||
smartCliTestObject = new smartcli.Smartcli();
|
||||
expect(smartCliTestObject).to.be.instanceof(smartcli.Smartcli);
|
||||
});
|
||||
|
||||
tap.test('should add an command', async () => {
|
||||
smartCliTestObject.addCommand('awesome')
|
||||
})
|
||||
|
||||
expect(smartCliTestObject.addCommand('awesome')).to.be.instanceOf(Subject);
|
||||
});
|
||||
|
||||
tap.test('should start parsing a standardTask', async () => {
|
||||
smartCliTestObject.standardTask()
|
||||
.then(() => {
|
||||
console.log('this is the standard Task!')
|
||||
})
|
||||
})
|
||||
expect(smartCliTestObject.standardTask()).to.be.instanceOf(Subject);
|
||||
});
|
||||
|
||||
let hasExecuted: boolean = false;
|
||||
|
||||
let hasExecuted: boolean = false
|
||||
tap.test('should accept a command', async () => {
|
||||
smartCliTestObject.addTrigger('triggerme')
|
||||
.subscribe(() => {
|
||||
hasExecuted = true
|
||||
})
|
||||
})
|
||||
tap.test('should not have executed yet', async () => {
|
||||
expect(hasExecuted).to.be.false
|
||||
})
|
||||
tap.test('should execute when triggered', async () => {
|
||||
smartCliTestObject.trigger('triggerme')
|
||||
expect(hasExecuted).be.true
|
||||
})
|
||||
smartCliTestObject.addTrigger('triggerme').subscribe(() => {
|
||||
hasExecuted = true;
|
||||
});
|
||||
});
|
||||
|
||||
tap.test('should not have executed yet', async () => {
|
||||
expect(hasExecuted).to.be.false;
|
||||
});
|
||||
|
||||
tap.test('should execute when triggered', async () => {
|
||||
smartCliTestObject.trigger('triggerme');
|
||||
expect(hasExecuted).be.true;
|
||||
});
|
||||
|
||||
tap.test('should start parsing the CLI input', async () => {
|
||||
smartCliTestObject.startParse()
|
||||
})
|
||||
smartCliTestObject.startParse();
|
||||
expect(smartCliTestObject.parseStarted.promise).to.be.instanceOf(Promise);
|
||||
});
|
||||
|
||||
tap.start();
|
||||
|
@ -1 +1 @@
|
||||
export { Smartcli } from './smartcli.classes.smartcli'
|
||||
export { Smartcli } from './smartcli.classes.smartcli';
|
||||
|
@ -1,97 +1,91 @@
|
||||
import * as smartq from 'smartq'
|
||||
import { Subject } from 'rxjs'
|
||||
import * as smartq from 'smartq';
|
||||
import { Subject } from 'rxjs';
|
||||
|
||||
import * as plugins from './smartcli.plugins'
|
||||
import * as plugins from './smartcli.plugins';
|
||||
|
||||
// import classes
|
||||
import { Objectmap } from 'lik'
|
||||
import { Objectmap } from 'lik';
|
||||
|
||||
// interfaces
|
||||
export interface ICommandPromiseObject {
|
||||
commandName: string,
|
||||
promise: Promise<void>
|
||||
commandName: string;
|
||||
promise: Promise<void>;
|
||||
}
|
||||
|
||||
export interface ITriggerObservableObject {
|
||||
triggerName: string
|
||||
subject: Subject<any>
|
||||
triggerName: string;
|
||||
subject: Subject<any>;
|
||||
}
|
||||
|
||||
/**
|
||||
* class to create a new instance of Smartcli. Handles parsing of command line arguments.
|
||||
*/
|
||||
export class Smartcli {
|
||||
argv: any
|
||||
questionsDone
|
||||
parseStarted
|
||||
commands
|
||||
questions
|
||||
version: string
|
||||
|
||||
/**
|
||||
* map of all Command/Promise objects to keep track
|
||||
*/
|
||||
allCommandPromisesMap = new Objectmap<ICommandPromiseObject>()
|
||||
argv: any;
|
||||
questionsDone;
|
||||
parseStarted: smartq.Deferred<any>;
|
||||
commands;
|
||||
questions;
|
||||
version: string;
|
||||
private onlyOnProcessEnvCliCall = false;
|
||||
|
||||
/**
|
||||
* map of all Trigger/Observable objects to keep track
|
||||
*/
|
||||
allTriggerObservablesMap = new Objectmap<ITriggerObservableObject>()
|
||||
allTriggerObservablesMap = new Objectmap<ITriggerObservableObject>();
|
||||
|
||||
/**
|
||||
* The constructor of Smartcli
|
||||
*/
|
||||
constructor() {
|
||||
this.argv = plugins.yargs
|
||||
this.questionsDone = smartq.defer()
|
||||
this.parseStarted = smartq.defer()
|
||||
this.argv = plugins.yargs;
|
||||
this.questionsDone = smartq.defer();
|
||||
this.parseStarted = smartq.defer();
|
||||
}
|
||||
|
||||
/**
|
||||
* halts any execution of commands if (process.env.CLI_CALL === false)
|
||||
*/
|
||||
onlyTriggerOnProcessEnvCliCall() {
|
||||
this.onlyOnProcessEnvCliCall = true;
|
||||
}
|
||||
|
||||
/**
|
||||
* adds an alias, meaning one equals the other in terms of command execution.
|
||||
*/
|
||||
addCommandAlias(keyArg, aliasArg): void {
|
||||
this.argv = this.argv.alias(keyArg, aliasArg)
|
||||
return
|
||||
this.argv = this.argv.alias(keyArg, aliasArg);
|
||||
return;
|
||||
}
|
||||
|
||||
/**
|
||||
* 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.
|
||||
*/
|
||||
addCommand(commandNameArg: string): Promise<any> {
|
||||
let done = smartq.defer<any>()
|
||||
this.allCommandPromisesMap.add({
|
||||
commandName: commandNameArg,
|
||||
promise: done.promise
|
||||
})
|
||||
this.parseStarted.promise
|
||||
.then(() => {
|
||||
if (this.argv._.indexOf(commandNameArg) === 0) {
|
||||
done.resolve(this.argv)
|
||||
} else {
|
||||
done.reject(this.argv)
|
||||
}
|
||||
})
|
||||
return done.promise
|
||||
addCommand(commandNameArg: string): Subject<any> {
|
||||
let triggerSubject = this.addTrigger(commandNameArg);
|
||||
this.parseStarted.promise.then(() => {
|
||||
if (this.argv._.indexOf(commandNameArg) === 0) {
|
||||
this.trigger(commandNameArg);
|
||||
}
|
||||
});
|
||||
return triggerSubject;
|
||||
}
|
||||
|
||||
/**
|
||||
* gets a Promise for a command word
|
||||
*/
|
||||
getCommandPromiseByName(commandNameArg: string): Promise<void> {
|
||||
return this.allCommandPromisesMap.find(commandDeferredObjectArg => {
|
||||
return commandDeferredObjectArg.commandName === commandNameArg
|
||||
}).promise
|
||||
}
|
||||
|
||||
/**
|
||||
* adds a Trigger. Like addCommand(), but returns an subscribable observable
|
||||
* adds a Trigger. Like addCommand(), but returns an subscribable observable
|
||||
*/
|
||||
addTrigger(triggerNameArg: string) {
|
||||
let triggerSubject = new Subject<any>()
|
||||
this.allTriggerObservablesMap.add({
|
||||
triggerName: triggerNameArg,
|
||||
subject: triggerSubject
|
||||
})
|
||||
this.addCommand(triggerNameArg).then(() => {
|
||||
triggerSubject.next(this.argv)
|
||||
})
|
||||
return triggerSubject
|
||||
let triggerSubject = new Subject<any>();
|
||||
if (!this.getTriggerSubject(triggerNameArg)) {
|
||||
this.allTriggerObservablesMap.add({
|
||||
triggerName: triggerNameArg,
|
||||
subject: triggerSubject
|
||||
});
|
||||
} else {
|
||||
throw new Error(`you can't add a trigger twice`);
|
||||
}
|
||||
return triggerSubject;
|
||||
}
|
||||
|
||||
/**
|
||||
@ -99,65 +93,73 @@ export class Smartcli {
|
||||
* @param commandNameArg - the name of the command to trigger
|
||||
*/
|
||||
trigger(triggerName: string) {
|
||||
let triggerSubject = this.allTriggerObservablesMap.find(triggerObservableObjectArg => {
|
||||
return triggerObservableObjectArg.triggerName === triggerName
|
||||
}).subject
|
||||
triggerSubject.next(this.argv)
|
||||
return triggerSubject
|
||||
let triggerSubject = this.getTriggerSubject(triggerName);
|
||||
triggerSubject.next(this.argv);
|
||||
return triggerSubject;
|
||||
}
|
||||
|
||||
getTriggerSubject(triggerName: string) {
|
||||
const triggerObservableObject = this.allTriggerObservablesMap.find(
|
||||
triggerObservableObjectArg => {
|
||||
return triggerObservableObjectArg.triggerName === triggerName;
|
||||
}
|
||||
);
|
||||
if (triggerObservableObject) {
|
||||
return triggerObservableObject.subject;
|
||||
} else {
|
||||
return null;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* allows to specify help text to be printed above the rest of the help text
|
||||
*/
|
||||
addHelp(optionsArg: {
|
||||
helpText: string
|
||||
}) {
|
||||
this.addCommand('help').then(argvArg => {
|
||||
plugins.beautylog.log(optionsArg.helpText)
|
||||
})
|
||||
addHelp(optionsArg: { helpText: string }) {
|
||||
this.addCommand('help').subscribe(argvArg => {
|
||||
plugins.beautylog.log(optionsArg.helpText);
|
||||
});
|
||||
}
|
||||
|
||||
/**
|
||||
* specify version to be printed for -v --version
|
||||
*/
|
||||
addVersion(versionArg: string) {
|
||||
this.version = versionArg
|
||||
this.addCommandAlias('v', 'version')
|
||||
this.parseStarted.promise
|
||||
.then(() => {
|
||||
if (this.argv.v) {
|
||||
console.log(this.version)
|
||||
}
|
||||
})
|
||||
this.version = versionArg;
|
||||
this.addCommandAlias('v', 'version');
|
||||
this.parseStarted.promise.then(() => {
|
||||
if (this.argv.v) {
|
||||
console.log(this.version);
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
/**
|
||||
* returns promise that is resolved when no commands are specified
|
||||
* adds a trigger that is called when no command is specified
|
||||
*/
|
||||
standardTask(): Promise<any> {
|
||||
let done = smartq.defer<any>()
|
||||
this.allCommandPromisesMap.add({
|
||||
commandName: 'standard',
|
||||
promise: done.promise
|
||||
})
|
||||
this.parseStarted.promise
|
||||
.then(() => {
|
||||
if (this.argv._.length === 0 && !this.argv.v) {
|
||||
done.resolve(this.argv)
|
||||
standardTask(): Subject<any> {
|
||||
let standardSubject = this.addTrigger('standardTask');
|
||||
this.parseStarted.promise.then(() => {
|
||||
if (this.argv._.length === 0 && !this.argv.v) {
|
||||
if (this.onlyOnProcessEnvCliCall) {
|
||||
if (process.env.CLI_CALL === 'true') {
|
||||
this.trigger('standardTask');
|
||||
} else {
|
||||
return;
|
||||
}
|
||||
} else {
|
||||
done.reject(this.argv)
|
||||
this.trigger('standardTask');
|
||||
}
|
||||
})
|
||||
return done.promise
|
||||
}
|
||||
});
|
||||
return standardSubject;
|
||||
}
|
||||
|
||||
/**
|
||||
* start the process of evaluating commands
|
||||
*/
|
||||
startParse(): void {
|
||||
this.argv = this.argv.argv
|
||||
this.parseStarted.resolve()
|
||||
return
|
||||
this.argv = this.argv.argv;
|
||||
this.parseStarted.resolve();
|
||||
return;
|
||||
}
|
||||
|
||||
}
|
||||
|
@ -1,15 +1,7 @@
|
||||
import 'typings-global'
|
||||
import * as yargs from 'yargs';
|
||||
import * as beautylog from 'beautylog';
|
||||
import * as lik from 'lik';
|
||||
import * as path from 'path';
|
||||
import * as smartparam from 'smartparam';
|
||||
|
||||
import * as yargs from 'yargs'
|
||||
import * as beautylog from 'beautylog'
|
||||
import * as lik from 'lik'
|
||||
import * as path from 'path'
|
||||
import * as smartparam from 'smartparam'
|
||||
|
||||
export {
|
||||
yargs,
|
||||
beautylog,
|
||||
lik,
|
||||
path,
|
||||
smartparam
|
||||
}
|
||||
export { yargs, beautylog, lik, path, smartparam };
|
||||
|
Reference in New Issue
Block a user