Compare commits

...

44 Commits

Author SHA1 Message Date
85f72feeb9 1.0.30 2019-10-14 14:57:43 +02:00
bd4ccbd215 fix(core): update 2019-10-14 14:57:43 +02:00
79940cec3f 1.0.29 2019-10-14 14:53:56 +02:00
e20508ffbc fix(core): update 2019-10-14 14:53:55 +02:00
21b962b9a8 1.0.28 2019-10-12 18:09:42 +02:00
f673e8577b fix(core): update 2019-10-12 18:09:41 +02:00
e4278ed270 1.0.27 2019-10-12 17:43:44 +02:00
8ae0f960ac fix(core): update 2019-10-12 17:43:43 +02:00
c9a3b996cb 1.0.26 2019-10-12 17:34:05 +02:00
d81d19008a fix(core): update 2019-10-12 17:34:05 +02:00
e4ef6bad8f 1.0.25 2019-10-12 17:31:26 +02:00
2873314742 fix(core): update 2019-10-12 17:31:25 +02:00
e26fa92744 1.0.24 2019-10-12 17:17:32 +02:00
995f296319 fix(core): update 2019-10-12 17:17:31 +02:00
e7866dadb7 1.0.23 2019-10-12 17:12:51 +02:00
9302e78f86 fix(core): update 2019-10-12 17:12:50 +02:00
0a302bee95 1.0.22 2019-10-12 16:54:19 +02:00
deb5e1daf9 1.0.21 2019-10-12 16:54:03 +02:00
5fe27ee706 fix(core): update 2019-10-12 16:54:03 +02:00
b73807baf0 1.0.20 2019-10-12 15:57:44 +02:00
1e71fc24d5 fix(core): update 2019-10-12 15:57:43 +02:00
e8071e76a1 1.0.19 2019-10-12 15:07:45 +02:00
b11d03dd41 fix(core): update 2019-10-12 15:07:44 +02:00
72297d2f58 1.0.18 2019-05-28 14:28:50 +02:00
71b900ac47 fix(core): update 2019-05-28 14:28:50 +02:00
f6d06edced 1.0.17 2019-05-28 11:35:04 +02:00
3e98005843 fix(core): update 2019-05-28 11:35:03 +02:00
7c4673a5b6 1.0.16 2019-05-27 15:38:07 +02:00
99ec82ab55 fix(core): update 2019-05-27 15:38:07 +02:00
1f0c1964dd 1.0.15 2019-05-27 14:46:34 +02:00
828229872d fix(core): update 2019-05-27 14:46:33 +02:00
0ff482bd01 1.0.14 2019-05-27 14:07:14 +02:00
39c8da4f74 fix(core): update 2019-05-27 14:07:13 +02:00
fcd2029744 1.0.13 2019-05-22 16:52:38 +02:00
d89e0a13d5 fix(core): update 2019-05-22 16:52:38 +02:00
64c7815bca 1.0.12 2019-05-22 16:45:49 +02:00
f3e69eb15e fix(core): update 2019-05-22 16:45:48 +02:00
386e4c07c6 1.0.11 2019-05-14 08:45:10 +02:00
82557c96d6 1.0.10 2019-05-13 18:54:06 +02:00
c94d89fa8a fix(core): update 2019-05-13 18:54:05 +02:00
639a5eebea 1.0.9 2019-05-13 09:48:36 +02:00
fb88d3384e fix(core): update 2019-05-13 09:48:35 +02:00
e38342604b 1.0.8 2019-05-09 00:08:41 +02:00
390200ad2a fix(core): update 2019-05-09 00:08:40 +02:00
12 changed files with 3391 additions and 700 deletions

5
.gitignore vendored
View File

@@ -8,9 +8,12 @@ pages/
# installs # installs
node_modules/ node_modules/
# caches and builds # caches
.yarn/ .yarn/
.cache/ .cache/
.rpt2_cache
# builds
dist/ dist/
dist_web/ dist_web/
dist_serve/ dist_serve/

View File

