From 00a094e62cf8ee6bcb4642812573143f183a862e Mon Sep 17 00:00:00 2001 From: Christopher Hiller Date: Tue, 18 Oct 2022 13:23:20 -0700 Subject: [PATCH] fix(cli): handle non-Error errors better - append package-specific error to CLI output - update snapshot test --- src/cli.js | 22 ++++++++++++++++++---- src/index.js | 6 +++--- src/static.ts | 1 + test/cli.spec.js | 2 +- 4 files changed, 23 insertions(+), 8 deletions(-) diff --git a/src/cli.js b/src/cli.js index f03f20ca..634efe9c 100755 --- a/src/cli.js +++ b/src/cli.js @@ -5,7 +5,7 @@ const yargs = require('yargs/yargs'); const {version} = require('../package.json'); const {Smoker, events} = require('./index.js'); const ora = require('ora'); -const {blue, white} = require('chalk'); +const {blue, white, red, yellow} = require('chalk'); const BEHAVIOR_GROUP = 'Behavior:'; /** @@ -142,7 +142,8 @@ async function main(args) { await smoker.smoke(); } else { const spinner = ora(); - + /** @type {Events['RunScriptFailed'][]} */ + const scriptFailedEvts = []; smoker .on(events.SMOKE_BEGIN, () => { console.error( @@ -207,7 +208,8 @@ async function main(args) { .on(events.RUN_SCRIPT_BEGIN, ({current, total}) => { spinner.text = `Running script ${current}/${total}...`; }) - .on(events.RUN_SCRIPT_FAILED, () => { + .on(events.RUN_SCRIPT_FAILED, (evt) => { + scriptFailedEvts.push(evt); process.exitCode = 1; }) .on(events.RUN_SCRIPTS_OK, ({total}) => { @@ -222,7 +224,18 @@ async function main(args) { process.exitCode = 1; }) .on(events.SMOKE_FAILED, (err) => { - spinner.fail(err.message); + spinner.fail(err?.message ?? err); + + if (scriptFailedEvts.length) { + for (const evt of scriptFailedEvts) { + console.error( + `\n${red('Error details')} for failed package ${yellow( + evt.pkgName + )}:\n` + ); + console.error(evt.error.stderr); + } + } process.exitCode = 1; }) .on(events.SMOKE_OK, () => { @@ -232,6 +245,7 @@ async function main(args) { } } ) + .showHelpOnFail(false) .help() .strict() .parseAsync(); diff --git a/src/index.js b/src/index.js index 7601f9c2..7858ccb0 100644 --- a/src/index.js +++ b/src/index.js @@ -175,7 +175,7 @@ class Smoker extends createStrictEventEmitterClass() { await this.runScripts(packItems); this.emit(SMOKE_OK); } catch (err) { - this.emit(SMOKE_FAILED, /** @type {Error} */ (err)); + this.emit(SMOKE_FAILED, /** @type {any} */ (err)); throw err; } finally { await this.cleanup(); @@ -504,7 +504,7 @@ class Smoker extends createStrictEventEmitterClass() { results.push(result); if (value.failed && this.#bail) { if (/missing script:/i.test(value.stderr)) { - this.emit(RUN_SCRIPT_FAILED, {error: value, current, total}); + this.emit(RUN_SCRIPT_FAILED, {error: value, current, total, pkgName}); return new Error( `Script "${script}" in package "${pkgName}" failed; npm was unable to find this script` ); @@ -514,7 +514,7 @@ class Smoker extends createStrictEventEmitterClass() { `Script "${script}" in package "${pkgName}" failed with exit code ${value.exitCode}: ${value.all}` ); } else if (value.failed) { - this.emit(RUN_SCRIPT_FAILED, {error: value, current, total}); + this.emit(RUN_SCRIPT_FAILED, {error: value, current, total, pkgName}); debug( `(runScripts) Script "%s" in package "%s" failed; continuing...`, script, diff --git a/src/static.ts b/src/static.ts index d4d15def..939e2e7a 100644 --- a/src/static.ts +++ b/src/static.ts @@ -151,6 +151,7 @@ export interface Events { }; RunScriptFailed: { error: ExecaReturnValue | ExecaError; + pkgName: string; total: number; current: number; }; diff --git a/test/cli.spec.js b/test/cli.spec.js index f342303c..2ea62ff5 100644 --- a/test/cli.spec.js +++ b/test/cli.spec.js @@ -36,7 +36,7 @@ describe('midnight-smoker CLI', function () { this.timeout('5s'); const actual = await run(['--version']); expect(actual, 'to equal snapshot', { - stdout: '1.0.1', + stdout: '1.1.1', stderr: '', exitCode: 0, });