Compare commits

...

3 Commits

Author SHA1 Message Date
4130ab55e2 1.0.2 2017-03-10 22:08:09 +01:00
2d3a4b0a0e add smart sourcing of files with bash 2017-03-10 22:08:04 +01:00
a91938e463 bootstrap Smartshell class 2017-03-10 20:14:40 +01:00
13 changed files with 290 additions and 48 deletions

10
dist/index.d.ts vendored
View File

@ -1,8 +1,2 @@
export interface IExecResult { export * from './smartshell.wrap';
exitCode: number; export * from './smartshell.classes.smartshell';
stdout: string;
}
export declare let exec: (commandStringArg: string) => Promise<IExecResult>;
export declare let execSilent: (commandStringArg: string) => Promise<IExecResult>;
export declare let execSync: () => void;
export declare let execSyncSilent: () => void;

28
dist/index.js vendored
View File

@ -1,24 +1,8 @@
"use strict"; "use strict";
function __export(m) {
for (var p in m) if (!exports.hasOwnProperty(p)) exports[p] = m[p];
}
Object.defineProperty(exports, "__esModule", { value: true }); Object.defineProperty(exports, "__esModule", { value: true });
const plugins = require("./smartshell.plugins"); __export(require("./smartshell.wrap"));
exports.exec = (commandStringArg) => { __export(require("./smartshell.classes.smartshell"));
let done = plugins.smartq.defer(); //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi90cy9pbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7OztBQUFBLHVDQUFpQztBQUNqQyxxREFBK0MifQ==
plugins.shelljs.exec(commandStringArg, { async: true }, (code, stdout, stderr) => {
done.resolve({
exitCode: code,
stdout: stdout
});
});
return done.promise;
};
exports.execSilent = (commandStringArg) => {
let done = plugins.smartq.defer();
plugins.shelljs.exec(commandStringArg, {}, () => {
});
return done.promise;
};
exports.execSync = () => {
};
exports.execSyncSilent = () => {
};
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi90cy9pbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOztBQUFBLGdEQUErQztBQVNwQyxRQUFBLElBQUksR0FBRyxDQUFDLGdCQUF3QjtJQUN6QyxJQUFJLElBQUksR0FBRyxPQUFPLENBQUMsTUFBTSxDQUFDLEtBQUssRUFBZSxDQUFBO0lBQzlDLE9BQU8sQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLGdCQUFnQixFQUFDLEVBQUMsS0FBSyxFQUFFLElBQUksRUFBQyxFQUFFLENBQUMsSUFBSSxFQUFFLE1BQU0sRUFBRSxNQUFNO1FBQ3hFLElBQUksQ0FBQyxPQUFPLENBQUM7WUFDWCxRQUFRLEVBQUUsSUFBSTtZQUNkLE1BQU0sRUFBRSxNQUFNO1NBQ2YsQ0FBQyxDQUFBO0lBQ0osQ0FBQyxDQUFDLENBQUE7SUFDRixNQUFNLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQTtBQUNyQixDQUFDLENBQUE7QUFFVSxRQUFBLFVBQVUsR0FBRyxDQUFDLGdCQUF3QjtJQUMvQyxJQUFJLElBQUksR0FBRyxPQUFPLENBQUMsTUFBTSxDQUFDLEtBQUssRUFBZSxDQUFBO0lBQzlDLE9BQU8sQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLGdCQUFnQixFQUFDLEVBQUUsRUFBRTtJQUUxQyxDQUFDLENBQUMsQ0FBQTtJQUNGLE1BQU0sQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFBO0FBQ3JCLENBQUMsQ0FBQTtBQUVVLFFBQUEsUUFBUSxHQUFHO0FBRXRCLENBQUMsQ0FBQTtBQUVVLFFBQUEsY0FBYyxHQUFHO0FBRTVCLENBQUMsQ0FBQSJ9

23
dist/smartshell.classes.smartshell.d.ts vendored Normal file
View File

@ -0,0 +1,23 @@
import * as smartshellWrap from './smartshell.wrap';
export declare type TExecutor = 'sh' | 'bash';
export interface ISmartshellContructorOptions {
executor: TExecutor;
sourceFilePaths: string[];
}
export declare class Smartshell {
executor: TExecutor;
sourceFileArray: string[];
constructor(optionsArg: ISmartshellContructorOptions);
addSourceFiles(sourceFilePathsArray: string[]): void;
cleanSourceFiles(): void;
/**
* executes silently and returns IExecResult
* @param commandArg
*/
execSilent(commandArg: string): Promise<smartshellWrap.IExecResult>;
/**
* creates the final sourcing string
* @param commandArg
*/
private createExecString(commandArg);
}

