Compare commits

...

71 Commits

Author SHA1 Message Date
7ca18c4a46 1.0.9 2016-09-04 17:50:36 +02:00
b98e2a1a62 improve typings 2016-09-04 17:50:10 +02:00
e102203422 1.0.8 2016-09-04 17:36:19 +02:00
92a37cf29b fix ci 2016-09-04 17:36:07 +02:00
8408d1f3b5 1.0.7 2016-09-04 17:34:34 +02:00
d88e05466b fix base image 2016-09-04 17:34:29 +02:00
3a789d052c 1.0.6 2016-09-04 17:32:31 +02:00
d76d829e46 add page stage 2016-09-04 17:32:26 +02:00
f8157ab8aa improve typings and docs 2016-09-04 17:32:12 +02:00
5c67015779 update smartcli 2016-09-04 17:23:29 +02:00
b67e3c0de1 Add new file 2016-08-28 23:00:00 +00:00
c7a647d4ef start interaction module 2016-08-26 11:52:09 +02:00
9e5fb7a13a 1.0.5 2016-08-26 09:21:53 +02:00
c115d222c0 improve intellisense 2016-08-26 09:21:42 +02:00
643514c64a 1.0.4 2016-06-22 11:55:26 +02:00
19498f7b11 compile fix 2016-06-22 11:55:23 +02:00
3afadd9045 1.0.3 2016-06-22 11:54:19 +02:00
0889423a24 fix 2016-06-22 11:54:12 +02:00
86b4cf4cc3 add getCommandPromise 2016-06-22 01:21:09 +02:00
4cb4eabef4 update deps and transition from npmts to npmts-g 2016-06-22 01:18:04 +02:00
bad0971f1c 1.0.2 2016-06-16 02:58:49 +02:00
016f03bd8a standard tasks now returns argv 2016-06-16 02:58:45 +02:00
63a9da11be some cosmetics 2016-06-13 12:57:24 +02:00
ab18c75b28 introduce new classes 2016-06-13 12:56:42 +02:00
088d4ef11b 1.0.1 2016-06-10 04:32:14 +02:00
5ee866d9c6 fix version return 2016-06-10 04:32:11 +02:00
d65061aaaa return argv to command 2016-06-10 04:21:03 +02:00
506bb0cdaf 1.0.0 2016-06-10 04:13:30 +02:00
834a6c2953 first version with basic funtionality 2016-06-10 04:13:23 +02:00
e1c2de8a40 remove bulk and add some features to Smartcli class 2016-06-10 03:48:01 +02:00
9e76f2afb1 Start restructuring to use a smarter Smartcli class that handles command evaluation for you 2016-06-10 03:10:21 +02:00
cf78839e12 update dependencies 2016-06-10 02:27:04 +02:00
8733a601b4 compile 2016-06-09 14:03:18 +02:00
fdd1761333 add gitlab ci 2016-06-09 14:02:21 +02:00
542c77069f start smartcli class 2016-06-09 14:01:06 +02:00
96d82c3a20 update dependencies 2016-05-23 04:09:06 +02:00
ab8ce876a3 add class smartcli 2016-05-23 03:17:19 +02:00
de4d3bcf3a Update README 2016-05-12 03:33:23 +02:00
75ab5552e1 include commander and update README 2016-05-12 03:27:45 +02:00
eb3d9d722f fixed type issue 2016-05-10 17:21:30 -07:00
c32f41cc23 fixed test issue 2016-05-10 17:11:40 -07:00
cf03c6681b update deps 2016-05-10 03:18:40 +02:00
204c7105e8 0.0.13 2016-04-05 01:22:42 +02:00
ac0681507a updated deps 2016-04-05 01:22:42 +02:00
d17053532b 0.0.12 2016-04-05 01:22:11 +02:00
65d50ab238 updated deps 2016-04-05 01:22:11 +02:00
7eed737120 work in progress 2016-03-18 17:08:26 +00:00
8f72b3f2af work in progress 2016-03-14 07:12:00 +01:00
fea330b8ff small interface fix 2015-11-09 22:58:05 +01:00
b51bbb00a4 0.0.11 2015-11-09 04:07:36 +01:00
5bd32f03c5 improve travis process 2015-11-09 04:07:01 +01:00
68f7e7fc03 0.0.10 2015-11-09 04:02:51 +01:00
55cdd7f803 add tests and fix some errors 2015-11-09 04:02:46 +01:00
5444f1d3c0 add Tests and improve TypeScript organization 2015-11-09 00:58:40 +01:00
5611ad03aa start smarter CLI logic 2015-11-05 21:43:34 +01:00
d6cbefce2c fix small comment error 2015-10-14 21:16:42 +02:00
afa6f885ad fix small comment error 2015-10-14 21:16:12 +02:00
b1565dec3e 0.0.9 2015-10-14 21:14:29 +02:00
f6969ecfd5 improved readme 2015-10-14 21:14:20 +02:00
9bb85ca666 updated readme 2015-10-14 21:09:26 +02:00
9442f738d9 added devStatus badge 2015-10-14 21:01:39 +02:00
5043829132 0.0.8 2015-10-14 20:59:22 +02:00
09152c8f5f improved return objects 2015-10-14 20:59:01 +02:00
fd7352533f Merge pull request #3 from pushrocks/greenkeeper-beautylog-0.0.15
Update beautylog to version 0.0.15 🚀
2015-10-12 22:45:44 +02:00
4b977eee3b chore(package): update beautylog to version 0.0.15
http://greenkeeper.io/
2015-10-12 22:38:34 +02:00
bec0c4bbfa Merge pull request #2 from pushrocks/greenkeeper-beautylog-0.0.14
Update beautylog to version 0.0.14 🚀
2015-10-12 20:03:37 +02:00
686fa6c6f9 chore(package): update beautylog to version 0.0.14
http://greenkeeper.io/
2015-10-12 20:02:29 +02:00
400c5c6574 Merge pull request #1 from pushrocks/greenkeeper-beautylog-0.0.13
Update beautylog to version 0.0.13 🚀
2015-10-12 14:42:35 +02:00
80770612f5 chore(package): update beautylog to version 0.0.13
http://greenkeeper.io/
2015-10-12 13:15:41 +02:00
a65fcaffea disabled travis email 2015-10-08 00:50:10 +02:00
f80006310b 0.0.7 2015-10-08 00:49:15 +02:00
34 changed files with 708 additions and 2475 deletions

