From 8213b7bfa0eea9a55bdef96f8b46cc9e918799c7 Mon Sep 17 00:00:00 2001 From: Mael LE GUEN Date: Wed, 11 Sep 2019 12:22:35 +0200 Subject: [PATCH 1/3] fix: #1335: async middleware called twice Closes #1335 --- lib/middleware.js | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/lib/middleware.js b/lib/middleware.js index 9f9c19696..56dab7527 100644 --- a/lib/middleware.js +++ b/lib/middleware.js @@ -40,8 +40,7 @@ function applyMiddleware (argv, yargs, middlewares, beforeValidation) { const beforeValidationError = new Error('middleware cannot return a promise when applyBeforeValidation is true') return middlewares .reduce((accumulation, middleware) => { - if (middleware.applyBeforeValidation !== beforeValidation && - !isPromise(accumulation)) { + if (middleware.applyBeforeValidation !== beforeValidation) { return accumulation } From f47f40884ed8943745f3bbeb3acf61eabc875d2a Mon Sep 17 00:00:00 2001 From: Mael LE GUEN Date: Wed, 11 Sep 2019 14:01:44 +0200 Subject: [PATCH 2/3] add test to reproduce #1335 --- test/middleware.js | 30 ++++++++++++++++++++++++++++++ 1 file changed, 30 insertions(+) diff --git a/test/middleware.js b/test/middleware.js index dd6638c4e..886c36225 100644 --- a/test/middleware.js +++ b/test/middleware.js @@ -145,6 +145,36 @@ describe('middleware', () => { .exitProcess(false) .parse() }) + + it('calls an async middleware only once for nested subcommands', (done) => { + let callCount = 0 + let argv = yargs('cmd subcmd') + .command( + 'cmd', + 'cmd command', + function (yargs) { + yargs.command( + 'subcmd', + 'subcmd command', + function (yargs) {} + ) + } + ) + .middleware(async (argv) => { + callCount++ + return argv + }) + .parse() + + if (!(argv instanceof Promise)) done('argv should be a Promise') + + argv + .then(() => { + callCount.should.equal(1) + done() + }) + .catch(err => done(err)) + }) }) // see: https://github.com/yargs/yargs/issues/1281 From 4c4ed928143b0913c94d826c8aa74d71abb062a5 Mon Sep 17 00:00:00 2001 From: Mael LE GUEN Date: Wed, 18 Sep 2019 10:53:50 +0200 Subject: [PATCH 3/3] fix: replace aync by a Promise in test for #1335 --- test/middleware.js | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/test/middleware.js b/test/middleware.js index 886c36225..5ea318935 100644 --- a/test/middleware.js +++ b/test/middleware.js @@ -160,10 +160,10 @@ describe('middleware', () => { ) } ) - .middleware(async (argv) => { + .middleware((argv) => new Promise((resolve) => { callCount++ - return argv - }) + resolve(argv) + })) .parse() if (!(argv instanceof Promise)) done('argv should be a Promise')