@@ -1,5 +1,5 @@
# gitzone standard # gitzone ci_default
image: hosttoday/ht-docker-node:npmci image: registry.gitlab.com/hosttoday/ht-docker-node:npmci
cache: cache:
paths: paths:
@@ -38,19 +38,7 @@ snyk:
# test stage # test stage
# ==================== # ====================
testLTS: testStable:
stage: test
script:
- npmci npm prepare
- npmci node install lts
- npmci npm install
- npmci npm test
coverage: /\d+.?\d+?\%\s*coverage/
tags:
- docker
- notpriv
testSTABLE:
stage: test stage: test
script: script:
- npmci npm prepare - npmci npm prepare
@@ -60,6 +48,18 @@ testSTABLE:
coverage: /\d+.?\d+?\%\s*coverage/ coverage: /\d+.?\d+?\%\s*coverage/
tags: tags:
- docker - docker
- priv
testBuild:
stage: test
script:
- npmci npm prepare
- npmci node install stable
- npmci npm install
- npmci command npm run build
coverage: /\d+.?\d+?\%\s*coverage/
tags:
- docker
- notpriv - notpriv
release: release:
@@ -78,19 +78,12 @@ release:
# ==================== # ====================
codequality: codequality:
stage: metadata stage: metadata
image: docker:stable
allow_failure: true allow_failure: true
services:
- docker:stable-dind
script: script:
- export SP_VERSION=$(echo "$CI_SERVER_VERSION" | sed 's/^\([0-9]*\)\.\([0-9]*\).*/\1-\2-stable/') - npmci command npm install -g tslint typescript
- docker run - npmci npm prepare
--env SOURCE_CODE="$PWD" - npmci npm install
--volume "$PWD":/code - npmci command "tslint -c tslint.json ./ts/**/*.ts"
--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: tags:
- docker - docker
- priv - priv
@@ -106,13 +99,15 @@ trigger:
- notpriv - notpriv
pages: pages:
image: hosttoday/ht-docker-node:npmci image: hosttoday/ht-docker-dbase:npmci
services:
- docker:stable-dind
stage: metadata stage: metadata
script: script:
- npmci command npm install -g typedoc typescript - npmci command npm install -g @gitzone/tsdoc
- npmci npm prepare - npmci npm prepare
- npmci npm install - npmci npm install
- npmci command typedoc --module "commonjs" --target "ES2016" --out public/ ts/ - npmci command tsdoc
tags: tags:
- docker - docker
- notpriv - notpriv

3628
package-lock.json generated

File diff suppressed because it is too large Load Diff

View File

@@ -1,34 +1,50 @@
{ {
"name": "@gitzone/tswatch", "name": "@gitzone/tswatch",
"version": "1.0.7", "version": "1.0.30",
"private": false, "private": false,
"description": "watch typescript projects during development", "description": "watch typescript projects during development",
"main": "dist/index.js", "main": "dist/index.js",
"typings": "dist/index.d.ts", "typings": "dist/index.d.ts",
"author": "Lossless GmbH", "author": "Lossless GmbH",
"license": "MIT", "license": "MIT",
"bin": {
"tswatch": "cli.js"
},
"scripts": { "scripts": {
"test": "node ./cli.ts.js test --timeout 10000", "test": "(tstest test/)",
"test2": "(tstest test/)", "build": "(tsbuild)"
"build": "(tsbuild)",
"format": "(gitzone format)"
}, },
"devDependencies": { "devDependencies": {
"@gitzone/tsbuild": "^2.1.11", "@gitzone/tsbuild": "^2.1.17",
"@gitzone/tstest": "^1.0.20", "@gitzone/tstest": "^1.0.28",
"@pushrocks/tapbundle": "^3.0.9", "@pushrocks/tapbundle": "^3.0.13",
"@types/node": "^12.0.0", "@types/node": "^12.7.12",
"tslint": "^5.16.0", "tslint": "^5.20.0",
"tslint-config-prettier": "^1.18.0" "tslint-config-prettier": "^1.18.0"
}, },
"dependencies": { "dependencies": {
"@gitzone/tsrun": "^1.2.6", "@gitzone/tsbundle": "^1.0.47",
"@gitzone/tsrun": "^1.2.8",
"@pushrocks/early": "^3.0.3", "@pushrocks/early": "^3.0.3",
"@pushrocks/smartchok": "^1.0.18", "@pushrocks/lik": "^3.0.11",
"@pushrocks/smartchok": "^1.0.23",
"@pushrocks/smartcli": "^3.0.7", "@pushrocks/smartcli": "^3.0.7",
"@pushrocks/smartdelay": "^2.0.3", "@pushrocks/smartdelay": "^2.0.3",
"@pushrocks/smartlog": "^2.0.19", "@pushrocks/smartlog": "^2.0.19",
"@pushrocks/smartlog-destination-local": "^7.0.5", "@pushrocks/smartlog-destination-local": "^8.0.2",
"@pushrocks/smartshell": "^2.0.13" "@pushrocks/smartserve": "^1.1.37",
} "@pushrocks/smartshell": "^2.0.25",
"@pushrocks/taskbuffer": "^2.0.15"
},
"files": [
"ts/**/*",
"ts_web/**/*",
"dist/**/*",
"dist_web/**/*",
"dist_ts_web/**/*",
"assets/**/*",
"cli.js",
"npmextra.json",
"readme.md"
]
} }