7
.gitignore vendored
View File

@ -1,6 +1,9 @@
node_modules/
.settings/
.idea/
coverage/
pages/
ts/*.js
ts/*.js.map
ts/typings/

50
.gitlab-ci.yml Normal file
View File

@ -0,0 +1,50 @@
image: hosttoday/ht-docker-node:npmts
stages:
- test
- release
- page
testLEGACY:
stage: test
script:
- npmci test legacy
tags:
- docker
allow_failure: true
testLTS:
stage: test
script:
- npmci test lts
tags:
- docker
testSTABLE:
stage: test
script:
- npmci test stable
tags:
- docker
release:
stage: release
script:
- npmci publish
only:
- tags
tags:
- docker
pages:
image: hosttoday/ht-docker-node:npmpage
stage: page
script:
- npmci test stable
- npmci command npmpage --host gitlab
only:
- tags
artifacts:
expire_in: 1 week
paths:
- public

6
.idea/vcs.xml generated
View File

@ -1,6 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="VcsDirectoryMappings">
<mapping directory="$PROJECT_DIR$" vcs="Git" />
</component>
</project>

0
.koding.yml Normal file
View File

View File

@ -1,19 +0,0 @@
language: node_js
before_install:
- nvm install stable
- node -v
- npm -v
- npm install -g gulp
- npm install gulp
- npm install gulp-typescript
deploy:
provider: npm
email: npm@smart-coordination.com
api_key:
secure: XAtA2XHAr96ILKpm1VnB/Nff9hiQv3FUa/NDfGZgvJKimuF/TwU2+kXyAag/LlEQGckZ9/IDx0PTIe8x4wOvg2VyKceYktGt6G5/MHeAXwzkkM253k2CKweVtBgnpZ2doTZXeeV/h7hHuEWZbWRXIVCgM6/inaaNe4cMRGCWqwb1xmw6D8VkLpNo6PiB37gR4GfMokasgVHZEVMg2evWKk0moREGW9XKqoE6PS9TPHPHerdqFqfbmeOq3nNgHrJZkNsAJ3PPESWCe/NGEBwtYDKrPI3QlouvXmxScI9/p2VCQmdFoUxKMDsVzBdRMrCx+XxoS8x81HxubZSpnvzUlzGtznZi7e6OyAlI7xXELIO551AH4V/pNWWUPATX+7vXVDGh7aAZYme/fejisjO5Tk9aqRvohh2jCDml3ED6alHHfI0oX5UvBpOE+XwGTIJ8qpf9RrLP5DC27JWE3fqY/WoqIZX7phoKeKYLl+R7Iln/dfvepbMBgcesnBf4PuMh3Qm2l2G1bElJ/hniV1dgggwjcg50nA0Ee9sCnORPxxjdDIMwJw//NJSe+Aq5Fm1ure9oNiBYOeF0bLVQyfGIC8J8coy1xdqv2klKnGHjMMN44bjNlmDp00SaRpbdDuavyocosQVpzfA+hY2QtGV5TXFv6TLgcMYwf8gNyVNkSGE=
on:
tags: true
repo: pushrocks/smartcli
notifications:
slack:
secure: f5Uss0z9RPl/QcA/DroB8loyE93aOYI6bqCkrsiUscmZtlv/TVQtT4dxqGA6uvcG6iTQDBi3Ul88dQxWkRm4IqbhY35/iMaV2dHW4FVYMAh8GQMbsfL2sALCcufxD9blw47awv3iFcwhV1EeyesscjgL0JIjduk96v/7G/6QIO2838M1lzlgtj+kRUkim8qkaEs1je3gRrhMUIjLuAdscMXyUKYFMjWo9ACSjVUl30R/ZNemb18itIja6i92GotreBgcfEMczvy58ovDC7xdJUsY8LjMI01DwY+WPRnI0tAhsuI8moBwwcdM4e3bAjKjucQRjO33O5bMWRZ6QCiYd0DnCEFyCPQLJ4GSy/tkD00n8ijLHAOSV3AH1zNbdK1EAdSPQXDvlI36KJn/2hyQLoitGHVUPr76ujJWP82ypO2tgIp3XQU0dJVCxDuHnwJO2+hjdI+gCPqxNTpjeujHx3UdkTGNRjuuf9dlZ/D08fApjYxy2fxItTqo3QjP/nrqvBXUOPP8yPHpjIT4H2t5Pr4SJjBGI6X4qhKyFj6s9rA/Xu1rL+45zu1C3uC3z+u3T9UwrbzJ/cZM6r6UQvQmUvIfBNaMlg4I/diQCDIPL+Rhop2nylY3IcHmJnk2itn7kOqj1tohCpFEml5pRuSZy4udWywkdtyBAsHWFLF7oiQ=

View File

@ -1,16 +1,47 @@
# smartcli
nodejs wrapper for CLI related tasks
nodejs wrapper for CLI related tasks. TypeScript ready.
### Buildstatus/Dependencies
[![Build Status](https://travis-ci.org/pushrocks/smartcli.svg?branch=master)](https://travis-ci.org/pushrocks/smartcli)
[![devDependency Status](https://david-dm.org/pushrocks/smartcli/dev-status.svg)](https://david-dm.org/pushrocks/smartcli#info=devDependencies)
## Availabililty
[![npm](https://push.rocks/assets/repo-button-npm.svg)](https://www.npmjs.com/package/smartcli)
[![git](https://push.rocks/assets/repo-button-git.svg)](https://gitlab.com/pushrocks/smartcli)
[![git](https://push.rocks/assets/repo-button-mirror.svg)](https://github.com/pushrocks/smartcli)
[![docs](https://push.rocks/assets/repo-button-docs.svg)](https://pushrocks.gitlab.io/smartcli/docs)
### Usage
This npm package comes with everything you need to start your own gulp plugin.
## Status for master
[![build status](https://gitlab.com/pushrocks/smartcli/badges/master/build.svg)](https://gitlab.com/pushrocks/smartcli/commits/master)
[![coverage report](https://gitlab.com/pushrocks/smartcli/badges/master/coverage.svg)](https://gitlab.com/pushrocks/smartcli/commits/master)
[![Dependency Status](https://david-dm.org/pushrocks/smartcli.svg)](https://david-dm.org/pushrocks/smartcli)
[![bitHound Dependencies](https://www.bithound.io/github/pushrocks/smartcli/badges/dependencies.svg)](https://www.bithound.io/github/pushrocks/smartcli/master/dependencies/npm)
[![bitHound Code](https://www.bithound.io/github/pushrocks/smartcli/badges/code.svg)](https://www.bithound.io/github/pushrocks/smartcli)
[![TypeScript](https://img.shields.io/badge/TypeScript-2.x-blue.svg)](https://nodejs.org/dist/latest-v6.x/docs/api/)
[![node](https://img.shields.io/badge/node->=%206.x.x-blue.svg)](https://nodejs.org/dist/latest-v6.x/docs/api/)
We recommend modifying the ts/index.ts file,
then run `npm install` to install the dev dependencies
and use `npm test` to compile the TypeScript file.
Cheers
Phil from Lossless Digital
## Install the package
npm install smartcli --save
## Usage
this plugin tries to establish some logic in which CLI tools work.
take the following commandline input:
```
mytool function argument1 argument2 --option1 -o2 option2Value
```
* 'mytool' obviously is the tool (like git)
* function 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)
```typescript
import {Smartcli} from "smartcli"
mySmartcli = new Smartcli();
mySmartcli.standardTask()
.then(argvArg => {
// do something if program is called without an command
});
mySmartcli.question
```

2
dist/index.d.ts vendored Normal file
View File

@ -0,0 +1,2 @@
import "typings-global";
export { Smartcli } from "./smartcli.classes.smartcli";

5
dist/index.js vendored Normal file
View File

@ -0,0 +1,5 @@
"use strict";
require("typings-global");
var smartcli_classes_smartcli_1 = require("./smartcli.classes.smartcli");
exports.Smartcli = smartcli_classes_smartcli_1.Smartcli;
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi90cy9pbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUEsUUFBTyxnQkFBZ0IsQ0FBQyxDQUFBO0FBR3hCLDBDQUF1Qiw2QkFBNkIsQ0FBQztBQUE3Qyx3REFBNkMifQ==

32
dist/smartcli.classes.interaction.d.ts vendored Normal file
View File

@ -0,0 +1,32 @@
import "typings-global";
/**
* allows to specify an user interaction during runtime
*/
export declare type questionType = "input" | "confirm" | "list" | "rawlist" | "expand" | "checkbox" | "password" | "editor";
export interface choiceObject {
name: string;
value: any;
}
export interface validateFunction {
(any: any): boolean;
}
export declare class Interaction {
constructor();
askQuestion(optionsArg: {
type: questionType;
message: string;
default: any;
choices: string[] | choiceObject[];
validate: validateFunction;
}): void;
askQuestionArray: any;
}
export declare class QuestionTree {
constructor(questionString: string, optionsArray: any);
}
export declare class QuestionTreeNode {
constructor();
}
export declare class QuestionStorage {
constructor();
}