46
dist/smartshell.classes.smartshell.js vendored Normal file
View File

@ -0,0 +1,46 @@
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
const smartshellWrap = require("./smartshell.wrap");
class Smartshell {
constructor(optionsArg) {
this.sourceFileArray = [];
this.executor = optionsArg.executor;
for (let sourceFilePath of optionsArg.sourceFilePaths) {
this.sourceFileArray.push(sourceFilePath);
}
}
addSourceFiles(sourceFilePathsArray) {
for (let sourceFilePath of sourceFilePathsArray) {
this.sourceFileArray.push(sourceFilePath);
}
}
cleanSourceFiles() {
this.sourceFileArray = [];
}
/**
* executes silently and returns IExecResult
* @param commandArg
*/
execSilent(commandArg) {
let execCommand = this.createExecString(commandArg);
return smartshellWrap.execSilent(commandArg);
}
/**
* creates the final sourcing string
* @param commandArg
*/
createExecString(commandArg) {
if (this.executor === 'bash') {
let sourceString = '';
for (let sourceFilePath of this.sourceFileArray) {
sourceString = sourceString + `source ${sourceFilePath} && `;
}
return `bash -c '${sourceString} ${commandArg}'`;
}
else {
return commandArg;
}
}
}
exports.Smartshell = Smartshell;
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic21hcnRzaGVsbC5jbGFzc2VzLnNtYXJ0c2hlbGwuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi90cy9zbWFydHNoZWxsLmNsYXNzZXMuc21hcnRzaGVsbC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOztBQUNBLG9EQUFtRDtBQVVuRDtJQUdFLFlBQWEsVUFBd0M7UUFEckQsb0JBQWUsR0FBYSxFQUFFLENBQUE7UUFFNUIsSUFBSSxDQUFDLFFBQVEsR0FBRyxVQUFVLENBQUMsUUFBUSxDQUFBO1FBQ25DLEdBQUcsQ0FBQyxDQUFDLElBQUksY0FBYyxJQUFJLFVBQVUsQ0FBQyxlQUFlLENBQUMsQ0FBQyxDQUFDO1lBQ3RELElBQUksQ0FBQyxlQUFlLENBQUMsSUFBSSxDQUFDLGNBQWMsQ0FBQyxDQUFBO1FBQzNDLENBQUM7SUFDSCxDQUFDO0lBRUQsY0FBYyxDQUFDLG9CQUE4QjtRQUMzQyxHQUFHLENBQUEsQ0FBQyxJQUFJLGNBQWMsSUFBSSxvQkFBb0IsQ0FBQyxDQUFDLENBQUM7WUFDL0MsSUFBSSxDQUFDLGVBQWUsQ0FBQyxJQUFJLENBQUMsY0FBYyxDQUFDLENBQUE7UUFDM0MsQ0FBQztJQUNILENBQUM7SUFFRCxnQkFBZ0I7UUFDZCxJQUFJLENBQUMsZUFBZSxHQUFHLEVBQUUsQ0FBQTtJQUMzQixDQUFDO0lBRUQ7OztPQUdHO0lBQ0gsVUFBVSxDQUFDLFVBQWtCO1FBQzNCLElBQUksV0FBVyxHQUFHLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxVQUFVLENBQUMsQ0FBQTtRQUNuRCxNQUFNLENBQUMsY0FBYyxDQUFDLFVBQVUsQ0FBQyxVQUFVLENBQUMsQ0FBQTtJQUM5QyxDQUFDO0lBRUQ7OztPQUdHO0lBQ0ssZ0JBQWdCLENBQUUsVUFBVTtRQUNsQyxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsUUFBUSxLQUFLLE1BQU0sQ0FBQyxDQUFDLENBQUM7WUFDN0IsSUFBSSxZQUFZLEdBQUcsRUFBRSxDQUFBO1lBQ3JCLEdBQUcsQ0FBQyxDQUFDLElBQUksY0FBYyxJQUFJLElBQUksQ0FBQyxlQUFlLENBQUMsQ0FBQyxDQUFDO2dCQUNoRCxZQUFZLEdBQUcsWUFBWSxHQUFHLFVBQVUsY0FBYyxNQUFNLENBQUE7WUFDOUQsQ0FBQztZQUNELE1BQU0sQ0FBQyxZQUFZLFlBQVksSUFBSSxVQUFVLEdBQUcsQ0FBQTtRQUNsRCxDQUFDO1FBQUMsSUFBSSxDQUFDLENBQUM7WUFDTixNQUFNLENBQUMsVUFBVSxDQUFBO1FBQ25CLENBQUM7SUFDSCxDQUFDO0NBQ0Y7QUE1Q0QsZ0NBNENDIn0=

