var assert = require("assert") var resolve = require("path").resolve var url = require("url") var log = require("npmlog") var readPackageJson = require("read-package-json") var mapToRegistry = require("./utils/map-to-registry.js") var npa = require("npm-package-arg") var npm = require("./npm.js") module.exports = access access.usage = "npm access public []" + "\nnpm access restricted []" + "\nnpm access add []" + "\nnpm access rm []" + "\nnpm access ls []" + "\nnpm access edit []" access.completion = function (opts, cb) { var argv = opts.conf.argv.remain if (argv.length === 2) { return cb(null, ["public", "restricted", "add", "rm", "ls", "edit"]) } switch (argv[2]) { case "public": case "restricted": case "ls": case "edit": return cb(new Error("unimplemented: packages you can change")) case "add": if (argv.length === 3) return cb(null, ["read-only", "read-write"]) return cb(new Error("unimplemented: entities and packages")) case "rm": return cb(new Error("unimplemented: entities and packages")) default: return cb(new Error(argv[2]+" not recognized")) } } function access (args, cb) { var cmd = args.shift() switch (cmd) { case "public": case "restricted": return changeAccess(args, cmd, cb) case "add": case "set": return add(args, cb) case "rm": case "del": case "clear": return rm(args, cb) case "list": case "sl": case "ls": return ls(args, cb) case "edit": case "ed": return edit(args, cb) default: return cb("Usage:\n"+access.usage) } } function changeAccess (args, level, cb) { assert(Array.isArray(args), "changeAccess requires args be an array") assert( ["public", "restricted"].indexOf(level) !== -1, "access level must be either 'public' or 'restricted'" ) assert(typeof cb === "function", "changeAccess requires a callback") var p = (args.shift() || "").trim() if (!p) return getCurrentPackage(level, cb) changeAccess_(p, level, cb) } function getCurrentPackage (level, cb) { var here = resolve(npm.prefix, "package.json") log.verbose("setPackageLevel", "here", here) readPackageJson(here, function (er, data) { if (er) return cb(er) if (!data.name) { return cb(new Error("Package must be named")) } changeAccess_(data.name, level, cb) }) } function changeAccess_ (name, level, cb) { log.verbose("changeAccess", "name", name, "level", level) mapToRegistry(name, npm.config, function (er, uri, auth, base) { if (er) return cb(er) var data = npa(name) if (!data.scope) { var msg = "Sorry, you can't change the access level of unscoped packages." log.error("access", msg) return cb(new Error(msg)) } // name must be scoped, so escape separator name = name.replace("/", "%2f") // FIXME: mapToRegistry still isn't generic enough SIGH uri = url.resolve(base, "-/package/"+name+"/access") var params = { level : level, auth : auth } npm.registry.access(uri, params, cb) }) } function add (args, cb) { return cb(new Error("npm access add isn't implemented yet!")) } function rm (args, cb) { return cb(new Error("npm access rm isn't implemented yet!")) } function ls (args, cb) { return cb(new Error("npm access ls isn't implemented yet!")) } function edit (args, cb) { return cb(new Error("npm access edit isn't implemented yet!")) }