41
dist/smartcli.classes.interaction.js vendored Normal file
View File

@ -0,0 +1,41 @@
"use strict";
require("typings-global");
const plugins = require("./smartcli.plugins");
class Interaction {
constructor() {
}
;
askQuestion(optionsArg) {
let done = plugins.q.defer();
plugins.inquirer.prompt([{
type: optionsArg.type,
message: optionsArg.message,
default: optionsArg.default,
choices: optionsArg.choices,
validate: optionsArg.validate
}]).then(answers => {
done.resolve(answers);
});
}
;
}
exports.Interaction = Interaction;
class QuestionTree {
constructor(questionString, optionsArray) {
}
;
}
exports.QuestionTree = QuestionTree;
;
class QuestionTreeNode {
constructor() {
}
}
exports.QuestionTreeNode = QuestionTreeNode;
;
class QuestionStorage {
constructor() {
}
}
exports.QuestionStorage = QuestionStorage;
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic21hcnRjbGkuY2xhc3Nlcy5pbnRlcmFjdGlvbi5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3RzL3NtYXJ0Y2xpLmNsYXNzZXMuaW50ZXJhY3Rpb24udHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBLFFBQU8sZ0JBQWdCLENBQUMsQ0FBQTtBQUN4QixNQUFZLE9BQU8sV0FBTSxvQkFBb0IsQ0FBQyxDQUFBO0FBZTlDO0lBQ0k7SUFDQSxDQUFDOztJQUVELFdBQVcsQ0FBQyxVQU1YO1FBQ0csSUFBSSxJQUFJLEdBQUcsT0FBTyxDQUFDLENBQUMsQ0FBQyxLQUFLLEVBQUUsQ0FBQztRQUM3QixPQUFPLENBQUMsUUFBUSxDQUFDLE1BQU0sQ0FBQyxDQUFDO2dCQUNyQixJQUFJLEVBQUUsVUFBVSxDQUFDLElBQUk7Z0JBQ3JCLE9BQU8sRUFBRSxVQUFVLENBQUMsT0FBTztnQkFDM0IsT0FBTyxFQUFFLFVBQVUsQ0FBQyxPQUFPO2dCQUMzQixPQUFPLEVBQUMsVUFBVSxDQUFDLE9BQU87Z0JBQzFCLFFBQVEsRUFBRSxVQUFVLENBQUMsUUFBUTthQUNoQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsT0FBTztZQUNaLElBQUksQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLENBQUM7UUFDMUIsQ0FBQyxDQUFDLENBQUM7SUFDUCxDQUFDOztBQUVMLENBQUM7QUF2QlksbUJBQVcsY0F1QnZCLENBQUE7QUFHRDtJQUVJLFlBQVksY0FBc0IsRUFBRSxZQUFZO0lBRWhELENBQUM7O0FBQ0wsQ0FBQztBQUxZLG9CQUFZLGVBS3hCLENBQUE7QUFBQSxDQUFDO0FBRUY7SUFDSTtJQUVBLENBQUM7QUFDTCxDQUFDO0FBSlksd0JBQWdCLG1CQUk1QixDQUFBO0FBQUEsQ0FBQztBQUVGO0lBQ0k7SUFFQSxDQUFDO0FBQ0wsQ0FBQztBQUpZLHVCQUFlLGtCQUkzQixDQUFBIn0=

