fix(core): update

This commit is contained in:
Philipp Kunz 2019-05-09 00:08:40 +02:00
parent 1960b1d125
commit 390200ad2a
11 changed files with 184 additions and 97 deletions

View File

@ -0,0 +1,7 @@
{
"compilerOptions": {
"esModuleInterop": true,
"lib": ["es2015"],
"target": "ES2017"
}
}

View File

@ -0,0 +1,3 @@
[Trash Info]
Path=/home/coder/project/tsconfig.json
DeletionDate=2019-05-08T21:54:46.502Z

12
package-lock.json generated
View File

@ -503,12 +503,12 @@
}, },
"@types/minimatch": { "@types/minimatch": {
"version": "3.0.3", "version": "3.0.3",
"resolved": "https://registry.npmjs.org/@types/minimatch/-/minimatch-3.0.3.tgz", "resolved": "https://verdaccio.lossless.one/@types%2fminimatch/-/minimatch-3.0.3.tgz",
"integrity": "sha512-tHq6qdbT9U1IRSGf14CL0pUlULksvY9OZ+5eEgl1N7t+OA3tGvNpxJCzuKQlsNgCVwbAs670L1vcVQi8j9HjnA==" "integrity": "sha512-tHq6qdbT9U1IRSGf14CL0pUlULksvY9OZ+5eEgl1N7t+OA3tGvNpxJCzuKQlsNgCVwbAs670L1vcVQi8j9HjnA=="
}, },
"@types/node": { "@types/node": {
"version": "12.0.0", "version": "12.0.0",
"resolved": "https://verdaccio.lossless.one/@types%2fnode/-/node-12.0.0.tgz", "resolved": "https://registry.npmjs.org/@types/node/-/node-12.0.0.tgz",
"integrity": "sha512-Jrb/x3HT4PTJp6a4avhmJCDEVrPdqLfl3e8GGMbpkGGdwAV5UGlIs4vVEfsHHfylZVOKZWpOqmqFH8CbfOZ6kg==" "integrity": "sha512-Jrb/x3HT4PTJp6a4avhmJCDEVrPdqLfl3e8GGMbpkGGdwAV5UGlIs4vVEfsHHfylZVOKZWpOqmqFH8CbfOZ6kg=="
}, },
"@types/vinyl": { "@types/vinyl": {
@ -1205,9 +1205,9 @@
} }
}, },
"luxon": { "luxon": {
"version": "1.13.0", "version": "1.13.1",
"resolved": "https://verdaccio.lossless.one/luxon/-/luxon-1.13.0.tgz", "resolved": "https://verdaccio.lossless.one/luxon/-/luxon-1.13.1.tgz",
"integrity": "sha512-j/t5wLTDCUbJgJ6MDp1VFNmeE/j7jmOhk3yKnZ972laS1ofpXVbOOVr9+7abyclAcG8FrPv8T2mg4A39V26vEQ==" "integrity": "sha512-IQKRIiz9ldUrgcozN13SAeNZVYfD3bEI9X6TcrGu+dkgE4GR/Iik03ozbTM5cTr0lz8ucYPL2jtYT7Va2Flbsg=="
}, },
"make-error": { "make-error": {
"version": "1.3.5", "version": "1.3.5",
@ -1725,7 +1725,7 @@
}, },
"symbol-tree": { "symbol-tree": {
"version": "3.2.2", "version": "3.2.2",
"resolved": "https://registry.npmjs.org/symbol-tree/-/symbol-tree-3.2.2.tgz", "resolved": "https://verdaccio.lossless.one/symbol-tree/-/symbol-tree-3.2.2.tgz",
"integrity": "sha1-rifbOPZgp64uHDt9G8KQgZuFGeY=" "integrity": "sha1-rifbOPZgp64uHDt9G8KQgZuFGeY="
}, },
"threads": { "threads": {

View File

@ -8,8 +8,7 @@
"author": "Lossless GmbH", "author": "Lossless GmbH",
"license": "MIT", "license": "MIT",
"scripts": { "scripts": {
"test": "node ./cli.ts.js test --timeout 10000", "test": "(tstest test/)",
"test2": "(tstest test/)",
"build": "(tsbuild)", "build": "(tsbuild)",
"format": "(gitzone format)" "format": "(gitzone format)"
}, },
@ -24,6 +23,7 @@
"dependencies": { "dependencies": {
"@gitzone/tsrun": "^1.2.6", "@gitzone/tsrun": "^1.2.6",
"@pushrocks/early": "^3.0.3", "@pushrocks/early": "^3.0.3",
"@pushrocks/lik": "^3.0.5",
"@pushrocks/smartchok": "^1.0.18", "@pushrocks/smartchok": "^1.0.18",
"@pushrocks/smartcli": "^3.0.7", "@pushrocks/smartcli": "^3.0.7",
"@pushrocks/smartdelay": "^2.0.3", "@pushrocks/smartdelay": "^2.0.3",

View File

@ -1,21 +1,20 @@
// tslint:disable-next-line: no-implicit-dependencies
import { expect, tap } from '@pushrocks/tapbundle'; import { expect, tap } from '@pushrocks/tapbundle';
import * as tswatch from '../ts/index'; import * as tswatch from '../ts/index';
let testTsWatchInstance: tswatch.TsWatch; let testTsWatchInstance: tswatch.TsWatch;
tap.test('should create a valid TsWatch instance', async () => { tap.test('should create a valid TsWatch instance', async () => {
testTsWatchInstance = new tswatch.TsWatch({ testTsWatchInstance = new tswatch.TsWatch('echoSomething');
filePathToWatch: process.cwd(),
commandToExecute: 'npm -v',
timeout: 1000
});
}); });
tap.test('should start the tswatch instance', async () => { tap.test('should start the tswatch instance', async () => {
testTsWatchInstance.start(); await testTsWatchInstance.start();
console.log('test executed');
}); });
tap.test('should run abitrary commands', async () => {}); tap.test('should stop the instance', async (tools) => {
tools.delayFor(2000);
testTsWatchInstance.stop();
});
tap.start(); tap.start();

1
ts/interfaces/index.ts Normal file
View File

@ -0,0 +1 @@
export * from './interfaces.watchmodes';

View File

@ -0,0 +1 @@
export type TWatchModes = 'test' | 'gitzone_npm' | 'gitzone_service' | 'gitzone_website' | 'echoSomething';

View File

@ -1,79 +1,68 @@
import * as plugins from './tswatch.plugins'; import * as plugins from './tswatch.plugins';
import * as paths from './tswatch.paths';
import * as interfaces from './interfaces';
export interface ITsWatchConstructorOptions { import { Watcher } from './tswatch.classes.watcher';
filePathToWatch: string;
commandToExecute: string;
timeout?: number;
}
/**
* handles the management of watching for foes
*/
export class TsWatch { export class TsWatch {
private smartshellInstance = new plugins.smartshell.Smartshell({ public watchmode: interfaces.TWatchModes;
executor: 'bash' public watcherMap = new plugins.lik.Objectmap<Watcher>();
});
private currentExecution: plugins.smartshell.IExecResultStreaming;
private watcher = new plugins.smartchok.Smartchok([], {});
private options: ITsWatchConstructorOptions;
constructor(optionsArg: ITsWatchConstructorOptions) { constructor(watchmodeArg: interfaces.TWatchModes) {
this.options = optionsArg; this.watchmode = watchmodeArg;
} }
/** /**
* start the file * starts the TsWatch instance
*/ */
public async start() { public async start () {
this.setupCleanup(); switch (this.watchmode) {
console.log(`Looking at ${this.options.filePathToWatch} for changes`); case 'test':
this.watcher.add([this.options.filePathToWatch]); // __dirname refers to the directory of this very file const tsWatchInstanceTest = new Watcher({
const changeObservable = await this.watcher.getObservableFor('change'); filePathToWatch: paths.cwd,
changeObservable.subscribe(() => { commandToExecute: 'npm run test2',
this.updateCurrentExecution(); timeout: null
}); });
this.updateCurrentExecution(); this.watcherMap.add(tsWatchInstanceTest);
} break;
case 'gitzone_npm':
private async updateCurrentExecution() { const tsWatchInstanceGitzoneNpm = new Watcher({
if (this.currentExecution) { filePathToWatch: paths.cwd,
process.kill(-this.currentExecution.childProcess.pid); commandToExecute: 'npm run test',
} timeout: null
this.currentExecution = await this.smartshellInstance.execStreaming( });
this.options.commandToExecute this.watcherMap.add(tsWatchInstanceGitzoneNpm);
); break;
this.currentExecution = null; case 'gitzone_website':
} const tsWatchInstanceGitzoneWebsite = new Watcher({
filePathToWatch: paths.cwd,
/** commandToExecute: 'npm run test',
* this method sets up a clean exit strategy timeout: null
*/ });
private async setupCleanup() { this.watcherMap.add(tsWatchInstanceGitzoneWebsite);
const cleanup = () => { break;
if (this.currentExecution) { case 'echoSomething':
process.kill(-this.currentExecution.childProcess.pid); const tsWatchInstanceEchoSomething = new Watcher({
} filePathToWatch: paths.cwd,
}; commandToExecute: 'npm -v',
process.on('exit', () => { timeout: null
console.log('');
console.log('now exiting!');
cleanup();
process.exit(0);
});
process.on('SIGINT', () => {
console.log('');
console.log('ok! got SIGINT We are exiting! Just cleaning up to exit neatly :)');
cleanup();
process.exit(0);
});
// handle timeout
if (this.options.timeout) {
plugins.smartdelay.delayFor(this.options.timeout).then(() => {
console.log(`timed out afer ${this.options.timeout} milliseconds! exiting!`);
cleanup();
process.exit(0);
}); });
this.watcherMap.add(tsWatchInstanceEchoSomething);
break;
default:
break;
} }
this.watcherMap.forEach(async watcher => {
await watcher.start();
});
}
/**
* stops the execution of any active Watchers
*/
public async stop () {
this.watcherMap.forEach(async watcher => {
await watcher.stop();
})
} }
} }

View File

@ -0,0 +1,97 @@
import * as plugins from './tswatch.plugins';
import { logger } from './tswatch.logging';
export interface IWatcherConstructorOptions {
filePathToWatch: string;
commandToExecute: string;
timeout?: number;
}
/**
* A watcher keeps track of one child execution
*/
export class Watcher {
private smartshellInstance = new plugins.smartshell.Smartshell({
executor: 'bash'
});
private currentExecution: plugins.smartshell.IExecResultStreaming;
private smartchokWatcher = new plugins.smartchok.Smartchok([], {});
private options: IWatcherConstructorOptions;
constructor(optionsArg: IWatcherConstructorOptions) {
this.options = optionsArg;
}
/**
* start the file
*/
public async start() {
this.setupCleanup();
console.log(`Looking at ${this.options.filePathToWatch} for changes`);
this.smartchokWatcher.add([this.options.filePathToWatch]); // __dirname refers to the directory of this very file
await this.smartchokWatcher.start();
const changeObservable = await this.smartchokWatcher.getObservableFor('change');
changeObservable.subscribe(() => {
this.updateCurrentExecution();
});
this.updateCurrentExecution();
}
/**
* updates the current execution
*/
private async updateCurrentExecution() {
if (this.currentExecution) {
logger.log('ok', `reexecuting ${this.options.commandToExecute}`);
process.kill(-this.currentExecution.childProcess.pid);
} else {
logger.log('ok', `executing ${this.options.commandToExecute} for the first time`);
}
this.currentExecution = await this.smartshellInstance.execStreaming(
this.options.commandToExecute
);
this.currentExecution = null;
}
/**
* this method sets up a clean exit strategy
*/
private async setupCleanup() {
const cleanup = () => {
if (this.currentExecution) {
process.kill(-this.currentExecution.childProcess.pid);
}
};
process.on('exit', () => {
console.log('');
console.log('now exiting!');
cleanup();
process.exit(0);
});
process.on('SIGINT', () => {
console.log('');
console.log('ok! got SIGINT We are exiting! Just cleaning up to exit neatly :)');
cleanup();
process.exit(0);
});
// handle timeout
if (this.options.timeout) {
plugins.smartdelay.delayFor(this.options.timeout).then(() => {
console.log(`timed out afer ${this.options.timeout} milliseconds! exiting!`);
cleanup();
process.exit(0);
});
}
}
/**
* stops the watcher
*/
public async stop() {
await this.smartchokWatcher.stop();
if (this.currentExecution) {
process.kill(-this.currentExecution.childProcess.pid);
}
}
}

View File

@ -8,21 +8,10 @@ const tswatchCli = new plugins.smartcli.Smartcli();
// standard behaviour will assume gitzone setup // standard behaviour will assume gitzone setup
tswatchCli.addCommand('test').subscribe(argvArg => { tswatchCli.addCommand('test').subscribe(async argvArg => {
logger.log('info', `running test task`); logger.log('info', `running test task`);
const tsWatch = new TsWatch({ const tsWatch = new TsWatch('test');
filePathToWatch: paths.cwd, await tsWatch.start();
commandToExecute: 'npm run test2',
timeout: (() => {
if (argvArg.timeout) {
console.log(`timeing out after ${argvArg.timeout}`);
return argvArg.timeout;
} else {
return null;
}
})()
});
tsWatch.start();
}); });
tswatchCli.startParse(); tswatchCli.startParse();

View File

@ -2,6 +2,7 @@ import * as path from 'path';
export { path }; export { path };
// @pushrocks scope // @pushrocks scope
import * as lik from '@pushrocks/lik';
import * as smartchok from '@pushrocks/smartchok'; import * as smartchok from '@pushrocks/smartchok';
import * as smartcli from '@pushrocks/smartcli'; import * as smartcli from '@pushrocks/smartcli';
import * as smartdelay from '@pushrocks/smartdelay'; import * as smartdelay from '@pushrocks/smartdelay';
@ -9,4 +10,4 @@ import * as smartlog from '@pushrocks/smartlog';
import * as smartlogDestinationLocal from '@pushrocks/smartlog-destination-local'; import * as smartlogDestinationLocal from '@pushrocks/smartlog-destination-local';
import * as smartshell from '@pushrocks/smartshell'; import * as smartshell from '@pushrocks/smartshell';
export { smartchok, smartcli, smartdelay, smartlog, smartlogDestinationLocal, smartshell }; export { lik, smartchok, smartcli, smartdelay, smartlog, smartlogDestinationLocal, smartshell };