From ccdb8a5652b9e655d324d39305c4a27793474205 Mon Sep 17 00:00:00 2001 From: Terence O'Donoghue <1697905+terenceodonoghue@users.noreply.github.com> Date: Fri, 7 Feb 2020 09:39:45 +1100 Subject: [PATCH] Allow publishing if availability check fails (#490) --- source/cli.js | 4 ++-- source/npm/util.js | 13 ++++++++++++- source/ui.js | 19 ++++++++++++++++++- 3 files changed, 32 insertions(+), 4 deletions(-) diff --git a/source/cli.js b/source/cli.js index d68f6e2c..e110cb6f 100755 --- a/source/cli.js +++ b/source/cli.js @@ -91,11 +91,11 @@ updateNotifier({pkg: cli.pkg}).notify(); ...cli.flags }; - const isAvailable = flags.publish ? await isPackageNameAvailable(pkg) : false; + const availability = await isPackageNameAvailable(pkg); const version = cli.input.length > 0 ? cli.input[0] : false; - const options = await ui({...flags, exists: !isAvailable, version}, pkg); + const options = await ui({...flags, availability, version}, pkg); if (!options.confirm) { process.exit(0); diff --git a/source/npm/util.js b/source/npm/util.js index ef60d3fb..6f8bc68a 100644 --- a/source/npm/util.js +++ b/source/npm/util.js @@ -84,13 +84,24 @@ exports.prereleaseTags = async packageName => { exports.isPackageNameAvailable = async pkg => { const args = [pkg.name]; + const availability = { + isAvailable: false, + isUnknown: false + }; + if (exports.isExternalRegistry(pkg)) { args.push({ registryUrl: pkg.publishConfig.registry }); } - return npmName(...args); + try { + availability.isAvailable = await npmName(...args) || false; + } catch { + availability.isUnknown = true; + } + + return availability; }; exports.isExternalRegistry = pkg => typeof pkg.publishConfig === 'object' && typeof pkg.publishConfig.registry === 'string'; diff --git a/source/ui.js b/source/ui.js index 3848cacc..65ada8d8 100644 --- a/source/ui.js +++ b/source/ui.js @@ -137,7 +137,7 @@ module.exports = async (options, pkg) => { { type: 'confirm', name: 'publishScoped', - when: isScoped(pkg.name) && !options.exists && options.publish && !pkg.private, + when: isScoped(pkg.name) && !options.availability.isAvailable && !options.availability.isUnknown && options.publish && !pkg.private, message: `This scoped repo ${chalk.bold.magenta(pkg.name)} hasn't been published. Do you want to publish it publicly?`, default: false } @@ -170,6 +170,23 @@ module.exports = async (options, pkg) => { } } + if (options.availability.isUnknown) { + const answers = await inquirer.prompt([{ + type: 'confirm', + name: 'confirm', + when: isScoped(pkg.name) && options.publish && !pkg.private, + message: `Failed to check availability of scoped repo name ${chalk.bold.magenta(pkg.name)}. Do you want to try and publish it anyway?`, + default: false + }]); + + if (!answers.confirm) { + return { + ...options, + ...answers + }; + } + } + const answers = await inquirer.prompt(prompts); return {