52
dist/smartcli.classes.smartcli.d.ts vendored Normal file
View File

@ -0,0 +1,52 @@
/// <reference types="q" />
import "typings-global";
import * as plugins from "./smartcli.plugins";
import { Objectmap } from "lik";
export interface commandPromiseObject {
commandName: string;
promise: plugins.q.Promise<any>;
}
export declare class Smartcli {
argv: any;
questionsDone: any;
parseStarted: any;
commands: any;
questions: any;
version: string;
allCommandPromises: Objectmap<commandPromiseObject>;
constructor();
/**
* adds an alias, meaning one equals the other in terms of triggering associated commands
*/
addAlias(keyArg: any, aliasArg: any): void;
/**
* 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(definitionArg: {
commandName: string;
}): plugins.q.Promise<any>;
/**
* gets a Promise for a command word
*/
getCommandPromiseByName(commandNameArg: string): plugins.q.Promise<any>;
/**
* allows to specify help text to be printed above the rest of the help text
*/
addHelp(optionsArg: {
helpText: string;
}): void;
/**
* specify version to be printed for -v --version
*/
addVersion(versionArg: string): void;
/**
* returns promise that is resolved when no commands are specified
*/
standardTask(): plugins.q.Promise<any>;
/**
* start the process of evaluating commands
*/
startParse(): void;
}

104
dist/smartcli.classes.smartcli.js vendored Normal file
View File