27
dist/smartshell.wrap.d.ts vendored Normal file
View File

@ -0,0 +1,27 @@
/// <reference types="node" />
import { ChildProcess } from 'child_process';
export interface IExecResult {
exitCode: number;
stdout: string;
}
export interface IExecResultStreaming {
childProcess: ChildProcess;
finalPromise: Promise<IExecResult>;
}
/**
* executes a given command async
* @param commandStringArg
*/
export declare let exec: (commandStringArg: string) => Promise<IExecResult>;
/**
* executes a given command async and silent
* @param commandStringArg
*/
export declare let execSilent: (commandStringArg: string) => Promise<IExecResult>;
/**
* executes a command and allws you to stream output
*/
export declare let execStreaming: (commandStringArg: string) => {
childProcess: ChildProcess;
finalPromise: Promise<IExecResult>;
};

48
dist/smartshell.wrap.js vendored Normal file
View File

@ -0,0 +1,48 @@
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
const plugins = require("./smartshell.plugins");
/**
* executes a given command async
* @param commandStringArg
*/
exports.exec = (commandStringArg) => {
let done = plugins.smartq.defer();
plugins.shelljs.exec(commandStringArg, { async: true }, (code, stdout, stderr) => {
done.resolve({
exitCode: code,
stdout: stdout
});
});
return done.promise;
};
/**
* executes a given command async and silent
* @param commandStringArg
*/
exports.execSilent = (commandStringArg) => {
let done = plugins.smartq.defer();
plugins.shelljs.exec(commandStringArg, { async: true, silent: true }, (code, stdout, stderr) => {
done.resolve({
exitCode: code,
stdout: stdout
});
});
return done.promise;
};
/**
* executes a command and allws you to stream output
*/
exports.execStreaming = (commandStringArg) => {
let childProcessEnded = plugins.smartq.defer();
let execChildProcess = plugins.shelljs.exec(commandStringArg, { async: true, silent: true }, (code, stdout, stderr) => {
childProcessEnded.resolve({
exitCode: code,
stdout: stdout
});
});
return {
childProcess: execChildProcess,
finalPromise: childProcessEnded.promise
};
};
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic21hcnRzaGVsbC53cmFwLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vdHMvc21hcnRzaGVsbC53cmFwLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7O0FBQUEsZ0RBQStDO0FBZ0IvQzs7O0dBR0c7QUFDUSxRQUFBLElBQUksR0FBRyxDQUFDLGdCQUF3QjtJQUN6QyxJQUFJLElBQUksR0FBRyxPQUFPLENBQUMsTUFBTSxDQUFDLEtBQUssRUFBZSxDQUFBO0lBQzlDLE9BQU8sQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLGdCQUFnQixFQUFFLEVBQUUsS0FBSyxFQUFFLElBQUksRUFBRSxFQUFFLENBQUMsSUFBSSxFQUFFLE1BQU0sRUFBRSxNQUFNO1FBQzNFLElBQUksQ0FBQyxPQUFPLENBQUM7WUFDWCxRQUFRLEVBQUUsSUFBSTtZQUNkLE1BQU0sRUFBRSxNQUFNO1NBQ2YsQ0FBQyxDQUFBO0lBQ0osQ0FBQyxDQUFDLENBQUE7SUFDRixNQUFNLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQTtBQUNyQixDQUFDLENBQUE7QUFFRDs7O0dBR0c7QUFDUSxRQUFBLFVBQVUsR0FBRyxDQUFDLGdCQUF3QjtJQUMvQyxJQUFJLElBQUksR0FBRyxPQUFPLENBQUMsTUFBTSxDQUFDLEtBQUssRUFBZSxDQUFBO0lBQzlDLE9BQU8sQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLGdCQUFnQixFQUFFLEVBQUUsS0FBSyxFQUFFLElBQUksRUFBRSxNQUFNLEVBQUUsSUFBSSxFQUFFLEVBQUUsQ0FBQyxJQUFJLEVBQUUsTUFBTSxFQUFFLE1BQU07UUFDekYsSUFBSSxDQUFDLE9BQU8sQ0FBQztZQUNYLFFBQVEsRUFBRSxJQUFJO1lBQ2QsTUFBTSxFQUFFLE1BQU07U0FDZixDQUFDLENBQUE7SUFDSixDQUFDLENBQUMsQ0FBQTtJQUNGLE1BQU0sQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFBO0FBQ3JCLENBQUMsQ0FBQTtBQUVEOztHQUVHO0FBQ1EsUUFBQSxhQUFhLEdBQUcsQ0FBQyxnQkFBd0I7SUFDbEQsSUFBSSxpQkFBaUIsR0FBRyxPQUFPLENBQUMsTUFBTSxDQUFDLEtBQUssRUFBZSxDQUFBO0lBQzNELElBQUksZ0JBQWdCLEdBQUcsT0FBTyxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsZ0JBQWdCLEVBQUUsRUFBQyxLQUFLLEVBQUUsSUFBSSxFQUFFLE1BQU0sRUFBRSxJQUFJLEVBQUMsRUFBRSxDQUFDLElBQUksRUFBRSxNQUFNLEVBQUUsTUFBTTtRQUM5RyxpQkFBaUIsQ0FBQyxPQUFPLENBQUM7WUFDeEIsUUFBUSxFQUFFLElBQUk7WUFDZCxNQUFNLEVBQUUsTUFBTTtTQUNmLENBQUMsQ0FBQTtJQUNKLENBQUMsQ0FBQyxDQUFBO0lBQ0YsTUFBTSxDQUFDO1FBQ0wsWUFBWSxFQUFFLGdCQUFnQjtRQUM5QixZQUFZLEVBQUUsaUJBQWlCLENBQUMsT0FBTztLQUN4QyxDQUFBO0FBQ0gsQ0FBQyxDQUFBIn0=

