Compare commits

..

23 Commits

Author SHA1 Message Date
8ceac74a1f 2.0.15 2019-05-19 22:41:20 +02:00
f63c4456bf fix(core): update 2019-05-19 22:41:20 +02:00
32c33cad5b 2.0.14 2019-05-14 17:28:38 +02:00
0758e58fa4 fix(core): update 2019-05-14 17:28:38 +02:00
e981ca6bdd 2.0.13 2018-12-14 18:36:23 +01:00
2853a48708 fix(core): update 2018-12-14 18:36:23 +01:00
389f8f4a52 2.0.12 2018-12-14 18:35:31 +01:00
c1a537f052 fix(core): update 2018-12-14 18:35:31 +01:00
4701341c0c ensure WSL compatibility 2018-12-13 16:50:32 +01:00
d5d347721a 2.0.11 2018-11-26 17:55:16 +01:00
6a047d6333 fix(core): update 2018-11-26 17:55:15 +01:00
6e7b4dd18e 2.0.10 2018-11-26 17:46:32 +01:00
debc5f1524 fix(core): update 2018-11-26 17:46:31 +01:00
8d03561762 2.0.9 2018-11-26 17:45:59 +01:00
f516a6e753 fix(core): update 2018-11-26 17:45:58 +01:00
1c4f6a8bf9 2.0.8 2018-10-28 19:18:42 +01:00
4fe3775904 fix(child processes): now run detached 2018-10-28 19:18:42 +01:00
dcee2d6233 2.0.7 2018-10-28 19:12:16 +01:00
39d457382f fix(exec): processes now run detached 2018-10-28 19:12:15 +01:00
e6ed457501 2.0.6 2018-08-05 23:27:38 +02:00
0a6484762c fix(ci): update testing framework 2018-08-05 23:27:37 +02:00
baa3e4e6e9 2.0.5 2018-08-04 16:43:02 +02:00
0d68361381 fix(PATH): add proper PATH handling for child processes 2018-08-04 16:43:02 +02:00
9 changed files with 1120 additions and 350 deletions

View File

@ -26,6 +26,7 @@ mirror:
snyk: snyk:
stage: security stage: security
script: script:
- npmci npm prepare
- npmci command npm install -g snyk - npmci command npm install -g snyk
- npmci command npm install --ignore-scripts - npmci command npm install --ignore-scripts
- npmci command snyk test - npmci command snyk test
@ -36,21 +37,11 @@ snyk:
# ==================== # ====================
# test stage # test stage
# ==================== # ====================
testLEGACY:
stage: test
script:
- npmci node install legacy
- npmci npm install
- npmci npm test
coverage: /\d+.?\d+?\%\s*coverage/
tags:
- docker
- notpriv
allow_failure: true
testLTS: testLTS:
stage: test stage: test
script: script:
- npmci npm prepare
- npmci node install lts - npmci node install lts
- npmci npm install - npmci npm install
- npmci npm test - npmci npm test
@ -62,6 +53,7 @@ testLTS:
testSTABLE: testSTABLE:
stage: test stage: test
script: script:
- npmci npm prepare
- npmci node install stable - npmci node install stable
- npmci npm install - npmci npm install
- npmci npm test - npmci npm test
@ -118,6 +110,7 @@ pages:
stage: metadata stage: metadata
script: script:
- npmci command npm install -g typedoc typescript - npmci command npm install -g typedoc typescript
- npmci npm prepare
- npmci npm install - npmci npm install
- npmci command typedoc --module "commonjs" --target "ES2016" --out public/ ts/ - npmci command typedoc --module "commonjs" --target "ES2016" --out public/ ts/
tags: tags:
@ -130,13 +123,3 @@ pages:
paths: paths:
- public - public
allow_failure: true 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

View File

@ -1,6 +1,7 @@
{ {
"npmci": { "npmci": {
"npmGlobalTools": [], "npmGlobalTools": [],
"npmAccessLevel": "public" "npmAccessLevel": "public",
"npmRegistryUrl": "registry.npmjs.org"
} }
} }

1290
package-lock.json generated

File diff suppressed because it is too large Load Diff

View File

