-
Notifications
You must be signed in to change notification settings - Fork 3.2k
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
unpublish: stop using npm-registry-client
- Loading branch information
Showing
1 changed file
with
96 additions
and
105 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1,119 +1,110 @@ | ||
/* eslint-disable standard/no-callback-literal */ | ||
'use strict' | ||
|
||
module.exports = unpublish | ||
|
||
var log = require('npmlog') | ||
var npm = require('./npm.js') | ||
var readJson = require('read-package-json') | ||
var path = require('path') | ||
var mapToRegistry = require('./utils/map-to-registry.js') | ||
var npa = require('npm-package-arg') | ||
var getPublishConfig = require('./utils/get-publish-config.js') | ||
var output = require('./utils/output.js') | ||
|
||
unpublish.usage = 'npm unpublish [<@scope>/]<pkg>[@<version>]' | ||
|
||
unpublish.completion = function (opts, cb) { | ||
if (opts.conf.argv.remain.length >= 3) return cb() | ||
npm.commands.whoami([], true, function (er, username) { | ||
if (er) return cb() | ||
|
||
var un = encodeURIComponent(username) | ||
if (!un) return cb() | ||
var byUser = '-/by-user/' + un | ||
mapToRegistry(byUser, npm.config, function (er, uri, auth) { | ||
if (er) return cb(er) | ||
|
||
npm.registry.get(uri, { auth: auth }, function (er, pkgs) { | ||
// 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. | ||
pkgs = pkgs[un] | ||
if (!pkgs || !pkgs.length) return cb() | ||
var pp = npa(opts.partialWord).name | ||
pkgs = pkgs.filter(function (p) { | ||
return p.indexOf(pp) === 0 | ||
}) | ||
if (pkgs.length > 1) return cb(null, pkgs) | ||
mapToRegistry(pkgs[0], npm.config, function (er, uri, auth) { | ||
if (er) return cb(er) | ||
const BB = require('bluebird') | ||
|
||
const figgyPudding = require('figgy-pudding') | ||
const libaccess = require('libnpm/access') | ||
const libunpub = require('libnpm/unpublish') | ||
const log = require('npmlog') | ||
const npa = require('npm-package-arg') | ||
const npm = require('./npm.js') | ||
const npmConfig = require('./config/figgy-config.js') | ||
const npmFetch = require('npm-registry-fetch') | ||
const otplease = require('./utils/otplease.js') | ||
const output = require('./utils/output.js') | ||
const path = require('path') | ||
const readJson = BB.promisify(require('read-package-json')) | ||
const usage = require('./utils/usage.js') | ||
const whoami = BB.promisify(require('./whoami.js')) | ||
|
||
unpublish.usage = usage('npm unpublish [<@scope>/]<pkg>[@<version>]') | ||
|
||
function UsageError () { | ||
throw Object.assign(new Error(`Usage: ${unpublish.usage}`), { | ||
code: 'EUSAGE' | ||
}) | ||
} | ||
|
||
npm.registry.get(uri, { auth: auth }, function (er, d) { | ||
if (er) return cb(er) | ||
var vers = Object.keys(d.versions) | ||
if (!vers.length) return cb(null, pkgs) | ||
return cb(null, vers.map(function (v) { | ||
return pkgs[0] + '@' + v | ||
})) | ||
}) | ||
}) | ||
const UnpublishConfig = figgyPudding({ | ||
force: {}, | ||
loglevel: {}, | ||
silent: {} | ||
}) | ||
|
||
unpublish.completion = function (cliOpts, cb) { | ||
if (cliOpts.conf.argv.remain.length >= 3) return cb() | ||
|
||
whoami([], true).then(username => { | ||
if (!username) { return [] } | ||
const opts = UnpublishConfig(npmConfig()) | ||
return libaccess.lsPackages(username, opts).then(access => { | ||
// 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) | ||
if (!cliOpts.partialWord || !pkgs.length) { return pkgs } | ||
const pp = npa(cliOpts.partialWord).name | ||
pkgs = pkgs.filter(p => !p.indexOf(pp)) | ||
if (pkgs.length > 1) return pkgs | ||
return npmFetch.json(npa(pkgs[0]).escapedName, opts).then(doc => { | ||
const vers = Object.keys(doc.versions) | ||
if (!vers.length) { | ||
return pkgs | ||
} else { | ||
return vers.map(v => `${pkgs[0]}@${v}`) | ||
} | ||
}) | ||
}) | ||
}) | ||
}).nodeify(cb) | ||
} | ||
|
||
function unpublish (args, cb) { | ||
if (args.length > 1) return cb(unpublish.usage) | ||
|
||
var thing = args.length ? npa(args[0]) : {} | ||
var project = thing.name | ||
var version = thing.rawSpec | ||
|
||
log.silly('unpublish', 'args[0]', args[0]) | ||
log.silly('unpublish', 'thing', thing) | ||
if (!version && !npm.config.get('force')) { | ||
return cb( | ||
'Refusing to delete entire project.\n' + | ||
'Run with --force to do this.\n' + | ||
unpublish.usage | ||
) | ||
} | ||
|
||
if (!project || path.resolve(project) === npm.localPrefix) { | ||
// if there's a package.json in the current folder, then | ||
// read the package name and version out of that. | ||
var cwdJson = path.join(npm.localPrefix, 'package.json') | ||
return readJson(cwdJson, function (er, data) { | ||
if (er && er.code !== 'ENOENT' && er.code !== 'ENOTDIR') return cb(er) | ||
if (er) return cb('Usage:\n' + unpublish.usage) | ||
log.verbose('unpublish', data) | ||
gotProject(data.name, data.version, data.publishConfig, cb) | ||
}) | ||
} | ||
return gotProject(project, version, cb) | ||
} | ||
|
||
function gotProject (project, version, publishConfig, cb_) { | ||
if (typeof cb_ !== 'function') { | ||
cb_ = publishConfig | ||
publishConfig = null | ||
} | ||
|
||
function cb (er) { | ||
if (er) return cb_(er) | ||
output('- ' + project + (version ? '@' + version : '')) | ||
cb_() | ||
} | ||
|
||
var mappedConfig = getPublishConfig(publishConfig, npm.config, npm.registry) | ||
var config = mappedConfig.config | ||
var registry = mappedConfig.client | ||
|
||
// remove from the cache first | ||
// npm.commands.cache(['clean', project, version], function (er) { | ||
// if (er) { | ||
// log.error('unpublish', 'Failed to clean cache') | ||
// return cb(er) | ||
// } | ||
|
||
mapToRegistry(project, config, function (er, uri, auth) { | ||
if (er) return cb(er) | ||
|
||
var params = { | ||
version: version, | ||
auth: auth | ||
const spec = args.length && npa(args[0]) | ||
const opts = UnpublishConfig(npmConfig()) | ||
const version = spec.rawSpec | ||
BB.try(() => { | ||
log.silly('unpublish', 'args[0]', args[0]) | ||
log.silly('unpublish', 'spec', spec) | ||
if (!version && !opts.force) { | ||
throw Object.assign(new Error( | ||
'Refusing to delete entire project.\n' + | ||
'Run with --force to do this.\n' + | ||
unpublish.usage | ||
), {code: 'EUSAGE'}) | ||
} | ||
registry.unpublish(uri, params, cb) | ||
}) | ||
// }) | ||
if (!spec || path.resolve(spec.name) === npm.localPrefix) { | ||
// if there's a package.json in the current folder, then | ||
// read the package name and version out of that. | ||
const cwdJson = path.join(npm.localPrefix, 'package.json') | ||
return readJson(cwdJson).then(data => { | ||
log.verbose('unpublish', data) | ||
return otplease(opts, opts => { | ||
return libunpub(npa.resolve(data.name, data.version), opts.concat(data.publishConfig)) | ||
}) | ||
}, err => { | ||
if (err && err.code !== 'ENOENT' && err.code !== 'ENOTDIR') { | ||
throw err | ||
} else { | ||
UsageError() | ||
} | ||
}) | ||
} else { | ||
return otplease(opts, opts => libunpub(spec, opts)) | ||
} | ||
}).then( | ||
ret => { | ||
if (!opts.silent && opts.loglevel !== 'silent') { | ||
output(`-${spec.name}${ | ||
spec.type === 'version' ? `@${spec.rawSpec}` : '' | ||
}`) | ||
} | ||
cb(null, ret) | ||
}, | ||
err => err.code === 'EUSAGE' ? cb(err.message) : cb(err) | ||
) | ||
} |