From f8e431f41eb4aee3191d957f2b50c20d3eb4fec2 Mon Sep 17 00:00:00 2001 From: Juergen Kunz Date: Sun, 17 Aug 2025 14:01:04 +0000 Subject: [PATCH] feat(smartshell): Add passthrough option for exec methods and corresponding tests --- .../document_symbols_cache_v23-06-25.pkl | Bin 35251 -> 88853 bytes test/test.passthrough.ts | 42 ++++++++++++++++++ ts/classes.smartshell.ts | 23 ++++++++++ 3 files changed, 65 insertions(+) create mode 100644 test/test.passthrough.ts diff --git a/.serena/cache/typescript/document_symbols_cache_v23-06-25.pkl b/.serena/cache/typescript/document_symbols_cache_v23-06-25.pkl index c912649ba79f21e20d7a8c743520a02e02a7023c..7ab121dcfc0675ff84d0c4778d8ce72e198b738e 100644 GIT binary patch literal 88853 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 bvM~^RcRu9yBd+6^;5xMbXyegFeenMS4|4`P literal 35251 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 { + const testSmartshell = new smartshell.Smartshell({ + executor: 'bash', + sourceFilePaths: [], + }); + + // Test with a simple echo command that doesn't need input + const result = await testSmartshell.execPassthrough('echo "Testing passthrough"'); + expect(result.exitCode).toEqual(0); + expect(result.stdout).toContain('Testing passthrough'); +}); + +tap.test('should handle streaming passthrough', async () => { + const testSmartshell = new smartshell.Smartshell({ + executor: 'bash', + sourceFilePaths: [], + }); + + // Test streaming passthrough with a simple command + const streamingResult = await testSmartshell.execStreamingPassthrough('echo "Testing streaming passthrough"'); + const finalResult = await streamingResult.finalPromise; + + expect(finalResult.exitCode).toEqual(0); + expect(finalResult.stdout).toContain('Testing streaming passthrough'); +}); + +tap.test('should allow normal exec without passthrough', async () => { + const testSmartshell = new smartshell.Smartshell({ + executor: 'bash', + sourceFilePaths: [], + }); + + // Regular exec should still work as before + const result = await testSmartshell.exec('echo "Normal exec"'); + expect(result.exitCode).toEqual(0); + expect(result.stdout).toContain('Normal exec'); +}); + +export default tap.start(); \ No newline at end of file diff --git a/ts/classes.smartshell.ts b/ts/classes.smartshell.ts index ce8ebcd..a3c5c45 100644 --- a/ts/classes.smartshell.ts +++ b/ts/classes.smartshell.ts @@ -25,6 +25,7 @@ interface IExecOptions { strict?: boolean; streaming?: boolean; interactive?: boolean; + passthrough?: boolean; } export class Smartshell { @@ -87,6 +88,11 @@ export class Smartshell { this.smartexit.addProcess(execChildProcess); + // Connect stdin if passthrough is enabled + if (options.passthrough && execChildProcess.stdin) { + process.stdin.pipe(execChildProcess.stdin); + } + // Capture stdout and stderr output. execChildProcess.stdout.on('data', (data) => { if (!options.silent) { @@ -107,6 +113,11 @@ export class Smartshell { execChildProcess.on('exit', (code, signal) => { this.smartexit.removeProcess(execChildProcess); + // Unpipe stdin when process ends if passthrough was enabled + if (options.passthrough) { + process.stdin.unpipe(execChildProcess.stdin); + } + const execResult: IExecResult = { exitCode: typeof code === 'number' ? code : (signal ? 1 : 0), stdout: shellLogInstance.logStore.toString(), @@ -121,6 +132,10 @@ export class Smartshell { execChildProcess.on('error', (error) => { this.smartexit.removeProcess(execChildProcess); + // Unpipe stdin when process errors if passthrough was enabled + if (options.passthrough && execChildProcess.stdin) { + process.stdin.unpipe(execChildProcess.stdin); + } reject(error); }); }); @@ -181,6 +196,14 @@ export class Smartshell { await this._exec({ commandString, interactive: true }); } + public async execPassthrough(commandString: string): Promise { + return await this._exec({ commandString, passthrough: true }) as IExecResult; + } + + public async execStreamingPassthrough(commandString: string): Promise { + return await this._exec({ commandString, streaming: true, passthrough: true }) as IExecResultStreaming; + } + public async execAndWaitForLine( commandString: string, regex: RegExp,