View File

@ -1,6 +1,6 @@
{ {
"name": "smartshell", "name": "smartshell",
"version": "1.0.1", "version": "1.0.2",
"description": "shell actions designed as promises", "description": "shell actions designed as promises",
"main": "dist/index.js", "main": "dist/index.js",
"typings": "dist/index.d.ts", "typings": "dist/index.d.ts",

View File

@ -1,13 +1,34 @@
"use strict"; "use strict";
Object.defineProperty(exports, "__esModule", { value: true }); Object.defineProperty(exports, "__esModule", { value: true });
require("typings-test"); require("typings-test");
const smartchai_1 = require("smartchai");
const smartshell = require("../dist/index"); const smartshell = require("../dist/index");
let testSmartshell;
describe('smartshell', function () { describe('smartshell', function () {
it('it should run async', function () { it('it should run async', function () {
this.timeout(1000000); this.timeout(1000000);
return smartshell.exec('npmdocker speedtest').then((execResult) => { return smartshell.exec('npm -v').then((execResult) => {
console.log(execResult.stdout); smartchai_1.expect(execResult.stdout).to.match(/[0-9\.]*/);
}); });
}); });
it('should run async and silent', function () {
return smartshell.execSilent('npm -v').then((execResult) => {
smartchai_1.expect(execResult.stdout).to.match(/[0-9\.]*/);
});
});
it('should stream a shell execution', function () {
let execStreamingResponse = smartshell.execStreaming('npm -v');
execStreamingResponse.childProcess.stdout.on('data', (data) => {
console.log('Received ' + data);
});
return execStreamingResponse.finalPromise;
});
it('should create a Smartshell instance', function () {
testSmartshell = new smartshell.Smartshell({
executor: 'bash',
sourceFilePaths: []
});
smartchai_1.expect(testSmartshell).to.be.instanceof(smartshell.Smartshell);
});
}); });
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGVzdC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbInRlc3QudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7QUFBQSx3QkFBcUI7QUFHckIsNENBQTJDO0FBRTNDLFFBQVEsQ0FBQyxZQUFZLEVBQUU7SUFDbkIsRUFBRSxDQUFDLHFCQUFxQixFQUFFO1FBQ3RCLElBQUksQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLENBQUE7UUFDckIsTUFBTSxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMscUJBQXFCLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxVQUFVO1lBQzFELE9BQU8sQ0FBQyxHQUFHLENBQUMsVUFBVSxDQUFDLE1BQU0sQ0FBQyxDQUFBO1FBQ2xDLENBQUMsQ0FBQyxDQUFBO0lBQ04sQ0FBQyxDQUFDLENBQUE7QUFDTixDQUFDLENBQUMsQ0FBQSJ9 //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGVzdC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbInRlc3QudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7QUFBQSx3QkFBcUI7QUFDckIseUNBQWtDO0FBRWxDLDRDQUEyQztBQUUzQyxJQUFJLGNBQXFDLENBQUE7QUFFekMsUUFBUSxDQUFDLFlBQVksRUFBRTtJQUNyQixFQUFFLENBQUMscUJBQXFCLEVBQUU7UUFDeEIsSUFBSSxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsQ0FBQTtRQUNyQixNQUFNLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxVQUFVO1lBQy9DLGtCQUFNLENBQUMsVUFBVSxDQUFDLE1BQU0sQ0FBQyxDQUFDLEVBQUUsQ0FBQyxLQUFLLENBQUMsVUFBVSxDQUFDLENBQUE7UUFDaEQsQ0FBQyxDQUFDLENBQUE7SUFDSixDQUFDLENBQUMsQ0FBQTtJQUNGLEVBQUUsQ0FBQyw2QkFBNkIsRUFBRTtRQUNoQyxNQUFNLENBQUMsVUFBVSxDQUFDLFVBQVUsQ0FBQyxRQUFRLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxVQUFVO1lBQ3JELGtCQUFNLENBQUMsVUFBVSxDQUFDLE1BQU0sQ0FBQyxDQUFDLEVBQUUsQ0FBQyxLQUFLLENBQUMsVUFBVSxDQUFDLENBQUE7UUFDaEQsQ0FBQyxDQUFDLENBQUE7SUFDSixDQUFDLENBQUMsQ0FBQTtJQUNGLEVBQUUsQ0FBQyxpQ0FBaUMsRUFBRTtRQUNwQyxJQUFJLHFCQUFxQixHQUFHLFVBQVUsQ0FBQyxhQUFhLENBQUMsUUFBUSxDQUFDLENBQUE7UUFDOUQscUJBQXFCLENBQUMsWUFBWSxDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUMsTUFBTSxFQUFFLENBQUMsSUFBSTtZQUN4RCxPQUFPLENBQUMsR0FBRyxDQUFDLFdBQVcsR0FBRyxJQUFJLENBQUMsQ0FBQTtRQUNqQyxDQUFDLENBQUMsQ0FBQTtRQUNGLE1BQU0sQ0FBQyxxQkFBcUIsQ0FBQyxZQUFZLENBQUE7SUFDM0MsQ0FBQyxDQUFDLENBQUE7SUFDRixFQUFFLENBQUMscUNBQXFDLEVBQUU7UUFDeEMsY0FBYyxHQUFHLElBQUksVUFBVSxDQUFDLFVBQVUsQ0FBQztZQUN6QyxRQUFRLEVBQUUsTUFBTTtZQUNoQixlQUFlLEVBQUUsRUFBRTtTQUNwQixDQUFDLENBQUE7UUFDRixrQkFBTSxDQUFDLGNBQWMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsVUFBVSxDQUFDLFVBQVUsQ0FBQyxVQUFVLENBQUMsQ0FBQTtJQUNoRSxDQUFDLENBQUMsQ0FBQTtBQUNKLENBQUMsQ0FBQyxDQUFBIn0=

View File

@ -3,11 +3,32 @@ import { expect } from 'smartchai'
import * as smartshell from '../dist/index' import * as smartshell from '../dist/index'
describe('smartshell', function() { let testSmartshell: smartshell.Smartshell
it('it should run async', function() {
this.timeout(1000000) describe('smartshell', function () {
return smartshell.exec('npmdocker speedtest').then((execResult) => { it('it should run async', function () {
console.log(execResult.stdout) this.timeout(1000000)
}) return smartshell.exec('npm -v').then((execResult) => {
expect(execResult.stdout).to.match(/[0-9\.]*/)
}) })
}) })
it('should run async and silent', function () {
return smartshell.execSilent('npm -v').then((execResult) => {
expect(execResult.stdout).to.match(/[0-9\.]*/)
})
})
it('should stream a shell execution', function () {
let execStreamingResponse = smartshell.execStreaming('npm -v')
execStreamingResponse.childProcess.stdout.on('data', (data) => {
console.log('Received ' + data)
})
return execStreamingResponse.finalPromise
})
it('should create a Smartshell instance', function () {
testSmartshell = new smartshell.Smartshell({
executor: 'bash',
sourceFilePaths: []
})
expect(testSmartshell).to.be.instanceof(smartshell.Smartshell)
})
})

View File

@ -1 +1,2 @@
export * from './smartshell.wrap' export * from './smartshell.wrap'
export * from './smartshell.classes.smartshell'

View File

@ -4,13 +4,53 @@ import * as smartshellWrap from './smartshell.wrap'
export type TExecutor = 'sh' | 'bash' export type TExecutor = 'sh' | 'bash'
export interface ISmartshellContructorOptions { export interface ISmartshellContructorOptions {
executor: TExecutor executor: TExecutor
sourceFiles: string[] sourceFilePaths: string[]
} }
export class Smartshell { export class Smartshell {
constructor() { executor: TExecutor
sourceFileArray: string[] = []
constructor (optionsArg: ISmartshellContructorOptions) {
this.executor = optionsArg.executor
for (let sourceFilePath of optionsArg.sourceFilePaths) {
this.sourceFileArray.push(sourceFilePath)
} }
} }
addSourceFiles(sourceFilePathsArray: string[]) {
for(let sourceFilePath of sourceFilePathsArray) {
this.sourceFileArray.push(sourceFilePath)
}
}
cleanSourceFiles () {
this.sourceFileArray = []
}
/**
* executes silently and returns IExecResult
* @param commandArg
*/
execSilent(commandArg: string) {
let execCommand = this.createExecString(commandArg)
return smartshellWrap.execSilent(commandArg)
}
/**
* creates the final sourcing string
* @param commandArg
*/
private createExecString (commandArg): string {
if (this.executor === 'bash') {
let sourceString = ''
for (let sourceFilePath of this.sourceFileArray) {
sourceString = sourceString + `source ${sourceFilePath} && `
}
return `bash -c '${sourceString} ${commandArg}'`
} else {
return commandArg
}
}
}

View File

@ -1,13 +1,26 @@
import * as plugins from './smartshell.plugins' import * as plugins from './smartshell.plugins'
// interfaces
import { ChildProcess } from 'child_process'
import { Deferred } from 'smartq'
export interface IExecResult { export interface IExecResult {
exitCode: number, exitCode: number,
stdout: string stdout: string
} }
export interface IExecResultStreaming {
childProcess: ChildProcess,
finalPromise: Promise<IExecResult>
}
/**
* executes a given command async
* @param commandStringArg
*/
export let exec = (commandStringArg: string): Promise<IExecResult> => { export let exec = (commandStringArg: string): Promise<IExecResult> => {
let done = plugins.smartq.defer<IExecResult>() let done = plugins.smartq.defer<IExecResult>()
plugins.shelljs.exec(commandStringArg,{async: true}, (code, stdout, stderr) => { plugins.shelljs.exec(commandStringArg, { async: true }, (code, stdout, stderr) => {
done.resolve({ done.resolve({
exitCode: code, exitCode: code,
stdout: stdout stdout: stdout
@ -16,9 +29,13 @@ export let exec = (commandStringArg: string): Promise<IExecResult> => {
return done.promise return done.promise
} }
/**
* executes a given command async and silent
* @param commandStringArg
*/
export let execSilent = (commandStringArg: string) => { export let execSilent = (commandStringArg: string) => {
let done = plugins.smartq.defer<IExecResult>() let done = plugins.smartq.defer<IExecResult>()
plugins.shelljs.exec(commandStringArg,{async: true, silent: true}, (code, stdout, stderr) => { plugins.shelljs.exec(commandStringArg, { async: true, silent: true }, (code, stdout, stderr) => {
done.resolve({ done.resolve({
exitCode: code, exitCode: code,
stdout: stdout stdout: stdout
@ -26,3 +43,20 @@ export let execSilent = (commandStringArg: string) => {
}) })
return done.promise return done.promise
} }
/**
* executes a command and allws you to stream output
*/
export let execStreaming = (commandStringArg: string) => {
let childProcessEnded = plugins.smartq.defer<IExecResult>()
let execChildProcess = plugins.shelljs.exec(commandStringArg, {async: true, silent: true}, (code, stdout, stderr) => {
childProcessEnded.resolve({
exitCode: code,
stdout: stdout
})
})
return {
childProcess: execChildProcess,
finalPromise: childProcessEnded.promise
}
}

3
tslint.json Normal file
View File

@ -0,0 +1,3 @@
{
"extends": "tslint-config-standard"
}