diff --git a/lib/internal/process/execution.js b/lib/internal/process/execution.js index e69add7394e60f..ee28dcf206fc30 100644 --- a/lib/internal/process/execution.js +++ b/lib/internal/process/execution.js @@ -119,7 +119,10 @@ function evalScript(name, body, breakFirstLine, print, shouldLoadESM = false) { }); if (print) { const { log } = require('internal/console/global'); - log(result); + + process.on('exit', () => { + log(result); + }); } if (origModule !== undefined) diff --git a/test/parallel/test-cli-print-promise.mjs b/test/parallel/test-cli-print-promise.mjs index 3f95630693035e..a8ad8a974d27b1 100644 --- a/test/parallel/test-cli-print-promise.mjs +++ b/test/parallel/test-cli-print-promise.mjs @@ -29,7 +29,7 @@ describe('--print with a promise', { concurrency: true }, () => { code: 0, signal: null, stderr: '', - stdout: 'Promise { }\n', + stdout: 'Promise { 42 }\n', }); }); @@ -50,7 +50,7 @@ describe('--print with a promise', { concurrency: true }, () => { it('should output something if process exits before promise settles', async () => { const result = await spawnPromisified(execPath, [ '--print', - 'setTimeout(process.exit,100, 0);timers.promises.setTimeout(200)', + 'setTimeout(process.exit, 100, 0);timers.promises.setTimeout(200)', ]); assert.deepStrictEqual(result, { @@ -61,6 +61,20 @@ describe('--print with a promise', { concurrency: true }, () => { }); }); + it('should respect exit code when process exits before promise settles', async () => { + const result = await spawnPromisified(execPath, [ + '--print', + 'setTimeout(process.exit, 100, 42);timers.promises.setTimeout(200)', + ]); + + assert.deepStrictEqual(result, { + code: 42, + signal: null, + stderr: '', + stdout: 'Promise { }\n', + }); + }); + it('should handle rejected promises', async () => { const result = await spawnPromisified(execPath, [ '--unhandled-rejections=none', @@ -87,7 +101,52 @@ describe('--print with a promise', { concurrency: true }, () => { code: 0, signal: null, stderr: '', - stdout: 'Promise { }\n', + stdout: 'Promise { 1 }\n', + }); + }); + + it('should handle thenable that resolves', async () => { + const result = await spawnPromisified(execPath, [ + '--unhandled-rejections=none', + '--print', + '({ then(r) { r(42) } })', + ]); + + assert.deepStrictEqual(result, { + code: 0, + signal: null, + stderr: '', + stdout: '{ then: [Function: then] }\n', + }); + }); + + it('should handle thenable that rejects', async () => { + const result = await spawnPromisified(execPath, [ + '--unhandled-rejections=none', + '--print', + '({ then(_, r) { r(42) } })', + ]); + + assert.deepStrictEqual(result, { + code: 0, + signal: null, + stderr: '', + stdout: '{ then: [Function: then] }\n', + }); + }); + + it('should handle Promise.prototype', async () => { + const result = await spawnPromisified(execPath, [ + '--unhandled-rejections=none', + '--print', + 'Promise.prototype', + ]); + + assert.deepStrictEqual(result, { + code: 0, + signal: null, + stderr: '', + stdout: 'Object [Promise] {}\n', }); }); });