@git.zone/tswatch 3.2.1 → 3.2.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist_ts/tswatch.classes.tswatch.js +8 -1
- package/dist_ts/tswatch.classes.watcher.d.ts +2 -1
- package/dist_ts/tswatch.classes.watcher.js +7 -26
- package/dist_ts/tswatch.plugins.d.ts +2 -1
- package/dist_ts/tswatch.plugins.js +3 -2
- package/package.json +3 -2
- package/ts/tswatch.classes.tswatch.ts +8 -0
- package/ts/tswatch.classes.watcher.ts +6 -25
- package/ts/tswatch.plugins.ts +2 -0
|
@@ -36,6 +36,13 @@ export class TsWatch {
|
|
|
36
36
|
*/
|
|
37
37
|
async start() {
|
|
38
38
|
logger.log('info', 'Starting tswatch with config-driven mode');
|
|
39
|
+
// Install global process lifecycle handlers (SIGINT, SIGTERM, etc.)
|
|
40
|
+
// This is the single authority for signal handling — no per-watcher handlers.
|
|
41
|
+
plugins.smartexit.ProcessLifecycle.install();
|
|
42
|
+
const exitInstance = new plugins.smartexit.SmartExit({ silent: true });
|
|
43
|
+
exitInstance.addCleanupFunction(async () => {
|
|
44
|
+
await this.stop();
|
|
45
|
+
});
|
|
39
46
|
// Start server if configured
|
|
40
47
|
if (this.config.server?.enabled) {
|
|
41
48
|
await this.startServer();
|
|
@@ -179,4 +186,4 @@ export class TsWatch {
|
|
|
179
186
|
});
|
|
180
187
|
}
|
|
181
188
|
}
|
|
182
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
189
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHN3YXRjaC5jbGFzc2VzLnRzd2F0Y2guanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi90cy90c3dhdGNoLmNsYXNzZXMudHN3YXRjaC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEtBQUssT0FBTyxNQUFNLHNCQUFzQixDQUFDO0FBQ2hELE9BQU8sS0FBSyxLQUFLLE1BQU0sb0JBQW9CLENBQUM7QUFDNUMsT0FBTyxLQUFLLFVBQVUsTUFBTSx1QkFBdUIsQ0FBQztBQUVwRCxPQUFPLEVBQUUsT0FBTyxFQUFFLE1BQU0sOEJBQThCLENBQUM7QUFDdkQsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLG9DQUFvQyxDQUFDO0FBQ25FLE9BQU8sRUFBRSxNQUFNLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQztBQUU5Qzs7Ozs7R0FLRztBQUNILE1BQU0sT0FBTyxPQUFPO0lBVWxCLFlBQVksU0FBb0M7UUFSekMsZUFBVSxHQUFHLElBQUksT0FBTyxDQUFDLEdBQUcsQ0FBQyxTQUFTLEVBQVcsQ0FBQztRQUNsRCxnQkFBVyxHQUEyQyxJQUFJLENBQUM7UUFFMUQsYUFBUSxHQUFHLElBQUksT0FBTyxDQUFDLFFBQVEsQ0FBQyxRQUFRLEVBQUUsQ0FBQztRQUMzQyx3QkFBbUIsR0FBRyxJQUFJLE9BQU8sQ0FBQyxRQUFRLENBQUMsbUJBQW1CLEVBQUUsQ0FBQztRQUNqRSxnQkFBVyxHQUFHLElBQUksT0FBTyxDQUFDLFFBQVEsQ0FBQyxXQUFXLEVBQUUsQ0FBQztRQUNqRCxrQkFBYSxHQUFHLElBQUksT0FBTyxDQUFDLFFBQVEsQ0FBQyxhQUFhLEVBQUUsQ0FBQztRQUczRCxJQUFJLENBQUMsTUFBTSxHQUFHLFNBQVMsQ0FBQztJQUMxQixDQUFDO0lBRUQ7O09BRUc7SUFDSSxNQUFNLENBQUMsVUFBVSxDQUFDLE1BQWU7UUFDdEMsTUFBTSxhQUFhLEdBQUcsSUFBSSxhQUFhLENBQUMsTUFBTSxDQUFDLENBQUM7UUFDaEQsTUFBTSxNQUFNLEdBQUcsYUFBYSxDQUFDLFVBQVUsRUFBRSxDQUFDO1FBRTFDLElBQUksQ0FBQyxNQUFNLEVBQUUsQ0FBQztZQUNaLE9BQU8sSUFBSSxDQUFDO1FBQ2QsQ0FBQztRQUVELE9BQU8sSUFBSSxPQUFPLENBQUMsTUFBTSxDQUFDLENBQUM7SUFDN0IsQ0FBQztJQUVEOztPQUVHO0lBQ0ksS0FBSyxDQUFDLEtBQUs7UUFDaEIsTUFBTSxDQUFDLEdBQUcsQ0FBQyxNQUFNLEVBQUUsMENBQTBDLENBQUMsQ0FBQztRQUUvRCxvRUFBb0U7UUFDcEUsOEVBQThFO1FBQzlFLE9BQU8sQ0FBQyxTQUFTLENBQUMsZ0JBQWdCLENBQUMsT0FBTyxFQUFFLENBQUM7UUFDN0MsTUFBTSxZQUFZLEdBQUcsSUFBSSxPQUFPLENBQUMsU0FBUyxDQUFDLFNBQVMsQ0FBQyxFQUFFLE1BQU0sRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFDO1FBQ3ZFLFlBQVksQ0FBQyxrQkFBa0IsQ0FBQyxLQUFLLElBQUksRUFBRTtZQUN6QyxNQUFNLElBQUksQ0FBQyxJQUFJLEVBQUUsQ0FBQztRQUNwQixDQUFDLENBQUMsQ0FBQztRQUVILDZCQUE2QjtRQUM3QixJQUFJLElBQUksQ0FBQyxNQUFNLENBQUMsTUFBTSxFQUFFLE9BQU8sRUFBRSxDQUFDO1lBQ2hDLE1BQU0sSUFBSSxDQUFDLFdBQVcsRUFBRSxDQUFDO1FBQzNCLENBQUM7UUFFRCxtQ0FBbUM7UUFDbkMsSUFBSSxJQUFJLENBQUMsTUFBTSxDQUFDLE9BQU8sSUFBSSxJQUFJLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFLENBQUM7WUFDMUQsTUFBTSxJQUFJLENBQUMsWUFBWSxFQUFFLENBQUM7UUFDNUIsQ0FBQztRQUVELDZCQUE2QjtRQUM3QixJQUFJLElBQUksQ0FBQyxNQUFNLENBQUMsUUFBUSxJQUFJLElBQUksQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUUsQ0FBQztZQUM1RCxNQUFNLElBQUksQ0FBQyxhQUFhLEVBQUUsQ0FBQztRQUM3QixDQUFDO1FBRUQscUJBQXFCO1FBQ3JCLE1BQU0sSUFBSSxDQUFDLFVBQVUsQ0FBQyxPQUFPLENBQUMsS0FBSyxFQUFFLE9BQU8sRUFBRSxFQUFFO1lBQzlDLE1BQU0sT0FBTyxDQUFDLEtBQUssRUFBRSxDQUFDO1FBQ3hCLENBQUMsQ0FBQyxDQUFDO1FBRUgsd0NBQXdDO1FBQ3hDLElBQUksSUFBSSxDQUFDLFdBQVcsRUFBRSxDQUFDO1lBQ3JCLE1BQU0sSUFBSSxDQUFDLFdBQVcsQ0FBQyxLQUFLLEVBQUUsQ0FBQztZQUMvQixNQUFNLENBQUMsR0FBRyxDQUFDLElBQUksRUFBRSw4QkFBOEIsSUFBSSxDQUFDLE1BQU0sQ0FBQyxNQUFNLEVBQUUsSUFBSSxJQUFJLElBQUksRUFBRSxDQUFDLENBQUM7UUFDckYsQ0FBQztJQUNILENBQUM7SUFFRDs7T0FFRztJQUNLLEtBQUssQ0FBQyxXQUFXO1FBQ3ZCLE1BQU0sWUFBWSxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUMsTUFBTyxDQUFDO1FBQ3pDLE1BQU0sSUFBSSxHQUFHLFlBQVksQ0FBQyxJQUFJLElBQUksSUFBSSxDQUFDO1FBQ3ZDLE1BQU0sUUFBUSxHQUFHLFlBQVksQ0FBQyxRQUFRLElBQUksZUFBZSxDQUFDO1FBRTFELE1BQU0sQ0FBQyxHQUFHLENBQUMsTUFBTSxFQUFFLGlDQUFpQyxJQUFJLGFBQWEsUUFBUSxFQUFFLENBQUMsQ0FBQztRQUVqRixJQUFJLENBQUMsV0FBVyxHQUFHLElBQUksT0FBTyxDQUFDLFdBQVcsQ0FBQyxXQUFXLENBQUM7WUFDckQsSUFBSSxFQUFFLElBQUk7WUFDVixZQUFZLEVBQUUsWUFBWSxDQUFDLFVBQVUsS0FBSyxLQUFLO1lBQy9DLFFBQVEsRUFBRSxPQUFPLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsR0FBRyxFQUFFLFFBQVEsQ0FBQztZQUNoRCxJQUFJLEVBQUUsSUFBSTtZQUNWLFdBQVcsRUFBRSxJQUFJO1lBQ2pCLFdBQVcsRUFBRSxJQUFJO1lBQ2pCLE9BQU8sRUFBRSxJQUFJO1lBQ2IsZUFBZSxFQUFFO2dCQUNmLHVCQUF1QixFQUFFLGFBQWE7Z0JBQ3RDLHlCQUF5QixFQUFFLGNBQWM7YUFDMUM7U0FDRixDQUFDLENBQUM7SUFDTCxDQUFDO0lBRUQ7O09BRUc7SUFDSyxLQUFLLENBQUMsWUFBWTtRQUN4QixLQUFLLE1BQU0sWUFBWSxJQUFJLElBQUksQ0FBQyxNQUFNLENBQUMsT0FBUSxFQUFFLENBQUM7WUFDaEQsTUFBTSxJQUFJLEdBQUcsWUFBWSxDQUFDLElBQUksSUFBSSxVQUFVLFlBQVksQ0FBQyxJQUFJLEVBQUUsQ0FBQztZQUNoRSxNQUFNLENBQUMsR0FBRyxDQUFDLE1BQU0sRUFBRSxzQkFBc0IsSUFBSSxFQUFFLENBQUMsQ0FBQztZQUVqRCxtQ0FBbUM7WUFDbkMsTUFBTSxhQUFhLEdBQUcsWUFBWSxDQUFDLGFBQWEsSUFBSTtnQkFDbEQsT0FBTyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQyxHQUFHLE9BQU87YUFDbEQsQ0FBQztZQUVGLDZCQUE2QjtZQUM3QixNQUFNLGNBQWMsR0FBRyxLQUFLLElBQUksRUFBRTtnQkFDaEMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxNQUFNLEVBQUUsSUFBSSxJQUFJLGVBQWUsQ0FBQyxDQUFDO2dCQUU1QyxnREFBZ0Q7Z0JBQ2hELE1BQU0sUUFBUSxHQUFHLFlBQVksQ0FBQyxJQUFJLENBQUM7Z0JBQ25DLE1BQU0sTUFBTSxHQUFHLFlBQVksQ0FBQyxFQUFFLENBQUM7Z0JBRS9CLElBQUksUUFBUSxDQUFDLFFBQVEsQ0FBQyxPQUFPLENBQUMsRUFBRSxDQUFDO29CQUMvQixrQkFBa0I7b0JBQ2xCLE1BQU0sSUFBSSxDQUFDLFdBQVcsQ0FBQyxXQUFXLENBQUM7d0JBQ2pDLElBQUksRUFBRSxPQUFPLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsR0FBRyxFQUFFLFFBQVEsQ0FBQzt3QkFDNUMsRUFBRSxFQUFFLE9BQU8sQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxHQUFHLEVBQUUsTUFBTSxDQUFDO3dCQUN4QyxNQUFNLEVBQUUsS0FBSztxQkFDZCxDQUFDLENBQUM7Z0JBQ0wsQ0FBQztxQkFBTSxJQUFJLFFBQVEsQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUM7b0JBQzdELHdCQUF3QjtvQkFDeEIsTUFBTSxJQUFJLENBQUMsYUFBYSxDQUFDLGFBQWEsRUFBRSxDQUFDO2dCQUMzQyxDQUFDO3FCQUFNLElBQUksWUFBWSxDQUFDLFVBQVUsSUFBSSxZQUFZLENBQUMsVUFBVSxLQUFLLFFBQVEsRUFBRSxDQUFDO29CQUMzRSxtRUFBbUU7b0JBQ25FLE1BQU0sSUFBSSxDQUFDLG1CQUFtQixDQUFDLG1CQUFtQixDQUFDO3dCQUNqRCxJQUFJLEVBQUUsWUFBWSxDQUFDLElBQUk7d0JBQ3ZCLEVBQUUsRUFBRSxZQUFZLENBQUMsRUFBRTt3QkFDbkIsVUFBVSxFQUFFLFlBQVksQ0FBQyxVQUFVO3dCQUNuQyxPQUFPLEVBQUUsWUFBWSxDQUFDLE9BQU8sSUFBSSxTQUFTO3dCQUMxQyxVQUFVLEVBQUUsWUFBWSxDQUFDLFVBQVUsSUFBSSxLQUFLO3dCQUM1QyxZQUFZLEVBQUUsWUFBWSxDQUFDLFlBQVk7d0JBQ3ZDLGFBQWEsRUFBRSxZQUFZLENBQUMsYUFBYTtxQkFDMUMsQ0FBQyxDQUFDO2dCQUNMLENBQUM7cUJBQU0sQ0FBQztvQkFDTix5Q0FBeUM7b0JBQ3pDLE1BQU0sSUFBSSxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDLEdBQUcsRUFBRSxRQUFRLEVBQUUsTUFBTSxFQUFFO3dCQUNyRCxPQUFPLEVBQUUsWUFBWSxDQUFDLE9BQU8sSUFBSSxTQUFTO3dCQUMxQyxVQUFVLEVBQUUsWUFBWSxDQUFDLFVBQVUsSUFBSSxLQUFLO3FCQUM3QyxDQUFDLENBQUM7Z0JBQ0wsQ0FBQztnQkFFRCxNQUFNLENBQUMsR0FBRyxDQUFDLElBQUksRUFBRSxJQUFJLElBQUksbUJBQW1CLENBQUMsQ0FBQztnQkFFOUMscURBQXFEO2dCQUNyRCxJQUFJLFlBQVksQ0FBQyxhQUFhLEtBQUssS0FBSyxJQUFJLElBQUksQ0FBQyxXQUFXLEVBQUUsQ0FBQztvQkFDN0QsTUFBTSxJQUFJLENBQUMsV0FBVyxDQUFDLE1BQU0sRUFBRSxDQUFDO2dCQUNsQyxDQUFDO1lBQ0gsQ0FBQyxDQUFDO1lBRUYscUJBQXFCO1lBQ3JCLE1BQU0sY0FBYyxFQUFFLENBQUM7WUFFdkIsaUNBQWlDO1lBQ2pDLElBQUksQ0FBQyxVQUFVLENBQUMsR0FBRyxDQUNqQixJQUFJLE9BQU8sQ0FBQztnQkFDVixJQUFJLEVBQUUsSUFBSTtnQkFDVixlQUFlLEVBQUUsYUFBYSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLEdBQUcsRUFBRSxDQUFDLENBQUMsQ0FBQztnQkFDMUUsY0FBYyxFQUFFLGNBQWM7Z0JBQzlCLFVBQVUsRUFBRSxLQUFLLEVBQUUsb0JBQW9CO2dCQUN2QyxRQUFRLEVBQUUsR0FBRzthQUNkLENBQUMsQ0FDSCxDQUFDO1FBQ0osQ0FBQztJQUNILENBQUM7SUFFRDs7T0FFRztJQUNLLEtBQUssQ0FBQyxhQUFhO1FBQ3pCLEtBQUssTUFBTSxhQUFhLElBQUksSUFBSSxDQUFDLE1BQU0sQ0FBQyxRQUFTLEVBQUUsQ0FBQztZQUNsRCxNQUFNLENBQUMsR0FBRyxDQUFDLE1BQU0sRUFBRSx1QkFBdUIsYUFBYSxDQUFDLElBQUksRUFBRSxDQUFDLENBQUM7WUFFaEUsa0NBQWtDO1lBQ2xDLE1BQU0sVUFBVSxHQUFHLEtBQUssQ0FBQyxPQUFPLENBQUMsYUFBYSxDQUFDLEtBQUssQ0FBQztnQkFDbkQsQ0FBQyxDQUFDLGFBQWEsQ0FBQyxLQUFLO2dCQUNyQixDQUFDLENBQUMsQ0FBQyxhQUFhLENBQUMsS0FBSyxDQUFDLENBQUM7WUFFMUIsTUFBTSxhQUFhLEdBQUcsVUFBVSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLEdBQUcsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBRTdFLElBQUksQ0FBQyxVQUFVLENBQUMsR0FBRyxDQUNqQixJQUFJLE9BQU8sQ0FBQztnQkFDVixJQUFJLEVBQUUsYUFBYSxDQUFDLElBQUk7Z0JBQ3hCLGVBQWUsRUFBRSxhQUFhO2dCQUM5QixnQkFBZ0IsRUFBRSxhQUFhLENBQUMsT0FBTztnQkFDdkMsT0FBTyxFQUFFLGFBQWEsQ0FBQyxPQUFPLElBQUksSUFBSTtnQkFDdEMsUUFBUSxFQUFFLGFBQWEsQ0FBQyxRQUFRLElBQUksR0FBRztnQkFDdkMsVUFBVSxFQUFFLGFBQWEsQ0FBQyxVQUFVLElBQUksSUFBSTthQUM3QyxDQUFDLENBQ0gsQ0FBQztRQUNKLENBQUM7SUFDSCxDQUFDO0lBRUQ7O09BRUc7SUFDSSxLQUFLLENBQUMsSUFBSTtRQUNmLElBQUksSUFBSSxDQUFDLFdBQVcsRUFBRSxDQUFDO1lBQ3JCLE1BQU0sSUFBSSxDQUFDLFdBQVcsQ0FBQyxJQUFJLEVBQUUsQ0FBQztRQUNoQyxDQUFDO1FBQ0QsTUFBTSxJQUFJLENBQUMsVUFBVSxDQUFDLE9BQU8sQ0FBQyxLQUFLLEVBQUUsT0FBTyxFQUFFLEVBQUU7WUFDOUMsTUFBTSxPQUFPLENBQUMsSUFBSSxFQUFFLENBQUM7UUFDdkIsQ0FBQyxDQUFDLENBQUM7SUFDTCxDQUFDO0NBQ0YifQ==
|
|
@@ -53,7 +53,8 @@ export declare class Watcher {
|
|
|
53
53
|
*/
|
|
54
54
|
private executeCommand;
|
|
55
55
|
/**
|
|
56
|
-
*
|
|
56
|
+
* Sets up timeout-based cleanup if configured.
|
|
57
|
+
* Signal handling (SIGINT/SIGTERM) is managed globally by ProcessLifecycle in TsWatch.
|
|
57
58
|
*/
|
|
58
59
|
private setupCleanup;
|
|
59
60
|
/**
|
|
@@ -136,34 +136,13 @@ export class Watcher {
|
|
|
136
136
|
}
|
|
137
137
|
}
|
|
138
138
|
/**
|
|
139
|
-
*
|
|
139
|
+
* Sets up timeout-based cleanup if configured.
|
|
140
|
+
* Signal handling (SIGINT/SIGTERM) is managed globally by ProcessLifecycle in TsWatch.
|
|
140
141
|
*/
|
|
141
142
|
async setupCleanup() {
|
|
142
|
-
// Last-resort synchronous cleanup — 'exit' event cannot await async work.
|
|
143
|
-
// By this point, SIGINT handler should have already called stop().
|
|
144
|
-
process.on('exit', () => {
|
|
145
|
-
if (this.currentExecution && !this.currentExecution.childProcess.killed) {
|
|
146
|
-
const pid = this.currentExecution.childProcess.pid;
|
|
147
|
-
if (pid) {
|
|
148
|
-
try {
|
|
149
|
-
process.kill(pid, 'SIGKILL');
|
|
150
|
-
}
|
|
151
|
-
catch {
|
|
152
|
-
// Process may already be dead
|
|
153
|
-
}
|
|
154
|
-
}
|
|
155
|
-
}
|
|
156
|
-
});
|
|
157
|
-
process.on('SIGINT', async () => {
|
|
158
|
-
console.log('');
|
|
159
|
-
console.log('ok! got SIGINT We are exiting! Just cleaning up to exit neatly :)');
|
|
160
|
-
await this.stop();
|
|
161
|
-
process.exit(0);
|
|
162
|
-
});
|
|
163
|
-
// handle timeout
|
|
164
143
|
if (this.options.timeout) {
|
|
165
144
|
plugins.smartdelay.delayFor(this.options.timeout).then(async () => {
|
|
166
|
-
console.log(`timed out
|
|
145
|
+
console.log(`timed out after ${this.options.timeout} milliseconds! exiting!`);
|
|
167
146
|
await this.stop();
|
|
168
147
|
process.exit(0);
|
|
169
148
|
});
|
|
@@ -177,9 +156,11 @@ export class Watcher {
|
|
|
177
156
|
clearTimeout(this.debounceTimer);
|
|
178
157
|
}
|
|
179
158
|
await this.smartwatchInstance.stop();
|
|
180
|
-
if (this.currentExecution
|
|
159
|
+
if (this.currentExecution) {
|
|
160
|
+
// Always tree-kill — even if the direct child is dead (.killed === true),
|
|
161
|
+
// grandchildren (e.g. tsrun, devserver) may still be running.
|
|
181
162
|
await this.currentExecution.kill();
|
|
182
163
|
}
|
|
183
164
|
}
|
|
184
165
|
}
|
|
185
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
166
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHN3YXRjaC5jbGFzc2VzLndhdGNoZXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi90cy90c3dhdGNoLmNsYXNzZXMud2F0Y2hlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEtBQUssT0FBTyxNQUFNLHNCQUFzQixDQUFDO0FBQ2hELE9BQU8sS0FBSyxVQUFVLE1BQU0sdUJBQXVCLENBQUM7QUFDcEQsT0FBTyxFQUFFLE1BQU0sRUFBRSxNQUFNLHNCQUFzQixDQUFDO0FBcUI5Qzs7R0FFRztBQUNILE1BQU0sT0FBTyxPQUFPO0lBZWxCLFlBQVksVUFBc0M7UUFkbEQ7O1dBRUc7UUFDSyx1QkFBa0IsR0FBRyxJQUFJLE9BQU8sQ0FBQyxVQUFVLENBQUMsVUFBVSxDQUFDO1lBQzdELFFBQVEsRUFBRSxNQUFNO1NBQ2pCLENBQUMsQ0FBQztRQUdLLHVCQUFrQixHQUFHLElBQUksT0FBTyxDQUFDLFVBQVUsQ0FBQyxVQUFVLENBQUMsRUFBRSxDQUFDLENBQUM7UUFFM0Qsa0JBQWEsR0FBMEIsSUFBSSxDQUFDO1FBQzVDLGdCQUFXLEdBQUcsS0FBSyxDQUFDO1FBQ3BCLHFCQUFnQixHQUFHLEtBQUssQ0FBQztRQUcvQixJQUFJLENBQUMsT0FBTyxHQUFHO1lBQ2IsT0FBTyxFQUFFLElBQUk7WUFDYixRQUFRLEVBQUUsR0FBRztZQUNiLFVBQVUsRUFBRSxJQUFJO1lBQ2hCLEdBQUcsVUFBVTtTQUNkLENBQUM7SUFDSixDQUFDO0lBRUQ7O09BRUc7SUFDSSxNQUFNLENBQUMsVUFBVSxDQUFDLE1BQWlDO1FBQ3hELE1BQU0sVUFBVSxHQUFHLEtBQUssQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUMvRSxPQUFPLElBQUksT0FBTyxDQUFDO1lBQ2pCLElBQUksRUFBRSxNQUFN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
|
|
@@ -8,6 +8,7 @@ import * as lik from '@push.rocks/lik';
|
|
|
8
8
|
import * as npmextra from '@push.rocks/npmextra';
|
|
9
9
|
import * as smartcli from '@push.rocks/smartcli';
|
|
10
10
|
import * as smartdelay from '@push.rocks/smartdelay';
|
|
11
|
+
import * as smartexit from '@push.rocks/smartexit';
|
|
11
12
|
import * as smartfs from '@push.rocks/smartfs';
|
|
12
13
|
import * as smartinteract from '@push.rocks/smartinteract';
|
|
13
14
|
import * as smartlog from '@push.rocks/smartlog';
|
|
@@ -15,4 +16,4 @@ import * as smartlogDestinationLocal from '@push.rocks/smartlog-destination-loca
|
|
|
15
16
|
import * as smartshell from '@push.rocks/smartshell';
|
|
16
17
|
import * as smartwatch from '@push.rocks/smartwatch';
|
|
17
18
|
import * as taskbuffer from '@push.rocks/taskbuffer';
|
|
18
|
-
export { lik, npmextra, smartcli, smartdelay, smartfs, smartinteract, smartlog, smartlogDestinationLocal, smartshell, smartwatch, taskbuffer, };
|
|
19
|
+
export { lik, npmextra, smartcli, smartdelay, smartexit, smartfs, smartinteract, smartlog, smartlogDestinationLocal, smartshell, smartwatch, taskbuffer, };
|
|
@@ -12,6 +12,7 @@ import * as lik from '@push.rocks/lik';
|
|
|
12
12
|
import * as npmextra from '@push.rocks/npmextra';
|
|
13
13
|
import * as smartcli from '@push.rocks/smartcli';
|
|
14
14
|
import * as smartdelay from '@push.rocks/smartdelay';
|
|
15
|
+
import * as smartexit from '@push.rocks/smartexit';
|
|
15
16
|
import * as smartfs from '@push.rocks/smartfs';
|
|
16
17
|
import * as smartinteract from '@push.rocks/smartinteract';
|
|
17
18
|
import * as smartlog from '@push.rocks/smartlog';
|
|
@@ -19,5 +20,5 @@ import * as smartlogDestinationLocal from '@push.rocks/smartlog-destination-loca
|
|
|
19
20
|
import * as smartshell from '@push.rocks/smartshell';
|
|
20
21
|
import * as smartwatch from '@push.rocks/smartwatch';
|
|
21
22
|
import * as taskbuffer from '@push.rocks/taskbuffer';
|
|
22
|
-
export { lik, npmextra, smartcli, smartdelay, smartfs, smartinteract, smartlog, smartlogDestinationLocal, smartshell, smartwatch, taskbuffer, };
|
|
23
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
23
|
+
export { lik, npmextra, smartcli, smartdelay, smartexit, smartfs, smartinteract, smartlog, smartlogDestinationLocal, smartshell, smartwatch, taskbuffer, };
|
|
24
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHN3YXRjaC5wbHVnaW5zLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vdHMvdHN3YXRjaC5wbHVnaW5zLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLG9CQUFvQjtBQUNwQixPQUFPLEtBQUssSUFBSSxNQUFNLE1BQU0sQ0FBQztBQUM3QixPQUFPLEVBQUUsSUFBSSxFQUFFLENBQUM7QUFFaEIsa0JBQWtCO0FBQ2xCLE9BQU8sS0FBSyxRQUFRLE1BQU0sb0JBQW9CLENBQUM7QUFDL0MsT0FBTyxFQUFFLFFBQVEsRUFBRSxDQUFDO0FBRXBCLG9CQUFvQjtBQUNwQixPQUFPLEtBQUssV0FBVyxNQUFNLHlCQUF5QixDQUFDO0FBRXZELE9BQU8sRUFBRSxXQUFXLEVBQUUsQ0FBQztBQUV2QixvQkFBb0I7QUFDcEIsT0FBTyxLQUFLLEdBQUcsTUFBTSxpQkFBaUIsQ0FBQztBQUN2QyxPQUFPLEtBQUssUUFBUSxNQUFNLHNCQUFzQixDQUFDO0FBQ2pELE9BQU8sS0FBSyxRQUFRLE1BQU0sc0JBQXNCLENBQUM7QUFDakQsT0FBTyxLQUFLLFVBQVUsTUFBTSx3QkFBd0IsQ0FBQztBQUNyRCxPQUFPLEtBQUssU0FBUyxNQUFNLHVCQUF1QixDQUFDO0FBQ25ELE9BQU8sS0FBSyxPQUFPLE1BQU0scUJBQXFCLENBQUM7QUFDL0MsT0FBTyxLQUFLLGFBQWEsTUFBTSwyQkFBMkIsQ0FBQztBQUMzRCxPQUFPLEtBQUssUUFBUSxNQUFNLHNCQUFzQixDQUFDO0FBQ2pELE9BQU8sS0FBSyx3QkFBd0IsTUFBTSx3Q0FBd0MsQ0FBQztBQUNuRixPQUFPLEtBQUssVUFBVSxNQUFNLHdCQUF3QixDQUFDO0FBQ3JELE9BQU8sS0FBSyxVQUFVLE1BQU0sd0JBQXdCLENBQUM7QUFDckQsT0FBTyxLQUFLLFVBQVUsTUFBTSx3QkFBd0IsQ0FBQztBQUVyRCxPQUFPLEVBQ0wsR0FBRyxFQUNILFFBQVEsRUFDUixRQUFRLEVBQ1IsVUFBVSxFQUNWLFNBQVMsRUFDVCxPQUFPLEVBQ1AsYUFBYSxFQUNiLFFBQVEsRUFDUix3QkFBd0IsRUFDeEIsVUFBVSxFQUNWLFVBQVUsRUFDVixVQUFVLEdBQ1gsQ0FBQyJ9
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@git.zone/tswatch",
|
|
3
|
-
"version": "3.2.
|
|
3
|
+
"version": "3.2.3",
|
|
4
4
|
"private": false,
|
|
5
5
|
"description": "A development tool for automatically watching and re-compiling TypeScript projects upon detecting file changes, enhancing developer workflows.",
|
|
6
6
|
"exports": {
|
|
@@ -31,11 +31,12 @@
|
|
|
31
31
|
"@push.rocks/npmextra": "^5.3.3",
|
|
32
32
|
"@push.rocks/smartcli": "^4.0.20",
|
|
33
33
|
"@push.rocks/smartdelay": "^3.0.5",
|
|
34
|
+
"@push.rocks/smartexit": "2.0.0",
|
|
34
35
|
"@push.rocks/smartfs": "^1.3.1",
|
|
35
36
|
"@push.rocks/smartinteract": "^2.0.16",
|
|
36
37
|
"@push.rocks/smartlog": "^3.1.10",
|
|
37
38
|
"@push.rocks/smartlog-destination-local": "^9.0.2",
|
|
38
|
-
"@push.rocks/smartshell": "^3.3.
|
|
39
|
+
"@push.rocks/smartshell": "^3.3.3",
|
|
39
40
|
"@push.rocks/smartwatch": "^6.3.0",
|
|
40
41
|
"@push.rocks/taskbuffer": "^4.2.0"
|
|
41
42
|
},
|
|
@@ -46,6 +46,14 @@ export class TsWatch {
|
|
|
46
46
|
public async start() {
|
|
47
47
|
logger.log('info', 'Starting tswatch with config-driven mode');
|
|
48
48
|
|
|
49
|
+
// Install global process lifecycle handlers (SIGINT, SIGTERM, etc.)
|
|
50
|
+
// This is the single authority for signal handling — no per-watcher handlers.
|
|
51
|
+
plugins.smartexit.ProcessLifecycle.install();
|
|
52
|
+
const exitInstance = new plugins.smartexit.SmartExit({ silent: true });
|
|
53
|
+
exitInstance.addCleanupFunction(async () => {
|
|
54
|
+
await this.stop();
|
|
55
|
+
});
|
|
56
|
+
|
|
49
57
|
// Start server if configured
|
|
50
58
|
if (this.config.server?.enabled) {
|
|
51
59
|
await this.startServer();
|
|
@@ -181,34 +181,13 @@ export class Watcher {
|
|
|
181
181
|
}
|
|
182
182
|
|
|
183
183
|
/**
|
|
184
|
-
*
|
|
184
|
+
* Sets up timeout-based cleanup if configured.
|
|
185
|
+
* Signal handling (SIGINT/SIGTERM) is managed globally by ProcessLifecycle in TsWatch.
|
|
185
186
|
*/
|
|
186
187
|
private async setupCleanup() {
|
|
187
|
-
// Last-resort synchronous cleanup — 'exit' event cannot await async work.
|
|
188
|
-
// By this point, SIGINT handler should have already called stop().
|
|
189
|
-
process.on('exit', () => {
|
|
190
|
-
if (this.currentExecution && !this.currentExecution.childProcess.killed) {
|
|
191
|
-
const pid = this.currentExecution.childProcess.pid;
|
|
192
|
-
if (pid) {
|
|
193
|
-
try {
|
|
194
|
-
process.kill(pid, 'SIGKILL');
|
|
195
|
-
} catch {
|
|
196
|
-
// Process may already be dead
|
|
197
|
-
}
|
|
198
|
-
}
|
|
199
|
-
}
|
|
200
|
-
});
|
|
201
|
-
process.on('SIGINT', async () => {
|
|
202
|
-
console.log('');
|
|
203
|
-
console.log('ok! got SIGINT We are exiting! Just cleaning up to exit neatly :)');
|
|
204
|
-
await this.stop();
|
|
205
|
-
process.exit(0);
|
|
206
|
-
});
|
|
207
|
-
|
|
208
|
-
// handle timeout
|
|
209
188
|
if (this.options.timeout) {
|
|
210
189
|
plugins.smartdelay.delayFor(this.options.timeout).then(async () => {
|
|
211
|
-
console.log(`timed out
|
|
190
|
+
console.log(`timed out after ${this.options.timeout} milliseconds! exiting!`);
|
|
212
191
|
await this.stop();
|
|
213
192
|
process.exit(0);
|
|
214
193
|
});
|
|
@@ -223,7 +202,9 @@ export class Watcher {
|
|
|
223
202
|
clearTimeout(this.debounceTimer);
|
|
224
203
|
}
|
|
225
204
|
await this.smartwatchInstance.stop();
|
|
226
|
-
if (this.currentExecution
|
|
205
|
+
if (this.currentExecution) {
|
|
206
|
+
// Always tree-kill — even if the direct child is dead (.killed === true),
|
|
207
|
+
// grandchildren (e.g. tsrun, devserver) may still be running.
|
|
227
208
|
await this.currentExecution.kill();
|
|
228
209
|
}
|
|
229
210
|
}
|
package/ts/tswatch.plugins.ts
CHANGED
|
@@ -16,6 +16,7 @@ import * as lik from '@push.rocks/lik';
|
|
|
16
16
|
import * as npmextra from '@push.rocks/npmextra';
|
|
17
17
|
import * as smartcli from '@push.rocks/smartcli';
|
|
18
18
|
import * as smartdelay from '@push.rocks/smartdelay';
|
|
19
|
+
import * as smartexit from '@push.rocks/smartexit';
|
|
19
20
|
import * as smartfs from '@push.rocks/smartfs';
|
|
20
21
|
import * as smartinteract from '@push.rocks/smartinteract';
|
|
21
22
|
import * as smartlog from '@push.rocks/smartlog';
|
|
@@ -29,6 +30,7 @@ export {
|
|
|
29
30
|
npmextra,
|
|
30
31
|
smartcli,
|
|
31
32
|
smartdelay,
|
|
33
|
+
smartexit,
|
|
32
34
|
smartfs,
|
|
33
35
|
smartinteract,
|
|
34
36
|
smartlog,
|