diff options
author | Ruy Adorno <ruyadorno@hotmail.com> | 2020-12-08 22:10:20 +0300 |
---|---|---|
committer | isaacs <i@izs.me> | 2020-12-09 02:58:51 +0300 |
commit | b7d74b627859f08fca23209d6e0d3ec6657a4489 (patch) | |
tree | be0f9ad88faa5a47d2150ebfcc0446f4b4ef014d /lib | |
parent | 3db90d94474f673591811fdab5eb6a5bfdeba261 (diff) |
fix: minor tweaks to lib/unpublish.js
- Fix handling missing files error on reading package.json
- Fixes autocompletion
- Fixes printing name and version when using no args
- Adds `test/lib/unpublish.js` tests
Fixes: https://github.com/npm/statusboard/issues/180
PR-URL: https://github.com/npm/cli/pull/2304
Credit: @ruyadorno
Close: #2304
Reviewed-by: @isaacs
Diffstat (limited to 'lib')
-rw-r--r-- | lib/unpublish.js | 55 |
1 files changed, 31 insertions, 24 deletions
diff --git a/lib/unpublish.js b/lib/unpublish.js index 4d05627d2..d6dbc8d6e 100644 --- a/lib/unpublish.js +++ b/lib/unpublish.js @@ -1,3 +1,5 @@ +'use strict' + const path = require('path') const util = require('util') const log = require('npmlog') @@ -11,7 +13,7 @@ const npm = require('./npm.js') const usageUtil = require('./utils/usage.js') const output = require('./utils/output.js') const otplease = require('./utils/otplease.js') -const whoami = util.promisify(require('./whoami.js')) +const getIdentity = require('./utils/get-identity.js') const usage = usageUtil('unpublish', 'npm unpublish [<@scope>/]<pkg>[@<version>]') @@ -25,18 +27,18 @@ const completionFn = async (args) => { const { partialWord, conf } = args if (conf.argv.remain.length >= 3) - return + return [] - const username = await whoami([], true) + const opts = npm.flatOptions + const username = await getIdentity({ ...opts }).catch(() => null) if (!username) return [] - const opts = npm.flatOptions const access = await libaccess.lsPackages(username, opts) // do a bit of filtering at this point, so that we don't need // to fetch versions for more than one thing, but also don't // accidentally a whole project - let pkgs = Object.keys(access) + let pkgs = Object.keys(access || {}) if (!partialWord || !pkgs.length) return pkgs @@ -55,18 +57,20 @@ const completionFn = async (args) => { async function unpublish (args) { if (args.length > 1) - throw usage + throw new Error(usage) const spec = args.length && npa(args[0]) const opts = npm.flatOptions const { force, silent, loglevel } = opts - let ret + let res + let pkgName + let pkgVersion log.silly('unpublish', 'args[0]', args[0]) log.silly('unpublish', 'spec', spec) if (!spec.rawSpec && !force) { - throw ( + throw new Error( 'Refusing to delete entire project.\n' + 'Run with --force to do this.\n' + usage @@ -77,31 +81,34 @@ async function unpublish (args) { // if there's a package.json in the current folder, then // read the package name and version out of that. const pkgJson = path.join(npm.localPrefix, 'package.json') - const manifest = await readJson(pkgJson) - - log.verbose('unpublish', manifest) - - const { name, version, publishConfig } = manifest - const pkgJsonSpec = npa.resolve(name, version) - + let manifest try { - ret = await otplease(opts, opts => libunpub(pkgJsonSpec, { ...opts, publishConfig })) + manifest = await readJson(pkgJson) } catch (err) { if (err && err.code !== 'ENOENT' && err.code !== 'ENOTDIR') throw err else - throw `Usage: ${usage}` + throw new Error(`Usage: ${usage}`) } - } else - ret = await otplease(opts, opts => libunpub(spec, opts)) - if (!silent && loglevel !== 'silent') { - output(`- ${spec.name}${ - spec.type === 'version' ? `@${spec.rawSpec}` : '' - }`) + log.verbose('unpublish', manifest) + + const { name, version, publishConfig } = manifest + const pkgJsonSpec = npa.resolve(name, version) + + res = await otplease(opts, opts => libunpub(pkgJsonSpec, { ...opts, publishConfig })) + pkgName = name + pkgVersion = version ? `@${version}` : '' + } else { + res = await otplease(opts, opts => libunpub(spec, opts)) + pkgName = spec.name + pkgVersion = spec.type === 'version' ? `@${spec.rawSpec}` : '' } - return ret + if (!silent && loglevel !== 'silent') + output(`- ${pkgName}${pkgVersion}`) + + return res } module.exports = Object.assign(cmd, { completion, usage }) |