@ -0,0 +1,104 @@
"use strict";
require("typings-global");
const plugins = require("./smartcli.plugins");
// import classes
const lik_1 = require("lik");
;
class Smartcli {
constructor() {
// maps
this.allCommandPromises = new lik_1.Objectmap();
this.argv = plugins.yargs;
this.questionsDone = plugins.q.defer();
this.parseStarted = plugins.q.defer();
}
;
/**
* adds an alias, meaning one equals the other in terms of triggering associated commands
*/
addAlias(keyArg, aliasArg) {
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(definitionArg) {
let done = plugins.q.defer();
this.parseStarted.promise
.then(() => {
if (this.argv._.indexOf(definitionArg.commandName) == 0) {
done.resolve(this.argv);
}
else {
done.reject(this.argv);
}
});
return done.promise;
}
;
/**
* gets a Promise for a command word
*/
getCommandPromiseByName(commandNameArg) {
return this.allCommandPromises.find(commandPromiseObjectArg => {
return commandPromiseObjectArg.commandName === commandNameArg;
}).promise;
}
;
/**
* allows to specify help text to be printed above the rest of the help text
*/
addHelp(optionsArg) {
this.addCommand({
commandName: "help"
}).then(argvArg => {
plugins.beautylog.log(optionsArg.helpText);
});
}
;
/**
* specify version to be printed for -v --version
*/
addVersion(versionArg) {
this.version = versionArg;
this.addAlias("v", "version");
this.parseStarted.promise
.then(() => {
if (this.argv.v) {
console.log(this.version);
}
});
}
;
/**
* returns promise that is resolved when no commands are specified
*/
standardTask() {
let done = plugins.q.defer();
this.parseStarted.promise
.then(() => {
if (this.argv._.length == 0 && !this.argv.v) {
done.resolve(this.argv);
}
else {
done.reject(this.argv);
}
;
});
return done.promise;
}
/**
* start the process of evaluating commands
*/
startParse() {
this.argv = this.argv.argv;
this.parseStarted.resolve();
return;
}
}
exports.Smartcli = Smartcli;
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic21hcnRjbGkuY2xhc3Nlcy5zbWFydGNsaS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3RzL3NtYXJ0Y2xpLmNsYXNzZXMuc21hcnRjbGkudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBLFFBQU8sZ0JBQWdCLENBQUMsQ0FBQTtBQUV4QixNQUFZLE9BQU8sV0FBTSxvQkFBb0IsQ0FBQyxDQUFBO0FBRzlDLGlCQUFpQjtBQUNqQixzQkFBd0IsS0FBSyxDQUFDLENBQUE7QUFNN0IsQ0FBQztBQUVGO0lBVUk7UUFGQSxPQUFPO1FBQ1AsdUJBQWtCLEdBQUcsSUFBSSxlQUFTLEVBQXdCLENBQUM7UUFFdkQsSUFBSSxDQUFDLElBQUksR0FBRyxPQUFPLENBQUMsS0FBSyxDQUFDO1FBQzFCLElBQUksQ0FBQyxhQUFhLEdBQUcsT0FBTyxDQUFDLENBQUMsQ0FBQyxLQUFLLEVBQUUsQ0FBQztRQUN2QyxJQUFJLENBQUMsWUFBWSxHQUFHLE9BQU8sQ0FBQyxDQUFDLENBQUMsS0FBSyxFQUFFLENBQUM7SUFDMUMsQ0FBQzs7SUFFRDs7T0FFRztJQUNILFFBQVEsQ0FBQyxNQUFNLEVBQUMsUUFBUTtRQUNwQixJQUFJLENBQUMsSUFBSSxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLE1BQU0sRUFBQyxRQUFRLENBQUMsQ0FBQztRQUM3QyxNQUFNLENBQUM7SUFDWCxDQUFDOztJQUVEOzs7O09BSUc7SUFDSCxVQUFVLENBQUMsYUFBa0M7UUFDekMsSUFBSSxJQUFJLEdBQUcsT0FBTyxDQUFDLENBQUMsQ0FBQyxLQUFLLEVBQU8sQ0FBQztRQUNsQyxJQUFJLENBQUMsWUFBWSxDQUFDLE9BQU87YUFDcEIsSUFBSSxDQUFDO1lBQ0YsRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLGFBQWEsQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDO2dCQUN0RCxJQUFJLENB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

9
dist/smartcli.plugins.d.ts vendored Normal file
View File

@ -0,0 +1,9 @@
import "typings-global";
export import yargs = require('yargs');
export import beautylog = require("beautylog");
export import cliff = require("cliff");
export import inquirer = require("inquirer");
export import lik = require("lik");
export import path = require("path");
export import q = require("q");
export import smartparam = require("smartparam");

11
dist/smartcli.plugins.js vendored Normal file
View File

@ -0,0 +1,11 @@
"use strict";
require("typings-global");
exports.yargs = require('yargs');
exports.beautylog = require("beautylog");
exports.cliff = require("cliff");
exports.inquirer = require("inquirer");
exports.lik = require("lik");
exports.path = require("path");
exports.q = require("q");
exports.smartparam = require("smartparam");
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic21hcnRjbGkucGx1Z2lucy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3RzL3NtYXJ0Y2xpLnBsdWdpbnMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBLFFBQU8sZ0JBQWdCLENBQUMsQ0FBQTtBQUVWLGFBQUssV0FBVyxPQUFPLENBQUMsQ0FBQztBQUN6QixpQkFBUyxXQUFXLFdBQVcsQ0FBQyxDQUFDO0FBQ2pDLGFBQUssV0FBVyxPQUFPLENBQUMsQ0FBQztBQUN6QixnQkFBUSxXQUFXLFVBQVUsQ0FBQyxDQUFDO0FBQy9CLFdBQUcsV0FBVyxLQUFLLENBQUMsQ0FBQztBQUNyQixZQUFJLFdBQVcsTUFBTSxDQUFDLENBQUM7QUFDdkIsU0FBQyxXQUFXLEdBQUcsQ0FBQyxDQUFDO0FBQ2pCLGtCQUFVLFdBQVcsWUFBWSxDQUFDLENBQUMifQ==

15
docs/book.json Normal file
View File

@ -0,0 +1,15 @@
{
"structure": {
"readme": "index.md"
},
"plugins": [
"tonic",
"edit-link"
],
"pluginsConfig": {
"edit-link": {
"base": "https://gitlab.com/pushrocks/npmts/edit/master/docs/",
"label": "Edit on GitLab"
}
}
}

47
docs/index.md Normal file
View File

@ -0,0 +1,47 @@
# smartcli
nodejs wrapper for CLI related tasks. TypeScript ready.
## Availabililty
[![npm](https://push.rocks/assets/repo-button-npm.svg)](https://www.npmjs.com/package/smartcli)
[![git](https://push.rocks/assets/repo-button-git.svg)](https://gitlab.com/pushrocks/smartcli)
[![git](https://push.rocks/assets/repo-button-mirror.svg)](https://github.com/pushrocks/smartcli)
[![docs](https://push.rocks/assets/repo-button-docs.svg)](https://pushrocks.gitlab.io/smartcli/docs)
## Status for master
[![build status](https://gitlab.com/pushrocks/smartcli/badges/master/build.svg)](https://gitlab.com/pushrocks/smartcli/commits/master)
[![coverage report](https://gitlab.com/pushrocks/smartcli/badges/master/coverage.svg)](https://gitlab.com/pushrocks/smartcli/commits/master)
[![Dependency Status](https://david-dm.org/pushrocks/smartcli.svg)](https://david-dm.org/pushrocks/smartcli)
[![bitHound Dependencies](https://www.bithound.io/github/pushrocks/smartcli/badges/dependencies.svg)](https://www.bithound.io/github/pushrocks/smartcli/master/dependencies/npm)
[![bitHound Code](https://www.bithound.io/github/pushrocks/smartcli/badges/code.svg)](https://www.bithound.io/github/pushrocks/smartcli)
[![TypeScript](https://img.shields.io/badge/TypeScript-2.x-blue.svg)](https://nodejs.org/dist/latest-v6.x/docs/api/)
[![node](https://img.shields.io/badge/node->=%206.x.x-blue.svg)](https://nodejs.org/dist/latest-v6.x/docs/api/)
## Install the package
npm install smartcli --save
## Usage
this plugin tries to establish some logic in which CLI tools work.
take the following commandline input:
```
mytool function argument1 argument2 --option1 -o2 option2Value
```
* 'mytool' obviously is the tool (like git)
* function 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)
```typescript
import {Smartcli} from "smartcli"
mySmartcli = new Smartcli();
mySmartcli.standardTask()
.then(argvArg => {
// do something if program is called without an command
});
mySmartcli.question
```

101
index.js
View File

@ -1,101 +0,0 @@
/// <reference path="typings/tsd.d.ts" />
var path = require("path");
var beautylog = require("beautylog");
var cliff = require("cliff");
var inquirer = require("inquirer");
var argv = require('yargs').argv;
//define the smartcli object
var smartcli = {};
//add plugins from above for direct use
smartcli.inquirer = inquirer;
smartcli.cliff = cliff;
smartcli.argv = argv;
/* ------------------------------------------------------------------------------
*----------------------- initial call CLI args -----------------------------
*----------------------------------------------------------------------------- */
// commands
smartcli.checkCommand = function (commandString) {
if (argv._.indexOf(commandString) != -1) {
return true;
}
return false;
};
smartcli.getCommands = function () {
return argv._;
};
// options
smartcli.checkOption = function (optionParam) {
if (argv.hasOwnProperty(optionParam)) {
return true;
}
return false;
};
smartcli.getOptions = function () {
var options = {};
for (var key in argv) {
if (key != "_") {
options['key'] = argv['key'];
}
}
return options;
};
/**
* returns the current working directory
* @returns {string}
*/
smartcli.getCwd = function () {
return process.cwd();
};
/* ------------------------------------------------------------------------------
*----------------------- in program CLI interaction -----------------------------
*----------------------------------------------------------------------------- */
/**
* executes callback with answer to question as argument
* @param questionString the question you want to ask the user
* @param cb the function to execute with answer as param
* @returns {null}
*/
smartcli.getAnswer = function (questionString, cb) {
if (typeof questionString != 'string') {
beautylog.error('no question specified');
return null;
}
//make inquirer compatible question object
var question = {
type: "input",
name: "userFeedback",
message: questionString,
validate: function (value) {
return true;
}
};
inquirer.prompt([question], function (answers) {
var answer = answers.userFeedback;
cb(answer);
});
};
/**
*
* @param questionString
* @param choiceOptions
* @param cb
* @returns {null}
*/
smartcli.getChoice = function (questionString, choiceOptions, cb) {
if (!Array.isArray(choiceOptions)) {
return null;
}
//make inquirer compatible question object
var question = {
type: "list",
name: "userFeedback",
message: questionString,
choices: choiceOptions,
filter: function (val) { return val.toLowerCase(); }
};
inquirer.prompt(question, function (answers) {
var answer = answers.userFeedback;
cb(answer);
});
};
module.exports = smartcli;

3
npmts.json Normal file
View File

@ -0,0 +1,3 @@
{
"mode":"default"
}

View File

@ -1,17 +1,20 @@
{
"name": "smartcli",
"version": "0.0.6",
"version": "1.0.9",
"description": "nodejs wrapper for CLI related tasks",
"main": "index.js",
"main": "dist/index.js",
"typings": "dist/index.d.ts",
"scripts": {
"test": "(cd ts/compile && gulp)",
"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)"
},
"repository": {
"type": "git",
"url": "https://github.com/pushrocks/smartcli.git"
"url": "https://gitlab.com/pushrocks/smartcli.git"
},
"keywords": [
"json",
@ -21,17 +24,26 @@
"author": "Smart Coordination GmbH <office@push.rocks> (https://push.rocks)",
"license": "MIT",
"bugs": {
"url": "https://github.com/pushrocks/smartcli/issues"
"url": "https://gitlab.com/pushrocks/smartcli/issues"
},
"homepage": "https://github.com/pushrocks/smartcli",
"homepage": "https://gitlab.com/pushrocks/smartcli",
"dependencies": {
"beautylog": "0.0.12",
"@types/cliff": "^0.1.3",
"@types/inquirer": "0.x.x",
"@types/q": "0.x.x",
"@types/yargs": "0.x.x",
"beautylog": "^5.0.20",
"cliff": "^0.1.10",
"inquirer": "^0.10.1",
"yargs": "^3.26.0"
"inquirer": "^1.1.2",
"lik": "^1.0.15",
"q": "^1.4.1",
"smartparam": "0.1.1",
"typings-global": "^1.0.6",
"yargs": "^5.0.0"
},
"devDependencies": {
"gulp": "3.9.0",
"gulp-typescript": "2.9.2"
"npmts-g": "^5.2.8",
"should": "^11.1.0",
"typings-test": "^1.0.1"
}
}

33
test.js
View File

@ -1,33 +0,0 @@
/// <reference path="typings/tsd.d.ts" />
var smartcli = require("./index.js");
var bl = require("beautylog");
bl.log('now starting Test');
bl.log('starting with initial CLI commands and options');
var commandsString = 'You specified the following commands:';
var commands = smartcli.getCommands();
for (var key in commands) {
commandsString = commandsString + ' ' + commands[key];
}
bl.log(commandsString);
if (smartcli.checkCommand('jazz')) {
bl.log('One of your commands is jazz');
}
else {
bl.log('None of your commands is jazz');
}
var getAnswerTest = function () {
smartcli.getAnswer('How do you feel?', function (answer) {
console.log('The answer is: ' + answer);
getChoiceTest();
});
};
var getChoiceTest = function () {
smartcli.getChoice('What music do you like to hear?', ['Jazz', 'Blues', 'Classical'], function (answer) {
console.log('The answer is: ' + answer);
getCwdTest();
});
};
var getCwdTest = function () {
console.log('The current directory is: ' + smartcli.getCwd());
};
getAnswerTest();

1
test/test.d.ts vendored Normal file
View File

@ -0,0 +1 @@
import "typings-test";

36
test/test.js Normal file
View File

@ -0,0 +1,36 @@
"use strict";
require("typings-test");
const smartcli = require("../dist/index");
let beautylog = require("beautylog");
let should = require("should");
describe("smartcli.Smartcli class", function () {
let smartCliTestObject;
describe("new Smartcli()", function () {
it("should create a new Smartcli", function () {
smartCliTestObject = new smartcli.Smartcli();
smartCliTestObject.should.be.instanceof(smartcli.Smartcli);
});
});
describe(".addCommand", function () {
it("should add an command", function () {
smartCliTestObject.addCommand({
commandName: "awesome"
});
});
});
describe(".standardTask", function () {
it("should start parsing a standardTask", function (done) {
smartCliTestObject.standardTask()
.then(() => {
console.log("this is the standard Task!");
});
done();
});
});
describe(".startParse", function () {
it("should start parsing the CLI input", function () {
smartCliTestObject.startParse();
});
});
});
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGVzdC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbInRlc3QudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBLFFBQU8sY0FBYyxDQUFDLENBQUE7QUFFdEIsTUFBTyxRQUFRLFdBQVcsZUFBZSxDQUFDLENBQUM7QUFDM0MsSUFBSSxTQUFTLEdBQUcsT0FBTyxDQUFDLFdBQVcsQ0FBQyxDQUFDO0FBQ3JDLElBQUksTUFBTSxHQUFHLE9BQU8sQ0FBQyxRQUFRLENBQUMsQ0FBQztBQUUvQixRQUFRLENBQUMseUJBQXlCLEVBQUM7SUFDL0IsSUFBSSxrQkFBb0MsQ0FBQztJQUN6QyxRQUFRLENBQUMsZ0JBQWdCLEVBQUM7UUFDdEIsRUFBRSxDQUFDLDhCQUE4QixFQUFDO1lBQzlCLGtCQUFrQixHQUFHLElBQUksUUFBUSxDQUFDLFFBQVEsRUFBRSxDQUFDO1lBQzdDLGtCQUFrQixDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUMsVUFBVSxDQUFDLFFBQVEsQ0FBQyxRQUFRLENBQUMsQ0FBQztRQUMvRCxDQUFDLENBQUMsQ0FBQztJQUNQLENBQUMsQ0FBQyxDQUFDO0lBQ0gsUUFBUSxDQUFDLGFBQWEsRUFBQztRQUNuQixFQUFFLENBQUMsdUJBQXVCLEVBQUM7WUFDdkIsa0JBQWtCLENBQUMsVUFBVSxDQUFDO2dCQUMxQixXQUFXLEVBQUMsU0FBUzthQUN4QixDQUFDLENBQUM7UUFFUCxDQUFDLENBQUMsQ0FBQztJQUNQLENBQUMsQ0FBQyxDQUFDO0lBQ0gsUUFBUSxDQUFDLGVBQWUsRUFBQztRQUNyQixFQUFFLENBQUMscUNBQXFDLEVBQUMsVUFBUyxJQUFJO1lBQ2xELGtCQUFrQixDQUFDLFlBQVksRUFBRTtpQkFDNUIsSUFBSSxDQUFDO2dCQUNGLE9BQU8sQ0FBQyxHQUFHLENBQUMsNEJBQTRCLENBQUMsQ0FBQztZQUM5QyxDQUFDLENBQUMsQ0FBQztZQUNQLElBQUksRUFBRSxDQUFDO1FBQ1gsQ0FBQyxDQUFDLENBQUE7SUFDTixDQUFDLENBQUMsQ0FBQTtJQUNGLFFBQVEsQ0FBQyxhQUFhLEVBQUM7UUFDbkIsRUFBRSxDQUFDLG9DQUFvQyxFQUFDO1lBQ3BDLGtCQUFrQixDQUFDLFVBQVUsRUFBRSxDQUFDO1FBQ3BDLENBQUMsQ0FBQyxDQUFBO0lBQ04sQ0FBQyxDQUFDLENBQUE7QUFDTixDQUFDLENBQUMsQ0FBQyJ9

1
test/test.js.map Normal file
View File

@ -0,0 +1 @@
{"version":3,"file":"test.js","sourceRoot":"","sources":["test.ts"],"names":[],"mappings":"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"}

37
test/test.ts Normal file
View File

@ -0,0 +1,37 @@
import "typings-test";
import smartcli = require("../dist/index");
let beautylog = require("beautylog");
let should = require("should");
describe("smartcli.Smartcli class",function(){
let smartCliTestObject:smartcli.Smartcli;
describe("new Smartcli()",function(){
it("should create a new Smartcli",function(){
smartCliTestObject = new smartcli.Smartcli();
smartCliTestObject.should.be.instanceof(smartcli.Smartcli);
});
});
describe(".addCommand",function(){
it("should add an command",function(){
smartCliTestObject.addCommand({
commandName:"awesome"
});
});
});
describe(".standardTask",function(){
it("should start parsing a standardTask",function(done){
smartCliTestObject.standardTask()
.then(() => {
console.log("this is the standard Task!");
});
done();
})
})
describe(".startParse",function(){
it("should start parsing the CLI input",function(){
smartCliTestObject.startParse();
})
})
});

View File

@ -1,25 +0,0 @@
// import gulp
var gulp = require("gulp"),
gulpTypescript = require("gulp-typescript");
gulp.task('compileTS', function() {
var stream = gulp.src('../index.ts')
.pipe(gulpTypescript({
out: "index.js"
}))
.pipe(gulp.dest("../../"));
return stream;
});
gulp.task('compileTestTS', function() {
var stream = gulp.src('../test.ts')
.pipe(gulpTypescript({
out: "test.js"
}))
.pipe(gulp.dest("../../"));
return stream;
});
gulp.task('default',['compileTS','compileTestTS'], function() {
console.log('Typescript compiled');
});

View File

@ -1,2 +0,0 @@
# How to compile.
Make sure gulp and gulp-taypescript from npm are available. Then run the gulpfile in this directory.

View File

@ -1,133 +1,4 @@
/// <reference path="typings/tsd.d.ts" />
import "typings-global";
var path = require("path");
var beautylog = require("beautylog");
var cliff = require("cliff");
var inquirer = require("inquirer");
var argv = require('yargs').argv;
//define the smartcli object
var smartcli:any = {};
//add plugins from above for direct use
smartcli.inquirer = inquirer;
smartcli.cliff = cliff;
smartcli.argv = argv;
/* ------------------------------------------------------------------------------
*----------------------- initial call CLI args -----------------------------
*----------------------------------------------------------------------------- */
// commands
smartcli.checkCommand = function(commandString:string):boolean {
if (argv._.indexOf(commandString) != -1) {
return true
}
return false;
};
smartcli.getCommands = function ():string[] {
return argv._;
};
// options
smartcli.checkOption = function(optionParam:string):boolean {
if (argv.hasOwnProperty(optionParam)) {
return true;
}
return false
};
smartcli.getOptionValue = function(optionParam:string):any {
if (smartcli.checkOption(optionParam)) {
return argv[optionParam]
}
return false;
};
smartcli.getOptions = function() {
var options = {};
for (var key in argv) {
if (key != "_") {
options['key'] = argv['key'];
}
}
return options;
};
/**
* returns the current working directory
* @returns {string}
*/
smartcli.getCwd = function () {
return process.cwd();
};
/* ------------------------------------------------------------------------------
*----------------------- in program CLI interaction -----------------------------
*----------------------------------------------------------------------------- */
/**
* executes callback with answer to question as argument
* @param questionString the question you want to ask the user
* @param cb the function to execute with answer as param
* @returns {null}
*/
smartcli.getAnswer = function(questionString:string, cb) {
if (typeof questionString != 'string') {
beautylog.error('no question specified');
return null;
}
//make inquirer compatible question object
var question = {
type: "input",
name: "userFeedback",
message: questionString,
validate: function( value ) {
return true;
}
};
inquirer.prompt([question],function(answers){
var answer = answers.userFeedback;
cb(answer);
});
};
/**
*
* @param questionString
* @param choiceOptions
* @param cb
* @returns {null}
*/
smartcli.getChoice = function(questionString:string, choiceOptions:string[], cb) {
if(!Array.isArray(choiceOptions)) {
return null;
}
//make inquirer compatible question object
var question = {
type: "list",
name: "userFeedback",
message: questionString,
choices: choiceOptions,
filter: function( val ) { return val.toLowerCase(); }
};
inquirer.prompt(question,function(answers){
var answer = answers.userFeedback;
cb(answer);
});
};
module.exports = smartcli;
import {Smartcli} from "./smartcli.classes.smartcli";
export {Smartcli} from "./smartcli.classes.smartcli";

View File

@ -0,0 +1,60 @@
import "typings-global";
import * as plugins from "./smartcli.plugins";
/**
* allows to specify an user interaction during runtime
*/
export type questionType = "input" | "confirm" | "list" | "rawlist" | "expand" | "checkbox" | "password" | "editor"
export interface choiceObject {
name: string;
value: any
}
export interface validateFunction {
(any):boolean
}
export class Interaction {
constructor() {
};
askQuestion(optionsArg: {
type: questionType,
message: string
default: any
choices: string[] | choiceObject[];
validate: validateFunction
}) {
let done = plugins.q.defer();
plugins.inquirer.prompt([{
type: optionsArg.type,
message: optionsArg.message,
default: optionsArg.default,
choices:optionsArg.choices,
validate: optionsArg.validate
}]).then(answers => {
done.resolve(answers);
});
};
askQuestionArray
}
export class QuestionTree {
constructor(questionString: string, optionsArray) {
};
};
export class QuestionTreeNode {
constructor() {
}
};
export class QuestionStorage {
constructor() {
}
}

View File

@ -0,0 +1,118 @@
import "typings-global";
import * as plugins from "./smartcli.plugins";
import * as interaction from "./smartcli.classes.interaction";
// import classes
import {Objectmap} from "lik";
// interfaces
export interface commandPromiseObject {
commandName:string;
promise: plugins.q.Promise<any>;
};
export class Smartcli {
argv:any;
questionsDone;
parseStarted;
commands;
questions;
version:string;
// maps
allCommandPromises = new Objectmap<commandPromiseObject>();
constructor(){
this.argv = plugins.yargs;
this.questionsDone = plugins.q.defer();
this.parseStarted = plugins.q.defer();
};
/**
* adds an alias, meaning one equals the other in terms of triggering associated commands
*/
addAlias(keyArg,aliasArg):void {
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(definitionArg:{commandName:string}):plugins.q.Promise<any>{
let done = plugins.q.defer<any>();
this.parseStarted.promise
.then(() => {
if (this.argv._.indexOf(definitionArg.commandName) == 0) {
done.resolve(this.argv);
} else {
done.reject(this.argv);
}
});
return done.promise;
};
/**
* gets a Promise for a command word
*/
getCommandPromiseByName(commandNameArg:string){
return this.allCommandPromises.find(commandPromiseObjectArg => {
return commandPromiseObjectArg.commandName === commandNameArg;
}).promise;
};
/**
* allows to specify help text to be printed above the rest of the help text
*/
addHelp(optionsArg:{
helpText:string
}){
this.addCommand({
commandName:"help"
}).then(argvArg => {
plugins.beautylog.log(optionsArg.helpText);
})
};
/**
* specify version to be printed for -v --version
*/
addVersion(versionArg:string){
this.version = versionArg;
this.addAlias("v","version");
this.parseStarted.promise
.then(() => {
if(this.argv.v){
console.log(this.version);
}
})
};
/**
* returns promise that is resolved when no commands are specified
*/
standardTask():plugins.q.Promise<any>{
let done = plugins.q.defer<any>();
this.parseStarted.promise
.then(() => {
if(this.argv._.length == 0 && !this.argv.v){
done.resolve(this.argv);
} else {
done.reject(this.argv);
};
});
return done.promise;
}
/**
* start the process of evaluating commands
*/
startParse():void{
this.argv = this.argv.argv;
this.parseStarted.resolve();
return;
}
}

10
ts/smartcli.plugins.ts Normal file
View File

@ -0,0 +1,10 @@
import "typings-global";
export import yargs = require('yargs');
export import beautylog = require("beautylog");
export import cliff = require("cliff");
export import inquirer = require("inquirer");
export import lik = require("lik");
export import path = require("path");
export import q = require("q");
export import smartparam = require("smartparam");

View File

@ -1,40 +0,0 @@
/// <reference path="typings/tsd.d.ts" />
var smartcli = require("./index.js");
var bl = require("beautylog");
bl.log('now starting Test');
bl.log('starting with initial CLI commands and options');
var commandsString:string = 'You specified the following commands:';
var commands = smartcli.getCommands();
for (var key in commands) {
commandsString = commandsString + ' ' + commands[key];
}
bl.log(commandsString);
if (smartcli.checkCommand('jazz')) {
bl.log('One of your commands is jazz');
} else {
bl.log('None of your commands is jazz');
}
var getAnswerTest = function() {
smartcli.getAnswer('How do you feel?',function(answer){
console.log('The answer is: ' + answer);
getChoiceTest();
});
};
var getChoiceTest = function() {
smartcli.getChoice('What music do you like to hear?',['Jazz','Blues','Classical'],function(answer){
console.log('The answer is: ' + answer);
getCwdTest();
});
};
var getCwdTest = function(){
console.log('The current directory is: ' + smartcli.getCwd());
};
getAnswerTest();

View File

@ -1,12 +0,0 @@
{
"version": "v4",
"repo": "borisyankov/DefinitelyTyped",
"ref": "master",
"path": "typings",
"bundle": "typings/tsd.d.ts",
"installed": {
"node/node.d.ts": {
"commit": "efa0c1196d7280640e624ac1e7fa604502e7bd63"
}
}
}

File diff suppressed because it is too large Load Diff

1
ts/typings/tsd.d.ts vendored
View File

@ -1 +0,0 @@
/// <reference path="node/node.d.ts" />