View File

@@ -21,6 +21,6 @@ watch typescript projects during development
For further information read the linked docs at the top of this readme. For further information read the linked docs at the top of this readme.
> MIT licensed | **©** [Lossless GmbH](https://lossless.gmbh) > 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)
[![repo-footer](https://gitzone.gitlab.io/assets/repo-footer.svg)](https://maintainedby.lossless.com) [![repo-footer](https://lossless.gitlab.io/publicrelations/repofooter.svg)](https://maintainedby.lossless.com)

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,7 @@
export type TWatchModes =
| 'test'
| 'gitzone_npm'
| 'gitzone_service'
| 'gitzone_element'
| 'gitzone_website'
| 'echoSomething';

View File

@@ -1,79 +1,116 @@
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>();
}); public smartserve: plugins.smartserve.SmartServe;
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 this.watcherMap.add(
const changeObservable = await this.watcher.getObservableFor('change'); new Watcher({
changeObservable.subscribe(() => { filePathToWatch: paths.cwd,
this.updateCurrentExecution(); commandToExecute: 'npm run test2',
}); timeout: null
this.updateCurrentExecution(); })
}
private async updateCurrentExecution() {
if (this.currentExecution) {
process.kill(-this.currentExecution.childProcess.pid);
}
this.currentExecution = await this.smartshellInstance.execStreaming(
this.options.commandToExecute
); );
this.currentExecution = null; break;
case 'gitzone_npm':
this.watcherMap.add(
new Watcher({
filePathToWatch: paths.cwd,
commandToExecute: 'npm run test',
timeout: null
})
);
break;
case 'gitzone_element':
// lets create a standard server
this.smartserve = new plugins.smartserve.SmartServe({
port: 3001,
injectReload: true,
serveDir: plugins.path.join(paths.cwd, './dist_web/')
});
this.watcherMap.add(
new Watcher({
filePathToWatch: plugins.path.join(paths.cwd, './ts_web/'),
commandToExecute: async () => {
const tsbundle = new plugins.tsbundle.TsBundle();
const htmlHandler = new plugins.tsbundle.HtmlHandler();
await tsbundle.buildProduction('./ts_web/index.ts', './dist_web/bundle.js');
await htmlHandler.copyHtml();
},
timeout: null
})
);
break;
case 'gitzone_website':
this.watcherMap.add(
new Watcher({
filePathToWatch: plugins.path.join(paths.cwd, './ts/'),
commandToExecute: 'npm run startTs',
timeout: null
})
);
// client directory
this.watcherMap.add(
new Watcher({
filePathToWatch: plugins.path.join(paths.cwd, './ts_web/'),
commandToExecute: 'npm run build',
timeout: null
})
);
break;
case 'gitzone_service':
this.watcherMap.add(
new Watcher({
filePathToWatch: plugins.path.join(paths.cwd, './ts/'),
commandToExecute: 'npm run startTs',
timeout: null
})
);
break;
case 'echoSomething':
const tsWatchInstanceEchoSomething = new Watcher({
filePathToWatch: plugins.path.join(paths.cwd, './ts'),
commandToExecute: 'npm -v',
timeout: null
});
this.watcherMap.add(tsWatchInstanceEchoSomething);
break;
default:
break;
}
this.watcherMap.forEach(async watcher => {
await watcher.start();
});
if (this.smartserve) {
await this.smartserve.start();
}
} }
/** /**
* this method sets up a clean exit strategy * stops the execution of any active Watchers
*/ */
private async setupCleanup() { public async stop() {
const cleanup = () => { if (this.smartserve) {
if (this.currentExecution) { await this.smartserve.stop();
process.kill(-this.currentExecution.childProcess.pid);
} }
}; this.watcherMap.forEach(async watcher => {
process.on('exit', () => { await watcher.stop();
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);
}); });
} }
} }
}

