From fa2b21bf34e668f892465a4011500f7685be43bd Mon Sep 17 00:00:00 2001 From: Neel Dani Date: Tue, 2 Aug 2022 10:48:12 +0530 Subject: [PATCH 1/4] intercept SIGINT for readline --- lib/utils/open-url-prompt.js | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/lib/utils/open-url-prompt.js b/lib/utils/open-url-prompt.js index 3eb3ac288c035..54b380c21010c 100644 --- a/lib/utils/open-url-prompt.js +++ b/lib/utils/open-url-prompt.js @@ -34,7 +34,12 @@ const promptOpen = async (npm, url, title, prompt, emitter) => { }) const tryOpen = await new Promise(resolve => { - rl.question(prompt, () => { + rl.on('SIGINT', () => { + rl.close() + throw Error('canceled') + }); + + rl.question(prompt, (userInput) => { resolve(true) }) From ef95563850a443bb9dfbdd2a66171994bec965da Mon Sep 17 00:00:00 2001 From: Neel Dani Date: Tue, 2 Aug 2022 17:39:56 +0530 Subject: [PATCH 2/4] refactor to throw error after promise is resolved --- lib/utils/open-url-prompt.js | 10 +++++++--- test/lib/utils/open-url-prompt.js | 5 ++++- 2 files changed, 11 insertions(+), 4 deletions(-) diff --git a/lib/utils/open-url-prompt.js b/lib/utils/open-url-prompt.js index 54b380c21010c..8ccc85c4daba2 100644 --- a/lib/utils/open-url-prompt.js +++ b/lib/utils/open-url-prompt.js @@ -36,10 +36,10 @@ const promptOpen = async (npm, url, title, prompt, emitter) => { const tryOpen = await new Promise(resolve => { rl.on('SIGINT', () => { rl.close() - throw Error('canceled') + resolve('SIGINT') }); - - rl.question(prompt, (userInput) => { + + rl.question(prompt, () => { resolve(true) }) @@ -55,6 +55,10 @@ const promptOpen = async (npm, url, title, prompt, emitter) => { } }) + if (tryOpen === 'SIGINT') { + throw new Error('canceled') + } + if (!tryOpen) { return } diff --git a/test/lib/utils/open-url-prompt.js b/test/lib/utils/open-url-prompt.js index 6908e36b7c81e..12d54f1dc3f3c 100644 --- a/test/lib/utils/open-url-prompt.js +++ b/test/lib/utils/open-url-prompt.js @@ -36,7 +36,10 @@ const readline = { } }, close: () => {}, - }), + on: (_signal, cb) => { + cb() + } + }) } const openUrlPrompt = t.mock('../../../lib/utils/open-url-prompt.js', { From 917893b934f16c4ae0159533fb56d7a1e6970cbf Mon Sep 17 00:00:00 2001 From: Neel Dani Date: Tue, 2 Aug 2022 18:19:08 +0530 Subject: [PATCH 3/4] Add test case for login --- test/lib/utils/open-url-prompt.js | 34 +++++++++++++++++++++++++++---- 1 file changed, 30 insertions(+), 4 deletions(-) diff --git a/test/lib/utils/open-url-prompt.js b/test/lib/utils/open-url-prompt.js index 12d54f1dc3f3c..03f6b596d7643 100644 --- a/test/lib/utils/open-url-prompt.js +++ b/test/lib/utils/open-url-prompt.js @@ -28,6 +28,8 @@ const opener = (url, opts, cb) => { } let questionShouldResolve = true +let openUrlPromptInterrupted = false + const readline = { createInterface: () => ({ question: (_q, cb) => { @@ -36,10 +38,12 @@ const readline = { } }, close: () => {}, - on: (_signal, cb) => { - cb() - } - }) + on: (_signal, cb) => { + if (openUrlPromptInterrupted && _signal === 'SIGINT') { + cb() + } + }, + }), } const openUrlPrompt = t.mock('../../../lib/utils/open-url-prompt.js', { @@ -151,3 +155,25 @@ t.test('returns error when opener errors', async t => { ) t.equal(openerUrl, 'https://www.npmjs.com', 'did not open') }) + +t.test('throws "canceled" error on SIGINT', async t => { + t.teardown(() => { + openerUrl = null + openerOpts = null + OUTPUT.length = 0 + questionShouldResolve = true + openUrlPromptInterrupted = false + }) + + questionShouldResolve = false + openUrlPromptInterrupted = true + const emitter = new EventEmitter() + + const open = openUrlPrompt(npm, 'https://www.npmjs.com', 'npm home', 'prompt', emitter) + + try { + await open + } catch (err) { + t.equal(err.message, 'canceled') + } +}) From 9680def97ece929241d615208a40c98d17fa1c8a Mon Sep 17 00:00:00 2001 From: Neel Dani Date: Tue, 2 Aug 2022 18:19:23 +0530 Subject: [PATCH 4/4] Fix lint --- lib/utils/open-url-prompt.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/lib/utils/open-url-prompt.js b/lib/utils/open-url-prompt.js index 8ccc85c4daba2..290040e5d14aa 100644 --- a/lib/utils/open-url-prompt.js +++ b/lib/utils/open-url-prompt.js @@ -37,8 +37,8 @@ const promptOpen = async (npm, url, title, prompt, emitter) => { rl.on('SIGINT', () => { rl.close() resolve('SIGINT') - }); - + }) + rl.question(prompt, () => { resolve(true) })