diff --git a/dist/index1.js b/dist/index1.js index 8f0f9fc..c6f4bdd 100755 --- a/dist/index1.js +++ b/dist/index1.js @@ -27599,13 +27599,18 @@ module.exports = { * console.log(listener.contents); */ class OutputListener { - constructor () { + constructor (streamWriter) { this._buff = []; + this._streamWriter = streamWriter; } get listener () { const listen = function listen (data) { this._buff.push(data); + + if (this._streamWriter) { + this._streamWriter.write(data); + } }; return listen.bind(this); } @@ -27946,9 +27951,9 @@ async function checkTerraform () { // This will fail if Terraform isn't found, which is what we want await checkTerraform(); - // Create listeners to receive output (in memory) as well - const stdout = new OutputListener(); - const stderr = new OutputListener(); + // Create listeners to receive output (in memory) + const stdout = new OutputListener(process.stdout); + const stderr = new OutputListener(process.stderr); const listeners = { stdout: stdout.listener, stderr: stderr.listener @@ -27963,10 +27968,6 @@ async function checkTerraform () { }; const exitCode = await exec(pathToCLI, args, options); - // Pass-through stdout/err as `exec` won't due to `silent: true` option - process.stdout.write(stdout.contents); - process.stderr.write(stderr.contents); - // Set outputs, result, exitcode, and stderr core.setOutput('stdout', stdout.contents); core.setOutput('stderr', stderr.contents); diff --git a/wrapper/lib/output-listener.js b/wrapper/lib/output-listener.js index 9686dba..8323a5c 100644 --- a/wrapper/lib/output-listener.js +++ b/wrapper/lib/output-listener.js @@ -20,13 +20,18 @@ * console.log(listener.contents); */ class OutputListener { - constructor () { + constructor (streamWriter) { this._buff = []; + this._streamWriter = streamWriter; } get listener () { const listen = function listen (data) { this._buff.push(data); + + if (this._streamWriter) { + this._streamWriter.write(data); + } }; return listen.bind(this); } diff --git a/wrapper/terraform.js b/wrapper/terraform.js index 20fec38..7350dc4 100755 --- a/wrapper/terraform.js +++ b/wrapper/terraform.js @@ -21,9 +21,9 @@ async function checkTerraform () { // This will fail if Terraform isn't found, which is what we want await checkTerraform(); - // Create listeners to receive output (in memory) as well - const stdout = new OutputListener(); - const stderr = new OutputListener(); + // Create listeners to receive output (in memory) + const stdout = new OutputListener(process.stdout); + const stderr = new OutputListener(process.stderr); const listeners = { stdout: stdout.listener, stderr: stderr.listener @@ -38,10 +38,6 @@ async function checkTerraform () { }; const exitCode = await exec(pathToCLI, args, options); - // Pass-through stdout/err as `exec` won't due to `silent: true` option - process.stdout.write(stdout.contents); - process.stderr.write(stderr.contents); - // Set outputs, result, exitcode, and stderr core.setOutput('stdout', stdout.contents); core.setOutput('stderr', stderr.contents); diff --git a/wrapper/test/output-listener.test.js b/wrapper/test/output-listener.test.js index 229c3cf..daed953 100644 --- a/wrapper/test/output-listener.test.js +++ b/wrapper/test/output-listener.test.js @@ -6,12 +6,31 @@ const OutputListener = require('../lib/output-listener'); describe('output-listener', () => { - it('receives and exposes data', () => { + it('receives and buffers data to .contents', () => { const listener = new OutputListener(); const listen = listener.listener; + listen(Buffer.from('foo')); listen(Buffer.from('bar')); listen(Buffer.from('baz')); + expect(listener.contents).toEqual('foobarbaz'); }); + + it('receives and writes data to stream immediately', () => { + const mockWrite = jest.fn(); + const listener = new OutputListener({ write: mockWrite }); + const listen = listener.listener; + + listen(Buffer.from('first write')); + expect(mockWrite.mock.lastCall[0]).toStrictEqual(Buffer.from('first write')); + + listen(Buffer.from('second write')); + expect(mockWrite.mock.lastCall[0]).toStrictEqual(Buffer.from('second write')); + + listen(Buffer.from('third write')); + expect(mockWrite.mock.lastCall[0]).toStrictEqual(Buffer.from('third write')); + + expect(mockWrite).toBeCalledTimes(3); + }); });