View File

@@ -0,0 +1,122 @@
import * as plugins from './tswatch.plugins';
import { logger } from './tswatch.logging';
export type TCommandFunction = () => Promise<void>;
export interface IWatcherConstructorOptions {
filePathToWatch: string;
commandToExecute: string | TCommandFunction;
timeout?: number;
}
/**
* A watcher keeps track of one child execution
*/
export class Watcher {
/**
* used to execute shell commands
*/
private smartshellInstance = new plugins.smartshell.Smartshell({
executor: 'bash'
});
/**
* used to execute
*/
private executionTask: plugins.taskbuffer.Task = new plugins.taskbuffer.Task({
name: 'watcherCommandFunctionTask',
taskFunction: async () => {
if (typeof this.options.commandToExecute === 'string') {
throw new Error('cannot execute string as task');
}
await this.options.commandToExecute();
},
buffered: true,
bufferMax: 1
});
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() {
await 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();
});
await this.updateCurrentExecution();
}
/**
* updates the current execution
*/
private async updateCurrentExecution() {
if (typeof this.options.commandToExecute === 'string') {
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;
} else {
await this.executionTask.trigger();
}
}
/**
* 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 && !this.currentExecution.childProcess.killed) {
process.kill(-this.currentExecution.childProcess.pid);
}
}
}

View File

@@ -8,21 +8,34 @@ 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('element').subscribe(async argvArg => {
logger.log('info', `running test task`); logger.log('info', `running watch task for a gitzone element project`);
const tsWatch = new TsWatch({ const tsWatch = new TsWatch('gitzone_element');
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.addCommand('npm').subscribe(async argvArg => {
logger.log('info', `running watch task for a gitzone element project`);
const tsWatch = new TsWatch('gitzone_npm');
await tsWatch.start();
});
tswatchCli.addCommand('service').subscribe(async argvArg => {
logger.log('info', `running test task`);
const tsWatch = new TsWatch('gitzone_service');
await tsWatch.start();
});
tswatchCli.addCommand('test').subscribe(async argvArg => {
logger.log('info', `running test task`);
const tsWatch = new TsWatch('test');
await tsWatch.start();
});
tswatchCli.addCommand('website').subscribe(async argvArg => {
logger.log('info', `running watch task for a gitzone website project`);
const tsWatch = new TsWatch('gitzone_website');
await tsWatch.start();
}); });
tswatchCli.startParse(); tswatchCli.startParse();

View File

@@ -1,12 +1,22 @@
import * as path from 'path'; import * as path from 'path';
export { path }; export { path };
// @gitzone scope
import * as tsbundle from '@gitzone/tsbundle';
export {
tsbundle
};
// @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';
import * as smartlog from '@pushrocks/smartlog'; import * as smartlog from '@pushrocks/smartlog';
import * as smartlogDestinationLocal from '@pushrocks/smartlog-destination-local'; import * as smartlogDestinationLocal from '@pushrocks/smartlog-destination-local';
import * as smartserve from '@pushrocks/smartserve';
import * as smartshell from '@pushrocks/smartshell'; import * as smartshell from '@pushrocks/smartshell';
import * as taskbuffer from '@pushrocks/taskbuffer';
export { smartchok, smartcli, smartdelay, smartlog, smartlogDestinationLocal, smartshell }; export { lik, smartchok, smartcli, smartdelay, smartlog, smartlogDestinationLocal, smartserve, smartshell, taskbuffer };