Compare commits

...

3 Commits

Author SHA1 Message Date
f254a9e078 v3.3.6 2026-03-04 18:13:53 +00:00
3d6a33f8d2 fix(smartshell): use close event on child processes to ensure exit handling and update dependency versions 2026-03-04 18:13:53 +00:00
d37071dae0 fix(spawn): use detached:true so children are immune to terminal SIGINT
Children now get their own process group. Terminal Ctrl+C only reaches
the parent, which then does orderly tree-kill while children are still
alive and the process tree is intact.
2026-03-04 00:49:29 +00:00
5 changed files with 1051 additions and 1035 deletions

View File

@@ -1,5 +1,12 @@
# Changelog # Changelog
## 2026-03-04 - 3.3.6 - fix(smartshell)
use 'close' event on child processes to ensure exit handling and update dependency versions
- Replace child_process 'exit' listeners with 'close' in ts/classes.smartshell.ts (two occurrences) to ensure handlers run after stdio streams are closed.
- Bump devDependencies: @git.zone/tsbuild ^2.7.3 -> ^4.1.2, @git.zone/tsrun ^1.6.2 -> ^2.0.1, @git.zone/tstest ^2.8.3 -> ^3.2.0, @types/node ^22.19.13 -> ^25.3.3.
- Bump dependencies: @push.rocks/smartexit ^2.0.1 -> ^2.0.3, which ^5.0.0 -> ^6.0.1.
## 2026-03-03 - 3.3.2 - fix(release) ## 2026-03-03 - 3.3.2 - fix(release)
add @git.zone/cli release configuration with registries and public access add @git.zone/cli release configuration with registries and public access

View File

@@ -1,7 +1,7 @@
{ {
"name": "@push.rocks/smartshell", "name": "@push.rocks/smartshell",
"private": false, "private": false,
"version": "3.3.4", "version": "3.3.6",
"description": "A library for executing shell commands using promises.", "description": "A library for executing shell commands using promises.",
"main": "dist_ts/index.js", "main": "dist_ts/index.js",
"typings": "dist_ts/index.d.ts", "typings": "dist_ts/index.d.ts",
@@ -33,18 +33,18 @@
}, },
"homepage": "https://code.foss.global/push.rocks/smartshell", "homepage": "https://code.foss.global/push.rocks/smartshell",
"devDependencies": { "devDependencies": {
"@git.zone/tsbuild": "^2.7.3", "@git.zone/tsbuild": "^4.1.2",
"@git.zone/tsrun": "^1.6.2", "@git.zone/tsrun": "^2.0.1",
"@git.zone/tstest": "^2.8.3", "@git.zone/tstest": "^3.2.0",
"@types/node": "^22.19.13" "@types/node": "^25.3.3"
}, },
"dependencies": { "dependencies": {
"@push.rocks/smartdelay": "^3.0.5", "@push.rocks/smartdelay": "^3.0.5",
"@push.rocks/smartexit": "^2.0.1", "@push.rocks/smartexit": "^2.0.3",
"@push.rocks/smartpromise": "^4.2.3", "@push.rocks/smartpromise": "^4.2.3",
"@types/which": "^3.0.4", "@types/which": "^3.0.4",
"tree-kill": "^1.2.2", "tree-kill": "^1.2.2",
"which": "^5.0.0" "which": "^6.0.1"
}, },
"files": [ "files": [
"ts/**/*", "ts/**/*",

2055
pnpm-lock.yaml generated

File diff suppressed because it is too large Load Diff

View File

@@ -3,6 +3,6 @@
*/ */
export const commitinfo = { export const commitinfo = {
name: '@push.rocks/smartshell', name: '@push.rocks/smartshell',
version: '3.3.2', version: '3.3.6',
description: 'A library for executing shell commands using promises.' description: 'A library for executing shell commands using promises.'
} }

View File

@@ -119,7 +119,7 @@ export class Smartshell {
shell: false, // SECURITY: Never use shell with untrusted input shell: false, // SECURITY: Never use shell with untrusted input
cwd: process.cwd(), cwd: process.cwd(),
env: options.env || process.env, env: options.env || process.env,
detached: false, detached: true, // Own process group — immune to terminal SIGINT, managed by smartexit
signal: options.signal, signal: options.signal,
}); });
@@ -249,7 +249,7 @@ export class Smartshell {
} }
}; };
execChildProcess.once('exit', handleExit); execChildProcess.once('close', handleExit);
execChildProcess.once('error', (error) => { execChildProcess.once('error', (error) => {
if (timeoutHandle) { if (timeoutHandle) {
clearTimeout(timeoutHandle); clearTimeout(timeoutHandle);
@@ -342,7 +342,7 @@ export class Smartshell {
shell: true, shell: true,
cwd: process.cwd(), cwd: process.cwd(),
env: options.env || process.env, env: options.env || process.env,
detached: false, detached: true, // Own process group — immune to terminal SIGINT, managed by smartexit
signal: options.signal, signal: options.signal,
}); });
@@ -472,7 +472,7 @@ export class Smartshell {
} }
}; };
execChildProcess.once('exit', handleExit); execChildProcess.once('close', handleExit);
execChildProcess.once('error', (error) => { execChildProcess.once('error', (error) => {
if (timeoutHandle) { if (timeoutHandle) {
clearTimeout(timeoutHandle); clearTimeout(timeoutHandle);