@ -1,12 +1,12 @@
{ {
"name": "@pushrocks/smartshell", "name": "@pushrocks/smartshell",
"private": false, "private": false,
"version": "2.0.4", "version": "2.0.15",
"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",
"scripts": { "scripts": {
"test": "(tsrun test/test.ts)", "test": "(tstest test/)",
"build": "(tsbuild)" "build": "(tsbuild)"
}, },
"repository": { "repository": {
@ -24,13 +24,17 @@
}, },
"homepage": "https://gitlab.com/pushrocks/smartshell#README", "homepage": "https://gitlab.com/pushrocks/smartshell#README",
"devDependencies": { "devDependencies": {
"@gitzone/tsbuild": "^2.0.21", "@gitzone/tsbuild": "^2.1.11",
"@gitzone/tsrun": "^1.1.9", "@gitzone/tsrun": "^1.2.6",
"@pushrocks/tapbundle": "^3.0.1", "@gitzone/tstest": "^1.0.20",
"@types/node": "^10.5.2" "@pushrocks/tapbundle": "^3.0.9",
"@types/node": "^12.0.2",
"tslint": "^5.16.0",
"tslint-config-prettier": "^1.18.0"
}, },
"dependencies": { "dependencies": {
"@pushrocks/smartpromise": "^2.0.5", "@pushrocks/smartexit": "^1.0.7",
"@pushrocks/smartpromise": "^3.0.2",
"@types/which": "^1.3.1", "@types/which": "^1.3.1",
"which": "^1.3.1" "which": "^1.3.1"
} }

View File

@ -2,21 +2,58 @@ export type TExecutor = 'sh' | 'bash';
export interface IShellEnvContructorOptions { export interface IShellEnvContructorOptions {
executor: TExecutor; executor: TExecutor;
sourceFilePaths: string[]; sourceFilePaths?: string[];
pathDirectories?: string[];
} }
export class ShellEnv { export class ShellEnv {
executor: TExecutor; executor: TExecutor;
sourceFileArray: string[] = []; sourceFileArray: string[] = [];
pathDirArray: string[] = [];
/** /**
* constructor for the shellenv * constructor for the shellenv
*/ */
constructor(optionsArg: IShellEnvContructorOptions) { constructor(optionsArg: IShellEnvContructorOptions) {
this.executor = optionsArg.executor; this.executor = optionsArg.executor;
for (let sourceFilePath of optionsArg.sourceFilePaths) {
this.sourceFileArray.push(sourceFilePath); // add sourcefiles
if (optionsArg.sourceFilePaths) {
this.sourceFileArray = this.sourceFileArray.concat(optionsArg.sourceFilePaths);
} }
// add pathDirectories
if (optionsArg.pathDirectories) {
this.pathDirArray = this.pathDirArray.concat(optionsArg.pathDirectories);
}
}
/**
* imports path into the shell from env if available and returns it with
*/
private _setPath(commandStringArg): string {
let commandResult = commandStringArg;
let commandPaths: string[] = [];
commandPaths = commandPaths.concat(process.env.PATH.split(':'));
if (process.env.SMARTSHELL_PATH) {
commandPaths = commandPaths.concat(process.env.SMARTSHELL_PATH.split(':'));
}
// lets filter for unwanted paths
// Windows WSL
commandPaths = commandPaths.filter(commandPathArg => {
const filterResult =
!commandPathArg.startsWith('/mnt/c/') &&
!commandPathArg.startsWith('Files/1E') &&
!commandPathArg.includes(' ');
if (!filterResult) {
// console.log(`${commandPathArg} will be filtered!`);
}
return filterResult;
});
commandResult = `PATH=${commandPaths.join(':')} && ${commandStringArg}`;
return commandResult;
} }
/** /**
@ -36,15 +73,31 @@ export class ShellEnv {
this.sourceFileArray = []; this.sourceFileArray = [];
} }
createEnvExecString(commandArg): string { public createEnvExecString(commandArg: string): string {
if (this.executor === 'bash') { let commandResult = '';
let sourceString = ''; let sourceString = '';
for (let sourceFilePath of this.sourceFileArray) {
// deal with sourcestring
for (const sourceFilePath of this.sourceFileArray) {
sourceString = sourceString + `source ${sourceFilePath} && `; sourceString = sourceString + `source ${sourceFilePath} && `;
} }
return `bash -c '${sourceString} ${commandArg}'`;
} else { // deal with avaiable path
return commandArg; let pathString = 'PATH=$PATH';
} for (const pathDir of this.pathDirArray) {
pathString += `:${pathDir}`;
}
pathString += ` && `;
switch (this.executor) {
case 'bash':
commandResult = `bash -c '${pathString}${sourceString}${commandArg}'`;
break;
case 'sh':
commandResult = `${pathString}${sourceString}${commandArg}`;
break;
}
commandResult = this._setPath(commandResult);
return commandResult;
} }
} }

View File

@ -13,13 +13,7 @@ export class ShellLog {
*/ */
logToConsole(dataArg: string | Buffer): void { logToConsole(dataArg: string | Buffer): void {
// make sure we have the data as string // make sure we have the data as string
const dataString: string = (() => { process.stdout.write(dataArg);
if (Buffer.isBuffer(dataArg)) {
return dataArg.toString();
}
return dataArg;
})();
console.log(dataString);
} }
/** /**

View File

@ -21,29 +21,18 @@ export interface IExecResult {
export interface IExecResultStreaming { export interface IExecResultStreaming {
childProcess: cp.ChildProcess; childProcess: cp.ChildProcess;
finalPromise: Promise<IExecResult>; finalPromise: Promise<IExecResult>;
kill: () => void;
} }
// -- SmartShell -- // -- SmartShell --
export class Smartshell { export class Smartshell {
shellEnv: ShellEnv; public shellEnv: ShellEnv;
public smartexit = new plugins.smartexit.SmartExit();
constructor(optionsArg: IShellEnvContructorOptions) { constructor(optionsArg: IShellEnvContructorOptions) {
this.shellEnv = new ShellEnv(optionsArg); this.shellEnv = new ShellEnv(optionsArg);
} }
/**
* imports path into the shell from env if available and returns it with
*/
private _importEnvVarPath(stringArg): string {
if (process.env.SMARTSHELL_PATH) {
let commandResult = `PATH=${process.env.SMARTSHELL_PATH} && ${stringArg}`;
// console.log(commandResult)
return commandResult;
} else {
return stringArg;
}
}
/** /**
* executes a given command async * executes a given command async
* @param commandStringArg * @param commandStringArg
@ -60,13 +49,15 @@ export class Smartshell {
// build commandToExecute // build commandToExecute
let commandToExecute = commandStringArg; let commandToExecute = commandStringArg;
commandToExecute = this.shellEnv.createEnvExecString(commandStringArg); commandToExecute = this.shellEnv.createEnvExecString(commandStringArg);
commandToExecute = this._importEnvVarPath(commandToExecute);
const spawnlogInstance = new ShellLog(); const spawnlogInstance = new ShellLog();
const execChildProcess = cp.spawn(commandToExecute, [], { const execChildProcess = cp.spawn(commandToExecute, [], {
shell: true, shell: true,
env: process.env env: process.env,
detached: true
}); });
this.smartexit.addProcess(execChildProcess);
execChildProcess.stdout.on('data', data => { execChildProcess.stdout.on('data', data => {
if (!silentArg) { if (!silentArg) {
spawnlogInstance.logToConsole(data); spawnlogInstance.logToConsole(data);
@ -83,11 +74,16 @@ export class Smartshell {
if (streamingArg) { if (streamingArg) {
done.resolve({ done.resolve({
childProcess: execChildProcess, childProcess: execChildProcess,
finalPromise: childProcessEnded.promise finalPromise: childProcessEnded.promise,
kill: () => {
// this notation with the - kills the whole process group
process.kill(-execChildProcess.pid);
}
}); });
} }
execChildProcess.on('exit', (code, signal) => { execChildProcess.on('exit', (code, signal) => {
this.smartexit.removeProcess(execChildProcess);
if (strictArg && code === 1) { if (strictArg && code === 1) {
done.reject(); done.reject();
} }

View File

@ -1,4 +1,5 @@
import * as smartexit from '@pushrocks/smartexit';
import * as smartpromise from '@pushrocks/smartpromise'; import * as smartpromise from '@pushrocks/smartpromise';
import * as which from 'which'; import * as which from 'which';
export { smartpromise, which }; export { smartexit, smartpromise, which };

View File

@ -1,3 +1,17 @@
{ {
"extends": "tslint-config-standard" "extends": ["tslint:latest", "tslint-config-prettier"],
"rules": {
"semicolon": [true, "always"],
"no-console": false,
"ordered-imports": false,
"object-literal-sort-keys": false,
"member-ordering": {
"options":{
"order": [
"static-method"
]
}
}
},
"defaultSeverity": "warning"
} }